You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gn...@apache.org on 2018/10/12 07:55:35 UTC

[camel] 21/43: [api] Improve api cohesiveness

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

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

commit 1dc541cde51d68bcf3e50d9da3e5694a00dabc33
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Thu Sep 27 20:32:55 2018 +0200

    [api] Improve api cohesiveness
---
 .../main/java/org/apache/camel/CamelContext.java   | 307 ---------------------
 .../camel/builder/ErrorHandlerBuilderRef.java      |   8 +-
 .../camel/builder/ErrorHandlerBuilderSupport.java  |   4 +-
 .../extension/ComponentVerifierExtension.java      |  12 +-
 .../ComponentVerifierExtensionHelper.java          |  29 +-
 .../camel/converter/TimePatternConverter.java      | 113 +-------
 .../camel/health/HealthCheckConfiguration.java     |   6 +-
 .../org/apache/camel/impl/BreakpointSupport.java   |   8 +-
 .../org/apache/camel/impl/ConditionSupport.java    |   4 +-
 .../org/apache/camel/impl/DefaultCamelContext.java | 160 ++---------
 .../org/apache/camel/impl/DefaultDebugger.java     |  16 +-
 .../apache/camel/impl/DefaultProcessorFactory.java |   6 +-
 .../org/apache/camel/impl/DefaultRouteContext.java |   5 +-
 .../apache/camel/impl/DefaultRouteController.java  |  12 +-
 .../camel/impl/DefaultRouteStartupOrder.java       |   6 +-
 .../apache/camel/impl/DefaultShutdownStrategy.java |  18 +-
 .../camel/impl/DurationRoutePolicyFactory.java     |   4 +-
 .../java/org/apache/camel/impl/RouteService.java   |   6 +-
 .../camel/impl/SupervisingRouteController.java     |   7 +-
 .../apache/camel/impl/TypedProcessorFactory.java   |   5 +-
 .../impl/cloud/ServiceRegistrationRoutePolicy.java |   4 +-
 .../ServiceRegistrationRoutePolicyFactory.java     |   4 +-
 .../impl/cluster/ClusteredRouteController.java     |   4 +-
 .../camel/impl/cluster/ClusteredRoutePolicy.java   |  10 +-
 .../impl/cluster/ClusteredRoutePolicyFactory.java  |   4 +-
 .../impl/health/DefaultHealthCheckRegistry.java    |   2 -
 .../apache/camel/impl/health/RouteHealthCheck.java |   5 +-
 .../DefaultManagementLifecycleStrategy.java        |   2 +-
 .../DefaultManagementObjectStrategy.java           |   5 +-
 .../management/DefaultManagementStrategy.java      |   3 +-
 .../InstrumentationInterceptStrategy.java          |   3 +-
 .../camel/management/ManagedCamelContext.java      |  50 ++++
 .../management/ManagedManagementStrategy.java      |   3 +-
 .../management/mbean/RouteCoverageXmlParser.java   |   7 +-
 .../camel/model/DynamicRouterDefinition.java       |   3 +-
 .../apache/camel/model/InterceptDefinition.java    |   5 +-
 .../model/InterceptSendToEndpointDefinition.java   |   2 +-
 .../apache/camel/model/OnCompletionDefinition.java |   3 +-
 .../apache/camel/model/OnExceptionDefinition.java  |   3 +-
 .../apache/camel/model/ProcessorDefinition.java    |   3 +-
 .../camel/model/ProcessorDefinitionHelper.java     |   7 +-
 .../org/apache/camel/model/RouteDefinition.java    |  16 +-
 .../apache/camel/model/RoutingSlipDefinition.java  |   3 +-
 .../org/apache/camel/model/SortDefinition.java     |   6 +-
 .../camel/model/cloud/ServiceCallDefinition.java   |   5 +-
 .../camel/processor/CamelInternalProcessor.java    |   7 +-
 .../apache/camel/processor/MulticastProcessor.java |   4 +-
 .../org/apache/camel/processor/Resequencer.java    |  23 +-
 .../DefaultExceptionPolicyStrategy.java            |   2 +-
 .../processor/interceptor/BacklogDebugger.java     |  13 +-
 .../camel/processor/interceptor/BacklogTracer.java |   3 +-
 .../apache/camel/processor/interceptor/Debug.java  |   4 +-
 .../camel/processor/interceptor/HandleFault.java   |   6 +-
 .../main/java/org/apache/camel/spi/Breakpoint.java |  20 +-
 .../org/apache/camel/spi/CamelContextTracker.java  |  33 ++-
 .../main/java/org/apache/camel/spi/Condition.java  |   4 +-
 .../main/java/org/apache/camel/spi/Debugger.java   |   6 +-
 .../org/apache/camel/spi/InterceptStrategy.java    |   6 +-
 .../java/org/apache/camel/spi/LogListener.java     |   9 +-
 .../apache/camel/spi/ManagementObjectStrategy.java |   4 +-
 .../org/apache/camel/spi/ManagementStrategy.java   |   5 +-
 .../src/main/java/org/apache/camel/spi/Policy.java |   6 +-
 .../org/apache/camel/spi/ProcessorFactory.java     |   6 +-
 .../java/org/apache/camel/spi/RouteContext.java    |  12 +-
 .../java/org/apache/camel/spi/RouteController.java |  81 +++++-
 .../org/apache/camel/spi/RoutePolicyFactory.java   |   4 +-
 .../java/org/apache/camel/spi/Transformer.java     |   9 +-
 .../main/java/org/apache/camel/spi/Validator.java  |   9 +-
 .../java/org/apache/camel/util/ObjectHelper.java   |  32 ---
 .../main/java/org/apache/camel/util/TimeUtils.java | 117 +++++++-
 .../apache/camel/util/function/ThrowingHelper.java |  32 +++
 .../component/rest/FromRestGetPolicyTest.java      |   4 +-
 .../org/apache/camel/impl/CustomIdFactoryTest.java |   7 +-
 .../impl/DefaultCamelContextAutoStartupTest.java   |  16 +-
 .../apache/camel/impl/RoutePolicyFactoryTest.java  |   4 +-
 .../apache/camel/impl/StartAndStopRoutesTest.java  |   5 +-
 .../apache/camel/issues/AdviceWithPolicyTest.java  |   4 +-
 .../issues/AdviceWithStartTargetIssueTest.java     |   4 +-
 .../camel/issues/AdviceWithTransactedTest.java     |   4 +-
 .../issues/DynamicRouterWithInterceptorTest.java   |   4 +-
 .../issues/RecipientListWithInterceptorTest.java   |   4 +-
 .../issues/RoutingSlipWithInterceptorTest.java     |   4 +-
 .../camel/issues/SplitWithInterceptorTest.java     |   4 +-
 .../TransactedPropertyPlaceholderIssueTest.java    |   4 +-
 .../apache/camel/issues/TwoTimerWithJMXIssue.java  |   4 +-
 .../management/ManagedAggregateControllerTest.java |   2 +-
 .../camel/management/ManagedCamelContextTest.java  |   2 +-
 .../camel/management/ManagedCustomPolicyTest.java  |   4 +-
 .../management/ManagedInlinedProcessorTest.java    |   2 +-
 .../ManagedRouteSuspendAndResumeTest.java          |   2 +-
 .../management/RemoveRouteDefinitionTest.java      |   8 +-
 .../model/LoadRouteFromXmlWithPolicyTest.java      |   3 +-
 .../processor/CustomProcessorFactoryTest.java      |   6 +-
 .../DefinitionPolicyPerProcessorTest.java          |   6 +-
 .../camel/processor/PipelineStepWithEventTest.java |   4 +-
 .../camel/processor/PolicyPerProcessorTest.java    |   4 +-
 .../apache/camel/processor/PolicyPerRouteTest.java |   4 +-
 .../AsyncEndpointCustomAsyncInterceptorTest.java   |   4 +-
 .../async/AsyncEndpointCustomInterceptorTest.java  |   4 +-
 .../processor/async/AsyncEndpointPolicyTest.java   |   4 +-
 .../ParentChildInterceptStrategyTest.java          |   5 +-
 .../AuditInterceptorAsyncDelegateIssueTest.java    |   4 +-
 .../AuditInterceptorDelegateIssueTest.java         |   4 +-
 .../CustomInterceptorRouteWithChildOutputTest.java |   6 +-
 .../interceptor/DebugExceptionBreakpointTest.java  |   6 +-
 .../DebugExceptionEventBreakpointTest.java         |   4 +-
 .../interceptor/DebugSingleStepConditionTest.java  |   6 +-
 .../processor/interceptor/DebugSingleStepTest.java |   4 +-
 .../camel/processor/interceptor/DebugTest.java     |  10 +-
 .../InterceptorStrategyNotOrderedTest.java         |   6 +-
 .../InterceptorStrategyOrderedTest.java            |   6 +-
 .../component/aws/xray/EIPTracingStrategy.java     |   4 +-
 .../component/aws/xray/NoopTracingStrategy.java    |   4 +-
 .../aws/xray/TraceAnnotatedTracingStrategy.java    |   6 +-
 .../camel/component/aws/xray/XRayTracer.java       |   4 +-
 .../org/apache/camel/cdi/CdiCamelExtension.java    |   2 +-
 .../cdi/transaction/JtaTransactionPolicy.java      |  11 +-
 .../component/ehcache/EhcacheConfiguration.java    |   3 +-
 .../infinispan/policy/InfinispanRoutePolicy.java   |   4 +-
 ...sumerObserveAttributeMatchStringDifferTest.java |   8 +-
 ...JmxConsumerObserveAttributeMatchStringTest.java |   8 +-
 .../jmx/CamelJmxConsumerObserveAttributeTest.java  |   4 +-
 .../camel/component/jmx/CamelJmxConsumerTest.java  |   2 +-
 .../routepolicy/MetricsRoutePolicyFactory.java     |   4 +-
 .../routepolicy/MicrometerRoutePolicyFactory.java  |   4 +-
 .../camel/opentracing/OpenTracingTracer.java       |   3 +-
 .../apache/camel/opentracing/SpanDecorator.java    |   8 +-
 .../component/quartz2/QuartzNameCollisionTest.java |   2 +-
 .../shiro/security/ShiroSecurityPolicy.java        |   4 +-
 .../boot/actuate/endpoint/CamelRoutesEndpoint.java |   5 +-
 .../camel/spring/boot/model/RouteDetailsInfo.java  |   2 +-
 .../SpringSecurityAuthorizationPolicy.java         |   4 +-
 .../camel/spring/spi/SpringTransactionPolicy.java  |  10 +-
 .../camel/spring/CamelLoadRoutesFromXMLTest.java   |  20 +-
 .../spring/config/CamelContextAutoStartupTest.java |   4 +-
 .../config/RouteAutoStartupPropertiesTest.java     |   6 +-
 .../interceptor/ContainerWideInterceptor.java      |   4 +-
 .../camel/test/spring/RouteCoverageDumper.java     |   3 +-
 .../CamelSpringRunnerProvidesBreakpointTest.java   |   4 +-
 .../apache/camel/test/junit4/CamelTestSupport.java |  17 +-
 .../java/org/apache/camel/zipkin/ZipkinTracer.java |   4 +-
 .../zookeeper/policy/CuratorLeaderRoutePolicy.java |   4 +-
 .../CuratorMultiMasterLeaderRoutePolicy.java       |   4 +-
 .../commands/AbstractLocalCamelController.java     |   3 +-
 .../commands/internal/CamelControllerImpl.java     |   8 +-
 .../HystrixHierarchicalConfigurationTest.java      |   3 +-
 .../camel/itest/issues/DummyInterceptor.java       |   4 +-
 147 files changed, 755 insertions(+), 986 deletions(-)

diff --git a/camel-core/src/main/java/org/apache/camel/CamelContext.java b/camel-core/src/main/java/org/apache/camel/CamelContext.java
index dd31ddf..2ebcb1e 100644
--- a/camel-core/src/main/java/org/apache/camel/CamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/CamelContext.java
@@ -17,27 +17,14 @@
 package org.apache.camel;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
 
-import org.apache.camel.api.management.mbean.ManagedCamelContextMBean;
-import org.apache.camel.api.management.mbean.ManagedProcessorMBean;
-import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.health.HealthCheckRegistry;
-import org.apache.camel.model.DataFormatDefinition;
-import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.RouteDefinition;
-import org.apache.camel.model.RoutesDefinition;
-import org.apache.camel.model.rest.RestDefinition;
-import org.apache.camel.model.rest.RestsDefinition;
-import org.apache.camel.model.transformer.TransformerDefinition;
-import org.apache.camel.model.validator.ValidatorDefinition;
 import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
 import org.apache.camel.spi.CamelContextNameStrategy;
@@ -535,35 +522,6 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration {
     void setupRoutes(boolean done);
 
     /**
-     * Returns a list of the current route definitions
-     *
-     * @return list of the current route definitions
-     */
-    List<RouteDefinition> getRouteDefinitions();
-
-    /**
-     * Gets the route definition with the given id
-     *
-     * @param id id of the route
-     * @return the route definition or <tt>null</tt> if not found
-     */
-    RouteDefinition getRouteDefinition(String id);
-
-    /**
-     * Returns a list of the current REST definitions
-     *
-     * @return list of the current REST definitions
-     */
-    List<RestDefinition> getRestDefinitions();
-
-    /**
-     * Adds a collection of rest definitions to the context
-     *
-     * @param restDefinitions the rest(s) definition to add
-     */
-    void addRestDefinitions(Collection<RestDefinition> restDefinitions) throws Exception;
-
-    /**
      * Sets a custom {@link org.apache.camel.spi.RestConfiguration}
      *
      * @param restConfiguration the REST configuration
@@ -643,49 +601,6 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration {
     <T extends Processor> T getProcessor(String id, Class<T> type);
 
     /**
-     * Gets the managed processor client api from any of the routes which with the given id
-     *
-     * @param id id of the processor
-     * @param type the managed processor type from the {@link org.apache.camel.api.management.mbean} package.
-     * @return the processor or <tt>null</tt> if not found
-     * @throws IllegalArgumentException if the type is not compliant
-     */
-    <T extends ManagedProcessorMBean> T getManagedProcessor(String id, Class<T> type);
-
-    /**
-     * Gets the managed route client api with the given route id
-     *
-     * @param routeId id of the route
-     * @param type the managed route type from the {@link org.apache.camel.api.management.mbean} package.
-     * @return the route or <tt>null</tt> if not found
-     * @throws IllegalArgumentException if the type is not compliant
-     */
-    <T extends ManagedRouteMBean> T getManagedRoute(String routeId, Class<T> type);
-
-    /**
-     * Gets the managed Camel CamelContext client api
-     */
-    ManagedCamelContextMBean getManagedCamelContext();
-
-    /**
-     * Gets the processor definition from any of the routes which with the given id
-     *
-     * @param id id of the processor definition
-     * @return the processor definition or <tt>null</tt> if not found
-     */
-    ProcessorDefinition getProcessorDefinition(String id);
-
-    /**
-     * Gets the processor definition from any of the routes which with the given id
-     *
-     * @param id id of the processor definition
-     * @param type the processor definition type
-     * @return the processor definition or <tt>null</tt> if not found
-     * @throws java.lang.ClassCastException is thrown if the type is not correct type
-     */
-    <T extends ProcessorDefinition> T getProcessorDefinition(String id, Class<T> type);
-
-    /**
      * Adds a collection of routes to this CamelContext using the given builder
      * to build them.
      * <p/>
@@ -703,142 +618,6 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration {
     void addRoutes(RoutesBuilder builder) throws Exception;
 
     /**
-     * Loads a collection of route definitions from the given {@link java.io.InputStream}.
-     *
-     * @param is input stream with the route(s) definition to add
-     * @throws Exception if the route definitions could not be loaded for whatever reason
-     * @return the route definitions
-     */
-    RoutesDefinition loadRoutesDefinition(InputStream is) throws Exception;
-
-    /**
-     * Loads a collection of rest definitions from the given {@link java.io.InputStream}.
-     *
-     * @param is input stream with the rest(s) definition to add
-     * @throws Exception if the rest definitions could not be loaded for whatever reason
-     * @return the rest definitions
-     */
-    RestsDefinition loadRestsDefinition(InputStream is) throws Exception;
-    
-    /**
-     * Adds a collection of route definitions to the context
-     *
-     * @param routeDefinitions the route(s) definition to add
-     * @throws Exception if the route definitions could not be created for whatever reason
-     */
-    void addRouteDefinitions(Collection<RouteDefinition> routeDefinitions) throws Exception;
-
-    /**
-     * Add a route definition to the context
-     *
-     * @param routeDefinition the route definition to add
-     * @throws Exception if the route definition could not be created for whatever reason
-     */
-    void addRouteDefinition(RouteDefinition routeDefinition) throws Exception;
-
-    /**
-     * Removes a collection of route definitions from the CamelContext - stopping any previously running
-     * routes if any of them are actively running
-     *
-     * @param routeDefinitions route(s) definitions to remove
-     * @throws Exception if the route definitions could not be removed for whatever reason
-     */
-    void removeRouteDefinitions(Collection<RouteDefinition> routeDefinitions) throws Exception;
-
-    /**
-     * Removes a route definition from the CamelContext - stopping any previously running
-     * routes if any of them are actively running
-     *
-     * @param routeDefinition route definition to remove
-     * @throws Exception if the route definition could not be removed for whatever reason
-     */
-    void removeRouteDefinition(RouteDefinition routeDefinition) throws Exception;
-
-    /**
-     * Starts the given route if it has been previously stopped
-     *
-     * @param route the route to start
-     * @throws Exception is thrown if the route could not be started for whatever reason
-     * @deprecated favor using {@link CamelContext#startRoute(String)}
-     */
-    @Deprecated
-    void startRoute(RouteDefinition route) throws Exception;
-
-    /**
-     * Starts the given route if it has been previously stopped
-     *
-     * @param routeId the route id
-     * @throws Exception is thrown if the route could not be started for whatever reason
-     */
-    void startRoute(String routeId) throws Exception;
-
-    /**
-     * Stops the given route.
-     *
-     * @param route the route to stop
-     * @throws Exception is thrown if the route could not be stopped for whatever reason
-     * @deprecated favor using {@link CamelContext#stopRoute(String)}
-     */
-    @Deprecated
-    void stopRoute(RouteDefinition route) throws Exception;
-
-    /**
-     * Stops the given route using {@link org.apache.camel.spi.ShutdownStrategy}.
-     *
-     * @param routeId the route id
-     * @throws Exception is thrown if the route could not be stopped for whatever reason
-     * @see #suspendRoute(String)
-     */
-    void stopRoute(String routeId) throws Exception;
-
-    /**
-     * Stops the given route using {@link org.apache.camel.spi.ShutdownStrategy} with a specified timeout.
-     *
-     * @param routeId the route id
-     * @param timeout  timeout
-     * @param timeUnit the unit to use
-     * @throws Exception is thrown if the route could not be stopped for whatever reason
-     * @see #suspendRoute(String, long, java.util.concurrent.TimeUnit)
-     */
-    void stopRoute(String routeId, long timeout, TimeUnit timeUnit) throws Exception;
-
-    /**
-     * Stops the given route using {@link org.apache.camel.spi.ShutdownStrategy} with a specified timeout 
-     * and optional abortAfterTimeout mode.
-     *
-     * @param routeId the route id
-     * @param timeout  timeout
-     * @param timeUnit the unit to use
-     * @param abortAfterTimeout should abort shutdown after timeout
-     * @return <tt>true</tt> if the route is stopped before the timeout
-     * @throws Exception is thrown if the route could not be stopped for whatever reason
-     * @see #suspendRoute(String, long, java.util.concurrent.TimeUnit)
-     */
-    boolean stopRoute(String routeId, long timeout, TimeUnit timeUnit, boolean abortAfterTimeout) throws Exception;
-    
-    /**
-     * Shutdown and <b>removes</b> the given route using {@link org.apache.camel.spi.ShutdownStrategy}.
-     *
-     * @param routeId the route id
-     * @throws Exception is thrown if the route could not be shutdown for whatever reason
-     * @deprecated use {@link #stopRoute(String)} and {@link #removeRoute(String)}
-     */
-    @Deprecated
-    void shutdownRoute(String routeId) throws Exception;
-
-    /**
-     * Shutdown and <b>removes</b> the given route using {@link org.apache.camel.spi.ShutdownStrategy} with a specified timeout.
-     *
-     * @param routeId  the route id
-     * @param timeout  timeout
-     * @param timeUnit the unit to use
-     * @throws Exception is thrown if the route could not be shutdown for whatever reason
-     * @deprecated use {@link #stopRoute(String, long, java.util.concurrent.TimeUnit)} and {@link #removeRoute(String)}
-     */
-    @Deprecated
-    void shutdownRoute(String routeId, long timeout, TimeUnit timeUnit) throws Exception;
-
-    /**
      * Removes the given route (the route <b>must</b> be stopped before it can be removed).
      * <p/>
      * A route which is removed will be unregistered from JMX, have its services stopped/shutdown and the route
@@ -862,56 +641,6 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration {
     boolean removeRoute(String routeId) throws Exception;
 
     /**
-     * Resumes the given route if it has been previously suspended
-     * <p/>
-     * If the route does <b>not</b> support suspension the route will be started instead
-     *
-     * @param routeId the route id
-     * @throws Exception is thrown if the route could not be resumed for whatever reason
-     */
-    void resumeRoute(String routeId) throws Exception;
-
-    /**
-     * Suspends the given route using {@link org.apache.camel.spi.ShutdownStrategy}.
-     * <p/>
-     * Suspending a route is more gently than stopping, as the route consumers will be suspended (if they support)
-     * otherwise the consumers will be stopped.
-     * <p/>
-     * By suspending the route services will be kept running (if possible) and therefore its faster to resume the route.
-     * <p/>
-     * If the route does <b>not</b> support suspension the route will be stopped instead
-     *
-     * @param routeId the route id
-     * @throws Exception is thrown if the route could not be suspended for whatever reason
-     */
-    void suspendRoute(String routeId) throws Exception;
-
-    /**
-     * Suspends the given route using {@link org.apache.camel.spi.ShutdownStrategy} with a specified timeout.
-     * <p/>
-     * Suspending a route is more gently than stopping, as the route consumers will be suspended (if they support)
-     * otherwise the consumers will be stopped.
-     * <p/>
-     * By suspending the route services will be kept running (if possible) and therefore its faster to resume the route.
-     * <p/>
-     * If the route does <b>not</b> support suspension the route will be stopped instead
-     *
-     * @param routeId  the route id
-     * @param timeout  timeout
-     * @param timeUnit the unit to use
-     * @throws Exception is thrown if the route could not be suspended for whatever reason
-     */
-    void suspendRoute(String routeId, long timeout, TimeUnit timeUnit) throws Exception;
-
-    /**
-     * Returns the current status of the given route
-     *
-     * @param routeId the route id
-     * @return the status for the route
-     */
-    ServiceStatus getRouteStatus(String routeId);
-
-    /**
      * 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
@@ -1180,14 +909,6 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration {
     DataFormat createDataFormat(String name);
 
     /**
-     * Resolve a data format definition given its name
-     *
-     * @param name the data format definition name or a reference to it in the {@link Registry}
-     * @return the resolved data format definition, or <tt>null</tt> if not found
-     */
-    DataFormatDefinition resolveDataFormatDefinition(String name);
-
-    /**
      * Gets the current data format resolver
      *
      * @return the resolver
@@ -1202,20 +923,6 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration {
     void setDataFormatResolver(DataFormatResolver dataFormatResolver);
 
     /**
-     * Sets the transformers that can be referenced in the routes.
-     *
-     * @param transformers the transformers
-     */
-    void setTransformers(List<TransformerDefinition> transformers);
-
-    /**
-     * Gets the transformers that can be referenced in the routes.
-     *
-     * @return the transformers available
-     */
-    List<TransformerDefinition> getTransformers();
-
-    /**
      * Resolve a transformer given a scheme
      *
      * @param model data model name.
@@ -1239,20 +946,6 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration {
     TransformerRegistry<? extends ValueHolder<String>> getTransformerRegistry();
 
     /**
-     * Sets the validators that can be referenced in the routes.
-     *
-     * @param validators the validators
-     */
-    void setValidators(List<ValidatorDefinition> validators);
-
-    /**
-     * Gets the validators that can be referenced in the routes.
-     *
-     * @return the validators available
-     */
-    List<ValidatorDefinition> getValidators();
-
-    /**
      * Resolve a validator given from/to data type.
      *
      * @param type the data type
diff --git a/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java b/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java
index 7915647..fa997f3 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java
@@ -24,6 +24,7 @@ import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.Processor;
 import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.OnExceptionDefinition;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.util.ObjectHelper;
 
@@ -118,9 +119,10 @@ public class ErrorHandlerBuilderRef extends ErrorHandlerBuilderSupport {
         // the transacted error handler could have been configured on the route so we should use that one
         if (!isErrorHandlerBuilderConfigured(ref)) {
             // see if there has been configured a route builder on the route
-            answer = routeContext.getRoute().getErrorHandlerBuilder();
-            if (answer == null && routeContext.getRoute().getErrorHandlerRef() != null) {
-                answer = routeContext.lookup(routeContext.getRoute().getErrorHandlerRef(), ErrorHandlerBuilder.class);
+            RouteDefinition route = (RouteDefinition) routeContext.getRoute();
+            answer = route.getErrorHandlerBuilder();
+            if (answer == null && route.getErrorHandlerRef() != null) {
+                answer = routeContext.lookup(route.getErrorHandlerRef(), ErrorHandlerBuilder.class);
             }
             if (answer == null) {
                 // fallback to the default error handler if none configured on the route
diff --git a/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java b/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java
index 44feecf..fbc41b3 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java
@@ -23,6 +23,7 @@ import java.util.Map;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.model.OnExceptionDefinition;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.processor.ErrorHandler;
 import org.apache.camel.processor.ErrorHandlerSupport;
 import org.apache.camel.processor.RedeliveryErrorHandler;
@@ -122,7 +123,8 @@ public abstract class ErrorHandlerBuilderSupport implements ErrorHandlerBuilder
     protected String getRouteId(RouteContext routeContext) {
         CamelContext context = routeContext.getCamelContext();
         if (context != null) {
-            return routeContext.getRoute().idOrCreate(context.getNodeIdFactory());
+            RouteDefinition route = (RouteDefinition) routeContext.getRoute();
+            return route.idOrCreate(context.getNodeIdFactory());
         } else {
             return routeContext.getRoute().getId();
         }
diff --git a/camel-core/src/main/java/org/apache/camel/component/extension/ComponentVerifierExtension.java b/camel-core/src/main/java/org/apache/camel/component/extension/ComponentVerifierExtension.java
index d2f9287..ddc2865 100644
--- a/camel-core/src/main/java/org/apache/camel/component/extension/ComponentVerifierExtension.java
+++ b/camel-core/src/main/java/org/apache/camel/component/extension/ComponentVerifierExtension.java
@@ -22,12 +22,12 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.camel.Component;
-import org.apache.camel.component.extension.verifier.ComponentVerifierExtensionHelper.ErrorAttribute;
-import org.apache.camel.component.extension.verifier.ComponentVerifierExtensionHelper.ErrorCode;
-import org.apache.camel.component.extension.verifier.ComponentVerifierExtensionHelper.ExceptionErrorAttribute;
-import org.apache.camel.component.extension.verifier.ComponentVerifierExtensionHelper.GroupErrorAttribute;
-import org.apache.camel.component.extension.verifier.ComponentVerifierExtensionHelper.HttpErrorAttribute;
-import org.apache.camel.component.extension.verifier.ComponentVerifierExtensionHelper.StandardErrorCode;
+import org.apache.camel.component.extension.ComponentVerifierExtensionHelper.ErrorAttribute;
+import org.apache.camel.component.extension.ComponentVerifierExtensionHelper.ErrorCode;
+import org.apache.camel.component.extension.ComponentVerifierExtensionHelper.ExceptionErrorAttribute;
+import org.apache.camel.component.extension.ComponentVerifierExtensionHelper.GroupErrorAttribute;
+import org.apache.camel.component.extension.ComponentVerifierExtensionHelper.HttpErrorAttribute;
+import org.apache.camel.component.extension.ComponentVerifierExtensionHelper.StandardErrorCode;
 import org.apache.camel.component.extension.verifier.ResultErrorBuilder;
 import org.apache.camel.util.ObjectHelper;
 
diff --git a/camel-core/src/main/java/org/apache/camel/component/extension/verifier/ComponentVerifierExtensionHelper.java b/camel-core/src/main/java/org/apache/camel/component/extension/ComponentVerifierExtensionHelper.java
similarity index 79%
rename from camel-core/src/main/java/org/apache/camel/component/extension/verifier/ComponentVerifierExtensionHelper.java
rename to camel-core/src/main/java/org/apache/camel/component/extension/ComponentVerifierExtensionHelper.java
index 583ccf7..bbe4780 100644
--- a/camel-core/src/main/java/org/apache/camel/component/extension/verifier/ComponentVerifierExtensionHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/component/extension/ComponentVerifierExtensionHelper.java
@@ -14,9 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.extension.verifier;
+package org.apache.camel.component.extension;
 
-import org.apache.camel.component.extension.ComponentVerifierExtension;
 import org.apache.camel.component.extension.ComponentVerifierExtension.VerificationError.Attribute;
 import org.apache.camel.component.extension.ComponentVerifierExtension.VerificationError.Code;
 import org.apache.camel.component.extension.ComponentVerifierExtension.VerificationError.ExceptionAttribute;
@@ -28,16 +27,16 @@ import org.apache.camel.component.extension.ComponentVerifierExtension.Verificat
  * Package visible helper class holding implementation classes for
  * constant like error code and attributes in {@link  ComponentVerifierExtension.VerificationError}
  */
-public final class ComponentVerifierExtensionHelper {
+final class ComponentVerifierExtensionHelper {
 
     /**
      * Custom class for error codes
      */
-    public static class ErrorCode implements Code {
+    static class ErrorCode implements Code {
 
         private final String name;
 
-        public ErrorCode(String name) {
+        ErrorCode(String name) {
             if (name == null) {
                 throw new IllegalArgumentException("Name of an error code must not be null");
             }
@@ -74,11 +73,11 @@ public final class ComponentVerifierExtensionHelper {
         }
     }
 
-    public static class ErrorAttribute implements Attribute {
+    static class ErrorAttribute implements Attribute {
 
         private final String name;
 
-        public ErrorAttribute(String name) {
+        ErrorAttribute(String name) {
             if (name == null) {
                 throw new IllegalArgumentException("Name of an error attribute must not be null");
             }
@@ -119,26 +118,26 @@ public final class ComponentVerifierExtensionHelper {
     // ===========================================================================================================
     // Helper classes for implementing the constants in ComponentVerifier:
 
-    public static class StandardErrorCode extends ErrorCode implements StandardCode {
-        public StandardErrorCode(String name) {
+    static class StandardErrorCode extends ErrorCode implements StandardCode {
+        StandardErrorCode(String name) {
             super(name);
         }
     }
 
-    public static class ExceptionErrorAttribute extends ErrorAttribute implements ExceptionAttribute {
-        public ExceptionErrorAttribute(String name) {
+    static class ExceptionErrorAttribute extends ErrorAttribute implements ExceptionAttribute {
+        ExceptionErrorAttribute(String name) {
             super(name);
         }
     }
 
-    public static class HttpErrorAttribute extends ErrorAttribute implements HttpAttribute {
-        public HttpErrorAttribute(String name) {
+    static class HttpErrorAttribute extends ErrorAttribute implements HttpAttribute {
+        HttpErrorAttribute(String name) {
             super(name);
         }
     }
 
-    public static class GroupErrorAttribute extends ErrorAttribute implements GroupAttribute {
-        public GroupErrorAttribute(String name) {
+    static class GroupErrorAttribute extends ErrorAttribute implements GroupAttribute {
+        GroupErrorAttribute(String name) {
             super(name);
         }
     }
diff --git a/camel-core/src/main/java/org/apache/camel/converter/TimePatternConverter.java b/camel-core/src/main/java/org/apache/camel/converter/TimePatternConverter.java
index f257a44..f40b447 100644
--- a/camel-core/src/main/java/org/apache/camel/converter/TimePatternConverter.java
+++ b/camel-core/src/main/java/org/apache/camel/converter/TimePatternConverter.java
@@ -16,12 +16,8 @@
  */
 package org.apache.camel.converter;
 
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 import org.apache.camel.Converter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.camel.util.TimeUtils;
 
 /**
  * Converter from String syntax to milli seconds.
@@ -29,11 +25,6 @@ import org.slf4j.LoggerFactory;
  */
 @Converter
 public final class TimePatternConverter {   
-    private static final Logger LOG = LoggerFactory.getLogger(TimePatternConverter.class);
-    private static final Pattern NUMBERS_ONLY_STRING_PATTERN = Pattern.compile("^[-]?(\\d)+$", Pattern.CASE_INSENSITIVE);
-    private static final Pattern HOUR_REGEX_PATTERN = Pattern.compile("((\\d)*(\\d))h(our(s)?)?", Pattern.CASE_INSENSITIVE);
-    private static final Pattern MINUTES_REGEX_PATTERN = Pattern.compile("((\\d)*(\\d))m(in(ute(s)?)?)?", Pattern.CASE_INSENSITIVE);
-    private static final Pattern SECONDS_REGEX_PATTERN = Pattern.compile("((\\d)*(\\d))s(ec(ond)?(s)?)?", Pattern.CASE_INSENSITIVE);
 
     /**
      * Utility classes should not have a public constructor.
@@ -43,106 +34,6 @@ public final class TimePatternConverter {
     
     @Converter
     public static long toMilliSeconds(String source) throws IllegalArgumentException {
-        // quick conversion if its only digits
-        boolean digit = true;
-        for (int i = 0; i < source.length(); i++) {
-            char ch = source.charAt(i);
-            // special for fist as it can be negative number
-            if (i == 0 && ch == '-') {
-                continue;
-            }
-            // quick check if its 0..9
-            if (ch < '0' || ch > '9') {
-                digit = false;
-                break;
-            }
-        }
-        if (digit) {
-            return Long.valueOf(source);
-        }
-
-        long milliseconds = 0;
-        boolean foundFlag = false;
-
-        checkCorrectnessOfPattern(source);
-        Matcher matcher;
-
-        matcher = createMatcher(NUMBERS_ONLY_STRING_PATTERN, source);
-        if (matcher.find()) {
-            // Note: This will also be used for regular numeric strings. 
-            //       This String -> long converter will be used for all strings.
-            milliseconds = Long.valueOf(source);
-        } else {            
-            matcher = createMatcher(HOUR_REGEX_PATTERN, source);
-            if (matcher.find()) {
-                milliseconds = milliseconds + (3600000 * Long.valueOf(matcher.group(1)));
-                foundFlag = true;
-            }
-            
-            matcher = createMatcher(MINUTES_REGEX_PATTERN, source);
-            if (matcher.find()) {
-                long minutes = Long.valueOf(matcher.group(1));
-                if ((minutes > 59) && foundFlag) {
-                    throw new IllegalArgumentException("Minutes should contain a valid value between 0 and 59: " + source);
-                }
-                foundFlag = true;
-                milliseconds = milliseconds + (60000 * minutes);
-            }
-               
-            matcher = createMatcher(SECONDS_REGEX_PATTERN, source);
-            if (matcher.find()) {
-                long seconds = Long.valueOf(matcher.group(1));
-                if ((seconds > 59) && foundFlag) {
-                    throw new IllegalArgumentException("Seconds should contain a valid value between 0 and 59: " + source);
-                }
-                foundFlag = true;
-                milliseconds = milliseconds + (1000 * seconds);
-            }      
-            
-            // No pattern matched... initiating fallback check and conversion (if required). 
-            // The source at this point may contain illegal values or special characters 
-            if (!foundFlag) {
-                milliseconds = Long.valueOf(source);
-            }
-        }       
-        
-        LOG.trace("source: {} milliseconds: ", source, milliseconds);
-        
-        return milliseconds;
+        return TimeUtils.toMilliSeconds(source);
     }
-
-    private static void checkCorrectnessOfPattern(String source) {
-        //replace only numbers once
-        Matcher matcher = createMatcher(NUMBERS_ONLY_STRING_PATTERN, source);
-        String replaceSource = matcher.replaceFirst("");
-
-        //replace hour string once
-        matcher = createMatcher(HOUR_REGEX_PATTERN, replaceSource);
-        if (matcher.find() && matcher.find()) {
-            throw new IllegalArgumentException("Hours should not be specified more then once: " + source);
-        }
-        replaceSource = matcher.replaceFirst("");
-
-        //replace minutes once
-        matcher = createMatcher(MINUTES_REGEX_PATTERN, replaceSource);
-        if (matcher.find() && matcher.find()) {
-            throw new IllegalArgumentException("Minutes should not be specified more then once: " + source);
-        }
-        replaceSource = matcher.replaceFirst("");
-
-        //replace seconds once
-        matcher = createMatcher(SECONDS_REGEX_PATTERN, replaceSource);
-        if (matcher.find() && matcher.find()) {
-            throw new IllegalArgumentException("Seconds should not be specified more then once: " + source);
-        }
-        replaceSource = matcher.replaceFirst("");
-
-        if (replaceSource.length() > 0) {
-            throw new IllegalArgumentException("Illegal characters: " + source);
-        }
-    }
-
-    private static Matcher createMatcher(Pattern pattern, String source) {
-        return pattern.matcher(source);        
-    }    
 }
diff --git a/camel-core/src/main/java/org/apache/camel/health/HealthCheckConfiguration.java b/camel-core/src/main/java/org/apache/camel/health/HealthCheckConfiguration.java
index 2621e1b..9f2cdf6 100644
--- a/camel-core/src/main/java/org/apache/camel/health/HealthCheckConfiguration.java
+++ b/camel-core/src/main/java/org/apache/camel/health/HealthCheckConfiguration.java
@@ -19,8 +19,8 @@ package org.apache.camel.health;
 import java.time.Duration;
 
 import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.converter.TimePatternConverter;
 import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.TimeUtils;
 
 public class HealthCheckConfiguration implements Cloneable {
     public static final Boolean DEFAULT_VALUE_ENABLED = Boolean.FALSE;
@@ -80,7 +80,7 @@ public class HealthCheckConfiguration implements Cloneable {
      */
     public void setInterval(String interval) {
         if (ObjectHelper.isNotEmpty(interval)) {
-            this.interval = Duration.ofMillis(TimePatternConverter.toMilliSeconds(interval));
+            this.interval = Duration.ofMillis(TimeUtils.toMilliSeconds(interval));
         } else {
             this.interval = null;
         }
@@ -173,7 +173,7 @@ public class HealthCheckConfiguration implements Cloneable {
 
         public Builder interval(String interval) {
             return ObjectHelper.isNotEmpty(interval)
-                ? interval(TimePatternConverter.toMilliSeconds(interval))
+                ? interval(TimeUtils.toMilliSeconds(interval))
                 : this;
         }
 
diff --git a/camel-core/src/main/java/org/apache/camel/impl/BreakpointSupport.java b/camel-core/src/main/java/org/apache/camel/impl/BreakpointSupport.java
index c41fa79..808b098 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/BreakpointSupport.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/BreakpointSupport.java
@@ -19,8 +19,8 @@ package org.apache.camel.impl;
 import java.util.EventObject;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Breakpoint;
 
 /**
@@ -46,15 +46,15 @@ public abstract class BreakpointSupport implements Breakpoint {
         state = State.Active;
     }
 
-    public void beforeProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+    public void beforeProcess(Exchange exchange, Processor processor, NamedNode definition) {
         // noop
     }
 
-    public void afterProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition, long timeTaken) {
+    public void afterProcess(Exchange exchange, Processor processor, NamedNode definition, long timeTaken) {
         // noop
     }
 
-    public void onEvent(Exchange exchange, EventObject event, ProcessorDefinition<?> definition) {
+    public void onEvent(Exchange exchange, EventObject event, NamedNode definition) {
         // noop
     }
 }
diff --git a/camel-core/src/main/java/org/apache/camel/impl/ConditionSupport.java b/camel-core/src/main/java/org/apache/camel/impl/ConditionSupport.java
index 9d32662..5a966fd 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/ConditionSupport.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/ConditionSupport.java
@@ -19,8 +19,8 @@ package org.apache.camel.impl;
 import java.util.EventObject;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Condition;
 
 /**
@@ -30,7 +30,7 @@ import org.apache.camel.spi.Condition;
  */
 public class ConditionSupport implements Condition {
 
-    public boolean matchProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+    public boolean matchProcess(Exchange exchange, Processor processor, NamedNode definition) {
         return false;
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
index 739622f..9224f40 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
@@ -35,7 +35,6 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 import java.util.TreeMap;
-import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ScheduledExecutorService;
@@ -99,6 +98,7 @@ import org.apache.camel.impl.validator.ValidatorKey;
 import org.apache.camel.management.DefaultManagementMBeanAssembler;
 import org.apache.camel.management.DefaultManagementStrategy;
 import org.apache.camel.management.JmxSystemPropertyKeys;
+import org.apache.camel.management.ManagedCamelContext;
 import org.apache.camel.management.ManagementStrategyFactory;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.model.FromDefinition;
@@ -123,6 +123,7 @@ import org.apache.camel.runtimecatalog.DefaultRuntimeCamelCatalog;
 import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
 import org.apache.camel.spi.CamelContextNameStrategy;
+import org.apache.camel.spi.CamelContextTracker;
 import org.apache.camel.spi.ClassResolver;
 import org.apache.camel.spi.ComponentResolver;
 import org.apache.camel.spi.DataFormat;
@@ -158,6 +159,7 @@ import org.apache.camel.spi.RestRegistry;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.spi.RouteController;
 import org.apache.camel.spi.RouteError;
+import org.apache.camel.spi.RouteError.Phase;
 import org.apache.camel.spi.RoutePolicyFactory;
 import org.apache.camel.spi.RouteStartupOrder;
 import org.apache.camel.spi.RuntimeEndpointRegistry;
@@ -187,6 +189,7 @@ import org.apache.camel.util.StringHelper;
 import org.apache.camel.util.StringQuoteHelper;
 import org.apache.camel.util.TimeUtils;
 import org.apache.camel.util.URISupport;
+import org.apache.camel.util.function.ThrowingRunnable;
 import org.apache.camel.util.jsse.SSLContextParameters;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -200,7 +203,7 @@ import static org.apache.camel.impl.MDCUnitOfWork.MDC_CAMEL_CONTEXT_ID;
  * @version
  */
 @SuppressWarnings("deprecation")
-public class DefaultCamelContext extends ServiceSupport implements ModelCamelContext, Suspendable {
+public class DefaultCamelContext extends ServiceSupport implements ModelCamelContext, ManagedCamelContext, Suspendable {
     private final Logger log = LoggerFactory.getLogger(getClass());
     private final AtomicBoolean vetoStated = new AtomicBoolean();
     private JAXBContext jaxbContext;
@@ -339,7 +342,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
 
         // Call all registered trackers with this context
         // Note, this may use a partially constructed object
-        CamelContextTrackerRegistry.INSTANCE.contextCreated(this);
+        CamelContextTracker.notifyContextCreated(this);
     }
 
     /**
@@ -1005,13 +1008,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
 
     public void addRoutes(final RoutesBuilder builder) throws Exception {
         log.debug("Adding routes from builder: {}", builder);
-        doWithDefinedClassLoader(new Callable<Void>() {
-            @Override
-            public Void call() throws Exception {
-                builder.addRoutesToCamelContext(DefaultCamelContext.this);
-                return null;
-            }
-        });
+        doWithDefinedClassLoader(() -> builder.addRoutesToCamelContext(DefaultCamelContext.this));
     }
 
     public synchronized RoutesDefinition loadRoutesDefinition(InputStream is) throws Exception {
@@ -1061,7 +1058,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
     }
 
     public void addRouteDefinition(RouteDefinition routeDefinition) throws Exception {
-        addRouteDefinitions(Arrays.asList(routeDefinition));
+        addRouteDefinitions(Collections.singletonList(routeDefinition));
     }
 
     /**
@@ -1143,10 +1140,6 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
         return answer != null && answer;
     }
 
-    public void stopRoute(RouteDefinition route) throws Exception {
-        stopRoute(route.idOrCreate(nodeIdFactory));
-    }
-
     public void startAllRoutes() throws Exception {
         doStartOrResumeRoutes(routeServices, true, true, false, false);
     }
@@ -1214,67 +1207,15 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
         return false;
     }
 
-    public synchronized void stopRoute(String routeId) throws Exception {
-        DefaultRouteError.reset(this, routeId);
-
-        RouteService routeService = routeServices.get(routeId);
-        if (routeService != null) {
-            try {
-                List<RouteStartupOrder> routes = new ArrayList<>(1);
-                RouteStartupOrder order = new DefaultRouteStartupOrder(1, routeService.getRoutes().iterator().next(), routeService);
-                routes.add(order);
-
-                getShutdownStrategy().shutdown(this, routes);
-                // must stop route service as well
-                stopRouteService(routeService, false);
-            } catch (Exception e) {
-                DefaultRouteError.set(this, routeId, RouteError.Phase.STOP, e);
-                throw e;
-            }
-        }
+    public void stopRoute(String routeId) throws Exception {
+        doShutdownRoute(routeId, getShutdownStrategy().getTimeout(), getShutdownStrategy().getTimeUnit(), false);
     }
 
-    public synchronized void stopRoute(String routeId, long timeout, TimeUnit timeUnit) throws Exception {
-        DefaultRouteError.reset(this, routeId);
-
-        RouteService routeService = routeServices.get(routeId);
-        if (routeService != null) {
-            try {
-                List<RouteStartupOrder> routes = new ArrayList<>(1);
-                RouteStartupOrder order = new DefaultRouteStartupOrder(1, routeService.getRoutes().iterator().next(), routeService);
-                routes.add(order);
-
-                getShutdownStrategy().shutdown(this, routes, timeout, timeUnit);
-                // must stop route service as well
-                stopRouteService(routeService, false);
-            } catch (Exception e) {
-                DefaultRouteError.set(this, routeId, RouteError.Phase.STOP, e);
-                throw e;
-            }
-        }
-    }
-
-    public synchronized void shutdownRoute(String routeId) throws Exception {
-        DefaultRouteError.reset(this, routeId);
-
-        RouteService routeService = routeServices.get(routeId);
-        if (routeService != null) {
-            try {
-                List<RouteStartupOrder> routes = new ArrayList<>(1);
-                RouteStartupOrder order = new DefaultRouteStartupOrder(1, routeService.getRoutes().iterator().next(), routeService);
-                routes.add(order);
-
-                getShutdownStrategy().shutdown(this, routes);
-                // must stop route service as well (and remove the routes from management)
-                stopRouteService(routeService, true);
-            } catch (Exception e) {
-                DefaultRouteError.set(this, routeId, RouteError.Phase.SHUTDOWN, e);
-                throw e;
-            }
-        }
+    public void stopRoute(String routeId, long timeout, TimeUnit timeUnit) throws Exception {
+        doShutdownRoute(routeId, timeout, timeUnit, false);
     }
 
-    public synchronized void shutdownRoute(String routeId, long timeout, TimeUnit timeUnit) throws Exception {
+    protected synchronized void doShutdownRoute(String routeId, long timeout, TimeUnit timeUnit, boolean removingRoutes) throws Exception {
         DefaultRouteError.reset(this, routeId);
 
         RouteService routeService = routeServices.get(routeId);
@@ -1286,9 +1227,9 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
 
                 getShutdownStrategy().shutdown(this, routes, timeout, timeUnit);
                 // must stop route service as well (and remove the routes from management)
-                stopRouteService(routeService, true);
+                stopRouteService(routeService, removingRoutes);
             } catch (Exception e) {
-                DefaultRouteError.set(this, routeId, RouteError.Phase.SHUTDOWN, e);
+                DefaultRouteError.set(this, routeId, removingRoutes ? Phase.SHUTDOWN : Phase.STOP, e);
                 throw e;
             }
         }
@@ -1319,13 +1260,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
                     removeRouteDefinition(routeId);
                     routeServices.remove(routeId);
                     // remove route from startup order as well, as it was removed
-                    Iterator<RouteStartupOrder> it = routeStartupOrder.iterator();
-                    while (it.hasNext()) {
-                        RouteStartupOrder order = it.next();
-                        if (order.getRoute().getId().equals(routeId)) {
-                            it.remove();
-                        }
-                    }
+                    routeStartupOrder.removeIf(order -> order.getRoute().getId().equals(routeId));
 
                     // from the route which we have removed, then remove all its private endpoints
                     // (eg the endpoints which are not in use by other routes)
@@ -1360,35 +1295,8 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
         return false;
     }
 
-    public synchronized void suspendRoute(String routeId) throws Exception {
-        try {
-            DefaultRouteError.reset(this, routeId);
-
-            if (!routeSupportsSuspension(routeId)) {
-                // stop if we suspend is not supported
-                stopRoute(routeId);
-                return;
-            }
-
-            RouteService routeService = routeServices.get(routeId);
-            if (routeService != null) {
-                List<RouteStartupOrder> routes = new ArrayList<>(1);
-                Route route = routeService.getRoutes().iterator().next();
-                RouteStartupOrder order = new DefaultRouteStartupOrder(1, route, routeService);
-                routes.add(order);
-
-                getShutdownStrategy().suspend(this, routes);
-                // must suspend route service as well
-                suspendRouteService(routeService);
-                // must suspend the route as well
-                if (route instanceof SuspendableService) {
-                    ((SuspendableService) route).suspend();
-                }
-            }
-        } catch (Exception e) {
-            DefaultRouteError.set(this, routeId, RouteError.Phase.SUSPEND, e);
-            throw e;
-        }
+    public void suspendRoute(String routeId) throws Exception {
+        suspendRoute(routeId, getShutdownStrategy().getTimeout(), getShutdownStrategy().getTimeUnit());
     }
 
     public synchronized void suspendRoute(String routeId, long timeout, TimeUnit timeUnit) throws Exception {
@@ -3210,30 +3118,26 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
     // -----------------------------------------------------------------------
 
     protected synchronized void doStart() throws Exception {
-        doWithDefinedClassLoader(new Callable<Void>() {
-            @Override
-            public Void call() throws Exception {
-                try {
-                    doStartCamel();
-                    return null;
-                } catch (Exception e) {
-                    // fire event that we failed to start
-                    EventHelper.notifyCamelContextStartupFailed(DefaultCamelContext.this, e);
-                    // rethrow cause
-                    throw e;
-                }
+        doWithDefinedClassLoader(() -> {
+            try {
+                doStartCamel();
+            } catch (Exception e) {
+                // fire event that we failed to start
+                EventHelper.notifyCamelContextStartupFailed(DefaultCamelContext.this, e);
+                // rethrow cause
+                throw e;
             }
         });
     }
 
-    private <T> T doWithDefinedClassLoader(Callable<T> callable) throws Exception {
+    private <T extends Throwable> void doWithDefinedClassLoader(ThrowingRunnable<T> callable) throws T {
         ClassLoader tccl = Thread.currentThread().getContextClassLoader();
         try {
             // Using the ApplicationClassLoader as the default for TCCL
             if (applicationContextClassLoader != null) {
                 Thread.currentThread().setContextClassLoader(applicationContextClassLoader);
             }
-            return callable.call();
+            callable.run();
         } finally {
             Thread.currentThread().setContextClassLoader(tccl);
         }
@@ -3479,13 +3383,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
         // shutdown await manager to trigger interrupt of blocked threads to attempt to free these threads graceful
         shutdownServices(asyncProcessorAwaitManager);
 
-        routeStartupOrder.sort(new Comparator<RouteStartupOrder>() {
-            @Override
-            public int compare(RouteStartupOrder o1, RouteStartupOrder o2) {
-                // Reversed order
-                return Integer.compare(o2.getStartupOrder(), o1.getStartupOrder());
-            }
-        });
+        routeStartupOrder.sort(Comparator.comparingInt(RouteStartupOrder::getStartupOrder).reversed());
         List<RouteService> list = new ArrayList<>();
         for (RouteStartupOrder startupOrder : routeStartupOrder) {
             DefaultRouteStartupOrder order = (DefaultRouteStartupOrder) startupOrder;
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultDebugger.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultDebugger.java
index 1ef52b8..9d19fa1 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultDebugger.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultDebugger.java
@@ -136,17 +136,17 @@ public class DefaultDebugger implements Debugger, CamelContextAware {
             }
 
             @Override
-            public void beforeProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+            public void beforeProcess(Exchange exchange, Processor processor, NamedNode definition) {
                 breakpoint.beforeProcess(exchange, processor, definition);
             }
 
             @Override
-            public void afterProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition, long timeTaken) {
+            public void afterProcess(Exchange exchange, Processor processor, NamedNode definition, long timeTaken) {
                 breakpoint.afterProcess(exchange, processor, definition, timeTaken);
             }
 
             @Override
-            public void onEvent(Exchange exchange, EventObject event, ProcessorDefinition<?> definition) {
+            public void onEvent(Exchange exchange, EventObject event, NamedNode definition) {
                 if (event instanceof ExchangeCreatedEvent) {
                     exchange.getContext().getDebugger().startSingleStepExchange(exchange.getExchangeId(), this);
                 } else if (event instanceof ExchangeCompletedEvent) {
@@ -213,7 +213,7 @@ public class DefaultDebugger implements Debugger, CamelContextAware {
     }
 
     @Override
-    public boolean beforeProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+    public boolean beforeProcess(Exchange exchange, Processor processor, NamedNode definition) {
         // is the exchange in single step mode?
         Breakpoint singleStep = singleSteps.get(exchange.getExchangeId());
         if (singleStep != null) {
@@ -237,7 +237,7 @@ public class DefaultDebugger implements Debugger, CamelContextAware {
     }
 
     @Override
-    public boolean afterProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition, long timeTaken) {
+    public boolean afterProcess(Exchange exchange, Processor processor, NamedNode definition, long timeTaken) {
         // is the exchange in single step mode?
         Breakpoint singleStep = singleSteps.get(exchange.getExchangeId());
         if (singleStep != null) {
@@ -284,7 +284,7 @@ public class DefaultDebugger implements Debugger, CamelContextAware {
         return match;
     }
 
-    protected void onBeforeProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition, Breakpoint breakpoint) {
+    protected void onBeforeProcess(Exchange exchange, Processor processor, NamedNode definition, Breakpoint breakpoint) {
         try {
             breakpoint.beforeProcess(exchange, processor, definition);
         } catch (Throwable e) {
@@ -292,7 +292,7 @@ public class DefaultDebugger implements Debugger, CamelContextAware {
         }
     }
 
-    protected void onAfterProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition, long timeTaken, Breakpoint breakpoint) {
+    protected void onAfterProcess(Exchange exchange, Processor processor, NamedNode definition, long timeTaken, Breakpoint breakpoint) {
         try {
             breakpoint.afterProcess(exchange, processor, definition, timeTaken);
         } catch (Throwable e) {
@@ -320,7 +320,7 @@ public class DefaultDebugger implements Debugger, CamelContextAware {
         }
     }
 
-    private boolean matchConditions(Exchange exchange, Processor processor, ProcessorDefinition<?> definition, BreakpointConditions breakpoint) {
+    private boolean matchConditions(Exchange exchange, Processor processor, NamedNode definition, BreakpointConditions breakpoint) {
         for (Condition condition : breakpoint.getConditions()) {
             if (!condition.matchProcess(exchange, processor, definition)) {
                 return false;
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultProcessorFactory.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultProcessorFactory.java
index 3519e3e..9eb7403 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultProcessorFactory.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultProcessorFactory.java
@@ -16,9 +16,9 @@
  */
 package org.apache.camel.impl;
 
+import org.apache.camel.NamedNode;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.FactoryFinder;
 import org.apache.camel.spi.ProcessorFactory;
 import org.apache.camel.spi.RouteContext;
@@ -39,7 +39,7 @@ public class DefaultProcessorFactory implements ProcessorFactory {
     public static final String RESOURCE_PATH = "META-INF/services/org/apache/camel/model/";
 
     @Override
-    public Processor createChildProcessor(RouteContext routeContext, ProcessorDefinition<?> definition, boolean mandatory) throws Exception {
+    public Processor createChildProcessor(RouteContext routeContext, NamedNode definition, boolean mandatory) throws Exception {
         String name = definition.getClass().getSimpleName();
         FactoryFinder finder = routeContext.getCamelContext().getFactoryFinder(RESOURCE_PATH);
         try {
@@ -58,7 +58,7 @@ public class DefaultProcessorFactory implements ProcessorFactory {
     }
 
     @Override
-    public Processor createProcessor(RouteContext routeContext, ProcessorDefinition<?> definition) throws Exception {
+    public Processor createProcessor(RouteContext routeContext, NamedNode definition) throws Exception {
         String name = definition.getClass().getSimpleName();
         FactoryFinder finder = routeContext.getCamelContext().getFactoryFinder(RESOURCE_PATH);
         try {
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
index 1eadc24..247890c 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
@@ -25,6 +25,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
+import org.apache.camel.NamedNode;
 import org.apache.camel.NoSuchEndpointException;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
@@ -53,7 +54,7 @@ import org.apache.camel.util.ObjectHelper;
  * @version 
  */
 public class DefaultRouteContext implements RouteContext {
-    private final Map<ProcessorDefinition<?>, AtomicInteger> nodeIndex = new HashMap<>();
+    private final Map<NamedNode, AtomicInteger> nodeIndex = new HashMap<>();
     private final RouteDefinition route;
     private FromDefinition from;
     private final Collection<Route> routes;
@@ -458,7 +459,7 @@ public class DefaultRouteContext implements RouteContext {
         }
     }
     
-    public int getAndIncrement(ProcessorDefinition<?> node) {
+    public int getAndIncrement(NamedNode node) {
         AtomicInteger count = nodeIndex.get(node);
         if (count == null) {
             count = new AtomicInteger();
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteController.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteController.java
index b39bfbb..9d8956f 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteController.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteController.java
@@ -28,13 +28,13 @@ import org.apache.camel.spi.RouteController;
 
 @Experimental
 public class DefaultRouteController extends org.apache.camel.support.ServiceSupport implements RouteController  {
-    private CamelContext camelContext;
+    private DefaultCamelContext camelContext;
 
     public DefaultRouteController() {
         this(null);
     }
 
-    public DefaultRouteController(CamelContext camelContext) {
+    public DefaultRouteController(DefaultCamelContext camelContext) {
         this.camelContext = camelContext;
     }
 
@@ -44,7 +44,7 @@ public class DefaultRouteController extends org.apache.camel.support.ServiceSupp
 
     @Override
     public void setCamelContext(CamelContext camelContext) {
-        this.camelContext = camelContext;
+        this.camelContext = (DefaultCamelContext) camelContext;
     }
 
     @Override
@@ -72,17 +72,17 @@ public class DefaultRouteController extends org.apache.camel.support.ServiceSupp
 
     @Override
     public void startAllRoutes() throws Exception {
-        ((DefaultCamelContext) camelContext).startAllRoutes();
+        camelContext.startAllRoutes();
     }
 
     @Override
     public boolean isStartingRoutes() {
-        return ((DefaultCamelContext) camelContext).isStartingRoutes();
+        return camelContext.isStartingRoutes();
     }
 
     @Override
     public ServiceStatus getRouteStatus(String routeId) {
-        return ((DefaultCamelContext) camelContext).getRouteStatus(routeId);
+        return camelContext.getRouteStatus(routeId);
     }
 
     @Override
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteStartupOrder.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteStartupOrder.java
index 0c73112..d6b81b6 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteStartupOrder.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteStartupOrder.java
@@ -52,12 +52,8 @@ public class DefaultRouteStartupOrder implements RouteStartupOrder {
     }
 
     public List<Consumer> getInputs() {
-        List<Consumer> answer = new ArrayList<>();
         Map<Route, Consumer> inputs = routeService.getInputs();
-        for (Consumer consumer : inputs.values()) {
-            answer.add(consumer);
-        }
-        return answer;
+        return new ArrayList<>(inputs.values());
     }
 
     public List<Service> getServices() {
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java
index 4ee4acb..91a7b73 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java
@@ -154,8 +154,7 @@ public class DefaultShutdownStrategy extends ServiceSupport implements ShutdownS
     }
 
     public boolean shutdown(CamelContext context, RouteStartupOrder route, long timeout, TimeUnit timeUnit, boolean abortAfterTimeout) throws Exception {
-        List<RouteStartupOrder> routes = new ArrayList<>(1);
-        routes.add(route);
+        List<RouteStartupOrder> routes = Collections.singletonList(route);
         return doShutdown(context, routes, timeout, timeUnit, false, abortAfterTimeout, false);
     }
 
@@ -179,15 +178,12 @@ public class DefaultShutdownStrategy extends ServiceSupport implements ShutdownS
         StopWatch watch = new StopWatch();
 
         // at first sort according to route startup order
-        List<RouteStartupOrder> routesOrdered = new ArrayList<>(routes);
-        routesOrdered.sort(new Comparator<RouteStartupOrder>() {
-            public int compare(RouteStartupOrder o1, RouteStartupOrder o2) {
-                return o1.getStartupOrder() - o2.getStartupOrder();
-            }
-        });
+        Comparator<RouteStartupOrder> comparator = Comparator.comparingInt(RouteStartupOrder::getStartupOrder);
         if (shutdownRoutesInReverseOrder) {
-            Collections.reverse(routesOrdered);
+            comparator = comparator.reversed();
         }
+        List<RouteStartupOrder> routesOrdered = new ArrayList<>(routes);
+        routesOrdered.sort(comparator);
 
         if (suspendOnly) {
             LOG.info("Starting to graceful suspend {} routes (timeout {} {})", routesOrdered.size(), timeout, timeUnit.toString().toLowerCase(Locale.ENGLISH));
@@ -540,8 +536,8 @@ public class DefaultShutdownStrategy extends ServiceSupport implements ShutdownS
 
                 if (LOG.isTraceEnabled()) {
                     LOG.trace("{}{} with options [{},{}]",
-                            new Object[]{suspendOnly ? "Suspending route: " : "Shutting down route: ",
-                                order.getRoute().getId(), shutdownRoute, shutdownRunningTask});
+                            suspendOnly ? "Suspending route: " : "Shutting down route: ",
+                            order.getRoute().getId(), shutdownRoute, shutdownRunningTask);
                 }
 
                 for (Consumer consumer : order.getInputs()) {
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DurationRoutePolicyFactory.java b/camel-core/src/main/java/org/apache/camel/impl/DurationRoutePolicyFactory.java
index 849e00c..e2d36a5 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DurationRoutePolicyFactory.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DurationRoutePolicyFactory.java
@@ -17,7 +17,7 @@
 package org.apache.camel.impl;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.NamedNode;
 import org.apache.camel.spi.RoutePolicy;
 import org.apache.camel.spi.RoutePolicyFactory;
 import org.apache.camel.util.EndpointHelper;
@@ -35,7 +35,7 @@ public class DurationRoutePolicyFactory implements RoutePolicyFactory {
     private DurationRoutePolicy.Action action = DurationRoutePolicy.Action.STOP_ROUTE;
 
     @Override
-    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition route) {
+    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode route) {
         DurationRoutePolicy policy = null;
 
         if (fromRouteId == null || EndpointHelper.matchPattern(routeId, fromRouteId)) {
diff --git a/camel-core/src/main/java/org/apache/camel/impl/RouteService.java b/camel-core/src/main/java/org/apache/camel/impl/RouteService.java
index 94e4b4f..014554f 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/RouteService.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/RouteService.java
@@ -378,7 +378,8 @@ public class RouteService extends ChildServiceSupport {
             if (service instanceof ErrorHandler) {
                 // special for error handlers
                 for (LifecycleStrategy strategy : camelContext.getLifecycleStrategies()) {
-                    strategy.onErrorHandlerRemove(route.getRouteContext(), (Processor) service, route.getRouteContext().getRoute().getErrorHandlerBuilder());
+                    RouteDefinition definition = (RouteDefinition) route.getRouteContext().getRoute();
+                    strategy.onErrorHandlerRemove(route.getRouteContext(), (Processor) service, definition.getErrorHandlerBuilder());
                 }
             } else {
                 for (LifecycleStrategy strategy : camelContext.getLifecycleStrategies()) {
@@ -442,7 +443,8 @@ public class RouteService extends ChildServiceSupport {
      * Gather all other kind of route scoped services from the given route, except error handler
      */
     private void doGetRouteScopedServices(List<Service> services, Route route) {
-        for (ProcessorDefinition<?> output : route.getRouteContext().getRoute().getOutputs()) {
+        RouteDefinition definition = (RouteDefinition) route.getRouteContext().getRoute();
+        for (ProcessorDefinition<?> output : definition.getOutputs()) {
             if (output instanceof OnExceptionDefinition) {
                 OnExceptionDefinition onExceptionDefinition = (OnExceptionDefinition) output;
                 if (onExceptionDefinition.isRouteScoped()) {
diff --git a/camel-core/src/main/java/org/apache/camel/impl/SupervisingRouteController.java b/camel-core/src/main/java/org/apache/camel/impl/SupervisingRouteController.java
index fd52871..b832239 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/SupervisingRouteController.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/SupervisingRouteController.java
@@ -39,6 +39,7 @@ import java.util.stream.Collectors;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.Experimental;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Route;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.ServiceStatus;
@@ -541,7 +542,7 @@ public class SupervisingRouteController extends DefaultRouteController {
         }
 
         public RouteDefinition getDefinition() {
-            return this.route.getRouteContext().getRoute();
+            return (RouteDefinition) this.route.getRouteContext().getRoute();
         }
 
         public ServiceStatus getStatus() {
@@ -597,7 +598,7 @@ public class SupervisingRouteController extends DefaultRouteController {
         private final RoutePolicy policy = new ManagedRoutePolicy();
 
         @Override
-        public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition route) {
+        public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode route) {
             return policy;
         }
     }
@@ -618,7 +619,7 @@ public class SupervisingRouteController extends DefaultRouteController {
 
         @Override
         public void onInit(Route route) {
-            final String autoStartup = route.getRouteContext().getRoute().getAutoStartup();
+            final String autoStartup = ((RouteDefinition) route.getRouteContext().getRoute()).getAutoStartup();
             if (ObjectHelper.equalIgnoreCase("false", autoStartup)) {
                 LOGGER.info("Route {} won't be supervised (reason: has explicit auto-startup flag set to false)", route.getId());
                 return;
diff --git a/camel-core/src/main/java/org/apache/camel/impl/TypedProcessorFactory.java b/camel-core/src/main/java/org/apache/camel/impl/TypedProcessorFactory.java
index f0aa1b8..2e3497e 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/TypedProcessorFactory.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/TypedProcessorFactory.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.impl;
 
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.ProcessorFactory;
@@ -29,7 +30,7 @@ public class TypedProcessorFactory<T extends ProcessorDefinition<T>> implements
     }
 
     @Override
-    public Processor createChildProcessor(RouteContext routeContext, ProcessorDefinition<?> definition, boolean mandatory) throws Exception {
+    public Processor createChildProcessor(RouteContext routeContext, NamedNode definition, boolean mandatory) throws Exception {
         if (definition != null && type.isInstance(definition)) {
             return doCreateChildProcessor(routeContext, type.cast(definition), mandatory);
         }
@@ -38,7 +39,7 @@ public class TypedProcessorFactory<T extends ProcessorDefinition<T>> implements
     }
 
     @Override
-    public Processor createProcessor(RouteContext routeContext, ProcessorDefinition<?> definition) throws Exception {
+    public Processor createProcessor(RouteContext routeContext, NamedNode definition) throws Exception {
         if (definition != null && type.isInstance(definition)) {
             return doCreateProcessor(routeContext, type.cast(definition));
         }
diff --git a/camel-core/src/main/java/org/apache/camel/impl/cloud/ServiceRegistrationRoutePolicy.java b/camel-core/src/main/java/org/apache/camel/impl/cloud/ServiceRegistrationRoutePolicy.java
index 4b641db..15e7f4a 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/cloud/ServiceRegistrationRoutePolicy.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/cloud/ServiceRegistrationRoutePolicy.java
@@ -28,6 +28,7 @@ import org.apache.camel.api.management.ManagedResource;
 import org.apache.camel.cloud.DiscoverableService;
 import org.apache.camel.cloud.ServiceDefinition;
 import org.apache.camel.cloud.ServiceRegistry;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.support.RoutePolicySupport;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
@@ -166,7 +167,8 @@ public class ServiceRegistrationRoutePolicy extends RoutePolicySupport implement
         String serviceId = properties.get(ServiceDefinition.SERVICE_META_ID);
         if (serviceId == null) {
             // if not check if the route id is custom and use it
-            if (route.getRouteContext().getRoute().hasCustomIdAssigned()) {
+            RouteDefinition definition = (RouteDefinition) route.getRouteContext().getRoute();
+            if (definition.hasCustomIdAssigned()) {
                 serviceId = route.getId();
             }
 
diff --git a/camel-core/src/main/java/org/apache/camel/impl/cloud/ServiceRegistrationRoutePolicyFactory.java b/camel-core/src/main/java/org/apache/camel/impl/cloud/ServiceRegistrationRoutePolicyFactory.java
index 54825fc..1586a8b 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/cloud/ServiceRegistrationRoutePolicyFactory.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/cloud/ServiceRegistrationRoutePolicyFactory.java
@@ -17,8 +17,8 @@
 package org.apache.camel.impl.cloud;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.NamedNode;
 import org.apache.camel.cloud.ServiceRegistry;
-import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spi.RoutePolicy;
 import org.apache.camel.spi.RoutePolicyFactory;
 import org.slf4j.Logger;
@@ -44,7 +44,7 @@ public class ServiceRegistrationRoutePolicyFactory implements RoutePolicyFactory
     }
 
     @Override
-    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition route) {
+    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode route) {
         return new ServiceRegistrationRoutePolicy(serviceRegistry, serviceRegistrySelector);
     }
 }
diff --git a/camel-core/src/main/java/org/apache/camel/impl/cluster/ClusteredRouteController.java b/camel-core/src/main/java/org/apache/camel/impl/cluster/ClusteredRouteController.java
index cd42954..1d5feff 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/cluster/ClusteredRouteController.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/cluster/ClusteredRouteController.java
@@ -32,6 +32,7 @@ import java.util.stream.Collectors;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Experimental;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Route;
 import org.apache.camel.cluster.CamelClusterService;
 import org.apache.camel.impl.DefaultRouteController;
@@ -292,7 +293,8 @@ public class ClusteredRouteController extends DefaultRouteController {
 
     private final class PolicyFactory implements RoutePolicyFactory {
         @Override
-        public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition route) {
+        public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode node) {
+            RouteDefinition route = (RouteDefinition) node;
             // All the filter have to be match to include the route in the
             // clustering set-up
             if (filters.stream().allMatch(filter -> filter.test(camelContext, routeId, route))) {
diff --git a/camel-core/src/main/java/org/apache/camel/impl/cluster/ClusteredRoutePolicy.java b/camel-core/src/main/java/org/apache/camel/impl/cluster/ClusteredRoutePolicy.java
index 4ef7fa0..b35972b 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/cluster/ClusteredRoutePolicy.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/cluster/ClusteredRoutePolicy.java
@@ -38,6 +38,7 @@ import org.apache.camel.cluster.CamelClusterMember;
 import org.apache.camel.cluster.CamelClusterService;
 import org.apache.camel.cluster.CamelClusterView;
 import org.apache.camel.management.event.CamelContextStartedEvent;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.support.EventNotifierSupport;
 import org.apache.camel.support.RoutePolicySupport;
 import org.apache.camel.util.ObjectHelper;
@@ -153,12 +154,15 @@ public final class ClusteredRoutePolicy extends RoutePolicySupport implements Ca
     // life-cycle
     // ****************************************************
 
+    private RouteDefinition definition(Route route) {
+        return (RouteDefinition) route.getRouteContext().getRoute();
+    }
     @Override
     public void onInit(Route route) {
         super.onInit(route);
 
         LOGGER.info("Route managed by {}. Setting route {} AutoStartup flag to false.", getClass(), route.getId());
-        route.getRouteContext().getRoute().setAutoStartup("false");
+        definition(route).setAutoStartup("false");
 
         this.refCount.retain();
         this.stoppedRoutes.add(route);
@@ -229,7 +233,7 @@ public final class ClusteredRoutePolicy extends RoutePolicySupport implements Ca
 
         try {
             for (Route route : stoppedRoutes) {
-                ServiceStatus status = route.getRouteContext().getRoute().getStatus(getCamelContext());
+                ServiceStatus status = definition(route).getStatus(getCamelContext());
                 if (status.isStartable()) {
                     LOGGER.debug("Starting route '{}'", route.getId());
                     camelContext.getRouteController().startRoute(route.getId());
@@ -261,7 +265,7 @@ public final class ClusteredRoutePolicy extends RoutePolicySupport implements Ca
 
         try {
             for (Route route : startedRoutes) {
-                ServiceStatus status = route.getRouteContext().getRoute().getStatus(getCamelContext());
+                ServiceStatus status = definition(route).getStatus(getCamelContext());
                 if (status.isStoppable()) {
                     LOGGER.debug("Stopping route '{}'", route.getId());
                     stopRoute(route);
diff --git a/camel-core/src/main/java/org/apache/camel/impl/cluster/ClusteredRoutePolicyFactory.java b/camel-core/src/main/java/org/apache/camel/impl/cluster/ClusteredRoutePolicyFactory.java
index c1b97e1..9ff0e2f 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/cluster/ClusteredRoutePolicyFactory.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/cluster/ClusteredRoutePolicyFactory.java
@@ -17,9 +17,9 @@
 package org.apache.camel.impl.cluster;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.NamedNode;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.cluster.CamelClusterService;
-import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spi.RoutePolicy;
 import org.apache.camel.spi.RoutePolicyFactory;
 import org.apache.camel.util.ObjectHelper;
@@ -56,7 +56,7 @@ public class ClusteredRoutePolicyFactory implements RoutePolicyFactory {
     }
 
     @Override
-    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition route) {
+    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode route) {
         try {
             return clusterService != null
                 ? ClusteredRoutePolicy.forNamespace(clusterService, namespace)
diff --git a/camel-core/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckRegistry.java b/camel-core/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckRegistry.java
index 58e63e0..f9ea05c 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckRegistry.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckRegistry.java
@@ -43,10 +43,8 @@ public class DefaultHealthCheckRegistry implements HealthCheckRegistry {
 
     public DefaultHealthCheckRegistry(CamelContext camelContext) {
         this.checks = new CopyOnWriteArraySet<>();
-
         this.repositories = new CopyOnWriteArraySet<>();
         this.repositories.add(new RegistryRepository());
-        this.repositories.addAll(repositories);
 
         setCamelContext(camelContext);
     }
diff --git a/camel-core/src/main/java/org/apache/camel/impl/health/RouteHealthCheck.java b/camel-core/src/main/java/org/apache/camel/impl/health/RouteHealthCheck.java
index 8d7a198..a25e1a1 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/health/RouteHealthCheck.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/health/RouteHealthCheck.java
@@ -28,6 +28,7 @@ import org.apache.camel.Route;
 import org.apache.camel.ServiceStatus;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.health.HealthCheckResultBuilder;
+import org.apache.camel.management.ManagedCamelContext;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -58,7 +59,7 @@ public class RouteHealthCheck extends AbstractHealthCheck {
     protected void doCall(HealthCheckResultBuilder builder, Map<String, Object> options) {
         if (route.getId() != null) {
             final CamelContext context = route.getRouteContext().getCamelContext();
-            final ServiceStatus status = context.getRouteStatus(route.getId());
+            final ServiceStatus status = context.getRouteController().getRouteStatus(route.getId());
 
             builder.detail("route.id", route.getId());
             builder.detail("route.status", status.name());
@@ -87,7 +88,7 @@ public class RouteHealthCheck extends AbstractHealthCheck {
             if (builder.state() != State.DOWN) {
                 // If JMX is enabled, use the Managed MBeans to determine route
                 // health based on performance counters.
-                ManagedRouteMBean managedRoute = context.getManagedRoute(route.getId(), ManagedRouteMBean.class);
+                ManagedRouteMBean managedRoute = context.adapt(ManagedCamelContext.class).getManagedRoute(route.getId(), ManagedRouteMBean.class);
 
                 if (managedRoute != null && !evaluators.isEmpty()) {
                     Map<String, Object> details = new HashMap<>();
diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
index 3fbe3c8..5ff6da4 100644
--- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
@@ -756,7 +756,7 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
         // Each processor in a route will have its own performance counter.
         // These performance counter will be embedded to InstrumentationProcessor
         // and wrap the appropriate processor by InstrumentationInterceptStrategy.
-        RouteDefinition route = routeContext.getRoute();
+        RouteDefinition route = (RouteDefinition) routeContext.getRoute();
 
         // register performance counters for all processors and its children
         for (ProcessorDefinition<?> processor : route.getOutputs()) {
diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
index 0b0a3c8..351766a 100644
--- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
@@ -25,6 +25,7 @@ import org.apache.camel.Consumer;
 import org.apache.camel.DelegateProcessor;
 import org.apache.camel.Endpoint;
 import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.Route;
@@ -281,9 +282,11 @@ public class DefaultManagementObjectStrategy implements ManagementObjectStrategy
 
     @SuppressWarnings({"deprecation", "unchecked"})
     public Object getManagedObjectForProcessor(CamelContext context, Processor processor,
-                                               ProcessorDefinition<?> definition, Route route) {
+                                               NamedNode node, Route route) {
         ManagedProcessor answer = null;
 
+        ProcessorDefinition<?> definition = (ProcessorDefinition<?>) node;
+
         if (definition instanceof RecipientListDefinition) {
             // special for RecipientListDefinition, as the processor is wrapped in a pipeline as last
             Pipeline pipeline = (Pipeline) processor;
diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementStrategy.java b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementStrategy.java
index 9dddbc8..e92703f 100644
--- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementStrategy.java
@@ -22,6 +22,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
+import org.apache.camel.NamedNode;
 import org.apache.camel.management.event.DefaultEventFactory;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.EventFactory;
@@ -120,7 +121,7 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
         this.managementAgent = managementAgent;
     }
 
-    public boolean manageProcessor(ProcessorDefinition<?> definition) {
+    public boolean manageProcessor(NamedNode definition) {
         return false;
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/management/InstrumentationInterceptStrategy.java b/camel-core/src/main/java/org/apache/camel/management/InstrumentationInterceptStrategy.java
index 8dcc7d1..a1712a1 100644
--- a/camel-core/src/main/java/org/apache/camel/management/InstrumentationInterceptStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/InstrumentationInterceptStrategy.java
@@ -19,6 +19,7 @@ package org.apache.camel.management;
 import java.util.Map;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.api.management.PerformanceCounter;
 import org.apache.camel.management.mbean.ManagedPerformanceCounter;
@@ -58,7 +59,7 @@ public class InstrumentationInterceptStrategy implements InterceptStrategy {
         return counter;
     }
 
-    public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition,
+    public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition,
                                                  Processor target, Processor nextTarget) throws Exception {
         // no longer in use as we have optimised to avoid wrapping unless needed
         return target;
diff --git a/camel-core/src/main/java/org/apache/camel/management/ManagedCamelContext.java b/camel-core/src/main/java/org/apache/camel/management/ManagedCamelContext.java
new file mode 100644
index 0000000..4de1dd8
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/management/ManagedCamelContext.java
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.management;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.api.management.mbean.ManagedCamelContextMBean;
+import org.apache.camel.api.management.mbean.ManagedProcessorMBean;
+import org.apache.camel.api.management.mbean.ManagedRouteMBean;
+
+public interface ManagedCamelContext extends CamelContext {
+    /**
+     * Gets the managed processor client api from any of the routes which with the given id
+     *
+     * @param id id of the processor
+     * @param type the managed processor type from the {@link org.apache.camel.api.management.mbean} package.
+     * @return the processor or <tt>null</tt> if not found
+     * @throws IllegalArgumentException if the type is not compliant
+     */
+    <T extends ManagedProcessorMBean> T getManagedProcessor(String id, Class<T> type);
+
+    /**
+     * Gets the managed route client api with the given route id
+     *
+     * @param routeId id of the route
+     * @param type the managed route type from the {@link org.apache.camel.api.management.mbean} package.
+     * @return the route or <tt>null</tt> if not found
+     * @throws IllegalArgumentException if the type is not compliant
+     */
+    <T extends ManagedRouteMBean> T getManagedRoute(String routeId, Class<T> type);
+
+    /**
+     * Gets the managed Camel CamelContext client api
+     */
+    ManagedCamelContextMBean getManagedCamelContext();
+
+}
diff --git a/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java b/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
index e1c7f79..97686df 100644
--- a/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
@@ -20,6 +20,7 @@ import javax.management.ObjectName;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
+import org.apache.camel.NamedNode;
 import org.apache.camel.management.mbean.ManagedBacklogDebugger;
 import org.apache.camel.management.mbean.ManagedBacklogTracer;
 import org.apache.camel.management.mbean.ManagedCamelContext;
@@ -173,7 +174,7 @@ public class ManagedManagementStrategy extends DefaultManagementStrategy {
     }
 
     @Override
-    public boolean manageProcessor(ProcessorDefinition<?> definition) {
+    public boolean manageProcessor(NamedNode definition) {
         return true;
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/RouteCoverageXmlParser.java b/camel-core/src/main/java/org/apache/camel/management/mbean/RouteCoverageXmlParser.java
index 62bc649..654b063 100644
--- a/camel-core/src/main/java/org/apache/camel/management/mbean/RouteCoverageXmlParser.java
+++ b/camel-core/src/main/java/org/apache/camel/management/mbean/RouteCoverageXmlParser.java
@@ -36,6 +36,7 @@ import org.xml.sax.helpers.DefaultHandler;
 import org.apache.camel.CamelContext;
 import org.apache.camel.api.management.mbean.ManagedProcessorMBean;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
+import org.apache.camel.management.ManagedCamelContext;
 
 /**
  * An XML parser that uses SAX to enrich route stats in the route dump.
@@ -90,7 +91,7 @@ public final class RouteCoverageXmlParser {
                 if (id != null) {
                     try {
                         if ("route".equals(qName)) {
-                            ManagedRouteMBean route = camelContext.getManagedRoute(id, ManagedRouteMBean.class);
+                            ManagedRouteMBean route = camelContext.adapt(ManagedCamelContext.class).getManagedRoute(id, ManagedRouteMBean.class);
                             if (route != null) {
                                 long total = route.getExchangesTotal();
                                 el.setAttribute("exchangesTotal", "" + total);
@@ -102,7 +103,7 @@ public final class RouteCoverageXmlParser {
                             Element parent = elementStack.peek();
                             if (parent != null) {
                                 String routeId = parent.getAttribute("id");
-                                ManagedRouteMBean route = camelContext.getManagedRoute(routeId, ManagedRouteMBean.class);
+                                ManagedRouteMBean route = camelContext.adapt(ManagedCamelContext.class).getManagedRoute(routeId, ManagedRouteMBean.class);
                                 if (route != null) {
                                     long total = route.getExchangesTotal();
                                     el.setAttribute("exchangesTotal", "" + total);
@@ -113,7 +114,7 @@ public final class RouteCoverageXmlParser {
                                 }
                             }
                         } else {
-                            ManagedProcessorMBean processor = camelContext.getManagedProcessor(id, ManagedProcessorMBean.class);
+                            ManagedProcessorMBean processor = camelContext.adapt(ManagedCamelContext.class).getManagedProcessor(id, ManagedProcessorMBean.class);
                             if (processor != null) {
                                 long total = processor.getExchangesTotal();
                                 el.setAttribute("exchangesTotal", "" + total);
diff --git a/camel-core/src/main/java/org/apache/camel/model/DynamicRouterDefinition.java b/camel-core/src/main/java/org/apache/camel/model/DynamicRouterDefinition.java
index 11d8090..05a29fa 100644
--- a/camel-core/src/main/java/org/apache/camel/model/DynamicRouterDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/DynamicRouterDefinition.java
@@ -91,7 +91,8 @@ public class DynamicRouterDefinition<Type extends ProcessorDefinition<Type>> ext
         }
 
         // and wrap this in an error handler
-        ErrorHandlerFactory builder = routeContext.getRoute().getErrorHandlerBuilder();
+        RouteDefinition route = (RouteDefinition) routeContext.getRoute();
+        ErrorHandlerFactory builder = route.getErrorHandlerBuilder();
         // create error handler (create error handler directly to keep it light weight,
         // instead of using ProcessorDefinition.wrapInErrorHandler)
         AsyncProcessor errorHandler = (AsyncProcessor) builder.createErrorHandler(routeContext, dynamicRouter.newRoutingSlipProcessorForErrorHandler());
diff --git a/camel-core/src/main/java/org/apache/camel/model/InterceptDefinition.java b/camel-core/src/main/java/org/apache/camel/model/InterceptDefinition.java
index 475b9c9..4f1b786 100644
--- a/camel-core/src/main/java/org/apache/camel/model/InterceptDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/InterceptDefinition.java
@@ -25,6 +25,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.processor.Pipeline;
@@ -84,7 +85,7 @@ public class InterceptDefinition extends OutputDefinition<InterceptDefinition> {
         routeContext.getInterceptStrategies().add(new InterceptStrategy() {
             private Processor interceptedTarget;
 
-            public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition,
+            public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition,
                                                          Processor target, Processor nextTarget) throws Exception {
                 // store the target we are intercepting
                 this.interceptedTarget = target;
@@ -107,7 +108,7 @@ public class InterceptDefinition extends OutputDefinition<InterceptDefinition> {
         });
 
         // remove me from the route so I am not invoked in a regular route path
-        routeContext.getRoute().getOutputs().remove(this);
+        ((RouteDefinition) routeContext.getRoute()).getOutputs().remove(this);
         // and return no processor to invoke next from me
         return null;
     }
diff --git a/camel-core/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java b/camel-core/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java
index aa3c113..efe90cb 100644
--- a/camel-core/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java
@@ -120,7 +120,7 @@ public class InterceptSendToEndpointDefinition extends OutputDefinition<Intercep
         // remove the original intercepted route from the outputs as we do not intercept as the regular interceptor
         // instead we use the proxy endpoints producer do the triggering. That is we trigger when someone sends
         // an exchange to the endpoint, see InterceptSendToEndpoint for details.
-        RouteDefinition route = routeContext.getRoute();
+        RouteDefinition route = (RouteDefinition) routeContext.getRoute();
         List<ProcessorDefinition<?>> outputs = route.getOutputs();
         outputs.remove(this);
 
diff --git a/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java b/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
index 123a6cd..906765d 100644
--- a/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
@@ -138,7 +138,8 @@ public class OnCompletionDefinition extends ProcessorDefinition<OnCompletionDefi
             routeContext.setAllowUseOriginalMessage(true);
         }
 
-        String routeId = routeContext.getRoute().idOrCreate(routeContext.getCamelContext().getNodeIdFactory());
+        RouteDefinition route = (RouteDefinition) routeContext.getRoute();
+        String routeId = route.idOrCreate(routeContext.getCamelContext().getNodeIdFactory());
 
         Processor childProcessor = this.createChildProcessor(routeContext, true);
 
diff --git a/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java b/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
index e19b642..21939e1 100644
--- a/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
@@ -215,7 +215,8 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini
             errorHandlers.put(id, errorHandler);
         }
         // lookup the error handler builder
-        ErrorHandlerBuilder builder = (ErrorHandlerBuilder)routeContext.getRoute().getErrorHandlerBuilder();
+        RouteDefinition route = (RouteDefinition) routeContext.getRoute();
+        ErrorHandlerBuilder builder = (ErrorHandlerBuilder) route.getErrorHandlerBuilder();
         // and add this as error handlers
         builder.addErrorHandlers(routeContext, this);
     }
diff --git a/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java b/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
index bf1f76e..a102dbd 100644
--- a/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
@@ -370,7 +370,8 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type>
      * @throws Exception can be thrown if failed to create error handler builder
      */
     protected Processor wrapInErrorHandler(RouteContext routeContext, Processor output) throws Exception {
-        ErrorHandlerFactory builder = routeContext.getRoute().getErrorHandlerBuilder();
+        RouteDefinition route = (RouteDefinition) routeContext.getRoute();
+        ErrorHandlerFactory builder = route.getErrorHandlerBuilder();
         // create error handler
         Processor errorHandler = builder.createErrorHandler(routeContext, output);
 
diff --git a/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java b/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java
index 7c9b1c4..6e01845 100644
--- a/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java
@@ -30,6 +30,7 @@ import javax.xml.namespace.QName;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.spi.ExecutorServiceManager;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.util.CamelContextHelper;
@@ -145,12 +146,12 @@ public final class ProcessorDefinitionHelper {
      * @param node the node
      * @return the route, or <tt>null</tt> if not possible to find
      */
-    public static RouteDefinition getRoute(ProcessorDefinition<?> node) {
+    public static RouteDefinition getRoute(NamedNode node) {
         if (node == null) {
             return null;
         }
 
-        ProcessorDefinition<?> def = node;
+        ProcessorDefinition<?> def = (ProcessorDefinition) node;
         // drill to the top
         while (def != null && def.getParent() != null) {
             def = def.getParent();
@@ -170,7 +171,7 @@ public final class ProcessorDefinitionHelper {
      * @param node the node
      * @return the route id, or <tt>null</tt> if not possible to find
      */
-    public static String getRouteId(ProcessorDefinition<?> node) {
+    public static String getRouteId(NamedNode node) {
         RouteDefinition route = getRoute(node);
         return route != null ? route.getId() : null;
     }
diff --git a/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java b/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java
index 079d24a..c74e264 100644
--- a/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java
@@ -228,7 +228,7 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> {
     }
 
     public RouteDefinition adviceWith(CamelContext camelContext, RouteBuilder builder) throws Exception {
-        return adviceWith((ModelCamelContext)camelContext, builder);
+        return adviceWith(camelContext.adapt(ModelCamelContext.class), builder);
     }
 
     /**
@@ -255,7 +255,6 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> {
      * @throws Exception can be thrown from the route builder
      * @see AdviceWithRouteBuilder
      */
-    @SuppressWarnings("deprecation")
     public RouteDefinition adviceWith(ModelCamelContext camelContext, RouteBuilder builder) throws Exception {
         ObjectHelper.notNull(camelContext, "CamelContext");
         ObjectHelper.notNull(builder, "RouteBuilder");
@@ -303,7 +302,7 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> {
         RouteDefinition merged = routes.route(this);
 
         // add the new merged route
-        camelContext.getRouteDefinitions().add(0, merged);
+        camelContext.addRouteDefinition(merged);
 
         // log the merged route at info level to make it easier to end users to spot any mistakes they may have made
         log.info("AdviceWith route after: {}", merged);
@@ -311,13 +310,6 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> {
         String afterAsXml = ModelHelper.dumpModelAsXml(camelContext, merged);
         log.info("Adviced route before/after as XML:\n{}\n{}", beforeAsXml, afterAsXml);
 
-        // If the camel context is started then we start the route
-        if (camelContext instanceof StatefulService) {
-            StatefulService service = (StatefulService) camelContext;
-            if (service.isStarted()) {
-                camelContext.startRoute(merged);
-            }
-        }
         return merged;
     }
 
@@ -1336,7 +1328,7 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> {
 
         // validate route has output processors
         if (!ProcessorDefinitionHelper.hasOutputs(outputs, true)) {
-            RouteDefinition route = routeContext.getRoute();
+            RouteDefinition route = (RouteDefinition) routeContext.getRoute();
             String at = fromType.toString();
             Exception cause = new IllegalArgumentException("Route " + route.getId() + " has no output processors."
                     + " You need to add outputs to the route such as to(\"log:foo\").");
@@ -1348,7 +1340,7 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> {
             try {
                 output.addRoutes(routeContext, routes);
             } catch (Exception e) {
-                RouteDefinition route = routeContext.getRoute();
+                RouteDefinition route = (RouteDefinition) routeContext.getRoute();
                 throw new FailedToCreateRouteException(route.getId(), route.toString(), output.toString(), e);
             }
         }
diff --git a/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java b/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java
index 4779360..d5caaef 100644
--- a/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/RoutingSlipDefinition.java
@@ -101,7 +101,8 @@ public class RoutingSlipDefinition<Type extends ProcessorDefinition<Type>> exten
         }
 
         // and wrap this in an error handler
-        ErrorHandlerFactory builder = routeContext.getRoute().getErrorHandlerBuilder();
+        RouteDefinition route = (RouteDefinition) routeContext.getRoute();
+        ErrorHandlerFactory builder = route.getErrorHandlerBuilder();
         // create error handler (create error handler directly to keep it light weight,
         // instead of using ProcessorDefinition.wrapInErrorHandler)
         AsyncProcessor errorHandler = (AsyncProcessor) builder.createErrorHandler(routeContext, routingSlip.newRoutingSlipProcessorForErrorHandler());
diff --git a/camel-core/src/main/java/org/apache/camel/model/SortDefinition.java b/camel-core/src/main/java/org/apache/camel/model/SortDefinition.java
index 4e4c352..4351609 100644
--- a/camel-core/src/main/java/org/apache/camel/model/SortDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/SortDefinition.java
@@ -83,11 +83,7 @@ public class SortDefinition<T> extends NoOutputExpressionNode {
 
         // if no comparator then default on to string representation
         if (comparator == null) {
-            comparator = new Comparator<T>() {
-                public int compare(T o1, T o2) {
-                    return ObjectHelper.compare(o1, o2);
-                }
-            };
+            comparator = (Comparator<T>) ObjectHelper::compare;
         }
 
         // if no expression provided then default to body expression
diff --git a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallDefinition.java b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallDefinition.java
index 34790a3..d4ea3a7 100644
--- a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallDefinition.java
@@ -55,6 +55,7 @@ import org.apache.camel.spi.RouteContext;
 import org.apache.camel.util.CamelContextHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.function.Suppliers;
+import org.apache.camel.util.function.ThrowingHelper;
 
 import static org.apache.camel.util.CamelContextHelper.findByType;
 import static org.apache.camel.util.CamelContextHelper.lookup;
@@ -814,8 +815,8 @@ public class ServiceCallDefinition extends NoOutputDefinition<ServiceCallDefinit
         // Service name is mandatory
         ObjectHelper.notNull(name, "Service name");
 
-        endpointScheme = ObjectHelper.applyIfNotEmpty(endpointScheme, camelContext::resolvePropertyPlaceholders, () -> ServiceCallDefinitionConstants.DEFAULT_COMPONENT);
-        endpointUri = ObjectHelper.applyIfNotEmpty(endpointUri, camelContext::resolvePropertyPlaceholders, () -> null);
+        endpointScheme = ThrowingHelper.applyIfNotEmpty(endpointScheme, camelContext::resolvePropertyPlaceholders, () -> ServiceCallDefinitionConstants.DEFAULT_COMPONENT);
+        endpointUri = ThrowingHelper.applyIfNotEmpty(endpointUri, camelContext::resolvePropertyPlaceholders, () -> null);
 
         return new DefaultServiceCallProcessor(
             camelContext,
diff --git a/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java
index 3746d4f..b1da7ef 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java
@@ -36,6 +36,7 @@ import org.apache.camel.management.DelegatePerformanceCounter;
 import org.apache.camel.management.mbean.ManagedPerformanceCounter;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.ProcessorDefinitionHelper;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.processor.interceptor.BacklogDebugger;
 import org.apache.camel.processor.interceptor.BacklogTracer;
 import org.apache.camel.processor.interceptor.DefaultBacklogTracerEventMessage;
@@ -607,7 +608,8 @@ public class CamelInternalProcessor extends DelegateAsyncProcessor {
         public UnitOfWorkProcessorAdvice(RouteContext routeContext) {
             this.routeContext = routeContext;
             if (routeContext != null) {
-                this.routeId = routeContext.getRoute().idOrCreate(routeContext.getCamelContext().getNodeIdFactory());
+                RouteDefinition definition = (RouteDefinition) routeContext.getRoute();
+                this.routeId = definition.idOrCreate(routeContext.getCamelContext().getNodeIdFactory());
             }
         }
 
@@ -617,7 +619,8 @@ public class CamelInternalProcessor extends DelegateAsyncProcessor {
             // from this unit of work
             if (routeContext != null && exchange.getFromRouteId() == null) {
                 if (routeId == null) {
-                    routeId = routeContext.getRoute().idOrCreate(routeContext.getCamelContext().getNodeIdFactory());
+                    RouteDefinition definition = (RouteDefinition) routeContext.getRoute();
+                    routeId = definition.idOrCreate(routeContext.getCamelContext().getNodeIdFactory());
                 }
                 exchange.setFromRouteId(routeId);
             }
diff --git a/camel-core/src/main/java/org/apache/camel/processor/MulticastProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/MulticastProcessor.java
index 0f9a2d2..c3f5dd0 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/MulticastProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/MulticastProcessor.java
@@ -48,6 +48,7 @@ import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.StreamCache;
 import org.apache.camel.Traceable;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.processor.aggregate.AggregationStrategy;
 import org.apache.camel.processor.aggregate.CompletionAwareAggregationStrategy;
 import org.apache.camel.processor.aggregate.DelegateAggregationStrategy;
@@ -1068,7 +1069,8 @@ public class MulticastProcessor extends ServiceSupport implements AsyncProcessor
             }
 
             LOG.trace("Creating error handler for: {}", processor);
-            ErrorHandlerFactory builder = routeContext.getRoute().getErrorHandlerBuilder();
+            RouteDefinition route = (RouteDefinition) routeContext.getRoute();
+            ErrorHandlerFactory builder = route.getErrorHandlerBuilder();
             // create error handler (create error handler directly to keep it light weight,
             // instead of using ProcessorDefinition.wrapInErrorHandler)
             try {
diff --git a/camel-core/src/main/java/org/apache/camel/processor/Resequencer.java b/camel-core/src/main/java/org/apache/camel/processor/Resequencer.java
index 2188777..f8d10aa 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/Resequencer.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/Resequencer.java
@@ -258,29 +258,14 @@ public class Resequencer extends ServiceSupport implements AsyncProcessor, Navig
         Comparator<? super Exchange> answer = comparator;
 
         if (reverse) {
-            answer = new Comparator<Exchange>() {
-                public int compare(Exchange o1, Exchange o2) {
-                    int answer = comparator.compare(o1, o2);
-                    // reverse it
-                    return answer * -1;
-                }
-            };
+            answer = comparator.reversed();
         }
 
         // if we allow duplicates then we need to cater for that in the comparator
-        final Comparator<? super Exchange> forAllowDuplicates = answer;
         if (allowDuplicates) {
-            answer = new Comparator<Exchange>() {
-                public int compare(Exchange o1, Exchange o2) {
-                    int answer = forAllowDuplicates.compare(o1, o2);
-                    if (answer == 0) {
-                        // they are equal but we should allow duplicates so say that o2 is higher
-                        // so it will come next
-                        return 1;
-                    }
-                    return answer;
-                }
-            };
+            // they are equal but we should allow duplicates so say that o2 is higher
+            // so it will come next
+            answer = answer.thenComparing((o1, o2) -> 1);
         }
 
         return new TreeSet<>(answer);
diff --git a/camel-core/src/main/java/org/apache/camel/processor/exceptionpolicy/DefaultExceptionPolicyStrategy.java b/camel-core/src/main/java/org/apache/camel/processor/exceptionpolicy/DefaultExceptionPolicyStrategy.java
index c9d8781..5d923e3 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/exceptionpolicy/DefaultExceptionPolicyStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/exceptionpolicy/DefaultExceptionPolicyStrategy.java
@@ -135,7 +135,7 @@ public class DefaultExceptionPolicyStrategy implements ExceptionPolicyStrategy {
             // if OnException is route scoped then the current route (Exchange) must match
             // so we will not pick an OnException from another route
             if (exchange != null && exchange.getUnitOfWork() != null && type.isRouteScoped()) {
-                RouteDefinition route = exchange.getUnitOfWork().getRouteContext() != null ? exchange.getUnitOfWork().getRouteContext().getRoute() : null;
+                RouteDefinition route = exchange.getUnitOfWork().getRouteContext() != null ? (RouteDefinition) exchange.getUnitOfWork().getRouteContext().getRoute() : null;
                 RouteDefinition typeRoute = ProcessorDefinitionHelper.getRoute(type);
                 if (route != null && typeRoute != null && route != typeRoute) {
                     if (LOG.isTraceEnabled()) {
diff --git a/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogDebugger.java b/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogDebugger.java
index 7cafc39..5fb2efa 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogDebugger.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogDebugger.java
@@ -31,6 +31,7 @@ import java.util.concurrent.atomic.AtomicLong;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.LoggingLevel;
+import org.apache.camel.NamedNode;
 import org.apache.camel.NoTypeConversionAvailableException;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
@@ -116,7 +117,7 @@ public class BacklogDebugger extends ServiceSupport implements InterceptStrategy
 
     @Override
     @Deprecated
-    public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition, Processor target, Processor nextTarget) throws Exception {
+    public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition, Processor target, Processor nextTarget) throws Exception {
         throw new UnsupportedOperationException("Deprecated");
     }
 
@@ -544,7 +545,7 @@ public class BacklogDebugger extends ServiceSupport implements InterceptStrategy
         }
 
         @Override
-        public void beforeProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+        public void beforeProcess(Exchange exchange, Processor processor, NamedNode definition) {
             // store a copy of the message so we can see that from the debugger
             Date timestamp = new Date();
             String toNode = definition.getId();
@@ -575,7 +576,7 @@ public class BacklogDebugger extends ServiceSupport implements InterceptStrategy
         }
 
         @Override
-        public boolean matchProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+        public boolean matchProcess(Exchange exchange, Processor processor, NamedNode definition) {
             // must match node
             if (!nodeId.equals(definition.getId())) {
                 return false;
@@ -604,7 +605,7 @@ public class BacklogDebugger extends ServiceSupport implements InterceptStrategy
     private final class StepBreakpoint extends BreakpointSupport implements Condition {
 
         @Override
-        public void beforeProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+        public void beforeProcess(Exchange exchange, Processor processor, NamedNode definition) {
             // store a copy of the message so we can see that from the debugger
             Date timestamp = new Date();
             String toNode = definition.getId();
@@ -635,7 +636,7 @@ public class BacklogDebugger extends ServiceSupport implements InterceptStrategy
         }
 
         @Override
-        public boolean matchProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+        public boolean matchProcess(Exchange exchange, Processor processor, NamedNode definition) {
             return true;
         }
 
@@ -645,7 +646,7 @@ public class BacklogDebugger extends ServiceSupport implements InterceptStrategy
         }
 
         @Override
-        public void onEvent(Exchange exchange, EventObject event, ProcessorDefinition<?> definition) {
+        public void onEvent(Exchange exchange, EventObject event, NamedNode definition) {
             // when the exchange is complete, we need to turn off single step mode if we were debug stepping the exchange
             if (event instanceof ExchangeCompletedEvent) {
                 String completedId = ((ExchangeCompletedEvent) event).getExchange().getExchangeId();
diff --git a/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java b/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java
index 72d3964..a308493 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java
@@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.api.management.mbean.BacklogTracerEventMessage;
@@ -71,7 +72,7 @@ public final class BacklogTracer extends ServiceSupport implements InterceptStra
 
     @Override
     @Deprecated
-    public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition, Processor target, Processor nextTarget) throws Exception {
+    public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition, Processor target, Processor nextTarget) throws Exception {
         throw new UnsupportedOperationException("Deprecated");
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/processor/interceptor/Debug.java b/camel-core/src/main/java/org/apache/camel/processor/interceptor/Debug.java
index c4750b2..dae546d 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/interceptor/Debug.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/interceptor/Debug.java
@@ -19,8 +19,8 @@ package org.apache.camel.processor.interceptor;
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.processor.DelegateAsyncProcessor;
 import org.apache.camel.spi.Debugger;
 import org.apache.camel.spi.InterceptStrategy;
@@ -39,7 +39,7 @@ public class Debug implements InterceptStrategy {
         this.debugger = debugger;
     }
 
-    public Processor wrapProcessorInInterceptors(final CamelContext context, final ProcessorDefinition<?> definition,
+    public Processor wrapProcessorInInterceptors(final CamelContext context, final NamedNode definition,
                                                  final Processor target, final Processor nextTarget) throws Exception {
         return new DelegateAsyncProcessor(target) {
             @Override
diff --git a/camel-core/src/main/java/org/apache/camel/processor/interceptor/HandleFault.java b/camel-core/src/main/java/org/apache/camel/processor/interceptor/HandleFault.java
index 19ee9a1..a07bb8e 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/interceptor/HandleFault.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/interceptor/HandleFault.java
@@ -19,8 +19,8 @@ package org.apache.camel.processor.interceptor;
 import java.util.List;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.InterceptStrategy;
 
 /**
@@ -28,8 +28,8 @@ import org.apache.camel.spi.InterceptStrategy;
  */
 public final class HandleFault implements InterceptStrategy {
 
-    public Processor wrapProcessorInInterceptors(CamelContext context, 
-            ProcessorDefinition<?> definition, Processor target, Processor nextTarget) throws Exception {
+    public Processor wrapProcessorInInterceptors(CamelContext context,
+                                                 NamedNode definition, Processor target, Processor nextTarget) throws Exception {
 
         return new HandleFaultInterceptor(target);
     }
diff --git a/camel-core/src/main/java/org/apache/camel/spi/Breakpoint.java b/camel-core/src/main/java/org/apache/camel/spi/Breakpoint.java
index 0fdac64..d39efbd 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/Breakpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/Breakpoint.java
@@ -19,8 +19,8 @@ package org.apache.camel.spi;
 import java.util.EventObject;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 
 /**
  * {@link org.apache.camel.spi.Breakpoint} are used by the {@link org.apache.camel.spi.Debugger} API.
@@ -64,32 +64,30 @@ public interface Breakpoint {
 
     /**
      * Callback invoked when the breakpoint was hit and the {@link Exchange} is about to be processed (before).
-     *
-     * @param exchange   the {@link Exchange}
+     *  @param exchange   the {@link Exchange}
      * @param processor  the {@link Processor} about to be processed
-     * @param definition the {@link org.apache.camel.model.ProcessorDefinition} definition of the processor
+     * @param definition the {@link NamedNode} definition of the processor
      */
-    void beforeProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition);
+    void beforeProcess(Exchange exchange, Processor processor, NamedNode definition);
 
     /**
      * Callback invoked when the breakpoint was hit and the {@link Exchange} has been processed (after).
-     *
-     * @param exchange   the {@link Exchange}
+     *  @param exchange   the {@link Exchange}
      * @param processor  the {@link Processor} which was processed
-     * @param definition the {@link org.apache.camel.model.ProcessorDefinition} definition of the processor
+     * @param definition the {@link NamedNode} definition of the processor
      * @param timeTaken  time in millis it took to process the {@link Exchange} - time spend in breakpoint callbacks may affect this time
      */
-    void afterProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition, long timeTaken);
+    void afterProcess(Exchange exchange, Processor processor, NamedNode definition, long timeTaken);
 
     /**
      * Callback invoked when the breakpoint was hit and any of the {@link Exchange} {@link EventObject event}s occurred.
      *
      * @param exchange   the {@link Exchange}
      * @param event      the event (instance of {@link org.apache.camel.management.event.AbstractExchangeEvent}
-     * @param definition the {@link org.apache.camel.model.ProcessorDefinition} definition of the last processor executed,
+     * @param definition the {@link NamedNode} definition of the last processor executed,
      *                   may be <tt>null</tt> if not possible to resolve from tracing
      * @see org.apache.camel.management.event.AbstractExchangeEvent
      */
-    void onEvent(Exchange exchange, EventObject event, ProcessorDefinition<?> definition);
+    void onEvent(Exchange exchange, EventObject event, NamedNode definition);
 
 }
diff --git a/camel-core/src/main/java/org/apache/camel/spi/CamelContextTracker.java b/camel-core/src/main/java/org/apache/camel/spi/CamelContextTracker.java
index 70ae227..429b155 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/CamelContextTracker.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/CamelContextTracker.java
@@ -17,19 +17,32 @@
 package org.apache.camel.spi;
 
 import java.io.Closeable;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.function.Predicate;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.impl.CamelContextTrackerRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * A {@link CamelContext} creation tracker.
  */
 public class CamelContextTracker implements Closeable {
 
-    public interface Filter {
+    private static final Logger LOG = LoggerFactory.getLogger(CamelContextTracker.class);
+
+    private static final List<CamelContextTracker> TRACKERS = new CopyOnWriteArrayList<>();
+
+    @FunctionalInterface
+    public interface Filter extends Predicate<CamelContext> {
 
         boolean accept(CamelContext camelContext);
 
+        @Override
+        default boolean test(CamelContext camelContext) {
+            return accept(camelContext);
+        }
     }
 
     private final Filter filter;
@@ -61,10 +74,22 @@ public class CamelContextTracker implements Closeable {
     }
 
     public final void open() {
-        CamelContextTrackerRegistry.INSTANCE.addTracker(this);
+        TRACKERS.add(this);
     }
 
     public final void close() {
-        CamelContextTrackerRegistry.INSTANCE.removeTracker(this);
+        TRACKERS.remove(this);
+    }
+
+    public static synchronized void notifyContextCreated(CamelContext camelContext) {
+        for (CamelContextTracker tracker : TRACKERS) {
+            try {
+                if (tracker.accept(camelContext)) {
+                    tracker.contextCreated(camelContext);
+                }
+            } catch (Exception e) {
+                LOG.warn("Error calling CamelContext tracker. This exception is ignored.", e);
+            }
+        }
     }
 }
\ No newline at end of file
diff --git a/camel-core/src/main/java/org/apache/camel/spi/Condition.java b/camel-core/src/main/java/org/apache/camel/spi/Condition.java
index 7564b81..9d29f5c 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/Condition.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/Condition.java
@@ -19,8 +19,8 @@ package org.apache.camel.spi;
 import java.util.EventObject;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 
 /**
  * A condition to define when a given {@link Exchange} matches when is being routed.
@@ -40,7 +40,7 @@ public interface Condition {
      * @param definition the present location in the route where the {@link Exchange} is located at
      * @return <tt>true</tt> to match, <tt>false</tt> otherwise
      */
-    boolean matchProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition);
+    boolean matchProcess(Exchange exchange, Processor processor, NamedNode definition);
 
     /**
      * Does the condition match
diff --git a/camel-core/src/main/java/org/apache/camel/spi/Debugger.java b/camel-core/src/main/java/org/apache/camel/spi/Debugger.java
index 6c8f1eb..79b523d 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/Debugger.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/Debugger.java
@@ -21,9 +21,9 @@ import java.util.List;
 
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.Service;
-import org.apache.camel.model.ProcessorDefinition;
 
 /**
  * A debugger which allows tooling to attach breakpoints which is is being invoked
@@ -119,7 +119,7 @@ public interface Debugger extends Service, CamelContextAware {
      * @param definition the definition of the processor
      * @return <tt>true</tt> if any breakpoint was hit, <tt>false</tt> if not breakpoint was hit
      */
-    boolean beforeProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition);
+    boolean beforeProcess(Exchange exchange, Processor processor, NamedNode definition);
 
     /**
      * Callback invoked when an {@link Exchange} has been processed which allows implementators
@@ -131,7 +131,7 @@ public interface Debugger extends Service, CamelContextAware {
      * @param timeTaken  time in millis it took to process the {@link Exchange} - time spend in breakpoint callbacks may affect this time
      * @return <tt>true</tt> if any breakpoint was hit, <tt>false</tt> if not breakpoint was hit
      */
-    boolean afterProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition, long timeTaken);
+    boolean afterProcess(Exchange exchange, Processor processor, NamedNode definition, long timeTaken);
 
     /**
      * Callback invoked when an {@link Exchange} is being processed which allows implementators
diff --git a/camel-core/src/main/java/org/apache/camel/spi/InterceptStrategy.java b/camel-core/src/main/java/org/apache/camel/spi/InterceptStrategy.java
index b8fdffe..0b8e2f2 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/InterceptStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/InterceptStrategy.java
@@ -17,8 +17,8 @@
 package org.apache.camel.spi;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 
 /**
  * The purpose of this interface is to allow an implementation to wrap
@@ -42,7 +42,7 @@ public interface InterceptStrategy {
 
     /**
      * This method is invoked by
-     * {@link ProcessorDefinition#wrapProcessor(RouteContext, Processor)}
+     * {@link org.apache.camel.model.ProcessorDefinition#wrapProcessor(RouteContext, Processor)}
      * to give the implementor an opportunity to wrap the target processor
      * in a route.
      * <p/>
@@ -56,6 +56,6 @@ public interface InterceptStrategy {
      * @return processor    wrapped with an interceptor or not wrapped.
      * @throws Exception can be thrown
      */
-    Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition, 
+    Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition,
                                           Processor target, Processor nextTarget) throws Exception;
 }
diff --git a/camel-core/src/main/java/org/apache/camel/spi/LogListener.java b/camel-core/src/main/java/org/apache/camel/spi/LogListener.java
index 4d8bf9e..620276b 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/LogListener.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/LogListener.java
@@ -18,21 +18,18 @@ package org.apache.camel.spi;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.LoggingLevel;
-import org.apache.camel.processor.CamelLogProcessor;
-import org.apache.camel.processor.LogProcessor;
 import org.apache.camel.util.CamelLogger;
-import org.slf4j.Marker;
 
 /**
- * An event listener SPI for logging. Listeners are registered into {@link LogProcessor} and
- * {@link CamelLogProcessor} so that the logging events are delivered for both of Log Component and Log EIP.
+ * An event listener SPI for logging. Listeners are registered into {@link org.apache.camel.processor.LogProcessor} and
+ * {@link org.apache.camel.processor.CamelLogProcessor} so that the logging events are delivered for both of Log Component and Log EIP.
  * 
  */
 public interface LogListener {
 
     /**
      * Invoked right before Log component or Log EIP logs.
-     * Note that {@link CamelLogger} holds the {@link LoggingLevel} and {@link Marker}.
+     * Note that {@link CamelLogger} holds the {@link LoggingLevel} and {@link org.slf4j.Marker}.
      * The listener can check {@link CamelLogger#getLevel()} to see in which log level
      * this is going to be logged.
      * 
diff --git a/camel-core/src/main/java/org/apache/camel/spi/ManagementObjectStrategy.java b/camel-core/src/main/java/org/apache/camel/spi/ManagementObjectStrategy.java
index 1c6eb6b..4868818 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/ManagementObjectStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/ManagementObjectStrategy.java
@@ -23,12 +23,12 @@ import org.apache.camel.Component;
 import org.apache.camel.Consumer;
 import org.apache.camel.Endpoint;
 import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.Route;
 import org.apache.camel.Service;
 import org.apache.camel.cluster.CamelClusterService;
-import org.apache.camel.model.ProcessorDefinition;
 
 /**
  * Strategy for creating the managed object for the various beans Camel register for management.
@@ -57,7 +57,7 @@ public interface ManagementObjectStrategy {
     Object getManagedObjectForProducer(CamelContext context, Producer producer);
 
     Object getManagedObjectForProcessor(CamelContext context, Processor processor,
-                                        ProcessorDefinition<?> definition, Route route);
+                                        NamedNode definition, Route route);
 
     Object getManagedObjectForService(CamelContext context, Service service);
 
diff --git a/camel-core/src/main/java/org/apache/camel/spi/ManagementStrategy.java b/camel-core/src/main/java/org/apache/camel/spi/ManagementStrategy.java
index 8028531..d723de8 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/ManagementStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/ManagementStrategy.java
@@ -19,9 +19,8 @@ package org.apache.camel.spi;
 import java.util.EventObject;
 import java.util.List;
 
-import org.apache.camel.ManagementStatisticsLevel;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Service;
-import org.apache.camel.model.ProcessorDefinition;
 
 /**
  * Strategy for management.
@@ -199,6 +198,6 @@ public interface ManagementStrategy extends Service {
      * @param definition definition of the processor
      * @return <tt>true</tt> to manage it
      */
-    boolean manageProcessor(ProcessorDefinition<?> definition);
+    boolean manageProcessor(NamedNode definition);
 
 }
diff --git a/camel-core/src/main/java/org/apache/camel/spi/Policy.java b/camel-core/src/main/java/org/apache/camel/spi/Policy.java
index aa806f6..b2fcd0c 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/Policy.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/Policy.java
@@ -16,8 +16,8 @@
  */
 package org.apache.camel.spi;
 
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 
 /**
  * A strategy capable of applying interceptors to a processor.
@@ -41,12 +41,12 @@ public interface Policy {
      * Hook invoked before the wrap.
      * <p/>
      * This allows you to do any custom logic before the processor is wrapped. For example to
-     * manipulate the {@link org.apache.camel.model.ProcessorDefinition definiton}
+     * manipulate the {@link org.apache.camel.model.ProcessorDefinition definiton}.
      *
      * @param routeContext   the route context
      * @param definition     the processor definition
      */
-    void beforeWrap(RouteContext routeContext, ProcessorDefinition<?> definition);
+    void beforeWrap(RouteContext routeContext, NamedNode definition);
 
     /**
      * Wraps any applicable interceptors around the given processor.
diff --git a/camel-core/src/main/java/org/apache/camel/spi/ProcessorFactory.java b/camel-core/src/main/java/org/apache/camel/spi/ProcessorFactory.java
index 2639e3e..d32f03f 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/ProcessorFactory.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/ProcessorFactory.java
@@ -16,8 +16,8 @@
  */
 package org.apache.camel.spi;
 
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 
 /**
  * A factory to create {@link Processor} based on the {@link org.apache.camel.model.ProcessorDefinition definition}.
@@ -46,7 +46,7 @@ public interface ProcessorFactory {
      * @return the created processor, or <tt>null</tt> to let the default implementation in Camel create the processor.
      * @throws Exception can be thrown if error creating the processor
      */
-    Processor createChildProcessor(RouteContext routeContext, ProcessorDefinition<?> definition, boolean mandatory) throws Exception;
+    Processor createChildProcessor(RouteContext routeContext, NamedNode definition, boolean mandatory) throws Exception;
 
     /**
      * Creates the processor.
@@ -56,6 +56,6 @@ public interface ProcessorFactory {
      * @return the created processor, or <tt>null</tt> to let the default implementation in Camel create the processor.
      * @throws Exception can be thrown if error creating the processor
      */
-    Processor createProcessor(RouteContext routeContext, ProcessorDefinition<?> definition) throws Exception;
+    Processor createProcessor(RouteContext routeContext, NamedNode definition) throws Exception;
 
 }
diff --git a/camel-core/src/main/java/org/apache/camel/spi/RouteContext.java b/camel-core/src/main/java/org/apache/camel/spi/RouteContext.java
index a8cad9c..119cd48 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/RouteContext.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/RouteContext.java
@@ -23,11 +23,9 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.EndpointAware;
 import org.apache.camel.Experimental;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.RuntimeConfiguration;
-import org.apache.camel.model.FromDefinition;
-import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.RouteDefinition;
 
 /**
  * The context used to activate new routing rules
@@ -41,14 +39,14 @@ public interface RouteContext extends RuntimeConfiguration, EndpointAware {
      *
      * @return the from type
      */
-    FromDefinition getFrom();
+    NamedNode getFrom();
 
     /**
      * Get the route type
      *
      * @return the route type
      */
-    RouteDefinition getRoute();
+    NamedNode getRoute();
 
     /**
      * Gets the camel context
@@ -152,7 +150,7 @@ public interface RouteContext extends RuntimeConfiguration, EndpointAware {
     InterceptStrategy getManagedInterceptStrategy();
 
     /**
-     * If this flag is true, {@link ProcessorDefinition#addRoutes(RouteContext, java.util.Collection)}
+     * If this flag is true, {@link org.apache.camel.model.ProcessorDefinition#addRoutes(RouteContext, java.util.Collection)}
      * will not add processor to addEventDrivenProcessor to the RouteContext and it
      * will prevent from adding an EventDrivenRoute.
      *
@@ -191,7 +189,7 @@ public interface RouteContext extends RuntimeConfiguration, EndpointAware {
      * @param node the current node
      * @return the current count
      */
-    int getAndIncrement(ProcessorDefinition<?> node);
+    int getAndIncrement(NamedNode node);
 
     /**
      * Gets the last error.
diff --git a/camel-core/src/main/java/org/apache/camel/spi/RouteController.java b/camel-core/src/main/java/org/apache/camel/spi/RouteController.java
index f6f03e7..5cb8600 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/RouteController.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/RouteController.java
@@ -19,16 +19,17 @@ package org.apache.camel.spi;
 import java.util.Collection;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Experimental;
 import org.apache.camel.Route;
 import org.apache.camel.Service;
 import org.apache.camel.ServiceStatus;
+import org.apache.camel.StaticService;
 
 // TODO: Add javadoc
 
-@Experimental
-public interface RouteController extends CamelContextAware, Service {
+public interface RouteController extends CamelContextAware, StaticService {
 
     /**
      * Return the list of routes controlled by this controller.
@@ -54,20 +55,96 @@ public interface RouteController extends CamelContextAware, Service {
      */
     boolean isStartingRoutes();
 
+    /**
+     * Returns the current status of the given route
+     *
+     * @param routeId the route id
+     * @return the status for the route
+     */
     ServiceStatus getRouteStatus(String routeId);
 
+    /**
+     * Starts the given route if it has been previously stopped
+     *
+     * @param routeId the route id
+     * @throws Exception is thrown if the route could not be started for whatever reason
+     */
     void startRoute(String routeId) throws Exception;
 
+    /**
+     * Stops the given route using {@link org.apache.camel.spi.ShutdownStrategy}.
+     *
+     * @param routeId the route id
+     * @throws Exception is thrown if the route could not be stopped for whatever reason
+     * @see #suspendRoute(String)
+     */
     void stopRoute(String routeId) throws Exception;
 
+    /**
+     * Stops the given route using {@link org.apache.camel.spi.ShutdownStrategy} with a specified timeout.
+     *
+     * @param routeId the route id
+     * @param timeout  timeout
+     * @param timeUnit the unit to use
+     * @throws Exception is thrown if the route could not be stopped for whatever reason
+     * @see #suspendRoute(String, long, java.util.concurrent.TimeUnit)
+     */
     void stopRoute(String routeId, long timeout, TimeUnit timeUnit) throws Exception;
 
+    /**
+     * Stops the given route using {@link org.apache.camel.spi.ShutdownStrategy} with a specified timeout
+     * and optional abortAfterTimeout mode.
+     *
+     * @param routeId the route id
+     * @param timeout  timeout
+     * @param timeUnit the unit to use
+     * @param abortAfterTimeout should abort shutdown after timeout
+     * @return <tt>true</tt> if the route is stopped before the timeout
+     * @throws Exception is thrown if the route could not be stopped for whatever reason
+     * @see #suspendRoute(String, long, java.util.concurrent.TimeUnit)
+     */
     boolean stopRoute(String routeId, long timeout, TimeUnit timeUnit, boolean abortAfterTimeout) throws Exception;
 
+    /**
+     * Suspends the given route using {@link org.apache.camel.spi.ShutdownStrategy}.
+     * <p/>
+     * Suspending a route is more gently than stopping, as the route consumers will be suspended (if they support)
+     * otherwise the consumers will be stopped.
+     * <p/>
+     * By suspending the route services will be kept running (if possible) and therefore its faster to resume the route.
+     * <p/>
+     * If the route does <b>not</b> support suspension the route will be stopped instead
+     *
+     * @param routeId the route id
+     * @throws Exception is thrown if the route could not be suspended for whatever reason
+     */
     void suspendRoute(String routeId) throws Exception;
 
+    /**
+     * Suspends the given route using {@link org.apache.camel.spi.ShutdownStrategy} with a specified timeout.
+     * <p/>
+     * Suspending a route is more gently than stopping, as the route consumers will be suspended (if they support)
+     * otherwise the consumers will be stopped.
+     * <p/>
+     * By suspending the route services will be kept running (if possible) and therefore its faster to resume the route.
+     * <p/>
+     * If the route does <b>not</b> support suspension the route will be stopped instead
+     *
+     * @param routeId  the route id
+     * @param timeout  timeout
+     * @param timeUnit the unit to use
+     * @throws Exception is thrown if the route could not be suspended for whatever reason
+     */
     void suspendRoute(String routeId, long timeout, TimeUnit timeUnit) throws Exception;
 
+    /**
+     * Resumes the given route if it has been previously suspended
+     * <p/>
+     * If the route does <b>not</b> support suspension the route will be started instead
+     *
+     * @param routeId the route id
+     * @throws Exception is thrown if the route could not be resumed for whatever reason
+     */
     void resumeRoute(String routeId) throws Exception;
 
     /**
diff --git a/camel-core/src/main/java/org/apache/camel/spi/RoutePolicyFactory.java b/camel-core/src/main/java/org/apache/camel/spi/RoutePolicyFactory.java
index 2632388..216d150 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/RoutePolicyFactory.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/RoutePolicyFactory.java
@@ -17,7 +17,7 @@
 package org.apache.camel.spi;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.NamedNode;
 
 /**
  * A factory to create {@link org.apache.camel.spi.RoutePolicy} and assign to routes automatic.
@@ -32,5 +32,5 @@ public interface RoutePolicyFactory {
      * @param route        the route definition
      * @return the created {@link org.apache.camel.spi.RoutePolicy}, or <tt>null</tt> to not use a policy for this route
      */
-    RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition route);
+    RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode route);
 }
diff --git a/camel-core/src/main/java/org/apache/camel/spi/Transformer.java b/camel-core/src/main/java/org/apache/camel/spi/Transformer.java
index f282c6f..ff398e0 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/Transformer.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/Transformer.java
@@ -19,19 +19,16 @@ package org.apache.camel.spi;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Message;
-import org.apache.camel.model.InputTypeDefinition;
-import org.apache.camel.model.OutputTypeDefinition;
-import org.apache.camel.processor.ContractAdvice;
 import org.apache.camel.support.ServiceSupport;
 
 /**
  * <a href="http://camel.apache.org/transformer.html">Transformer</a>
  * performs message transformation according to the declared data type.
- * {@link ContractAdvice} looks for a required Transformer and apply if
+ * {@link org.apache.camel.processor.ContractAdvice} looks for a required Transformer and apply if
  * input/output type declared on a route is different from current message type.
  *  
- * @see {@link ContractAdvice}
- * {@link DataType} {@link InputTypeDefinition} {@link OutputTypeDefinition}
+ * @see {@link org.apache.camel.processor.ContractAdvice}
+ * {@link DataType} {@link org.apache.camel.model.InputTypeDefinition} {@link org.apache.camel.model.OutputTypeDefinition}
  */
 public abstract class Transformer extends ServiceSupport implements CamelContextAware {
 
diff --git a/camel-core/src/main/java/org/apache/camel/spi/Validator.java b/camel-core/src/main/java/org/apache/camel/spi/Validator.java
index 50b2d86..67125bb 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/Validator.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/Validator.java
@@ -20,19 +20,16 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Message;
 import org.apache.camel.ValidationException;
-import org.apache.camel.model.InputTypeDefinition;
-import org.apache.camel.model.OutputTypeDefinition;
-import org.apache.camel.processor.ContractAdvice;
 import org.apache.camel.support.ServiceSupport;
 
 /**
  * <a href="http://camel.apache.org/validator.html">Validator</a>
  * performs message content validation according to the declared data type.
- * {@link ContractAdvice} applies Validator if input/output type is declared on
+ * {@link org.apache.camel.processor.ContractAdvice} applies Validator if input/output type is declared on
  * a route with validation enabled.
  *  
- * @see {@link ContractAdvice}
- * {@link InputTypeDefinition} {@link OutputTypeDefinition}
+ * @see {@link org.apache.camel.processor.ContractAdvice}
+ * {@link org.apache.camel.model.InputTypeDefinition} {@link org.apache.camel.model.OutputTypeDefinition}
  */
 public abstract class Validator extends ServiceSupport implements CamelContextAware {
 
diff --git a/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java b/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
index bfa56ae..7d90d33 100644
--- a/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
@@ -16,7 +16,6 @@
  */
 package org.apache.camel.util;
 
-import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -45,7 +44,6 @@ import java.util.Optional;
 import java.util.Properties;
 import java.util.concurrent.Callable;
 import java.util.function.Consumer;
-import java.util.function.Function;
 import java.util.function.Supplier;
 
 import org.w3c.dom.Node;
@@ -62,7 +60,6 @@ import org.apache.camel.Ordered;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.TypeConverter;
 import org.apache.camel.WrappedFile;
-import org.apache.camel.util.function.ThrowingFunction;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -419,35 +416,6 @@ public final class ObjectHelper {
     }
 
     /**
-     * Tests whether the value is <b>not</b> <tt>null</tt>, an empty string, an empty collection or a map  and transform it using the given function.
-     *
-     * @param value  the value, if its a String it will be tested for text length as well
-     * @param function  the function to be executed against value if not empty
-     */
-    public static <I, R, T extends Throwable> Optional<R> applyIfNotEmpty(I value, ThrowingFunction<I, R, T> function) throws T {
-        if (isNotEmpty(value)) {
-            return Optional.ofNullable(function.apply(value));
-        }
-
-        return Optional.empty();
-    }
-
-    /**
-     * Tests whether the value is <b>not</b> <tt>null</tt>, an empty string, an empty collection or a map and transform it using the given function.
-     *
-     * @param value  the value, if its a String it will be tested for text length as well
-     * @param consumer  the function to be executed against value if not empty
-     * @param orElse  the supplier to use to retrieve a result if the given value is empty
-     */
-    public static <I, R, T extends Throwable> R applyIfNotEmpty(I value, ThrowingFunction<I, R, T> consumer, Supplier<R> orElse) throws T {
-        if (isNotEmpty(value)) {
-            return consumer.apply(value);
-        }
-
-        return orElse.get();
-    }
-
-    /**
      * Returns true if the collection contains the specified value
      */
     public static boolean contains(Object collectionOrArray, Object value) {
diff --git a/camel-core/src/main/java/org/apache/camel/util/TimeUtils.java b/camel-core/src/main/java/org/apache/camel/util/TimeUtils.java
index 49f8f3b..4fc42c0 100644
--- a/camel-core/src/main/java/org/apache/camel/util/TimeUtils.java
+++ b/camel-core/src/main/java/org/apache/camel/util/TimeUtils.java
@@ -20,14 +20,25 @@ import java.text.DecimalFormat;
 import java.text.DecimalFormatSymbols;
 import java.text.NumberFormat;
 import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Time utils.
  *
- * @version 
+ * @version
  */
 public final class TimeUtils {
 
+    private static final Logger LOG = LoggerFactory.getLogger(TimeUtils.class);
+    private static final Pattern NUMBERS_ONLY_STRING_PATTERN = Pattern.compile("^[-]?(\\d)+$", Pattern.CASE_INSENSITIVE);
+    private static final Pattern HOUR_REGEX_PATTERN = Pattern.compile("((\\d)*(\\d))h(our(s)?)?", Pattern.CASE_INSENSITIVE);
+    private static final Pattern MINUTES_REGEX_PATTERN = Pattern.compile("((\\d)*(\\d))m(in(ute(s)?)?)?", Pattern.CASE_INSENSITIVE);
+    private static final Pattern SECONDS_REGEX_PATTERN = Pattern.compile("((\\d)*(\\d))s(ec(ond)?(s)?)?", Pattern.CASE_INSENSITIVE);
+
     private TimeUtils() {
     }
 
@@ -74,4 +85,108 @@ public final class TimeUtils {
         return s;
     }
 
+    public static long toMilliSeconds(String source) throws IllegalArgumentException {
+        // quick conversion if its only digits
+        boolean digit = true;
+        for (int i = 0; i < source.length(); i++) {
+            char ch = source.charAt(i);
+            // special for fist as it can be negative number
+            if (i == 0 && ch == '-') {
+                continue;
+            }
+            // quick check if its 0..9
+            if (ch < '0' || ch > '9') {
+                digit = false;
+                break;
+            }
+        }
+        if (digit) {
+            return Long.valueOf(source);
+        }
+
+        long milliseconds = 0;
+        boolean foundFlag = false;
+
+        checkCorrectnessOfPattern(source);
+        Matcher matcher;
+
+        matcher = createMatcher(NUMBERS_ONLY_STRING_PATTERN, source);
+        if (matcher.find()) {
+            // Note: This will also be used for regular numeric strings.
+            //       This String -> long converter will be used for all strings.
+            milliseconds = Long.valueOf(source);
+        } else {
+            matcher = createMatcher(HOUR_REGEX_PATTERN, source);
+            if (matcher.find()) {
+                milliseconds = milliseconds + (3600000 * Long.valueOf(matcher.group(1)));
+                foundFlag = true;
+            }
+
+            matcher = createMatcher(MINUTES_REGEX_PATTERN, source);
+            if (matcher.find()) {
+                long minutes = Long.valueOf(matcher.group(1));
+                if ((minutes > 59) && foundFlag) {
+                    throw new IllegalArgumentException("Minutes should contain a valid value between 0 and 59: " + source);
+                }
+                foundFlag = true;
+                milliseconds = milliseconds + (60000 * minutes);
+            }
+
+            matcher = createMatcher(SECONDS_REGEX_PATTERN, source);
+            if (matcher.find()) {
+                long seconds = Long.valueOf(matcher.group(1));
+                if ((seconds > 59) && foundFlag) {
+                    throw new IllegalArgumentException("Seconds should contain a valid value between 0 and 59: " + source);
+                }
+                foundFlag = true;
+                milliseconds = milliseconds + (1000 * seconds);
+            }
+
+            // No pattern matched... initiating fallback check and conversion (if required).
+            // The source at this point may contain illegal values or special characters
+            if (!foundFlag) {
+                milliseconds = Long.valueOf(source);
+            }
+        }
+
+        LOG.trace("source: {} milliseconds: ", source, milliseconds);
+
+        return milliseconds;
+    }
+
+    private static void checkCorrectnessOfPattern(String source) {
+        //replace only numbers once
+        Matcher matcher = createMatcher(NUMBERS_ONLY_STRING_PATTERN, source);
+        String replaceSource = matcher.replaceFirst("");
+
+        //replace hour string once
+        matcher = createMatcher(HOUR_REGEX_PATTERN, replaceSource);
+        if (matcher.find() && matcher.find()) {
+            throw new IllegalArgumentException("Hours should not be specified more then once: " + source);
+        }
+        replaceSource = matcher.replaceFirst("");
+
+        //replace minutes once
+        matcher = createMatcher(MINUTES_REGEX_PATTERN, replaceSource);
+        if (matcher.find() && matcher.find()) {
+            throw new IllegalArgumentException("Minutes should not be specified more then once: " + source);
+        }
+        replaceSource = matcher.replaceFirst("");
+
+        //replace seconds once
+        matcher = createMatcher(SECONDS_REGEX_PATTERN, replaceSource);
+        if (matcher.find() && matcher.find()) {
+            throw new IllegalArgumentException("Seconds should not be specified more then once: " + source);
+        }
+        replaceSource = matcher.replaceFirst("");
+
+        if (replaceSource.length() > 0) {
+            throw new IllegalArgumentException("Illegal characters: " + source);
+        }
+    }
+
+    private static Matcher createMatcher(Pattern pattern, String source) {
+        return pattern.matcher(source);
+    }
+
 }
diff --git a/camel-core/src/main/java/org/apache/camel/util/function/ThrowingHelper.java b/camel-core/src/main/java/org/apache/camel/util/function/ThrowingHelper.java
index 75a3246..4d75466 100644
--- a/camel-core/src/main/java/org/apache/camel/util/function/ThrowingHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/util/function/ThrowingHelper.java
@@ -16,11 +16,14 @@
  */
 package org.apache.camel.util.function;
 
+import java.util.Optional;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+import org.apache.camel.util.ObjectHelper;
+
 public final class ThrowingHelper {
     private ThrowingHelper() {
     }
@@ -65,4 +68,33 @@ public final class ThrowingHelper {
             }
         };
     }
+
+    /**
+     * Tests whether the value is <b>not</b> <tt>null</tt>, an empty string, an empty collection or a map  and transform it using the given function.
+     *
+     * @param value  the value, if its a String it will be tested for text length as well
+     * @param function  the function to be executed against value if not empty
+     */
+    public static <I, R, T extends Throwable> Optional<R> applyIfNotEmpty(I value, ThrowingFunction<I, R, T> function) throws T {
+        if (ObjectHelper.isNotEmpty(value)) {
+            return Optional.ofNullable(function.apply(value));
+        }
+
+        return Optional.empty();
+    }
+
+    /**
+     * Tests whether the value is <b>not</b> <tt>null</tt>, an empty string, an empty collection or a map and transform it using the given function.
+     *
+     * @param value  the value, if its a String it will be tested for text length as well
+     * @param consumer  the function to be executed against value if not empty
+     * @param orElse  the supplier to use to retrieve a result if the given value is empty
+     */
+    public static <I, R, T extends Throwable> R applyIfNotEmpty(I value, ThrowingFunction<I, R, T> consumer, Supplier<R> orElse) throws T {
+        if (ObjectHelper.isNotEmpty(value)) {
+            return consumer.apply(value);
+        }
+
+        return orElse.get();
+    }
 }
diff --git a/camel-core/src/test/java/org/apache/camel/component/rest/FromRestGetPolicyTest.java b/camel-core/src/test/java/org/apache/camel/component/rest/FromRestGetPolicyTest.java
index 97a63aa..17edec6 100644
--- a/camel-core/src/test/java/org/apache/camel/component/rest/FromRestGetPolicyTest.java
+++ b/camel-core/src/test/java/org/apache/camel/component/rest/FromRestGetPolicyTest.java
@@ -17,10 +17,10 @@
 package org.apache.camel.component.rest;
 
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.JndiRegistry;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Policy;
 import org.apache.camel.spi.RouteContext;
 import org.junit.Test;
@@ -61,7 +61,7 @@ public class FromRestGetPolicyTest extends ContextTestSupport {
     private class MyDummyPolicy implements Policy {
 
         @Override
-        public void beforeWrap(RouteContext routeContext, ProcessorDefinition<?> definition) {
+        public void beforeWrap(RouteContext routeContext, NamedNode definition) {
             // noop
         }
 
diff --git a/camel-core/src/test/java/org/apache/camel/impl/CustomIdFactoryTest.java b/camel-core/src/test/java/org/apache/camel/impl/CustomIdFactoryTest.java
index 569f516..d7f6c87 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/CustomIdFactoryTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/CustomIdFactoryTest.java
@@ -22,6 +22,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.OptionalIdentifiedDefinition;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.processor.DelegateProcessor;
 import org.apache.camel.spi.InterceptStrategy;
@@ -114,12 +115,12 @@ public class CustomIdFactoryTest extends ContextTestSupport {
 
     private static class MyDebuggerCheckingId implements InterceptStrategy {
 
-        public Processor wrapProcessorInInterceptors(final CamelContext context, 
-                final ProcessorDefinition<?> definition, Processor target, Processor nextTarget) throws Exception {
+        public Processor wrapProcessorInInterceptors(final CamelContext context,
+                                                     final NamedNode definition, Processor target, Processor nextTarget) throws Exception {
 
             // MUST DO THIS
             // force id creation as sub nodes have lazy assigned ids
-            definition.idOrCreate(context.getNodeIdFactory());
+            ((OptionalIdentifiedDefinition<?>) definition).idOrCreate(context.getNodeIdFactory());
 
             return new DelegateProcessor(target) {
                 @Override
diff --git a/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextAutoStartupTest.java b/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextAutoStartupTest.java
index 748dc68..f99b252 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextAutoStartupTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextAutoStartupTest.java
@@ -44,12 +44,12 @@ public class DefaultCamelContextAutoStartupTest extends TestSupport {
 
         assertEquals(true, camel.isStarted());
         assertEquals(1, camel.getRoutes().size());
-        assertEquals(true, camel.getRouteStatus("foo").isStopped());
+        assertEquals(true, camel.getRouteController().getRouteStatus("foo").isStopped());
 
         // now start all routes
         camel.getRouteController().startAllRoutes();
 
-        assertEquals(true, camel.getRouteStatus("foo").isStarted());
+        assertEquals(true, camel.getRouteController().getRouteStatus("foo").isStarted());
 
         // and now its started we can test that it works by sending in a message to the route
         MockEndpoint mock = camel.getEndpoint("mock:result", MockEndpoint.class);
@@ -78,12 +78,12 @@ public class DefaultCamelContextAutoStartupTest extends TestSupport {
 
         assertEquals(true, camel.isStarted());
         assertEquals(1, camel.getRoutes().size());
-        assertEquals(true, camel.getRouteStatus("foo").isStopped());
+        assertEquals(true, camel.getRouteController().getRouteStatus("foo").isStopped());
 
         // now start the routes
         camel.startRoute("foo");
 
-        assertEquals(true, camel.getRouteStatus("foo").isStarted());
+        assertEquals(true, camel.getRouteController().getRouteStatus("foo").isStarted());
 
         // and now its started we can test that it works by sending in a message to the route
         MockEndpoint mock = camel.getEndpoint("mock:result", MockEndpoint.class);
@@ -112,7 +112,7 @@ public class DefaultCamelContextAutoStartupTest extends TestSupport {
 
         assertEquals(true, camel.isStarted());
         assertEquals(1, camel.getRoutes().size());
-        assertEquals(true, camel.getRouteStatus("foo").isStarted());
+        assertEquals(true, camel.getRouteController().getRouteStatus("foo").isStarted());
 
         MockEndpoint mock = camel.getEndpoint("mock:result", MockEndpoint.class);
         mock.expectedMessageCount(1);
@@ -142,13 +142,13 @@ public class DefaultCamelContextAutoStartupTest extends TestSupport {
 
         assertEquals(true, camel.isStarted());
         assertEquals(1, camel.getRoutes().size());
-        assertEquals(true, camel.getRouteStatus("foo").isStopped());
-        assertEquals(false, camel.getRouteStatus("foo").isStarted());
+        assertEquals(true, camel.getRouteController().getRouteStatus("foo").isStopped());
+        assertEquals(false, camel.getRouteController().getRouteStatus("foo").isStarted());
 
         // now start all the routes
         camel.getRouteController().startAllRoutes();
 
-        assertEquals(true, camel.getRouteStatus("foo").isStarted());
+        assertEquals(true, camel.getRouteController().getRouteStatus("foo").isStarted());
 
         MockEndpoint mock = camel.getEndpoint("mock:result", MockEndpoint.class);
         mock.expectedMessageCount(1);
diff --git a/camel-core/src/test/java/org/apache/camel/impl/RoutePolicyFactoryTest.java b/camel-core/src/test/java/org/apache/camel/impl/RoutePolicyFactoryTest.java
index 52c1b3a..a4cb99f 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/RoutePolicyFactoryTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/RoutePolicyFactoryTest.java
@@ -19,9 +19,9 @@ package org.apache.camel.impl;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Route;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spi.RoutePolicy;
 import org.apache.camel.spi.RoutePolicyFactory;
 import org.apache.camel.support.RoutePolicySupport;
@@ -48,7 +48,7 @@ public class RoutePolicyFactoryTest extends ContextTestSupport {
         }
 
         @Override
-        public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition route) {
+        public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode route) {
             return new MyRoutePolicy(routeId);
         }
     }
diff --git a/camel-core/src/test/java/org/apache/camel/impl/StartAndStopRoutesTest.java b/camel-core/src/test/java/org/apache/camel/impl/StartAndStopRoutesTest.java
index 3227192..91f033a 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/StartAndStopRoutesTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/StartAndStopRoutesTest.java
@@ -23,6 +23,7 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.model.FromDefinition;
+import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.RouteDefinition;
 import org.junit.Test;
 
@@ -56,12 +57,12 @@ public class StartAndStopRoutesTest extends ContextTestSupport {
         assertMockEndpointsSatisfied();
 
         // stop the route
-        context.stopRoute(route);
+        context.getRouteController().stopRoute(route.getId());
 
         // lets mutate the route...
         FromDefinition fromType = assertOneElement(route.getInputs());
         fromType.setUri("direct:test.C");
-        context.startRoute(route);
+        context.adapt(ModelCamelContext.class).addRouteDefinition(route);
 
         // now lets check it works
         // send from C over B to results
diff --git a/camel-core/src/test/java/org/apache/camel/issues/AdviceWithPolicyTest.java b/camel-core/src/test/java/org/apache/camel/issues/AdviceWithPolicyTest.java
index 55fd710..e9899eb 100644
--- a/camel-core/src/test/java/org/apache/camel/issues/AdviceWithPolicyTest.java
+++ b/camel-core/src/test/java/org/apache/camel/issues/AdviceWithPolicyTest.java
@@ -17,10 +17,10 @@
 package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.AdviceWithRouteBuilder;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spi.Policy;
 import org.apache.camel.spi.RouteContext;
@@ -67,7 +67,7 @@ public class AdviceWithPolicyTest extends ContextTestSupport {
     private static final class MyPolicy implements Policy {
 
         @Override
-        public void beforeWrap(RouteContext routeContext, ProcessorDefinition<?> definition) {
+        public void beforeWrap(RouteContext routeContext, NamedNode definition) {
             // noop
         }
 
diff --git a/camel-core/src/test/java/org/apache/camel/issues/AdviceWithStartTargetIssueTest.java b/camel-core/src/test/java/org/apache/camel/issues/AdviceWithStartTargetIssueTest.java
index c0654e8..6a322be 100644
--- a/camel-core/src/test/java/org/apache/camel/issues/AdviceWithStartTargetIssueTest.java
+++ b/camel-core/src/test/java/org/apache/camel/issues/AdviceWithStartTargetIssueTest.java
@@ -19,9 +19,9 @@ package org.apache.camel.issues;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.processor.DelegateAsyncProcessor;
 import org.apache.camel.spi.InterceptStrategy;
 import org.junit.Test;
@@ -71,7 +71,7 @@ public class AdviceWithStartTargetIssueTest extends ContextTestSupport {
         private static final Logger LOG = LoggerFactory.getLogger(ContainerWideInterceptor.class);
         private static int count;
 
-        public Processor wrapProcessorInInterceptors(final CamelContext context, final ProcessorDefinition<?> definition,
+        public Processor wrapProcessorInInterceptors(final CamelContext context, final NamedNode definition,
                                                      final Processor target, final Processor nextTarget) throws Exception {
 
             return new DelegateAsyncProcessor(new Processor() {
diff --git a/camel-core/src/test/java/org/apache/camel/issues/AdviceWithTransactedTest.java b/camel-core/src/test/java/org/apache/camel/issues/AdviceWithTransactedTest.java
index ef9db1d..7fe3835 100644
--- a/camel-core/src/test/java/org/apache/camel/issues/AdviceWithTransactedTest.java
+++ b/camel-core/src/test/java/org/apache/camel/issues/AdviceWithTransactedTest.java
@@ -17,10 +17,10 @@
 package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.AdviceWithRouteBuilder;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Policy;
 import org.apache.camel.spi.RouteContext;
 import org.junit.Test;
@@ -64,7 +64,7 @@ public class AdviceWithTransactedTest extends ContextTestSupport {
     private static final class MyDummyPolicy implements Policy {
 
         @Override
-        public void beforeWrap(RouteContext routeContext, ProcessorDefinition<?> definition) {
+        public void beforeWrap(RouteContext routeContext, NamedNode definition) {
             // noop
         }
 
diff --git a/camel-core/src/test/java/org/apache/camel/issues/DynamicRouterWithInterceptorTest.java b/camel-core/src/test/java/org/apache/camel/issues/DynamicRouterWithInterceptorTest.java
index 74e75a52..ccf56ff 100644
--- a/camel-core/src/test/java/org/apache/camel/issues/DynamicRouterWithInterceptorTest.java
+++ b/camel-core/src/test/java/org/apache/camel/issues/DynamicRouterWithInterceptorTest.java
@@ -22,10 +22,10 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
 import org.apache.camel.Header;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.model.DynamicRouterDefinition;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.processor.DelegateAsyncProcessor;
 import org.apache.camel.spi.InterceptStrategy;
 import org.junit.Test;
@@ -40,7 +40,7 @@ public class DynamicRouterWithInterceptorTest extends ContextTestSupport {
         private static final Logger LOGGER = LoggerFactory.getLogger(MyInterceptStrategy.class);
         private static int doneCount;
 
-        public Processor wrapProcessorInInterceptors(final CamelContext context, final ProcessorDefinition<?> definition,
+        public Processor wrapProcessorInInterceptors(final CamelContext context, final NamedNode definition,
                                                      final Processor target, final Processor nextTarget) throws Exception {
             if (definition instanceof DynamicRouterDefinition<?>) {
                 final DelegateAsyncProcessor delegateAsyncProcessor = new DelegateAsyncProcessor() {
diff --git a/camel-core/src/test/java/org/apache/camel/issues/RecipientListWithInterceptorTest.java b/camel-core/src/test/java/org/apache/camel/issues/RecipientListWithInterceptorTest.java
index 1fd3194..a1fe383 100644
--- a/camel-core/src/test/java/org/apache/camel/issues/RecipientListWithInterceptorTest.java
+++ b/camel-core/src/test/java/org/apache/camel/issues/RecipientListWithInterceptorTest.java
@@ -20,9 +20,9 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.RecipientListDefinition;
 import org.apache.camel.processor.DelegateAsyncProcessor;
 import org.apache.camel.spi.InterceptStrategy;
@@ -38,7 +38,7 @@ public class RecipientListWithInterceptorTest extends ContextTestSupport {
         private static final Logger LOGGER = LoggerFactory.getLogger(MyInterceptStrategy.class);
         private static int doneCount;
 
-        public Processor wrapProcessorInInterceptors(final CamelContext context, final ProcessorDefinition<?> definition,
+        public Processor wrapProcessorInInterceptors(final CamelContext context, final NamedNode definition,
                                                      final Processor target, final Processor nextTarget) throws Exception {
             if (definition instanceof RecipientListDefinition<?>) {
                 final DelegateAsyncProcessor delegateAsyncProcessor = new DelegateAsyncProcessor() {
diff --git a/camel-core/src/test/java/org/apache/camel/issues/RoutingSlipWithInterceptorTest.java b/camel-core/src/test/java/org/apache/camel/issues/RoutingSlipWithInterceptorTest.java
index c2d3eaf..b872daf 100644
--- a/camel-core/src/test/java/org/apache/camel/issues/RoutingSlipWithInterceptorTest.java
+++ b/camel-core/src/test/java/org/apache/camel/issues/RoutingSlipWithInterceptorTest.java
@@ -20,9 +20,9 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.RoutingSlipDefinition;
 import org.apache.camel.processor.DelegateAsyncProcessor;
 import org.apache.camel.spi.InterceptStrategy;
@@ -38,7 +38,7 @@ public class RoutingSlipWithInterceptorTest extends ContextTestSupport {
         private static final Logger LOGGER = LoggerFactory.getLogger(MyInterceptStrategy.class);
         private static int doneCount;
 
-        public Processor wrapProcessorInInterceptors(final CamelContext context, final ProcessorDefinition<?> definition,
+        public Processor wrapProcessorInInterceptors(final CamelContext context, final NamedNode definition,
                                                      final Processor target, final Processor nextTarget) throws Exception {
             if (definition instanceof RoutingSlipDefinition<?>) {
                 final DelegateAsyncProcessor delegateAsyncProcessor = new DelegateAsyncProcessor() {
diff --git a/camel-core/src/test/java/org/apache/camel/issues/SplitWithInterceptorTest.java b/camel-core/src/test/java/org/apache/camel/issues/SplitWithInterceptorTest.java
index 05d8643..88eeb21 100644
--- a/camel-core/src/test/java/org/apache/camel/issues/SplitWithInterceptorTest.java
+++ b/camel-core/src/test/java/org/apache/camel/issues/SplitWithInterceptorTest.java
@@ -20,9 +20,9 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.SplitDefinition;
 import org.apache.camel.processor.DelegateAsyncProcessor;
 import org.apache.camel.spi.InterceptStrategy;
@@ -38,7 +38,7 @@ public class SplitWithInterceptorTest extends ContextTestSupport {
         private static final Logger LOGGER = LoggerFactory.getLogger(MyInterceptStrategy.class);
         private static int doneCount;
 
-        public Processor wrapProcessorInInterceptors(final CamelContext context, final ProcessorDefinition<?> definition,
+        public Processor wrapProcessorInInterceptors(final CamelContext context, final NamedNode definition,
                                                      final Processor target, final Processor nextTarget) throws Exception {
             if (definition instanceof SplitDefinition) {
                 final DelegateAsyncProcessor delegateAsyncProcessor = new DelegateAsyncProcessor() {
diff --git a/camel-core/src/test/java/org/apache/camel/issues/TransactedPropertyPlaceholderIssueTest.java b/camel-core/src/test/java/org/apache/camel/issues/TransactedPropertyPlaceholderIssueTest.java
index ac2d12c..f3e442f 100644
--- a/camel-core/src/test/java/org/apache/camel/issues/TransactedPropertyPlaceholderIssueTest.java
+++ b/camel-core/src/test/java/org/apache/camel/issues/TransactedPropertyPlaceholderIssueTest.java
@@ -18,10 +18,10 @@ package org.apache.camel.issues;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.properties.PropertiesComponent;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Policy;
 import org.apache.camel.spi.RouteContext;
 import org.junit.Test;
@@ -66,7 +66,7 @@ public class TransactedPropertyPlaceholderIssueTest extends ContextTestSupport {
     private static final class MyDummyPolicy implements Policy {
 
         @Override
-        public void beforeWrap(RouteContext routeContext, ProcessorDefinition<?> definition) {
+        public void beforeWrap(RouteContext routeContext, NamedNode definition) {
             // noop
         }
 
diff --git a/camel-core/src/test/java/org/apache/camel/issues/TwoTimerWithJMXIssue.java b/camel-core/src/test/java/org/apache/camel/issues/TwoTimerWithJMXIssue.java
index 3be1ed7..210eb48 100644
--- a/camel-core/src/test/java/org/apache/camel/issues/TwoTimerWithJMXIssue.java
+++ b/camel-core/src/test/java/org/apache/camel/issues/TwoTimerWithJMXIssue.java
@@ -18,10 +18,10 @@ package org.apache.camel.issues;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.InterceptStrategy;
 
 /**
@@ -59,7 +59,7 @@ public class TwoTimerWithJMXIssue extends ContextTestSupport {
 
     private static class MyTracer implements InterceptStrategy {
 
-        public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition,
+        public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition,
                                                      Processor target, Processor nextTarget) throws Exception {
             assertNotNull(target);
             counter++;
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedAggregateControllerTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedAggregateControllerTest.java
index 238fb47..2d5f331 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedAggregateControllerTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedAggregateControllerTest.java
@@ -160,7 +160,7 @@ public class ManagedAggregateControllerTest extends ManagementTestSupport {
         assertEquals(1, pending.intValue());
 
         // we can also use the client mbean
-        ManagedAggregateProcessorMBean client = context.getManagedProcessor("myAggregator", ManagedAggregateProcessorMBean.class);
+        ManagedAggregateProcessorMBean client = context.adapt(ManagedCamelContext.class).getManagedProcessor("myAggregator", ManagedAggregateProcessorMBean.class);
         assertNotNull(client);
 
         assertEquals(1, client.getCompletedByForce());
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java
index 9257138..7e5a06d 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java
@@ -51,7 +51,7 @@ public class ManagedCamelContextTest extends ManagementTestSupport {
             return;
         }
 
-        ManagedCamelContextMBean client = context.getManagedCamelContext();
+        ManagedCamelContextMBean client = context.adapt(ManagedCamelContext.class).getManagedCamelContext();
         assertNotNull(client);
 
         assertEquals("camel-1", client.getCamelId());
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedCustomPolicyTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedCustomPolicyTest.java
index 6b2221f..18b8e41 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedCustomPolicyTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedCustomPolicyTest.java
@@ -23,9 +23,9 @@ import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Policy;
 import org.apache.camel.spi.RouteContext;
 import org.junit.Test;
@@ -85,7 +85,7 @@ public class ManagedCustomPolicyTest extends ManagementTestSupport {
     private final class MyPolicy implements Policy {
 
         @Override
-        public void beforeWrap(RouteContext routeContext, ProcessorDefinition<?> definition) {
+        public void beforeWrap(RouteContext routeContext, NamedNode definition) {
             // noop
         }
 
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedInlinedProcessorTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedInlinedProcessorTest.java
index a3bd0d5..5cd26b2 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedInlinedProcessorTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedInlinedProcessorTest.java
@@ -47,7 +47,7 @@ public class ManagedInlinedProcessorTest extends ManagementTestSupport {
         Long counter = (Long) mbeanServer.getAttribute(on, "ExchangesCompleted");
         assertEquals(1L, counter.longValue());
 
-        ManagedProcessorMBean mb = context.getManagedProcessor("custom", ManagedProcessorMBean.class);
+        ManagedProcessorMBean mb = context.adapt(ManagedCamelContext.class).getManagedProcessor("custom", ManagedProcessorMBean.class);
         assertNotNull(mb);
         assertEquals(1L, mb.getExchangesCompleted());
     }
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedRouteSuspendAndResumeTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedRouteSuspendAndResumeTest.java
index ce72f80..04b2925 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedRouteSuspendAndResumeTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedRouteSuspendAndResumeTest.java
@@ -91,7 +91,7 @@ public class ManagedRouteSuspendAndResumeTest extends ManagementTestSupport {
         // this time the file is consumed
         mock.assertIsSatisfied();
 
-        ManagedSuspendableRouteMBean route = context.getManagedRoute("foo", ManagedSuspendableRouteMBean.class);
+        ManagedSuspendableRouteMBean route = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedSuspendableRouteMBean.class);
         assertNotNull(route);
 
         assertEquals(2, route.getExchangesCompleted());
diff --git a/camel-core/src/test/java/org/apache/camel/management/RemoveRouteDefinitionTest.java b/camel-core/src/test/java/org/apache/camel/management/RemoveRouteDefinitionTest.java
index 32b24f6..f10a302 100644
--- a/camel-core/src/test/java/org/apache/camel/management/RemoveRouteDefinitionTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/RemoveRouteDefinitionTest.java
@@ -24,6 +24,7 @@ import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.RouteDefinition;
 import org.junit.Test;
 
@@ -53,7 +54,8 @@ public class RemoveRouteDefinitionTest extends ManagementTestSupport {
         RouteDefinition definition = context.getRouteDefinition("route1");
         List<RouteDefinition> routeDefinitions = new ArrayList<>();
         routeDefinitions.add(definition);
-        context.shutdownRoute("route1");
+        context.getRouteController().stopRoute("route1");
+        context.adapt(ModelCamelContext.class).removeRoute("route1");
 
         // route is shutdown (= also removed), so its not longer in JMX
         set = mbeanServer.queryNames(new ObjectName("*:type=routes,*"), null);
@@ -81,7 +83,7 @@ public class RemoveRouteDefinitionTest extends ManagementTestSupport {
         List<RouteDefinition> routeDefinitions = new ArrayList<>();
         routeDefinitions.add(definition);
         // must stop before we can remove
-        context.stopRoute("route1");
+        context.getRouteController().stopRoute("route1");
         context.removeRoute("route1");
 
         // route is removed, so its not longer in JMX
@@ -109,7 +111,7 @@ public class RemoveRouteDefinitionTest extends ManagementTestSupport {
         RouteDefinition definition = context.getRouteDefinition("route1");
         List<RouteDefinition> routeDefinitions = new ArrayList<>();
         routeDefinitions.add(definition);
-        context.stopRoute("route1");
+        context.getRouteController().stopRoute("route1");
 
         // route is only stopped so its still in JMX
         set = mbeanServer.queryNames(new ObjectName("*:type=routes,*"), null);
diff --git a/camel-core/src/test/java/org/apache/camel/model/LoadRouteFromXmlWithPolicyTest.java b/camel-core/src/test/java/org/apache/camel/model/LoadRouteFromXmlWithPolicyTest.java
index 1d19143..39ae478 100644
--- a/camel-core/src/test/java/org/apache/camel/model/LoadRouteFromXmlWithPolicyTest.java
+++ b/camel-core/src/test/java/org/apache/camel/model/LoadRouteFromXmlWithPolicyTest.java
@@ -20,6 +20,7 @@ import java.io.InputStream;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.impl.JndiRegistry;
 import org.apache.camel.spi.Policy;
@@ -83,7 +84,7 @@ public class LoadRouteFromXmlWithPolicyTest extends ContextTestSupport {
         }
 
         public void beforeWrap(RouteContext routeContext,
-                               ProcessorDefinition<?> definition) {
+                               NamedNode definition) {
             // no need to modify the route
         }
 
diff --git a/camel-core/src/test/java/org/apache/camel/processor/CustomProcessorFactoryTest.java b/camel-core/src/test/java/org/apache/camel/processor/CustomProcessorFactoryTest.java
index a5b30b6..e827776 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/CustomProcessorFactoryTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/CustomProcessorFactoryTest.java
@@ -18,9 +18,9 @@ package org.apache.camel.processor;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.SetBodyDefinition;
 import org.apache.camel.model.SplitDefinition;
 import org.apache.camel.model.ToDefinition;
@@ -86,11 +86,11 @@ public class CustomProcessorFactoryTest extends ContextTestSupport {
     // START SNIPPET: e3
     public static class MyFactory implements ProcessorFactory {
 
-        public Processor createChildProcessor(RouteContext routeContext, ProcessorDefinition<?> definition, boolean mandatory) throws Exception {
+        public Processor createChildProcessor(RouteContext routeContext, NamedNode definition, boolean mandatory) throws Exception {
             return null;
         }
 
-        public Processor createProcessor(RouteContext routeContext, ProcessorDefinition<?> definition) throws Exception {
+        public Processor createProcessor(RouteContext routeContext, NamedNode definition) throws Exception {
             if (definition instanceof SplitDefinition) {
                 // add additional output to the splitter
                 SplitDefinition split = (SplitDefinition) definition;
diff --git a/camel-core/src/test/java/org/apache/camel/processor/DefinitionPolicyPerProcessorTest.java b/camel-core/src/test/java/org/apache/camel/processor/DefinitionPolicyPerProcessorTest.java
index 55083fc..2ee8640 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/DefinitionPolicyPerProcessorTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/DefinitionPolicyPerProcessorTest.java
@@ -18,10 +18,12 @@ package org.apache.camel.processor;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.JndiRegistry;
 import org.apache.camel.model.ProcessorDefinition;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.SetBodyDefinition;
 import org.apache.camel.model.language.ConstantExpression;
 import org.apache.camel.spi.Policy;
@@ -80,8 +82,8 @@ public class DefinitionPolicyPerProcessorTest extends ContextTestSupport {
             return invoked;
         }
 
-        public void beforeWrap(RouteContext routeContext, ProcessorDefinition<?> definition) {
-            SetBodyDefinition bodyDef = (SetBodyDefinition) definition.getOutputs().get(0);
+        public void beforeWrap(RouteContext routeContext, NamedNode definition) {
+            SetBodyDefinition bodyDef = (SetBodyDefinition) ((ProcessorDefinition<?>) definition).getOutputs().get(0);
             bodyDef.setExpression(new ConstantExpression("body was altered"));
         }
 
diff --git a/camel-core/src/test/java/org/apache/camel/processor/PipelineStepWithEventTest.java b/camel-core/src/test/java/org/apache/camel/processor/PipelineStepWithEventTest.java
index bfeb0b2..d93e482 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/PipelineStepWithEventTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/PipelineStepWithEventTest.java
@@ -24,11 +24,11 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.management.event.AbstractExchangeEvent;
 import org.apache.camel.model.PipelineDefinition;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.InterceptStrategy;
 import org.apache.camel.support.ServiceSupport;
 import org.apache.camel.util.StopWatch;
@@ -137,7 +137,7 @@ public class PipelineStepWithEventTest extends ContextTestSupport {
     private class MyInterceptStrategy implements InterceptStrategy {
 
         @Override
-        public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition, Processor target, Processor nextTarget) throws Exception {
+        public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition, Processor target, Processor nextTarget) throws Exception {
             // grab the listener
             StepEventListener listener = context.hasService(StepEventListener.class);
 
diff --git a/camel-core/src/test/java/org/apache/camel/processor/PolicyPerProcessorTest.java b/camel-core/src/test/java/org/apache/camel/processor/PolicyPerProcessorTest.java
index 5ef2731..d700aa5 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/PolicyPerProcessorTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/PolicyPerProcessorTest.java
@@ -18,10 +18,10 @@ package org.apache.camel.processor;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.JndiRegistry;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Policy;
 import org.apache.camel.spi.RouteContext;
 import org.junit.Test;
@@ -89,7 +89,7 @@ public class PolicyPerProcessorTest extends ContextTestSupport {
         }
 
         public void beforeWrap(RouteContext routeContext,
-                ProcessorDefinition<?> definition) {
+                               NamedNode definition) {
             // no need to modify the route
         }
 
diff --git a/camel-core/src/test/java/org/apache/camel/processor/PolicyPerRouteTest.java b/camel-core/src/test/java/org/apache/camel/processor/PolicyPerRouteTest.java
index 6a80a64..75ada89 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/PolicyPerRouteTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/PolicyPerRouteTest.java
@@ -18,10 +18,10 @@ package org.apache.camel.processor;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.JndiRegistry;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Policy;
 import org.apache.camel.spi.RouteContext;
 import org.junit.Test;
@@ -89,7 +89,7 @@ public class PolicyPerRouteTest extends ContextTestSupport {
         }
 
         public void beforeWrap(RouteContext routeContext,
-                ProcessorDefinition<?> definition) {
+                               NamedNode definition) {
             // no need to modify the route
         }
 
diff --git a/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomAsyncInterceptorTest.java b/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomAsyncInterceptorTest.java
index c2434af..746b565 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomAsyncInterceptorTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomAsyncInterceptorTest.java
@@ -22,9 +22,9 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.processor.DelegateAsyncProcessor;
 import org.apache.camel.spi.InterceptStrategy;
 import org.junit.Test;
@@ -87,7 +87,7 @@ public class AsyncEndpointCustomAsyncInterceptorTest extends ContextTestSupport
     private static class MyInterceptor implements InterceptStrategy {
         private AtomicInteger counter = new AtomicInteger();
 
-        public Processor wrapProcessorInInterceptors(final CamelContext context, final ProcessorDefinition<?> definition,
+        public Processor wrapProcessorInInterceptors(final CamelContext context, final NamedNode definition,
                                                      final Processor target, final Processor nextTarget) throws Exception {
 
             // use DelegateAsyncProcessor to ensure the interceptor works well with the asynchronous routing
diff --git a/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomInterceptorTest.java b/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomInterceptorTest.java
index fcb2791..51e8b3f 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomInterceptorTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomInterceptorTest.java
@@ -21,9 +21,9 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.InterceptStrategy;
 import org.junit.Test;
 
@@ -90,7 +90,7 @@ public class AsyncEndpointCustomInterceptorTest extends ContextTestSupport {
     private static class MyInterceptor implements InterceptStrategy {
         private AtomicInteger counter = new AtomicInteger();
 
-        public Processor wrapProcessorInInterceptors(final CamelContext context, final ProcessorDefinition<?> definition,
+        public Processor wrapProcessorInInterceptors(final CamelContext context, final NamedNode definition,
                                                      final Processor target, final Processor nextTarget) throws Exception {
 
             return new Processor() {
diff --git a/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointPolicyTest.java b/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointPolicyTest.java
index f7076c9..9ce8153 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointPolicyTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointPolicyTest.java
@@ -20,10 +20,10 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.AsyncProcessor;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.JndiRegistry;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Policy;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.util.AsyncProcessorConverterHelper;
@@ -113,7 +113,7 @@ public class AsyncEndpointPolicyTest extends ContextTestSupport {
         }
 
         public void beforeWrap(RouteContext routeContext,
-                ProcessorDefinition<?> definition) {
+                               NamedNode definition) {
             // no need to modify the route
         }
 
diff --git a/camel-core/src/test/java/org/apache/camel/processor/intercept/ParentChildInterceptStrategyTest.java b/camel-core/src/test/java/org/apache/camel/processor/intercept/ParentChildInterceptStrategyTest.java
index d6cdd32..82e34ac 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/intercept/ParentChildInterceptStrategyTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/intercept/ParentChildInterceptStrategyTest.java
@@ -21,9 +21,11 @@ import java.util.List;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.model.ProcessorDefinition;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spi.InterceptStrategy;
 import org.junit.Test;
 
@@ -84,8 +86,9 @@ public class ParentChildInterceptStrategyTest extends ContextTestSupport {
     public static final class MyParentChildInterceptStrategy implements InterceptStrategy {
 
         @Override
-        public Processor wrapProcessorInInterceptors(final CamelContext context, final ProcessorDefinition<?> definition,
+        public Processor wrapProcessorInInterceptors(final CamelContext context, final NamedNode node,
                                                      final Processor target, final Processor nextTarget) throws Exception {
+            ProcessorDefinition<?> definition = (ProcessorDefinition<?>) node;
             String targetId = definition.hasCustomIdAssigned() ? definition.getId() : definition.getLabel();
             ProcessorDefinition<?> parent = definition.getParent();
             String parentId = "";
diff --git a/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorAsyncDelegateIssueTest.java b/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorAsyncDelegateIssueTest.java
index fa8404f..1068572 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorAsyncDelegateIssueTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorAsyncDelegateIssueTest.java
@@ -19,9 +19,9 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.processor.DelegateAsyncProcessor;
 import org.apache.camel.spi.InterceptStrategy;
 import org.junit.Before;
@@ -92,7 +92,7 @@ public class AuditInterceptorAsyncDelegateIssueTest extends ContextTestSupport {
     private static final class MyIntercepStrategy implements InterceptStrategy {
         private volatile boolean invoked;
 
-        public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition, Processor target, Processor nextTarget) throws Exception {
+        public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition, Processor target, Processor nextTarget) throws Exception {
             return new DelegateAsyncProcessor(target) {
                 public boolean process(Exchange exchange, AsyncCallback callback) {
                     invoked = true;
diff --git a/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorDelegateIssueTest.java b/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorDelegateIssueTest.java
index 9806598..ec75d79 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorDelegateIssueTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorDelegateIssueTest.java
@@ -18,9 +18,9 @@ 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.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.processor.DelegateProcessor;
 import org.apache.camel.spi.InterceptStrategy;
 import org.junit.Before;
@@ -91,7 +91,7 @@ public class AuditInterceptorDelegateIssueTest extends ContextTestSupport {
     private static final class MyIntercepStrategy implements InterceptStrategy {
         private volatile boolean invoked;
 
-        public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition, Processor target, Processor nextTarget) throws Exception {
+        public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition, Processor target, Processor nextTarget) throws Exception {
             return new DelegateProcessor(target) {
                 protected void processNext(Exchange exchange) throws Exception {
                     invoked = true;
diff --git a/camel-core/src/test/java/org/apache/camel/processor/interceptor/CustomInterceptorRouteWithChildOutputTest.java b/camel-core/src/test/java/org/apache/camel/processor/interceptor/CustomInterceptorRouteWithChildOutputTest.java
index db173db..0da42f0 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/interceptor/CustomInterceptorRouteWithChildOutputTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/interceptor/CustomInterceptorRouteWithChildOutputTest.java
@@ -21,10 +21,12 @@ import java.util.List;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.model.LogDefinition;
 import org.apache.camel.model.ProcessorDefinition;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.SplitDefinition;
 import org.apache.camel.model.ToDefinition;
 import org.apache.camel.spi.InterceptStrategy;
@@ -79,9 +81,9 @@ public class CustomInterceptorRouteWithChildOutputTest extends ContextTestSuppor
         private final List<ProcessorDefinition> defs = new ArrayList<>();
 
         @Override
-        public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition,
+        public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition,
                                                      Processor target, Processor nextTarget) throws Exception {
-            defs.add(definition);
+            defs.add((ProcessorDefinition<?>) definition);
             return target;
         }
 
diff --git a/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugExceptionBreakpointTest.java b/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugExceptionBreakpointTest.java
index 57d8041..5e4f03b 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugExceptionBreakpointTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugExceptionBreakpointTest.java
@@ -21,12 +21,12 @@ import java.util.List;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.BreakpointSupport;
 import org.apache.camel.impl.ConditionSupport;
 import org.apache.camel.impl.DefaultDebugger;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Breakpoint;
 import org.apache.camel.spi.Condition;
 import org.junit.Before;
@@ -49,7 +49,7 @@ public class DebugExceptionBreakpointTest extends ContextTestSupport {
 
         breakpoint = new BreakpointSupport() {
             @Override
-            public void afterProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition, long timeTaken) {
+            public void afterProcess(Exchange exchange, Processor processor, NamedNode definition, long timeTaken) {
                 Exception e = exchange.getException();
                 logs.add("Breakpoint at " + definition.getShortName() + " caused by: " + e.getClass().getSimpleName() + "[" + e.getMessage() + "]");
             }
@@ -57,7 +57,7 @@ public class DebugExceptionBreakpointTest extends ContextTestSupport {
 
         exceptionCondition = new ConditionSupport() {
             @Override
-            public boolean matchProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+            public boolean matchProcess(Exchange exchange, Processor processor, NamedNode definition) {
                 return exchange.getException() != null;
             }
         };
diff --git a/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugExceptionEventBreakpointTest.java b/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugExceptionEventBreakpointTest.java
index ba84119..18f11f7 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugExceptionEventBreakpointTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugExceptionEventBreakpointTest.java
@@ -22,13 +22,13 @@ import java.util.List;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.BreakpointSupport;
 import org.apache.camel.impl.ConditionSupport;
 import org.apache.camel.impl.DefaultDebugger;
 import org.apache.camel.management.event.AbstractExchangeEvent;
 import org.apache.camel.management.event.ExchangeFailedEvent;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Breakpoint;
 import org.apache.camel.spi.Condition;
 import org.junit.Before;
@@ -50,7 +50,7 @@ public class DebugExceptionEventBreakpointTest extends ContextTestSupport {
         super.setUp();
 
         breakpoint = new BreakpointSupport() {
-            public void onEvent(Exchange exchange, EventObject event, ProcessorDefinition<?> definition) {
+            public void onEvent(Exchange exchange, EventObject event, NamedNode definition) {
                 AbstractExchangeEvent aee = (AbstractExchangeEvent) event;
                 Exception e = aee.getExchange().getException();
                 logs.add("Breakpoint at " + definition + " caused by: " + e.getClass().getSimpleName() + "[" + e.getMessage() + "]");
diff --git a/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugSingleStepConditionTest.java b/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugSingleStepConditionTest.java
index 471580a..c3cd51e 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugSingleStepConditionTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugSingleStepConditionTest.java
@@ -21,12 +21,12 @@ import java.util.List;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.BreakpointSupport;
 import org.apache.camel.impl.ConditionSupport;
 import org.apache.camel.impl.DefaultDebugger;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Breakpoint;
 import org.apache.camel.spi.Condition;
 import org.junit.Before;
@@ -48,14 +48,14 @@ public class DebugSingleStepConditionTest extends ContextTestSupport {
         super.setUp();
 
         breakpoint = new BreakpointSupport() {
-            public void beforeProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+            public void beforeProcess(Exchange exchange, Processor processor, NamedNode definition) {
                 String body = exchange.getIn().getBody(String.class);
                 logs.add("Single stepping at " + definition.getLabel() + " with body: " + body);
             }
         };
 
         beerCondition = new ConditionSupport() {
-            public boolean matchProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+            public boolean matchProcess(Exchange exchange, Processor processor, NamedNode definition) {
                 return "beer".equals(exchange.getFromRouteId());
             }
         };
diff --git a/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugSingleStepTest.java b/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugSingleStepTest.java
index 4603d96..ebd6147 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugSingleStepTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugSingleStepTest.java
@@ -21,11 +21,11 @@ import java.util.List;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.BreakpointSupport;
 import org.apache.camel.impl.DefaultDebugger;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Breakpoint;
 import org.junit.Before;
 import org.junit.Test;
@@ -45,7 +45,7 @@ public class DebugSingleStepTest extends ContextTestSupport {
         super.setUp();
 
         breakpoint = new BreakpointSupport() {
-            public void beforeProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+            public void beforeProcess(Exchange exchange, Processor processor, NamedNode definition) {
                 String body = exchange.getIn().getBody(String.class);
                 logs.add("Single stepping at " + definition.getLabel() + " with body: " + body);
             }
diff --git a/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugTest.java b/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugTest.java
index f305181..ce13f37 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugTest.java
@@ -22,13 +22,13 @@ import java.util.List;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.BreakpointSupport;
 import org.apache.camel.impl.ConditionSupport;
 import org.apache.camel.impl.DefaultDebugger;
 import org.apache.camel.management.event.ExchangeCompletedEvent;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.ToDefinition;
 import org.apache.camel.spi.Breakpoint;
 import org.apache.camel.spi.Condition;
@@ -53,25 +53,25 @@ public class DebugTest extends ContextTestSupport {
         super.setUp();
 
         breakpoint = new BreakpointSupport() {
-            public void beforeProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+            public void beforeProcess(Exchange exchange, Processor processor, NamedNode definition) {
                 String body = exchange.getIn().getBody(String.class);
                 logs.add("Breakpoint at " + definition + " with body: " + body);
             }
 
-            public void onEvent(Exchange exchange, EventObject event, ProcessorDefinition<?> definition) {
+            public void onEvent(Exchange exchange, EventObject event, NamedNode definition) {
                 String body = exchange.getIn().getBody(String.class);
                 logs.add("Breakpoint event " + event.getClass().getSimpleName() + " with body: " + body);
             }
         };
 
         camelCondition = new ConditionSupport() {
-            public boolean matchProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+            public boolean matchProcess(Exchange exchange, Processor processor, NamedNode definition) {
                 return body().contains("Camel").matches(exchange);
             }
         };
 
         mockCondition = new ConditionSupport() {
-            public boolean matchProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+            public boolean matchProcess(Exchange exchange, Processor processor, NamedNode definition) {
                 // match when sending to mocks
                 if (definition instanceof ToDefinition) {
                     ToDefinition to = (ToDefinition) definition;
diff --git a/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyNotOrderedTest.java b/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyNotOrderedTest.java
index f1bf522..5460cc6 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyNotOrderedTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyNotOrderedTest.java
@@ -19,9 +19,9 @@ 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.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.InterceptStrategy;
 import org.junit.Test;
 
@@ -56,7 +56,7 @@ public class InterceptorStrategyNotOrderedTest extends ContextTestSupport {
 
     private static class FooInterceptStrategy implements InterceptStrategy {
 
-        public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition, final Processor target, Processor nextTarget) throws Exception {
+        public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition, final Processor target, Processor nextTarget) throws Exception {
             Processor answer = new Processor() {
                 public void process(Exchange exchange) throws Exception {
                     String order = exchange.getIn().getHeader("order", "", String.class);
@@ -73,7 +73,7 @@ public class InterceptorStrategyNotOrderedTest extends ContextTestSupport {
 
     private static class BarInterceptStrategy implements InterceptStrategy {
 
-        public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition, final Processor target, Processor nextTarget) throws Exception {
+        public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition, final Processor target, Processor nextTarget) throws Exception {
             Processor answer = new Processor() {
                 public void process(Exchange exchange) throws Exception {
                     String order = exchange.getIn().getHeader("order", "", String.class);
diff --git a/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyOrderedTest.java b/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyOrderedTest.java
index d581a07..d48a205 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyOrderedTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyOrderedTest.java
@@ -19,10 +19,10 @@ 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.NamedNode;
 import org.apache.camel.Ordered;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.InterceptStrategy;
 import org.junit.Test;
 
@@ -57,7 +57,7 @@ public class InterceptorStrategyOrderedTest extends ContextTestSupport {
 
     public static class FooInterceptStrategy implements InterceptStrategy, Ordered {
 
-        public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition, final Processor target, Processor nextTarget) throws Exception {
+        public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition, final Processor target, Processor nextTarget) throws Exception {
             Processor answer = new Processor() {
                 public void process(Exchange exchange) throws Exception {
                     String order = exchange.getIn().getHeader("order", "", String.class);
@@ -77,7 +77,7 @@ public class InterceptorStrategyOrderedTest extends ContextTestSupport {
 
     public static class BarInterceptStrategy implements InterceptStrategy, Ordered {
 
-        public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition, final Processor target, Processor nextTarget) throws Exception {
+        public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition, final Processor target, Processor nextTarget) throws Exception {
             Processor answer = new Processor() {
                 public void process(Exchange exchange) throws Exception {
                     String order = exchange.getIn().getHeader("order", "", String.class);
diff --git a/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/EIPTracingStrategy.java b/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/EIPTracingStrategy.java
index d019fea..419e53b 100644
--- a/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/EIPTracingStrategy.java
+++ b/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/EIPTracingStrategy.java
@@ -21,8 +21,8 @@ import com.amazonaws.xray.AWSXRay;
 import com.amazonaws.xray.entities.Subsegment;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.processor.DelegateAsyncProcessor;
 import org.apache.camel.spi.InterceptStrategy;
 import org.slf4j.Logger;
@@ -36,7 +36,7 @@ public class EIPTracingStrategy implements InterceptStrategy {
 
     @Override
     public Processor wrapProcessorInInterceptors(CamelContext camelContext,
-        ProcessorDefinition<?> processorDefinition, Processor target, Processor nextTarget)
+                                                 NamedNode processorDefinition, Processor target, Processor nextTarget)
         throws Exception {
 
         String defName = processorDefinition.getShortName();
diff --git a/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/NoopTracingStrategy.java b/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/NoopTracingStrategy.java
index 90f5b9c..060e499 100644
--- a/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/NoopTracingStrategy.java
+++ b/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/NoopTracingStrategy.java
@@ -17,15 +17,15 @@
 package org.apache.camel.component.aws.xray;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.processor.DelegateAsyncProcessor;
 import org.apache.camel.spi.InterceptStrategy;
 
 public class NoopTracingStrategy implements InterceptStrategy {
 
     @Override
-    public Processor wrapProcessorInInterceptors(CamelContext camelContext, ProcessorDefinition<?> processorDefinition,
+    public Processor wrapProcessorInInterceptors(CamelContext camelContext, NamedNode processorDefinition,
                                                  Processor target, Processor nextTarget) throws Exception {
         return new DelegateAsyncProcessor(target);
     }
diff --git a/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/TraceAnnotatedTracingStrategy.java b/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/TraceAnnotatedTracingStrategy.java
index 679c394..32538e6 100644
--- a/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/TraceAnnotatedTracingStrategy.java
+++ b/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/TraceAnnotatedTracingStrategy.java
@@ -22,11 +22,11 @@ import com.amazonaws.xray.AWSXRay;
 import com.amazonaws.xray.entities.Subsegment;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.component.bean.BeanProcessor;
 import org.apache.camel.model.BeanDefinition;
 import org.apache.camel.model.ProcessDefinition;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.processor.DelegateAsyncProcessor;
 import org.apache.camel.processor.DelegateSyncProcessor;
 import org.apache.camel.spi.InterceptStrategy;
@@ -41,8 +41,8 @@ public class TraceAnnotatedTracingStrategy implements InterceptStrategy {
 
     @Override
     public Processor wrapProcessorInInterceptors(CamelContext camelContext,
-        ProcessorDefinition<?> processorDefinition,
-        Processor target, Processor nextTarget)
+                                                 NamedNode processorDefinition,
+                                                 Processor target, Processor nextTarget)
         throws Exception {
 
         Class<?> processorClass = processorDefinition.getClass();
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 9915778..1f3d3a2 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
@@ -37,11 +37,11 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Route;
 import org.apache.camel.StaticService;
 import org.apache.camel.management.event.ExchangeSendingEvent;
 import org.apache.camel.management.event.ExchangeSentEvent;
-import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spi.InterceptStrategy;
 import org.apache.camel.spi.RoutePolicy;
 import org.apache.camel.spi.RoutePolicyFactory;
@@ -113,7 +113,7 @@ public class XRayTracer extends ServiceSupport implements RoutePolicyFactory, St
     }
 
     @Override
-    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition route) {
+    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode route) {
         init(camelContext);
         return new XRayRoutePolicy(routeId);
     }
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
index 0818242..8830514 100644
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
@@ -453,7 +453,7 @@ public class CdiCamelExtension implements Extension {
                 if (route instanceof RoutesBuilder) {
                     context.addRoutes((RoutesBuilder) route);
                 } else if (route instanceof RouteContainer) {
-                    context.addRouteDefinitions(((RouteContainer) route).getRoutes());
+                    context.adapt(ModelCamelContext.class).addRouteDefinitions(((RouteContainer) route).getRoutes());
                 } else {
                     throw new IllegalArgumentException(
                         "Invalid routes type [" + routeBean.getBeanClass().getName() + "], "
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/transaction/JtaTransactionPolicy.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/transaction/JtaTransactionPolicy.java
index f65c4be..9fbd0a4 100644
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/transaction/JtaTransactionPolicy.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/transaction/JtaTransactionPolicy.java
@@ -19,11 +19,13 @@ package org.apache.camel.cdi.transaction;
 import javax.annotation.Resource;
 import javax.transaction.TransactionManager;
 
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.model.ProcessorDefinition;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.spi.TransactedPolicy;
 import org.apache.camel.util.ObjectHelper;
@@ -49,12 +51,12 @@ public abstract class JtaTransactionPolicy implements TransactedPolicy {
     protected TransactionManager transactionManager;
 
     @Override
-    public void beforeWrap(RouteContext routeContext, ProcessorDefinition<?> definition) {
+    public void beforeWrap(RouteContext routeContext, NamedNode definition) {
         // do not inherit since we create our own
         // (otherwise the default error handler would be used two times
         // because we inherit it on our own but only in case of a
         // non-transactional error handler)
-        definition.setInheritErrorHandler(false);
+        ((ProcessorDefinition<?>) definition).setInheritErrorHandler(false);
     }
 
     public abstract void run(Runnable runnable) throws Throwable;
@@ -74,7 +76,8 @@ public abstract class JtaTransactionPolicy implements TransactedPolicy {
         // we only need one transacted error handler
 
         // find the existing error handler builder
-        ErrorHandlerBuilder builder = (ErrorHandlerBuilder) routeContext.getRoute().getErrorHandlerBuilder();
+        RouteDefinition route = (RouteDefinition) routeContext.getRoute();
+        ErrorHandlerBuilder builder = (ErrorHandlerBuilder) route.getErrorHandlerBuilder();
 
         // check if its a ref if so then do a lookup
         if (builder instanceof ErrorHandlerBuilderRef) {
@@ -118,7 +121,7 @@ public abstract class JtaTransactionPolicy implements TransactedPolicy {
         txBuilder.configure(routeContext, answer);
 
         // set the route to use our transacted error handler builder
-        routeContext.getRoute().setErrorHandlerBuilder(txBuilder);
+        route.setErrorHandlerBuilder(txBuilder);
 
         // return with wrapped transacted error handler
         return answer;
diff --git a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/EhcacheConfiguration.java b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/EhcacheConfiguration.java
index 4cc043c..fb71bf0 100644
--- a/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/EhcacheConfiguration.java
+++ b/components/camel-ehcache/src/main/java/org/apache/camel/component/ehcache/EhcacheConfiguration.java
@@ -26,6 +26,7 @@ import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriParams;
 import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.function.ThrowingHelper;
 import org.ehcache.CacheManager;
 import org.ehcache.config.CacheConfiguration;
 import org.ehcache.config.Configuration;
@@ -235,7 +236,7 @@ public class EhcacheConfiguration implements Cloneable {
     }
 
     public boolean hasConfiguration(String name) {
-        return ObjectHelper.applyIfNotEmpty(configurations, c -> c.containsKey(name), () -> false);
+        return ThrowingHelper.applyIfNotEmpty(configurations, c -> c.containsKey(name), () -> false);
     }
 
     /**
diff --git a/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/policy/InfinispanRoutePolicy.java b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/policy/InfinispanRoutePolicy.java
index a4963cd..331b1bd 100644
--- a/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/policy/InfinispanRoutePolicy.java
+++ b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/policy/InfinispanRoutePolicy.java
@@ -33,6 +33,7 @@ import org.apache.camel.api.management.ManagedResource;
 import org.apache.camel.component.infinispan.InfinispanConfiguration;
 import org.apache.camel.component.infinispan.InfinispanManager;
 import org.apache.camel.component.infinispan.InfinispanUtil;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.support.RoutePolicySupport;
 import org.apache.camel.support.ServiceSupport;
 import org.apache.camel.util.ObjectHelper;
@@ -112,7 +113,8 @@ public class InfinispanRoutePolicy extends RoutePolicySupport implements CamelCo
         super.onInit(route);
 
         LOGGER.info("Route managed by {}. Setting route {} AutoStartup flag to false.", getClass(), route.getId());
-        route.getRouteContext().getRoute().setAutoStartup("false");
+        RouteDefinition definition = (RouteDefinition) route.getRouteContext().getRoute();
+        definition.setAutoStartup("false");
 
         stoppeddRoutes.add(route);
 
diff --git a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringDifferTest.java b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringDifferTest.java
index f9de30a..712d383 100644
--- a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringDifferTest.java
+++ b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringDifferTest.java
@@ -37,19 +37,19 @@ public class CamelJmxConsumerObserveAttributeMatchStringDifferTest extends Camel
         getMockEndpoint("mock:result").message(0).body().contains("<attributeName>Tracing</attributeName>");
 
         // change the attribute so JMX triggers but should be filtered
-        ManagedRouteMBean mr = context.getManagedRoute("foo", ManagedRouteMBean.class);
+        ManagedRouteMBean mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
         mr.setStatisticsEnabled(true);
 
         // change the attribute so JMX triggers
-        mr = context.getManagedRoute("foo", ManagedRouteMBean.class);
+        mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
         mr.setTracing(true);
 
         // change the attribute so JMX triggers
-        mr = context.getManagedRoute("foo", ManagedRouteMBean.class);
+        mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
         mr.setTracing(false);
 
         // change the attribute so JMX triggers
-        mr = context.getManagedRoute("foo", ManagedRouteMBean.class);
+        mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
         mr.setTracing(true);
 
         assertMockEndpointsSatisfied();
diff --git a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringTest.java b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringTest.java
index 2449ef7..b25ba88 100644
--- a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringTest.java
+++ b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringTest.java
@@ -37,19 +37,19 @@ public class CamelJmxConsumerObserveAttributeMatchStringTest extends CamelTestSu
         getMockEndpoint("mock:result").message(0).body().contains("<attributeName>Tracing</attributeName>");
 
         // change the attribute so JMX triggers but should be filtered
-        ManagedRouteMBean mr = context.getManagedRoute("foo", ManagedRouteMBean.class);
+        ManagedRouteMBean mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
         mr.setStatisticsEnabled(true);
 
         // change the attribute so JMX triggers
-        mr = context.getManagedRoute("foo", ManagedRouteMBean.class);
+        mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
         mr.setTracing(true);
 
         // change the attribute so JMX triggers
-        mr = context.getManagedRoute("foo", ManagedRouteMBean.class);
+        mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
         mr.setTracing(false);
 
         // change the attribute so JMX triggers
-        mr = context.getManagedRoute("foo", ManagedRouteMBean.class);
+        mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
         mr.setTracing(true);
 
         assertMockEndpointsSatisfied();
diff --git a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeTest.java b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeTest.java
index b922d73..2d39942 100644
--- a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeTest.java
+++ b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeTest.java
@@ -37,11 +37,11 @@ public class CamelJmxConsumerObserveAttributeTest extends CamelTestSupport {
         getMockEndpoint("mock:result").message(0).body().contains("<attributeName>Tracing</attributeName>");
 
         // change the attribute so JMX triggers but should be filtered
-        ManagedRouteMBean mr = context.getManagedRoute("foo", ManagedRouteMBean.class);
+        ManagedRouteMBean mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
         mr.setStatisticsEnabled(true);
 
         // change the attribute so JMX triggers
-        mr = context.getManagedRoute("foo", ManagedRouteMBean.class);
+        mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
         mr.setTracing(true);
 
         assertMockEndpointsSatisfied();
diff --git a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerTest.java b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerTest.java
index 252c86d..da283a6 100644
--- a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerTest.java
+++ b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerTest.java
@@ -36,7 +36,7 @@ public class CamelJmxConsumerTest extends CamelTestSupport {
         getMockEndpoint("mock:result").message(0).body().contains("<newValue>true</newValue>");
 
         // change the attribute so JMX triggers
-        ManagedRouteMBean mr = context.getManagedRoute("foo", ManagedRouteMBean.class);
+        ManagedRouteMBean mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
         mr.setTracing(true);
 
         assertMockEndpointsSatisfied();
diff --git a/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicyFactory.java b/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicyFactory.java
index d4ad80d..56a199e 100644
--- a/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicyFactory.java
+++ b/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicyFactory.java
@@ -20,7 +20,7 @@ import java.util.concurrent.TimeUnit;
 
 import com.codahale.metrics.MetricRegistry;
 import org.apache.camel.CamelContext;
-import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.NamedNode;
 import org.apache.camel.spi.RoutePolicy;
 import org.apache.camel.spi.RoutePolicyFactory;
 
@@ -105,7 +105,7 @@ public class MetricsRoutePolicyFactory implements RoutePolicyFactory {
     }
 
     @Override
-    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition routeDefinition) {
+    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode routeDefinition) {
         MetricsRoutePolicy answer = new MetricsRoutePolicy();
         answer.setMetricsRegistry(getMetricsRegistry());
         answer.setUseJmx(isUseJmx());
diff --git a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyFactory.java b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyFactory.java
index ae3cb4e..646f1c7 100644
--- a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyFactory.java
+++ b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyFactory.java
@@ -19,7 +19,7 @@ package org.apache.camel.component.micrometer.routepolicy;
 import java.util.concurrent.TimeUnit;
 import io.micrometer.core.instrument.MeterRegistry;
 import org.apache.camel.CamelContext;
-import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.NamedNode;
 import org.apache.camel.spi.RoutePolicy;
 import org.apache.camel.spi.RoutePolicyFactory;
 
@@ -80,7 +80,7 @@ public class MicrometerRoutePolicyFactory implements RoutePolicyFactory {
     }
 
     @Override
-    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition routeDefinition) {
+    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode routeDefinition) {
         MicrometerRoutePolicy answer = new MicrometerRoutePolicy();
         answer.setMeterRegistry(getMeterRegistry());
         answer.setPrettyPrint(isPrettyPrint());
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 3706377..9c1454c 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
@@ -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.NamedNode;
 import org.apache.camel.Route;
 import org.apache.camel.StaticService;
 import org.apache.camel.api.management.ManagedResource;
@@ -96,7 +97,7 @@ public class OpenTracingTracer extends ServiceSupport implements RoutePolicyFact
     }
 
     @Override
-    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition route) {
+    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode route) {
         // ensure this opentracing tracer gets initialized when Camel starts
         init(camelContext);
         return new OpenTracingRoutePolicy(routeId);
diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/SpanDecorator.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/SpanDecorator.java
index e94e318..cb14eb7 100644
--- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/SpanDecorator.java
+++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/SpanDecorator.java
@@ -107,8 +107,8 @@ public interface SpanDecorator {
      * This method returns the map to be used for headers extraction
      * when the component is receiving a communication.
      *
-     * @param a map containing the objects
-     * @param whether the headers are encoded
+     * @param map a map containing the objects
+     * @param encoding whether the headers are encoded
      * @return The extraction map
      */
     TextMap getExtractAdapter(Map<String, Object> map, boolean encoding);
@@ -117,8 +117,8 @@ public interface SpanDecorator {
      * This method returns the map to be used for headers injection
      *  when the component is receiving a communication.
      *
-     * @param a map containing the objects
-     * @param whether the headers are encoded
+     * @param map a map containing the objects
+     * @param encoding whether the headers are encoded
      * @return The injection map
      */
     TextMap getInjectAdapter(Map<String, Object> map, boolean encoding);
diff --git a/components/camel-quartz2/src/test/java/org/apache/camel/component/quartz2/QuartzNameCollisionTest.java b/components/camel-quartz2/src/test/java/org/apache/camel/component/quartz2/QuartzNameCollisionTest.java
index 7444b2b..d260a57 100644
--- a/components/camel-quartz2/src/test/java/org/apache/camel/component/quartz2/QuartzNameCollisionTest.java
+++ b/components/camel-quartz2/src/test/java/org/apache/camel/component/quartz2/QuartzNameCollisionTest.java
@@ -167,7 +167,7 @@ public class QuartzNameCollisionTest {
         Trigger trigger = scheduler.getTrigger(triggerKey);
         Assert.assertNotNull(trigger);
 
-        camel1.stopRoute("route-1");
+        camel1.getRouteController().stopRoute("route-1");
 
         Trigger.TriggerState triggerState = component.getScheduler().getTriggerState(triggerKey);
         Assert.assertNotNull(trigger);
diff --git a/components/camel-shiro/src/main/java/org/apache/camel/component/shiro/security/ShiroSecurityPolicy.java b/components/camel-shiro/src/main/java/org/apache/camel/component/shiro/security/ShiroSecurityPolicy.java
index 284a73d..3bfde0f 100644
--- a/components/camel-shiro/src/main/java/org/apache/camel/component/shiro/security/ShiroSecurityPolicy.java
+++ b/components/camel-shiro/src/main/java/org/apache/camel/component/shiro/security/ShiroSecurityPolicy.java
@@ -19,8 +19,8 @@ package org.apache.camel.component.shiro.security;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.AuthorizationPolicy;
 import org.apache.camel.spi.RouteContext;
 import org.apache.shiro.SecurityUtils;
@@ -104,7 +104,7 @@ public class ShiroSecurityPolicy implements AuthorizationPolicy {
         this.setPermissionsList(permissionsList);
     }
 
-    public void beforeWrap(RouteContext routeContext, ProcessorDefinition<?> definition) {  
+    public void beforeWrap(RouteContext routeContext, NamedNode definition) {
         // noop
     }
     
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpoint.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpoint.java
index d20e53c..8f08d3b 100644
--- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpoint.java
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpoint.java
@@ -33,6 +33,7 @@ import org.apache.camel.Route;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.StatefulService;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
+import org.apache.camel.management.ManagedCamelContext;
 import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RouteDefinition;
@@ -160,7 +161,7 @@ public class CamelRoutesEndpoint {
 
     private void resetRoute(String id) {
         try {
-            ManagedRouteMBean managedRouteMBean = camelContext.getManagedRoute(id, ManagedRouteMBean.class);
+            ManagedRouteMBean managedRouteMBean = camelContext.adapt(ManagedCamelContext.class).getManagedRoute(id, ManagedRouteMBean.class);
             if (managedRouteMBean != null) {
                 managedRouteMBean.reset(true);
             }
@@ -284,7 +285,7 @@ public class CamelRoutesEndpoint {
             super(route);
 
             if (camelContext.getManagementStrategy().getManagementAgent() != null) {
-                this.routeDetails = new RouteDetails(camelContext.getManagedRoute(route.getId(), ManagedRouteMBean.class));
+                this.routeDetails = new RouteDetails(camelContext.adapt(ManagedCamelContext.class).getManagedRoute(route.getId(), ManagedRouteMBean.class));
             }
         }
 
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/model/RouteDetailsInfo.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/model/RouteDetailsInfo.java
index 9f668c0..a7a51fe 100644
--- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/model/RouteDetailsInfo.java
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/model/RouteDetailsInfo.java
@@ -35,7 +35,7 @@ public class RouteDetailsInfo extends RouteInfo {
         super(route);
 
         if (camelContext.getManagementStrategy().getManagementAgent() != null) {
-            this.routeDetails = new RouteDetails(camelContext.getManagedRoute(route.getId(), ManagedRouteMBean.class));
+            this.routeDetails = new RouteDetails(camelContext.adapt(ManagedCamelContext.class).getManagedRoute(route.getId(), ManagedRouteMBean.class));
         }
     }
 
diff --git a/components/camel-spring-security/src/main/java/org/apache/camel/component/spring/security/SpringSecurityAuthorizationPolicy.java b/components/camel-spring-security/src/main/java/org/apache/camel/component/spring/security/SpringSecurityAuthorizationPolicy.java
index 20cd09f..81c1f97 100644
--- a/components/camel-spring-security/src/main/java/org/apache/camel/component/spring/security/SpringSecurityAuthorizationPolicy.java
+++ b/components/camel-spring-security/src/main/java/org/apache/camel/component/spring/security/SpringSecurityAuthorizationPolicy.java
@@ -23,9 +23,9 @@ import javax.security.auth.Subject;
 import org.apache.camel.CamelAuthorizationException;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.model.IdentifiedType;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.processor.DelegateProcessor;
 import org.apache.camel.spi.AuthorizationPolicy;
 import org.apache.camel.spi.RouteContext;
@@ -55,7 +55,7 @@ public class SpringSecurityAuthorizationPolicy extends IdentifiedType implements
     private boolean alwaysReauthenticate;
     private boolean useThreadSecurityContext = true;
 
-    public void beforeWrap(RouteContext routeContext, ProcessorDefinition<?> definition) {
+    public void beforeWrap(RouteContext routeContext, NamedNode definition) {
     }
 
     public Processor wrap(RouteContext routeContext, Processor processor) {
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java
index a776c68..1fe5815 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java
@@ -16,10 +16,11 @@
  */
 package org.apache.camel.spring.spi;
 
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
-import org.apache.camel.model.ProcessorDefinition;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.spi.TransactedPolicy;
 import org.apache.camel.util.ObjectHelper;
@@ -53,7 +54,7 @@ public class SpringTransactionPolicy implements TransactedPolicy {
         this.transactionManager = transactionManager;
     }
 
-    public void beforeWrap(RouteContext routeContext, ProcessorDefinition<?> definition) {
+    public void beforeWrap(RouteContext routeContext, NamedNode definition) {
     }
 
     public Processor wrap(RouteContext routeContext, Processor processor) {
@@ -66,7 +67,8 @@ public class SpringTransactionPolicy implements TransactedPolicy {
         // if we should not support this we do not need to wrap the processor as we only need one transacted error handler
 
         // find the existing error handler builder
-        ErrorHandlerBuilder builder = (ErrorHandlerBuilder)routeContext.getRoute().getErrorHandlerBuilder();
+        RouteDefinition route = (RouteDefinition) routeContext.getRoute();
+        ErrorHandlerBuilder builder = (ErrorHandlerBuilder) route.getErrorHandlerBuilder();
 
         // check if its a ref if so then do a lookup
         if (builder instanceof ErrorHandlerBuilderRef) {
@@ -111,7 +113,7 @@ public class SpringTransactionPolicy implements TransactedPolicy {
             txBuilder.configure(routeContext, answer);
 
             // set the route to use our transacted error handler builder
-            routeContext.getRoute().setErrorHandlerBuilder(txBuilder);
+            route.setErrorHandlerBuilder(txBuilder);
         }
 
         // return with wrapped transacted error handler
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/CamelLoadRoutesFromXMLTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/CamelLoadRoutesFromXMLTest.java
index 702b378..d91d1f6 100644
--- a/components/camel-spring/src/test/java/org/apache/camel/spring/CamelLoadRoutesFromXMLTest.java
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/CamelLoadRoutesFromXMLTest.java
@@ -45,8 +45,8 @@ public class CamelLoadRoutesFromXMLTest extends SpringTestSupport {
         assertEquals(2, camel.getRoutes().size());
 
         // they should be started
-        assertTrue(camel.getRouteStatus("foo").isStarted());
-        assertTrue(camel.getRouteStatus("bar").isStarted());
+        assertTrue(camel.getRouteController().getRouteStatus("foo").isStarted());
+        assertTrue(camel.getRouteController().getRouteStatus("bar").isStarted());
 
         // and they should work
         MockEndpoint foo = camel.getEndpoint("mock:foo", MockEndpoint.class);
@@ -65,14 +65,14 @@ public class CamelLoadRoutesFromXMLTest extends SpringTestSupport {
         camel.removeRouteDefinitions(routes.getRoutes());
 
         // they should be removed
-        assertNull(camel.getRouteStatus("foo"));
-        assertNull(camel.getRouteStatus("bar"));
+        assertNull(camel.getRouteController().getRouteStatus("foo"));
+        assertNull(camel.getRouteController().getRouteStatus("bar"));
 
         // you can also do this manually via their route ids
-        //camel.stopRoute("foo");
-        //camel.removeRoute("foo");
-        //camel.stopRoute("bar");
-        //camel.removeRoute("bar");
+        //camel.getRouteController().stopRoute("foo");
+        //camel.getRouteController().removeRoute("foo");
+        //camel.getRouteController().stopRoute("bar");
+        //camel.getRouteController().removeRoute("bar");
 
         // load updated xml
         is = this.getClass().getResourceAsStream("myUpdatedRoutes.xml");
@@ -82,8 +82,8 @@ public class CamelLoadRoutesFromXMLTest extends SpringTestSupport {
         assertEquals(2, camel.getRoutes().size());
 
         // they should be started
-        assertTrue(camel.getRouteStatus("foo").isStarted());
-        assertTrue(camel.getRouteStatus("bar").isStarted());
+        assertTrue(camel.getRouteController().getRouteStatus("foo").isStarted());
+        assertTrue(camel.getRouteController().getRouteStatus("bar").isStarted());
 
         // and they should work again (need to get new mock endpoint as the old is gone)
         foo = camel.getEndpoint("mock:foo", MockEndpoint.class);
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/config/CamelContextAutoStartupTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/config/CamelContextAutoStartupTest.java
index 19bdb04..c3847bf 100644
--- a/components/camel-spring/src/test/java/org/apache/camel/spring/config/CamelContextAutoStartupTest.java
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/config/CamelContextAutoStartupTest.java
@@ -42,14 +42,14 @@ public class CamelContextAutoStartupTest extends Assert {
         assertEquals(Boolean.FALSE, camel.isAutoStartup());
         assertEquals(1, camel.getRoutes().size());
 
-        assertEquals(false, camel.getRouteStatus("foo").isStarted());
+        assertEquals(false, camel.getRouteController().getRouteStatus("foo").isStarted());
 
         // now starting route manually
         camel.startRoute("foo");
 
         assertEquals(Boolean.FALSE, camel.isAutoStartup());
         assertEquals(1, camel.getRoutes().size());
-        assertEquals(true, camel.getRouteStatus("foo").isStarted());
+        assertEquals(true, camel.getRouteController().getRouteStatus("foo").isStarted());
 
         // and now we can send a message to the route and see that it works
         MockEndpoint mock = camel.getEndpoint("mock:result", MockEndpoint.class);
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/config/RouteAutoStartupPropertiesTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/config/RouteAutoStartupPropertiesTest.java
index 8b0a34b..6a675ce 100644
--- a/components/camel-spring/src/test/java/org/apache/camel/spring/config/RouteAutoStartupPropertiesTest.java
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/config/RouteAutoStartupPropertiesTest.java
@@ -38,11 +38,11 @@ public class RouteAutoStartupPropertiesTest extends Assert {
 
         SpringCamelContext camel = ac.getBeansOfType(SpringCamelContext.class).values().iterator().next();
 
-        assertEquals(false, camel.getRouteStatus("foo").isStarted());
+        assertEquals(false, camel.getRouteController().getRouteStatus("foo").isStarted());
 
         // now starting route manually
         camel.startRoute("foo");
-        assertEquals(true, camel.getRouteStatus("foo").isStarted());
+        assertEquals(true, camel.getRouteController().getRouteStatus("foo").isStarted());
 
         // and now we can send a message to the route and see that it works
         MockEndpoint mock = camel.getEndpoint("mock:result", MockEndpoint.class);
@@ -62,7 +62,7 @@ public class RouteAutoStartupPropertiesTest extends Assert {
 
         SpringCamelContext camel = ac.getBeansOfType(SpringCamelContext.class).values().iterator().next();
 
-        assertEquals(true, camel.getRouteStatus("bar").isStarted());
+        assertEquals(true, camel.getRouteController().getRouteStatus("bar").isStarted());
 
         // and now we can send a message to the route and see that it works
         MockEndpoint mock = camel.getEndpoint("mock:result", MockEndpoint.class);
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/ContainerWideInterceptor.java b/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/ContainerWideInterceptor.java
index 664c8d9..ed0c963 100644
--- a/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/ContainerWideInterceptor.java
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/ContainerWideInterceptor.java
@@ -18,8 +18,8 @@ package org.apache.camel.spring.interceptor;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.InterceptStrategy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,7 +33,7 @@ public class ContainerWideInterceptor implements InterceptStrategy {
     private static final Logger LOG = LoggerFactory.getLogger(ContainerWideInterceptor.class);
     private static int count;
 
-    public Processor wrapProcessorInInterceptors(final CamelContext context, final ProcessorDefinition<?> definition,
+    public Processor wrapProcessorInInterceptors(final CamelContext context, final NamedNode definition,
                                                  final Processor target, final Processor nextTarget) throws Exception {
 
         // as this is based on an unit test we are a bit lazy and just create an inlined processor
diff --git a/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/RouteCoverageDumper.java b/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/RouteCoverageDumper.java
index 8aefbff..b4ba2fb 100644
--- a/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/RouteCoverageDumper.java
+++ b/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/RouteCoverageDumper.java
@@ -24,6 +24,7 @@ import java.io.OutputStream;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.api.management.mbean.ManagedCamelContextMBean;
+import org.apache.camel.management.ManagedCamelContext;
 import org.apache.camel.util.IOHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -43,7 +44,7 @@ public final class RouteCoverageDumper {
             String dir = "target/camel-route-coverage";
             String name = testClassName + "-" + testName + ".xml";
 
-            ManagedCamelContextMBean managedCamelContext = context.getManagedCamelContext();
+            ManagedCamelContextMBean managedCamelContext = context.adapt(ManagedCamelContext.class).getManagedCamelContext();
             if (managedCamelContext == null) {
                 LOG.warn("Cannot dump route coverage to file as JMX is not enabled. Override useJmx() method to enable JMX in the unit test classes.");
             } else {
diff --git a/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringRunnerProvidesBreakpointTest.java b/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringRunnerProvidesBreakpointTest.java
index 5bd8bc3..e57f74a 100644
--- a/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringRunnerProvidesBreakpointTest.java
+++ b/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringRunnerProvidesBreakpointTest.java
@@ -17,9 +17,9 @@
 package org.apache.camel.test.spring;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.impl.BreakpointSupport;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Breakpoint;
 
 import org.junit.Test;
@@ -56,7 +56,7 @@ public class CamelSpringRunnerProvidesBreakpointTest
         private boolean breakpointHit;
 
         @Override
-        public void beforeProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
+        public void beforeProcess(Exchange exchange, Processor processor, NamedNode definition) {
             breakpointHit = 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 293f666..581a7c6 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
@@ -52,6 +52,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.FluentProducerTemplate;
 import org.apache.camel.Message;
+import org.apache.camel.NamedNode;
 import org.apache.camel.NoSuchEndpointException;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
@@ -74,8 +75,10 @@ import org.apache.camel.impl.DefaultDebugger;
 import org.apache.camel.impl.InterceptSendToMockEndpointStrategy;
 import org.apache.camel.impl.JndiRegistry;
 import org.apache.camel.management.JmxSystemPropertyKeys;
+import org.apache.camel.management.ManagedCamelContext;
 import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.ProcessorDefinition;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spi.Language;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.StopWatch;
@@ -429,7 +432,7 @@ public abstract class CamelTestSupport extends TestSupport {
             String dir = "target/camel-route-coverage";
             String name = className + "-" + getTestMethodName() + ".xml";
 
-            ManagedCamelContextMBean managedCamelContext = context != null ? context.getManagedCamelContext() : null;
+            ManagedCamelContextMBean managedCamelContext = context != null ? context.adapt(ManagedCamelContext.class).getManagedCamelContext() : null;
             if (managedCamelContext == null) {
                 log.warn("Cannot dump route coverage to file as JMX is not enabled. Override useJmx() method to enable JMX in the unit test classes.");
             } else {
@@ -525,7 +528,7 @@ public abstract class CamelTestSupport extends TestSupport {
 
         // log processor coverage for each route
         for (Route route : context.getRoutes()) {
-            ManagedRouteMBean managedRoute = context.getManagedRoute(route.getId(), ManagedRouteMBean.class);
+            ManagedRouteMBean managedRoute = context.adapt(ManagedCamelContext.class).getManagedRoute(route.getId(), ManagedRouteMBean.class);
             if (managedRoute.getExchangesTotal() == 0) {
                 uncoveredRoutes.add(route.getId());
             }
@@ -577,7 +580,7 @@ public abstract class CamelTestSupport extends TestSupport {
             String name = objectName.getKeyProperty("name");
             name = ObjectName.unquote(name);
 
-            ManagedProcessorMBean managedProcessor = context.getManagedProcessor(name, ManagedProcessorMBean.class);
+            ManagedProcessorMBean managedProcessor = context.adapt(ManagedCamelContext.class).getManagedProcessor(name, ManagedProcessorMBean.class);
 
             if (managedProcessor != null) {
                 if (processorsForRoute.get(routeId) == null) {
@@ -1022,13 +1025,13 @@ public abstract class CamelTestSupport extends TestSupport {
     private class DebugBreakpoint extends BreakpointSupport {
 
         @Override
-        public void beforeProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition) {
-            CamelTestSupport.this.debugBefore(exchange, processor, definition, definition.getId(), definition.getLabel());
+        public void beforeProcess(Exchange exchange, Processor processor, NamedNode definition) {
+            CamelTestSupport.this.debugBefore(exchange, processor, (RouteDefinition) definition, definition.getId(), definition.getLabel());
         }
 
         @Override
-        public void afterProcess(Exchange exchange, Processor processor, ProcessorDefinition<?> definition, long timeTaken) {
-            CamelTestSupport.this.debugAfter(exchange, processor, definition, definition.getId(), definition.getLabel(), timeTaken);
+        public void afterProcess(Exchange exchange, Processor processor, NamedNode definition, long timeTaken) {
+            CamelTestSupport.this.debugAfter(exchange, processor, (RouteDefinition) definition, definition.getId(), definition.getLabel(), timeTaken);
         }
     }
 
diff --git a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinTracer.java b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinTracer.java
index 7d995f8..abad90e 100644
--- a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinTracer.java
+++ b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinTracer.java
@@ -40,6 +40,7 @@ import org.apache.camel.CamelContextAware;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Route;
 import org.apache.camel.StaticService;
 import org.apache.camel.api.management.ManagedAttribute;
@@ -51,7 +52,6 @@ import org.apache.camel.management.event.ExchangeCreatedEvent;
 import org.apache.camel.management.event.ExchangeFailedEvent;
 import org.apache.camel.management.event.ExchangeSendingEvent;
 import org.apache.camel.management.event.ExchangeSentEvent;
-import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spi.RoutePolicy;
 import org.apache.camel.spi.RoutePolicyFactory;
 import org.apache.camel.support.EventNotifierSupport;
@@ -152,7 +152,7 @@ public class ZipkinTracer extends ServiceSupport implements RoutePolicyFactory,
     }
 
     @Override
-    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition route) {
+    public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, NamedNode route) {
         // ensure this zipkin tracer gets initialized when Camel starts
         init(camelContext);
         return new ZipkinRoutePolicy();
diff --git a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/policy/CuratorLeaderRoutePolicy.java b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/policy/CuratorLeaderRoutePolicy.java
index ef9f9e2..9b50624 100644
--- a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/policy/CuratorLeaderRoutePolicy.java
+++ b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/policy/CuratorLeaderRoutePolicy.java
@@ -24,6 +24,7 @@ import java.util.concurrent.locks.ReentrantLock;
 
 import org.apache.camel.NonManagedService;
 import org.apache.camel.Route;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.support.RoutePolicySupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -77,7 +78,8 @@ public class CuratorLeaderRoutePolicy extends RoutePolicySupport implements Elec
     public void onInit(Route route) {
         ensureElectionIsCreated(route);
         LOG.info("Route managed by {}. Setting route {} AutoStartup flag to false.", this.getClass(), route.getId());
-        route.getRouteContext().getRoute().setAutoStartup("false");
+        RouteDefinition definition = (RouteDefinition) route.getRouteContext().getRoute();
+        definition.setAutoStartup("false");
         ensureElectionIsCreated(route);
 
         if (election.isMaster()) {
diff --git a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/policy/CuratorMultiMasterLeaderRoutePolicy.java b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/policy/CuratorMultiMasterLeaderRoutePolicy.java
index cfacc45..ceb24cf 100644
--- a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/policy/CuratorMultiMasterLeaderRoutePolicy.java
+++ b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/policy/CuratorMultiMasterLeaderRoutePolicy.java
@@ -25,6 +25,7 @@ import java.util.concurrent.locks.ReentrantLock;
 import org.apache.camel.NonManagedService;
 import org.apache.camel.Route;
 import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.support.RoutePolicySupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -79,7 +80,8 @@ public class CuratorMultiMasterLeaderRoutePolicy extends RoutePolicySupport impl
     public void onInit(Route route) {
         ensureElectionIsCreated();
         LOG.info("Route managed by {}. Setting route [{}] AutoStartup flag to false.", this.getClass(), route.getId());
-        route.getRouteContext().getRoute().setAutoStartup("false");
+        RouteDefinition definition = (RouteDefinition) route.getRouteContext().getRoute();
+        definition.setAutoStartup("false");
 
 
         if (election.isMaster()) {
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 fb7cbde..58b746a 100644
--- a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
+++ b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
@@ -38,6 +38,7 @@ import org.apache.camel.Route;
 import org.apache.camel.ServiceStatus;
 import org.apache.camel.StatefulService;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
+import org.apache.camel.management.ManagedCamelContext;
 import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RouteDefinition;
@@ -277,7 +278,7 @@ public abstract class AbstractLocalCamelController extends AbstractCamelControll
                         row.put("routeId", route.getId());
                         row.put("state", getRouteState(route));
                         row.put("uptime", route.getUptime());
-                        ManagedRouteMBean mr = context.getManagedRoute(route.getId(), ManagedRouteMBean.class);
+                        ManagedRouteMBean mr = context.adapt(ManagedCamelContext.class).getManagedRoute(route.getId(), ManagedRouteMBean.class);
                         if (mr != null) {
                             row.put("exchangesTotal", "" + mr.getExchangesTotal());
                             row.put("exchangesInflight", "" + mr.getExchangesInflight());
diff --git a/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/internal/CamelControllerImpl.java b/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/internal/CamelControllerImpl.java
index adf0f81..0c6bd1f 100644
--- a/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/internal/CamelControllerImpl.java
+++ b/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/internal/CamelControllerImpl.java
@@ -86,10 +86,10 @@ public class CamelControllerImpl extends AbstractLocalCamelController {
             row.put("name", camelContext.getName());
             row.put("state", camelContext.getStatus().name());
             row.put("uptime", camelContext.getUptime());
-            if (camelContext.getManagedCamelContext() != null) {
-                row.put("exchangesTotal", "" + camelContext.getManagedCamelContext().getExchangesTotal());
-                row.put("exchangesInflight", "" + camelContext.getManagedCamelContext().getExchangesInflight());
-                row.put("exchangesFailed", "" + camelContext.getManagedCamelContext().getExchangesFailed());
+            if (camelContext.adapt(ManagedCamelContext.class).getManagedCamelContext() != null) {
+                row.put("exchangesTotal", "" + camelContext.adapt(ManagedCamelContext.class).getManagedCamelContext().getExchangesTotal());
+                row.put("exchangesInflight", "" + camelContext.adapt(ManagedCamelContext.class).getManagedCamelContext().getExchangesInflight());
+                row.put("exchangesFailed", "" + camelContext.adapt(ManagedCamelContext.class).getManagedCamelContext().getExchangesFailed());
             } else {
                 row.put("exchangesTotal", "0");
                 row.put("exchangesInflight", "0");
diff --git a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfigurationTest.java b/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfigurationTest.java
index 948b6f7..0d8145d 100644
--- a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfigurationTest.java
+++ b/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfigurationTest.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.hystrix.processor;
 import org.apache.camel.CamelContext;
 import org.apache.camel.model.HystrixConfigurationDefinition;
 import org.apache.camel.model.HystrixDefinition;
+import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.RouteDefinition;
 import org.junit.Assert;
 import org.junit.Test;
@@ -50,7 +51,7 @@ public class HystrixHierarchicalConfigurationTest {
 
     @Test
     public void testConfiguration() throws Exception {
-        RouteDefinition routeDefinition = camelContext.getRouteDefinition("hystrix-route");
+        RouteDefinition routeDefinition = camelContext.adapt(ModelCamelContext.class).getRouteDefinition("hystrix-route");
         HystrixDefinition hystrixDefinition = findHystrixDefinition(routeDefinition);
 
         Assert.assertNotNull(hystrixDefinition);
diff --git a/tests/camel-itest/src/test/java/org/apache/camel/itest/issues/DummyInterceptor.java b/tests/camel-itest/src/test/java/org/apache/camel/itest/issues/DummyInterceptor.java
index df15e01..60354fc 100644
--- a/tests/camel-itest/src/test/java/org/apache/camel/itest/issues/DummyInterceptor.java
+++ b/tests/camel-itest/src/test/java/org/apache/camel/itest/issues/DummyInterceptor.java
@@ -17,14 +17,14 @@
 package org.apache.camel.itest.issues;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
-import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.InterceptStrategy;
 
 public class DummyInterceptor implements InterceptStrategy {
     
     // Just simply return the target processor 
-    public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition, Processor target, Processor nextTarget) throws Exception {
+    public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition, Processor target, Processor nextTarget) throws Exception {
         return target;
     }
 }