You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/04/08 07:51:47 UTC

[camel] branch main updated: Errorhandler in dsl (#7391)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 870e656bd6c Errorhandler in dsl (#7391)
870e656bd6c is described below

commit 870e656bd6cf67a6e46ee3419b67ada860386d70
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Apr 8 09:51:30 2022 +0200

    Errorhandler in dsl (#7391)
    
    CAMEL-16834: error handler in DSL model
---
 .../org/apache/camel/catalog/models.properties     |    6 +
 .../camel/catalog/models/deadLetterChannel.json    |   31 +
 .../camel/catalog/models/defaultErrorHandler.json  |   29 +
 .../apache/camel/catalog/models/errorHandler.json  |   24 +-
 .../camel/catalog/models/errorHandlerRef.json      |   18 +
 .../catalog/models/jtaTransactionErrorHandler.json |   31 +
 .../camel/catalog/models/noErrorHandler.json       |   17 +
 .../camel/catalog/models/redeliveryPolicy.json     |   27 +-
 .../models/springTransactionErrorHandler.json      |   31 +
 .../org/apache/camel/catalog/others/cdi-jta.json   |    2 +-
 .../org/apache/camel/catalog/others/cdi-main.json  |    2 +-
 .../apache/camel/catalog/schemas/camel-spring.xsd  | 1064 +++++++++++---------
 .../camel/component/avro/avro-http-producer.xml    |    4 +-
 .../camel/component/avro/avro-netty-producer.xml   |    4 +-
 components/camel-cdi-jta/pom.xml                   |    1 +
 .../src/generated/resources/cdi-jta.json           |    2 +-
 .../camel-cdi-jta/src/main/docs/cdi-jta.adoc       |    2 +-
 .../java/org/apache/camel/cdi/CdiRouteBuilder.java |   45 -
 components/camel-cdi-main/pom.xml                  |    1 +
 .../src/generated/resources/cdi-main.json          |    2 +-
 .../camel-cdi-main/src/main/docs/cdi-main.adoc     |    2 +-
 components/camel-cdi/pom.xml                       |    1 +
 .../camel-cdi/src/generated/resources/cdi.json     |    2 +-
 components/camel-cdi/src/main/docs/cdi.adoc        |    2 +-
 .../CdiJtaTransactionErrorHandlerBuilder.java      |   23 -
 .../CdiTransactionalErrorHandlerBuilder.java       |   35 -
 .../component/cxf/jaxrs/CxfRsConsumerTest.java     |    4 +-
 .../cxf/jaxrs/CxfRsSpringConsumerTest.java         |    4 +-
 ...JMXTXUseOriginalBodyWithTXErrorHandlerTest.java |    4 +-
 ...tionErrorHandlerRedeliveryDelayTest-context.xml |    2 +-
 .../jms/tx/JMSTransactionErrorHandlerTest.xml      |    2 +-
 .../jms/tx/JMSTransactionalClientTest.xml          |    2 +-
 .../tx/JMSTransactionalClientWithRollbackTest.xml  |    2 +-
 ...nsactionErrorHandlerBuilderAsSpringBeanTest.xml |    2 +-
 .../camel/jta/JtaTransactionErrorHandler.java      |    9 +
 .../jta/JtaTransactionErrorHandlerBuilder.java     |  100 --
 .../jta/JtaTransactionErrorHandlerReifier.java     |  182 ++--
 .../org/apache/camel/jta/JtaTransactionPolicy.java |   37 +-
 .../org/apache/camel/spring/xml/errorHandler.json  |    4 +-
 .../org/apache/camel/spring/xml/jaxb.index         |    4 +-
 .../camel/spring/xml/CamelContextFactoryBean.java  |    2 +-
 ...tion.java => SpringErrorHandlerDefinition.java} |    8 +-
 ...andlerType.java => SpringErrorHandlerType.java} |   18 +-
 .../spring/xml/handler/CamelNamespaceHandler.java  |   16 +
 .../xml/handler/ErrorHandlerDefinitionParser.java  |   58 +-
 .../spring/config/DummyErrorHandlerBuilder.java    |    7 +-
 .../TransactionalClientDataSourceAsyncTest.java    |    4 +-
 .../handler/ErrorHandlerDefinitionParserTest.java  |   20 +-
 ...adLetterChannelRedeliveryConfigTest-context.xml |    2 +-
 .../DefaultErrorHandlerConfigTest-context.xml      |    2 +-
 .../apache/camel/spring/config/errorHandler.xml    |    2 +-
 .../springTransactionalClientDataSource.xml        |    2 +-
 ...HandlerAndContextScopedOnExceptionIssueTest.xml |    2 +-
 .../processor/InheritErrorHandlerDefaultTest.xml   |    2 +-
 .../processor/InheritErrorHandlerFalseTest.xml     |    2 +-
 .../processor/InheritErrorHandlerTrueTest.xml      |    2 +-
 ...ngDeadLetterChannelInvalidDeadLetterUriTest.xml |    2 +-
 ...LetterChannelInvalidOptionDeadLetterUriTest.xml |    2 +-
 .../SpringDeadLetterChannelUseOriginalBodyTest.xml |    4 +-
 ...etterChannelUseOriginalExchangeWithFileTest.xml |    4 +-
 .../camel/spring/processor/failOverLoadBalance.xml |    2 +-
 ...eadLetterChannelOnExceptionOnRedeliveryTest.xml |    2 +-
 .../onexception/RedeliveryPolicyRefTest.xml        |    2 +-
 .../SpringContextScopeOnExceptionTest.xml          |    2 +-
 ...ingOnExceptionFromChoiceUseOriginalBodyTest.xml |    2 +-
 .../SpringOnExceptionUseOriginalBodyTest.xml       |    2 +-
 .../deadLetterChannelHandledExampleTest.xml        |    2 +-
 .../onExceptionNotNormalizedClassNameTest.xml      |    2 +-
 .../onexception/onExceptionSubRouteTest.xml        |    4 +-
 .../camel/spring/xml/buildCustomProcessor.xml      |    2 +-
 .../spring/xml/buildCustomProcessorWithFilter.xml  |    2 +-
 .../camel/spring/xml/buildDynamicRecipientList.xml |    2 +-
 .../camel/spring/xml/buildIdempotentConsumer.xml   |    2 +-
 .../apache/camel/spring/xml/buildSimpleRoute.xml   |    2 +-
 .../spring/xml/buildSimpleRouteWithChoice.xml      |    2 +-
 .../xml/buildSimpleRouteWithHeaderPredicate.xml    |    2 +-
 .../org/apache/camel/spring/xml/buildSplitter.xml  |    2 +-
 .../camel/spring/xml/buildStaticRecipientList.xml  |    2 +-
 .../org/apache/camel/spring/xml/buildWireTap.xml   |    2 +-
 .../apache/camel/spring/SpringRouteBuilder.java    |   14 +-
 ...a => LegacyTransactionErrorHandlerBuilder.java} |   17 +-
 ...a => LegacyTransactionErrorHandlerReifier.java} |   13 +-
 .../camel/spring/spi/SpringTransactionPolicy.java  |   22 +-
 .../spring/spi/TransactionErrorHandlerReifier.java |  224 ++++-
 .../camel-test/camel-test-cdi-junit5/pom.xml       |    1 +
 .../java/org/apache/camel/ErrorHandlerFactory.java |   15 +
 .../org/apache/camel/spi/ExceptionHandler.java     |    4 +-
 .../camel/impl/engine/AbstractCamelContext.java    |    1 +
 .../org/apache/camel/impl/engine/DefaultRoute.java |    1 +
 .../camel/impl/DefaultModelReifierFactory.java     |    4 +-
 .../DeadLetterChannelBuilderConfigurer.java        |  145 ---
 .../DefaultErrorHandlerBuilderConfigurer.java      |  145 ---
 ...g.apache.camel.builder.DeadLetterChannelBuilder |    2 -
 ...apache.camel.builder.DefaultErrorHandlerBuilder |    2 -
 .../services/org/apache/camel/model.properties     |    7 +
 .../org/apache/camel/model/errorHandler.json       |   18 +
 .../model/errorhandler/deadLetterChannel.json      |   31 +
 .../model/errorhandler/defaultErrorHandler.json    |   29 +
 .../camel/model/errorhandler/errorHandlerRef.json  |   18 +
 .../org/apache/camel/model/errorhandler/jaxb.index |    7 +
 .../errorhandler/jtaTransactionErrorHandler.json   |   31 +
 .../camel/model/errorhandler/noErrorHandler.json   |   17 +
 .../springTransactionErrorHandler.json             |   31 +
 .../resources/org/apache/camel/model/jaxb.index    |    1 +
 .../org/apache/camel/model/redeliveryPolicy.json   |   27 +-
 .../org/apache/camel/builder/BuilderSupport.java   |   94 +-
 .../camel/builder/DeadLetterChannelBuilder.java    |   52 +-
 .../camel/builder/DefaultErrorHandlerBuilder.java  |  649 +-----------
 ...java => JtaTransactionErrorHandlerBuilder.java} |   18 +-
 ...er.java => LegacyDeadLetterChannelBuilder.java} |   17 +-
 ....java => LegacyDefaultErrorHandlerBuilder.java} |  108 +-
 .../LegacyErrorHandlerBuilder.java}                |   10 +-
 ...rRef.java => LegacyErrorHandlerBuilderRef.java} |   15 +-
 ....java => LegacyErrorHandlerBuilderSupport.java} |    5 +-
 ...pport.java => LegacyNoErrorHandlerBuilder.java} |   11 +-
 .../camel/builder/NoErrorHandlerBuilder.java       |   20 +-
 ...derSupport.java => RefErrorHandlerBuilder.java} |   13 +-
 .../org/apache/camel/builder/RouteBuilder.java     |   24 +-
 ...a => SpringTransactionErrorHandlerBuilder.java} |   18 +-
 .../java/org/apache/camel/model/Constants.java     |    1 +
 .../apache/camel/model/ErrorHandlerDefinition.java |   66 ++
 .../camel/model/RedeliveryPolicyDefinition.java    |   34 +-
 .../org/apache/camel/model/RouteDefinition.java    |   21 +-
 .../apache/camel/model/RouteDefinitionHelper.java  |    9 +-
 ...erties.java => BaseErrorHandlerDefinition.java} |    8 +-
 .../DeadLetterChannelConfiguration.java            |    4 +
 .../errorhandler/DeadLetterChannelDefinition.java  |  138 +++
 .../errorhandler/DeadLetterChannelProperties.java  |    4 +
 .../DefaultErrorHandlerConfiguration.java          |   15 +
 .../DefaultErrorHandlerDefinition.java             |  780 ++++++++++++++
 .../DefaultErrorHandlerProperties.java             |    4 +
 .../model/errorhandler/ErrorHandlerHelper.java     |   10 +-
 .../errorhandler/ErrorHandlerRefConfiguration.java |   19 +
 .../errorhandler/ErrorHandlerRefDefinition.java    |   78 ++
 .../errorhandler/ErrorHandlerRefProperties.java    |    5 +
 ...a => JtaTransactionErrorHandlerDefinition.java} |   27 +-
 .../errorhandler/NoErrorHandlerConfiguration.java  |   17 +-
 ...operties.java => NoErrorHandlerDefinition.java} |   30 +-
 .../errorhandler/NoErrorHandlerProperties.java     |    4 +
 ...> SpringTransactionErrorHandlerDefinition.java} |   27 +-
 .../TransactionErrorHandlerDefinition.java         |  123 +++
 ...HandlerConfiguration.java => package-info.java} |   15 +-
 .../org/apache/camel/reifier/RouteReifier.java     |   14 +-
 .../errorhandler/DeadLetterChannelReifier.java     |  109 +-
 .../errorhandler/DefaultErrorHandlerReifier.java   |   89 +-
 .../errorhandler/ErrorHandlerRefReifier.java       |    7 +-
 .../reifier/errorhandler/ErrorHandlerReifier.java  |  173 +++-
 ...er.java => LegacyDeadLetterChannelReifier.java} |    8 +-
 ....java => LegacyDefaultErrorHandlerReifier.java} |    8 +-
 ...fier.java => LegacyErrorHandlerRefReifier.java} |    8 +-
 .../errorhandler/LegacyNoErrorHandlerReifier.java} |   35 +-
 .../errorhandler/NoErrorHandlerReifier.java        |    6 +-
 .../core/xml/AbstractCamelContextFactoryBean.java  |    5 +-
 .../AbstractCamelRedeliveryPolicyFactoryBean.java  |    1 +
 .../camel/builder/ContextErrorHandlerTest.java     |    5 +-
 .../builder/RouteTemplateErrorHandlerTest.java     |    8 +-
 ...tScopedOnExceptionErrorHandlerRefIssueTest.java |    3 +-
 ...ExceptionErrorHandlerRefIssueTwoRoutesTest.java |    6 +-
 ...xceptionNotHandledErrorHandlerRefIssueTest.java |    3 +-
 ...otHandledErrorHandlerRefIssueTwoRoutesTest.java |    3 +-
 ...HandledRouteScopedErrorHandlerRefIssueTest.java |    4 +-
 ...uteScopedErrorHandlerRefIssueTwoRoutesTest.java |    5 +-
 ...ceptionRouteScopedErrorHandlerRefIssueTest.java |    4 +-
 ...uteScopedErrorHandlerRefIssueTwoRoutesTest.java |    5 +-
 .../issues/OnExceptionContinuedIssueTest.java      |    3 +-
 .../OnExceptionErrorHandlerRefIssueTest.java       |    3 +-
 ...ExceptionErrorHandlerRefIssueTwoRoutesTest.java |    3 +-
 ...xceptionNotHandledErrorHandlerRefIssueTest.java |    3 +-
 ...otHandledErrorHandlerRefIssueTwoRoutesTest.java |    3 +-
 ...HandledRouteScopedErrorHandlerRefIssueTest.java |    3 +-
 ...uteScopedErrorHandlerRefIssueTwoRoutesTest.java |    5 +-
 ...ceptionRouteScopedErrorHandlerRefIssueTest.java |    3 +-
 ...uteScopedErrorHandlerRefIssueTwoRoutesTest.java |    5 +-
 .../BodyOnlyAggregationStrategyTest.java           |    7 +-
 .../errorhandler/ErrorHandlerSupportTest.java      |    2 +-
 .../errorhandler/NewDeadLetterChannelTest.java}    |   31 +-
 .../DefaultExceptionPolicyStrategyTest.java        |    2 +-
 .../java/org/apache/camel/xml/in/ModelParser.java  |   90 +-
 .../ROOT/pages/camel-3x-upgrade-guide-3_17.adoc    |   52 +-
 .../camel/dsl/groovy/common/GroovyDSL.groovy       |    4 +-
 .../org/apache/camel/dsl/js/JavaScriptDSL.java     |    4 +-
 .../org/apache/camel/dsl/kotlin/KotlinDSL.kt       |    4 +-
 .../camel-yaml-dsl-deserializers/pom.xml           |    5 -
 .../dsl/yaml/deserializers/ModelDeserializers.java |  527 ++++++++--
 .../deserializers/ModelDeserializersResolver.java  |   25 +-
 .../ErrorHandlerBuilderDeserializer.java           |   30 +-
 .../dsl/yaml/GenerateYamlDeserializersMojo.java    |   46 +-
 .../maven/dsl/yaml/GenerateYamlSupportMojo.java    |    3 +-
 .../src/generated/resources/camel-yaml-dsl.json    |  342 +++++--
 .../src/generated/resources/camelYamlDsl.json      |  338 +++++--
 .../camel/dsl/yaml/YamlRoutesBuilderLoader.java    |   31 +-
 .../apache/camel/dsl/yaml/ErrorHandlerTest.groovy  |   20 +-
 .../camel/dsl/yaml/KameletBindingLoaderTest.groovy |   34 +-
 .../org/apache/camel/itest/TransactionSupport.java |    8 +-
 194 files changed, 4704 insertions(+), 2728 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models.properties
index 2a3e6bb7df6..24b02d66322 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models.properties
@@ -34,6 +34,8 @@ customLoadBalancer
 customServiceFilter
 dataFormats
 datasonnet
+deadLetterChannel
+defaultErrorHandler
 defaultLoadBalancer
 delay
 delete
@@ -46,6 +48,7 @@ dynamicRouter
 endpoint
 enrich
 errorHandler
+errorHandlerRef
 exchangeProperty
 expression
 failover
@@ -81,6 +84,7 @@ joor
 json
 jsonApi
 jsonpath
+jtaTransactionErrorHandler
 kamelet
 keyStoreParameters
 kubernetesServiceDiscovery
@@ -96,6 +100,7 @@ mimeMultipart
 multicast
 mutualTLS
 mvel
+noErrorHandler
 oauth2
 ognl
 onCompletion
@@ -178,6 +183,7 @@ soap
 sort
 spel
 split
+springTransactionErrorHandler
 sslContextParameters
 staticServiceDiscovery
 step
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/deadLetterChannel.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/deadLetterChannel.json
new file mode 100644
index 00000000000..5e30167a115
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/deadLetterChannel.json
@@ -0,0 +1,31 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "deadLetterChannel",
+    "title": "Dead Letter Channel",
+    "description": "Dead letter channel error handler.",
+    "deprecated": false,
+    "label": "configuration,error",
+    "javaType": "org.apache.camel.model.errorhandler.DeadLetterChannelDefinition",
+    "abstract": false,
+    "input": false,
+    "output": false
+  },
+  "properties": {
+    "deadLetterUri": { "kind": "attribute", "displayName": "Dead Letter Uri", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The dead letter endpoint uri for the Dead Letter error handler." },
+    "deadLetterHandleNewException": { "kind": "attribute", "displayName": "Dead Letter Handle New Exception", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the dead letter channel should handle (and ignore) any new exception that may been thrown during sending the message to the dead letter endpoint. The default value is true which means an [...]
+    "loggerRef": { "kind": "attribute", "displayName": "Logger Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a logger to use as logger for the error handler" },
+    "level": { "kind": "attribute", "displayName": "Level", "label": "advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
+    "logName": { "kind": "attribute", "displayName": "Log Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
+    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have fail [...]
+    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and t [...]
+    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
+    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown  [...]
+    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
+    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a retry while predicate. Will continue retrying until the predicate evaluates to false." },
+    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.errorhandler.RedeliveryPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
+    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
+    "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the redelivery settings" },
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
+  }
+}
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/defaultErrorHandler.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/defaultErrorHandler.json
new file mode 100644
index 00000000000..724d2885089
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/defaultErrorHandler.json
@@ -0,0 +1,29 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "defaultErrorHandler",
+    "title": "Default Error Handler",
+    "description": "Default error handler.",
+    "deprecated": false,
+    "label": "configuration,error",
+    "javaType": "org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition",
+    "abstract": false,
+    "input": false,
+    "output": false
+  },
+  "properties": {
+    "loggerRef": { "kind": "attribute", "displayName": "Logger Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a logger to use as logger for the error handler" },
+    "level": { "kind": "attribute", "displayName": "Level", "label": "advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
+    "logName": { "kind": "attribute", "displayName": "Log Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
+    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have fail [...]
+    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and t [...]
+    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
+    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown  [...]
+    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
+    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a retry while predicate. Will continue retrying until the predicate evaluates to false." },
+    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.errorhandler.RedeliveryPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
+    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
+    "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the redelivery settings" },
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
+  }
+}
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/errorHandler.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/errorHandler.json
index 01f274bc93e..e7ae369ac74 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/errorHandler.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/errorHandler.json
@@ -3,32 +3,16 @@
     "kind": "model",
     "name": "errorHandler",
     "title": "Error Handler",
-    "description": "Error handler settings",
+    "description": "Camel error handling.",
     "deprecated": false,
-    "label": "spring,configuration,error",
-    "javaType": "org.apache.camel.spring.xml.ErrorHandlerDefinition",
+    "label": "configuration,error",
+    "javaType": "org.apache.camel.model.ErrorHandlerDefinition",
     "abstract": false,
     "input": false,
     "output": false
   },
   "properties": {
-    "type": { "kind": "attribute", "displayName": "Type", "required": true, "type": "enum", "javaType": "org.apache.camel.spring.xml.ErrorHandlerType", "enum": [ "dead-letter-channel", "default-error-handler", "no-error-handler", "transaction-error-handler" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "DefaultErrorHandler", "description": "The type of the error handler" },
-    "deadLetterUri": { "kind": "attribute", "displayName": "Dead Letter Uri", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The dead letter endpoint uri for the Dead Letter error handler." },
-    "deadLetterHandleNewException": { "kind": "attribute", "displayName": "Dead Letter Handle New Exception", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Whether the dead letter channel should handle (and ignore) any new exception that may been thrown during sending the message to the dead letter endpoint. The default value is true which means any such kind of exception is handled and ignor [...]
-    "level": { "kind": "attribute", "displayName": "Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
-    "rollbackLoggingLevel": { "kind": "attribute", "displayName": "Rollback Logging Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "WARN", "description": "Sets the logging level to use for logging transactional rollback. This option is default WARN." },
-    "logName": { "kind": "attribute", "displayName": "Log Name", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
-    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and the org.apache [...]
-    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and the org.apache.camel.E [...]
-    "transactionTemplateRef": { "kind": "attribute", "displayName": "Transaction Template Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to the org.springframework.transaction.support.TransactionTemplate to use with the transaction error handler." },
-    "transactionManagerRef": { "kind": "attribute", "displayName": "Transaction Manager Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to the org.springframework.transaction.PlatformTransactionManager to use with the transaction error handler." },
-    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
-    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown from this processor will be ign [...]
-    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
-    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to an retry while expression. Will continue retrying until expression evaluates to false." },
-    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
-    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
-    "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.spring.xml.CamelRedeliveryPolicyFactoryBean", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the redelivery settings" },
+    "errorHandlerType": { "kind": "element", "displayName": "Error Handler Type", "required": true, "type": "object", "javaType": "org.apache.camel.ErrorHandlerFactory", "oneOf": [ "deadLetterChannel", "defaultErrorHandler", "jtaTransactionErrorHandler", "noErrorHandler", "springTransactionErrorHandler" ], "deprecated": false, "autowired": false, "secret": false },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/errorHandlerRef.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/errorHandlerRef.json
new file mode 100644
index 00000000000..b1cc07bde2a
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/errorHandlerRef.json
@@ -0,0 +1,18 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "errorHandlerRef",
+    "title": "Error Handler Ref",
+    "description": "Dead letter channel error handler.",
+    "deprecated": false,
+    "label": "configuration,error",
+    "javaType": "org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition",
+    "abstract": false,
+    "input": false,
+    "output": false
+  },
+  "properties": {
+    "ref": { "kind": "attribute", "displayName": "Ref", "required": false, "type": "object", "javaType": "org.apache.camel.ErrorHandlerFactory", "deprecated": false, "autowired": false, "secret": false, "description": "References to an existing or custom error handler." },
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
+  }
+}
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/jtaTransactionErrorHandler.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/jtaTransactionErrorHandler.json
new file mode 100644
index 00000000000..e80961aebb2
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/jtaTransactionErrorHandler.json
@@ -0,0 +1,31 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "jtaTransactionErrorHandler",
+    "title": "Jta Transaction Error Handler",
+    "description": "JTA based transactional error handler (requires camel-jta).",
+    "deprecated": false,
+    "label": "configuration,error",
+    "javaType": "org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition",
+    "abstract": false,
+    "input": false,
+    "output": false
+  },
+  "properties": {
+    "transactedPolicyRef": { "kind": "attribute", "displayName": "Transacted Policy Ref", "required": false, "type": "object", "javaType": "org.apache.camel.spi.TransactedPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "The transacted policy to use that is configured for either Spring or JTA based transactions. If no policy has been configured then Camel will attempt to auto-discover." },
+    "rollbackLoggingLevel": { "kind": "attribute", "displayName": "Rollback Logging Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "WARN", "description": "Sets the logging level to use for logging transactional rollback. This option is default WARN." },
+    "loggerRef": { "kind": "attribute", "displayName": "Logger Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a logger to use as logger for the error handler" },
+    "level": { "kind": "attribute", "displayName": "Level", "label": "advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
+    "logName": { "kind": "attribute", "displayName": "Log Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
+    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have fail [...]
+    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and t [...]
+    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
+    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown  [...]
+    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
+    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a retry while predicate. Will continue retrying until the predicate evaluates to false." },
+    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.errorhandler.RedeliveryPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
+    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
+    "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the redelivery settings" },
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
+  }
+}
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/noErrorHandler.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/noErrorHandler.json
new file mode 100644
index 00000000000..f0e1feaaa4f
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/noErrorHandler.json
@@ -0,0 +1,17 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "noErrorHandler",
+    "title": "No Error Handler",
+    "description": "No error handler.",
+    "deprecated": false,
+    "label": "configuration,error",
+    "javaType": "org.apache.camel.model.errorhandler.NoErrorHandlerDefinition",
+    "abstract": false,
+    "input": false,
+    "output": false
+  },
+  "properties": {
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
+  }
+}
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/redeliveryPolicy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/redeliveryPolicy.json
index b4b43682a8a..c8af0840dac 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/redeliveryPolicy.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/redeliveryPolicy.json
@@ -13,28 +13,29 @@
   },
   "properties": {
     "maximumRedeliveries": { "kind": "attribute", "displayName": "Maximum Redeliveries", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the maximum redeliveries x = redeliver at most x times 0 = no redeliveries -1 = redeliver forever" },
-    "redeliveryDelay": { "kind": "attribute", "displayName": "Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the initial redelivery delay" },
+    "redeliveryDelay": { "kind": "attribute", "displayName": "Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the initial redelivery delay" },
     "asyncDelayedRedelivery": { "kind": "attribute", "displayName": "Async Delayed Redelivery", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allow asynchronous delayed redelivery. The route, in particular the consumer's component, must support the Asynchronous Routing Engine (e.g. seda)." },
-    "backOffMultiplier": { "kind": "attribute", "displayName": "Back Off Multiplier", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the back off multiplier" },
+    "backOffMultiplier": { "kind": "attribute", "displayName": "Back Off Multiplier", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "2.0", "description": "Sets the back off multiplier" },
     "useExponentialBackOff": { "kind": "attribute", "displayName": "Use Exponential Back Off", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Turn on exponential backk off" },
-    "collisionAvoidanceFactor": { "kind": "attribute", "displayName": "Collision Avoidance Factor", "label": "advanced", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the collision avoidance factor" },
+    "collisionAvoidanceFactor": { "kind": "attribute", "displayName": "Collision Avoidance Factor", "label": "advanced", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "0.15", "description": "Sets the collision avoidance factor" },
     "useCollisionAvoidance": { "kind": "attribute", "displayName": "Use Collision Avoidance", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Turn on collision avoidance." },
-    "maximumRedeliveryDelay": { "kind": "attribute", "displayName": "Maximum Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the maximum delay between redelivery" },
-    "retriesExhaustedLogLevel": { "kind": "attribute", "displayName": "Retries Exhausted Log Level", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the logging level to use when retries have been exhausted" },
-    "retryAttemptedLogLevel": { "kind": "attribute", "displayName": "Retry Attempted Log Level", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the logging level to use for logging retry attempts" },
-    "retryAttemptedLogInterval": { "kind": "attribute", "displayName": "Retry Attempted Log Interval", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the interval to use for logging retry attempts" },
-    "logRetryAttempted": { "kind": "attribute", "displayName": "Log Retry Attempted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether retry attempts should be logged or not. Can be used to include or reduce verbose." },
-    "logStackTrace": { "kind": "attribute", "displayName": "Log Stack Trace", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether stack traces should be logged. Can be used to include or reduce verbose." },
+    "maximumRedeliveryDelay": { "kind": "attribute", "displayName": "Maximum Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "60000", "description": "Sets the maximum delay between redelivery" },
+    "retriesExhaustedLogLevel": { "kind": "attribute", "displayName": "Retries Exhausted Log Level", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Sets the logging level to use when retries have been exhausted" },
+    "retryAttemptedLogLevel": { "kind": "attribute", "displayName": "Retry Attempted Log Level", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "DEBUG", "description": "Sets the logging level to use for logging retry attempts" },
+    "retryAttemptedLogInterval": { "kind": "attribute", "displayName": "Retry Attempted Log Interval", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1", "description": "Sets the interval to use for logging retry attempts" },
+    "logRetryAttempted": { "kind": "attribute", "displayName": "Log Retry Attempted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether retry attempts should be logged or not. Can be used to include or reduce verbose." },
+    "logStackTrace": { "kind": "attribute", "displayName": "Log Stack Trace", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether stack traces should be logged. Can be used to include or reduce verbose." },
     "logRetryStackTrace": { "kind": "attribute", "displayName": "Log Retry Stack Trace", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether stack traces should be logged when an retry attempt failed. Can be used to include or reduce verbose." },
     "logHandled": { "kind": "attribute", "displayName": "Log Handled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether handled exceptions should be logged or not. Can be used to include or reduce verbose." },
-    "logNewException": { "kind": "attribute", "displayName": "Log New Exception", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether new exceptions should be logged or not. Can be used to include or reduce verbose. A new exception is an exception that was thrown while handling a previous exception." },
+    "logNewException": { "kind": "attribute", "displayName": "Log New Exception", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether new exceptions should be logged or not. Can be used to include or reduce verbose. A new exception is an exception that was thrown while handling a previous exception." },
     "logContinued": { "kind": "attribute", "displayName": "Log Continued", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether continued exceptions should be logged or not. Can be used to include or reduce verbose." },
-    "logExhausted": { "kind": "attribute", "displayName": "Log Exhausted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted exceptions should be logged or not. Can be used to include or reduce verbose." },
+    "logExhausted": { "kind": "attribute", "displayName": "Log Exhausted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether exhausted exceptions should be logged or not. Can be used to include or reduce verbose." },
     "logExhaustedMessageHistory": { "kind": "attribute", "displayName": "Log Exhausted Message History", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted exceptions should be logged including message history or not (supports property placeholders). Can be used to include or reduce verbose." },
     "logExhaustedMessageBody": { "kind": "attribute", "displayName": "Log Exhausted Message Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted message body should be logged including message history or not (supports property placeholders). Can be used to include or reduce verbose. Requires logExhaustedMessageHistory to be  [...]
     "disableRedelivery": { "kind": "attribute", "displayName": "Disable Redelivery", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Disables redelivery (same as setting maximum redeliveries to 0)" },
     "delayPattern": { "kind": "attribute", "displayName": "Delay Pattern", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the delay pattern with delay intervals." },
-    "allowRedeliveryWhileStopping": { "kind": "attribute", "displayName": "Allow Redelivery While Stopping", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Controls whether to allow redelivery while stopping\/shutting down a route that uses error handling." },
-    "exchangeFormatterRef": { "kind": "attribute", "displayName": "Exchange Formatter Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the reference of the instance of org.apache.camel.spi.ExchangeFormatter to generate the log message from exchange." }
+    "allowRedeliveryWhileStopping": { "kind": "attribute", "displayName": "Allow Redelivery While Stopping", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls whether to allow redelivery while stopping\/shutting down a route that uses error handling." },
+    "exchangeFormatterRef": { "kind": "attribute", "displayName": "Exchange Formatter Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the reference of the instance of org.apache.camel.spi.ExchangeFormatter to generate the log message from exchange." },
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/springTransactionErrorHandler.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/springTransactionErrorHandler.json
new file mode 100644
index 00000000000..13e9822a850
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/springTransactionErrorHandler.json
@@ -0,0 +1,31 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "springTransactionErrorHandler",
+    "title": "Spring Transaction Error Handler",
+    "description": "Spring based transactional error handler (requires camel-spring).",
+    "deprecated": false,
+    "label": "configuration,error",
+    "javaType": "org.apache.camel.model.errorhandler.SpringTransactionErrorHandlerDefinition",
+    "abstract": false,
+    "input": false,
+    "output": false
+  },
+  "properties": {
+    "transactedPolicyRef": { "kind": "attribute", "displayName": "Transacted Policy Ref", "required": false, "type": "object", "javaType": "org.apache.camel.spi.TransactedPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "The transacted policy to use that is configured for either Spring or JTA based transactions. If no policy has been configured then Camel will attempt to auto-discover." },
+    "rollbackLoggingLevel": { "kind": "attribute", "displayName": "Rollback Logging Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "WARN", "description": "Sets the logging level to use for logging transactional rollback. This option is default WARN." },
+    "loggerRef": { "kind": "attribute", "displayName": "Logger Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a logger to use as logger for the error handler" },
+    "level": { "kind": "attribute", "displayName": "Level", "label": "advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
+    "logName": { "kind": "attribute", "displayName": "Log Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
+    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have fail [...]
+    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and t [...]
+    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
+    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown  [...]
+    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
+    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a retry while predicate. Will continue retrying until the predicate evaluates to false." },
+    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.errorhandler.RedeliveryPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
+    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
+    "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the redelivery settings" },
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
+  }
+}
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/cdi-jta.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/cdi-jta.json
index c3a841c75a6..bd226807972 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/cdi-jta.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/cdi-jta.json
@@ -7,7 +7,7 @@
     "deprecated": false,
     "firstVersion": "3.15.0",
     "label": "java",
-    "supportLevel": "Stable",
+    "supportLevel": "Preview",
     "groupId": "org.apache.camel",
     "artifactId": "camel-cdi-jta",
     "version": "3.17.0-SNAPSHOT"
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/cdi-main.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/cdi-main.json
index 0061ef93503..87e854e3cca 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/cdi-main.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/cdi-main.json
@@ -7,7 +7,7 @@
     "deprecated": false,
     "firstVersion": "3.15.0",
     "label": "java",
-    "supportLevel": "Stable",
+    "supportLevel": "Preview",
     "groupId": "org.apache.camel",
     "artifactId": "camel-cdi-main",
     "version": "3.17.0-SNAPSHOT"
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
index d44460ea06a..8cc4b780e39 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
@@ -294,6 +294,22 @@ To use DataSonnet scripts for message transformations.
     </xs:annotation>
   </xs:element>
 
+  <xs:element name="deadLetterChannel" type="tns:deadLetterChannelDefinition">
+    <xs:annotation>
+      <xs:documentation xml:lang="en"><![CDATA[
+Dead letter channel error handler.
+      ]]></xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="defaultErrorHandler" type="tns:defaultErrorHandlerDefinition">
+    <xs:annotation>
+      <xs:documentation xml:lang="en"><![CDATA[
+Default error handler.
+      ]]></xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
   <xs:element name="defaultLoadBalancer" type="tns:defaultServiceCallServiceLoadBalancerConfiguration">
     <xs:annotation>
       <xs:documentation xml:lang="en"><![CDATA[
@@ -382,10 +398,18 @@ Enriches a message with data from a secondary resource
     </xs:annotation>
   </xs:element>
 
-  <xs:element name="errorHandler" type="tns:errorHandlerDefinition">
+  <xs:element name="errorHandler" nillable="true" type="xs:anyType">
     <xs:annotation>
       <xs:documentation xml:lang="en"><![CDATA[
-Error handler settings
+Camel error handling.
+      ]]></xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="errorHandlerRef" type="tns:errorHandlerRefDefinition">
+    <xs:annotation>
+      <xs:documentation xml:lang="en"><![CDATA[
+Dead letter channel error handler.
       ]]></xs:documentation>
     </xs:annotation>
   </xs:element>
@@ -693,6 +717,14 @@ Evaluates a JSONPath expression against a JSON message body.
     </xs:annotation>
   </xs:element>
 
+  <xs:element name="jtaTransactionErrorHandler" type="tns:jtaTransactionErrorHandlerDefinition">
+    <xs:annotation>
+      <xs:documentation xml:lang="en"><![CDATA[
+JTA based transactional error handler (requires camel-jta).
+      ]]></xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
   <xs:element name="kamelet" type="tns:kameletDefinition">
     <xs:annotation>
       <xs:documentation xml:lang="en"><![CDATA[
@@ -814,6 +846,14 @@ Evaluates a MVEL template.
     </xs:annotation>
   </xs:element>
 
+  <xs:element name="noErrorHandler" type="tns:noErrorHandlerDefinition">
+    <xs:annotation>
+      <xs:documentation xml:lang="en"><![CDATA[
+No error handler.
+      ]]></xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
   <xs:element name="oauth2" type="tns:oAuth2Definition">
     <xs:annotation>
       <xs:documentation xml:lang="en"><![CDATA[
@@ -1511,6 +1551,14 @@ Splits a single message into many sub-messages.
     </xs:annotation>
   </xs:element>
 
+  <xs:element name="springTransactionErrorHandler" type="tns:springTransactionErrorHandlerDefinition">
+    <xs:annotation>
+      <xs:documentation xml:lang="en"><![CDATA[
+Spring based transactional error handler (requires camel-spring).
+      ]]></xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
   <xs:element name="sslContextParameters" type="tns:sslContextParametersFactoryBean">
     <xs:annotation>
       <xs:documentation xml:lang="en"><![CDATA[
@@ -4381,86 +4429,536 @@ producers.
         <xs:attribute name="aggregationStrategy" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en"><![CDATA[
-Sets the AggregationStrategy to be used to merge the reply from the external
-service, into a single outgoing message. By default Camel will use the reply
-from the external service as outgoing message.
+Sets the AggregationStrategy to be used to merge the reply from the external
+service, into a single outgoing message. By default Camel will use the reply
+from the external service as outgoing message.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="aggregationStrategyMethodName" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+This option can be used to explicit declare the method name to use, when using
+POJOs as the AggregationStrategy.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="aggregationStrategyMethodAllowNull" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+If this option is false then the aggregate method is not used if there was no
+data to enrich. If this option is true then null values is used as the
+oldExchange (when no data to enrich), when using POJOs as the
+AggregationStrategy.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="aggregateOnException" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+If this option is false then the aggregate method is not used if there was an
+exception thrown while trying to retrieve the data to enrich from the resource.
+Setting this option to true allows end users to control what to do if there was
+an exception in the aggregate method. For example to suppress the exception or
+set a custom message body etc. Default value: false
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="shareUnitOfWork" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Shares the org.apache.camel.spi.UnitOfWork with the parent and the resource
+exchange. Enrich will by default not share unit of work between the parent
+exchange and the resource exchange. This means the resource exchange has its own
+individual unit of work. Default value: false
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="cacheSize" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is
+used to cache and reuse producer when uris are reused. Beware that when using
+dynamic endpoints then it affects how well the cache can be utilized. If each
+dynamic endpoint is unique then its best to turn of caching by setting this to
+-1, which allows Camel to not cache both the producers and endpoints; they are
+regarded as prototype scoped and will be stopped and discarded after use. This
+reduces memory usage as otherwise producers/endpoints are stored in memory in
+the caches. However if there are a high degree of dynamic endpoints that have
+been used before, then it can benefit to use the cache to reuse both producers
+and endpoints and therefore the cache size can be set accordingly or rely on the
+default size (1000). If there is a mix of unique and used before dynamic
+endpoints, then setting a reasonable cache size can help reduce memory usage to
+avoid storing too many non frequent used producers.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="ignoreInvalidEndpoint" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Ignore the invalidate endpoint exception when try to create a producer with that
+endpoint. Default value: false
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="allowOptimisedComponents" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Whether to allow components to optimise enricher if they are
+org.apache.camel.spi.SendDynamicAware . Default value: true
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="errorHandlerDefinition">
+    <xs:complexContent>
+      <xs:extension base="tns:identifiedType">
+        <xs:sequence>
+          <xs:choice minOccurs="0">
+            <xs:element ref="tns:deadLetterChannel"/>
+            <xs:element ref="tns:defaultErrorHandler"/>
+            <xs:element ref="tns:noErrorHandler"/>
+            <xs:element ref="tns:jtaTransactionErrorHandler"/>
+            <xs:element ref="tns:springTransactionErrorHandler"/>
+          </xs:choice>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="deadLetterChannelDefinition">
+    <xs:complexContent>
+      <xs:extension base="tns:defaultErrorHandlerDefinition">
+        <xs:sequence/>
+        <xs:attribute name="deadLetterUri" type="xs:string" use="required">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+The dead letter endpoint uri for the Dead Letter error handler.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="deadLetterHandleNewException" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Whether the dead letter channel should handle (and ignore) any new exception
+that may been thrown during sending the message to the dead letter endpoint. The
+default value is true which means any such kind of exception is handled and
+ignored. Set this to false to let the exception be propagated back on the
+org.apache.camel.Exchange . This can be used in situations where you use
+transactions, and want to use Camel's dead letter channel to deal with
+exceptions during routing, but if the dead letter channel itself fails because
+of a new exception being thrown, then by setting this to false the new
+exceptions is propagated back and set on the org.apache.camel.Exchange , which
+allows the transaction to detect the exception, and rollback. Default value:
+true
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="defaultErrorHandlerDefinition">
+    <xs:complexContent>
+      <xs:extension base="tns:baseErrorHandlerDefinition">
+        <xs:sequence>
+          <xs:element minOccurs="0" ref="tns:redeliveryPolicy"/>
+        </xs:sequence>
+        <xs:attribute name="loggerRef" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+References to a logger to use as logger for the error handler.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="level" type="tns:loggingLevel">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Logging level to use when using the logging error handler type. Default value:
+ERROR
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="logName" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Name of the logger to use for the logging error handler.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="useOriginalMessage" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Will use the original input org.apache.camel.Message (original body and headers)
+when an org.apache.camel.Exchange is moved to the dead letter queue. Notice:
+this only applies when all redeliveries attempt have failed and the
+org.apache.camel.Exchange is doomed for failure. Instead of using the current
+inprogress org.apache.camel.Exchange IN message we use the original IN message
+instead. This allows you to store the original input in the dead letter queue
+instead of the inprogress snapshot of the IN message. For instance if you route
+transform the IN body during routing and then failed. With the original exchange
+store in the dead letter queue it might be easier to manually re submit the
+org.apache.camel.Exchange again as the IN message is the same as when Camel
+received it. So you should be able to send the org.apache.camel.Exchange to the
+same input. The difference between useOriginalMessage and useOriginalBody is
+that the former includes both the original body and headers, where as the latter
+only includes the original body. You can use the latter to enrich the message
+with custom headers and include the original message body. The former wont let
+you do this, as its using the original message body and headers as they are. You
+cannot enable both useOriginalMessage and useOriginalBody. Important: The
+original input means the input message that are bounded by the current
+org.apache.camel.spi.UnitOfWork . An unit of work typically spans one route, or
+multiple routes if they are connected using internal endpoints such as direct or
+seda. When messages is passed via external endpoints such as JMS or HTTP then
+the consumer will create a new unit of work, with the message it received as
+input as the original input. Also some EIP patterns such as splitter, multicast,
+will create a new unit of work boundary for the messages in their sub-route (eg
+the splitted message); however these EIPs have an option named shareUnitOfWork
+which allows to combine with the parent unit of work in regard to error handling
+and therefore use the parent original message. By default this feature is off.
+Default value: false
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="useOriginalBody" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Will use the original input org.apache.camel.Message body (original body only)
+when an org.apache.camel.Exchange is moved to the dead letter queue. Notice:
+this only applies when all redeliveries attempt have failed and the
+org.apache.camel.Exchange is doomed for failure. Instead of using the current
+inprogress org.apache.camel.Exchange IN message we use the original IN message
+instead. This allows you to store the original input in the dead letter queue
+instead of the inprogress snapshot of the IN message. For instance if you route
+transform the IN body during routing and then failed. With the original exchange
+store in the dead letter queue it might be easier to manually re submit the
+org.apache.camel.Exchange again as the IN message is the same as when Camel
+received it. So you should be able to send the org.apache.camel.Exchange to the
+same input. The difference between useOriginalMessage and useOriginalBody is
+that the former includes both the original body and headers, where as the latter
+only includes the original body. You can use the latter to enrich the message
+with custom headers and include the original message body. The former wont let
+you do this, as its using the original message body and headers as they are. You
+cannot enable both useOriginalMessage and useOriginalBody. Important: The
+original input means the input message that are bounded by the current
+org.apache.camel.spi.UnitOfWork . An unit of work typically spans one route, or
+multiple routes if they are connected using internal endpoints such as direct or
+seda. When messages is passed via external endpoints such as JMS or HTTP then
+the consumer will create a new unit of work, with the message it received as
+input as the original input. Also some EIP patterns such as splitter, multicast,
+will create a new unit of work boundary for the messages in their sub-route (eg
+the splitted message); however these EIPs have an option named shareUnitOfWork
+which allows to combine with the parent unit of work in regard to error handling
+and therefore use the parent original message. By default this feature is off.
+Default value: false
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="onRedeliveryRef" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets a reference to a processor that should be processed before a redelivery
+attempt. Can be used to change the org.apache.camel.Exchange before its being
+redelivered.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="onExceptionOccurredRef" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets a reference to a processor that should be processed just after an exception
+occurred. Can be used to perform custom logging about the occurred exception at
+the exact time it happened. Important: Any exception thrown from this processor
+will be ignored.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="onPrepareFailureRef" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets a reference to a processor to prepare the org.apache.camel.Exchange before
+handled by the failure processor / dead letter channel. This allows for example
+to enrich the message before sending to a dead letter queue.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="retryWhileRef" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets a retry while predicate. Will continue retrying until the predicate
+evaluates to false.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="redeliveryPolicyRef" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets a reference to a RedeliveryPolicy to be used for redelivery settings.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="executorServiceRef" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets a reference to a thread pool to be used by the error handler.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType abstract="true" name="baseErrorHandlerDefinition">
+    <xs:complexContent>
+      <xs:extension base="tns:identifiedType">
+        <xs:sequence/>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="redeliveryPolicyDefinition">
+    <xs:complexContent>
+      <xs:extension base="tns:identifiedType">
+        <xs:sequence/>
+        <xs:attribute name="maximumRedeliveries" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets the maximum redeliveries x = redeliver at most x times 0 = no redeliveries
+-1 = redeliver forever.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="redeliveryDelay" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets the initial redelivery delay. Default value: 1000
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="asyncDelayedRedelivery" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Allow asynchronous delayed redelivery. The route, in particular the consumer's
+component, must support the Asynchronous Routing Engine (e.g. seda). Default
+value: false
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="backOffMultiplier" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets the back off multiplier. Default value: 2.0
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="useExponentialBackOff" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Turn on exponential backk off. Default value: false
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="collisionAvoidanceFactor" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets the collision avoidance factor. Default value: 0.15
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="useCollisionAvoidance" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Turn on collision avoidance. Default value: false
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="maximumRedeliveryDelay" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets the maximum delay between redelivery. Default value: 60000
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="retriesExhaustedLogLevel" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets the logging level to use when retries have been exhausted. Default value:
+ERROR
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="retryAttemptedLogLevel" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets the logging level to use for logging retry attempts. Default value: DEBUG
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="retryAttemptedLogInterval" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets the interval to use for logging retry attempts. Default value: 1
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="logRetryAttempted" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets whether retry attempts should be logged or not. Can be used to include or
+reduce verbose. Default value: true
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="logStackTrace" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets whether stack traces should be logged. Can be used to include or reduce
+verbose. Default value: true
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="logRetryStackTrace" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets whether stack traces should be logged when an retry attempt failed. Can be
+used to include or reduce verbose. Default value: false
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="logHandled" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets whether handled exceptions should be logged or not. Can be used to include
+or reduce verbose. Default value: false
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="logNewException" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets whether new exceptions should be logged or not. Can be used to include or
+reduce verbose. A new exception is an exception that was thrown while handling a
+previous exception. Default value: true
             ]]></xs:documentation>
           </xs:annotation>
         </xs:attribute>
-        <xs:attribute name="aggregationStrategyMethodName" type="xs:string">
+        <xs:attribute name="logContinued" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en"><![CDATA[
-This option can be used to explicit declare the method name to use, when using
-POJOs as the AggregationStrategy.
+Sets whether continued exceptions should be logged or not. Can be used to
+include or reduce verbose. Default value: false
             ]]></xs:documentation>
           </xs:annotation>
         </xs:attribute>
-        <xs:attribute name="aggregationStrategyMethodAllowNull" type="xs:string">
+        <xs:attribute name="logExhausted" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en"><![CDATA[
-If this option is false then the aggregate method is not used if there was no
-data to enrich. If this option is true then null values is used as the
-oldExchange (when no data to enrich), when using POJOs as the
-AggregationStrategy.
+Sets whether exhausted exceptions should be logged or not. Can be used to
+include or reduce verbose. Default value: true
             ]]></xs:documentation>
           </xs:annotation>
         </xs:attribute>
-        <xs:attribute name="aggregateOnException" type="xs:string">
+        <xs:attribute name="logExhaustedMessageHistory" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en"><![CDATA[
-If this option is false then the aggregate method is not used if there was an
-exception thrown while trying to retrieve the data to enrich from the resource.
-Setting this option to true allows end users to control what to do if there was
-an exception in the aggregate method. For example to suppress the exception or
-set a custom message body etc. Default value: false
+Sets whether exhausted exceptions should be logged including message history or
+not (supports property placeholders). Can be used to include or reduce verbose.
+Default value: false
             ]]></xs:documentation>
           </xs:annotation>
         </xs:attribute>
-        <xs:attribute name="shareUnitOfWork" type="xs:string">
+        <xs:attribute name="logExhaustedMessageBody" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en"><![CDATA[
-Shares the org.apache.camel.spi.UnitOfWork with the parent and the resource
-exchange. Enrich will by default not share unit of work between the parent
-exchange and the resource exchange. This means the resource exchange has its own
-individual unit of work. Default value: false
+Sets whether exhausted message body should be logged including message history
+or not (supports property placeholders). Can be used to include or reduce
+verbose. Requires logExhaustedMessageHistory to be enabled. Default value: false
             ]]></xs:documentation>
           </xs:annotation>
         </xs:attribute>
-        <xs:attribute name="cacheSize" type="xs:string">
+        <xs:attribute name="disableRedelivery" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en"><![CDATA[
-Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is
-used to cache and reuse producer when uris are reused. Beware that when using
-dynamic endpoints then it affects how well the cache can be utilized. If each
-dynamic endpoint is unique then its best to turn of caching by setting this to
--1, which allows Camel to not cache both the producers and endpoints; they are
-regarded as prototype scoped and will be stopped and discarded after use. This
-reduces memory usage as otherwise producers/endpoints are stored in memory in
-the caches. However if there are a high degree of dynamic endpoints that have
-been used before, then it can benefit to use the cache to reuse both producers
-and endpoints and therefore the cache size can be set accordingly or rely on the
-default size (1000). If there is a mix of unique and used before dynamic
-endpoints, then setting a reasonable cache size can help reduce memory usage to
-avoid storing too many non frequent used producers.
+Disables redelivery (same as setting maximum redeliveries to 0). Default value:
+false
             ]]></xs:documentation>
           </xs:annotation>
         </xs:attribute>
-        <xs:attribute name="ignoreInvalidEndpoint" type="xs:string">
+        <xs:attribute name="delayPattern" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en"><![CDATA[
-Ignore the invalidate endpoint exception when try to create a producer with that
-endpoint. Default value: false
+Sets the delay pattern with delay intervals.
             ]]></xs:documentation>
           </xs:annotation>
         </xs:attribute>
-        <xs:attribute name="allowOptimisedComponents" type="xs:string">
+        <xs:attribute name="allowRedeliveryWhileStopping" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en"><![CDATA[
-Whether to allow components to optimise enricher if they are
-org.apache.camel.spi.SendDynamicAware . Default value: true
+Controls whether to allow redelivery while stopping/shutting down a route that
+uses error handling. Default value: true
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="exchangeFormatterRef" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets the reference of the instance of org.apache.camel.spi.ExchangeFormatter to
+generate the log message from exchange.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="noErrorHandlerDefinition">
+    <xs:complexContent>
+      <xs:extension base="tns:baseErrorHandlerDefinition">
+        <xs:sequence/>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="jtaTransactionErrorHandlerDefinition">
+    <xs:complexContent>
+      <xs:extension base="tns:transactionErrorHandlerDefinition">
+        <xs:sequence/>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType abstract="true" name="transactionErrorHandlerDefinition">
+    <xs:complexContent>
+      <xs:extension base="tns:defaultErrorHandlerDefinition">
+        <xs:sequence/>
+        <xs:attribute name="transactedPolicyRef" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+The transacted policy to use that is configured for either Spring or JTA based
+transactions. If no policy has been configured then Camel will attempt to
+auto-discover.
             ]]></xs:documentation>
           </xs:annotation>
         </xs:attribute>
+        <xs:attribute name="rollbackLoggingLevel" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Sets the logging level to use for logging transactional rollback. This option is
+default WARN. Default value: WARN
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="springTransactionErrorHandlerDefinition">
+    <xs:complexContent>
+      <xs:extension base="tns:transactionErrorHandlerDefinition">
+        <xs:sequence/>
       </xs:extension>
     </xs:complexContent>
   </xs:complexType>
@@ -9015,226 +9513,36 @@ Default value: false
 Will use the original input org.apache.camel.Message body (original body only)
 when an org.apache.camel.Exchange is moved to the dead letter queue. Notice:
 this only applies when all redeliveries attempt have failed and the
-org.apache.camel.Exchange is doomed for failure. Instead of using the current
-inprogress org.apache.camel.Exchange IN message we use the original IN message
-instead. This allows you to store the original input in the dead letter queue
-instead of the inprogress snapshot of the IN message. For instance if you route
-transform the IN body during routing and then failed. With the original exchange
-store in the dead letter queue it might be easier to manually re submit the
-org.apache.camel.Exchange again as the IN message is the same as when Camel
-received it. So you should be able to send the org.apache.camel.Exchange to the
-same input. The difference between useOriginalMessage and useOriginalBody is
-that the former includes both the original body and headers, where as the latter
-only includes the original body. You can use the latter to enrich the message
-with custom headers and include the original message body. The former wont let
-you do this, as its using the original message body and headers as they are. You
-cannot enable both useOriginalMessage and useOriginalBody. Important: The
-original input means the input message that are bounded by the current
-org.apache.camel.spi.UnitOfWork . An unit of work typically spans one route, or
-multiple routes if they are connected using internal endpoints such as direct or
-seda. When messages is passed via external endpoints such as JMS or HTTP then
-the consumer will create a new unit of work, with the message it received as
-input as the original input. Also some EIP patterns such as splitter, multicast,
-will create a new unit of work boundary for the messages in their sub-route (eg
-the split message); however these EIPs have an option named shareUnitOfWork
-which allows to combine with the parent unit of work in regard to error handling
-and therefore use the parent original message. By default this feature is off.
-Default value: false
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-
-  <xs:complexType name="redeliveryPolicyDefinition">
-    <xs:sequence/>
-    <xs:attribute name="maximumRedeliveries" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets the maximum redeliveries x = redeliver at most x times 0 = no redeliveries
--1 = redeliver forever.
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="redeliveryDelay" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets the initial redelivery delay.
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="asyncDelayedRedelivery" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Allow asynchronous delayed redelivery. The route, in particular the consumer's
-component, must support the Asynchronous Routing Engine (e.g. seda). Default
-value: false
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="backOffMultiplier" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets the back off multiplier.
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="useExponentialBackOff" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Turn on exponential backk off. Default value: false
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="collisionAvoidanceFactor" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets the collision avoidance factor.
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="useCollisionAvoidance" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Turn on collision avoidance. Default value: false
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="maximumRedeliveryDelay" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets the maximum delay between redelivery.
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="retriesExhaustedLogLevel" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets the logging level to use when retries have been exhausted.
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="retryAttemptedLogLevel" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets the logging level to use for logging retry attempts.
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="retryAttemptedLogInterval" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets the interval to use for logging retry attempts.
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="logRetryAttempted" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets whether retry attempts should be logged or not. Can be used to include or
-reduce verbose. Default value: false
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="logStackTrace" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets whether stack traces should be logged. Can be used to include or reduce
-verbose. Default value: false
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="logRetryStackTrace" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets whether stack traces should be logged when an retry attempt failed. Can be
-used to include or reduce verbose. Default value: false
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="logHandled" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets whether handled exceptions should be logged or not. Can be used to include
-or reduce verbose. Default value: false
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="logNewException" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets whether new exceptions should be logged or not. Can be used to include or
-reduce verbose. A new exception is an exception that was thrown while handling a
-previous exception. Default value: false
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="logContinued" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets whether continued exceptions should be logged or not. Can be used to
-include or reduce verbose. Default value: false
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="logExhausted" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets whether exhausted exceptions should be logged or not. Can be used to
-include or reduce verbose. Default value: false
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="logExhaustedMessageHistory" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets whether exhausted exceptions should be logged including message history or
-not (supports property placeholders). Can be used to include or reduce verbose.
+org.apache.camel.Exchange is doomed for failure. Instead of using the current
+inprogress org.apache.camel.Exchange IN message we use the original IN message
+instead. This allows you to store the original input in the dead letter queue
+instead of the inprogress snapshot of the IN message. For instance if you route
+transform the IN body during routing and then failed. With the original exchange
+store in the dead letter queue it might be easier to manually re submit the
+org.apache.camel.Exchange again as the IN message is the same as when Camel
+received it. So you should be able to send the org.apache.camel.Exchange to the
+same input. The difference between useOriginalMessage and useOriginalBody is
+that the former includes both the original body and headers, where as the latter
+only includes the original body. You can use the latter to enrich the message
+with custom headers and include the original message body. The former wont let
+you do this, as its using the original message body and headers as they are. You
+cannot enable both useOriginalMessage and useOriginalBody. Important: The
+original input means the input message that are bounded by the current
+org.apache.camel.spi.UnitOfWork . An unit of work typically spans one route, or
+multiple routes if they are connected using internal endpoints such as direct or
+seda. When messages is passed via external endpoints such as JMS or HTTP then
+the consumer will create a new unit of work, with the message it received as
+input as the original input. Also some EIP patterns such as splitter, multicast,
+will create a new unit of work boundary for the messages in their sub-route (eg
+the split message); however these EIPs have an option named shareUnitOfWork
+which allows to combine with the parent unit of work in regard to error handling
+and therefore use the parent original message. By default this feature is off.
 Default value: false
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="logExhaustedMessageBody" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets whether exhausted message body should be logged including message history
-or not (supports property placeholders). Can be used to include or reduce
-verbose. Requires logExhaustedMessageHistory to be enabled. Default value: false
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="disableRedelivery" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Disables redelivery (same as setting maximum redeliveries to 0). Default value:
-false
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="delayPattern" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets the delay pattern with delay intervals.
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="allowRedeliveryWhileStopping" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Controls whether to allow redelivery while stopping/shutting down a route that
-uses error handling. Default value: false
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="exchangeFormatterRef" type="xs:string">
-      <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
-Sets the reference of the instance of org.apache.camel.spi.ExchangeFormatter to
-generate the log message from exchange.
-        ]]></xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
   </xs:complexType>
 
   <xs:complexType name="onFallbackDefinition">
@@ -12833,6 +13141,21 @@ Set a reference to a custom Expression to use.
     </xs:sequence>
   </xs:complexType>
 
+  <xs:complexType name="errorHandlerRefDefinition">
+    <xs:complexContent>
+      <xs:extension base="tns:baseErrorHandlerDefinition">
+        <xs:sequence/>
+        <xs:attribute name="ref" type="xs:string" use="required">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+References to an existing or custom error handler.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
   <xs:complexType name="cSimpleExpression">
     <xs:simpleContent>
       <xs:extension base="tns:expression">
@@ -14934,205 +15257,28 @@ DEBUG. Default value: DEBUG
     </xs:complexContent>
   </xs:complexType>
 
-  <xs:complexType name="errorHandlerDefinition">
+  <xs:complexType name="springErrorHandlerDefinition">
     <xs:complexContent>
       <xs:extension base="tns:identifiedType">
         <xs:sequence>
-          <xs:element minOccurs="0" name="redeliveryPolicy" type="tns:camelRedeliveryPolicyFactoryBean">
-            <xs:annotation>
-              <xs:documentation xml:lang="en"><![CDATA[
-Sets the redelivery settings.
-              ]]></xs:documentation>
-            </xs:annotation>
-          </xs:element>
+          <xs:element minOccurs="0" name="redeliveryPolicy" type="tns:camelRedeliveryPolicyFactoryBean"/>
         </xs:sequence>
-        <xs:attribute name="type" type="tns:errorHandlerType">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-The type of the error handler. Default value: DefaultErrorHandler
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="deadLetterUri" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-The dead letter endpoint uri for the Dead Letter error handler.
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="deadLetterHandleNewException" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-Whether the dead letter channel should handle (and ignore) any new exception
-that may been thrown during sending the message to the dead letter endpoint. The
-default value is true which means any such kind of exception is handled and
-ignored. Set this to false to let the exception be propagated back on the
-org.apache.camel.Exchange . This can be used in situations where you use
-transactions, and want to use Camel's dead letter channel to deal with
-exceptions during routing, but if the dead letter channel itself fails because
-of a new exception being thrown, then by setting this to false the new
-exceptions is propagated back and set on the org.apache.camel.Exchange , which
-allows the transaction to detect the exception, and rollback.
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="level" type="tns:loggingLevel">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-Logging level to use when using the logging error handler type. Default value:
-ERROR
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="rollbackLoggingLevel" type="tns:loggingLevel">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-Sets the logging level to use for logging transactional rollback. This option is
-default WARN. Default value: WARN
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="logName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-Name of the logger to use for the logging error handler.
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="useOriginalMessage" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-Will use the original input org.apache.camel.Message (original body and headers)
-when an org.apache.camel.Exchange is moved to the dead letter queue. Notice:
-this only applies when all redeliveries attempt have failed and the
-org.apache.camel.Exchange is doomed for failure. Instead of using the current
-inprogress org.apache.camel.Exchange IN message we use the original IN message
-instead. This allows you to store the original input in the dead letter queue
-instead of the inprogress snapshot of the IN message. For instance if you route
-transform the IN body during routing and then failed. With the original exchange
-store in the dead letter queue it might be easier to manually re submit the
-org.apache.camel.Exchange again as the IN message is the same as when Camel
-received it. So you should be able to send the org.apache.camel.Exchange to the
-same input. The difference between useOriginalMessage and useOriginalBody is
-that the former includes both the original body and headers, where as the latter
-only includes the original body. You can use the latter to enrich the message
-with custom headers and include the original message body. The former wont let
-you do this, as its using the original message body and headers as they are. You
-cannot enable both useOriginalMessage and useOriginalBody. Important: The
-original input means the input message that are bounded by the current
-org.apache.camel.spi.UnitOfWork . An unit of work typically spans one route, or
-multiple routes if they are connected using internal endpoints such as direct or
-seda. When messages is passed via external endpoints such as JMS or HTTP then
-the consumer will create a new unit of work, with the message it received as
-input as the original input. Also some EIP patterns such as splitter, multicast,
-will create a new unit of work boundary for the messages in their sub-route (eg
-the splitted message); however these EIPs have an option named shareUnitOfWork
-which allows to combine with the parent unit of work in regard to error handling
-and therefore use the parent original message. By default this feature is off.
-Default value: false
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="useOriginalBody" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-Will use the original input org.apache.camel.Message body (original body only)
-when an org.apache.camel.Exchange is moved to the dead letter queue. Notice:
-this only applies when all redeliveries attempt have failed and the
-org.apache.camel.Exchange is doomed for failure. Instead of using the current
-inprogress org.apache.camel.Exchange IN message we use the original IN message
-instead. This allows you to store the original input in the dead letter queue
-instead of the inprogress snapshot of the IN message. For instance if you route
-transform the IN body during routing and then failed. With the original exchange
-store in the dead letter queue it might be easier to manually re submit the
-org.apache.camel.Exchange again as the IN message is the same as when Camel
-received it. So you should be able to send the org.apache.camel.Exchange to the
-same input. The difference between useOriginalMessage and useOriginalBody is
-that the former includes both the original body and headers, where as the latter
-only includes the original body. You can use the latter to enrich the message
-with custom headers and include the original message body. The former wont let
-you do this, as its using the original message body and headers as they are. You
-cannot enable both useOriginalMessage and useOriginalBody. Important: The
-original input means the input message that are bounded by the current
-org.apache.camel.spi.UnitOfWork . An unit of work typically spans one route, or
-multiple routes if they are connected using internal endpoints such as direct or
-seda. When messages is passed via external endpoints such as JMS or HTTP then
-the consumer will create a new unit of work, with the message it received as
-input as the original input. Also some EIP patterns such as splitter, multicast,
-will create a new unit of work boundary for the messages in their sub-route (eg
-the splitted message); however these EIPs have an option named shareUnitOfWork
-which allows to combine with the parent unit of work in regard to error handling
-and therefore use the parent original message. By default this feature is off.
-Default value: false
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="transactionTemplateRef" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-References to the org.springframework.transaction.support.TransactionTemplate to
-use with the transaction error handler.
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="transactionManagerRef" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-References to the org.springframework.transaction.PlatformTransactionManager to
-use with the transaction error handler.
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="onRedeliveryRef" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-Sets a reference to a processor that should be processed before a redelivery
-attempt. Can be used to change the org.apache.camel.Exchange before its being
-redelivered.
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="onExceptionOccurredRef" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-Sets a reference to a processor that should be processed just after an exception
-occurred. Can be used to perform custom logging about the occurred exception at
-the exact time it happened. Important: Any exception thrown from this processor
-will be ignored.
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="onPrepareFailureRef" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-Sets a reference to a processor to prepare the org.apache.camel.Exchange before
-handled by the failure processor / dead letter channel. This allows for example
-to enrich the message before sending to a dead letter queue.
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="retryWhileRef" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-Sets a reference to an retry while expression. Will continue retrying until
-expression evaluates to false.
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="redeliveryPolicyRef" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-Sets a reference to a RedeliveryPolicy to be used for redelivery settings.
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="executorServiceRef" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
-Sets a reference to a thread pool to be used by the error handler.
-            ]]></xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
+        <xs:attribute name="type" type="tns:springErrorHandlerType"/>
+        <xs:attribute name="deadLetterUri" type="xs:string"/>
+        <xs:attribute name="deadLetterHandleNewException" type="xs:string"/>
+        <xs:attribute name="level" type="tns:loggingLevel"/>
+        <xs:attribute name="rollbackLoggingLevel" type="tns:loggingLevel"/>
+        <xs:attribute name="logName" type="xs:string"/>
+        <xs:attribute name="useOriginalMessage" type="xs:boolean"/>
+        <xs:attribute name="useOriginalBody" type="xs:boolean"/>
+        <xs:attribute name="transactionTemplateRef" type="xs:string"/>
+        <xs:attribute name="transactionManagerRef" type="xs:string"/>
+        <xs:attribute name="onRedeliveryRef" type="xs:string"/>
+        <xs:attribute name="onExceptionOccurredRef" type="xs:string"/>
+        <xs:attribute name="onPrepareFailureRef" type="xs:string"/>
+        <xs:attribute name="retryWhileRef" type="xs:string"/>
+        <xs:attribute name="redeliveryPolicyRef" type="xs:string"/>
+        <xs:attribute name="executorServiceRef" type="xs:string"/>
       </xs:extension>
     </xs:complexContent>
   </xs:complexType>
@@ -15525,7 +15671,7 @@ multiple certificates.
     </xs:restriction>
   </xs:simpleType>
 
-  <xs:simpleType name="errorHandlerType">
+  <xs:simpleType name="springErrorHandlerType">
     <xs:restriction base="xs:string">
       <xs:enumeration value="DefaultErrorHandler"/>
       <xs:enumeration value="DeadLetterChannel"/>
diff --git a/components/camel-avro-rpc/camel-avro-rpc-component/src/test/resources/org/apache/camel/component/avro/avro-http-producer.xml b/components/camel-avro-rpc/camel-avro-rpc-component/src/test/resources/org/apache/camel/component/avro/avro-http-producer.xml
index 467f13bacbc..f8b93855491 100644
--- a/components/camel-avro-rpc/camel-avro-rpc-component/src/test/resources/org/apache/camel/component/avro/avro-http-producer.xml
+++ b/components/camel-avro-rpc/camel-avro-rpc-component/src/test/resources/org/apache/camel/component/avro/avro-http-producer.xml
@@ -23,11 +23,11 @@
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
 
-    <bean id="inOnlyErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="inOnlyErrorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:in-message-name-error"/>
     </bean>
 
-    <bean id="inOutErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="inOutErrorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:inout-message-name-error"/>
     </bean>
 
diff --git a/components/camel-avro-rpc/camel-avro-rpc-component/src/test/resources/org/apache/camel/component/avro/avro-netty-producer.xml b/components/camel-avro-rpc/camel-avro-rpc-component/src/test/resources/org/apache/camel/component/avro/avro-netty-producer.xml
index 187e1be98ae..125ea0a8ff4 100644
--- a/components/camel-avro-rpc/camel-avro-rpc-component/src/test/resources/org/apache/camel/component/avro/avro-netty-producer.xml
+++ b/components/camel-avro-rpc/camel-avro-rpc-component/src/test/resources/org/apache/camel/component/avro/avro-netty-producer.xml
@@ -23,11 +23,11 @@
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
 
-    <bean id="inOnlyErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="inOnlyErrorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:in-message-name-error"/>
     </bean>
 
-    <bean id="inOutErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="inOutErrorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:inout-message-name-error"/>
     </bean>
 
diff --git a/components/camel-cdi-jta/pom.xml b/components/camel-cdi-jta/pom.xml
index f3cec03bf1d..b10c2deaea6 100644
--- a/components/camel-cdi-jta/pom.xml
+++ b/components/camel-cdi-jta/pom.xml
@@ -36,6 +36,7 @@
         <firstVersion>3.15.0</firstVersion>
         <label>java</label>
         <title>CDI JTA</title>
+        <supportLevel>Preview</supportLevel>
     </properties>
 
     <dependencies>
diff --git a/components/camel-cdi-jta/src/generated/resources/cdi-jta.json b/components/camel-cdi-jta/src/generated/resources/cdi-jta.json
index c3a841c75a6..bd226807972 100644
--- a/components/camel-cdi-jta/src/generated/resources/cdi-jta.json
+++ b/components/camel-cdi-jta/src/generated/resources/cdi-jta.json
@@ -7,7 +7,7 @@
     "deprecated": false,
     "firstVersion": "3.15.0",
     "label": "java",
-    "supportLevel": "Stable",
+    "supportLevel": "Preview",
     "groupId": "org.apache.camel",
     "artifactId": "camel-cdi-jta",
     "version": "3.17.0-SNAPSHOT"
diff --git a/components/camel-cdi-jta/src/main/docs/cdi-jta.adoc b/components/camel-cdi-jta/src/main/docs/cdi-jta.adoc
index 956b43d8795..52fab1b6dc4 100644
--- a/components/camel-cdi-jta/src/main/docs/cdi-jta.adoc
+++ b/components/camel-cdi-jta/src/main/docs/cdi-jta.adoc
@@ -4,7 +4,7 @@
 :artifactid: camel-cdi-jta
 :description: JTA Transaction support for Camel CDI
 :since: 3.15
-:supportlevel: Stable
+:supportlevel: Preview
 
 *Since Camel {since}*
 
diff --git a/components/camel-cdi-jta/src/main/java/org/apache/camel/cdi/CdiRouteBuilder.java b/components/camel-cdi-jta/src/main/java/org/apache/camel/cdi/CdiRouteBuilder.java
deleted file mode 100644
index a695b0d8287..00000000000
--- a/components/camel-cdi-jta/src/main/java/org/apache/camel/cdi/CdiRouteBuilder.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.cdi;
-
-import org.apache.camel.builder.DefaultErrorHandlerBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.cdi.transaction.CdiTransactionalErrorHandlerBuilder;
-
-/**
- * An extension of the {@link RouteBuilder} to provide some additional JTA helper methods.
- *
- * You never really need it since {@code transactionErrorHandler()} can be replaced by
- * {@code new JtaTransactionErrorHandlerBuilder()}.
- */
-public abstract class CdiRouteBuilder extends RouteBuilder {
-
-    /**
-     * Creates a transaction error handler that will lookup in application context for an exiting transaction manager.
-     *
-     * @return the created error handler
-     */
-    // IMPORTANT: don't leak CdiJtaTransactionErrorHandlerBuilder in the signature,
-    //            only things not depending on camel-jta
-    public <T extends DefaultErrorHandlerBuilder & CdiTransactionalErrorHandlerBuilder> T transactionErrorHandler() {
-        try {
-            return (T) new org.apache.camel.cdi.transaction.CdiJtaTransactionErrorHandlerBuilder();
-        } catch (final NoClassDefFoundError e) {
-            throw new IllegalStateException("JTA not available");
-        }
-    }
-}
diff --git a/components/camel-cdi-main/pom.xml b/components/camel-cdi-main/pom.xml
index ba90c9f4260..bf576ec2a44 100644
--- a/components/camel-cdi-main/pom.xml
+++ b/components/camel-cdi-main/pom.xml
@@ -36,6 +36,7 @@
         <firstVersion>3.15.0</firstVersion>
         <label>java</label>
         <title>CDI Main</title>
+        <supportLevel>Preview</supportLevel>
     </properties>
 
     <dependencies>
diff --git a/components/camel-cdi-main/src/generated/resources/cdi-main.json b/components/camel-cdi-main/src/generated/resources/cdi-main.json
index 0061ef93503..87e854e3cca 100644
--- a/components/camel-cdi-main/src/generated/resources/cdi-main.json
+++ b/components/camel-cdi-main/src/generated/resources/cdi-main.json
@@ -7,7 +7,7 @@
     "deprecated": false,
     "firstVersion": "3.15.0",
     "label": "java",
-    "supportLevel": "Stable",
+    "supportLevel": "Preview",
     "groupId": "org.apache.camel",
     "artifactId": "camel-cdi-main",
     "version": "3.17.0-SNAPSHOT"
diff --git a/components/camel-cdi-main/src/main/docs/cdi-main.adoc b/components/camel-cdi-main/src/main/docs/cdi-main.adoc
index 089082472e4..331530adb48 100644
--- a/components/camel-cdi-main/src/main/docs/cdi-main.adoc
+++ b/components/camel-cdi-main/src/main/docs/cdi-main.adoc
@@ -4,7 +4,7 @@
 :artifactid: camel-cdi-main
 :description: Using Camel Main with CDI
 :since: 3.15
-:supportlevel: Stable
+:supportlevel: Preview
 
 *Since Camel {since}*
 
diff --git a/components/camel-cdi/pom.xml b/components/camel-cdi/pom.xml
index 385d39c4a71..71db38f2147 100644
--- a/components/camel-cdi/pom.xml
+++ b/components/camel-cdi/pom.xml
@@ -36,6 +36,7 @@
         <firstVersion>2.10.0</firstVersion>
         <label>java</label>
         <title>CDI</title>
+        <supportLevel>Preview</supportLevel>
     </properties>
 
     <dependencyManagement>
diff --git a/components/camel-cdi/src/generated/resources/cdi.json b/components/camel-cdi/src/generated/resources/cdi.json
index 75a7370f309..29edff9cf7b 100644
--- a/components/camel-cdi/src/generated/resources/cdi.json
+++ b/components/camel-cdi/src/generated/resources/cdi.json
@@ -7,7 +7,7 @@
     "deprecated": false,
     "firstVersion": "2.10.0",
     "label": "java",
-    "supportLevel": "Stable",
+    "supportLevel": "Preview",
     "groupId": "org.apache.camel",
     "artifactId": "camel-cdi",
     "version": "3.17.0-SNAPSHOT"
diff --git a/components/camel-cdi/src/main/docs/cdi.adoc b/components/camel-cdi/src/main/docs/cdi.adoc
index 1a4bc0211dd..3a2ef62f99b 100644
--- a/components/camel-cdi/src/main/docs/cdi.adoc
+++ b/components/camel-cdi/src/main/docs/cdi.adoc
@@ -4,7 +4,7 @@
 :artifactid: camel-cdi
 :description: Using Camel with CDI
 :since: 2.10
-:supportlevel: Stable
+:supportlevel: Preview
 
 *Since Camel {since}*
 
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/transaction/CdiJtaTransactionErrorHandlerBuilder.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/transaction/CdiJtaTransactionErrorHandlerBuilder.java
deleted file mode 100644
index 6b0e7e232b0..00000000000
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/transaction/CdiJtaTransactionErrorHandlerBuilder.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.cdi.transaction;
-
-import org.apache.camel.jta.JtaTransactionErrorHandlerBuilder;
-
-public class CdiJtaTransactionErrorHandlerBuilder extends JtaTransactionErrorHandlerBuilder
-        implements CdiTransactionalErrorHandlerBuilder {
-}
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/transaction/CdiTransactionalErrorHandlerBuilder.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/transaction/CdiTransactionalErrorHandlerBuilder.java
deleted file mode 100644
index 5b8a8eea3f2..00000000000
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/transaction/CdiTransactionalErrorHandlerBuilder.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.cdi.transaction;
-
-import org.apache.camel.LoggingLevel;
-import org.apache.camel.jta.JtaTransactionErrorHandlerBuilder;
-import org.apache.camel.jta.JtaTransactionPolicy;
-
-public interface CdiTransactionalErrorHandlerBuilder {
-    String getPolicyRef();
-
-    JtaTransactionErrorHandlerBuilder setTransactionPolicy(String ref);
-
-    JtaTransactionPolicy getTransactionPolicy();
-
-    JtaTransactionErrorHandlerBuilder setTransactionPolicy(JtaTransactionPolicy transactionPolicy);
-
-    LoggingLevel getRollbackLoggingLevel();
-
-    JtaTransactionErrorHandlerBuilder setRollbackLoggingLevel(LoggingLevel rollbackLoggingLevel);
-}
diff --git a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java
index 45312b0cc38..8ef339584d4 100644
--- a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java
+++ b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java
@@ -37,7 +37,7 @@ import org.apache.camel.LoggingLevel;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
 import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.builder.NoErrorHandlerBuilder;
+import org.apache.camel.builder.LegacyNoErrorHandlerBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.cxf.CXFTestSupport;
 import org.apache.camel.component.cxf.common.message.CxfConstants;
@@ -91,7 +91,7 @@ public class CxfRsConsumerTest extends CamelTestSupport {
         final Processor testProcessor3 = new TestProcessor3();
         return new RouteBuilder() {
             public void configure() {
-                errorHandler(new NoErrorHandlerBuilder());
+                errorHandler(new LegacyNoErrorHandlerBuilder());
                 from(CXF_RS_ENDPOINT_URI).process(testProcessor);
                 from(CXF_RS_ENDPOINT_URI2).process(testProcessor);
                 from(CXF_RS_ENDPOINT_URI3).process(testProcessor);
diff --git a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsSpringConsumerTest.java b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsSpringConsumerTest.java
index 14a87098340..671caa1d5f0 100644
--- a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsSpringConsumerTest.java
+++ b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsSpringConsumerTest.java
@@ -18,7 +18,7 @@ package org.apache.camel.component.cxf.jaxrs;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
-import org.apache.camel.builder.NoErrorHandlerBuilder;
+import org.apache.camel.builder.LegacyNoErrorHandlerBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.cxf.CXFTestSupport;
 import org.apache.camel.component.cxf.jaxrs.testbean.CustomException;
@@ -55,7 +55,7 @@ public class CxfRsSpringConsumerTest extends CamelSpringTestSupport {
         };
         return new RouteBuilder() {
             public void configure() {
-                errorHandler(new NoErrorHandlerBuilder());
+                errorHandler(new LegacyNoErrorHandlerBuilder());
                 from("cxfrs://bean://rsServer").process(testProcessor);
                 from("cxfrs://bean://rsServer2").process(testProcessor);
                 from("cxfrs://bean://rsServerInvoke?performInvocation=true").process(responseProcessor);
diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/JMXTXUseOriginalBodyWithTXErrorHandlerTest.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/JMXTXUseOriginalBodyWithTXErrorHandlerTest.java
index b57f95d4a76..7862558fc6d 100644
--- a/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/JMXTXUseOriginalBodyWithTXErrorHandlerTest.java
+++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/JMXTXUseOriginalBodyWithTXErrorHandlerTest.java
@@ -23,7 +23,7 @@ import org.apache.camel.Produce;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.spring.spi.TransactionErrorHandlerBuilder;
+import org.apache.camel.spring.spi.LegacyTransactionErrorHandlerBuilder;
 import org.junit.jupiter.api.Test;
 import org.springframework.context.support.AbstractXmlApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
@@ -91,7 +91,7 @@ public class JMXTXUseOriginalBodyWithTXErrorHandlerTest extends JMXTXUseOriginal
 
         @Override
         public void configure() {
-            errorHandler(new TransactionErrorHandlerBuilder());
+            errorHandler(new LegacyTransactionErrorHandlerBuilder());
 
             onException(Exception.class)
                     .handled(true)
diff --git a/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest-context.xml b/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest-context.xml
index 9328946cd0b..6f200341048 100644
--- a/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest-context.xml
+++ b/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest-context.xml
@@ -35,7 +35,7 @@
 
     <bean id="myFailureProcessor" class="org.apache.camel.component.jms.issues.TransactionErrorHandlerRedeliveryDelayTest$MyFailureProcessor"/>
 
-    <bean id="myTransactionErrorHandler" class="org.apache.camel.spring.spi.TransactionErrorHandlerBuilder">
+    <bean id="myTransactionErrorHandler" class="org.apache.camel.spring.spi.LegacyTransactionErrorHandlerBuilder">
         <property name="transactionTemplate" ref="PROPAGATION_REQUIRED"/>
     </bean>
 
diff --git a/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionErrorHandlerTest.xml b/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionErrorHandlerTest.xml
index b3e13d1de7f..1fbc765667d 100644
--- a/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionErrorHandlerTest.xml
+++ b/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionErrorHandlerTest.xml
@@ -56,7 +56,7 @@
 
     <!-- START SNIPPET: e3 -->
     <!-- use a transaction error handler -->
-    <bean id="myErrorHandler" class="org.apache.camel.spring.spi.TransactionErrorHandlerBuilder">
+    <bean id="myErrorHandler" class="org.apache.camel.spring.spi.LegacyTransactionErrorHandlerBuilder">
         <property name="redeliveryPolicy" ref="myPolicy"/>
     </bean>
     <!-- and let it try to redeliver up till 4 times -->
diff --git a/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionalClientTest.xml b/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionalClientTest.xml
index 6e77f1f332b..1d87f3d9954 100644
--- a/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionalClientTest.xml
+++ b/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionalClientTest.xml
@@ -46,7 +46,7 @@
 
     <!-- START SNIPPET: e2 -->
     <!-- the transactional error handler -->
-    <bean id="errorHandler" class="org.apache.camel.spring.spi.TransactionErrorHandlerBuilder">
+    <bean id="errorHandler" class="org.apache.camel.spring.spi.LegacyTransactionErrorHandlerBuilder">
         <property name="springTransactionPolicy" ref="PROPAGATION_REQUIRED"/>
     </bean>
 
diff --git a/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionalClientWithRollbackTest.xml b/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionalClientWithRollbackTest.xml
index 336d64e4f2f..11fc9f97111 100644
--- a/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionalClientWithRollbackTest.xml
+++ b/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionalClientWithRollbackTest.xml
@@ -55,7 +55,7 @@
 
     <!-- START SNIPPET: e2 -->
     <!-- the transactional error handler -->
-    <bean id="errorHandler" class="org.apache.camel.spring.spi.TransactionErrorHandlerBuilder">
+    <bean id="errorHandler" class="org.apache.camel.spring.spi.LegacyTransactionErrorHandlerBuilder">
         <property name="springTransactionPolicy" ref="PROPAGATION_REQUIRED"/>
     </bean>
 
diff --git a/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionErrorHandlerBuilderAsSpringBeanTest.xml b/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionErrorHandlerBuilderAsSpringBeanTest.xml
index 038bf43fdb4..cfecb8c9f20 100644
--- a/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionErrorHandlerBuilderAsSpringBeanTest.xml
+++ b/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionErrorHandlerBuilderAsSpringBeanTest.xml
@@ -66,7 +66,7 @@
     </bean>
 
     <!-- the transaction error handle we refer to from the route -->
-    <bean id="transactionErrorHandler" class="org.apache.camel.spring.spi.TransactionErrorHandlerBuilder">
+    <bean id="transactionErrorHandler" class="org.apache.camel.spring.spi.LegacyTransactionErrorHandlerBuilder">
         <property name="transactionTemplate" ref="PROPAGATION_REQUIRED"/>
     </bean>
 
diff --git a/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandler.java b/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandler.java
index dd3542e8894..68c8d66f4ee 100644
--- a/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandler.java
+++ b/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandler.java
@@ -24,8 +24,10 @@ import org.apache.camel.Exchange;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
+import org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition;
 import org.apache.camel.processor.errorhandler.RedeliveryErrorHandler;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
+import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier;
 import org.apache.camel.spi.CamelLogger;
 import org.apache.camel.spi.ErrorHandler;
 import org.slf4j.Logger;
@@ -38,6 +40,13 @@ import org.slf4j.LoggerFactory;
  */
 public class JtaTransactionErrorHandler extends RedeliveryErrorHandler {
 
+    static {
+        // register camel-jta as transaction error handler
+        ErrorHandlerReifier.registerReifier(JtaTransactionErrorHandlerDefinition.class,
+                (route, errorHandlerFactory) -> new JtaTransactionErrorHandlerReifier(
+                        route, (JtaTransactionErrorHandlerDefinition) errorHandlerFactory));
+    }
+
     private static final Logger LOG = LoggerFactory.getLogger(JtaTransactionErrorHandler.class);
     private final JtaTransactionPolicy transactionPolicy;
     private final LoggingLevel rollbackLoggingLevel;
diff --git a/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandlerBuilder.java b/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandlerBuilder.java
deleted file mode 100644
index 2fd0860b998..00000000000
--- a/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandlerBuilder.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.jta;
-
-import org.apache.camel.LoggingLevel;
-import org.apache.camel.builder.DefaultErrorHandlerBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilder;
-import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier;
-import org.apache.camel.spi.CamelLogger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Builds transactional error handlers. This class is based on
- * {@link org.apache.camel.spring.spi.TransactionErrorHandlerBuilder}.
- */
-public class JtaTransactionErrorHandlerBuilder extends DefaultErrorHandlerBuilder {
-
-    static {
-        ErrorHandlerReifier.registerReifier(JtaTransactionErrorHandlerBuilder.class, JtaTransactionErrorHandlerReifier::new);
-    }
-
-    private LoggingLevel rollbackLoggingLevel = LoggingLevel.WARN;
-
-    private JtaTransactionPolicy transactionPolicy;
-
-    private String policyRef;
-
-    @Override
-    public boolean supportTransacted() {
-        return true;
-    }
-
-    @Override
-    public ErrorHandlerBuilder cloneBuilder() {
-        final JtaTransactionErrorHandlerBuilder answer = new JtaTransactionErrorHandlerBuilder();
-        cloneBuilder(answer);
-        return answer;
-    }
-
-    @Override
-    protected void cloneBuilder(DefaultErrorHandlerBuilder other) {
-        super.cloneBuilder(other);
-        if (other instanceof JtaTransactionErrorHandlerBuilder) {
-            final JtaTransactionErrorHandlerBuilder otherTx = (JtaTransactionErrorHandlerBuilder) other;
-            transactionPolicy = otherTx.transactionPolicy;
-            rollbackLoggingLevel = otherTx.rollbackLoggingLevel;
-        }
-    }
-
-    public String getPolicyRef() {
-        return policyRef;
-    }
-
-    public JtaTransactionErrorHandlerBuilder setTransactionPolicy(final String ref) {
-        policyRef = ref;
-        return this;
-    }
-
-    public JtaTransactionPolicy getTransactionPolicy() {
-        return transactionPolicy;
-    }
-
-    public JtaTransactionErrorHandlerBuilder setTransactionPolicy(final JtaTransactionPolicy transactionPolicy) {
-        this.transactionPolicy = transactionPolicy;
-        return this;
-    }
-
-    public LoggingLevel getRollbackLoggingLevel() {
-        return rollbackLoggingLevel;
-    }
-
-    public JtaTransactionErrorHandlerBuilder setRollbackLoggingLevel(final LoggingLevel rollbackLoggingLevel) {
-        this.rollbackLoggingLevel = rollbackLoggingLevel;
-        return this;
-    }
-
-    @Override
-    protected CamelLogger createLogger() {
-        return new CamelLogger(LoggerFactory.getLogger(TransactionErrorHandler.class), LoggingLevel.ERROR);
-    }
-
-    @Override
-    public String toString() {
-        return "JtaTransactionErrorHandlerBuilder";
-    }
-}
diff --git a/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandlerReifier.java b/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandlerReifier.java
index d41edb70460..7dfa4f2e0d5 100644
--- a/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandlerReifier.java
+++ b/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandlerReifier.java
@@ -19,128 +19,166 @@ package org.apache.camel.jta;
 import java.util.Map;
 import java.util.concurrent.ScheduledExecutorService;
 
-import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.CamelContext;
 import org.apache.camel.LoggingLevel;
+import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
-import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.model.TransactedDefinition;
-import org.apache.camel.reifier.TransactedReifier;
+import org.apache.camel.model.RedeliveryPolicyDefinition;
+import org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.TransactionErrorHandlerDefinition;
+import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier;
+import org.apache.camel.spi.CamelLogger;
 import org.apache.camel.spi.ExecutorServiceManager;
-import org.apache.camel.spi.Policy;
+import org.apache.camel.spi.Language;
 import org.apache.camel.spi.ThreadPoolProfile;
-import org.apache.camel.spi.TransactedPolicy;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class JtaTransactionErrorHandlerReifier extends ErrorHandlerReifier<JtaTransactionErrorHandlerBuilder> {
-
-    public static final String ROLLBACK_LOGGING_LEVEL_PROPERTY
-            = JtaTransactionErrorHandlerBuilder.class.getName() + "#rollbackLoggingLevel";
+public class JtaTransactionErrorHandlerReifier extends ErrorHandlerReifier<JtaTransactionErrorHandlerDefinition> {
 
     private static final String PROPAGATION_REQUIRED = "PROPAGATION_REQUIRED";
 
     private static final Logger LOG = LoggerFactory.getLogger(JtaTransactionErrorHandlerReifier.class);
 
-    public JtaTransactionErrorHandlerReifier(Route route, ErrorHandlerFactory definition) {
-        super(route, (JtaTransactionErrorHandlerBuilder) definition);
+    public JtaTransactionErrorHandlerReifier(Route route, JtaTransactionErrorHandlerDefinition definition) {
+        super(route, definition);
     }
 
     @Override
     public Processor createErrorHandler(final Processor processor) throws Exception {
-        JtaTransactionPolicy transactionPolicy = definition.getTransactionPolicy();
-
-        // resolve policy reference, if given
-        if (transactionPolicy == null) {
-            if (definition.getPolicyRef() != null) {
-                final TransactedDefinition transactedDefinition = new TransactedDefinition();
-                transactedDefinition.setRef(definition.getPolicyRef());
-                final Policy policy = new TransactedReifier(camelContext, transactedDefinition).resolvePolicy();
-                if (policy != null) {
-                    if (!(policy instanceof JtaTransactionPolicy)) {
-                        throw new RuntimeCamelException(
-                                "The configured policy '" + definition.getPolicyRef()
-                                                        + "' is of type '" + policy.getClass().getName()
-                                                        + "' but an instance of '"
-                                                        + JtaTransactionPolicy.class.getName() + "' is required!");
-                    }
-                    transactionPolicy = (JtaTransactionPolicy) policy;
-                }
-            }
+        JtaTransactionPolicy transactionPolicy = resolveTransactionPolicy(definition, camelContext);
+        ObjectHelper.notNull(transactionPolicy, "transactionPolicy", this);
+
+        // optimize to use shared default instance if using out of the box settings
+        RedeliveryPolicy redeliveryPolicy = resolveRedeliveryPolicy(definition, camelContext);
+        CamelLogger logger = resolveLogger(definition, camelContext);
+        LoggingLevel rollbackLoggingLevel = resolveRollbackLoggingLevel(definition, camelContext);
+
+        JtaTransactionErrorHandler answer = new JtaTransactionErrorHandler(
+                camelContext, processor, logger,
+                getProcessor(definition.getOnRedeliveryProcessor(), definition.getOnRedeliveryRef()),
+                redeliveryPolicy,
+                transactionPolicy,
+                resolveRetryWhilePolicy(definition, camelContext),
+                getExecutorService(definition.getExecutorServiceBean(), definition.getExecutorServiceRef()),
+                rollbackLoggingLevel,
+                getProcessor(definition.getOnExceptionOccurredProcessor(), definition.getOnExceptionOccurredRef()));
+
+        // configure error handler before we can use it
+        configure(answer);
+        return answer;
+    }
+
+    private JtaTransactionPolicy resolveTransactionPolicy(
+            JtaTransactionErrorHandlerDefinition definition, CamelContext camelContext) {
+
+        JtaTransactionPolicy answer = (JtaTransactionPolicy) definition.getTransactedPolicy();
+        if (answer == null && definition.getTransactedPolicyRef() != null) {
+            answer = mandatoryLookup(definition.getTransactedPolicyRef(), JtaTransactionPolicy.class);
         }
 
         // try to lookup default policy
-        if (transactionPolicy == null) {
-            LOG.debug("No transaction policy configured on TransactionErrorHandlerBuilder. "
-                      + "Will try find it in the registry.");
+        if (answer == null) {
+            LOG.debug("No transaction policy configured on error handler. Will try find it in the registry.");
 
-            Map<String, TransactedPolicy> mapPolicy = findByTypeWithName(TransactedPolicy.class);
+            Map<String, JtaTransactionPolicy> mapPolicy = findByTypeWithName(JtaTransactionPolicy.class);
             if (mapPolicy != null && mapPolicy.size() == 1) {
-                TransactedPolicy policy = mapPolicy.values().iterator().next();
-                if (policy instanceof JtaTransactionPolicy) {
-                    transactionPolicy = (JtaTransactionPolicy) policy;
+                JtaTransactionPolicy policy = mapPolicy.values().iterator().next();
+                if (policy != null) {
+                    answer = policy;
                 }
             }
 
-            if (transactionPolicy == null) {
-                TransactedPolicy policy = lookupByNameAndType(PROPAGATION_REQUIRED, TransactedPolicy.class);
-                if (policy instanceof JtaTransactionPolicy) {
-                    transactionPolicy = (JtaTransactionPolicy) policy;
+            if (answer == null) {
+                JtaTransactionPolicy policy = lookupByNameAndType(PROPAGATION_REQUIRED, JtaTransactionPolicy.class);
+                if (policy != null) {
+                    answer = policy;
                 }
             }
 
-            if (transactionPolicy != null) {
-                LOG.debug("Found TransactionPolicy in registry to use: {}", transactionPolicy);
+            if (answer != null) {
+                LOG.debug("Found TransactionPolicy in registry to use: {}", answer);
             }
         }
 
-        ObjectHelper.notNull(transactionPolicy, "transactionPolicy", this);
+        return answer;
+    }
 
-        final Map<String, String> properties = camelContext.getGlobalOptions();
-        LoggingLevel rollbackLoggingLevel = definition.getRollbackLoggingLevel();
-        if (properties != null && properties.containsKey(ROLLBACK_LOGGING_LEVEL_PROPERTY)) {
-            rollbackLoggingLevel = LoggingLevel.valueOf(properties.get(ROLLBACK_LOGGING_LEVEL_PROPERTY));
+    private CamelLogger resolveLogger(TransactionErrorHandlerDefinition definition, CamelContext camelContext) {
+        CamelLogger answer = definition.getLoggerBean();
+        if (answer == null && definition.getLoggerRef() != null) {
+            answer = mandatoryLookup(definition.getLoggerRef(), CamelLogger.class);
         }
+        if (answer == null) {
+            answer = new CamelLogger(LoggerFactory.getLogger(TransactionErrorHandler.class), LoggingLevel.ERROR);
+        }
+        if (definition.getLevel() != null) {
+            answer.setLevel(definition.getLevel());
+        }
+        return answer;
+    }
 
-        JtaTransactionErrorHandler answer = new JtaTransactionErrorHandler(
-                camelContext,
-                processor,
-                definition.getLogger(),
-                definition.getOnRedelivery(),
-                definition.getRedeliveryPolicy(),
-                transactionPolicy,
-                definition.getRetryWhilePolicy(camelContext),
-                getExecutorService(),
-                rollbackLoggingLevel,
-                definition.getOnExceptionOccurred());
+    private LoggingLevel resolveRollbackLoggingLevel(TransactionErrorHandlerDefinition definition, CamelContext camelContext) {
+        LoggingLevel answer = LoggingLevel.WARN;
+        if (definition.getRollbackLoggingLevel() != null) {
+            answer = parse(LoggingLevel.class, definition.getRollbackLoggingLevel());
+        }
+        return answer;
+    }
+
+    private RedeliveryPolicy resolveRedeliveryPolicy(TransactionErrorHandlerDefinition definition, CamelContext camelContext) {
+        RedeliveryPolicy answer = null;
+        RedeliveryPolicyDefinition def = definition.getRedeliveryPolicy();
+        if (def == null && definition.getRedeliveryPolicyRef() != null) {
+            // ref may point to a definition
+            def = lookupByNameAndType(definition.getRedeliveryPolicyRef(), RedeliveryPolicyDefinition.class);
+        }
+        if (def != null) {
+            answer = ErrorHandlerReifier.createRedeliveryPolicy(def, camelContext, null);
+        }
+        if (def == null && definition.getRedeliveryPolicyRef() != null) {
+            answer = mandatoryLookup(definition.getRedeliveryPolicyRef(), RedeliveryPolicy.class);
+        }
+        if (answer == null) {
+            answer = RedeliveryPolicy.DEFAULT_POLICY;
+        }
+        return answer;
+    }
+
+    private Predicate resolveRetryWhilePolicy(TransactionErrorHandlerDefinition definition, CamelContext camelContext) {
+        Predicate answer = definition.getRetryWhilePredicate();
+
+        if (answer == null && definition.getRetryWhileRef() != null) {
+            // it is a bean expression
+            Language bean = camelContext.resolveLanguage("bean");
+            answer = bean.createPredicate(definition.getRetryWhileRef());
+            answer.initPredicate(camelContext);
+        }
 
-        // configure error handler before we can use it
-        configure(answer);
         return answer;
     }
 
-    protected synchronized ScheduledExecutorService getExecutorService() {
-        ScheduledExecutorService executorService = definition.getExecutorService();
+    protected synchronized ScheduledExecutorService getExecutorService(
+            ScheduledExecutorService executorService, String executorServiceRef) {
         if (executorService == null || executorService.isShutdown()) {
             // camel context will shutdown the executor when it shutdown so no
             // need to shut it down when stopping
-            if (definition.getExecutorServiceRef() != null) {
-                executorService = lookupByNameAndType(definition.getExecutorServiceRef(), ScheduledExecutorService.class);
+            if (executorServiceRef != null) {
+                executorService = lookupByNameAndType(executorServiceRef, ScheduledExecutorService.class);
                 if (executorService == null) {
                     ExecutorServiceManager manager = camelContext.getExecutorServiceManager();
-                    ThreadPoolProfile profile = manager.getThreadPoolProfile(definition.getExecutorServiceRef());
-                    executorService = manager.newScheduledThreadPool(this, definition.getExecutorServiceRef(), profile);
+                    ThreadPoolProfile profile = manager.getThreadPoolProfile(executorServiceRef);
+                    executorService = manager.newScheduledThreadPool(this, executorServiceRef, profile);
                 }
                 if (executorService == null) {
-                    throw new IllegalArgumentException(
-                            "ExecutorServiceRef " + definition.getExecutorServiceRef() + " not found in registry.");
+                    throw new IllegalArgumentException("ExecutorService " + executorServiceRef + " not found in registry.");
                 }
             } else {
                 // no explicit configured thread pool, so leave it up to the
-                // error handler to decide if it need
-                // a default thread pool from
+                // error handler to decide if it need a default thread pool from
                 // CamelContext#getErrorHandlerExecutorService
                 executorService = null;
             }
diff --git a/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionPolicy.java b/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionPolicy.java
index 20d75c1f50c..e8672e11531 100644
--- a/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionPolicy.java
+++ b/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionPolicy.java
@@ -16,24 +16,25 @@
  */
 package org.apache.camel.jta;
 
+import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.builder.ErrorHandlerBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.errorhandler.ErrorHandlerHelper;
+import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
+import org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition;
 import org.apache.camel.spi.TransactedPolicy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Sets a proper error handler. This class is based on org.apache.camel.spring.spi.SpringTransactionPolicy.
- * <p>
- * This class requires the resource {@link TransactionManager} to be available through JNDI url
+ * JTA transaction policy when using JTA based transactions.
+ *
+ * This class requires the resource TransactionManager to be available through JNDI url
  * &quot;java:/TransactionManager&quot;
  */
 public abstract class JtaTransactionPolicy implements TransactedPolicy {
@@ -69,39 +70,39 @@ public abstract class JtaTransactionPolicy implements TransactedPolicy {
 
         // find the existing error handler builder
         RouteDefinition routeDefinition = (RouteDefinition) route.getRoute();
-        ErrorHandlerBuilder builder = (ErrorHandlerBuilder) routeDefinition.getErrorHandlerFactory();
+        ErrorHandlerFactory builder = routeDefinition.getErrorHandlerFactory();
 
         // check if its a ref if so then do a lookup
-        if (builder instanceof ErrorHandlerBuilderRef) {
+        if (builder instanceof ErrorHandlerRefDefinition) {
             // its a reference to a error handler so lookup the reference
-            ErrorHandlerBuilderRef builderRef = (ErrorHandlerBuilderRef) builder;
+            ErrorHandlerRefDefinition builderRef = (ErrorHandlerRefDefinition) builder;
             String ref = builderRef.getRef();
             // only lookup if there was explicit an error handler builder configured
             // otherwise its just the "default" that has not explicit been configured
             // and if so then we can safely replace that with our transacted error handler
             if (ErrorHandlerHelper.isErrorHandlerFactoryConfigured(ref)) {
                 LOG.debug("Looking up ErrorHandlerBuilder with ref: {}", ref);
-                builder = (ErrorHandlerBuilder) ErrorHandlerHelper.lookupErrorHandlerFactory(route, ref, true);
+                builder = ErrorHandlerHelper.lookupErrorHandlerFactory(route, ref, true);
             }
         }
 
-        JtaTransactionErrorHandlerBuilder txBuilder;
+        JtaTransactionErrorHandlerDefinition txBuilder;
         if (builder != null && builder.supportTransacted()) {
-            if (!(builder instanceof JtaTransactionErrorHandlerBuilder)) {
+            if (!(builder instanceof JtaTransactionErrorHandlerDefinition)) {
                 throw new RuntimeCamelException(
                         "The given transactional error handler builder '" + builder
-                                                + "' is not of type '" + JtaTransactionErrorHandlerBuilder.class.getName()
+                                                + "' is not of type '" + JtaTransactionErrorHandlerDefinition.class.getName()
                                                 + "' which is required in this environment!");
             }
-            LOG.debug("The ErrorHandlerBuilder configured is a JtaTransactionErrorHandlerBuilder: {}", builder);
-            txBuilder = (JtaTransactionErrorHandlerBuilder) builder.cloneBuilder();
+            LOG.debug("The ErrorHandlerBuilder configured is a JtaTransactionErrorHandlerDefinition: {}", builder);
+            txBuilder = (JtaTransactionErrorHandlerDefinition) builder.cloneBuilder();
         } else {
             LOG.debug(
-                    "No or no transactional ErrorHandlerBuilder configured, will use default JtaTransactionErrorHandlerBuilder settings");
-            txBuilder = new JtaTransactionErrorHandlerBuilder();
+                    "No or no transactional ErrorHandlerBuilder configured, will use default JtaTransactionErrorHandlerDefinition settings");
+            txBuilder = new JtaTransactionErrorHandlerDefinition();
         }
 
-        txBuilder.setTransactionPolicy(this);
+        txBuilder.setTransactedPolicy(this);
 
         // use error handlers from the configured builder
         if (builder != null) {
@@ -119,7 +120,7 @@ public abstract class JtaTransactionPolicy implements TransactedPolicy {
 
     protected JtaTransactionErrorHandler createTransactionErrorHandler(
             Route route, Processor processor,
-            ErrorHandlerBuilder builder) {
+            ErrorHandlerFactory builder) {
         JtaTransactionErrorHandler answer;
         try {
             ModelCamelContext mcc = route.getCamelContext().adapt(ModelCamelContext.class);
diff --git a/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/errorHandler.json b/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/errorHandler.json
index 01f274bc93e..b35eb757c4a 100644
--- a/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/errorHandler.json
+++ b/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/errorHandler.json
@@ -6,13 +6,13 @@
     "description": "Error handler settings",
     "deprecated": false,
     "label": "spring,configuration,error",
-    "javaType": "org.apache.camel.spring.xml.ErrorHandlerDefinition",
+    "javaType": "org.apache.camel.spring.xml.SpringErrorHandlerDefinition",
     "abstract": false,
     "input": false,
     "output": false
   },
   "properties": {
-    "type": { "kind": "attribute", "displayName": "Type", "required": true, "type": "enum", "javaType": "org.apache.camel.spring.xml.ErrorHandlerType", "enum": [ "dead-letter-channel", "default-error-handler", "no-error-handler", "transaction-error-handler" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "DefaultErrorHandler", "description": "The type of the error handler" },
+    "type": { "kind": "attribute", "displayName": "Type", "required": true, "type": "enum", "javaType": "org.apache.camel.spring.xml.SpringErrorHandlerType", "enum": [ "dead-letter-channel", "default-error-handler", "no-error-handler", "transaction-error-handler" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "DefaultErrorHandler", "description": "The type of the error handler" },
     "deadLetterUri": { "kind": "attribute", "displayName": "Dead Letter Uri", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The dead letter endpoint uri for the Dead Letter error handler." },
     "deadLetterHandleNewException": { "kind": "attribute", "displayName": "Dead Letter Handle New Exception", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Whether the dead letter channel should handle (and ignore) any new exception that may been thrown during sending the message to the dead letter endpoint. The default value is true which means any such kind of exception is handled and ignor [...]
     "level": { "kind": "attribute", "displayName": "Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
diff --git a/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/jaxb.index b/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/jaxb.index
index ee308b7bfe4..05f3a050600 100644
--- a/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/jaxb.index
+++ b/components/camel-spring-xml/src/generated/resources/org/apache/camel/spring/xml/jaxb.index
@@ -11,10 +11,10 @@ CamelRouteConfigurationContextFactoryBean
 CamelRouteContextFactoryBean
 CamelRouteTemplateContextFactoryBean
 CamelThreadPoolFactoryBean
-ErrorHandlerDefinition
-ErrorHandlerType
 KeyStoreParametersFactoryBean
 SSLContextClientParametersFactoryBean
 SSLContextParametersFactoryBean
 SSLContextServerParametersFactoryBean
 SecureRandomParametersFactoryBean
+SpringErrorHandlerDefinition
+SpringErrorHandlerType
diff --git a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelContextFactoryBean.java b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelContextFactoryBean.java
index 30a7717f66c..4346b0990b9 100644
--- a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelContextFactoryBean.java
+++ b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelContextFactoryBean.java
@@ -219,7 +219,7 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Spr
             @XmlElement(name = "consumerTemplate", type = CamelConsumerTemplateFactoryBean.class) })
     private List<AbstractCamelFactoryBean<?>> beansFactory;
     @XmlElements({
-            @XmlElement(name = "errorHandler", type = ErrorHandlerDefinition.class) })
+            @XmlElement(name = "errorHandler", type = SpringErrorHandlerDefinition.class) })
     private List<?> beans;
     @XmlElement(name = "defaultServiceCallConfiguration")
     private ServiceCallConfigurationDefinition defaultServiceCallConfiguration;
diff --git a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/ErrorHandlerDefinition.java b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/SpringErrorHandlerDefinition.java
similarity index 98%
rename from components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/ErrorHandlerDefinition.java
rename to components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/SpringErrorHandlerDefinition.java
index 1d1141a4a5f..aaa41577455 100644
--- a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/ErrorHandlerDefinition.java
+++ b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/SpringErrorHandlerDefinition.java
@@ -33,10 +33,10 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "spring,configuration,error")
 @XmlRootElement(name = "errorHandler")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ErrorHandlerDefinition extends IdentifiedType {
+public class SpringErrorHandlerDefinition extends IdentifiedType {
     @XmlAttribute
     @Metadata(defaultValue = "DefaultErrorHandler", required = true)
-    private ErrorHandlerType type = ErrorHandlerType.DefaultErrorHandler;
+    private SpringErrorHandlerType type = SpringErrorHandlerType.DefaultErrorHandler;
     @XmlAttribute
     private String deadLetterUri;
     @XmlAttribute
@@ -72,14 +72,14 @@ public class ErrorHandlerDefinition extends IdentifiedType {
     @XmlElement
     private CamelRedeliveryPolicyFactoryBean redeliveryPolicy;
 
-    public ErrorHandlerType getType() {
+    public SpringErrorHandlerType getType() {
         return type;
     }
 
     /**
      * The type of the error handler
      */
-    public void setType(ErrorHandlerType type) {
+    public void setType(SpringErrorHandlerType type) {
         this.type = type;
     }
 
diff --git a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/ErrorHandlerType.java b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/SpringErrorHandlerType.java
similarity index 74%
rename from components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/ErrorHandlerType.java
rename to components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/SpringErrorHandlerType.java
index d0824755c99..561609894e4 100644
--- a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/ErrorHandlerType.java
+++ b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/SpringErrorHandlerType.java
@@ -19,11 +19,11 @@ package org.apache.camel.spring.xml;
 import javax.xml.bind.annotation.XmlEnum;
 import javax.xml.bind.annotation.XmlType;
 
-import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.DefaultErrorHandlerBuilder;
-import org.apache.camel.builder.NoErrorHandlerBuilder;
+import org.apache.camel.builder.LegacyDeadLetterChannelBuilder;
+import org.apache.camel.builder.LegacyDefaultErrorHandlerBuilder;
+import org.apache.camel.builder.LegacyNoErrorHandlerBuilder;
 import org.apache.camel.spi.Metadata;
-import org.apache.camel.spring.spi.TransactionErrorHandlerBuilder;
+import org.apache.camel.spring.spi.LegacyTransactionErrorHandlerBuilder;
 
 /**
  * Used to configure the error handler type
@@ -31,7 +31,7 @@ import org.apache.camel.spring.spi.TransactionErrorHandlerBuilder;
 @Metadata(label = "spring,configuration,error")
 @XmlType
 @XmlEnum
-public enum ErrorHandlerType {
+public enum SpringErrorHandlerType {
 
     DefaultErrorHandler,
     DeadLetterChannel,
@@ -46,13 +46,13 @@ public enum ErrorHandlerType {
     public Class<?> getTypeAsClass() {
         switch (this) {
             case DefaultErrorHandler:
-                return DefaultErrorHandlerBuilder.class;
+                return LegacyDefaultErrorHandlerBuilder.class;
             case DeadLetterChannel:
-                return DeadLetterChannelBuilder.class;
+                return LegacyDeadLetterChannelBuilder.class;
             case NoErrorHandler:
-                return NoErrorHandlerBuilder.class;
+                return LegacyNoErrorHandlerBuilder.class;
             case TransactionErrorHandler:
-                return TransactionErrorHandlerBuilder.class;
+                return LegacyTransactionErrorHandlerBuilder.class;
             default:
                 throw new IllegalArgumentException("Unknown error handler: " + this);
         }
diff --git a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/handler/CamelNamespaceHandler.java b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/handler/CamelNamespaceHandler.java
index e1af65155c5..369089422f9 100644
--- a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/handler/CamelNamespaceHandler.java
+++ b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/handler/CamelNamespaceHandler.java
@@ -32,11 +32,18 @@ import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
+import org.apache.camel.builder.LegacyDeadLetterChannelBuilder;
+import org.apache.camel.builder.LegacyDefaultErrorHandlerBuilder;
+import org.apache.camel.builder.LegacyNoErrorHandlerBuilder;
 import org.apache.camel.core.xml.CamelJMXAgentDefinition;
 import org.apache.camel.core.xml.CamelPropertyPlaceholderDefinition;
 import org.apache.camel.core.xml.CamelRouteControllerDefinition;
 import org.apache.camel.core.xml.CamelStreamCachingStrategyDefinition;
 import org.apache.camel.impl.engine.DefaultCamelContextNameStrategy;
+import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier;
+import org.apache.camel.reifier.errorhandler.LegacyDeadLetterChannelReifier;
+import org.apache.camel.reifier.errorhandler.LegacyDefaultErrorHandlerReifier;
+import org.apache.camel.reifier.errorhandler.LegacyNoErrorHandlerReifier;
 import org.apache.camel.spi.CamelContextNameStrategy;
 import org.apache.camel.spi.NamespaceAware;
 import org.apache.camel.spring.xml.CamelBeanPostProcessor;
@@ -74,6 +81,15 @@ import org.springframework.beans.factory.xml.ParserContext;
  * Camel namespace for the spring XML configuration file.
  */
 public class CamelNamespaceHandler extends NamespaceHandlerSupport {
+
+    static {
+        // legacy camel-spring-xml error-handling using its own model and parsers
+        ErrorHandlerReifier.registerReifier(LegacyDeadLetterChannelBuilder.class, LegacyDeadLetterChannelReifier::new);
+        ErrorHandlerReifier.registerReifier(LegacyDefaultErrorHandlerBuilder.class, LegacyDefaultErrorHandlerReifier::new);
+        ErrorHandlerReifier.registerReifier(LegacyNoErrorHandlerBuilder.class, LegacyNoErrorHandlerReifier::new);
+        // note: spring transaction error handler is registered in camel-spring
+    }
+
     private static final String SPRING_NS = "http://camel.apache.org/schema/spring";
     private static final Logger LOG = LoggerFactory.getLogger(CamelNamespaceHandler.class);
     protected BeanDefinitionParser endpointParser = new EndpointDefinitionParser();
diff --git a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/handler/ErrorHandlerDefinitionParser.java b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/handler/ErrorHandlerDefinitionParser.java
index 5b85e443b27..71c6ebaef3b 100644
--- a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/handler/ErrorHandlerDefinitionParser.java
+++ b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/handler/ErrorHandlerDefinitionParser.java
@@ -23,7 +23,7 @@ import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
 import org.apache.camel.spring.xml.CamelRedeliveryPolicyFactoryBean;
-import org.apache.camel.spring.xml.ErrorHandlerType;
+import org.apache.camel.spring.xml.SpringErrorHandlerType;
 import org.apache.camel.util.ObjectHelper;
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
@@ -45,10 +45,10 @@ public class ErrorHandlerDefinitionParser extends BeanDefinitionParser {
 
     @Override
     protected Class<?> getBeanClass(Element element) {
-        ErrorHandlerType type = ErrorHandlerType.DefaultErrorHandler;
+        SpringErrorHandlerType type = SpringErrorHandlerType.DefaultErrorHandler;
 
         if (ObjectHelper.isNotEmpty(element.getAttribute("type"))) {
-            type = ErrorHandlerType.valueOf(element.getAttribute("type"));
+            type = SpringErrorHandlerType.valueOf(element.getAttribute("type"));
         }
         return type.getTypeAsClass();
     }
@@ -79,13 +79,13 @@ public class ErrorHandlerDefinitionParser extends BeanDefinitionParser {
 
         String id = element.getAttribute("id");
 
-        ErrorHandlerType type = ErrorHandlerType.DefaultErrorHandler;
+        SpringErrorHandlerType type = SpringErrorHandlerType.DefaultErrorHandler;
         if (ObjectHelper.isNotEmpty(element.getAttribute("type"))) {
-            type = ErrorHandlerType.valueOf(element.getAttribute("type"));
+            type = SpringErrorHandlerType.valueOf(element.getAttribute("type"));
         }
-        if (type.equals(ErrorHandlerType.DefaultErrorHandler)
-                || type.equals(ErrorHandlerType.DeadLetterChannel)
-                || type.equals(ErrorHandlerType.TransactionErrorHandler)) {
+        if (type.equals(SpringErrorHandlerType.DefaultErrorHandler)
+                || type.equals(SpringErrorHandlerType.DeadLetterChannel)
+                || type.equals(SpringErrorHandlerType.TransactionErrorHandler)) {
             NodeList list = element.getChildNodes();
             int size = list.getLength();
             for (int i = 0; i < size; i++) {
@@ -111,7 +111,7 @@ public class ErrorHandlerDefinitionParser extends BeanDefinitionParser {
             parserRefAttribute(element, "onPrepareFailureRef", "onPrepareFailure", builder);
             parserRefAttribute(element, "onExceptionOccurredRef", "onExceptionOccurred", builder);
             parserRefAttribute(element, "redeliveryPolicyRef", "redeliveryPolicy", builder);
-            if (type.equals(ErrorHandlerType.TransactionErrorHandler)) {
+            if (type.equals(SpringErrorHandlerType.TransactionErrorHandler)) {
                 parserRefAttribute(element, "transactionTemplateRef", "transactionTemplate", builder);
                 parserRefAttribute(element, "transactionManagerRef", "transactionManager", builder);
             }
@@ -120,85 +120,87 @@ public class ErrorHandlerDefinitionParser extends BeanDefinitionParser {
         // validate attributes according to type
 
         String deadLetterUri = element.getAttribute("deadLetterUri");
-        if (ObjectHelper.isNotEmpty(deadLetterUri) && !type.equals(ErrorHandlerType.DeadLetterChannel)) {
+        if (ObjectHelper.isNotEmpty(deadLetterUri) && !type.equals(SpringErrorHandlerType.DeadLetterChannel)) {
             throw new IllegalArgumentException(
                     "Attribute deadLetterUri can only be used if type is "
-                                               + ErrorHandlerType.DeadLetterChannel.name() + ", in error handler with id: "
+                                               + SpringErrorHandlerType.DeadLetterChannel.name()
+                                               + ", in error handler with id: "
                                                + id);
         }
         String deadLetterHandleNewException = element.getAttribute("deadLetterHandleNewException");
-        if (ObjectHelper.isNotEmpty(deadLetterHandleNewException) && !type.equals(ErrorHandlerType.DeadLetterChannel)) {
+        if (ObjectHelper.isNotEmpty(deadLetterHandleNewException) && !type.equals(SpringErrorHandlerType.DeadLetterChannel)) {
             throw new IllegalArgumentException(
                     "Attribute deadLetterHandleNewException can only be used if type is "
-                                               + ErrorHandlerType.DeadLetterChannel.name() + ", in error handler with id: "
+                                               + SpringErrorHandlerType.DeadLetterChannel.name()
+                                               + ", in error handler with id: "
                                                + id);
         }
         String transactionTemplateRef = element.getAttribute("transactionTemplateRef");
-        if (ObjectHelper.isNotEmpty(transactionTemplateRef) && !type.equals(ErrorHandlerType.TransactionErrorHandler)) {
+        if (ObjectHelper.isNotEmpty(transactionTemplateRef) && !type.equals(SpringErrorHandlerType.TransactionErrorHandler)) {
             throw new IllegalArgumentException(
                     "Attribute transactionTemplateRef can only be used if type is "
-                                               + ErrorHandlerType.TransactionErrorHandler.name()
+                                               + SpringErrorHandlerType.TransactionErrorHandler.name()
                                                + ", in error handler with id: " + id);
         }
         String transactionManagerRef = element.getAttribute("transactionManagerRef");
-        if (ObjectHelper.isNotEmpty(transactionManagerRef) && !type.equals(ErrorHandlerType.TransactionErrorHandler)) {
+        if (ObjectHelper.isNotEmpty(transactionManagerRef) && !type.equals(SpringErrorHandlerType.TransactionErrorHandler)) {
             throw new IllegalArgumentException(
                     "Attribute transactionManagerRef can only be used if type is "
-                                               + ErrorHandlerType.TransactionErrorHandler.name()
+                                               + SpringErrorHandlerType.TransactionErrorHandler.name()
                                                + ", in error handler with id: " + id);
         }
         String rollbackLoggingLevel = element.getAttribute("rollbackLoggingLevel");
-        if (ObjectHelper.isNotEmpty(rollbackLoggingLevel) && !type.equals(ErrorHandlerType.TransactionErrorHandler)) {
+        if (ObjectHelper.isNotEmpty(rollbackLoggingLevel) && !type.equals(SpringErrorHandlerType.TransactionErrorHandler)) {
             throw new IllegalArgumentException(
                     "Attribute rollbackLoggingLevel can only be used if type is "
-                                               + ErrorHandlerType.TransactionErrorHandler.name()
+                                               + SpringErrorHandlerType.TransactionErrorHandler.name()
                                                + ", in error handler with id: " + id);
         }
         String useOriginalMessage = element.getAttribute("useOriginalMessage");
-        if (ObjectHelper.isNotEmpty(useOriginalMessage) && type.equals(ErrorHandlerType.NoErrorHandler)) {
+        if (ObjectHelper.isNotEmpty(useOriginalMessage) && type.equals(SpringErrorHandlerType.NoErrorHandler)) {
             throw new IllegalArgumentException(
                     "Attribute useOriginalMessage is not supported by error handler type: "
                                                + type.name() + ", in error handler with id: " + id);
         }
         String useOriginalBody = element.getAttribute("useOriginalBody");
-        if (ObjectHelper.isNotEmpty(useOriginalBody) && type.equals(ErrorHandlerType.NoErrorHandler)) {
+        if (ObjectHelper.isNotEmpty(useOriginalBody) && type.equals(SpringErrorHandlerType.NoErrorHandler)) {
             throw new IllegalArgumentException(
                     "Attribute useOriginalBody is not supported by error handler type: "
                                                + type.name() + ", in error handler with id: " + id);
         }
         String onRedeliveryRef = element.getAttribute("onRedeliveryRef");
-        if (ObjectHelper.isNotEmpty(onRedeliveryRef) && type.equals(ErrorHandlerType.NoErrorHandler)) {
+        if (ObjectHelper.isNotEmpty(onRedeliveryRef) && type.equals(SpringErrorHandlerType.NoErrorHandler)) {
             throw new IllegalArgumentException(
                     "Attribute onRedeliveryRef is not supported by error handler type: "
                                                + type.name() + ", in error handler with id: " + id);
         }
         String onExceptionOccurredRef = element.getAttribute("onExceptionOccurredRef");
-        if (ObjectHelper.isNotEmpty(onExceptionOccurredRef) && type.equals(ErrorHandlerType.NoErrorHandler)) {
+        if (ObjectHelper.isNotEmpty(onExceptionOccurredRef) && type.equals(SpringErrorHandlerType.NoErrorHandler)) {
             throw new IllegalArgumentException(
                     "Attribute onExceptionOccurredRef is not supported by error handler type: "
                                                + type.name() + ", in error handler with id: " + id);
         }
         String onPrepareFailureRef = element.getAttribute("onPrepareFailureRef");
-        if (ObjectHelper.isNotEmpty(onPrepareFailureRef) && (type.equals(ErrorHandlerType.TransactionErrorHandler)
-                || type.equals(ErrorHandlerType.NoErrorHandler))) {
+        if (ObjectHelper.isNotEmpty(onPrepareFailureRef) && (type.equals(SpringErrorHandlerType.TransactionErrorHandler)
+                || type.equals(SpringErrorHandlerType.NoErrorHandler))) {
             throw new IllegalArgumentException(
                     "Attribute onPrepareFailureRef is not supported by error handler type: "
                                                + type.name() + ", in error handler with id: " + id);
         }
         String retryWhileRef = element.getAttribute("retryWhileRef");
-        if (ObjectHelper.isNotEmpty(retryWhileRef) && type.equals(ErrorHandlerType.NoErrorHandler)) {
+        if (ObjectHelper.isNotEmpty(retryWhileRef) && type.equals(SpringErrorHandlerType.NoErrorHandler)) {
             throw new IllegalArgumentException(
                     "Attribute retryWhileRef is not supported by error handler type: "
                                                + type.name() + ", in error handler with id: " + id);
         }
         String redeliveryPolicyRef = element.getAttribute("redeliveryPolicyRef");
-        if (ObjectHelper.isNotEmpty(redeliveryPolicyRef) && type.equals(ErrorHandlerType.NoErrorHandler)) {
+        if (ObjectHelper.isNotEmpty(redeliveryPolicyRef) && type.equals(SpringErrorHandlerType.NoErrorHandler)) {
             throw new IllegalArgumentException(
                     "Attribute redeliveryPolicyRef is not supported by error handler type: "
                                                + type.name() + ", in error handler with id: " + id);
         }
         String executorServiceRef = element.getAttribute("executorServiceRef");
-        if (ObjectHelper.isNotEmpty(executorServiceRef) && type.equals(ErrorHandlerType.NoErrorHandler)) {
+        if (ObjectHelper.isNotEmpty(executorServiceRef) && type.equals(SpringErrorHandlerType.NoErrorHandler)) {
             throw new IllegalArgumentException(
                     "Attribute executorServiceRef is not supported by error handler type: "
                                                + type.name() + ", in error handler with id: " + id);
diff --git a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/config/DummyErrorHandlerBuilder.java b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/config/DummyErrorHandlerBuilder.java
index eef9686d033..4afea54bb2b 100644
--- a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/config/DummyErrorHandlerBuilder.java
+++ b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/config/DummyErrorHandlerBuilder.java
@@ -20,13 +20,12 @@ import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
-import org.apache.camel.builder.ErrorHandlerBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderSupport;
+import org.apache.camel.builder.LegacyErrorHandlerBuilderSupport;
 import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier;
 import org.apache.camel.support.processor.DelegateProcessor;
 import org.springframework.beans.factory.BeanNameAware;
 
-public class DummyErrorHandlerBuilder extends ErrorHandlerBuilderSupport implements BeanNameAware {
+public class DummyErrorHandlerBuilder extends LegacyErrorHandlerBuilderSupport implements BeanNameAware {
 
     public static final String PROPERTY_NAME = "DummyErrorHandler";
 
@@ -49,7 +48,7 @@ public class DummyErrorHandlerBuilder extends ErrorHandlerBuilderSupport impleme
     }
 
     @Override
-    public ErrorHandlerBuilder cloneBuilder() {
+    public DummyErrorHandlerBuilder cloneBuilder() {
         DummyErrorHandlerBuilder answer = new DummyErrorHandlerBuilder();
         answer.beanName = beanName;
         return answer;
diff --git a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceAsyncTest.java b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceAsyncTest.java
index 9af5324cec6..eed0530bcdd 100644
--- a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceAsyncTest.java
+++ b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceAsyncTest.java
@@ -20,8 +20,8 @@ import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.processor.async.MyAsyncComponent;
+import org.apache.camel.spring.spi.LegacyTransactionErrorHandlerBuilder;
 import org.apache.camel.spring.spi.SpringTransactionPolicy;
-import org.apache.camel.spring.spi.TransactionErrorHandlerBuilder;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -68,7 +68,7 @@ public class TransactionalClientDataSourceAsyncTest extends TransactionalClientD
 
                 // configure to use transaction error handler and pass on the required as it will fetch
                 // the transaction manager from it that it needs
-                TransactionErrorHandlerBuilder teh = new TransactionErrorHandlerBuilder();
+                LegacyTransactionErrorHandlerBuilder teh = new LegacyTransactionErrorHandlerBuilder();
                 teh.setSpringTransactionPolicy(required);
                 errorHandler(teh);
 
diff --git a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/xml/handler/ErrorHandlerDefinitionParserTest.java b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/xml/handler/ErrorHandlerDefinitionParserTest.java
index 61419b1a4c8..a935d17b882 100644
--- a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/xml/handler/ErrorHandlerDefinitionParserTest.java
+++ b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/xml/handler/ErrorHandlerDefinitionParserTest.java
@@ -17,10 +17,10 @@
 package org.apache.camel.spring.xml.handler;
 
 import org.apache.camel.Processor;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.DefaultErrorHandlerBuilder;
+import org.apache.camel.builder.LegacyDeadLetterChannelBuilder;
+import org.apache.camel.builder.LegacyDefaultErrorHandlerBuilder;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
-import org.apache.camel.spring.spi.TransactionErrorHandlerBuilder;
+import org.apache.camel.spring.spi.LegacyTransactionErrorHandlerBuilder;
 import org.apache.camel.util.IOHelper;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -46,7 +46,8 @@ public class ErrorHandlerDefinitionParserTest {
 
     @Test
     public void testDefaultErrorHandler() {
-        DefaultErrorHandlerBuilder errorHandler = ctx.getBean("defaultErrorHandler", DefaultErrorHandlerBuilder.class);
+        LegacyDefaultErrorHandlerBuilder errorHandler
+                = ctx.getBean("defaultErrorHandler", LegacyDefaultErrorHandlerBuilder.class);
         assertNotNull(errorHandler);
         RedeliveryPolicy policy = errorHandler.getRedeliveryPolicy();
         assertNotNull(policy);
@@ -54,14 +55,14 @@ public class ErrorHandlerDefinitionParserTest {
         assertEquals(0, policy.getRedeliveryDelay(), "Wrong redeliveryDelay");
         assertEquals(false, policy.isLogStackTrace(), "Wrong logStackTrace");
 
-        errorHandler = ctx.getBean("errorHandler", DefaultErrorHandlerBuilder.class);
+        errorHandler = ctx.getBean("errorHandler", LegacyDefaultErrorHandlerBuilder.class);
         assertNotNull(errorHandler);
     }
 
     @Test
     public void testTransactionErrorHandler() {
-        TransactionErrorHandlerBuilder errorHandler
-                = ctx.getBean("transactionErrorHandler", TransactionErrorHandlerBuilder.class);
+        LegacyTransactionErrorHandlerBuilder errorHandler
+                = ctx.getBean("transactionErrorHandler", LegacyTransactionErrorHandlerBuilder.class);
         assertNotNull(errorHandler);
         assertNotNull(errorHandler.getTransactionTemplate());
         Processor processor = errorHandler.getOnRedelivery();
@@ -70,14 +71,15 @@ public class ErrorHandlerDefinitionParserTest {
 
     @Test
     public void testTXErrorHandler() {
-        TransactionErrorHandlerBuilder errorHandler = ctx.getBean("txEH", TransactionErrorHandlerBuilder.class);
+        LegacyTransactionErrorHandlerBuilder errorHandler = ctx.getBean("txEH", LegacyTransactionErrorHandlerBuilder.class);
         assertNotNull(errorHandler);
         assertNotNull(errorHandler.getTransactionTemplate());
     }
 
     @Test
     public void testDeadLetterErrorHandler() {
-        DeadLetterChannelBuilder errorHandler = ctx.getBean("deadLetterErrorHandler", DeadLetterChannelBuilder.class);
+        LegacyDeadLetterChannelBuilder errorHandler
+                = ctx.getBean("deadLetterErrorHandler", LegacyDeadLetterChannelBuilder.class);
         assertNotNull(errorHandler);
         assertEquals("log:dead", errorHandler.getDeadLetterUri(), "Get wrong deadletteruri");
         RedeliveryPolicy policy = errorHandler.getRedeliveryPolicy();
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/config/DeadLetterChannelRedeliveryConfigTest-context.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/config/DeadLetterChannelRedeliveryConfigTest-context.xml
index a00db7ff2ae..dfe7218c292 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/config/DeadLetterChannelRedeliveryConfigTest-context.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/config/DeadLetterChannelRedeliveryConfigTest-context.xml
@@ -37,7 +37,7 @@
 
 	<!-- START SNIPPET: e2 -->
     <!-- here we configure our DeadLetterChannel -->
-	<bean id="myDeadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+	<bean id="myDeadLetterErrorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
 	    <!-- exchanges is routed to mock:dead in cased redelivery failed -->
         <property name="deadLetterUri" value="mock:dead"/>
 		<!-- reference the redelivery policy to use -->
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/config/DefaultErrorHandlerConfigTest-context.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/config/DefaultErrorHandlerConfigTest-context.xml
index da20fe47218..9e3723739a0 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/config/DefaultErrorHandlerConfigTest-context.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/config/DefaultErrorHandlerConfigTest-context.xml
@@ -37,7 +37,7 @@
         </route>
     </camelContext>
 
-    <bean id="dlc" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="dlc" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:dead"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/config/errorHandler.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/config/errorHandler.xml
index 17d9b809f6e..6dcbc74936e 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/config/errorHandler.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/config/errorHandler.xml
@@ -37,7 +37,7 @@
         </route>
     </camelContext>
 
-    <bean id="deadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="deadLetterErrorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:exceptionProcessor"/>
         <property name="redeliveryPolicy" ref="rsRedeliveryPolicyConfig"/>
     </bean>
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/interceptor/springTransactionalClientDataSource.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/interceptor/springTransactionalClientDataSource.xml
index 55c754940eb..7ed583d9937 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/interceptor/springTransactionalClientDataSource.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/interceptor/springTransactionalClientDataSource.xml
@@ -25,7 +25,7 @@
 
     <import resource="transactionalClientDataSource.xml"/>
 
-    <bean id="errorHandler" class="org.apache.camel.spring.spi.TransactionErrorHandlerBuilder">
+    <bean id="errorHandler" class="org.apache.camel.spring.spi.LegacyTransactionErrorHandlerBuilder">
         <property name="springTransactionPolicy" ref="PROPAGATION_REQUIRED"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/issues/SpringTransactionErrorHandlerAndContextScopedOnExceptionIssueTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/issues/SpringTransactionErrorHandlerAndContextScopedOnExceptionIssueTest.xml
index be6f729b79d..a187136f9ff 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/issues/SpringTransactionErrorHandlerAndContextScopedOnExceptionIssueTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/issues/SpringTransactionErrorHandlerAndContextScopedOnExceptionIssueTest.xml
@@ -49,7 +49,7 @@
     </bean>
 
     <!-- the error handler we use which is transactional -->
-    <bean id="myErrorHandler" class="org.apache.camel.spring.spi.TransactionErrorHandlerBuilder">
+    <bean id="myErrorHandler" class="org.apache.camel.spring.spi.LegacyTransactionErrorHandlerBuilder">
         <property name="transactionTemplate" ref="PROPAGATION_REQUIRES_NEW_TEMPLATE"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/InheritErrorHandlerDefaultTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/InheritErrorHandlerDefaultTest.xml
index 42800b8315a..1052b758436 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/InheritErrorHandlerDefaultTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/InheritErrorHandlerDefaultTest.xml
@@ -24,7 +24,7 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:dead"/>
         <property name="redeliveryPolicy" ref="myPolicy"/>
     </bean>
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/InheritErrorHandlerFalseTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/InheritErrorHandlerFalseTest.xml
index 1d6bd1a7c97..d2c97577d10 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/InheritErrorHandlerFalseTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/InheritErrorHandlerFalseTest.xml
@@ -24,7 +24,7 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:dead"/>
         <property name="redeliveryPolicy" ref="myPolicy"/>
     </bean>
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/InheritErrorHandlerTrueTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/InheritErrorHandlerTrueTest.xml
index bad7b954fd6..79f8eb2809c 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/InheritErrorHandlerTrueTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/InheritErrorHandlerTrueTest.xml
@@ -24,7 +24,7 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:dead"/>
         <property name="redeliveryPolicy" ref="myPolicy"/>
     </bean>
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelInvalidDeadLetterUriTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelInvalidDeadLetterUriTest.xml
index 5ee5c1fa572..83551bd211f 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelInvalidDeadLetterUriTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelInvalidDeadLetterUriTest.xml
@@ -24,7 +24,7 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-    <bean id="myDLC" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="myDLC" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <!-- invalid uri -->
         <property name="deadLetterUri" value="xxx"/>
     </bean>
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelInvalidOptionDeadLetterUriTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelInvalidOptionDeadLetterUriTest.xml
index 153d59160f9..21bb3aa7af2 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelInvalidOptionDeadLetterUriTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelInvalidOptionDeadLetterUriTest.xml
@@ -24,7 +24,7 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-    <bean id="myDLC" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="myDLC" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <!-- invalid option in direct uri -->
         <property name="deadLetterUri" value="direct:error?foo=bar"/>
     </bean>
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelUseOriginalBodyTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelUseOriginalBodyTest.xml
index 33bdb4b3016..97f17fe3646 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelUseOriginalBodyTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelUseOriginalBodyTest.xml
@@ -25,7 +25,7 @@
     ">
 
     <!-- START SNIPPET: e1 -->
-    <bean id="a" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="a" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <!-- move failed messages to the mock:a dead letter queue -->
         <property name="deadLetterUri" value="mock:a"/>
         <!-- we mark all exchanges as handled when they are moved to the dead letter queue, so the client
@@ -42,7 +42,7 @@
     </bean>
     <!-- END SNIPPET: e1 -->
 
-    <bean id="b" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="b" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <!-- move failed messages to the mock:b dead letter queue -->
         <property name="deadLetterUri" value="mock:b"/>
         <!-- we mark all exchanges as handled when they are moved to the dead letter queue, so the client
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelUseOriginalExchangeWithFileTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelUseOriginalExchangeWithFileTest.xml
index 8c5efc4dc68..b1ff909e160 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelUseOriginalExchangeWithFileTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringDeadLetterChannelUseOriginalExchangeWithFileTest.xml
@@ -25,7 +25,7 @@
     ">
 
     <!-- START SNIPPET: e1 -->
-    <bean id="dead" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="dead" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <!-- move failed messages to the mock:dead dead letter queue -->
         <property name="deadLetterUri" value="mock:dead"/>
         <!-- we mark all exchanges as handled when they are moved to the dead letter queue, so the client
@@ -42,7 +42,7 @@
     </bean>
     <!-- END SNIPPET: e1 -->
 
-    <bean id="b" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="b" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <!-- move failed messages to the mock:b dead letter queue -->
         <property name="deadLetterUri" value="mock:b"/>
         <!-- we mark all exchanges as handled when they are moved to the dead letter queue, so the client
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/failOverLoadBalance.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/failOverLoadBalance.xml
index 0f2c4944e11..b99ae3d9115 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/failOverLoadBalance.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/failOverLoadBalance.xml
@@ -64,7 +64,7 @@
     </route>    
   </camelContext>
   
-  <bean id="noErrorHandler" class="org.apache.camel.builder.NoErrorHandlerBuilder"/>
+  <bean id="noErrorHandler" class="org.apache.camel.builder.LegacyNoErrorHandlerBuilder"/>
   <bean id="myExceptionProcessor" class="org.apache.camel.processor.FailOverLoadBalanceTest$MyExceptionProcessor"/>
   <bean id="myAnotherExceptionProcessor" class="org.apache.camel.processor.FailOverLoadBalanceTest$MyAnotherExceptionProcessor"/>
   
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/DeadLetterChannelOnExceptionOnRedeliveryTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/DeadLetterChannelOnExceptionOnRedeliveryTest.xml
index dec27a3e811..5289a10386c 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/DeadLetterChannelOnExceptionOnRedeliveryTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/DeadLetterChannelOnExceptionOnRedeliveryTest.xml
@@ -24,7 +24,7 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-    <bean id="deadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="deadLetterErrorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
         <property name="onRedelivery" ref="myRedeliveryProcessor"/>
         <property name="redeliveryPolicy" ref="redeliveryPolicy"/>
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/RedeliveryPolicyRefTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/RedeliveryPolicyRefTest.xml
index ebb90ea124c..e9f65e26a89 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/RedeliveryPolicyRefTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/RedeliveryPolicyRefTest.xml
@@ -27,7 +27,7 @@
     <!-- START SNIPPET: e1 -->
 
     <!-- setup our error handler as the deal letter channel -->
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/SpringContextScopeOnExceptionTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/SpringContextScopeOnExceptionTest.xml
index 5cec1327bf3..4d3bf188927 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/SpringContextScopeOnExceptionTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/SpringContextScopeOnExceptionTest.xml
@@ -24,7 +24,7 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-  <bean id="deadLetter" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+  <bean id="deadLetter" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
     <property name="deadLetterUri" value="mock:dead"/>
   </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/SpringOnExceptionFromChoiceUseOriginalBodyTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/SpringOnExceptionFromChoiceUseOriginalBodyTest.xml
index b7793ede686..d3fa0ca2b3b 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/SpringOnExceptionFromChoiceUseOriginalBodyTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/SpringOnExceptionFromChoiceUseOriginalBodyTest.xml
@@ -24,7 +24,7 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-    <bean id="deadLetter" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="deadLetter" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/SpringOnExceptionUseOriginalBodyTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/SpringOnExceptionUseOriginalBodyTest.xml
index 23859c3d0e0..7f01bb68ba1 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/SpringOnExceptionUseOriginalBodyTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/SpringOnExceptionUseOriginalBodyTest.xml
@@ -24,7 +24,7 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-    <bean id="deadLetter" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="deadLetter" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:dead"/>
         <property name="redeliveryPolicy" ref="myRedeliveryPolicy"/>
     </bean>
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/deadLetterChannelHandledExampleTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/deadLetterChannelHandledExampleTest.xml
index 20372236dbc..8e3cdf2816a 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/deadLetterChannelHandledExampleTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/deadLetterChannelHandledExampleTest.xml
@@ -26,7 +26,7 @@
 
     <!-- START SNIPPET: e1 -->
     <!-- setup our error handler as the deal letter channel -->
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/onExceptionNotNormalizedClassNameTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/onExceptionNotNormalizedClassNameTest.xml
index 4faa08d7fa6..02841b2ebb7 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/onExceptionNotNormalizedClassNameTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/onExceptionNotNormalizedClassNameTest.xml
@@ -27,7 +27,7 @@
     <bean id="orderService" class="org.apache.camel.spring.processor.onexception.OrderService" />
 
     <!-- setup our error handler as the deal letter channel -->
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/onExceptionSubRouteTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/onExceptionSubRouteTest.xml
index 1bce864089e..df6ad437b73 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/onExceptionSubRouteTest.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/onexception/onExceptionSubRouteTest.xml
@@ -26,12 +26,12 @@
 
     <!-- START SNIPPET: e1 -->
     <!-- setup our error handler as the deal letter channel -->
-    <bean id="deadLetter" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="deadLetter" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:dead"/>
     </bean>
 
     <!-- the default error handler used in the 2nd route -->
-    <bean id="defaultErrorHandler" class="org.apache.camel.builder.DefaultErrorHandlerBuilder"/>
+    <bean id="defaultErrorHandler" class="org.apache.camel.builder.LegacyDefaultErrorHandlerBuilder"/>
 
     <!-- this is our POJO bean with our business logic defined as a plain spring bean -->
     <bean id="orderService" class="org.apache.camel.spring.processor.onexception.OrderService"/>
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildCustomProcessor.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildCustomProcessor.xml
index e30f45974a7..8471ddf2960 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildCustomProcessor.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildCustomProcessor.xml
@@ -25,7 +25,7 @@
     ">
 
     <!-- setup our error handler as the deal letter channel -->
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildCustomProcessorWithFilter.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildCustomProcessorWithFilter.xml
index eaf536f453c..c9782aeb0c4 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildCustomProcessorWithFilter.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildCustomProcessorWithFilter.xml
@@ -25,7 +25,7 @@
     ">
 
     <!-- setup our error handler as the deal letter channel -->
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildDynamicRecipientList.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildDynamicRecipientList.xml
index 285c6cb26fb..442b88bcb45 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildDynamicRecipientList.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildDynamicRecipientList.xml
@@ -25,7 +25,7 @@
     ">
 
     <!-- setup our error handler as the deal letter channel -->
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildIdempotentConsumer.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildIdempotentConsumer.xml
index be0e11409df..d55c9ca2d67 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildIdempotentConsumer.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildIdempotentConsumer.xml
@@ -25,7 +25,7 @@
     ">
 
     <!-- setup our error handler as the deal letter channel -->
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSimpleRoute.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSimpleRoute.xml
index be0e11409df..d55c9ca2d67 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSimpleRoute.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSimpleRoute.xml
@@ -25,7 +25,7 @@
     ">
 
     <!-- setup our error handler as the deal letter channel -->
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSimpleRouteWithChoice.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSimpleRouteWithChoice.xml
index 1ef6831a103..b89ce8662aa 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSimpleRouteWithChoice.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSimpleRouteWithChoice.xml
@@ -25,7 +25,7 @@
     ">
 
     <!-- setup our error handler as the deal letter channel -->
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSimpleRouteWithHeaderPredicate.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSimpleRouteWithHeaderPredicate.xml
index b14a0ba4591..686c7d7c7fb 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSimpleRouteWithHeaderPredicate.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSimpleRouteWithHeaderPredicate.xml
@@ -25,7 +25,7 @@
     ">
 
     <!-- setup our error handler as the deal letter channel -->
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSplitter.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSplitter.xml
index 4e2ce182782..87b06a0cd4c 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSplitter.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildSplitter.xml
@@ -25,7 +25,7 @@
     ">
 
     <!-- setup our error handler as the deal letter channel -->
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildStaticRecipientList.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildStaticRecipientList.xml
index 7d0757add11..c5a74a0a620 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildStaticRecipientList.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildStaticRecipientList.xml
@@ -25,7 +25,7 @@
     ">
 
     <!-- setup our error handler as the deal letter channel -->
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
     </bean>
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildWireTap.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildWireTap.xml
index d100e745fc1..96a1117656b 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildWireTap.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/xml/buildWireTap.xml
@@ -25,7 +25,7 @@
     ">
 
     <!-- setup our error handler as the deal letter channel -->
-    <bean id="errorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
+    <bean id="errorHandler" class="org.apache.camel.builder.LegacyDeadLetterChannelBuilder">
         <property name="deadLetterUri" value="mock:error"/>
     </bean>
 
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/SpringRouteBuilder.java b/components/camel-spring/src/main/java/org/apache/camel/spring/SpringRouteBuilder.java
index e708a6e3074..16b5f9b22ad 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/SpringRouteBuilder.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/SpringRouteBuilder.java
@@ -18,8 +18,8 @@ package org.apache.camel.spring;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.spring.spi.LegacyTransactionErrorHandlerBuilder;
 import org.apache.camel.spring.spi.SpringTransactionPolicy;
-import org.apache.camel.spring.spi.TransactionErrorHandlerBuilder;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.transaction.PlatformTransactionManager;
@@ -90,8 +90,8 @@ public abstract class SpringRouteBuilder extends RouteBuilder implements Applica
      *
      * @return the created error handler
      */
-    public TransactionErrorHandlerBuilder transactionErrorHandler() {
-        return new TransactionErrorHandlerBuilder();
+    public LegacyTransactionErrorHandlerBuilder transactionErrorHandler() {
+        return new LegacyTransactionErrorHandlerBuilder();
     }
 
     /**
@@ -100,7 +100,7 @@ public abstract class SpringRouteBuilder extends RouteBuilder implements Applica
      * @param  policy using this transaction policy (eg: required, supports, ...)
      * @return        the created error handler
      */
-    public TransactionErrorHandlerBuilder transactionErrorHandler(SpringTransactionPolicy policy) {
+    public LegacyTransactionErrorHandlerBuilder transactionErrorHandler(SpringTransactionPolicy policy) {
         return transactionErrorHandler(policy.getTransactionTemplate());
     }
 
@@ -110,8 +110,8 @@ public abstract class SpringRouteBuilder extends RouteBuilder implements Applica
      * @param  template the spring transaction template
      * @return          the created error handler
      */
-    public TransactionErrorHandlerBuilder transactionErrorHandler(TransactionTemplate template) {
-        TransactionErrorHandlerBuilder answer = new TransactionErrorHandlerBuilder();
+    public LegacyTransactionErrorHandlerBuilder transactionErrorHandler(TransactionTemplate template) {
+        LegacyTransactionErrorHandlerBuilder answer = new LegacyTransactionErrorHandlerBuilder();
         answer.setTransactionTemplate(template);
         return answer;
     }
@@ -122,7 +122,7 @@ public abstract class SpringRouteBuilder extends RouteBuilder implements Applica
      * @param  transactionManager the spring transaction manager
      * @return                    the created error handler
      */
-    public TransactionErrorHandlerBuilder transactionErrorHandler(PlatformTransactionManager transactionManager) {
+    public LegacyTransactionErrorHandlerBuilder transactionErrorHandler(PlatformTransactionManager transactionManager) {
         TransactionTemplate template = new TransactionTemplate(transactionManager);
         return transactionErrorHandler(template);
     }
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerBuilder.java b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/LegacyTransactionErrorHandlerBuilder.java
similarity index 82%
rename from components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerBuilder.java
rename to components/camel-spring/src/main/java/org/apache/camel/spring/spi/LegacyTransactionErrorHandlerBuilder.java
index 62ad79296c3..21fb01323df 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerBuilder.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/LegacyTransactionErrorHandlerBuilder.java
@@ -17,7 +17,7 @@
 package org.apache.camel.spring.spi;
 
 import org.apache.camel.LoggingLevel;
-import org.apache.camel.builder.DefaultErrorHandlerBuilder;
+import org.apache.camel.builder.LegacyDefaultErrorHandlerBuilder;
 import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier;
 import org.apache.camel.spi.CamelLogger;
 import org.slf4j.Logger;
@@ -28,18 +28,21 @@ import org.springframework.transaction.support.TransactionTemplate;
 /**
  * A transactional error handler that supports leveraging Spring TransactionManager.
  */
-public class TransactionErrorHandlerBuilder extends DefaultErrorHandlerBuilder {
+@Deprecated
+public class LegacyTransactionErrorHandlerBuilder extends LegacyDefaultErrorHandlerBuilder {
 
     static {
-        ErrorHandlerReifier.registerReifier(TransactionErrorHandlerBuilder.class, TransactionErrorHandlerReifier::new);
+        // legacy camel-spring-xml error-handling using its own model and parsers
+        ErrorHandlerReifier.registerReifier(LegacyTransactionErrorHandlerBuilder.class,
+                LegacyTransactionErrorHandlerReifier::new);
     }
 
-    private static final Logger LOG = LoggerFactory.getLogger(TransactionErrorHandlerBuilder.class);
+    private static final Logger LOG = LoggerFactory.getLogger(LegacyTransactionErrorHandlerBuilder.class);
     private static final String PROPAGATION_REQUIRED = "PROPAGATION_REQUIRED";
     private TransactionTemplate transactionTemplate;
     private LoggingLevel rollbackLoggingLevel = LoggingLevel.WARN;
 
-    public TransactionErrorHandlerBuilder() {
+    public LegacyTransactionErrorHandlerBuilder() {
         // no-arg constructor used by Spring DSL
     }
 
@@ -89,7 +92,7 @@ public class TransactionErrorHandlerBuilder extends DefaultErrorHandlerBuilder {
      *
      * @param rollbackLoggingLevel the logging level
      */
-    public TransactionErrorHandlerBuilder rollbackLoggingLevel(LoggingLevel rollbackLoggingLevel) {
+    public LegacyTransactionErrorHandlerBuilder rollbackLoggingLevel(LoggingLevel rollbackLoggingLevel) {
         setRollbackLoggingLevel(rollbackLoggingLevel);
         return this;
     }
@@ -104,7 +107,7 @@ public class TransactionErrorHandlerBuilder extends DefaultErrorHandlerBuilder {
 
     @Override
     public String toString() {
-        return "TransactionErrorHandlerBuilder";
+        return "LegacyTransactionErrorHandlerBuilder";
     }
 
 }
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/LegacyTransactionErrorHandlerReifier.java
similarity index 90%
copy from components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java
copy to components/camel-spring/src/main/java/org/apache/camel/spring/spi/LegacyTransactionErrorHandlerReifier.java
index 763a1b6900d..2e9e62f95c0 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/LegacyTransactionErrorHandlerReifier.java
@@ -21,7 +21,7 @@ import java.util.Map;
 import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
-import org.apache.camel.reifier.errorhandler.DefaultErrorHandlerReifier;
+import org.apache.camel.reifier.errorhandler.LegacyDefaultErrorHandlerReifier;
 import org.apache.camel.spi.TransactedPolicy;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
@@ -31,11 +31,16 @@ import org.springframework.transaction.support.TransactionTemplate;
 
 import static org.apache.camel.model.TransactedDefinition.PROPAGATION_REQUIRED;
 
-public class TransactionErrorHandlerReifier extends DefaultErrorHandlerReifier<TransactionErrorHandlerBuilder> {
+/**
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
+ */
+@Deprecated
+public class LegacyTransactionErrorHandlerReifier
+        extends LegacyDefaultErrorHandlerReifier<LegacyTransactionErrorHandlerBuilder> {
 
-    private static final Logger LOG = LoggerFactory.getLogger(TransactionErrorHandlerReifier.class);
+    private static final Logger LOG = LoggerFactory.getLogger(LegacyTransactionErrorHandlerReifier.class);
 
-    public TransactionErrorHandlerReifier(Route route, ErrorHandlerFactory definition) {
+    public LegacyTransactionErrorHandlerReifier(Route route, ErrorHandlerFactory definition) {
         super(route, definition);
     }
 
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 505d0faafe3..3611d689b62 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,15 +16,15 @@
  */
 package org.apache.camel.spring.spi;
 
+import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.builder.ErrorHandlerBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.errorhandler.ErrorHandlerHelper;
+import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
 import org.apache.camel.spi.TransactedPolicy;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
@@ -33,7 +33,7 @@ import org.springframework.transaction.PlatformTransactionManager;
 import org.springframework.transaction.support.TransactionTemplate;
 
 /**
- * Wraps the processor in a Spring transaction
+ * Spring transaction policy when using spring based transactions.
  */
 public class SpringTransactionPolicy implements TransactedPolicy {
     private static final Logger LOG = LoggerFactory.getLogger(SpringTransactionPolicy.class);
@@ -72,19 +72,19 @@ public class SpringTransactionPolicy implements TransactedPolicy {
 
         // find the existing error handler builder
         RouteDefinition routeDefinition = (RouteDefinition) route.getRoute();
-        ErrorHandlerBuilder builder = (ErrorHandlerBuilder) routeDefinition.getErrorHandlerFactory();
+        ErrorHandlerFactory builder = routeDefinition.getErrorHandlerFactory();
 
         // check if its a ref if so then do a lookup
-        if (builder instanceof ErrorHandlerBuilderRef) {
+        if (builder instanceof ErrorHandlerRefDefinition) {
             // its a reference to a error handler so lookup the reference
-            ErrorHandlerBuilderRef builderRef = (ErrorHandlerBuilderRef) builder;
+            ErrorHandlerRefDefinition builderRef = (ErrorHandlerRefDefinition) builder;
             String ref = builderRef.getRef();
             // only lookup if there was explicit an error handler builder configured
             // otherwise its just the "default" that has not explicit been configured
             // and if so then we can safely replace that with our transacted error handler
             if (ErrorHandlerHelper.isErrorHandlerFactoryConfigured(ref)) {
                 LOG.debug("Looking up ErrorHandlerBuilder with ref: {}", ref);
-                builder = (ErrorHandlerBuilder) ErrorHandlerHelper.lookupErrorHandlerFactory(route, ref, true);
+                builder = ErrorHandlerHelper.lookupErrorHandlerFactory(route, ref, true);
             }
         }
 
@@ -101,7 +101,7 @@ public class SpringTransactionPolicy implements TransactedPolicy {
             } else {
                 LOG.debug("No ErrorHandlerBuilder configured, will use default TransactionErrorHandlerBuilder settings");
             }
-            TransactionErrorHandlerBuilder txBuilder = new TransactionErrorHandlerBuilder();
+            LegacyTransactionErrorHandlerBuilder txBuilder = new LegacyTransactionErrorHandlerBuilder();
             txBuilder.setTransactionTemplate(getTransactionTemplate());
             txBuilder.setSpringTransactionPolicy(this);
             if (builder != null) {
@@ -119,7 +119,7 @@ public class SpringTransactionPolicy implements TransactedPolicy {
     }
 
     protected TransactionErrorHandler createTransactionErrorHandler(
-            Route route, Processor processor, ErrorHandlerBuilder builder) {
+            Route route, Processor processor, ErrorHandlerFactory builder) {
         TransactionErrorHandler answer;
         try {
             ModelCamelContext mcc = route.getCamelContext().adapt(ModelCamelContext.class);
@@ -148,6 +148,10 @@ public class SpringTransactionPolicy implements TransactedPolicy {
         this.template = template;
     }
 
+    public TransactionTemplate getTemplate() {
+        return template;
+    }
+
     public void setTransactionManager(PlatformTransactionManager transactionManager) {
         this.transactionManager = transactionManager;
     }
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java
index 763a1b6900d..ddd58397d0d 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java
@@ -17,12 +17,22 @@
 package org.apache.camel.spring.spi;
 
 import java.util.Map;
+import java.util.concurrent.ScheduledExecutorService;
 
-import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.CamelContext;
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
-import org.apache.camel.reifier.errorhandler.DefaultErrorHandlerReifier;
-import org.apache.camel.spi.TransactedPolicy;
+import org.apache.camel.model.RedeliveryPolicyDefinition;
+import org.apache.camel.model.errorhandler.SpringTransactionErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.TransactionErrorHandlerDefinition;
+import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
+import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier;
+import org.apache.camel.spi.CamelLogger;
+import org.apache.camel.spi.ExecutorServiceManager;
+import org.apache.camel.spi.Language;
+import org.apache.camel.spi.ThreadPoolProfile;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,80 +41,186 @@ import org.springframework.transaction.support.TransactionTemplate;
 
 import static org.apache.camel.model.TransactedDefinition.PROPAGATION_REQUIRED;
 
-public class TransactionErrorHandlerReifier extends DefaultErrorHandlerReifier<TransactionErrorHandlerBuilder> {
+public class TransactionErrorHandlerReifier extends ErrorHandlerReifier<SpringTransactionErrorHandlerDefinition> {
+
+    static {
+        // register camel-spring as transaction error handler
+        ErrorHandlerReifier.registerReifier(SpringTransactionErrorHandlerDefinition.class,
+                (route, errorHandlerFactory) -> new TransactionErrorHandlerReifier(
+                        route, (SpringTransactionErrorHandlerDefinition) errorHandlerFactory));
+    }
 
     private static final Logger LOG = LoggerFactory.getLogger(TransactionErrorHandlerReifier.class);
 
-    public TransactionErrorHandlerReifier(Route route, ErrorHandlerFactory definition) {
+    public TransactionErrorHandlerReifier(Route route, SpringTransactionErrorHandlerDefinition definition) {
         super(route, definition);
     }
 
     @Override
     public Processor createErrorHandler(Processor processor) throws Exception {
-        TransactionTemplate transactionTemplate = definition.getTransactionTemplate();
-        if (transactionTemplate == null) {
-            // lookup in context if no transaction template has been configured
-            LOG.debug("No TransactionTemplate configured on TransactionErrorHandlerBuilder. Will try find it in the registry.");
+        // must have a transaction template
+        TransactionTemplate transactionTemplate = resolveTransactionTemplate(definition, camelContext);
+        ObjectHelper.notNull(transactionTemplate, "transactionTemplate", this);
+
+        // optimize to use shared default instance if using out of the box settings
+        RedeliveryPolicy redeliveryPolicy = resolveRedeliveryPolicy(definition, camelContext);
+        CamelLogger logger = resolveLogger(definition, camelContext);
+        LoggingLevel rollbackLoggingLevel = resolveRollbackLoggingLevel(definition, camelContext);
+
+        TransactionErrorHandler answer = new TransactionErrorHandler(
+                camelContext, processor, logger,
+                getProcessor(definition.getOnRedeliveryProcessor(), definition.getOnRedeliveryRef()),
+                redeliveryPolicy,
+                transactionTemplate,
+                resolveRetryWhilePolicy(definition, camelContext),
+                getExecutorService(definition.getExecutorServiceBean(), definition.getExecutorServiceRef()),
+                rollbackLoggingLevel,
+                getProcessor(definition.getOnExceptionOccurredProcessor(), definition.getOnExceptionOccurredRef()));
+        // configure error handler before we can use it
+        configure(answer);
+        return answer;
+    }
+
+    private TransactionTemplate resolveTransactionTemplate(
+            TransactionErrorHandlerDefinition definition, CamelContext camelContext) {
 
-            Map<String, TransactedPolicy> mapPolicy = findByTypeWithName(TransactedPolicy.class);
+        TransactionTemplate answer = null;
+
+        SpringTransactionPolicy policy = (SpringTransactionPolicy) definition.getTransactedPolicy();
+        if (policy == null && definition.getTransactedPolicyRef() != null) {
+            policy = mandatoryLookup(definition.getTransactedPolicyRef(), SpringTransactionPolicy.class);
+        }
+        if (policy != null) {
+            answer = ((SpringTransactionPolicy) policy).getTransactionTemplate();
+        }
+
+        if (answer == null) {
+            Map<String, SpringTransactionPolicy> mapPolicy = findByTypeWithName(SpringTransactionPolicy.class);
             if (mapPolicy != null && mapPolicy.size() == 1) {
-                TransactedPolicy policy = mapPolicy.values().iterator().next();
-                if (policy instanceof SpringTransactionPolicy) {
-                    transactionTemplate = ((SpringTransactionPolicy) policy).getTransactionTemplate();
+                policy = mapPolicy.values().iterator().next();
+                if (policy != null) {
+                    answer = policy.getTransactionTemplate();
                 }
             }
+        }
 
-            if (transactionTemplate == null) {
-                TransactedPolicy policy = lookupByNameAndType(PROPAGATION_REQUIRED, TransactedPolicy.class);
-                if (policy instanceof SpringTransactionPolicy) {
-                    transactionTemplate = ((SpringTransactionPolicy) policy).getTransactionTemplate();
-                }
+        if (answer == null) {
+            policy = lookupByNameAndType(PROPAGATION_REQUIRED, SpringTransactionPolicy.class);
+            if (policy != null) {
+                answer = policy.getTransactionTemplate();
             }
+        }
 
-            if (transactionTemplate == null) {
-                Map<String, TransactionTemplate> mapTemplate = findByTypeWithName(TransactionTemplate.class);
-                if (mapTemplate == null || mapTemplate.isEmpty()) {
-                    LOG.trace("No TransactionTemplate found in registry.");
-                } else if (mapTemplate.size() == 1) {
-                    transactionTemplate = mapTemplate.values().iterator().next();
-                } else {
-                    LOG.debug("Found {} TransactionTemplate in registry. Cannot determine which one to use. "
-                              + "Please configure a TransactionTemplate on the TransactionErrorHandlerBuilder",
-                            mapTemplate.size());
-                }
+        if (answer == null) {
+            Map<String, TransactionTemplate> mapTemplate = findByTypeWithName(TransactionTemplate.class);
+            if (mapTemplate == null || mapTemplate.isEmpty()) {
+                LOG.trace("No TransactionTemplate found in registry.");
+            } else if (mapTemplate.size() == 1) {
+                answer = mapTemplate.values().iterator().next();
+            } else {
+                LOG.debug("Found {} TransactionTemplate in registry. Cannot determine which one to use. "
+                          + "Please configure a TransactionTemplate on the TransactionErrorHandlerBuilder",
+                        mapTemplate.size());
             }
+        }
 
-            if (transactionTemplate == null) {
-                Map<String, PlatformTransactionManager> mapManager = findByTypeWithName(PlatformTransactionManager.class);
-                if (mapManager == null || mapManager.isEmpty()) {
-                    LOG.trace("No PlatformTransactionManager found in registry.");
-                } else if (mapManager.size() == 1) {
-                    transactionTemplate = new TransactionTemplate(mapManager.values().iterator().next());
-                } else {
-                    LOG.debug(
-                            "Found {} PlatformTransactionManager in registry. Cannot determine which one to use for TransactionTemplate. "
-                              + "Please configure a TransactionTemplate on the TransactionErrorHandlerBuilder",
-                            mapManager.size());
-                }
+        if (answer == null) {
+            Map<String, PlatformTransactionManager> mapManager = findByTypeWithName(PlatformTransactionManager.class);
+            if (mapManager == null || mapManager.isEmpty()) {
+                LOG.trace("No PlatformTransactionManager found in registry.");
+            } else if (mapManager.size() == 1) {
+                answer = new TransactionTemplate(mapManager.values().iterator().next());
+            } else {
+                LOG.debug(
+                        "Found {} PlatformTransactionManager in registry. Cannot determine which one to use for TransactionTemplate. "
+                          + "Please configure a TransactionTemplate on the TransactionErrorHandlerBuilder",
+                        mapManager.size());
             }
+        }
 
-            if (transactionTemplate != null) {
-                LOG.debug("Found TransactionTemplate in registry to use: {}", transactionTemplate);
-            }
+        if (answer != null) {
+            LOG.debug("Found TransactionTemplate in registry to use: {}", answer);
         }
+        return answer;
+    }
 
-        ObjectHelper.notNull(transactionTemplate, "transactionTemplate", this);
+    private CamelLogger resolveLogger(TransactionErrorHandlerDefinition definition, CamelContext camelContext) {
+        CamelLogger answer = definition.getLoggerBean();
+        if (answer == null && definition.getLoggerRef() != null) {
+            answer = mandatoryLookup(definition.getLoggerRef(), CamelLogger.class);
+        }
+        if (answer == null) {
+            answer = new CamelLogger(LoggerFactory.getLogger(TransactionErrorHandler.class), LoggingLevel.ERROR);
+        }
+        if (definition.getLevel() != null) {
+            answer.setLevel(definition.getLevel());
+        }
+        return answer;
+    }
 
-        TransactionErrorHandler answer = new TransactionErrorHandler(
-                camelContext, processor,
-                definition.getLogger(), definition.getOnRedelivery(),
-                definition.getRedeliveryPolicy(), transactionTemplate,
-                definition.getRetryWhilePolicy(camelContext),
-                getExecutorService(definition.getExecutorService(), definition.getExecutorServiceRef()),
-                definition.getRollbackLoggingLevel(), definition.getOnExceptionOccurred());
-        // configure error handler before we can use it
-        configure(answer);
+    private LoggingLevel resolveRollbackLoggingLevel(TransactionErrorHandlerDefinition definition, CamelContext camelContext) {
+        LoggingLevel answer = LoggingLevel.WARN;
+        if (definition.getRollbackLoggingLevel() != null) {
+            answer = parse(LoggingLevel.class, definition.getRollbackLoggingLevel());
+        }
         return answer;
     }
 
+    private RedeliveryPolicy resolveRedeliveryPolicy(TransactionErrorHandlerDefinition definition, CamelContext camelContext) {
+        RedeliveryPolicy answer = null;
+        RedeliveryPolicyDefinition def = definition.getRedeliveryPolicy();
+        if (def == null && definition.getRedeliveryPolicyRef() != null) {
+            // ref may point to a definition
+            def = lookupByNameAndType(definition.getRedeliveryPolicyRef(), RedeliveryPolicyDefinition.class);
+        }
+        if (def != null) {
+            answer = ErrorHandlerReifier.createRedeliveryPolicy(def, camelContext, null);
+        }
+        if (def == null && definition.getRedeliveryPolicyRef() != null) {
+            answer = mandatoryLookup(definition.getRedeliveryPolicyRef(), RedeliveryPolicy.class);
+        }
+        if (answer == null) {
+            answer = RedeliveryPolicy.DEFAULT_POLICY;
+        }
+        return answer;
+    }
+
+    private Predicate resolveRetryWhilePolicy(TransactionErrorHandlerDefinition definition, CamelContext camelContext) {
+        Predicate answer = definition.getRetryWhilePredicate();
+
+        if (answer == null && definition.getRetryWhileRef() != null) {
+            // it is a bean expression
+            Language bean = camelContext.resolveLanguage("bean");
+            answer = bean.createPredicate(definition.getRetryWhileRef());
+            answer.initPredicate(camelContext);
+        }
+
+        return answer;
+    }
+
+    protected synchronized ScheduledExecutorService getExecutorService(
+            ScheduledExecutorService executorService, String executorServiceRef) {
+        if (executorService == null || executorService.isShutdown()) {
+            // camel context will shutdown the executor when it shutdown so no
+            // need to shut it down when stopping
+            if (executorServiceRef != null) {
+                executorService = lookupByNameAndType(executorServiceRef, ScheduledExecutorService.class);
+                if (executorService == null) {
+                    ExecutorServiceManager manager = camelContext.getExecutorServiceManager();
+                    ThreadPoolProfile profile = manager.getThreadPoolProfile(executorServiceRef);
+                    executorService = manager.newScheduledThreadPool(this, executorServiceRef, profile);
+                }
+                if (executorService == null) {
+                    throw new IllegalArgumentException("ExecutorService " + executorServiceRef + " not found in registry.");
+                }
+            } else {
+                // no explicit configured thread pool, so leave it up to the
+                // error handler to decide if it need a default thread pool from
+                // CamelContext#getErrorHandlerExecutorService
+                executorService = null;
+            }
+        }
+        return executorService;
+    }
+
 }
diff --git a/components/camel-test/camel-test-cdi-junit5/pom.xml b/components/camel-test/camel-test-cdi-junit5/pom.xml
index 75b01b3ae1f..4f20a82655c 100644
--- a/components/camel-test/camel-test-cdi-junit5/pom.xml
+++ b/components/camel-test/camel-test-cdi-junit5/pom.xml
@@ -36,6 +36,7 @@
         <firstVersion>3.16.0</firstVersion>
         <label>testing,java</label>
         <title>Test CDI JUnit5</title>
+        <supportLevel>Preview</supportLevel>
     </properties>
 
     <dependencies>
diff --git a/core/camel-api/src/main/java/org/apache/camel/ErrorHandlerFactory.java b/core/camel-api/src/main/java/org/apache/camel/ErrorHandlerFactory.java
index 9941a6ae1c4..235e48d02f5 100644
--- a/core/camel-api/src/main/java/org/apache/camel/ErrorHandlerFactory.java
+++ b/core/camel-api/src/main/java/org/apache/camel/ErrorHandlerFactory.java
@@ -21,4 +21,19 @@ package org.apache.camel;
  */
 public interface ErrorHandlerFactory {
 
+    /**
+     * Whether this error handler supports transacted exchanges.
+     */
+    boolean supportTransacted();
+
+    /**
+     * Clones this factory so each route has its private builder to use, to avoid changes from one route to influence
+     * the others.
+     * <p/>
+     * This is needed by the current Camel route architecture
+     *
+     * @return a clone of this factory
+     */
+    ErrorHandlerFactory cloneBuilder();
+
 }
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/ExceptionHandler.java b/core/camel-api/src/main/java/org/apache/camel/spi/ExceptionHandler.java
index 986d1d6a13d..14f90be07fd 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/ExceptionHandler.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/ExceptionHandler.java
@@ -21,8 +21,8 @@ import org.apache.camel.Exchange;
 /**
  * A Strategy pattern for handling exceptions; particularly in asynchronous processes such as consumers.
  * <p/>
- * Its important to <b>not</b> throw any exceptions when handling exceptions as the handler is often invoked in a try
- * .. catch logic already
+ * Its important to <b>not</b> throw any exceptions when handling exceptions as the handler is often invoked in a try ..
+ * catch logic already
  */
 public interface ExceptionHandler {
 
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index f9e382ea104..9697bc18977 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -282,6 +282,7 @@ public abstract class AbstractCamelContext extends BaseService
     private String basePackageScan;
     private boolean lightweight;
     private Long delay;
+    @Deprecated
     private ErrorHandlerFactory errorHandlerFactory;
     private Map<String, String> globalOptions = new HashMap<>();
     private volatile String version;
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
index c1021759700..5c39c860bea 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
@@ -92,6 +92,7 @@ public class DefaultRoute extends ServiceSupport implements Route {
     private ResumeStrategy resumeStrategy;
 
     // camel-core-model
+    @Deprecated
     private ErrorHandlerFactory errorHandlerFactory;
     // camel-core-model: must be concurrent as error handlers can be mutated concurrently via multicast/recipientlist EIPs
     private final ConcurrentMap<ErrorHandlerFactory, Set<NamedNode>> errorHandlers = new ConcurrentHashMap<>();
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModelReifierFactory.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModelReifierFactory.java
index 76c52474658..182a18af242 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModelReifierFactory.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModelReifierFactory.java
@@ -22,9 +22,9 @@ import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
-import org.apache.camel.builder.DefaultErrorHandlerBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.model.ProcessorDefinition;
+import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition;
 import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.model.transformer.TransformerDefinition;
 import org.apache.camel.model.validator.ValidatorDefinition;
@@ -67,7 +67,7 @@ public class DefaultModelReifierFactory implements ModelReifierFactory {
 
     @Override
     public ErrorHandlerFactory createDefaultErrorHandler() {
-        return new DefaultErrorHandlerBuilder();
+        return new DefaultErrorHandlerDefinition();
     }
 
     @Override
diff --git a/core/camel-core-model/src/generated/java/org/apache/camel/builder/DeadLetterChannelBuilderConfigurer.java b/core/camel-core-model/src/generated/java/org/apache/camel/builder/DeadLetterChannelBuilderConfigurer.java
deleted file mode 100644
index 8c62d658153..00000000000
--- a/core/camel-core-model/src/generated/java/org/apache/camel/builder/DeadLetterChannelBuilderConfigurer.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/* Generated by camel build tools - do NOT edit this file! */
-package org.apache.camel.builder;
-
-import java.util.Map;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
-import org.apache.camel.spi.PropertyConfigurerGetter;
-import org.apache.camel.spi.ConfigurerStrategy;
-import org.apache.camel.spi.GeneratedPropertyConfigurer;
-import org.apache.camel.util.CaseInsensitiveMap;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
-
-/**
- * Generated by camel build tools - do NOT edit this file!
- */
-@SuppressWarnings("unchecked")
-public class DeadLetterChannelBuilderConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
-
-    @Override
-    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
-        org.apache.camel.builder.DeadLetterChannelBuilder target = (org.apache.camel.builder.DeadLetterChannelBuilder) obj;
-        switch (ignoreCase ? name.toLowerCase() : name) {
-        case "asyncdelayedredelivery":
-        case "AsyncDelayedRedelivery": target.setAsyncDelayedRedelivery(property(camelContext, boolean.class, value)); return true;
-        case "deadletterhandlenewexception":
-        case "DeadLetterHandleNewException": target.setDeadLetterHandleNewException(property(camelContext, boolean.class, value)); return true;
-        case "deadletteruri":
-        case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true;
-        case "executorservice":
-        case "ExecutorService": target.setExecutorService(property(camelContext, java.util.concurrent.ScheduledExecutorService.class, value)); return true;
-        case "executorserviceref":
-        case "ExecutorServiceRef": target.setExecutorServiceRef(property(camelContext, java.lang.String.class, value)); return true;
-        case "logger":
-        case "Logger": target.setLogger(property(camelContext, org.apache.camel.spi.CamelLogger.class, value)); return true;
-        case "onexceptionoccurred":
-        case "OnExceptionOccurred": target.setOnExceptionOccurred(property(camelContext, org.apache.camel.Processor.class, value)); return true;
-        case "onexceptionoccurredref":
-        case "OnExceptionOccurredRef": target.setOnExceptionOccurredRef(property(camelContext, java.lang.String.class, value)); return true;
-        case "onpreparefailure":
-        case "OnPrepareFailure": target.setOnPrepareFailure(property(camelContext, org.apache.camel.Processor.class, value)); return true;
-        case "onpreparefailureref":
-        case "OnPrepareFailureRef": target.setOnPrepareFailureRef(property(camelContext, java.lang.String.class, value)); return true;
-        case "onredelivery":
-        case "OnRedelivery": target.setOnRedelivery(property(camelContext, org.apache.camel.Processor.class, value)); return true;
-        case "onredeliveryref":
-        case "OnRedeliveryRef": target.setOnRedeliveryRef(property(camelContext, java.lang.String.class, value)); return true;
-        case "redeliverypolicy":
-        case "RedeliveryPolicy": target.setRedeliveryPolicy(property(camelContext, org.apache.camel.processor.errorhandler.RedeliveryPolicy.class, value)); return true;
-        case "retrywhile":
-        case "RetryWhile": target.setRetryWhile(property(camelContext, org.apache.camel.Predicate.class, value)); return true;
-        case "retrywhileref":
-        case "RetryWhileRef": target.setRetryWhileRef(property(camelContext, java.lang.String.class, value)); return true;
-        case "useoriginalbody":
-        case "UseOriginalBody": target.setUseOriginalBody(property(camelContext, boolean.class, value)); return true;
-        case "useoriginalmessage":
-        case "UseOriginalMessage": target.setUseOriginalMessage(property(camelContext, boolean.class, value)); return true;
-        default: return false;
-        }
-    }
-
-    @Override
-    public Class<?> getOptionType(String name, boolean ignoreCase) {
-        switch (ignoreCase ? name.toLowerCase() : name) {
-        case "asyncdelayedredelivery":
-        case "AsyncDelayedRedelivery": return boolean.class;
-        case "deadletterhandlenewexception":
-        case "DeadLetterHandleNewException": return boolean.class;
-        case "deadletteruri":
-        case "DeadLetterUri": return java.lang.String.class;
-        case "executorservice":
-        case "ExecutorService": return java.util.concurrent.ScheduledExecutorService.class;
-        case "executorserviceref":
-        case "ExecutorServiceRef": return java.lang.String.class;
-        case "logger":
-        case "Logger": return org.apache.camel.spi.CamelLogger.class;
-        case "onexceptionoccurred":
-        case "OnExceptionOccurred": return org.apache.camel.Processor.class;
-        case "onexceptionoccurredref":
-        case "OnExceptionOccurredRef": return java.lang.String.class;
-        case "onpreparefailure":
-        case "OnPrepareFailure": return org.apache.camel.Processor.class;
-        case "onpreparefailureref":
-        case "OnPrepareFailureRef": return java.lang.String.class;
-        case "onredelivery":
-        case "OnRedelivery": return org.apache.camel.Processor.class;
-        case "onredeliveryref":
-        case "OnRedeliveryRef": return java.lang.String.class;
-        case "redeliverypolicy":
-        case "RedeliveryPolicy": return org.apache.camel.processor.errorhandler.RedeliveryPolicy.class;
-        case "retrywhile":
-        case "RetryWhile": return org.apache.camel.Predicate.class;
-        case "retrywhileref":
-        case "RetryWhileRef": return java.lang.String.class;
-        case "useoriginalbody":
-        case "UseOriginalBody": return boolean.class;
-        case "useoriginalmessage":
-        case "UseOriginalMessage": return boolean.class;
-        default: return null;
-        }
-    }
-
-    @Override
-    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
-        org.apache.camel.builder.DeadLetterChannelBuilder target = (org.apache.camel.builder.DeadLetterChannelBuilder) obj;
-        switch (ignoreCase ? name.toLowerCase() : name) {
-        case "asyncdelayedredelivery":
-        case "AsyncDelayedRedelivery": return target.isAsyncDelayedRedelivery();
-        case "deadletterhandlenewexception":
-        case "DeadLetterHandleNewException": return target.isDeadLetterHandleNewException();
-        case "deadletteruri":
-        case "DeadLetterUri": return target.getDeadLetterUri();
-        case "executorservice":
-        case "ExecutorService": return target.getExecutorService();
-        case "executorserviceref":
-        case "ExecutorServiceRef": return target.getExecutorServiceRef();
-        case "logger":
-        case "Logger": return target.getLogger();
-        case "onexceptionoccurred":
-        case "OnExceptionOccurred": return target.getOnExceptionOccurred();
-        case "onexceptionoccurredref":
-        case "OnExceptionOccurredRef": return target.getOnExceptionOccurredRef();
-        case "onpreparefailure":
-        case "OnPrepareFailure": return target.getOnPrepareFailure();
-        case "onpreparefailureref":
-        case "OnPrepareFailureRef": return target.getOnPrepareFailureRef();
-        case "onredelivery":
-        case "OnRedelivery": return target.getOnRedelivery();
-        case "onredeliveryref":
-        case "OnRedeliveryRef": return target.getOnRedeliveryRef();
-        case "redeliverypolicy":
-        case "RedeliveryPolicy": return target.getRedeliveryPolicy();
-        case "retrywhile":
-        case "RetryWhile": return target.getRetryWhile();
-        case "retrywhileref":
-        case "RetryWhileRef": return target.getRetryWhileRef();
-        case "useoriginalbody":
-        case "UseOriginalBody": return target.isUseOriginalBody();
-        case "useoriginalmessage":
-        case "UseOriginalMessage": return target.isUseOriginalMessage();
-        default: return null;
-        }
-    }
-}
-
diff --git a/core/camel-core-model/src/generated/java/org/apache/camel/builder/DefaultErrorHandlerBuilderConfigurer.java b/core/camel-core-model/src/generated/java/org/apache/camel/builder/DefaultErrorHandlerBuilderConfigurer.java
deleted file mode 100644
index cf45d98b755..00000000000
--- a/core/camel-core-model/src/generated/java/org/apache/camel/builder/DefaultErrorHandlerBuilderConfigurer.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/* Generated by camel build tools - do NOT edit this file! */
-package org.apache.camel.builder;
-
-import java.util.Map;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
-import org.apache.camel.spi.PropertyConfigurerGetter;
-import org.apache.camel.spi.ConfigurerStrategy;
-import org.apache.camel.spi.GeneratedPropertyConfigurer;
-import org.apache.camel.util.CaseInsensitiveMap;
-import org.apache.camel.builder.DefaultErrorHandlerBuilder;
-
-/**
- * Generated by camel build tools - do NOT edit this file!
- */
-@SuppressWarnings("unchecked")
-public class DefaultErrorHandlerBuilderConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
-
-    @Override
-    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
-        org.apache.camel.builder.DefaultErrorHandlerBuilder target = (org.apache.camel.builder.DefaultErrorHandlerBuilder) obj;
-        switch (ignoreCase ? name.toLowerCase() : name) {
-        case "asyncdelayedredelivery":
-        case "AsyncDelayedRedelivery": target.setAsyncDelayedRedelivery(property(camelContext, boolean.class, value)); return true;
-        case "deadletterhandlenewexception":
-        case "DeadLetterHandleNewException": target.setDeadLetterHandleNewException(property(camelContext, boolean.class, value)); return true;
-        case "deadletteruri":
-        case "DeadLetterUri": target.setDeadLetterUri(property(camelContext, java.lang.String.class, value)); return true;
-        case "executorservice":
-        case "ExecutorService": target.setExecutorService(property(camelContext, java.util.concurrent.ScheduledExecutorService.class, value)); return true;
-        case "executorserviceref":
-        case "ExecutorServiceRef": target.setExecutorServiceRef(property(camelContext, java.lang.String.class, value)); return true;
-        case "logger":
-        case "Logger": target.setLogger(property(camelContext, org.apache.camel.spi.CamelLogger.class, value)); return true;
-        case "onexceptionoccurred":
-        case "OnExceptionOccurred": target.setOnExceptionOccurred(property(camelContext, org.apache.camel.Processor.class, value)); return true;
-        case "onexceptionoccurredref":
-        case "OnExceptionOccurredRef": target.setOnExceptionOccurredRef(property(camelContext, java.lang.String.class, value)); return true;
-        case "onpreparefailure":
-        case "OnPrepareFailure": target.setOnPrepareFailure(property(camelContext, org.apache.camel.Processor.class, value)); return true;
-        case "onpreparefailureref":
-        case "OnPrepareFailureRef": target.setOnPrepareFailureRef(property(camelContext, java.lang.String.class, value)); return true;
-        case "onredelivery":
-        case "OnRedelivery": target.setOnRedelivery(property(camelContext, org.apache.camel.Processor.class, value)); return true;
-        case "onredeliveryref":
-        case "OnRedeliveryRef": target.setOnRedeliveryRef(property(camelContext, java.lang.String.class, value)); return true;
-        case "redeliverypolicy":
-        case "RedeliveryPolicy": target.setRedeliveryPolicy(property(camelContext, org.apache.camel.processor.errorhandler.RedeliveryPolicy.class, value)); return true;
-        case "retrywhile":
-        case "RetryWhile": target.setRetryWhile(property(camelContext, org.apache.camel.Predicate.class, value)); return true;
-        case "retrywhileref":
-        case "RetryWhileRef": target.setRetryWhileRef(property(camelContext, java.lang.String.class, value)); return true;
-        case "useoriginalbody":
-        case "UseOriginalBody": target.setUseOriginalBody(property(camelContext, boolean.class, value)); return true;
-        case "useoriginalmessage":
-        case "UseOriginalMessage": target.setUseOriginalMessage(property(camelContext, boolean.class, value)); return true;
-        default: return false;
-        }
-    }
-
-    @Override
-    public Class<?> getOptionType(String name, boolean ignoreCase) {
-        switch (ignoreCase ? name.toLowerCase() : name) {
-        case "asyncdelayedredelivery":
-        case "AsyncDelayedRedelivery": return boolean.class;
-        case "deadletterhandlenewexception":
-        case "DeadLetterHandleNewException": return boolean.class;
-        case "deadletteruri":
-        case "DeadLetterUri": return java.lang.String.class;
-        case "executorservice":
-        case "ExecutorService": return java.util.concurrent.ScheduledExecutorService.class;
-        case "executorserviceref":
-        case "ExecutorServiceRef": return java.lang.String.class;
-        case "logger":
-        case "Logger": return org.apache.camel.spi.CamelLogger.class;
-        case "onexceptionoccurred":
-        case "OnExceptionOccurred": return org.apache.camel.Processor.class;
-        case "onexceptionoccurredref":
-        case "OnExceptionOccurredRef": return java.lang.String.class;
-        case "onpreparefailure":
-        case "OnPrepareFailure": return org.apache.camel.Processor.class;
-        case "onpreparefailureref":
-        case "OnPrepareFailureRef": return java.lang.String.class;
-        case "onredelivery":
-        case "OnRedelivery": return org.apache.camel.Processor.class;
-        case "onredeliveryref":
-        case "OnRedeliveryRef": return java.lang.String.class;
-        case "redeliverypolicy":
-        case "RedeliveryPolicy": return org.apache.camel.processor.errorhandler.RedeliveryPolicy.class;
-        case "retrywhile":
-        case "RetryWhile": return org.apache.camel.Predicate.class;
-        case "retrywhileref":
-        case "RetryWhileRef": return java.lang.String.class;
-        case "useoriginalbody":
-        case "UseOriginalBody": return boolean.class;
-        case "useoriginalmessage":
-        case "UseOriginalMessage": return boolean.class;
-        default: return null;
-        }
-    }
-
-    @Override
-    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
-        org.apache.camel.builder.DefaultErrorHandlerBuilder target = (org.apache.camel.builder.DefaultErrorHandlerBuilder) obj;
-        switch (ignoreCase ? name.toLowerCase() : name) {
-        case "asyncdelayedredelivery":
-        case "AsyncDelayedRedelivery": return target.isAsyncDelayedRedelivery();
-        case "deadletterhandlenewexception":
-        case "DeadLetterHandleNewException": return target.isDeadLetterHandleNewException();
-        case "deadletteruri":
-        case "DeadLetterUri": return target.getDeadLetterUri();
-        case "executorservice":
-        case "ExecutorService": return target.getExecutorService();
-        case "executorserviceref":
-        case "ExecutorServiceRef": return target.getExecutorServiceRef();
-        case "logger":
-        case "Logger": return target.getLogger();
-        case "onexceptionoccurred":
-        case "OnExceptionOccurred": return target.getOnExceptionOccurred();
-        case "onexceptionoccurredref":
-        case "OnExceptionOccurredRef": return target.getOnExceptionOccurredRef();
-        case "onpreparefailure":
-        case "OnPrepareFailure": return target.getOnPrepareFailure();
-        case "onpreparefailureref":
-        case "OnPrepareFailureRef": return target.getOnPrepareFailureRef();
-        case "onredelivery":
-        case "OnRedelivery": return target.getOnRedelivery();
-        case "onredeliveryref":
-        case "OnRedeliveryRef": return target.getOnRedeliveryRef();
-        case "redeliverypolicy":
-        case "RedeliveryPolicy": return target.getRedeliveryPolicy();
-        case "retrywhile":
-        case "RetryWhile": return target.getRetryWhile();
-        case "retrywhileref":
-        case "RetryWhileRef": return target.getRetryWhileRef();
-        case "useoriginalbody":
-        case "UseOriginalBody": return target.isUseOriginalBody();
-        case "useoriginalmessage":
-        case "UseOriginalMessage": return target.isUseOriginalMessage();
-        default: return null;
-        }
-    }
-}
-
diff --git a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.builder.DeadLetterChannelBuilder b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.builder.DeadLetterChannelBuilder
deleted file mode 100644
index 358dea6cba0..00000000000
--- a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.builder.DeadLetterChannelBuilder
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.builder.DeadLetterChannelBuilderConfigurer
diff --git a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.builder.DefaultErrorHandlerBuilder b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.builder.DefaultErrorHandlerBuilder
deleted file mode 100644
index 4365a67f50a..00000000000
--- a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.builder.DefaultErrorHandlerBuilder
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.builder.DefaultErrorHandlerBuilderConfigurer
diff --git a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties
index 296ac907c25..d57c152dda1 100644
--- a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties
+++ b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties
@@ -32,6 +32,8 @@ customLoadBalancer
 customServiceFilter
 dataFormats
 datasonnet
+deadLetterChannel
+defaultErrorHandler
 defaultLoadBalancer
 delay
 delete
@@ -42,6 +44,8 @@ doFinally
 doTry
 dynamicRouter
 enrich
+errorHandler
+errorHandlerRef
 exchangeProperty
 expression
 failover
@@ -76,6 +80,7 @@ joor
 json
 jsonApi
 jsonpath
+jtaTransactionErrorHandler
 kamelet
 kubernetesServiceDiscovery
 language
@@ -90,6 +95,7 @@ mimeMultipart
 multicast
 mutualTLS
 mvel
+noErrorHandler
 oauth2
 ognl
 onCompletion
@@ -166,6 +172,7 @@ soap
 sort
 spel
 split
+springTransactionErrorHandler
 staticServiceDiscovery
 step
 sticky
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorHandler.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorHandler.json
new file mode 100644
index 00000000000..e7ae369ac74
--- /dev/null
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorHandler.json
@@ -0,0 +1,18 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "errorHandler",
+    "title": "Error Handler",
+    "description": "Camel error handling.",
+    "deprecated": false,
+    "label": "configuration,error",
+    "javaType": "org.apache.camel.model.ErrorHandlerDefinition",
+    "abstract": false,
+    "input": false,
+    "output": false
+  },
+  "properties": {
+    "errorHandlerType": { "kind": "element", "displayName": "Error Handler Type", "required": true, "type": "object", "javaType": "org.apache.camel.ErrorHandlerFactory", "oneOf": [ "deadLetterChannel", "defaultErrorHandler", "jtaTransactionErrorHandler", "noErrorHandler", "springTransactionErrorHandler" ], "deprecated": false, "autowired": false, "secret": false },
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
+  }
+}
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/deadLetterChannel.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/deadLetterChannel.json
new file mode 100644
index 00000000000..5e30167a115
--- /dev/null
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/deadLetterChannel.json
@@ -0,0 +1,31 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "deadLetterChannel",
+    "title": "Dead Letter Channel",
+    "description": "Dead letter channel error handler.",
+    "deprecated": false,
+    "label": "configuration,error",
+    "javaType": "org.apache.camel.model.errorhandler.DeadLetterChannelDefinition",
+    "abstract": false,
+    "input": false,
+    "output": false
+  },
+  "properties": {
+    "deadLetterUri": { "kind": "attribute", "displayName": "Dead Letter Uri", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The dead letter endpoint uri for the Dead Letter error handler." },
+    "deadLetterHandleNewException": { "kind": "attribute", "displayName": "Dead Letter Handle New Exception", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the dead letter channel should handle (and ignore) any new exception that may been thrown during sending the message to the dead letter endpoint. The default value is true which means an [...]
+    "loggerRef": { "kind": "attribute", "displayName": "Logger Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a logger to use as logger for the error handler" },
+    "level": { "kind": "attribute", "displayName": "Level", "label": "advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
+    "logName": { "kind": "attribute", "displayName": "Log Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
+    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have fail [...]
+    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and t [...]
+    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
+    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown  [...]
+    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
+    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a retry while predicate. Will continue retrying until the predicate evaluates to false." },
+    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.errorhandler.RedeliveryPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
+    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
+    "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the redelivery settings" },
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
+  }
+}
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/defaultErrorHandler.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/defaultErrorHandler.json
new file mode 100644
index 00000000000..724d2885089
--- /dev/null
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/defaultErrorHandler.json
@@ -0,0 +1,29 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "defaultErrorHandler",
+    "title": "Default Error Handler",
+    "description": "Default error handler.",
+    "deprecated": false,
+    "label": "configuration,error",
+    "javaType": "org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition",
+    "abstract": false,
+    "input": false,
+    "output": false
+  },
+  "properties": {
+    "loggerRef": { "kind": "attribute", "displayName": "Logger Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a logger to use as logger for the error handler" },
+    "level": { "kind": "attribute", "displayName": "Level", "label": "advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
+    "logName": { "kind": "attribute", "displayName": "Log Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
+    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have fail [...]
+    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and t [...]
+    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
+    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown  [...]
+    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
+    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a retry while predicate. Will continue retrying until the predicate evaluates to false." },
+    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.errorhandler.RedeliveryPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
+    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
+    "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the redelivery settings" },
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
+  }
+}
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/errorHandlerRef.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/errorHandlerRef.json
new file mode 100644
index 00000000000..b1cc07bde2a
--- /dev/null
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/errorHandlerRef.json
@@ -0,0 +1,18 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "errorHandlerRef",
+    "title": "Error Handler Ref",
+    "description": "Dead letter channel error handler.",
+    "deprecated": false,
+    "label": "configuration,error",
+    "javaType": "org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition",
+    "abstract": false,
+    "input": false,
+    "output": false
+  },
+  "properties": {
+    "ref": { "kind": "attribute", "displayName": "Ref", "required": false, "type": "object", "javaType": "org.apache.camel.ErrorHandlerFactory", "deprecated": false, "autowired": false, "secret": false, "description": "References to an existing or custom error handler." },
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
+  }
+}
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/jaxb.index b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/jaxb.index
new file mode 100644
index 00000000000..1daaba1595c
--- /dev/null
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/jaxb.index
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+DeadLetterChannelDefinition
+DefaultErrorHandlerDefinition
+ErrorHandlerRefDefinition
+JtaTransactionErrorHandlerDefinition
+NoErrorHandlerDefinition
+SpringTransactionErrorHandlerDefinition
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/jtaTransactionErrorHandler.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/jtaTransactionErrorHandler.json
new file mode 100644
index 00000000000..e80961aebb2
--- /dev/null
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/jtaTransactionErrorHandler.json
@@ -0,0 +1,31 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "jtaTransactionErrorHandler",
+    "title": "Jta Transaction Error Handler",
+    "description": "JTA based transactional error handler (requires camel-jta).",
+    "deprecated": false,
+    "label": "configuration,error",
+    "javaType": "org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition",
+    "abstract": false,
+    "input": false,
+    "output": false
+  },
+  "properties": {
+    "transactedPolicyRef": { "kind": "attribute", "displayName": "Transacted Policy Ref", "required": false, "type": "object", "javaType": "org.apache.camel.spi.TransactedPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "The transacted policy to use that is configured for either Spring or JTA based transactions. If no policy has been configured then Camel will attempt to auto-discover." },
+    "rollbackLoggingLevel": { "kind": "attribute", "displayName": "Rollback Logging Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "WARN", "description": "Sets the logging level to use for logging transactional rollback. This option is default WARN." },
+    "loggerRef": { "kind": "attribute", "displayName": "Logger Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a logger to use as logger for the error handler" },
+    "level": { "kind": "attribute", "displayName": "Level", "label": "advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
+    "logName": { "kind": "attribute", "displayName": "Log Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
+    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have fail [...]
+    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and t [...]
+    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
+    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown  [...]
+    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
+    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a retry while predicate. Will continue retrying until the predicate evaluates to false." },
+    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.errorhandler.RedeliveryPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
+    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
+    "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the redelivery settings" },
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
+  }
+}
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/noErrorHandler.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/noErrorHandler.json
new file mode 100644
index 00000000000..f0e1feaaa4f
--- /dev/null
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/noErrorHandler.json
@@ -0,0 +1,17 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "noErrorHandler",
+    "title": "No Error Handler",
+    "description": "No error handler.",
+    "deprecated": false,
+    "label": "configuration,error",
+    "javaType": "org.apache.camel.model.errorhandler.NoErrorHandlerDefinition",
+    "abstract": false,
+    "input": false,
+    "output": false
+  },
+  "properties": {
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
+  }
+}
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/springTransactionErrorHandler.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/springTransactionErrorHandler.json
new file mode 100644
index 00000000000..13e9822a850
--- /dev/null
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/springTransactionErrorHandler.json
@@ -0,0 +1,31 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "springTransactionErrorHandler",
+    "title": "Spring Transaction Error Handler",
+    "description": "Spring based transactional error handler (requires camel-spring).",
+    "deprecated": false,
+    "label": "configuration,error",
+    "javaType": "org.apache.camel.model.errorhandler.SpringTransactionErrorHandlerDefinition",
+    "abstract": false,
+    "input": false,
+    "output": false
+  },
+  "properties": {
+    "transactedPolicyRef": { "kind": "attribute", "displayName": "Transacted Policy Ref", "required": false, "type": "object", "javaType": "org.apache.camel.spi.TransactedPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "The transacted policy to use that is configured for either Spring or JTA based transactions. If no policy has been configured then Camel will attempt to auto-discover." },
+    "rollbackLoggingLevel": { "kind": "attribute", "displayName": "Rollback Logging Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "WARN", "description": "Sets the logging level to use for logging transactional rollback. This option is default WARN." },
+    "loggerRef": { "kind": "attribute", "displayName": "Logger Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a logger to use as logger for the error handler" },
+    "level": { "kind": "attribute", "displayName": "Level", "label": "advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
+    "logName": { "kind": "attribute", "displayName": "Log Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
+    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have fail [...]
+    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and t [...]
+    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
+    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown  [...]
+    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
+    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a retry while predicate. Will continue retrying until the predicate evaluates to false." },
+    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.errorhandler.RedeliveryPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
+    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
+    "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the redelivery settings" },
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
+  }
+}
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index b/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index
index 00bff3744d2..4271e558cb8 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index
@@ -13,6 +13,7 @@ DelayDefinition
 DescriptionDefinition
 DynamicRouterDefinition
 EnrichDefinition
+ErrorHandlerDefinition
 ExpressionSubElementDefinition
 FaultToleranceConfigurationDefinition
 FilterDefinition
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/redeliveryPolicy.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/redeliveryPolicy.json
index b4b43682a8a..c8af0840dac 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/redeliveryPolicy.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/redeliveryPolicy.json
@@ -13,28 +13,29 @@
   },
   "properties": {
     "maximumRedeliveries": { "kind": "attribute", "displayName": "Maximum Redeliveries", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the maximum redeliveries x = redeliver at most x times 0 = no redeliveries -1 = redeliver forever" },
-    "redeliveryDelay": { "kind": "attribute", "displayName": "Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the initial redelivery delay" },
+    "redeliveryDelay": { "kind": "attribute", "displayName": "Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the initial redelivery delay" },
     "asyncDelayedRedelivery": { "kind": "attribute", "displayName": "Async Delayed Redelivery", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allow asynchronous delayed redelivery. The route, in particular the consumer's component, must support the Asynchronous Routing Engine (e.g. seda)." },
-    "backOffMultiplier": { "kind": "attribute", "displayName": "Back Off Multiplier", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the back off multiplier" },
+    "backOffMultiplier": { "kind": "attribute", "displayName": "Back Off Multiplier", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "2.0", "description": "Sets the back off multiplier" },
     "useExponentialBackOff": { "kind": "attribute", "displayName": "Use Exponential Back Off", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Turn on exponential backk off" },
-    "collisionAvoidanceFactor": { "kind": "attribute", "displayName": "Collision Avoidance Factor", "label": "advanced", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the collision avoidance factor" },
+    "collisionAvoidanceFactor": { "kind": "attribute", "displayName": "Collision Avoidance Factor", "label": "advanced", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "0.15", "description": "Sets the collision avoidance factor" },
     "useCollisionAvoidance": { "kind": "attribute", "displayName": "Use Collision Avoidance", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Turn on collision avoidance." },
-    "maximumRedeliveryDelay": { "kind": "attribute", "displayName": "Maximum Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the maximum delay between redelivery" },
-    "retriesExhaustedLogLevel": { "kind": "attribute", "displayName": "Retries Exhausted Log Level", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the logging level to use when retries have been exhausted" },
-    "retryAttemptedLogLevel": { "kind": "attribute", "displayName": "Retry Attempted Log Level", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the logging level to use for logging retry attempts" },
-    "retryAttemptedLogInterval": { "kind": "attribute", "displayName": "Retry Attempted Log Interval", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the interval to use for logging retry attempts" },
-    "logRetryAttempted": { "kind": "attribute", "displayName": "Log Retry Attempted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether retry attempts should be logged or not. Can be used to include or reduce verbose." },
-    "logStackTrace": { "kind": "attribute", "displayName": "Log Stack Trace", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether stack traces should be logged. Can be used to include or reduce verbose." },
+    "maximumRedeliveryDelay": { "kind": "attribute", "displayName": "Maximum Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "60000", "description": "Sets the maximum delay between redelivery" },
+    "retriesExhaustedLogLevel": { "kind": "attribute", "displayName": "Retries Exhausted Log Level", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Sets the logging level to use when retries have been exhausted" },
+    "retryAttemptedLogLevel": { "kind": "attribute", "displayName": "Retry Attempted Log Level", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "DEBUG", "description": "Sets the logging level to use for logging retry attempts" },
+    "retryAttemptedLogInterval": { "kind": "attribute", "displayName": "Retry Attempted Log Interval", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1", "description": "Sets the interval to use for logging retry attempts" },
+    "logRetryAttempted": { "kind": "attribute", "displayName": "Log Retry Attempted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether retry attempts should be logged or not. Can be used to include or reduce verbose." },
+    "logStackTrace": { "kind": "attribute", "displayName": "Log Stack Trace", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether stack traces should be logged. Can be used to include or reduce verbose." },
     "logRetryStackTrace": { "kind": "attribute", "displayName": "Log Retry Stack Trace", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether stack traces should be logged when an retry attempt failed. Can be used to include or reduce verbose." },
     "logHandled": { "kind": "attribute", "displayName": "Log Handled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether handled exceptions should be logged or not. Can be used to include or reduce verbose." },
-    "logNewException": { "kind": "attribute", "displayName": "Log New Exception", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether new exceptions should be logged or not. Can be used to include or reduce verbose. A new exception is an exception that was thrown while handling a previous exception." },
+    "logNewException": { "kind": "attribute", "displayName": "Log New Exception", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether new exceptions should be logged or not. Can be used to include or reduce verbose. A new exception is an exception that was thrown while handling a previous exception." },
     "logContinued": { "kind": "attribute", "displayName": "Log Continued", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether continued exceptions should be logged or not. Can be used to include or reduce verbose." },
-    "logExhausted": { "kind": "attribute", "displayName": "Log Exhausted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted exceptions should be logged or not. Can be used to include or reduce verbose." },
+    "logExhausted": { "kind": "attribute", "displayName": "Log Exhausted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether exhausted exceptions should be logged or not. Can be used to include or reduce verbose." },
     "logExhaustedMessageHistory": { "kind": "attribute", "displayName": "Log Exhausted Message History", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted exceptions should be logged including message history or not (supports property placeholders). Can be used to include or reduce verbose." },
     "logExhaustedMessageBody": { "kind": "attribute", "displayName": "Log Exhausted Message Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted message body should be logged including message history or not (supports property placeholders). Can be used to include or reduce verbose. Requires logExhaustedMessageHistory to be  [...]
     "disableRedelivery": { "kind": "attribute", "displayName": "Disable Redelivery", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Disables redelivery (same as setting maximum redeliveries to 0)" },
     "delayPattern": { "kind": "attribute", "displayName": "Delay Pattern", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the delay pattern with delay intervals." },
-    "allowRedeliveryWhileStopping": { "kind": "attribute", "displayName": "Allow Redelivery While Stopping", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Controls whether to allow redelivery while stopping\/shutting down a route that uses error handling." },
-    "exchangeFormatterRef": { "kind": "attribute", "displayName": "Exchange Formatter Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the reference of the instance of org.apache.camel.spi.ExchangeFormatter to generate the log message from exchange." }
+    "allowRedeliveryWhileStopping": { "kind": "attribute", "displayName": "Allow Redelivery While Stopping", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls whether to allow redelivery while stopping\/shutting down a route that uses error handling." },
+    "exchangeFormatterRef": { "kind": "attribute", "displayName": "Exchange Formatter Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the reference of the instance of org.apache.camel.spi.ExchangeFormatter to generate the log message from exchange." },
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
   }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
index d528efde45e..c19eba435c6 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
@@ -23,6 +23,7 @@ import java.util.List;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Endpoint;
+import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.Expression;
 import org.apache.camel.NoSuchEndpointException;
 import org.apache.camel.RuntimeCamelException;
@@ -31,6 +32,7 @@ import org.apache.camel.model.language.ExchangePropertyExpression;
 import org.apache.camel.model.language.HeaderExpression;
 import org.apache.camel.model.language.SimpleExpression;
 import org.apache.camel.model.language.XPathExpression;
+import org.apache.camel.spi.TransactedPolicy;
 import org.apache.camel.support.builder.Namespaces;
 import org.apache.camel.util.ObjectHelper;
 
@@ -40,7 +42,7 @@ import org.apache.camel.util.ObjectHelper;
  */
 public abstract class BuilderSupport implements CamelContextAware {
     private CamelContext camelContext;
-    private ErrorHandlerBuilder errorHandlerBuilder;
+    private ErrorHandlerFactory errorHandlerFactory;
 
     protected BuilderSupport() {
     }
@@ -438,7 +440,9 @@ public abstract class BuilderSupport implements CamelContextAware {
      * @return               the builder
      */
     public DeadLetterChannelBuilder deadLetterChannel(String deadLetterUri) {
-        return new DeadLetterChannelBuilder(deadLetterUri);
+        DeadLetterChannelBuilder answer = new DeadLetterChannelBuilder();
+        answer.setDeadLetterUri(deadLetterUri);
+        return answer;
     }
 
     /**
@@ -449,7 +453,73 @@ public abstract class BuilderSupport implements CamelContextAware {
      * @return                    the builder
      */
     public DeadLetterChannelBuilder deadLetterChannel(Endpoint deadLetterEndpoint) {
-        return new DeadLetterChannelBuilder(deadLetterEndpoint);
+        return deadLetterChannel(deadLetterEndpoint.getEndpointUri());
+    }
+
+    /**
+     * Error handler using JTA transactions (requires camel-jta).
+     *
+     * @return the builder
+     */
+    public JtaTransactionErrorHandlerBuilder jtaTransactionErrorHandler() {
+        return new JtaTransactionErrorHandlerBuilder();
+    }
+
+    /**
+     * Error handler using JTA transactions (requires camel-jta).
+     *
+     * @param  policy the transaction policy
+     * @return        the builder
+     */
+    public JtaTransactionErrorHandlerBuilder jtaTransactionErrorHandler(TransactedPolicy policy) {
+        JtaTransactionErrorHandlerBuilder answer = new JtaTransactionErrorHandlerBuilder();
+        answer.setTransactedPolicy(policy);
+        return answer;
+    }
+
+    /**
+     * Error handler using JTA transactions (requires camel-jta).
+     *
+     * @param  policyRef references to the transaction policy
+     * @return           the builder
+     */
+    public JtaTransactionErrorHandlerBuilder jtaTransactionErrorHandler(String policyRef) {
+        JtaTransactionErrorHandlerBuilder answer = new JtaTransactionErrorHandlerBuilder();
+        answer.setTransactedPolicyRef(policyRef);
+        return answer;
+    }
+
+    /**
+     * Error handler using Spring transactions (requires camel-spring).
+     *
+     * @return the builder
+     */
+    public SpringTransactionErrorHandlerBuilder springTransactionErrorHandler() {
+        return new SpringTransactionErrorHandlerBuilder();
+    }
+
+    /**
+     * Error handler using Spring transactions (requires camel-spring).
+     *
+     * @param  policy the transaction policy
+     * @return        the builder
+     */
+    public SpringTransactionErrorHandlerBuilder springTransactionErrorHandler(TransactedPolicy policy) {
+        SpringTransactionErrorHandlerBuilder answer = new SpringTransactionErrorHandlerBuilder();
+        answer.setTransactedPolicy(policy);
+        return answer;
+    }
+
+    /**
+     * Error handler using Spring transactions (requires camel-spring).
+     *
+     * @param  policyRef references to the transaction policy
+     * @return           the builder
+     */
+    public SpringTransactionErrorHandlerBuilder springTransactionErrorHandler(String policyRef) {
+        SpringTransactionErrorHandlerBuilder answer = new SpringTransactionErrorHandlerBuilder();
+        answer.setTransactedPolicyRef(policyRef);
+        return answer;
     }
 
     // Properties
@@ -476,26 +546,22 @@ public abstract class BuilderSupport implements CamelContextAware {
         return getCamelContext();
     }
 
-    public boolean hasErrorHandlerBuilder() {
-        return this.errorHandlerBuilder != null;
-    }
-
-    public ErrorHandlerBuilder getErrorHandlerBuilder() {
-        if (errorHandlerBuilder == null) {
-            errorHandlerBuilder = createErrorHandlerBuilder();
+    public ErrorHandlerFactory getErrorHandlerFactory() {
+        if (errorHandlerFactory == null) {
+            errorHandlerFactory = createErrorHandlerBuilder();
         }
-        return errorHandlerBuilder;
+        return errorHandlerFactory;
     }
 
-    protected ErrorHandlerBuilder createErrorHandlerBuilder() {
+    protected ErrorHandlerFactory createErrorHandlerBuilder() {
         return new DefaultErrorHandlerBuilder();
     }
 
     /**
      * Sets the error handler to use with processors created by this builder
      */
-    public void setErrorHandlerBuilder(ErrorHandlerBuilder errorHandlerBuilder) {
-        this.errorHandlerBuilder = errorHandlerBuilder;
+    public void setErrorHandlerFactory(ErrorHandlerFactory errorHandlerFactory) {
+        this.errorHandlerFactory = errorHandlerFactory;
     }
 
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java
index 7bc8e032255..25ba3cdef48 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java
@@ -17,59 +17,21 @@
 package org.apache.camel.builder;
 
 import org.apache.camel.Endpoint;
-import org.apache.camel.LoggingLevel;
-import org.apache.camel.model.errorhandler.DeadLetterChannelConfiguration;
-import org.apache.camel.model.errorhandler.DeadLetterChannelProperties;
-import org.apache.camel.model.errorhandler.DefaultErrorHandlerConfiguration;
-import org.apache.camel.processor.errorhandler.DeadLetterChannel;
-import org.apache.camel.spi.CamelLogger;
-import org.apache.camel.spi.Configurer;
-import org.slf4j.LoggerFactory;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 
 /**
- * A builder of a <a href="http://camel.apache.org/dead-letter-channel.html">Dead Letter Channel</a>
+ * Dead letter channel error handler as a builder.
  */
-@Configurer
-public class DeadLetterChannelBuilder extends DefaultErrorHandlerBuilder implements DeadLetterChannelProperties {
+public class DeadLetterChannelBuilder extends DeadLetterChannelDefinition {
 
     public DeadLetterChannelBuilder() {
-        // no-arg constructor used by Spring DSL
     }
 
-    public DeadLetterChannelBuilder(Endpoint deadLetter) {
-        setDeadLetterUri(deadLetter.getEndpointUri());
-        // DLC do not log exhausted by default
-        getRedeliveryPolicy().setLogExhausted(false);
+    public DeadLetterChannelBuilder(String deadLetterUri) {
+        super(deadLetterUri);
     }
 
-    public DeadLetterChannelBuilder(String uri) {
-        setDeadLetterUri(uri);
-        // DLC do not log exhausted by default
-        getRedeliveryPolicy().setLogExhausted(false);
-    }
-
-    @Override
-    DefaultErrorHandlerConfiguration createConfiguration() {
-        return new DeadLetterChannelConfiguration();
-    }
-
-    @Override
-    public ErrorHandlerBuilder cloneBuilder() {
-        DeadLetterChannelBuilder answer = new DeadLetterChannelBuilder();
-        super.cloneBuilder(answer);
-        return answer;
-    }
-
-    // Properties
-    // -------------------------------------------------------------------------
-
-    @Override
-    protected CamelLogger createLogger() {
-        return new CamelLogger(LoggerFactory.getLogger(DeadLetterChannel.class), LoggingLevel.ERROR);
-    }
-
-    @Override
-    public String toString() {
-        return "DeadLetterChannelBuilder(" + getDeadLetterUri() + ")";
+    public DeadLetterChannelBuilder(Endpoint deadLetterUri) {
+        super(deadLetterUri);
     }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java
index abb32350dd0..14e41839238 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java
@@ -16,653 +16,10 @@
  */
 package org.apache.camel.builder;
 
-import java.util.concurrent.ScheduledExecutorService;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.LoggingLevel;
-import org.apache.camel.Predicate;
-import org.apache.camel.Processor;
-import org.apache.camel.model.errorhandler.DefaultErrorHandlerConfiguration;
-import org.apache.camel.model.errorhandler.DefaultErrorHandlerProperties;
-import org.apache.camel.processor.errorhandler.DefaultErrorHandler;
-import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
-import org.apache.camel.spi.CamelLogger;
-import org.apache.camel.spi.Configurer;
-import org.apache.camel.spi.Language;
-import org.apache.camel.support.ExpressionToPredicateAdapter;
-import org.slf4j.LoggerFactory;
+import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition;
 
 /**
- * The default error handler builder.
+ * Default error handler as a builder.
  */
-@Configurer
-public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport implements DefaultErrorHandlerProperties {
-
-    private final DefaultErrorHandlerConfiguration configuration;
-
-    public DefaultErrorHandlerBuilder() {
-        configuration = createConfiguration();
-    }
-
-    DefaultErrorHandlerConfiguration createConfiguration() {
-        return new DefaultErrorHandlerConfiguration();
-    }
-
-    @Override
-    public boolean supportTransacted() {
-        return false;
-    }
-
-    @Override
-    public ErrorHandlerBuilder cloneBuilder() {
-        DefaultErrorHandlerBuilder answer = new DefaultErrorHandlerBuilder();
-        cloneBuilder(answer);
-        return answer;
-    }
-
-    protected void cloneBuilder(DefaultErrorHandlerBuilder other) {
-        other.setLogger(configuration.getLogger());
-        if (configuration.getRedeliveryPolicy() != null) {
-            other.setRedeliveryPolicy(configuration.getRedeliveryPolicy().copy());
-        }
-        other.setOnRedelivery(configuration.getOnRedelivery());
-        other.setOnRedeliveryRef(configuration.getOnRedeliveryRef());
-        other.setRetryWhile(configuration.getRetryWhile());
-        other.setRetryWhileRef(configuration.getRetryWhileRef());
-        other.setDeadLetterUri(configuration.getDeadLetterUri());
-        other.setOnPrepareFailure(configuration.getOnPrepareFailure());
-        other.setOnPrepareFailureRef(configuration.getOnPrepareFailureRef());
-        other.setOnExceptionOccurred(configuration.getOnExceptionOccurred());
-        other.setOnExceptionOccurredRef(configuration.getOnExceptionOccurredRef());
-        other.setDeadLetterHandleNewException(configuration.isDeadLetterHandleNewException());
-        other.setUseOriginalMessage(configuration.isUseOriginalMessage());
-        other.setUseOriginalBody(configuration.isUseOriginalBody());
-        other.setAsyncDelayedRedelivery(configuration.isAsyncDelayedRedelivery());
-        other.setExecutorServiceRef(configuration.getExecutorServiceRef());
-    }
-
-    // Builder methods
-    // -------------------------------------------------------------------------
-    public DefaultErrorHandlerBuilder backOffMultiplier(double backOffMultiplier) {
-        getRedeliveryPolicy().backOffMultiplier(backOffMultiplier);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder collisionAvoidancePercent(double collisionAvoidancePercent) {
-        getRedeliveryPolicy().collisionAvoidancePercent(collisionAvoidancePercent);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder redeliveryDelay(long delay) {
-        getRedeliveryPolicy().redeliveryDelay(delay);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder delayPattern(String delayPattern) {
-        getRedeliveryPolicy().delayPattern(delayPattern);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder maximumRedeliveries(int maximumRedeliveries) {
-        getRedeliveryPolicy().maximumRedeliveries(maximumRedeliveries);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder disableRedelivery() {
-        getRedeliveryPolicy().maximumRedeliveries(0);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder maximumRedeliveryDelay(long maximumRedeliveryDelay) {
-        getRedeliveryPolicy().maximumRedeliveryDelay(maximumRedeliveryDelay);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder useCollisionAvoidance() {
-        getRedeliveryPolicy().useCollisionAvoidance();
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder useExponentialBackOff() {
-        getRedeliveryPolicy().useExponentialBackOff();
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder retriesExhaustedLogLevel(LoggingLevel retriesExhaustedLogLevel) {
-        getRedeliveryPolicy().setRetriesExhaustedLogLevel(retriesExhaustedLogLevel);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder retryAttemptedLogLevel(LoggingLevel retryAttemptedLogLevel) {
-        getRedeliveryPolicy().setRetryAttemptedLogLevel(retryAttemptedLogLevel);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder retryAttemptedLogInterval(int retryAttemptedLogInterval) {
-        getRedeliveryPolicy().setRetryAttemptedLogInterval(retryAttemptedLogInterval);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder logStackTrace(boolean logStackTrace) {
-        getRedeliveryPolicy().setLogStackTrace(logStackTrace);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder logRetryStackTrace(boolean logRetryStackTrace) {
-        getRedeliveryPolicy().setLogRetryStackTrace(logRetryStackTrace);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder logHandled(boolean logHandled) {
-        getRedeliveryPolicy().setLogHandled(logHandled);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder logNewException(boolean logNewException) {
-        getRedeliveryPolicy().setLogNewException(logNewException);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder logExhausted(boolean logExhausted) {
-        getRedeliveryPolicy().setLogExhausted(logExhausted);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder logRetryAttempted(boolean logRetryAttempted) {
-        getRedeliveryPolicy().setLogRetryAttempted(logRetryAttempted);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder logExhaustedMessageHistory(boolean logExhaustedMessageHistory) {
-        getRedeliveryPolicy().setLogExhaustedMessageHistory(logExhaustedMessageHistory);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder logExhaustedMessageBody(boolean logExhaustedMessageBody) {
-        getRedeliveryPolicy().setLogExhaustedMessageBody(logExhaustedMessageBody);
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder exchangeFormatterRef(String exchangeFormatterRef) {
-        getRedeliveryPolicy().setExchangeFormatterRef(exchangeFormatterRef);
-        return this;
-    }
-
-    /**
-     * Will allow asynchronous delayed redeliveries. The route, in particular the consumer's component, must support the
-     * Asynchronous Routing Engine (e.g. seda)
-     *
-     * @see    RedeliveryPolicy#setAsyncDelayedRedelivery(boolean)
-     * @return the builder
-     */
-    public DefaultErrorHandlerBuilder asyncDelayedRedelivery() {
-        getRedeliveryPolicy().setAsyncDelayedRedelivery(true);
-        return this;
-    }
-
-    /**
-     * Controls whether to allow redelivery while stopping/shutting down a route that uses error handling.
-     *
-     * @param  allowRedeliveryWhileStopping <tt>true</tt> to allow redelivery, <tt>false</tt> to reject redeliveries
-     * @return                              the builder
-     */
-    public DefaultErrorHandlerBuilder allowRedeliveryWhileStopping(boolean allowRedeliveryWhileStopping) {
-        getRedeliveryPolicy().setAllowRedeliveryWhileStopping(allowRedeliveryWhileStopping);
-        return this;
-    }
-
-    /**
-     * Sets the thread pool to be used for redelivery.
-     *
-     * @param  executorService the scheduled thread pool to use
-     * @return                 the builder.
-     */
-    public DefaultErrorHandlerBuilder executorService(ScheduledExecutorService executorService) {
-        setExecutorService(executorService);
-        return this;
-    }
-
-    /**
-     * Sets a reference to a thread pool to be used for redelivery.
-     *
-     * @param  ref reference to a scheduled thread pool
-     * @return     the builder.
-     */
-    public DefaultErrorHandlerBuilder executorServiceRef(String ref) {
-        setExecutorServiceRef(ref);
-        return this;
-    }
-
-    /**
-     * Sets the logger used for caught exceptions
-     *
-     * @param  logger the logger
-     * @return        the builder
-     */
-    public DefaultErrorHandlerBuilder logger(CamelLogger logger) {
-        setLogger(logger);
-        return this;
-    }
-
-    /**
-     * Sets the logging level of exceptions caught
-     *
-     * @param  level the logging level
-     * @return       the builder
-     */
-    public DefaultErrorHandlerBuilder loggingLevel(LoggingLevel level) {
-        getLogger().setLevel(level);
-        return this;
-    }
-
-    /**
-     * Sets the log used for caught exceptions
-     *
-     * @param  log the logger
-     * @return     the builder
-     */
-    public DefaultErrorHandlerBuilder log(org.slf4j.Logger log) {
-        getLogger().setLog(log);
-        return this;
-    }
-
-    /**
-     * Sets the log used for caught exceptions
-     *
-     * @param  log the log name
-     * @return     the builder
-     */
-    public DefaultErrorHandlerBuilder log(String log) {
-        return log(LoggerFactory.getLogger(log));
-    }
-
-    /**
-     * Sets the log used for caught exceptions
-     *
-     * @param  log the log class
-     * @return     the builder
-     */
-    public DefaultErrorHandlerBuilder log(Class<?> log) {
-        return log(LoggerFactory.getLogger(log));
-    }
-
-    /**
-     * Sets a processor that should be processed <b>before</b> a redelivery attempt.
-     * <p/>
-     * Can be used to change the {@link org.apache.camel.Exchange} <b>before</b> its being redelivered.
-     *
-     * @param  processor the processor
-     * @return           the builder
-     */
-    public DefaultErrorHandlerBuilder onRedelivery(Processor processor) {
-        setOnRedelivery(processor);
-        return this;
-    }
-
-    /**
-     * Sets a reference for the processor to use <b>before</b> a redelivery attempt.
-     *
-     * @param  onRedeliveryRef the processor's reference
-     * @return                 the builder
-     * @see                    #onRedelivery(Processor)
-     */
-    public DefaultErrorHandlerBuilder onRedeliveryRef(String onRedeliveryRef) {
-        setOnRedeliveryRef(onRedeliveryRef);
-        return this;
-    }
-
-    /**
-     * Sets the retry while expression.
-     * <p/>
-     * Will continue retrying until expression evaluates to <tt>false</tt>.
-     *
-     * @param  retryWhile expression that determines when to stop retrying
-     * @return            the builder
-     */
-    public DefaultErrorHandlerBuilder retryWhile(Expression retryWhile) {
-        setRetryWhile(ExpressionToPredicateAdapter.toPredicate(retryWhile));
-        return this;
-    }
-
-    public DefaultErrorHandlerBuilder retryWhileRef(String retryWhileRef) {
-        setRetryWhileRef(retryWhileRef);
-        return this;
-    }
-
-    /**
-     * Will use the original input {@link org.apache.camel.Message} (original body and headers) when an
-     * {@link org.apache.camel.Exchange} is moved to the dead letter queue.
-     * <p/>
-     * <b>Notice:</b> this only applies when all redeliveries attempt have failed and the
-     * {@link org.apache.camel.Exchange} is doomed for failure. <br/>
-     * Instead of using the current inprogress {@link org.apache.camel.Exchange} IN message we use the original IN
-     * message instead. This allows you to store the original input in the dead letter queue instead of the inprogress
-     * snapshot of the IN message. For instance if you route transform the IN body during routing and then failed. With
-     * the original exchange store in the dead letter queue it might be easier to manually re submit the
-     * {@link org.apache.camel.Exchange} again as the IN message is the same as when Camel received it. So you should be
-     * able to send the {@link org.apache.camel.Exchange} to the same input.
-     * <p/>
-     * The difference between useOriginalMessage and useOriginalBody is that the former includes both the original body
-     * and headers, where as the latter only includes the original body. You can use the latter to enrich the message
-     * with custom headers and include the original message body. The former wont let you do this, as its using the
-     * original message body and headers as they are. You cannot enable both useOriginalMessage and useOriginalBody.
-     * <p/>
-     * <b>Important:</b> The original input means the input message that are bounded by the current
-     * {@link org.apache.camel.spi.UnitOfWork}. An unit of work typically spans one route, or multiple routes if they
-     * are connected using internal endpoints such as direct or seda. When messages is passed via external endpoints
-     * such as JMS or HTTP then the consumer will create a new unit of work, with the message it received as input as
-     * the original input. Also some EIP patterns such as splitter, multicast, will create a new unit of work boundary
-     * for the messages in their sub-route (eg the split message); however these EIPs have an option named
-     * <tt>shareUnitOfWork</tt> which allows to combine with the parent unit of work in regard to error handling and
-     * therefore use the parent original message.
-     * <p/>
-     * By default this feature is off.
-     *
-     * @return the builder
-     * @see    #useOriginalBody()
-     */
-    public DefaultErrorHandlerBuilder useOriginalMessage() {
-        setUseOriginalMessage(true);
-        return this;
-    }
-
-    /**
-     * Will use the original input {@link org.apache.camel.Message} body (original body only) when an
-     * {@link org.apache.camel.Exchange} is moved to the dead letter queue.
-     * <p/>
-     * <b>Notice:</b> this only applies when all redeliveries attempt have failed and the
-     * {@link org.apache.camel.Exchange} is doomed for failure. <br/>
-     * Instead of using the current inprogress {@link org.apache.camel.Exchange} IN message we use the original IN
-     * message instead. This allows you to store the original input in the dead letter queue instead of the inprogress
-     * snapshot of the IN message. For instance if you route transform the IN body during routing and then failed. With
-     * the original exchange store in the dead letter queue it might be easier to manually re submit the
-     * {@link org.apache.camel.Exchange} again as the IN message is the same as when Camel received it. So you should be
-     * able to send the {@link org.apache.camel.Exchange} to the same input.
-     * <p/>
-     * The difference between useOriginalMessage and useOriginalBody is that the former includes both the original body
-     * and headers, where as the latter only includes the original body. You can use the latter to enrich the message
-     * with custom headers and include the original message body. The former wont let you do this, as its using the
-     * original message body and headers as they are. You cannot enable both useOriginalMessage and useOriginalBody.
-     * <p/>
-     * <b>Important:</b> The original input means the input message that are bounded by the current
-     * {@link org.apache.camel.spi.UnitOfWork}. An unit of work typically spans one route, or multiple routes if they
-     * are connected using internal endpoints such as direct or seda. When messages is passed via external endpoints
-     * such as JMS or HTTP then the consumer will create a new unit of work, with the message it received as input as
-     * the original input. Also some EIP patterns such as splitter, multicast, will create a new unit of work boundary
-     * for the messages in their sub-route (eg the split message); however these EIPs have an option named
-     * <tt>shareUnitOfWork</tt> which allows to combine with the parent unit of work in regard to error handling and
-     * therefore use the parent original message.
-     * <p/>
-     * By default this feature is off.
-     *
-     * @return the builder
-     * @see    #useOriginalMessage()
-     */
-    public DefaultErrorHandlerBuilder useOriginalBody() {
-        setUseOriginalBody(true);
-        return this;
-    }
-
-    /**
-     * Whether the dead letter channel should handle (and ignore) any new exception that may been thrown during sending
-     * the message to the dead letter endpoint.
-     * <p/>
-     * The default value is <tt>true</tt> which means any such kind of exception is handled and ignored. Set this to
-     * <tt>false</tt> to let the exception be propagated back on the {@link org.apache.camel.Exchange}. This can be used
-     * in situations where you use transactions, and want to use Camel's dead letter channel to deal with exceptions
-     * during routing, but if the dead letter channel itself fails because of a new exception being thrown, then by
-     * setting this to <tt>false</tt> the new exceptions is propagated back and set on the
-     * {@link org.apache.camel.Exchange}, which allows the transaction to detect the exception, and rollback.
-     *
-     * @param  handleNewException <tt>true</tt> to handle (and ignore), <tt>false</tt> to catch and propagated the
-     *                            exception on the {@link org.apache.camel.Exchange}
-     * @return                    the builder
-     */
-    public DefaultErrorHandlerBuilder deadLetterHandleNewException(boolean handleNewException) {
-        setDeadLetterHandleNewException(handleNewException);
-        return this;
-    }
-
-    /**
-     * Sets a custom {@link org.apache.camel.Processor} to prepare the {@link org.apache.camel.Exchange} before handled
-     * by the failure processor / dead letter channel. This allows for example to enrich the message before sending to a
-     * dead letter queue.
-     *
-     * @param  processor the processor
-     * @return           the builder
-     */
-    public DefaultErrorHandlerBuilder onPrepareFailure(Processor processor) {
-        setOnPrepareFailure(processor);
-        return this;
-    }
-
-    /**
-     * Sets a reference for the processor to use before handled by the failure processor.
-     *
-     * @param  onPrepareFailureRef the processor's reference
-     * @return                     the builder
-     * @see                        #onPrepareFailure(Processor)
-     */
-    public DefaultErrorHandlerBuilder onPrepareFailureRef(String onPrepareFailureRef) {
-        setOnPrepareFailureRef(onPrepareFailureRef);
-        return this;
-    }
-
-    /**
-     * Sets a custom {@link org.apache.camel.Processor} to process the {@link org.apache.camel.Exchange} just after an
-     * exception was thrown. This allows to execute the processor at the same time the exception was thrown.
-     * <p/>
-     * Important: Any exception thrown from this processor will be ignored.
-     *
-     * @param  processor the processor
-     * @return           the builder
-     */
-    public DefaultErrorHandlerBuilder onExceptionOccurred(Processor processor) {
-        setOnExceptionOccurred(processor);
-        return this;
-    }
-
-    /**
-     * Sets a reference for the processor to use just after an exception was thrown.
-     *
-     * @param  onExceptionOccurredRef the processor's reference
-     * @return                        the builder
-     * @see                           #onExceptionOccurred(Processor)
-     */
-    public DefaultErrorHandlerBuilder onExceptionOccurredRef(String onExceptionOccurredRef) {
-        setOnExceptionOccurredRef(onExceptionOccurredRef);
-        return this;
-    }
-
-    // Properties
-    // -------------------------------------------------------------------------
-
-    @Override
-    public boolean hasRedeliveryPolicy() {
-        return configuration.getRedeliveryPolicy() != null;
-    }
-
-    @Override
-    public RedeliveryPolicy getDefaultRedeliveryPolicy() {
-        return RedeliveryPolicy.DEFAULT_POLICY;
-    }
-
-    public RedeliveryPolicy getRedeliveryPolicy() {
-        if (configuration.getRedeliveryPolicy() == null) {
-            configuration.setRedeliveryPolicy(createRedeliveryPolicy());
-        }
-        return configuration.getRedeliveryPolicy();
-    }
-
-    /**
-     * Sets the redelivery policy
-     */
-    public void setRedeliveryPolicy(RedeliveryPolicy redeliveryPolicy) {
-        configuration.setRedeliveryPolicy(redeliveryPolicy);
-    }
-
-    @Override
-    public boolean hasLogger() {
-        return configuration.hasLogger();
-    }
-
-    public CamelLogger getLogger() {
-        if (configuration.getLogger() == null) {
-            configuration.setLogger(createLogger());
-        }
-        return configuration.getLogger();
-    }
-
-    public void setLogger(CamelLogger logger) {
-        configuration.setLogger(logger);
-    }
-
-    public Processor getOnRedelivery() {
-        return configuration.getOnRedelivery();
-    }
-
-    public void setOnRedelivery(Processor onRedelivery) {
-        configuration.setOnRedelivery(onRedelivery);
-    }
-
-    public String getOnRedeliveryRef() {
-        return configuration.getOnRedeliveryRef();
-    }
-
-    public void setOnRedeliveryRef(String onRedeliveryRef) {
-        configuration.setOnRedeliveryRef(onRedeliveryRef);
-    }
-
-    public Predicate getRetryWhilePolicy(CamelContext context) {
-        Predicate answer = getRetryWhile();
-
-        if (getRetryWhileRef() != null) {
-            // its a bean expression
-            Language bean = context.resolveLanguage("bean");
-            answer = bean.createPredicate(getRetryWhileRef());
-        }
-
-        return answer;
-    }
-
-    public Predicate getRetryWhile() {
-        return configuration.getRetryWhile();
-    }
-
-    public void setRetryWhile(Predicate retryWhile) {
-        configuration.setRetryWhile(retryWhile);
-    }
-
-    public String getRetryWhileRef() {
-        return configuration.getRetryWhileRef();
-    }
-
-    public void setRetryWhileRef(String retryWhileRef) {
-        configuration.setRetryWhileRef(retryWhileRef);
-    }
-
-    public String getDeadLetterUri() {
-        return configuration.getDeadLetterUri();
-    }
-
-    public void setDeadLetterUri(String deadLetterUri) {
-        configuration.setDeadLetterUri(deadLetterUri);
-    }
-
-    public boolean isDeadLetterHandleNewException() {
-        return configuration.isDeadLetterHandleNewException();
-    }
-
-    public void setDeadLetterHandleNewException(boolean deadLetterHandleNewException) {
-        configuration.setDeadLetterHandleNewException(deadLetterHandleNewException);
-    }
-
-    public boolean isUseOriginalMessage() {
-        return configuration.isUseOriginalMessage();
-    }
-
-    public void setUseOriginalMessage(boolean useOriginalMessage) {
-        configuration.setUseOriginalMessage(useOriginalMessage);
-    }
-
-    public boolean isUseOriginalBody() {
-        return configuration.isUseOriginalBody();
-    }
-
-    public void setUseOriginalBody(boolean useOriginalBody) {
-        configuration.setUseOriginalBody(useOriginalBody);
-    }
-
-    public boolean isAsyncDelayedRedelivery() {
-        return configuration.isAsyncDelayedRedelivery();
-    }
-
-    public void setAsyncDelayedRedelivery(boolean asyncDelayedRedelivery) {
-        configuration.setAsyncDelayedRedelivery(asyncDelayedRedelivery);
-    }
-
-    public ScheduledExecutorService getExecutorService() {
-        return configuration.getExecutorService();
-    }
-
-    public void setExecutorService(ScheduledExecutorService executorService) {
-        configuration.setExecutorService(executorService);
-    }
-
-    public String getExecutorServiceRef() {
-        return configuration.getExecutorServiceRef();
-    }
-
-    public void setExecutorServiceRef(String executorServiceRef) {
-        configuration.setExecutorServiceRef(executorServiceRef);
-    }
-
-    public Processor getOnPrepareFailure() {
-        return configuration.getOnPrepareFailure();
-    }
-
-    public void setOnPrepareFailure(Processor onPrepareFailure) {
-        configuration.setOnPrepareFailure(onPrepareFailure);
-    }
-
-    public String getOnPrepareFailureRef() {
-        return configuration.getOnPrepareFailureRef();
-    }
-
-    public void setOnPrepareFailureRef(String onPrepareFailureRef) {
-        configuration.setOnPrepareFailureRef(onPrepareFailureRef);
-    }
-
-    public Processor getOnExceptionOccurred() {
-        return configuration.getOnExceptionOccurred();
-    }
-
-    public void setOnExceptionOccurred(Processor onExceptionOccurred) {
-        configuration.setOnExceptionOccurred(onExceptionOccurred);
-    }
-
-    public String getOnExceptionOccurredRef() {
-        return configuration.getOnExceptionOccurredRef();
-    }
-
-    public void setOnExceptionOccurredRef(String onExceptionOccurredRef) {
-        configuration.setOnExceptionOccurredRef(onExceptionOccurredRef);
-    }
-
-    protected RedeliveryPolicy createRedeliveryPolicy() {
-        RedeliveryPolicy policy = new RedeliveryPolicy();
-        policy.disableRedelivery();
-        return policy;
-    }
-
-    protected CamelLogger createLogger() {
-        return new CamelLogger(LoggerFactory.getLogger(DefaultErrorHandler.class), LoggingLevel.ERROR);
-    }
-
-    @Override
-    public String toString() {
-        return "DefaultErrorHandlerBuilder";
-    }
-
+public class DefaultErrorHandlerBuilder extends DefaultErrorHandlerDefinition {
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/JtaTransactionErrorHandlerBuilder.java
similarity index 61%
copy from core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java
copy to core/camel-core-model/src/main/java/org/apache/camel/builder/JtaTransactionErrorHandlerBuilder.java
index 07122de883e..e3e19e93ee1 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/JtaTransactionErrorHandlerBuilder.java
@@ -16,14 +16,22 @@
  */
 package org.apache.camel.builder;
 
+import org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition;
+
 /**
- * Base class for builders of error handling.
+ * JTA transaction error handler as a builder.
  */
-public abstract class ErrorHandlerBuilderSupport implements ErrorHandlerBuilder {
+public class JtaTransactionErrorHandlerBuilder extends JtaTransactionErrorHandlerDefinition {
+
+    public JtaTransactionErrorHandlerBuilder() {
+    }
 
-    @Override
-    public boolean supportTransacted() {
-        return false;
+    public JtaTransactionErrorHandlerBuilder(Object transactedPolicy) {
+        if (transactedPolicy instanceof String) {
+            setTransactedPolicyRef((String) transactedPolicy);
+        } else {
+            setTransactedPolicy(transactedPolicy);
+        }
     }
 
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyDeadLetterChannelBuilder.java
similarity index 80%
copy from core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java
copy to core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyDeadLetterChannelBuilder.java
index 7bc8e032255..c0075cad4f8 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyDeadLetterChannelBuilder.java
@@ -23,26 +23,25 @@ import org.apache.camel.model.errorhandler.DeadLetterChannelProperties;
 import org.apache.camel.model.errorhandler.DefaultErrorHandlerConfiguration;
 import org.apache.camel.processor.errorhandler.DeadLetterChannel;
 import org.apache.camel.spi.CamelLogger;
-import org.apache.camel.spi.Configurer;
 import org.slf4j.LoggerFactory;
 
 /**
- * A builder of a <a href="http://camel.apache.org/dead-letter-channel.html">Dead Letter Channel</a>
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
  */
-@Configurer
-public class DeadLetterChannelBuilder extends DefaultErrorHandlerBuilder implements DeadLetterChannelProperties {
+@Deprecated
+public class LegacyDeadLetterChannelBuilder extends LegacyDefaultErrorHandlerBuilder implements DeadLetterChannelProperties {
 
-    public DeadLetterChannelBuilder() {
+    public LegacyDeadLetterChannelBuilder() {
         // no-arg constructor used by Spring DSL
     }
 
-    public DeadLetterChannelBuilder(Endpoint deadLetter) {
+    public LegacyDeadLetterChannelBuilder(Endpoint deadLetter) {
         setDeadLetterUri(deadLetter.getEndpointUri());
         // DLC do not log exhausted by default
         getRedeliveryPolicy().setLogExhausted(false);
     }
 
-    public DeadLetterChannelBuilder(String uri) {
+    public LegacyDeadLetterChannelBuilder(String uri) {
         setDeadLetterUri(uri);
         // DLC do not log exhausted by default
         getRedeliveryPolicy().setLogExhausted(false);
@@ -54,8 +53,8 @@ public class DeadLetterChannelBuilder extends DefaultErrorHandlerBuilder impleme
     }
 
     @Override
-    public ErrorHandlerBuilder cloneBuilder() {
-        DeadLetterChannelBuilder answer = new DeadLetterChannelBuilder();
+    public LegacyErrorHandlerBuilder cloneBuilder() {
+        LegacyDeadLetterChannelBuilder answer = new LegacyDeadLetterChannelBuilder();
         super.cloneBuilder(answer);
         return answer;
     }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyDefaultErrorHandlerBuilder.java
similarity index 83%
copy from core/camel-core-model/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java
copy to core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyDefaultErrorHandlerBuilder.java
index abb32350dd0..d8888ec2f4a 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyDefaultErrorHandlerBuilder.java
@@ -28,20 +28,20 @@ import org.apache.camel.model.errorhandler.DefaultErrorHandlerProperties;
 import org.apache.camel.processor.errorhandler.DefaultErrorHandler;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.spi.CamelLogger;
-import org.apache.camel.spi.Configurer;
 import org.apache.camel.spi.Language;
 import org.apache.camel.support.ExpressionToPredicateAdapter;
 import org.slf4j.LoggerFactory;
 
 /**
- * The default error handler builder.
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
  */
-@Configurer
-public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport implements DefaultErrorHandlerProperties {
+@Deprecated
+public class LegacyDefaultErrorHandlerBuilder extends LegacyErrorHandlerBuilderSupport
+        implements DefaultErrorHandlerProperties {
 
     private final DefaultErrorHandlerConfiguration configuration;
 
-    public DefaultErrorHandlerBuilder() {
+    public LegacyDefaultErrorHandlerBuilder() {
         configuration = createConfiguration();
     }
 
@@ -55,13 +55,13 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
     }
 
     @Override
-    public ErrorHandlerBuilder cloneBuilder() {
-        DefaultErrorHandlerBuilder answer = new DefaultErrorHandlerBuilder();
+    public LegacyErrorHandlerBuilder cloneBuilder() {
+        LegacyDefaultErrorHandlerBuilder answer = new LegacyDefaultErrorHandlerBuilder();
         cloneBuilder(answer);
         return answer;
     }
 
-    protected void cloneBuilder(DefaultErrorHandlerBuilder other) {
+    protected void cloneBuilder(LegacyDefaultErrorHandlerBuilder other) {
         other.setLogger(configuration.getLogger());
         if (configuration.getRedeliveryPolicy() != null) {
             other.setRedeliveryPolicy(configuration.getRedeliveryPolicy().copy());
@@ -84,107 +84,107 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
 
     // Builder methods
     // -------------------------------------------------------------------------
-    public DefaultErrorHandlerBuilder backOffMultiplier(double backOffMultiplier) {
+    public LegacyDefaultErrorHandlerBuilder backOffMultiplier(double backOffMultiplier) {
         getRedeliveryPolicy().backOffMultiplier(backOffMultiplier);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder collisionAvoidancePercent(double collisionAvoidancePercent) {
+    public LegacyDefaultErrorHandlerBuilder collisionAvoidancePercent(double collisionAvoidancePercent) {
         getRedeliveryPolicy().collisionAvoidancePercent(collisionAvoidancePercent);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder redeliveryDelay(long delay) {
+    public LegacyDefaultErrorHandlerBuilder redeliveryDelay(long delay) {
         getRedeliveryPolicy().redeliveryDelay(delay);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder delayPattern(String delayPattern) {
+    public LegacyDefaultErrorHandlerBuilder delayPattern(String delayPattern) {
         getRedeliveryPolicy().delayPattern(delayPattern);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder maximumRedeliveries(int maximumRedeliveries) {
+    public LegacyDefaultErrorHandlerBuilder maximumRedeliveries(int maximumRedeliveries) {
         getRedeliveryPolicy().maximumRedeliveries(maximumRedeliveries);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder disableRedelivery() {
+    public LegacyDefaultErrorHandlerBuilder disableRedelivery() {
         getRedeliveryPolicy().maximumRedeliveries(0);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder maximumRedeliveryDelay(long maximumRedeliveryDelay) {
+    public LegacyDefaultErrorHandlerBuilder maximumRedeliveryDelay(long maximumRedeliveryDelay) {
         getRedeliveryPolicy().maximumRedeliveryDelay(maximumRedeliveryDelay);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder useCollisionAvoidance() {
+    public LegacyDefaultErrorHandlerBuilder useCollisionAvoidance() {
         getRedeliveryPolicy().useCollisionAvoidance();
         return this;
     }
 
-    public DefaultErrorHandlerBuilder useExponentialBackOff() {
+    public LegacyDefaultErrorHandlerBuilder useExponentialBackOff() {
         getRedeliveryPolicy().useExponentialBackOff();
         return this;
     }
 
-    public DefaultErrorHandlerBuilder retriesExhaustedLogLevel(LoggingLevel retriesExhaustedLogLevel) {
+    public LegacyDefaultErrorHandlerBuilder retriesExhaustedLogLevel(LoggingLevel retriesExhaustedLogLevel) {
         getRedeliveryPolicy().setRetriesExhaustedLogLevel(retriesExhaustedLogLevel);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder retryAttemptedLogLevel(LoggingLevel retryAttemptedLogLevel) {
+    public LegacyDefaultErrorHandlerBuilder retryAttemptedLogLevel(LoggingLevel retryAttemptedLogLevel) {
         getRedeliveryPolicy().setRetryAttemptedLogLevel(retryAttemptedLogLevel);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder retryAttemptedLogInterval(int retryAttemptedLogInterval) {
+    public LegacyDefaultErrorHandlerBuilder retryAttemptedLogInterval(int retryAttemptedLogInterval) {
         getRedeliveryPolicy().setRetryAttemptedLogInterval(retryAttemptedLogInterval);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder logStackTrace(boolean logStackTrace) {
+    public LegacyDefaultErrorHandlerBuilder logStackTrace(boolean logStackTrace) {
         getRedeliveryPolicy().setLogStackTrace(logStackTrace);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder logRetryStackTrace(boolean logRetryStackTrace) {
+    public LegacyDefaultErrorHandlerBuilder logRetryStackTrace(boolean logRetryStackTrace) {
         getRedeliveryPolicy().setLogRetryStackTrace(logRetryStackTrace);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder logHandled(boolean logHandled) {
+    public LegacyDefaultErrorHandlerBuilder logHandled(boolean logHandled) {
         getRedeliveryPolicy().setLogHandled(logHandled);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder logNewException(boolean logNewException) {
+    public LegacyDefaultErrorHandlerBuilder logNewException(boolean logNewException) {
         getRedeliveryPolicy().setLogNewException(logNewException);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder logExhausted(boolean logExhausted) {
+    public LegacyDefaultErrorHandlerBuilder logExhausted(boolean logExhausted) {
         getRedeliveryPolicy().setLogExhausted(logExhausted);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder logRetryAttempted(boolean logRetryAttempted) {
+    public LegacyDefaultErrorHandlerBuilder logRetryAttempted(boolean logRetryAttempted) {
         getRedeliveryPolicy().setLogRetryAttempted(logRetryAttempted);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder logExhaustedMessageHistory(boolean logExhaustedMessageHistory) {
+    public LegacyDefaultErrorHandlerBuilder logExhaustedMessageHistory(boolean logExhaustedMessageHistory) {
         getRedeliveryPolicy().setLogExhaustedMessageHistory(logExhaustedMessageHistory);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder logExhaustedMessageBody(boolean logExhaustedMessageBody) {
+    public LegacyDefaultErrorHandlerBuilder logExhaustedMessageBody(boolean logExhaustedMessageBody) {
         getRedeliveryPolicy().setLogExhaustedMessageBody(logExhaustedMessageBody);
         return this;
     }
 
-    public DefaultErrorHandlerBuilder exchangeFormatterRef(String exchangeFormatterRef) {
+    public LegacyDefaultErrorHandlerBuilder exchangeFormatterRef(String exchangeFormatterRef) {
         getRedeliveryPolicy().setExchangeFormatterRef(exchangeFormatterRef);
         return this;
     }
@@ -196,7 +196,7 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @see    RedeliveryPolicy#setAsyncDelayedRedelivery(boolean)
      * @return the builder
      */
-    public DefaultErrorHandlerBuilder asyncDelayedRedelivery() {
+    public LegacyDefaultErrorHandlerBuilder asyncDelayedRedelivery() {
         getRedeliveryPolicy().setAsyncDelayedRedelivery(true);
         return this;
     }
@@ -207,7 +207,7 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @param  allowRedeliveryWhileStopping <tt>true</tt> to allow redelivery, <tt>false</tt> to reject redeliveries
      * @return                              the builder
      */
-    public DefaultErrorHandlerBuilder allowRedeliveryWhileStopping(boolean allowRedeliveryWhileStopping) {
+    public LegacyDefaultErrorHandlerBuilder allowRedeliveryWhileStopping(boolean allowRedeliveryWhileStopping) {
         getRedeliveryPolicy().setAllowRedeliveryWhileStopping(allowRedeliveryWhileStopping);
         return this;
     }
@@ -218,7 +218,7 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @param  executorService the scheduled thread pool to use
      * @return                 the builder.
      */
-    public DefaultErrorHandlerBuilder executorService(ScheduledExecutorService executorService) {
+    public LegacyDefaultErrorHandlerBuilder executorService(ScheduledExecutorService executorService) {
         setExecutorService(executorService);
         return this;
     }
@@ -229,7 +229,7 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @param  ref reference to a scheduled thread pool
      * @return     the builder.
      */
-    public DefaultErrorHandlerBuilder executorServiceRef(String ref) {
+    public LegacyDefaultErrorHandlerBuilder executorServiceRef(String ref) {
         setExecutorServiceRef(ref);
         return this;
     }
@@ -240,7 +240,7 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @param  logger the logger
      * @return        the builder
      */
-    public DefaultErrorHandlerBuilder logger(CamelLogger logger) {
+    public LegacyDefaultErrorHandlerBuilder logger(CamelLogger logger) {
         setLogger(logger);
         return this;
     }
@@ -251,7 +251,7 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @param  level the logging level
      * @return       the builder
      */
-    public DefaultErrorHandlerBuilder loggingLevel(LoggingLevel level) {
+    public LegacyDefaultErrorHandlerBuilder loggingLevel(LoggingLevel level) {
         getLogger().setLevel(level);
         return this;
     }
@@ -262,7 +262,7 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @param  log the logger
      * @return     the builder
      */
-    public DefaultErrorHandlerBuilder log(org.slf4j.Logger log) {
+    public LegacyDefaultErrorHandlerBuilder log(org.slf4j.Logger log) {
         getLogger().setLog(log);
         return this;
     }
@@ -273,7 +273,7 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @param  log the log name
      * @return     the builder
      */
-    public DefaultErrorHandlerBuilder log(String log) {
+    public LegacyDefaultErrorHandlerBuilder log(String log) {
         return log(LoggerFactory.getLogger(log));
     }
 
@@ -283,7 +283,7 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @param  log the log class
      * @return     the builder
      */
-    public DefaultErrorHandlerBuilder log(Class<?> log) {
+    public LegacyDefaultErrorHandlerBuilder log(Class<?> log) {
         return log(LoggerFactory.getLogger(log));
     }
 
@@ -295,7 +295,7 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @param  processor the processor
      * @return           the builder
      */
-    public DefaultErrorHandlerBuilder onRedelivery(Processor processor) {
+    public LegacyDefaultErrorHandlerBuilder onRedelivery(Processor processor) {
         setOnRedelivery(processor);
         return this;
     }
@@ -307,7 +307,7 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @return                 the builder
      * @see                    #onRedelivery(Processor)
      */
-    public DefaultErrorHandlerBuilder onRedeliveryRef(String onRedeliveryRef) {
+    public LegacyDefaultErrorHandlerBuilder onRedeliveryRef(String onRedeliveryRef) {
         setOnRedeliveryRef(onRedeliveryRef);
         return this;
     }
@@ -320,12 +320,12 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @param  retryWhile expression that determines when to stop retrying
      * @return            the builder
      */
-    public DefaultErrorHandlerBuilder retryWhile(Expression retryWhile) {
+    public LegacyDefaultErrorHandlerBuilder retryWhile(Expression retryWhile) {
         setRetryWhile(ExpressionToPredicateAdapter.toPredicate(retryWhile));
         return this;
     }
 
-    public DefaultErrorHandlerBuilder retryWhileRef(String retryWhileRef) {
+    public LegacyDefaultErrorHandlerBuilder retryWhileRef(String retryWhileRef) {
         setRetryWhileRef(retryWhileRef);
         return this;
     }
@@ -362,7 +362,7 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @return the builder
      * @see    #useOriginalBody()
      */
-    public DefaultErrorHandlerBuilder useOriginalMessage() {
+    public LegacyDefaultErrorHandlerBuilder useOriginalMessage() {
         setUseOriginalMessage(true);
         return this;
     }
@@ -399,7 +399,7 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @return the builder
      * @see    #useOriginalMessage()
      */
-    public DefaultErrorHandlerBuilder useOriginalBody() {
+    public LegacyDefaultErrorHandlerBuilder useOriginalBody() {
         setUseOriginalBody(true);
         return this;
     }
@@ -419,20 +419,20 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      *                            exception on the {@link org.apache.camel.Exchange}
      * @return                    the builder
      */
-    public DefaultErrorHandlerBuilder deadLetterHandleNewException(boolean handleNewException) {
+    public LegacyDefaultErrorHandlerBuilder deadLetterHandleNewException(boolean handleNewException) {
         setDeadLetterHandleNewException(handleNewException);
         return this;
     }
 
     /**
-     * Sets a custom {@link org.apache.camel.Processor} to prepare the {@link org.apache.camel.Exchange} before handled
-     * by the failure processor / dead letter channel. This allows for example to enrich the message before sending to a
-     * dead letter queue.
+     * Sets a custom {@link Processor} to prepare the {@link org.apache.camel.Exchange} before handled by the failure
+     * processor / dead letter channel. This allows for example to enrich the message before sending to a dead letter
+     * queue.
      *
      * @param  processor the processor
      * @return           the builder
      */
-    public DefaultErrorHandlerBuilder onPrepareFailure(Processor processor) {
+    public LegacyDefaultErrorHandlerBuilder onPrepareFailure(Processor processor) {
         setOnPrepareFailure(processor);
         return this;
     }
@@ -444,21 +444,21 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @return                     the builder
      * @see                        #onPrepareFailure(Processor)
      */
-    public DefaultErrorHandlerBuilder onPrepareFailureRef(String onPrepareFailureRef) {
+    public LegacyDefaultErrorHandlerBuilder onPrepareFailureRef(String onPrepareFailureRef) {
         setOnPrepareFailureRef(onPrepareFailureRef);
         return this;
     }
 
     /**
-     * Sets a custom {@link org.apache.camel.Processor} to process the {@link org.apache.camel.Exchange} just after an
-     * exception was thrown. This allows to execute the processor at the same time the exception was thrown.
+     * Sets a custom {@link Processor} to process the {@link org.apache.camel.Exchange} just after an exception was
+     * thrown. This allows to execute the processor at the same time the exception was thrown.
      * <p/>
      * Important: Any exception thrown from this processor will be ignored.
      *
      * @param  processor the processor
      * @return           the builder
      */
-    public DefaultErrorHandlerBuilder onExceptionOccurred(Processor processor) {
+    public LegacyDefaultErrorHandlerBuilder onExceptionOccurred(Processor processor) {
         setOnExceptionOccurred(processor);
         return this;
     }
@@ -470,7 +470,7 @@ public class DefaultErrorHandlerBuilder extends ErrorHandlerBuilderSupport imple
      * @return                        the builder
      * @see                           #onExceptionOccurred(Processor)
      */
-    public DefaultErrorHandlerBuilder onExceptionOccurredRef(String onExceptionOccurredRef) {
+    public LegacyDefaultErrorHandlerBuilder onExceptionOccurredRef(String onExceptionOccurredRef) {
         setOnExceptionOccurredRef(onExceptionOccurredRef);
         return this;
     }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerProperties.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyErrorHandlerBuilder.java
similarity index 81%
copy from core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerProperties.java
copy to core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyErrorHandlerBuilder.java
index babb993df96..7effbde849d 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerProperties.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyErrorHandlerBuilder.java
@@ -14,12 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.model.errorhandler;
+package org.apache.camel.builder;
 
 import org.apache.camel.ErrorHandlerFactory;
 
-public interface NoErrorHandlerProperties extends ErrorHandlerFactory {
-
-    // no configuration
+/**
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
+ */
+@Deprecated
+public interface LegacyErrorHandlerBuilder extends ErrorHandlerFactory {
 
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyErrorHandlerBuilderRef.java
similarity index 79%
rename from core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java
rename to core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyErrorHandlerBuilderRef.java
index 88b069b4eb9..444f15118d4 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyErrorHandlerBuilderRef.java
@@ -20,18 +20,19 @@ import org.apache.camel.model.errorhandler.ErrorHandlerRefConfiguration;
 import org.apache.camel.model.errorhandler.ErrorHandlerRefProperties;
 
 /**
- * Represents a proxy to an error handler builder which is resolved by named reference
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
  */
-public class ErrorHandlerBuilderRef extends ErrorHandlerBuilderSupport implements ErrorHandlerRefProperties {
+@Deprecated
+public class LegacyErrorHandlerBuilderRef extends LegacyErrorHandlerBuilderSupport implements ErrorHandlerRefProperties {
 
     public static final String DEFAULT_ERROR_HANDLER_BUILDER = ErrorHandlerRefProperties.DEFAULT_ERROR_HANDLER_BUILDER;
 
     private final ErrorHandlerRefConfiguration configuration = new ErrorHandlerRefConfiguration();
 
-    public ErrorHandlerBuilderRef() {
+    public LegacyErrorHandlerBuilderRef() {
     }
 
-    public ErrorHandlerBuilderRef(String ref) {
+    public LegacyErrorHandlerBuilderRef(String ref) {
         this.configuration.setRef(ref);
     }
 
@@ -41,13 +42,13 @@ public class ErrorHandlerBuilderRef extends ErrorHandlerBuilderSupport implement
     }
 
     @Override
-    public ErrorHandlerBuilder cloneBuilder() {
-        ErrorHandlerBuilderRef answer = new ErrorHandlerBuilderRef(configuration.getRef());
+    public LegacyErrorHandlerBuilder cloneBuilder() {
+        LegacyErrorHandlerBuilderRef answer = new LegacyErrorHandlerBuilderRef(configuration.getRef());
         cloneBuilder(answer);
         return answer;
     }
 
-    protected void cloneBuilder(ErrorHandlerBuilderRef other) {
+    protected void cloneBuilder(LegacyErrorHandlerBuilderRef other) {
         other.setSupportTransacted(configuration.isSupportTransacted());
     }
 
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyErrorHandlerBuilderSupport.java
similarity index 83%
copy from core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java
copy to core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyErrorHandlerBuilderSupport.java
index 07122de883e..0e9d61d22b9 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyErrorHandlerBuilderSupport.java
@@ -17,9 +17,10 @@
 package org.apache.camel.builder;
 
 /**
- * Base class for builders of error handling.
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
  */
-public abstract class ErrorHandlerBuilderSupport implements ErrorHandlerBuilder {
+@Deprecated
+public abstract class LegacyErrorHandlerBuilderSupport implements LegacyErrorHandlerBuilder {
 
     @Override
     public boolean supportTransacted() {
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyNoErrorHandlerBuilder.java
similarity index 70%
copy from core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java
copy to core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyNoErrorHandlerBuilder.java
index 07122de883e..1813a98ebd8 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/LegacyNoErrorHandlerBuilder.java
@@ -16,14 +16,21 @@
  */
 package org.apache.camel.builder;
 
+import org.apache.camel.model.errorhandler.NoErrorHandlerProperties;
+
 /**
- * Base class for builders of error handling.
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
  */
-public abstract class ErrorHandlerBuilderSupport implements ErrorHandlerBuilder {
+@Deprecated
+public class LegacyNoErrorHandlerBuilder extends LegacyErrorHandlerBuilderSupport implements NoErrorHandlerProperties {
 
     @Override
     public boolean supportTransacted() {
         return false;
     }
 
+    @Override
+    public LegacyErrorHandlerBuilder cloneBuilder() {
+        return new LegacyNoErrorHandlerBuilder();
+    }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/NoErrorHandlerBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/NoErrorHandlerBuilder.java
index f1ee2930635..4b90cb8c5be 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/NoErrorHandlerBuilder.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/NoErrorHandlerBuilder.java
@@ -16,24 +16,10 @@
  */
 package org.apache.camel.builder;
 
-import org.apache.camel.Processor;
-import org.apache.camel.model.errorhandler.NoErrorHandlerProperties;
+import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition;
 
 /**
- * A builder to disable the use of an error handler so that any exceptions are thrown. This not recommended in general,
- * the <a href="http://camel.apache.org/dead-letter-channel.html">Dead Letter Channel</a> should be used if you are
- * unsure; however it can be useful sometimes to disable an error handler inside a complex route so that exceptions
- * bubble up to the parent {@link Processor}
+ * No error handler as a builder.
  */
-public class NoErrorHandlerBuilder extends ErrorHandlerBuilderSupport implements NoErrorHandlerProperties {
-
-    @Override
-    public boolean supportTransacted() {
-        return false;
-    }
-
-    @Override
-    public ErrorHandlerBuilder cloneBuilder() {
-        return new NoErrorHandlerBuilder();
-    }
+public class NoErrorHandlerBuilder extends NoErrorHandlerDefinition {
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/RefErrorHandlerBuilder.java
similarity index 74%
copy from core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java
copy to core/camel-core-model/src/main/java/org/apache/camel/builder/RefErrorHandlerBuilder.java
index 07122de883e..3dff0b56746 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/RefErrorHandlerBuilder.java
@@ -16,14 +16,17 @@
  */
 package org.apache.camel.builder;
 
+import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
+
 /**
- * Base class for builders of error handling.
+ * Ref error handler as a builder.
  */
-public abstract class ErrorHandlerBuilderSupport implements ErrorHandlerBuilder {
+public class RefErrorHandlerBuilder extends ErrorHandlerRefDefinition {
 
-    @Override
-    public boolean supportTransacted() {
-        return false;
+    public RefErrorHandlerBuilder() {
     }
 
+    public RefErrorHandlerBuilder(String ref) {
+        super(ref);
+    }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
index d661d533285..6286ae5da78 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
@@ -27,6 +27,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Endpoint;
+import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Ordered;
 import org.apache.camel.Route;
@@ -45,6 +46,7 @@ import org.apache.camel.model.RouteTemplatesDefinition;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.model.TemplatedRouteDefinition;
 import org.apache.camel.model.TemplatedRoutesDefinition;
+import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
 import org.apache.camel.model.rest.RestConfigurationDefinition;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
@@ -353,14 +355,14 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
     /**
      * Installs the given <a href="http://camel.apache.org/error-handler.html">error handler</a> builder
      *
-     * @param errorHandlerBuilder the error handler to be used by default for all child routes
+     * @param errorHandlerFactory the error handler to be used by default for all child routes
      */
-    public void errorHandler(ErrorHandlerBuilder errorHandlerBuilder) {
+    public void errorHandler(ErrorHandlerFactory errorHandlerFactory) {
         if (!getRouteCollection().getRoutes().isEmpty()) {
             throw new IllegalArgumentException("errorHandler must be defined before any routes in the RouteBuilder");
         }
         getRouteCollection().setCamelContext(getContext());
-        setErrorHandlerBuilder(errorHandlerBuilder);
+        setErrorHandlerFactory(errorHandlerFactory);
     }
 
     /**
@@ -373,7 +375,7 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
             throw new IllegalArgumentException("errorHandler must be defined before any routes in the RouteBuilder");
         }
         getRouteCollection().setCamelContext(getContext());
-        setErrorHandlerBuilder(new ErrorHandlerBuilderRef(ref));
+        setErrorHandlerFactory(new ErrorHandlerRefDefinition(ref));
     }
 
     /**
@@ -596,10 +598,10 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
     }
 
     @Override
-    public void setErrorHandlerBuilder(ErrorHandlerBuilder errorHandlerBuilder) {
-        super.setErrorHandlerBuilder(errorHandlerBuilder);
-        getRouteCollection().setErrorHandlerFactory(getErrorHandlerBuilder());
-        getRouteTemplateCollection().setErrorHandlerFactory(getErrorHandlerBuilder());
+    public void setErrorHandlerFactory(ErrorHandlerFactory errorHandlerFactory) {
+        super.setErrorHandlerFactory(errorHandlerFactory);
+        getRouteCollection().setErrorHandlerFactory(getErrorHandlerFactory());
+        getRouteTemplateCollection().setErrorHandlerFactory(getErrorHandlerFactory());
     }
 
     /**
@@ -622,9 +624,9 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
         if (initialized.compareAndSet(false, true)) {
             // Set the CamelContext ErrorHandler here
             CamelContext camelContext = getContext();
-            if (camelContext.adapt(ExtendedCamelContext.class).getErrorHandlerFactory() instanceof ErrorHandlerBuilder) {
-                setErrorHandlerBuilder(
-                        (ErrorHandlerBuilder) camelContext.adapt(ExtendedCamelContext.class).getErrorHandlerFactory());
+            if (camelContext.adapt(ExtendedCamelContext.class).getErrorHandlerFactory() != null) {
+                setErrorHandlerFactory(
+                        camelContext.adapt(ExtendedCamelContext.class).getErrorHandlerFactory());
             }
 
             for (RouteBuilderLifecycleStrategy interceptor : lifecycleInterceptors) {
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/SpringTransactionErrorHandlerBuilder.java
similarity index 60%
rename from core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java
rename to core/camel-core-model/src/main/java/org/apache/camel/builder/SpringTransactionErrorHandlerBuilder.java
index 07122de883e..e595edcb49c 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderSupport.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/SpringTransactionErrorHandlerBuilder.java
@@ -16,14 +16,22 @@
  */
 package org.apache.camel.builder;
 
+import org.apache.camel.model.errorhandler.SpringTransactionErrorHandlerDefinition;
+
 /**
- * Base class for builders of error handling.
+ * Spring transaction error handler as a builder.
  */
-public abstract class ErrorHandlerBuilderSupport implements ErrorHandlerBuilder {
+public class SpringTransactionErrorHandlerBuilder extends SpringTransactionErrorHandlerDefinition {
+
+    public SpringTransactionErrorHandlerBuilder() {
+    }
 
-    @Override
-    public boolean supportTransacted() {
-        return false;
+    public SpringTransactionErrorHandlerBuilder(Object transactedPolicy) {
+        if (transactedPolicy instanceof String) {
+            setTransactedPolicyRef((String) transactedPolicy);
+        } else {
+            setTransactedPolicy(transactedPolicy);
+        }
     }
 
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/Constants.java b/core/camel-core-model/src/main/java/org/apache/camel/model/Constants.java
index 6a9dbb652b4..cf7fefb18f0 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/Constants.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/Constants.java
@@ -26,6 +26,7 @@ public final class Constants {
                                                        + "org.apache.camel.model.cloud:"
                                                        + "org.apache.camel.model.config:"
                                                        + "org.apache.camel.model.dataformat:"
+                                                       + "org.apache.camel.model.errorhandler:"
                                                        + "org.apache.camel.model.language:"
                                                        + "org.apache.camel.model.loadbalancer:"
                                                        + "org.apache.camel.model.rest:"
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/ErrorHandlerDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/ErrorHandlerDefinition.java
new file mode 100644
index 00000000000..03c642d9b5b
--- /dev/null
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/ErrorHandlerDefinition.java
@@ -0,0 +1,66 @@
+/*
+ * 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.model;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElements;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
+import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.SpringTransactionErrorHandlerDefinition;
+import org.apache.camel.spi.Metadata;
+
+/**
+ * Camel error handling.
+ */
+@Metadata(label = "configuration,error")
+@XmlRootElement(name = "errorHandler")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ErrorHandlerDefinition extends IdentifiedType {
+
+    @XmlElements({
+            @XmlElement(name = "deadLetterChannel", type = DeadLetterChannelDefinition.class),
+            @XmlElement(name = "defaultErrorHandler", type = DefaultErrorHandlerDefinition.class),
+            @XmlElement(name = "noErrorHandler", type = NoErrorHandlerDefinition.class),
+            @XmlElement(name = "jtaTransactionErrorHandler", type = JtaTransactionErrorHandlerDefinition.class),
+            @XmlElement(name = "springTransactionErrorHandler", type = SpringTransactionErrorHandlerDefinition.class) })
+    private ErrorHandlerFactory errorHandlerType;
+
+    public ErrorHandlerFactory getErrorHandlerType() {
+        return errorHandlerType;
+    }
+
+    public void setErrorHandlerType(ErrorHandlerFactory errorHandlerType) {
+        this.errorHandlerType = errorHandlerType;
+    }
+
+    @Override
+    public String toString() {
+        return "ErrorHandler[" + description() + "]";
+    }
+
+    protected String description() {
+        return errorHandlerType != null ? errorHandlerType.toString() : "";
+    }
+
+}
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java
index 896739f3e5d..13384d8b897 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java
@@ -30,46 +30,46 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "configuration")
 @XmlRootElement(name = "redeliveryPolicy")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class RedeliveryPolicyDefinition {
+public class RedeliveryPolicyDefinition extends IdentifiedType implements Cloneable {
 
     @XmlAttribute
     @Metadata(javaType = "java.lang.Integer")
     private String maximumRedeliveries;
     @XmlAttribute
-    @Metadata(javaType = "java.time.Duration")
+    @Metadata(javaType = "java.time.Duration", defaultValue = "1000")
     private String redeliveryDelay;
     @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
     private String asyncDelayedRedelivery;
     @XmlAttribute
-    @Metadata(javaType = "java.lang.Double")
+    @Metadata(javaType = "java.lang.Double", defaultValue = "2.0")
     private String backOffMultiplier;
     @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
     private String useExponentialBackOff;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "java.lang.Double")
+    @Metadata(label = "advanced", javaType = "java.lang.Double", defaultValue = "0.15")
     private String collisionAvoidanceFactor;
     @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
     private String useCollisionAvoidance;
     @XmlAttribute
-    @Metadata(javaType = "java.time.Duration")
+    @Metadata(javaType = "java.time.Duration", defaultValue = "60000")
     private String maximumRedeliveryDelay;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "org.apache.camel.LoggingLevel")
+    @Metadata(label = "advanced", javaType = "org.apache.camel.LoggingLevel", defaultValue = "ERROR")
     private String retriesExhaustedLogLevel;
     @XmlAttribute
-    @Metadata(javaType = "org.apache.camel.LoggingLevel")
+    @Metadata(javaType = "org.apache.camel.LoggingLevel", defaultValue = "DEBUG")
     private String retryAttemptedLogLevel;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "java.lang.Integer")
+    @Metadata(label = "advanced", javaType = "java.lang.Integer", defaultValue = "1")
     private String retryAttemptedLogInterval;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "java.lang.Boolean")
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true")
     private String logRetryAttempted;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "java.lang.Boolean")
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true")
     private String logStackTrace;
     @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
@@ -78,13 +78,13 @@ public class RedeliveryPolicyDefinition {
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
     private String logHandled;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "java.lang.Boolean")
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true")
     private String logNewException;
     @XmlAttribute
     @Metadata(javaType = "java.lang.Boolean")
     private String logContinued;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "java.lang.Boolean")
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true")
     private String logExhausted;
     @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
@@ -99,7 +99,7 @@ public class RedeliveryPolicyDefinition {
     @Metadata(label = "advanced")
     private String delayPattern;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "java.lang.Boolean")
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true")
     private String allowRedeliveryWhileStopping;
     @XmlAttribute
     @Metadata(label = "advanced")
@@ -110,6 +110,14 @@ public class RedeliveryPolicyDefinition {
         return "RedeliveryPolicy[maximumRedeliveries: " + maximumRedeliveries + "]";
     }
 
+    public RedeliveryPolicyDefinition copy() {
+        try {
+            return (RedeliveryPolicyDefinition) clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeException("Could not clone: " + e, e);
+        }
+    }
+
     // Fluent API
     // -------------------------------------------------------------------------
 
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java
index a0bd0c2cfed..3b1c3326e4c 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java
@@ -42,7 +42,7 @@ import org.apache.camel.RouteTemplateContext;
 import org.apache.camel.ShutdownRoute;
 import org.apache.camel.ShutdownRunningTask;
 import org.apache.camel.builder.EndpointConsumerBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
+import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
 import org.apache.camel.model.rest.RestBindingDefinition;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.spi.AsEndpointUri;
@@ -415,6 +415,19 @@ public class RouteDefinition extends OutputDefinition<RouteDefinition>
         return this;
     }
 
+    /**
+     * Installs the given <a href="http://camel.apache.org/error-handler.html">error handler</a> builder.
+     *
+     * @param  ref reference to existing error handler
+     * @return     the current builder with the error handler configured
+     */
+    public RouteDefinition errorHandler(String ref) {
+        setErrorHandlerRef(ref);
+        // we are now using a route scoped error handler
+        contextScopedErrorHandler = false;
+        return this;
+    }
+
     /**
      * Installs the given <a href="http://camel.apache.org/error-handler.html">error handler</a> builder.
      *
@@ -974,7 +987,7 @@ public class RouteDefinition extends OutputDefinition<RouteDefinition>
             // we use an specific error handler ref (from Spring DSL) then wrap that
             // with a error handler build ref so Camel knows its not just the
             // default one
-            setErrorHandlerFactory(new ErrorHandlerBuilderRef(errorHandlerRef));
+            setErrorHandlerFactory(new ErrorHandlerRefDefinition(errorHandlerRef));
         }
     }
 
@@ -1054,11 +1067,11 @@ public class RouteDefinition extends OutputDefinition<RouteDefinition>
 
     private ErrorHandlerFactory createErrorHandlerBuilder() {
         if (errorHandlerRef != null) {
-            return new ErrorHandlerBuilderRef(errorHandlerRef);
+            return new ErrorHandlerRefDefinition(errorHandlerRef);
         }
 
         // return a reference to the default error handler
-        return new ErrorHandlerBuilderRef(ErrorHandlerBuilderRef.DEFAULT_ERROR_HANDLER_BUILDER);
+        return new ErrorHandlerRefDefinition(ErrorHandlerRefDefinition.DEFAULT_ERROR_HANDLER_BUILDER);
     }
 
     public ErrorHandlerFactory getErrorHandlerFactory() {
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java
index 72999a7397e..98b9d1923f5 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java
@@ -31,7 +31,6 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.VerbDefinition;
 import org.apache.camel.support.CamelContextHelper;
@@ -452,12 +451,8 @@ public final class RouteDefinitionHelper {
             // multiple RouteBuilders
             ErrorHandlerFactory builder = context.adapt(ExtendedCamelContext.class).getErrorHandlerFactory();
             if (builder != null) {
-                if (builder instanceof ErrorHandlerBuilder) {
-                    builder = ((ErrorHandlerBuilder) builder).cloneBuilder();
-                    route.setErrorHandlerFactoryIfNull(builder);
-                } else {
-                    throw new UnsupportedOperationException("The ErrorHandlerFactory must implement ErrorHandlerBuilder");
-                }
+                ErrorHandlerFactory clone = builder.cloneBuilder();
+                route.setErrorHandlerFactoryIfNull(clone);
             }
         }
 
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerProperties.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/BaseErrorHandlerDefinition.java
similarity index 82%
copy from core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerProperties.java
copy to core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/BaseErrorHandlerDefinition.java
index babb993df96..34ce65b8b96 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerProperties.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/BaseErrorHandlerDefinition.java
@@ -17,9 +17,11 @@
 package org.apache.camel.model.errorhandler;
 
 import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.model.IdentifiedType;
 
-public interface NoErrorHandlerProperties extends ErrorHandlerFactory {
-
-    // no configuration
+/**
+ * Base class for error handler models.
+ */
+abstract class BaseErrorHandlerDefinition extends IdentifiedType implements ErrorHandlerFactory {
 
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelConfiguration.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelConfiguration.java
index 6ef03413b41..a74b6003cef 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelConfiguration.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelConfiguration.java
@@ -22,7 +22,11 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.Predicate;
 import org.apache.camel.spi.Language;
 
+/**
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
+ */
 @XmlTransient
+@Deprecated
 public class DeadLetterChannelConfiguration extends DefaultErrorHandlerConfiguration implements DeadLetterChannelProperties {
 
     // has no additional configurations
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java
new file mode 100644
index 00000000000..9e90e396304
--- /dev/null
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java
@@ -0,0 +1,138 @@
+/*
+ * 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.model.errorhandler;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.model.RedeliveryPolicyDefinition;
+import org.apache.camel.spi.Metadata;
+
+/**
+ * Dead letter channel error handler.
+ */
+@Metadata(label = "configuration,error")
+@XmlRootElement(name = "deadLetterChannel")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class DeadLetterChannelDefinition extends DefaultErrorHandlerDefinition {
+
+    @XmlAttribute(required = true)
+    private String deadLetterUri;
+    @XmlAttribute
+    @Metadata(label = "advanced", defaultValue = "true", javaType = "java.lang.Boolean")
+    private String deadLetterHandleNewException;
+
+    public DeadLetterChannelDefinition() {
+    }
+
+    public DeadLetterChannelDefinition(String deadLetterUri) {
+        this.deadLetterUri = deadLetterUri;
+    }
+
+    public DeadLetterChannelDefinition(Endpoint deadLetterUri) {
+        this.deadLetterUri = deadLetterUri.getEndpointUri();
+    }
+
+    @Override
+    protected RedeliveryPolicyDefinition createRedeliveryPolicy() {
+        RedeliveryPolicyDefinition answer = super.createRedeliveryPolicy();
+        // DLC do not log exhausted by default
+        answer.setLogExhausted("false");
+        return answer;
+    }
+
+    public String getDeadLetterUri() {
+        return deadLetterUri;
+    }
+
+    /**
+     * The dead letter endpoint uri for the Dead Letter error handler.
+     */
+    public void setDeadLetterUri(String deadLetterUri) {
+        this.deadLetterUri = deadLetterUri;
+    }
+
+    public String getDeadLetterHandleNewException() {
+        return deadLetterHandleNewException;
+    }
+
+    /**
+     * Whether the dead letter channel should handle (and ignore) any new exception that may been thrown during sending
+     * the message to the dead letter endpoint.
+     * <p/>
+     * The default value is <tt>true</tt> which means any such kind of exception is handled and ignored. Set this to
+     * <tt>false</tt> to let the exception be propagated back on the {@link org.apache.camel.Exchange}. This can be used
+     * in situations where you use transactions, and want to use Camel's dead letter channel to deal with exceptions
+     * during routing, but if the dead letter channel itself fails because of a new exception being thrown, then by
+     * setting this to <tt>false</tt> the new exceptions is propagated back and set on the
+     * {@link org.apache.camel.Exchange}, which allows the transaction to detect the exception, and rollback.
+     */
+    public void setDeadLetterHandleNewException(String deadLetterHandleNewException) {
+        this.deadLetterHandleNewException = deadLetterHandleNewException;
+    }
+
+    @Override
+    public boolean supportTransacted() {
+        return false;
+    }
+
+    @Override
+    public ErrorHandlerFactory cloneBuilder() {
+        DeadLetterChannelDefinition answer = new DeadLetterChannelDefinition();
+        cloneBuilder(answer);
+        return answer;
+    }
+
+    protected void cloneBuilder(DeadLetterChannelDefinition other) {
+        other.setDeadLetterUri(getDeadLetterUri());
+        other.setDeadLetterHandleNewException(getDeadLetterHandleNewException());
+        super.cloneBuilder(other);
+    }
+
+    /**
+     * The dead letter endpoint uri for the Dead Letter error handler.
+     */
+    public DeadLetterChannelDefinition deadLetterUri(String deadLetterUri) {
+        setDeadLetterUri(deadLetterUri);
+        return this;
+    }
+
+    /**
+     * Whether the dead letter channel should handle (and ignore) any new exception that may been thrown during sending
+     * the message to the dead letter endpoint.
+     * <p/>
+     * The default value is <tt>true</tt> which means any such kind of exception is handled and ignored. Set this to
+     * <tt>false</tt> to let the exception be propagated back on the {@link org.apache.camel.Exchange}. This can be used
+     * in situations where you use transactions, and want to use Camel's dead letter channel to deal with exceptions
+     * during routing, but if the dead letter channel itself fails because of a new exception being thrown, then by
+     * setting this to <tt>false</tt> the new exceptions is propagated back and set on the
+     * {@link org.apache.camel.Exchange}, which allows the transaction to detect the exception, and rollback.
+     *
+     * @param  handleNewException <tt>true</tt> to handle (and ignore), <tt>false</tt> to catch and propagated the
+     *                            exception on the {@link org.apache.camel.Exchange}
+     * @return                    the builder
+     */
+    public DefaultErrorHandlerDefinition deadLetterHandleNewException(boolean handleNewException) {
+        setDeadLetterHandleNewException(handleNewException ? "true" : "false");
+        return this;
+    }
+
+}
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelProperties.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelProperties.java
index 8ce8e0483e9..528e7989c58 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelProperties.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelProperties.java
@@ -19,6 +19,10 @@ package org.apache.camel.model.errorhandler;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Predicate;
 
+/**
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
+ */
+@Deprecated
 public interface DeadLetterChannelProperties extends DefaultErrorHandlerProperties {
 
     // has no additional configurations
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerConfiguration.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerConfiguration.java
index a28f22b2951..2d0fe7d8e5b 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerConfiguration.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerConfiguration.java
@@ -20,12 +20,17 @@ import java.util.concurrent.ScheduledExecutorService;
 
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.spi.CamelLogger;
 
+/**
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
+ */
 @XmlTransient
+@Deprecated
 public class DefaultErrorHandlerConfiguration implements DefaultErrorHandlerProperties {
 
     private CamelLogger logger;
@@ -196,4 +201,14 @@ public class DefaultErrorHandlerConfiguration implements DefaultErrorHandlerProp
     public void setOnExceptionOccurredRef(String onExceptionOccurredRef) {
         this.onExceptionOccurredRef = onExceptionOccurredRef;
     }
+
+    @Override
+    public boolean supportTransacted() {
+        return false;
+    }
+
+    @Override
+    public ErrorHandlerFactory cloneBuilder() {
+        return null;
+    }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java
new file mode 100644
index 00000000000..5b6e590f62b
--- /dev/null
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java
@@ -0,0 +1,780 @@
+/*
+ * 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.model.errorhandler;
+
+import java.util.concurrent.ScheduledExecutorService;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.Expression;
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.Predicate;
+import org.apache.camel.Processor;
+import org.apache.camel.model.RedeliveryPolicyDefinition;
+import org.apache.camel.processor.errorhandler.DefaultErrorHandler;
+import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
+import org.apache.camel.spi.CamelLogger;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.support.ExpressionToPredicateAdapter;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Default error handler.
+ */
+@Metadata(label = "configuration,error")
+@XmlRootElement(name = "defaultErrorHandler")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class DefaultErrorHandlerDefinition extends BaseErrorHandlerDefinition {
+
+    @XmlTransient
+    private CamelLogger loggerBean;
+    @XmlTransient
+    private Processor onRedeliveryProcessor;
+    @XmlTransient
+    private Processor onPrepareFailureProcessor;
+    @XmlTransient
+    private Processor onExceptionOccurredProcessor;
+    @XmlTransient
+    private ScheduledExecutorService executorServiceBean;
+    @XmlTransient
+    private Predicate retryWhilePredicate;
+
+    @XmlAttribute
+    @Metadata(label = "advanced")
+    private String loggerRef;
+    @XmlAttribute
+    @Metadata(label = "advanced", defaultValue = "ERROR")
+    private LoggingLevel level;
+    @XmlAttribute
+    @Metadata(label = "advanced")
+    private String logName;
+    @XmlAttribute
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean")
+    private String useOriginalMessage;
+    @XmlAttribute
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean")
+    private String useOriginalBody;
+    @XmlAttribute
+    @Metadata(label = "advanced", javaType = "org.apache.camel.Processor")
+    private String onRedeliveryRef;
+    @XmlAttribute
+    @Metadata(label = "advanced", javaType = "org.apache.camel.Processor")
+    private String onExceptionOccurredRef;
+    @XmlAttribute
+    @Metadata(label = "advanced", javaType = "org.apache.camel.Processor")
+    private String onPrepareFailureRef;
+    @XmlAttribute
+    @Metadata(label = "advanced", javaType = "org.apache.camel.Processor")
+    private String retryWhileRef;
+    @XmlAttribute
+    @Metadata(label = "advanced", javaType = "org.apache.camel.processor.errorhandler.RedeliveryPolicy")
+    private String redeliveryPolicyRef;
+    @XmlAttribute
+    @Metadata(label = "advanced", javaType = "java.util.concurrent.ScheduledExecutorService")
+    private String executorServiceRef;
+    @XmlElement
+    private RedeliveryPolicyDefinition redeliveryPolicy;
+
+    @Override
+    public boolean supportTransacted() {
+        return false;
+    }
+
+    @Override
+    public ErrorHandlerFactory cloneBuilder() {
+        DefaultErrorHandlerDefinition answer = new DefaultErrorHandlerDefinition();
+        cloneBuilder(answer);
+        return answer;
+    }
+
+    protected void cloneBuilder(DefaultErrorHandlerDefinition other) {
+        other.setExecutorServiceBean(getExecutorServiceBean());
+        other.setExecutorServiceRef(getExecutorServiceRef());
+        other.setLevel(getLevel());
+        other.setLogName(getLogName());
+        other.setLoggerBean(getLoggerBean());
+        other.setLoggerRef(getLoggerRef());
+        other.setOnExceptionOccurredProcessor(getOnExceptionOccurredProcessor());
+        other.setOnExceptionOccurredRef(getOnExceptionOccurredRef());
+        other.setOnPrepareFailureProcessor(getOnPrepareFailureProcessor());
+        other.setOnPrepareFailureRef(getOnPrepareFailureRef());
+        other.setOnRedeliveryProcessor(getOnRedeliveryProcessor());
+        other.setOnRedeliveryRef(getOnRedeliveryRef());
+        other.setRedeliveryPolicyRef(getRedeliveryPolicyRef());
+        other.setRetryWhilePredicate(getRetryWhilePredicate());
+        other.setRetryWhileRef(getRetryWhileRef());
+        other.setUseOriginalBody(getUseOriginalBody());
+        other.setUseOriginalMessage(getUseOriginalMessage());
+        if (getRedeliveryPolicy() != null) {
+            other.setRedeliveryPolicy(getRedeliveryPolicy().copy());
+        }
+    }
+
+    protected RedeliveryPolicyDefinition createRedeliveryPolicy() {
+        return new RedeliveryPolicyDefinition();
+    }
+
+    public String getLoggerRef() {
+        return loggerRef;
+    }
+
+    /**
+     * References to a logger to use as logger for the error handler
+     */
+    public void setLoggerRef(String loggerRef) {
+        this.loggerRef = loggerRef;
+    }
+
+    public CamelLogger getLoggerBean() {
+        return loggerBean;
+    }
+
+    public void setLoggerBean(CamelLogger loggerBean) {
+        this.loggerBean = loggerBean;
+    }
+
+    public LoggingLevel getLevel() {
+        return level;
+    }
+
+    /**
+     * Logging level to use when using the logging error handler type.
+     */
+    public void setLevel(LoggingLevel level) {
+        this.level = level;
+    }
+
+    public String getLogName() {
+        return logName;
+    }
+
+    /**
+     * Name of the logger to use for the logging error handler
+     */
+    public void setLogName(String logName) {
+        this.logName = logName;
+    }
+
+    public String getUseOriginalMessage() {
+        return useOriginalMessage;
+    }
+
+    /**
+     * Will use the original input {@link org.apache.camel.Message} (original body and headers) when an
+     * {@link org.apache.camel.Exchange} is moved to the dead letter queue.
+     * <p/>
+     * <b>Notice:</b> this only applies when all redeliveries attempt have failed and the
+     * {@link org.apache.camel.Exchange} is doomed for failure. <br/>
+     * Instead of using the current inprogress {@link org.apache.camel.Exchange} IN message we use the original IN
+     * message instead. This allows you to store the original input in the dead letter queue instead of the inprogress
+     * snapshot of the IN message. For instance if you route transform the IN body during routing and then failed. With
+     * the original exchange store in the dead letter queue it might be easier to manually re submit the
+     * {@link org.apache.camel.Exchange} again as the IN message is the same as when Camel received it. So you should be
+     * able to send the {@link org.apache.camel.Exchange} to the same input.
+     * <p/>
+     * The difference between useOriginalMessage and useOriginalBody is that the former includes both the original body
+     * and headers, where as the latter only includes the original body. You can use the latter to enrich the message
+     * with custom headers and include the original message body. The former wont let you do this, as its using the
+     * original message body and headers as they are. You cannot enable both useOriginalMessage and useOriginalBody.
+     * <p/>
+     * <b>Important:</b> The original input means the input message that are bounded by the current
+     * {@link org.apache.camel.spi.UnitOfWork}. An unit of work typically spans one route, or multiple routes if they
+     * are connected using internal endpoints such as direct or seda. When messages is passed via external endpoints
+     * such as JMS or HTTP then the consumer will create a new unit of work, with the message it received as input as
+     * the original input. Also some EIP patterns such as splitter, multicast, will create a new unit of work boundary
+     * for the messages in their sub-route (eg the splitted message); however these EIPs have an option named
+     * <tt>shareUnitOfWork</tt> which allows to combine with the parent unit of work in regard to error handling and
+     * therefore use the parent original message.
+     * <p/>
+     * By default this feature is off.
+     */
+    public void setUseOriginalMessage(String useOriginalMessage) {
+        this.useOriginalMessage = useOriginalMessage;
+    }
+
+    public String getUseOriginalBody() {
+        return useOriginalBody;
+    }
+
+    /**
+     * Will use the original input {@link org.apache.camel.Message} body (original body only) when an
+     * {@link org.apache.camel.Exchange} is moved to the dead letter queue.
+     * <p/>
+     * <b>Notice:</b> this only applies when all redeliveries attempt have failed and the
+     * {@link org.apache.camel.Exchange} is doomed for failure. <br/>
+     * Instead of using the current inprogress {@link org.apache.camel.Exchange} IN message we use the original IN
+     * message instead. This allows you to store the original input in the dead letter queue instead of the inprogress
+     * snapshot of the IN message. For instance if you route transform the IN body during routing and then failed. With
+     * the original exchange store in the dead letter queue it might be easier to manually re submit the
+     * {@link org.apache.camel.Exchange} again as the IN message is the same as when Camel received it. So you should be
+     * able to send the {@link org.apache.camel.Exchange} to the same input.
+     * <p/>
+     * The difference between useOriginalMessage and useOriginalBody is that the former includes both the original body
+     * and headers, where as the latter only includes the original body. You can use the latter to enrich the message
+     * with custom headers and include the original message body. The former wont let you do this, as its using the
+     * original message body and headers as they are. You cannot enable both useOriginalMessage and useOriginalBody.
+     * <p/>
+     * <b>Important:</b> The original input means the input message that are bounded by the current
+     * {@link org.apache.camel.spi.UnitOfWork}. An unit of work typically spans one route, or multiple routes if they
+     * are connected using internal endpoints such as direct or seda. When messages is passed via external endpoints
+     * such as JMS or HTTP then the consumer will create a new unit of work, with the message it received as input as
+     * the original input. Also some EIP patterns such as splitter, multicast, will create a new unit of work boundary
+     * for the messages in their sub-route (eg the splitted message); however these EIPs have an option named
+     * <tt>shareUnitOfWork</tt> which allows to combine with the parent unit of work in regard to error handling and
+     * therefore use the parent original message.
+     * <p/>
+     * By default this feature is off.
+     */
+    public void setUseOriginalBody(String useOriginalBody) {
+        this.useOriginalBody = useOriginalBody;
+    }
+
+    public String getOnRedeliveryRef() {
+        return onRedeliveryRef;
+    }
+
+    /**
+     * Sets a reference to a processor that should be processed <b>before</b> a redelivery attempt.
+     * <p/>
+     * Can be used to change the {@link org.apache.camel.Exchange} <b>before</b> its being redelivered.
+     */
+    public void setOnRedeliveryRef(String onRedeliveryRef) {
+        this.onRedeliveryRef = onRedeliveryRef;
+    }
+
+    public Processor getOnRedeliveryProcessor() {
+        return onRedeliveryProcessor;
+    }
+
+    /**
+     * Sets a processor that should be processed <b>before</b> a redelivery attempt.
+     * <p/>
+     * Can be used to change the {@link org.apache.camel.Exchange} <b>before</b> its being redelivered.
+     */
+    public void setOnRedeliveryProcessor(Processor onRedeliveryProcessor) {
+        this.onRedeliveryProcessor = onRedeliveryProcessor;
+    }
+
+    public String getOnExceptionOccurredRef() {
+        return onExceptionOccurredRef;
+    }
+
+    /**
+     * Sets a reference to a processor that should be processed <b>just after</b> an exception occurred. Can be used to
+     * perform custom logging about the occurred exception at the exact time it happened.
+     * <p/>
+     * Important: Any exception thrown from this processor will be ignored.
+     */
+    public void setOnExceptionOccurredRef(String onExceptionOccurredRef) {
+        this.onExceptionOccurredRef = onExceptionOccurredRef;
+    }
+
+    public Processor getOnExceptionOccurredProcessor() {
+        return onExceptionOccurredProcessor;
+    }
+
+    /**
+     * Sets a processor that should be processed <b>just after</b> an exception occurred. Can be used to perform custom
+     * logging about the occurred exception at the exact time it happened.
+     * <p/>
+     * Important: Any exception thrown from this processor will be ignored.
+     */
+    public void setOnExceptionOccurredProcessor(Processor onExceptionOccurredProcessor) {
+        this.onExceptionOccurredProcessor = onExceptionOccurredProcessor;
+    }
+
+    public String getOnPrepareFailureRef() {
+        return onPrepareFailureRef;
+    }
+
+    /**
+     * Sets a reference to a processor to prepare the {@link org.apache.camel.Exchange} before handled by the failure
+     * processor / dead letter channel. This allows for example to enrich the message before sending to a dead letter
+     * queue.
+     */
+    public void setOnPrepareFailureRef(String onPrepareFailureRef) {
+        this.onPrepareFailureRef = onPrepareFailureRef;
+    }
+
+    public Processor getOnPrepareFailureProcessor() {
+        return onPrepareFailureProcessor;
+    }
+
+    /**
+     * Sets a processor to prepare the {@link org.apache.camel.Exchange} before handled by the failure processor / dead
+     * letter channel. This allows for example to enrich the message before sending to a dead letter queue.
+     */
+    public void setOnPrepareFailureProcessor(Processor onPrepareFailureProcessor) {
+        this.onPrepareFailureProcessor = onPrepareFailureProcessor;
+    }
+
+    public String getRetryWhileRef() {
+        return retryWhileRef;
+    }
+
+    /**
+     * Sets a retry while predicate.
+     *
+     * Will continue retrying until the predicate evaluates to false.
+     */
+    public void setRetryWhileRef(String retryWhileRef) {
+        this.retryWhileRef = retryWhileRef;
+    }
+
+    public String getRedeliveryPolicyRef() {
+        return redeliveryPolicyRef;
+    }
+
+    /**
+     * Sets a reference to a {@link RedeliveryPolicy} to be used for redelivery settings.
+     */
+    public void setRedeliveryPolicyRef(String redeliveryPolicyRef) {
+        this.redeliveryPolicyRef = redeliveryPolicyRef;
+    }
+
+    public String getExecutorServiceRef() {
+        return executorServiceRef;
+    }
+
+    /**
+     * Sets a reference to a thread pool to be used by the error handler
+     */
+    public void setExecutorServiceRef(String executorServiceRef) {
+        this.executorServiceRef = executorServiceRef;
+    }
+
+    public ScheduledExecutorService getExecutorServiceBean() {
+        return executorServiceBean;
+    }
+
+    /**
+     * Sets a thread pool to be used by the error handler
+     */
+    public void setExecutorServiceBean(ScheduledExecutorService executorServiceBean) {
+        this.executorServiceBean = executorServiceBean;
+    }
+
+    public Predicate getRetryWhilePredicate() {
+        return retryWhilePredicate;
+    }
+
+    /**
+     * Sets a retry while predicate.
+     *
+     * Will continue retrying until the predicate evaluates to false.
+     */
+    public void setRetryWhilePredicate(Predicate retryWhilePredicate) {
+        this.retryWhilePredicate = retryWhilePredicate;
+    }
+
+    public RedeliveryPolicyDefinition getRedeliveryPolicy() {
+        if (redeliveryPolicy == null) {
+            redeliveryPolicy = createRedeliveryPolicy();
+        }
+        return redeliveryPolicy;
+    }
+
+    /**
+     * Sets the redelivery settings
+     */
+    public void setRedeliveryPolicy(RedeliveryPolicyDefinition redeliveryPolicy) {
+        this.redeliveryPolicy = redeliveryPolicy;
+    }
+
+    // Builder methods
+    // -------------------------------------------------------------------------
+    public DefaultErrorHandlerDefinition backOffMultiplier(double backOffMultiplier) {
+        getRedeliveryPolicy().backOffMultiplier(backOffMultiplier);
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition collisionAvoidancePercent(double collisionAvoidancePercent) {
+        getRedeliveryPolicy().collisionAvoidancePercent(collisionAvoidancePercent);
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition redeliveryDelay(long delay) {
+        getRedeliveryPolicy().redeliveryDelay(delay);
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition delayPattern(String delayPattern) {
+        getRedeliveryPolicy().delayPattern(delayPattern);
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition maximumRedeliveries(int maximumRedeliveries) {
+        getRedeliveryPolicy().maximumRedeliveries(maximumRedeliveries);
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition disableRedelivery() {
+        getRedeliveryPolicy().maximumRedeliveries(0);
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition maximumRedeliveryDelay(long maximumRedeliveryDelay) {
+        getRedeliveryPolicy().maximumRedeliveryDelay(maximumRedeliveryDelay);
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition useCollisionAvoidance() {
+        getRedeliveryPolicy().useCollisionAvoidance();
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition useExponentialBackOff() {
+        getRedeliveryPolicy().useExponentialBackOff();
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition retriesExhaustedLogLevel(LoggingLevel retriesExhaustedLogLevel) {
+        getRedeliveryPolicy().setRetriesExhaustedLogLevel(retriesExhaustedLogLevel.name());
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition retryAttemptedLogLevel(LoggingLevel retryAttemptedLogLevel) {
+        getRedeliveryPolicy().setRetryAttemptedLogLevel(retryAttemptedLogLevel.name());
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition retryAttemptedLogInterval(int retryAttemptedLogInterval) {
+        getRedeliveryPolicy().setRetryAttemptedLogInterval(String.valueOf(retryAttemptedLogInterval));
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logStackTrace(boolean logStackTrace) {
+        getRedeliveryPolicy().setLogStackTrace(logStackTrace ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logRetryStackTrace(boolean logRetryStackTrace) {
+        getRedeliveryPolicy().setLogRetryStackTrace(logRetryStackTrace ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logHandled(boolean logHandled) {
+        getRedeliveryPolicy().setLogHandled(logHandled ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logNewException(boolean logNewException) {
+        getRedeliveryPolicy().setLogNewException(logNewException ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logExhausted(boolean logExhausted) {
+        getRedeliveryPolicy().setLogExhausted(logExhausted ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logRetryAttempted(boolean logRetryAttempted) {
+        getRedeliveryPolicy().setLogRetryAttempted(logRetryAttempted ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logExhaustedMessageHistory(boolean logExhaustedMessageHistory) {
+        getRedeliveryPolicy().setLogExhaustedMessageHistory(logExhaustedMessageHistory ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logExhaustedMessageBody(boolean logExhaustedMessageBody) {
+        getRedeliveryPolicy().setLogExhaustedMessageBody(logExhaustedMessageBody ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition exchangeFormatterRef(String exchangeFormatterRef) {
+        getRedeliveryPolicy().setExchangeFormatterRef(exchangeFormatterRef);
+        return this;
+    }
+
+    /**
+     * Will allow asynchronous delayed redeliveries. The route, in particular the consumer's component, must support the
+     * Asynchronous Routing Engine (e.g. seda)
+     *
+     * @see    RedeliveryPolicy#setAsyncDelayedRedelivery(boolean)
+     * @return the builder
+     */
+    public DefaultErrorHandlerDefinition asyncDelayedRedelivery() {
+        getRedeliveryPolicy().setAsyncDelayedRedelivery("true");
+        return this;
+    }
+
+    /**
+     * Controls whether to allow redelivery while stopping/shutting down a route that uses error handling.
+     *
+     * @param  allowRedeliveryWhileStopping <tt>true</tt> to allow redelivery, <tt>false</tt> to reject redeliveries
+     * @return                              the builder
+     */
+    public DefaultErrorHandlerDefinition allowRedeliveryWhileStopping(boolean allowRedeliveryWhileStopping) {
+        getRedeliveryPolicy().setAllowRedeliveryWhileStopping(allowRedeliveryWhileStopping ? "true" : "false");
+        return this;
+    }
+
+    /**
+     * Sets the thread pool to be used for redelivery.
+     *
+     * @param  executorService the scheduled thread pool to use
+     * @return                 the builder.
+     */
+    public DefaultErrorHandlerDefinition executorService(ScheduledExecutorService executorService) {
+        setExecutorServiceBean(executorService);
+        return this;
+    }
+
+    /**
+     * Sets a reference to a thread pool to be used for redelivery.
+     *
+     * @param  ref reference to a scheduled thread pool
+     * @return     the builder.
+     */
+    public DefaultErrorHandlerDefinition executorServiceRef(String ref) {
+        setExecutorServiceRef(ref);
+        return this;
+    }
+
+    /**
+     * Sets the logger used for caught exceptions
+     *
+     * @param  logger the logger
+     * @return        the builder
+     */
+    public DefaultErrorHandlerDefinition logger(CamelLogger logger) {
+        setLoggerBean(logger);
+        return this;
+    }
+
+    /**
+     * Sets the logging level of exceptions caught
+     *
+     * @param  level the logging level
+     * @return       the builder
+     */
+    public DefaultErrorHandlerDefinition loggingLevel(LoggingLevel level) {
+        setLevel(level);
+        return this;
+    }
+
+    /**
+     * Sets the log used for caught exceptions
+     *
+     * @param  log the logger
+     * @return     the builder
+     */
+    public DefaultErrorHandlerDefinition log(org.slf4j.Logger log) {
+        if (loggerBean == null) {
+            loggerBean = new CamelLogger(LoggerFactory.getLogger(DefaultErrorHandler.class), LoggingLevel.ERROR);
+        }
+        loggerBean.setLog(log);
+        return this;
+    }
+
+    /**
+     * Sets the log used for caught exceptions
+     *
+     * @param  log the log name
+     * @return     the builder
+     */
+    public DefaultErrorHandlerDefinition log(String log) {
+        return log(LoggerFactory.getLogger(log));
+    }
+
+    /**
+     * Sets the log used for caught exceptions
+     *
+     * @param  log the log class
+     * @return     the builder
+     */
+    public DefaultErrorHandlerDefinition log(Class<?> log) {
+        return log(LoggerFactory.getLogger(log));
+    }
+
+    /**
+     * Sets a processor that should be processed <b>before</b> a redelivery attempt.
+     * <p/>
+     * Can be used to change the {@link org.apache.camel.Exchange} <b>before</b> its being redelivered.
+     *
+     * @param  processor the processor
+     * @return           the builder
+     */
+    public DefaultErrorHandlerDefinition onRedelivery(Processor processor) {
+        setOnRedeliveryProcessor(processor);
+        return this;
+    }
+
+    /**
+     * Sets a reference for the processor to use <b>before</b> a redelivery attempt.
+     *
+     * @param  onRedeliveryRef the processor's reference
+     * @return                 the builder
+     * @see                    #onRedelivery(Processor)
+     */
+    public DefaultErrorHandlerDefinition onRedeliveryRef(String onRedeliveryRef) {
+        setOnRedeliveryRef(onRedeliveryRef);
+        return this;
+    }
+
+    /**
+     * Sets the retry while expression.
+     * <p/>
+     * Will continue retrying until expression evaluates to <tt>false</tt>.
+     *
+     * @param  retryWhile expression that determines when to stop retrying
+     * @return            the builder
+     */
+    public DefaultErrorHandlerDefinition retryWhile(Expression retryWhile) {
+        setRetryWhilePredicate(ExpressionToPredicateAdapter.toPredicate(retryWhile));
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition retryWhileRef(String retryWhileRef) {
+        setRetryWhileRef(retryWhileRef);
+        return this;
+    }
+
+    /**
+     * Will use the original input {@link org.apache.camel.Message} (original body and headers) when an
+     * {@link org.apache.camel.Exchange} is moved to the dead letter queue.
+     * <p/>
+     * <b>Notice:</b> this only applies when all redeliveries attempt have failed and the
+     * {@link org.apache.camel.Exchange} is doomed for failure. <br/>
+     * Instead of using the current inprogress {@link org.apache.camel.Exchange} IN message we use the original IN
+     * message instead. This allows you to store the original input in the dead letter queue instead of the inprogress
+     * snapshot of the IN message. For instance if you route transform the IN body during routing and then failed. With
+     * the original exchange store in the dead letter queue it might be easier to manually re submit the
+     * {@link org.apache.camel.Exchange} again as the IN message is the same as when Camel received it. So you should be
+     * able to send the {@link org.apache.camel.Exchange} to the same input.
+     * <p/>
+     * The difference between useOriginalMessage and useOriginalBody is that the former includes both the original body
+     * and headers, where as the latter only includes the original body. You can use the latter to enrich the message
+     * with custom headers and include the original message body. The former wont let you do this, as its using the
+     * original message body and headers as they are. You cannot enable both useOriginalMessage and useOriginalBody.
+     * <p/>
+     * <b>Important:</b> The original input means the input message that are bounded by the current
+     * {@link org.apache.camel.spi.UnitOfWork}. An unit of work typically spans one route, or multiple routes if they
+     * are connected using internal endpoints such as direct or seda. When messages is passed via external endpoints
+     * such as JMS or HTTP then the consumer will create a new unit of work, with the message it received as input as
+     * the original input. Also some EIP patterns such as splitter, multicast, will create a new unit of work boundary
+     * for the messages in their sub-route (eg the split message); however these EIPs have an option named
+     * <tt>shareUnitOfWork</tt> which allows to combine with the parent unit of work in regard to error handling and
+     * therefore use the parent original message.
+     * <p/>
+     * By default this feature is off.
+     *
+     * @return the builder
+     * @see    #useOriginalBody()
+     */
+    public DefaultErrorHandlerDefinition useOriginalMessage() {
+        setUseOriginalMessage("true");
+        return this;
+    }
+
+    /**
+     * Will use the original input {@link org.apache.camel.Message} body (original body only) when an
+     * {@link org.apache.camel.Exchange} is moved to the dead letter queue.
+     * <p/>
+     * <b>Notice:</b> this only applies when all redeliveries attempt have failed and the
+     * {@link org.apache.camel.Exchange} is doomed for failure. <br/>
+     * Instead of using the current inprogress {@link org.apache.camel.Exchange} IN message we use the original IN
+     * message instead. This allows you to store the original input in the dead letter queue instead of the inprogress
+     * snapshot of the IN message. For instance if you route transform the IN body during routing and then failed. With
+     * the original exchange store in the dead letter queue it might be easier to manually re submit the
+     * {@link org.apache.camel.Exchange} again as the IN message is the same as when Camel received it. So you should be
+     * able to send the {@link org.apache.camel.Exchange} to the same input.
+     * <p/>
+     * The difference between useOriginalMessage and useOriginalBody is that the former includes both the original body
+     * and headers, where as the latter only includes the original body. You can use the latter to enrich the message
+     * with custom headers and include the original message body. The former wont let you do this, as its using the
+     * original message body and headers as they are. You cannot enable both useOriginalMessage and useOriginalBody.
+     * <p/>
+     * <b>Important:</b> The original input means the input message that are bounded by the current
+     * {@link org.apache.camel.spi.UnitOfWork}. An unit of work typically spans one route, or multiple routes if they
+     * are connected using internal endpoints such as direct or seda. When messages is passed via external endpoints
+     * such as JMS or HTTP then the consumer will create a new unit of work, with the message it received as input as
+     * the original input. Also some EIP patterns such as splitter, multicast, will create a new unit of work boundary
+     * for the messages in their sub-route (eg the split message); however these EIPs have an option named
+     * <tt>shareUnitOfWork</tt> which allows to combine with the parent unit of work in regard to error handling and
+     * therefore use the parent original message.
+     * <p/>
+     * By default this feature is off.
+     *
+     * @return the builder
+     * @see    #useOriginalMessage()
+     */
+    public DefaultErrorHandlerDefinition useOriginalBody() {
+        setUseOriginalBody("true");
+        return this;
+    }
+
+    /**
+     * Sets a custom {@link org.apache.camel.Processor} to prepare the {@link org.apache.camel.Exchange} before handled
+     * by the failure processor / dead letter channel. This allows for example to enrich the message before sending to a
+     * dead letter queue.
+     *
+     * @param  processor the processor
+     * @return           the builder
+     */
+    public DefaultErrorHandlerDefinition onPrepareFailure(Processor processor) {
+        setOnPrepareFailureProcessor(processor);
+        return this;
+    }
+
+    /**
+     * Sets a reference for the processor to use before handled by the failure processor.
+     *
+     * @param  onPrepareFailureRef the processor's reference
+     * @return                     the builder
+     * @see                        #onPrepareFailure(Processor)
+     */
+    public DefaultErrorHandlerDefinition onPrepareFailureRef(String onPrepareFailureRef) {
+        setOnPrepareFailureRef(onPrepareFailureRef);
+        return this;
+    }
+
+    /**
+     * Sets a custom {@link org.apache.camel.Processor} to process the {@link org.apache.camel.Exchange} just after an
+     * exception was thrown. This allows to execute the processor at the same time the exception was thrown.
+     * <p/>
+     * Important: Any exception thrown from this processor will be ignored.
+     *
+     * @param  processor the processor
+     * @return           the builder
+     */
+    public DefaultErrorHandlerDefinition onExceptionOccurred(Processor processor) {
+        setOnExceptionOccurredProcessor(processor);
+        return this;
+    }
+
+    /**
+     * Sets a reference for the processor to use just after an exception was thrown.
+     *
+     * @param  onExceptionOccurredRef the processor's reference
+     * @return                        the builder
+     * @see                           #onExceptionOccurred(Processor)
+     */
+    public DefaultErrorHandlerDefinition onExceptionOccurredRef(String onExceptionOccurredRef) {
+        setOnExceptionOccurredRef(onExceptionOccurredRef);
+        return this;
+    }
+
+}
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerProperties.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerProperties.java
index 4688c8c1f1c..853d288bc81 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerProperties.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerProperties.java
@@ -24,6 +24,10 @@ import org.apache.camel.Processor;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.spi.CamelLogger;
 
+/**
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
+ */
+@Deprecated
 public interface DefaultErrorHandlerProperties extends ErrorHandlerFactory {
 
     boolean hasLogger();
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerHelper.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerHelper.java
index 1642ff4eb19..7a50e52f45c 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerHelper.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerHelper.java
@@ -54,8 +54,8 @@ public final class ErrorHandlerHelper {
             // see if there has been configured a error handler builder on the route
             source = route.getErrorHandlerFactory();
             // check if its also a ref with no error handler configuration like me
-            if (source instanceof ErrorHandlerRefProperties) {
-                ErrorHandlerRefProperties other = (ErrorHandlerRefProperties) source;
+            if (source instanceof ErrorHandlerRefDefinition) {
+                ErrorHandlerRefDefinition other = (ErrorHandlerRefDefinition) source;
                 String otherRef = other.getRef();
                 if (!isErrorHandlerFactoryConfigured(otherRef)) {
                     // the other has also no explicit error handler configured
@@ -90,8 +90,8 @@ public final class ErrorHandlerHelper {
 
     protected static ErrorHandlerFactory lookupErrorHandlerFactory(CamelContext camelContext) {
         ErrorHandlerFactory answer = camelContext.adapt(ExtendedCamelContext.class).getErrorHandlerFactory();
-        if (answer instanceof ErrorHandlerRefProperties) {
-            ErrorHandlerRefProperties other = (ErrorHandlerRefProperties) answer;
+        if (answer instanceof ErrorHandlerRefDefinition) {
+            ErrorHandlerRefDefinition other = (ErrorHandlerRefDefinition) answer;
             String otherRef = other.getRef();
             if (isErrorHandlerFactoryConfigured(otherRef)) {
                 answer = CamelContextHelper.lookup(camelContext, otherRef, ErrorHandlerFactory.class);
@@ -112,7 +112,7 @@ public final class ErrorHandlerHelper {
      * This is for instance used by the transacted policy to setup a TransactedErrorHandlerBuilder in camel-spring.
      */
     public static boolean isErrorHandlerFactoryConfigured(String ref) {
-        return !ErrorHandlerRefProperties.DEFAULT_ERROR_HANDLER_BUILDER.equals(ref);
+        return !ErrorHandlerRefDefinition.DEFAULT_ERROR_HANDLER_BUILDER.equals(ref);
     }
 
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefConfiguration.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefConfiguration.java
index c1abd2c0197..850981bd774 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefConfiguration.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefConfiguration.java
@@ -18,6 +18,12 @@ package org.apache.camel.model.errorhandler;
 
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.ErrorHandlerFactory;
+
+/**
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
+ */
+@Deprecated
 @XmlTransient
 public class ErrorHandlerRefConfiguration implements ErrorHandlerRefProperties {
 
@@ -43,4 +49,17 @@ public class ErrorHandlerRefConfiguration implements ErrorHandlerRefProperties {
     public void setSupportTransacted(boolean supportTransacted) {
         this.supportTransacted = supportTransacted;
     }
+
+    @Override
+    public boolean supportTransacted() {
+        return isSupportTransacted();
+    }
+
+    @Override
+    public ErrorHandlerFactory cloneBuilder() {
+        ErrorHandlerRefConfiguration answer = new ErrorHandlerRefConfiguration();
+        answer.setRef(ref);
+        answer.setSupportTransacted(supportTransacted);
+        return answer;
+    }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefDefinition.java
new file mode 100644
index 00000000000..d4842f98095
--- /dev/null
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefDefinition.java
@@ -0,0 +1,78 @@
+/*
+ * 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.model.errorhandler;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.spi.Metadata;
+
+/**
+ * Dead letter channel error handler.
+ */
+@Metadata(label = "configuration,error")
+@XmlRootElement(name = "errorHandlerRef")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ErrorHandlerRefDefinition extends BaseErrorHandlerDefinition {
+
+    public static final String DEFAULT_ERROR_HANDLER_BUILDER = "CamelDefaultErrorHandlerBuilder";
+
+    @XmlAttribute(required = true)
+    @Metadata(javaType = "org.apache.camel.ErrorHandlerFactory")
+    private String ref;
+
+    public ErrorHandlerRefDefinition() {
+    }
+
+    public ErrorHandlerRefDefinition(String ref) {
+        this.ref = ref;
+    }
+
+    @Override
+    public boolean supportTransacted() {
+        return false;
+    }
+
+    @Override
+    public ErrorHandlerFactory cloneBuilder() {
+        // clone not needed
+        return this;
+    }
+
+    public String getRef() {
+        return ref;
+    }
+
+    /**
+     * References to an existing or custom error handler.
+     */
+    public void setRef(String ref) {
+        this.ref = ref;
+    }
+
+    /**
+     * References to an existing or custom error handler.
+     */
+    public ErrorHandlerRefDefinition ref(String ref) {
+        setRef(ref);
+        return this;
+    }
+
+}
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java
index d9ce7801c96..4e9431ca4e2 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java
@@ -18,6 +18,10 @@ package org.apache.camel.model.errorhandler;
 
 import org.apache.camel.ErrorHandlerFactory;
 
+/**
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
+ */
+@Deprecated
 public interface ErrorHandlerRefProperties extends ErrorHandlerFactory {
 
     String DEFAULT_ERROR_HANDLER_BUILDER = "CamelDefaultErrorHandlerBuilder";
@@ -29,4 +33,5 @@ public interface ErrorHandlerRefProperties extends ErrorHandlerFactory {
     boolean isSupportTransacted();
 
     void setSupportTransacted(boolean supportTransacted);
+
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/JtaTransactionErrorHandlerDefinition.java
similarity index 56%
copy from core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java
copy to core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/JtaTransactionErrorHandlerDefinition.java
index d9ce7801c96..3fe3fe2c4fd 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/JtaTransactionErrorHandlerDefinition.java
@@ -16,17 +16,26 @@
  */
 package org.apache.camel.model.errorhandler;
 
-import org.apache.camel.ErrorHandlerFactory;
-
-public interface ErrorHandlerRefProperties extends ErrorHandlerFactory {
-
-    String DEFAULT_ERROR_HANDLER_BUILDER = "CamelDefaultErrorHandlerBuilder";
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
 
-    String getRef();
+import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.spi.Metadata;
 
-    void setRef(String ref);
+/**
+ * JTA based transactional error handler (requires camel-jta).
+ */
+@Metadata(label = "configuration,error")
+@XmlRootElement(name = "jtaTransactionErrorHandler")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class JtaTransactionErrorHandlerDefinition extends TransactionErrorHandlerDefinition {
 
-    boolean isSupportTransacted();
+    @Override
+    public ErrorHandlerFactory cloneBuilder() {
+        TransactionErrorHandlerDefinition answer = new JtaTransactionErrorHandlerDefinition();
+        cloneBuilder(answer);
+        return answer;
+    }
 
-    void setSupportTransacted(boolean supportTransacted);
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerConfiguration.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerConfiguration.java
index 89b43c12fb4..fc23a13e822 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerConfiguration.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerConfiguration.java
@@ -16,12 +16,27 @@
  */
 package org.apache.camel.model.errorhandler;
 
-// TODO: Maybe not needed
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.ErrorHandlerFactory;
+
+/**
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
+ */
 @XmlTransient
+@Deprecated
 public class NoErrorHandlerConfiguration implements NoErrorHandlerProperties {
 
     // no configuration
 
+    @Override
+    public boolean supportTransacted() {
+        return false;
+    }
+
+    @Override
+    public ErrorHandlerFactory cloneBuilder() {
+        // clone not needed
+        return this;
+    }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerDefinition.java
similarity index 59%
copy from core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java
copy to core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerDefinition.java
index d9ce7801c96..849acce7b32 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerDefinition.java
@@ -16,17 +16,29 @@
  */
 package org.apache.camel.model.errorhandler;
 
-import org.apache.camel.ErrorHandlerFactory;
-
-public interface ErrorHandlerRefProperties extends ErrorHandlerFactory {
-
-    String DEFAULT_ERROR_HANDLER_BUILDER = "CamelDefaultErrorHandlerBuilder";
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
 
-    String getRef();
+import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.spi.Metadata;
 
-    void setRef(String ref);
+/**
+ * No error handler.
+ */
+@Metadata(label = "configuration,error")
+@XmlRootElement(name = "noErrorHandler")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class NoErrorHandlerDefinition extends BaseErrorHandlerDefinition {
 
-    boolean isSupportTransacted();
+    @Override
+    public boolean supportTransacted() {
+        return false;
+    }
 
-    void setSupportTransacted(boolean supportTransacted);
+    @Override
+    public ErrorHandlerFactory cloneBuilder() {
+        // clone is not needed
+        return this;
+    }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerProperties.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerProperties.java
index babb993df96..ac3e2ab95bf 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerProperties.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerProperties.java
@@ -18,6 +18,10 @@ package org.apache.camel.model.errorhandler;
 
 import org.apache.camel.ErrorHandlerFactory;
 
+/**
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
+ */
+@Deprecated
 public interface NoErrorHandlerProperties extends ErrorHandlerFactory {
 
     // no configuration
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/SpringTransactionErrorHandlerDefinition.java
similarity index 55%
copy from core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java
copy to core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/SpringTransactionErrorHandlerDefinition.java
index d9ce7801c96..c1531542881 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/SpringTransactionErrorHandlerDefinition.java
@@ -16,17 +16,26 @@
  */
 package org.apache.camel.model.errorhandler;
 
-import org.apache.camel.ErrorHandlerFactory;
-
-public interface ErrorHandlerRefProperties extends ErrorHandlerFactory {
-
-    String DEFAULT_ERROR_HANDLER_BUILDER = "CamelDefaultErrorHandlerBuilder";
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
 
-    String getRef();
+import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.spi.Metadata;
 
-    void setRef(String ref);
+/**
+ * Spring based transactional error handler (requires camel-spring).
+ */
+@Metadata(label = "configuration,error")
+@XmlRootElement(name = "springTransactionErrorHandler")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class SpringTransactionErrorHandlerDefinition extends TransactionErrorHandlerDefinition {
 
-    boolean isSupportTransacted();
+    @Override
+    public ErrorHandlerFactory cloneBuilder() {
+        TransactionErrorHandlerDefinition answer = new SpringTransactionErrorHandlerDefinition();
+        cloneBuilder(answer);
+        return answer;
+    }
 
-    void setSupportTransacted(boolean supportTransacted);
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/TransactionErrorHandlerDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/TransactionErrorHandlerDefinition.java
new file mode 100644
index 00000000000..d3d59e111b5
--- /dev/null
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/TransactionErrorHandlerDefinition.java
@@ -0,0 +1,123 @@
+/*
+ * 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.model.errorhandler;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.spi.Metadata;
+
+/**
+ * Transactional error handler (requires either camel-spring or camel-jta using traditional JTA transactions).
+ */
+public abstract class TransactionErrorHandlerDefinition extends DefaultErrorHandlerDefinition {
+
+    @XmlTransient
+    private Object transactedPolicy;
+
+    @XmlAttribute
+    @Metadata(javaType = "org.apache.camel.spi.TransactedPolicy")
+    private String transactedPolicyRef;
+    @XmlAttribute
+    @Metadata(javaType = "org.apache.camel.LoggingLevel", defaultValue = "WARN", enums = "TRACE,DEBUG,INFO,WARN,ERROR,OFF")
+    private String rollbackLoggingLevel;
+
+    @Override
+    public boolean supportTransacted() {
+        return true;
+    }
+
+    protected void cloneBuilder(TransactionErrorHandlerDefinition other) {
+        other.setTransactedPolicyRef(getTransactedPolicyRef());
+        other.setRollbackLoggingLevel(getRollbackLoggingLevel());
+        super.cloneBuilder(other);
+    }
+
+    public Object getTransactedPolicy() {
+        return transactedPolicy;
+    }
+
+    /**
+     * The transacted policy to use that is configured for either Spring or JTA based transactions.
+     */
+    public void setTransactedPolicy(Object transactedPolicy) {
+        this.transactedPolicy = transactedPolicy;
+    }
+
+    public String getTransactedPolicyRef() {
+        return transactedPolicyRef;
+    }
+
+    /**
+     * The transacted policy to use that is configured for either Spring or JTA based transactions. If no policy has
+     * been configured then Camel will attempt to auto-discover.
+     */
+    public void setTransactedPolicyRef(String transactedPolicyRef) {
+        this.transactedPolicyRef = transactedPolicyRef;
+    }
+
+    public String getRollbackLoggingLevel() {
+        return rollbackLoggingLevel;
+    }
+
+    /**
+     * Sets the logging level to use for logging transactional rollback.
+     * <p/>
+     * This option is default WARN.
+     */
+    public void setRollbackLoggingLevel(String rollbackLoggingLevel) {
+        this.rollbackLoggingLevel = rollbackLoggingLevel;
+    }
+
+    /**
+     * The transacted policy to use that is configured for either Spring or JTA based transactions.
+     */
+    public TransactionErrorHandlerDefinition transactedPolicy(Object transactedPolicy) {
+        setTransactedPolicy(transactedPolicy);
+        return this;
+    }
+
+    /**
+     * References to the transacted policy to use that is configured for either Spring or JTA based transactions.
+     */
+    public TransactionErrorHandlerDefinition transactedPolicyRef(String transactedPolicyRef) {
+        setTransactedPolicyRef(transactedPolicyRef);
+        return this;
+    }
+
+    /**
+     * Sets the logging level to use for logging transactional rollback.
+     * <p/>
+     * This option is default WARN.
+     */
+    public TransactionErrorHandlerDefinition rollbackLoggingLevel(String rollbackLoggingLevel) {
+        setRollbackLoggingLevel(rollbackLoggingLevel);
+        return this;
+    }
+
+    /**
+     * Sets the logging level to use for logging transactional rollback.
+     * <p/>
+     * This option is default WARN.
+     */
+    public TransactionErrorHandlerDefinition rollbackLoggingLevel(LoggingLevel rollbackLoggingLevel) {
+        setRollbackLoggingLevel(rollbackLoggingLevel.name());
+        return this;
+    }
+
+}
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerConfiguration.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/package-info.java
similarity index 73%
copy from core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerConfiguration.java
copy to core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/package-info.java
index 89b43c12fb4..024a75fbc1c 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerConfiguration.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/package-info.java
@@ -14,14 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+/**
+ * The JAXB POJOs for the <a href="https://camel.apache.org/manual/error-handler.html">Error Handler</a>.
+ */
+@javax.xml.bind.annotation.XmlSchema(namespace = "http://camel.apache.org/schema/spring",
+                                     elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
 package org.apache.camel.model.errorhandler;
-
-// TODO: Maybe not needed
-import javax.xml.bind.annotation.XmlTransient;
-
-@XmlTransient
-public class NoErrorHandlerConfiguration implements NoErrorHandlerProperties {
-
-    // no configuration
-
-}
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java
index b13b98b2c5a..9ddaeea14bf 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java
@@ -225,7 +225,7 @@ public class RouteReifier extends ProcessorReifier<RouteDefinition> {
         List<ProcessorDefinition<?>> list = new ArrayList<>(definition.getOutputs());
         for (ProcessorDefinition<?> output : list) {
             try {
-                ProcessorReifier reifier = ProcessorReifier.reifier(route, output);
+                ProcessorReifier<?> reifier = ProcessorReifier.reifier(route, output);
 
                 // ensure node has id assigned
                 String outputId = output.idOrCreate(camelContext.adapt(ExtendedCamelContext.class).getNodeIdFactory());
@@ -241,7 +241,7 @@ public class RouteReifier extends ProcessorReifier<RouteDefinition> {
             }
         }
 
-        // now lets turn all of the event driven consumer processors into a single route
+        // now lets turn all the event driven consumer processors into a single route
         List<Processor> eventDrivenProcessors = route.getEventDrivenProcessors();
         if (eventDrivenProcessors.isEmpty()) {
             return null;
@@ -250,7 +250,7 @@ public class RouteReifier extends ProcessorReifier<RouteDefinition> {
         // Set route properties
         Map<String, Object> routeProperties = computeRouteProperties();
 
-        // always use an pipeline even if there are only 1 processor as the pipeline
+        // always use a pipeline even if there are only 1 processor as the pipeline
         // handles preparing the response from the exchange in regard to IN vs OUT messages etc
         RoutePipeline target = new RoutePipeline(camelContext, eventDrivenProcessors);
         target.setRouteId(id);
@@ -337,16 +337,14 @@ public class RouteReifier extends ProcessorReifier<RouteDefinition> {
 
         // inject the route error handler for processors that are error handler aware
         // this needs to be done here at the end because the route may be transactional and have a transaction error handler
-        // automatic be configured which some EIPs like Multicast/RecipientList needs to be using for special fine grained error handling
+        // automatic be configured which some EIPs like Multicast/RecipientList needs to be using for special fine-grained error handling
         ErrorHandlerFactory builder = route.getErrorHandlerFactory();
         Processor errorHandler = camelContext.adapt(ModelCamelContext.class).getModelReifierFactory().createErrorHandler(route,
                 builder, null);
         prepareErrorHandlerAware(route, errorHandler);
 
-        camelContext.adapt(ExtendedCamelContext.class).addBootstrap(() -> {
-            // okay route has been created from the model, then the model is no longer needed and we can de-reference
-            route.clearRouteModel();
-        });
+        // okay route has been created from the model, then the model is no longer needed, and we can de-reference
+        camelContext.adapt(ExtendedCamelContext.class).addBootstrap(route::clearRouteModel);
 
         return route;
     }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DeadLetterChannelReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DeadLetterChannelReifier.java
index 7fb4f12bd2a..0ff6709bd88 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DeadLetterChannelReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DeadLetterChannelReifier.java
@@ -16,21 +16,30 @@
  */
 package org.apache.camel.reifier.errorhandler;
 
-import org.apache.camel.ErrorHandlerFactory;
+import java.util.concurrent.ScheduledExecutorService;
+
+import org.apache.camel.CamelContext;
 import org.apache.camel.ExchangePattern;
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
-import org.apache.camel.model.errorhandler.DeadLetterChannelProperties;
+import org.apache.camel.model.RedeliveryPolicyDefinition;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.processor.FatalFallbackErrorHandler;
 import org.apache.camel.processor.SendProcessor;
 import org.apache.camel.processor.errorhandler.DeadLetterChannel;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.spi.CamelLogger;
+import org.apache.camel.spi.ExecutorServiceManager;
+import org.apache.camel.spi.Language;
+import org.apache.camel.spi.ThreadPoolProfile;
 import org.apache.camel.util.ObjectHelper;
+import org.slf4j.LoggerFactory;
 
-public class DeadLetterChannelReifier extends DefaultErrorHandlerReifier<DeadLetterChannelProperties> {
+public class DeadLetterChannelReifier extends ErrorHandlerReifier<DeadLetterChannelDefinition> {
 
-    public DeadLetterChannelReifier(Route route, ErrorHandlerFactory definition) {
+    public DeadLetterChannelReifier(Route route, DeadLetterChannelDefinition definition) {
         super(route, definition);
     }
 
@@ -39,27 +48,55 @@ public class DeadLetterChannelReifier extends DefaultErrorHandlerReifier<DeadLet
         ObjectHelper.notNull(definition.getDeadLetterUri(), "deadLetterUri", this);
 
         // optimize to use shared default instance if using out of the box settings
-        RedeliveryPolicy redeliveryPolicy
-                = definition.hasRedeliveryPolicy() ? definition.getRedeliveryPolicy() : definition.getDefaultRedeliveryPolicy();
-        CamelLogger logger = definition.hasLogger() ? definition.getLogger() : null;
+        RedeliveryPolicy redeliveryPolicy = resolveRedeliveryPolicy(definition, camelContext);
+        CamelLogger logger = resolveLogger(definition, camelContext);
 
         Processor deadLetterProcessor = createDeadLetterChannelProcessor(definition.getDeadLetterUri());
 
         DeadLetterChannel answer = new DeadLetterChannel(
                 camelContext, processor, logger,
-                getProcessor(definition.getOnRedelivery(), definition.getOnRedeliveryRef()),
+                getProcessor(definition.getOnRedeliveryProcessor(), definition.getOnRedeliveryRef()),
                 redeliveryPolicy, deadLetterProcessor,
-                definition.getDeadLetterUri(), definition.isDeadLetterHandleNewException(), definition.isUseOriginalMessage(),
-                definition.isUseOriginalBody(),
-                definition.getRetryWhilePolicy(camelContext),
-                getExecutorService(definition.getExecutorService(), definition.getExecutorServiceRef()),
-                getProcessor(definition.getOnPrepareFailure(), definition.getOnPrepareFailureRef()),
-                getProcessor(definition.getOnExceptionOccurred(), definition.getOnExceptionOccurredRef()));
+                definition.getDeadLetterUri(),
+                parseBoolean(definition.getDeadLetterHandleNewException(), true),
+                parseBoolean(definition.getUseOriginalMessage(), false),
+                parseBoolean(definition.getUseOriginalBody(), false),
+                resolveRetryWhilePolicy(definition, camelContext),
+                getExecutorService(definition.getExecutorServiceBean(), definition.getExecutorServiceRef()),
+                getProcessor(definition.getOnPrepareFailureProcessor(), definition.getOnPrepareFailureRef()),
+                getProcessor(definition.getOnExceptionOccurredProcessor(), definition.getOnExceptionOccurredRef()));
         // configure error handler before we can use it
         configure(answer);
         return answer;
     }
 
+    private Predicate resolveRetryWhilePolicy(DeadLetterChannelDefinition definition, CamelContext camelContext) {
+        Predicate answer = definition.getRetryWhilePredicate();
+
+        if (answer == null && definition.getRetryWhileRef() != null) {
+            // it is a bean expression
+            Language bean = camelContext.resolveLanguage("bean");
+            answer = bean.createPredicate(definition.getRetryWhileRef());
+            answer.initPredicate(camelContext);
+        }
+
+        return answer;
+    }
+
+    private CamelLogger resolveLogger(DeadLetterChannelDefinition definition, CamelContext camelContext) {
+        CamelLogger answer = definition.getLoggerBean();
+        if (answer == null && definition.getLoggerRef() != null) {
+            answer = mandatoryLookup(definition.getLoggerRef(), CamelLogger.class);
+        }
+        if (answer == null) {
+            answer = new CamelLogger(LoggerFactory.getLogger(DeadLetterChannel.class), LoggingLevel.ERROR);
+        }
+        if (definition.getLevel() != null) {
+            answer.setLevel(definition.getLevel());
+        }
+        return answer;
+    }
+
     private Processor createDeadLetterChannelProcessor(String uri) {
         // wrap in our special safe fallback error handler if sending to
         // dead letter channel fails
@@ -69,4 +106,48 @@ public class DeadLetterChannelReifier extends DefaultErrorHandlerReifier<DeadLet
         return new FatalFallbackErrorHandler(child, true);
     }
 
+    private RedeliveryPolicy resolveRedeliveryPolicy(DeadLetterChannelDefinition definition, CamelContext camelContext) {
+        RedeliveryPolicy answer = null;
+        RedeliveryPolicyDefinition def = definition.getRedeliveryPolicy();
+        if (def == null && definition.getRedeliveryPolicyRef() != null) {
+            // ref may point to a definition
+            def = lookupByNameAndType(definition.getRedeliveryPolicyRef(), RedeliveryPolicyDefinition.class);
+        }
+        if (def != null) {
+            answer = ErrorHandlerReifier.createRedeliveryPolicy(def, camelContext, null);
+        }
+        if (def == null && definition.getRedeliveryPolicyRef() != null) {
+            answer = mandatoryLookup(definition.getRedeliveryPolicyRef(), RedeliveryPolicy.class);
+        }
+        if (answer == null) {
+            answer = RedeliveryPolicy.DEFAULT_POLICY;
+        }
+        return answer;
+    }
+
+    protected synchronized ScheduledExecutorService getExecutorService(
+            ScheduledExecutorService executorService, String executorServiceRef) {
+        if (executorService == null || executorService.isShutdown()) {
+            // camel context will shutdown the executor when it shutdown so no
+            // need to shut it down when stopping
+            if (executorServiceRef != null) {
+                executorService = lookupByNameAndType(executorServiceRef, ScheduledExecutorService.class);
+                if (executorService == null) {
+                    ExecutorServiceManager manager = camelContext.getExecutorServiceManager();
+                    ThreadPoolProfile profile = manager.getThreadPoolProfile(executorServiceRef);
+                    executorService = manager.newScheduledThreadPool(this, executorServiceRef, profile);
+                }
+                if (executorService == null) {
+                    throw new IllegalArgumentException("ExecutorService " + executorServiceRef + " not found in registry.");
+                }
+            } else {
+                // no explicit configured thread pool, so leave it up to the
+                // error handler to decide if it need a default thread pool from
+                // CamelContext#getErrorHandlerExecutorService
+                executorService = null;
+            }
+        }
+        return executorService;
+    }
+
 }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java
index 445b69ab887..b0b53f7bca0 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java
@@ -18,42 +18,102 @@ package org.apache.camel.reifier.errorhandler;
 
 import java.util.concurrent.ScheduledExecutorService;
 
-import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
-import org.apache.camel.model.errorhandler.DefaultErrorHandlerProperties;
+import org.apache.camel.model.RedeliveryPolicyDefinition;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
+import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition;
+import org.apache.camel.processor.FatalFallbackErrorHandler;
+import org.apache.camel.processor.SendProcessor;
 import org.apache.camel.processor.errorhandler.DefaultErrorHandler;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.spi.CamelLogger;
 import org.apache.camel.spi.ExecutorServiceManager;
+import org.apache.camel.spi.Language;
 import org.apache.camel.spi.ThreadPoolProfile;
+import org.slf4j.LoggerFactory;
 
-public class DefaultErrorHandlerReifier<T extends DefaultErrorHandlerProperties> extends ErrorHandlerReifier<T> {
+public class DefaultErrorHandlerReifier extends ErrorHandlerReifier<DefaultErrorHandlerDefinition> {
 
-    public DefaultErrorHandlerReifier(Route route, ErrorHandlerFactory definition) {
-        super(route, (T) definition);
+    public DefaultErrorHandlerReifier(Route route, DefaultErrorHandlerDefinition definition) {
+        super(route, definition);
     }
 
     @Override
     public Processor createErrorHandler(Processor processor) throws Exception {
         // optimize to use shared default instance if using out of the box settings
-        RedeliveryPolicy redeliveryPolicy
-                = definition.hasRedeliveryPolicy() ? definition.getRedeliveryPolicy() : definition.getDefaultRedeliveryPolicy();
-        CamelLogger logger = definition.hasLogger() ? definition.getLogger() : null;
+
+        RedeliveryPolicy redeliveryPolicy = resolveRedeliveryPolicy(definition, camelContext);
+        CamelLogger logger = resolveLogger(definition, camelContext);
 
         DefaultErrorHandler answer = new DefaultErrorHandler(
                 camelContext, processor, logger,
-                getProcessor(definition.getOnRedelivery(), definition.getOnRedeliveryRef()),
+                getProcessor(definition.getOnRedeliveryProcessor(), definition.getOnRedeliveryRef()),
                 redeliveryPolicy,
-                getPredicate(definition.getRetryWhile(), definition.getRetryWhileRef()),
-                getExecutorService(definition.getExecutorService(), definition.getExecutorServiceRef()),
-                getProcessor(definition.getOnPrepareFailure(), definition.getOnPrepareFailureRef()),
-                getProcessor(definition.getOnExceptionOccurred(), definition.getOnExceptionOccurredRef()));
+                getPredicate(definition.getRetryWhilePredicate(), definition.getRetryWhileRef()),
+                getExecutorService(definition.getExecutorServiceBean(), definition.getExecutorServiceRef()),
+                getProcessor(definition.getOnPrepareFailureProcessor(), definition.getOnPrepareFailureRef()),
+                getProcessor(definition.getOnExceptionOccurredProcessor(), definition.getOnExceptionOccurredRef()));
         // configure error handler before we can use it
         configure(answer);
         return answer;
     }
 
+    private Predicate resolveRetryWhilePolicy(DeadLetterChannelDefinition definition, CamelContext camelContext) {
+        Predicate answer = definition.getRetryWhilePredicate();
+
+        if (answer == null && definition.getRetryWhileRef() != null) {
+            // it is a bean expression
+            Language bean = camelContext.resolveLanguage("bean");
+            answer = bean.createPredicate(definition.getRetryWhileRef());
+            answer.initPredicate(camelContext);
+        }
+
+        return answer;
+    }
+
+    private CamelLogger resolveLogger(DefaultErrorHandlerDefinition definition, CamelContext camelContext) {
+        CamelLogger answer = definition.getLoggerBean();
+        if (answer == null && definition.getLoggerRef() != null) {
+            answer = mandatoryLookup(definition.getLoggerRef(), CamelLogger.class);
+        }
+        if (answer == null) {
+            answer = new CamelLogger(LoggerFactory.getLogger(DefaultErrorHandler.class), LoggingLevel.ERROR);
+        }
+        if (definition.getLevel() != null) {
+            answer.setLevel(definition.getLevel());
+        }
+        return answer;
+    }
+
+    private Processor createDeadLetterChannelProcessor(String uri) {
+        // wrap in our special safe fallback error handler if sending to
+        // dead letter channel fails
+        Processor child = new SendProcessor(camelContext.getEndpoint(uri), ExchangePattern.InOnly);
+        // force MEP to be InOnly so when sending to DLQ we would not expect
+        // a reply if the MEP was InOut
+        return new FatalFallbackErrorHandler(child, true);
+    }
+
+    private RedeliveryPolicy resolveRedeliveryPolicy(DefaultErrorHandlerDefinition definition, CamelContext camelContext) {
+        RedeliveryPolicy answer = null;
+        RedeliveryPolicyDefinition def = definition.getRedeliveryPolicy();
+        if (def != null) {
+            answer = ErrorHandlerReifier.createRedeliveryPolicy(def, camelContext, null);
+        }
+        if (def == null && definition.getRedeliveryPolicyRef() != null) {
+            answer = mandatoryLookup(definition.getRedeliveryPolicyRef(), RedeliveryPolicy.class);
+        }
+        if (answer == null) {
+            answer = RedeliveryPolicy.DEFAULT_POLICY;
+        }
+        return answer;
+    }
+
     protected synchronized ScheduledExecutorService getExecutorService(
             ScheduledExecutorService executorService, String executorServiceRef) {
         if (executorService == null || executorService.isShutdown()) {
@@ -71,8 +131,7 @@ public class DefaultErrorHandlerReifier<T extends DefaultErrorHandlerProperties>
                 }
             } else {
                 // no explicit configured thread pool, so leave it up to the
-                // error handler to decide if it need
-                // a default thread pool from
+                // error handler to decide if it need a default thread pool from
                 // CamelContext#getErrorHandlerExecutorService
                 executorService = null;
             }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerRefReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerRefReifier.java
index 186773c63f0..7c7ad90db6d 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerRefReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerRefReifier.java
@@ -21,13 +21,13 @@ import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.errorhandler.ErrorHandlerHelper;
-import org.apache.camel.model.errorhandler.ErrorHandlerRefProperties;
+import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
 import org.apache.camel.util.ObjectHelper;
 
-public class ErrorHandlerRefReifier extends ErrorHandlerReifier<ErrorHandlerRefProperties> {
+public class ErrorHandlerRefReifier extends ErrorHandlerReifier<ErrorHandlerRefDefinition> {
 
     public ErrorHandlerRefReifier(Route route, ErrorHandlerFactory definition) {
-        super(route, (ErrorHandlerRefProperties) definition);
+        super(route, (ErrorHandlerRefDefinition) definition);
     }
 
     @Override
@@ -43,5 +43,4 @@ public class ErrorHandlerRefReifier extends ErrorHandlerReifier<ErrorHandlerRefP
         route.addErrorHandlerFactoryReference(definition, handler);
         return handler;
     }
-
 }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
index 43e9e18d4ff..639ca1587bf 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
@@ -34,10 +34,10 @@ import org.apache.camel.Route;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.model.OnExceptionDefinition;
 import org.apache.camel.model.RedeliveryPolicyDefinition;
-import org.apache.camel.model.errorhandler.DeadLetterChannelProperties;
-import org.apache.camel.model.errorhandler.DefaultErrorHandlerProperties;
-import org.apache.camel.model.errorhandler.ErrorHandlerRefProperties;
-import org.apache.camel.model.errorhandler.NoErrorHandlerProperties;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
+import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
+import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition;
 import org.apache.camel.processor.errorhandler.ErrorHandlerSupport;
 import org.apache.camel.processor.errorhandler.ExceptionPolicy;
 import org.apache.camel.processor.errorhandler.ExceptionPolicy.RedeliveryOption;
@@ -91,15 +91,16 @@ public abstract class ErrorHandlerReifier<T extends ErrorHandlerFactory> extends
     }
 
     private static ErrorHandlerReifier<? extends ErrorHandlerFactory> coreReifier(Route route, ErrorHandlerFactory definition) {
-        if (definition instanceof DeadLetterChannelProperties) {
-            return new DeadLetterChannelReifier(route, definition);
-        } else if (definition instanceof DefaultErrorHandlerProperties) {
-            return new DefaultErrorHandlerReifier<>(route, definition);
-        } else if (definition instanceof ErrorHandlerRefProperties) {
-            return new ErrorHandlerRefReifier(route, definition);
-        } else if (definition instanceof NoErrorHandlerProperties) {
+        if (definition instanceof DeadLetterChannelDefinition) {
+            return new DeadLetterChannelReifier(route, (DeadLetterChannelDefinition) definition);
+        } else if (definition instanceof DefaultErrorHandlerDefinition) {
+            return new DefaultErrorHandlerReifier(route, (DefaultErrorHandlerDefinition) definition);
+        } else if (definition instanceof NoErrorHandlerDefinition) {
             return new NoErrorHandlerReifier(route, definition);
+        } else if (definition instanceof ErrorHandlerRefDefinition) {
+            return new ErrorHandlerRefReifier(route, definition);
         }
+
         return null;
     }
 
@@ -125,44 +126,165 @@ public abstract class ErrorHandlerReifier<T extends ErrorHandlerFactory> extends
                 ObjectHelper.isNotEmpty(def.getOutputs()), handled,
                 continued, retryWhile, onRedelivery,
                 onExceptionOccurred, def.getRedeliveryPolicyRef(),
-                getRedeliveryPolicy(def.getRedeliveryPolicyType()), def.getExceptions());
+                createRedeliveryPolicyOptions(def.getRedeliveryPolicyType()), def.getExceptions());
     }
 
-    private static Map<RedeliveryOption, String> getRedeliveryPolicy(RedeliveryPolicyDefinition definition) {
+    public static RedeliveryPolicy createRedeliveryPolicy(RedeliveryPolicyDefinition definition, CamelContext context) {
+        Map<RedeliveryOption, String> options = createRedeliveryPolicyOptions(definition);
+        return createRedeliveryPolicy(options, context, null);
+    }
+
+    private static RedeliveryPolicy createRedeliveryPolicy(
+            Map<RedeliveryOption, String> definition, CamelContext context, RedeliveryPolicy parentPolicy) {
+        RedeliveryPolicy answer;
+        if (parentPolicy != null) {
+            answer = parentPolicy.copy();
+        } else {
+            answer = new RedeliveryPolicy();
+        }
+        try {
+            if (definition.get(RedeliveryOption.maximumRedeliveries) != null) {
+                answer.setMaximumRedeliveries(
+                        CamelContextHelper.parseInteger(context, definition.get(RedeliveryOption.maximumRedeliveries)));
+            }
+            if (definition.get(RedeliveryOption.redeliveryDelay) != null) {
+                answer.setRedeliveryDelay(
+                        CamelContextHelper.parseLong(context, definition.get(RedeliveryOption.redeliveryDelay)));
+            }
+            if (definition.get(RedeliveryOption.asyncDelayedRedelivery) != null) {
+                answer.setAsyncDelayedRedelivery(
+                        CamelContextHelper.parseBoolean(context, definition.get(RedeliveryOption.asyncDelayedRedelivery)));
+            }
+            if (definition.get(RedeliveryOption.retriesExhaustedLogLevel) != null) {
+                answer.setRetriesExhaustedLogLevel(CamelContextHelper.parse(context, LoggingLevel.class,
+                        definition.get(RedeliveryOption.retriesExhaustedLogLevel)));
+            }
+            if (definition.get(RedeliveryOption.retryAttemptedLogLevel) != null) {
+                answer.setRetryAttemptedLogLevel(CamelContextHelper.parse(context, LoggingLevel.class,
+                        definition.get(RedeliveryOption.retryAttemptedLogLevel)));
+            }
+            if (definition.get(RedeliveryOption.retryAttemptedLogInterval) != null) {
+                answer.setRetryAttemptedLogInterval(
+                        CamelContextHelper.parseInteger(context, definition.get(RedeliveryOption.retryAttemptedLogInterval)));
+            }
+            if (definition.get(RedeliveryOption.backOffMultiplier) != null) {
+                answer.setBackOffMultiplier(
+                        CamelContextHelper.parseDouble(context, definition.get(RedeliveryOption.backOffMultiplier)));
+            }
+            if (definition.get(RedeliveryOption.useExponentialBackOff) != null) {
+                answer.setUseExponentialBackOff(
+                        CamelContextHelper.parseBoolean(context, definition.get(RedeliveryOption.useExponentialBackOff)));
+            }
+            if (definition.get(RedeliveryOption.collisionAvoidanceFactor) != null) {
+                answer.setCollisionAvoidanceFactor(
+                        CamelContextHelper.parseDouble(context, definition.get(RedeliveryOption.collisionAvoidanceFactor)));
+            }
+            if (definition.get(RedeliveryOption.useCollisionAvoidance) != null) {
+                answer.setUseCollisionAvoidance(
+                        CamelContextHelper.parseBoolean(context, definition.get(RedeliveryOption.useCollisionAvoidance)));
+            }
+            if (definition.get(RedeliveryOption.maximumRedeliveryDelay) != null) {
+                answer.setMaximumRedeliveryDelay(
+                        CamelContextHelper.parseLong(context, definition.get(RedeliveryOption.maximumRedeliveryDelay)));
+            }
+            if (definition.get(RedeliveryOption.logStackTrace) != null) {
+                answer.setLogStackTrace(
+                        CamelContextHelper.parseBoolean(context, definition.get(RedeliveryOption.logStackTrace)));
+            }
+            if (definition.get(RedeliveryOption.logRetryStackTrace) != null) {
+                answer.setLogRetryStackTrace(
+                        CamelContextHelper.parseBoolean(context, definition.get(RedeliveryOption.logRetryStackTrace)));
+            }
+            if (definition.get(RedeliveryOption.logHandled) != null) {
+                answer.setLogHandled(CamelContextHelper.parseBoolean(context, definition.get(RedeliveryOption.logHandled)));
+            }
+            if (definition.get(RedeliveryOption.logNewException) != null) {
+                answer.setLogNewException(
+                        CamelContextHelper.parseBoolean(context, definition.get(RedeliveryOption.logNewException)));
+            }
+            if (definition.get(RedeliveryOption.logContinued) != null) {
+                answer.setLogContinued(CamelContextHelper.parseBoolean(context, definition.get(RedeliveryOption.logContinued)));
+            }
+            if (definition.get(RedeliveryOption.logRetryAttempted) != null) {
+                answer.setLogRetryAttempted(
+                        CamelContextHelper.parseBoolean(context, definition.get(RedeliveryOption.logRetryAttempted)));
+            }
+            if (definition.get(RedeliveryOption.logExhausted) != null) {
+                answer.setLogExhausted(CamelContextHelper.parseBoolean(context, definition.get(RedeliveryOption.logExhausted)));
+            }
+            if (definition.get(RedeliveryOption.logExhaustedMessageHistory) != null) {
+                answer.setLogExhaustedMessageHistory(
+                        CamelContextHelper.parseBoolean(context, definition.get(RedeliveryOption.logExhaustedMessageHistory)));
+            }
+            if (definition.get(RedeliveryOption.logExhaustedMessageBody) != null) {
+                answer.setLogExhaustedMessageBody(
+                        CamelContextHelper.parseBoolean(context, definition.get(RedeliveryOption.logExhaustedMessageBody)));
+            }
+            if (definition.get(RedeliveryOption.disableRedelivery) != null) {
+                if (CamelContextHelper.parseBoolean(context, definition.get(RedeliveryOption.disableRedelivery))) {
+                    answer.setMaximumRedeliveries(0);
+                }
+            }
+            if (definition.get(RedeliveryOption.delayPattern) != null) {
+                answer.setDelayPattern(CamelContextHelper.parseText(context, definition.get(RedeliveryOption.delayPattern)));
+            }
+            if (definition.get(RedeliveryOption.allowRedeliveryWhileStopping) != null) {
+                answer.setAllowRedeliveryWhileStopping(CamelContextHelper.parseBoolean(context,
+                        definition.get(RedeliveryOption.allowRedeliveryWhileStopping)));
+            }
+            if (definition.get(RedeliveryOption.exchangeFormatterRef) != null) {
+                answer.setExchangeFormatterRef(
+                        CamelContextHelper.parseText(context, definition.get(RedeliveryOption.exchangeFormatterRef)));
+            }
+        } catch (Exception e) {
+            throw RuntimeCamelException.wrapRuntimeCamelException(e);
+        }
+
+        return answer;
+    }
+
+    private static Map<RedeliveryOption, String> createRedeliveryPolicyOptions(RedeliveryPolicyDefinition definition) {
         if (definition == null) {
             return null;
         }
         Map<RedeliveryOption, String> policy = new HashMap<>();
         setOption(policy, RedeliveryOption.maximumRedeliveries, definition.getMaximumRedeliveries());
-        setOption(policy, RedeliveryOption.redeliveryDelay, definition.getRedeliveryDelay());
+        setOption(policy, RedeliveryOption.redeliveryDelay, definition.getRedeliveryDelay(), "1000");
         setOption(policy, RedeliveryOption.asyncDelayedRedelivery, definition.getAsyncDelayedRedelivery());
-        setOption(policy, RedeliveryOption.backOffMultiplier, definition.getBackOffMultiplier());
+        setOption(policy, RedeliveryOption.backOffMultiplier, definition.getBackOffMultiplier(), "2");
         setOption(policy, RedeliveryOption.useExponentialBackOff, definition.getUseExponentialBackOff());
-        setOption(policy, RedeliveryOption.collisionAvoidanceFactor, definition.getCollisionAvoidanceFactor());
+        setOption(policy, RedeliveryOption.collisionAvoidanceFactor, definition.getCollisionAvoidanceFactor(), "0.15");
         setOption(policy, RedeliveryOption.useCollisionAvoidance, definition.getUseCollisionAvoidance());
-        setOption(policy, RedeliveryOption.maximumRedeliveryDelay, definition.getMaximumRedeliveryDelay());
-        setOption(policy, RedeliveryOption.retriesExhaustedLogLevel, definition.getRetriesExhaustedLogLevel());
-        setOption(policy, RedeliveryOption.retryAttemptedLogLevel, definition.getRetryAttemptedLogLevel());
-        setOption(policy, RedeliveryOption.retryAttemptedLogInterval, definition.getRetryAttemptedLogInterval());
-        setOption(policy, RedeliveryOption.logRetryAttempted, definition.getLogRetryAttempted());
-        setOption(policy, RedeliveryOption.logStackTrace, definition.getLogStackTrace());
+        setOption(policy, RedeliveryOption.maximumRedeliveryDelay, definition.getMaximumRedeliveryDelay(), "60000");
+        setOption(policy, RedeliveryOption.retriesExhaustedLogLevel, definition.getRetriesExhaustedLogLevel(), "ERROR");
+        setOption(policy, RedeliveryOption.retryAttemptedLogLevel, definition.getRetryAttemptedLogLevel(), "DEBUG");
+        setOption(policy, RedeliveryOption.retryAttemptedLogInterval, definition.getRetryAttemptedLogInterval(), "1");
+        setOption(policy, RedeliveryOption.logRetryAttempted, definition.getLogRetryAttempted(), "true");
+        setOption(policy, RedeliveryOption.logStackTrace, definition.getLogStackTrace(), "true");
         setOption(policy, RedeliveryOption.logRetryStackTrace, definition.getLogRetryStackTrace());
         setOption(policy, RedeliveryOption.logHandled, definition.getLogHandled());
-        setOption(policy, RedeliveryOption.logNewException, definition.getLogNewException());
+        setOption(policy, RedeliveryOption.logNewException, definition.getLogNewException(), "true");
         setOption(policy, RedeliveryOption.logContinued, definition.getLogContinued());
-        setOption(policy, RedeliveryOption.logExhausted, definition.getLogExhausted());
+        setOption(policy, RedeliveryOption.logExhausted, definition.getLogExhausted(), "true");
         setOption(policy, RedeliveryOption.logExhaustedMessageHistory, definition.getLogExhaustedMessageHistory());
         setOption(policy, RedeliveryOption.logExhaustedMessageBody, definition.getLogExhaustedMessageBody());
         setOption(policy, RedeliveryOption.disableRedelivery, definition.getDisableRedelivery());
         setOption(policy, RedeliveryOption.delayPattern, definition.getDelayPattern());
-        setOption(policy, RedeliveryOption.allowRedeliveryWhileStopping, definition.getAllowRedeliveryWhileStopping());
+        setOption(policy, RedeliveryOption.allowRedeliveryWhileStopping, definition.getAllowRedeliveryWhileStopping(), "true");
         setOption(policy, RedeliveryOption.exchangeFormatterRef, definition.getExchangeFormatterRef());
         return policy;
     }
 
     private static void setOption(Map<RedeliveryOption, String> policy, RedeliveryOption option, Object value) {
+        setOption(policy, option, value, null);
+    }
+
+    private static void setOption(
+            Map<RedeliveryOption, String> policy, RedeliveryOption option, Object value, Object defaultValue) {
         if (value != null) {
             policy.put(option, value.toString());
+        } else if (defaultValue != null) {
+            policy.put(option, defaultValue.toString());
         }
     }
 
@@ -243,7 +365,6 @@ public abstract class ErrorHandlerReifier<T extends ErrorHandlerFactory> extends
         }
 
         try {
-
             // copy across the properties - if they are set
             if (definition.getMaximumRedeliveries() != null) {
                 answer.setMaximumRedeliveries(CamelContextHelper.parseInteger(context, definition.getMaximumRedeliveries()));
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DeadLetterChannelReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/LegacyDeadLetterChannelReifier.java
similarity index 92%
copy from core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DeadLetterChannelReifier.java
copy to core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/LegacyDeadLetterChannelReifier.java
index 7fb4f12bd2a..598012ceb19 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DeadLetterChannelReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/LegacyDeadLetterChannelReifier.java
@@ -28,9 +28,13 @@ import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.spi.CamelLogger;
 import org.apache.camel.util.ObjectHelper;
 
-public class DeadLetterChannelReifier extends DefaultErrorHandlerReifier<DeadLetterChannelProperties> {
+/**
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
+ */
+@Deprecated
+public class LegacyDeadLetterChannelReifier extends LegacyDefaultErrorHandlerReifier<DeadLetterChannelProperties> {
 
-    public DeadLetterChannelReifier(Route route, ErrorHandlerFactory definition) {
+    public LegacyDeadLetterChannelReifier(Route route, ErrorHandlerFactory definition) {
         super(route, definition);
     }
 
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/LegacyDefaultErrorHandlerReifier.java
similarity index 93%
copy from core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java
copy to core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/LegacyDefaultErrorHandlerReifier.java
index 445b69ab887..5b368436b66 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/LegacyDefaultErrorHandlerReifier.java
@@ -28,9 +28,13 @@ import org.apache.camel.spi.CamelLogger;
 import org.apache.camel.spi.ExecutorServiceManager;
 import org.apache.camel.spi.ThreadPoolProfile;
 
-public class DefaultErrorHandlerReifier<T extends DefaultErrorHandlerProperties> extends ErrorHandlerReifier<T> {
+/**
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
+ */
+@Deprecated
+public class LegacyDefaultErrorHandlerReifier<T extends DefaultErrorHandlerProperties> extends ErrorHandlerReifier<T> {
 
-    public DefaultErrorHandlerReifier(Route route, ErrorHandlerFactory definition) {
+    public LegacyDefaultErrorHandlerReifier(Route route, ErrorHandlerFactory definition) {
         super(route, (T) definition);
     }
 
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerRefReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/LegacyErrorHandlerRefReifier.java
similarity index 87%
copy from core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerRefReifier.java
copy to core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/LegacyErrorHandlerRefReifier.java
index 186773c63f0..aa6ef97e4cf 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerRefReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/LegacyErrorHandlerRefReifier.java
@@ -24,9 +24,13 @@ import org.apache.camel.model.errorhandler.ErrorHandlerHelper;
 import org.apache.camel.model.errorhandler.ErrorHandlerRefProperties;
 import org.apache.camel.util.ObjectHelper;
 
-public class ErrorHandlerRefReifier extends ErrorHandlerReifier<ErrorHandlerRefProperties> {
+/**
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
+ */
+@Deprecated
+public class LegacyErrorHandlerRefReifier extends ErrorHandlerReifier<ErrorHandlerRefProperties> {
 
-    public ErrorHandlerRefReifier(Route route, ErrorHandlerFactory definition) {
+    public LegacyErrorHandlerRefReifier(Route route, ErrorHandlerFactory definition) {
         super(route, (ErrorHandlerRefProperties) definition);
     }
 
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilder.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/LegacyNoErrorHandlerReifier.java
similarity index 50%
rename from core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilder.java
rename to core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/LegacyNoErrorHandlerReifier.java
index 5e9fbb749f9..857b646cbe6 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilder.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/LegacyNoErrorHandlerReifier.java
@@ -14,28 +14,29 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.builder;
+package org.apache.camel.reifier.errorhandler;
 
 import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.Processor;
+import org.apache.camel.Route;
+import org.apache.camel.model.errorhandler.NoErrorHandlerProperties;
+import org.apache.camel.processor.errorhandler.NoErrorHandler;
+import org.apache.camel.spi.ErrorHandler;
 
 /**
- * A builder of a <a href="http://camel.apache.org/error-handler.html">Error Handler</a>
+ * Legacy error handler for XML DSL in camel-spring-xml/camel-blueprint
  */
-public interface ErrorHandlerBuilder extends ErrorHandlerFactory {
+@Deprecated
+public class LegacyNoErrorHandlerReifier extends ErrorHandlerReifier<NoErrorHandlerProperties> {
 
-    /**
-     * Whether this error handler supports transacted exchanges.
-     */
-    boolean supportTransacted();
-
-    /**
-     * Clones this builder so each {@link RouteBuilder} has its private builder to use, to avoid changes from one
-     * {@link RouteBuilder} to influence the others.
-     * <p/>
-     * This is needed by the current Camel 2.x architecture.
-     *
-     * @return a clone of this {@link ErrorHandlerBuilder}
-     */
-    ErrorHandlerBuilder cloneBuilder();
+    public LegacyNoErrorHandlerReifier(Route route, ErrorHandlerFactory definition) {
+        super(route, (NoErrorHandlerProperties) definition);
+    }
 
+    @Override
+    public Processor createErrorHandler(Processor processor) throws Exception {
+        ErrorHandler answer = new NoErrorHandler(processor);
+        configure(answer);
+        return answer;
+    }
 }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NoErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NoErrorHandlerReifier.java
index 35d1ac5ae22..4dba81d5c65 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NoErrorHandlerReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NoErrorHandlerReifier.java
@@ -19,14 +19,14 @@ package org.apache.camel.reifier.errorhandler;
 import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
-import org.apache.camel.model.errorhandler.NoErrorHandlerProperties;
+import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition;
 import org.apache.camel.processor.errorhandler.NoErrorHandler;
 import org.apache.camel.spi.ErrorHandler;
 
-public class NoErrorHandlerReifier extends ErrorHandlerReifier<NoErrorHandlerProperties> {
+public class NoErrorHandlerReifier extends ErrorHandlerReifier<NoErrorHandlerDefinition> {
 
     public NoErrorHandlerReifier(Route route, ErrorHandlerFactory definition) {
-        super(route, (NoErrorHandlerProperties) definition);
+        super(route, (NoErrorHandlerDefinition) definition);
     }
 
     @Override
diff --git a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
index 7bae96b6a41..adbd809e0c9 100644
--- a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
+++ b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
@@ -42,7 +42,6 @@ import org.apache.camel.StartupSummaryLevel;
 import org.apache.camel.TypeConverterExists;
 import org.apache.camel.TypeConverters;
 import org.apache.camel.ValueHolder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.cloud.ServiceRegistry;
 import org.apache.camel.cluster.CamelClusterService;
@@ -88,6 +87,7 @@ import org.apache.camel.model.TemplatedRouteDefinition;
 import org.apache.camel.model.ThreadPoolProfileDefinition;
 import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition;
 import org.apache.camel.model.dataformat.DataFormatsDefinition;
+import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
 import org.apache.camel.model.rest.RestConfigurationDefinition;
 import org.apache.camel.model.rest.RestContainer;
 import org.apache.camel.model.rest.RestDefinition;
@@ -1165,7 +1165,8 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
             context.setDelayer(CamelContextHelper.parseLong(context, getDelayer()));
         }
         if (getErrorHandlerRef() != null) {
-            context.adapt(ExtendedCamelContext.class).setErrorHandlerFactory(new ErrorHandlerBuilderRef(getErrorHandlerRef()));
+            context.adapt(ExtendedCamelContext.class)
+                    .setErrorHandlerFactory(new ErrorHandlerRefDefinition(getErrorHandlerRef()));
         }
         if (getAutoStartup() != null) {
             context.setAutoStartup(CamelContextHelper.parseBoolean(context, getAutoStartup()));
diff --git a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelRedeliveryPolicyFactoryBean.java b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelRedeliveryPolicyFactoryBean.java
index 8bec6625489..2a729371dc8 100644
--- a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelRedeliveryPolicyFactoryBean.java
+++ b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelRedeliveryPolicyFactoryBean.java
@@ -30,6 +30,7 @@ import org.apache.camel.support.CamelContextHelper;
  * A factory which instantiates {@link RedeliveryPolicy} objects
  */
 @XmlAccessorType(XmlAccessType.FIELD)
+@Deprecated
 public abstract class AbstractCamelRedeliveryPolicyFactoryBean extends AbstractCamelFactoryBean<RedeliveryPolicy> {
 
     @XmlAttribute
diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/ContextErrorHandlerTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/ContextErrorHandlerTest.java
index 54715126718..88fa1abf00a 100644
--- a/core/camel-core/src/test/java/org/apache/camel/builder/ContextErrorHandlerTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/builder/ContextErrorHandlerTest.java
@@ -25,6 +25,7 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.impl.engine.DefaultRoute;
+import org.apache.camel.model.RedeliveryPolicyDefinition;
 import org.apache.camel.processor.SendProcessor;
 import org.apache.camel.processor.errorhandler.DeadLetterChannel;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
@@ -40,9 +41,9 @@ public class ContextErrorHandlerTest extends ContextTestSupport {
     public void setUp() throws Exception {
         setUseRouteBuilder(false);
         super.setUp();
-        RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
+        RedeliveryPolicyDefinition redeliveryPolicy = new RedeliveryPolicyDefinition();
         redeliveryPolicy.maximumRedeliveries(1);
-        redeliveryPolicy.setUseExponentialBackOff(true);
+        redeliveryPolicy.setUseExponentialBackOff("true");
         DeadLetterChannelBuilder deadLetterChannelBuilder = new DeadLetterChannelBuilder("mock:error");
         deadLetterChannelBuilder.setRedeliveryPolicy(redeliveryPolicy);
         context.adapt(ExtendedCamelContext.class).setErrorHandlerFactory(deadLetterChannelBuilder);
diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateErrorHandlerTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateErrorHandlerTest.java
index 33c5d53d531..6b31dd78b8d 100644
--- a/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateErrorHandlerTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateErrorHandlerTest.java
@@ -19,6 +19,8 @@ package org.apache.camel.builder;
 import org.apache.camel.Channel;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.engine.DefaultRoute;
+import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
+import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition;
 import org.apache.camel.processor.errorhandler.NoErrorHandler;
 import org.junit.jupiter.api.Test;
 
@@ -30,7 +32,7 @@ public class RouteTemplateErrorHandlerTest {
     @Test
     public void testDefineRouteTemplate() throws Exception {
         try (DefaultCamelContext context = new DefaultCamelContext()) {
-            context.getRegistry().bind("myErrorHandler", new NoErrorHandlerBuilder());
+            context.getRegistry().bind("myErrorHandler", new NoErrorHandlerDefinition());
             context.addRoutes(new RouteBuilder() {
                 @Override
                 public void configure() throws Exception {
@@ -48,13 +50,13 @@ public class RouteTemplateErrorHandlerTest {
             });
 
             assertThat(context.getRouteDefinitions()).first().satisfies(d -> {
-                assertThat(d.getErrorHandlerFactory()).isInstanceOfSatisfying(ErrorHandlerBuilderRef.class, h -> {
+                assertThat(d.getErrorHandlerFactory()).isInstanceOfSatisfying(ErrorHandlerRefDefinition.class, h -> {
                     assertThat(h.getRef()).isEqualTo("myErrorHandler");
                 });
             });
 
             assertThat(context.getRouteTemplateDefinitions()).first().satisfies(d -> {
-                assertThat(d.route().getErrorHandlerFactory()).isInstanceOfSatisfying(ErrorHandlerBuilderRef.class, h -> {
+                assertThat(d.route().getErrorHandlerFactory()).isInstanceOfSatisfying(ErrorHandlerRefDefinition.class, h -> {
                     assertThat(h.getRef()).isEqualTo("myErrorHandler");
                 });
             });
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTest.java
index a1aa39f764c..78ccae3e3d2 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTest.java
@@ -18,7 +18,6 @@ package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
@@ -51,7 +50,7 @@ public class ContextScopedOnExceptionErrorHandlerRefIssueTest extends ContextTes
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                errorHandler(new ErrorHandlerBuilderRef("myDLC"));
+                errorHandler("myDLC");
 
                 onException(IllegalArgumentException.class).handled(true).to("mock:handled").end();
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTwoRoutesTest.java
index cb831e996ed..0925ea4062a 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTwoRoutesTest.java
@@ -20,8 +20,8 @@ import java.io.IOException;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -66,10 +66,10 @@ public class ContextScopedOnExceptionErrorHandlerRefIssueTwoRoutesTest extends C
             public void configure() throws Exception {
                 onException(IllegalArgumentException.class).handled(true).to("mock:handled").end();
 
-                from("direct:foo").errorHandler(new ErrorHandlerBuilderRef("myDLC")).to("mock:foo")
+                from("direct:foo").errorHandler(new ErrorHandlerRefDefinition("myDLC")).to("mock:foo")
                         .throwException(new IOException("Damn IO"));
 
-                from("direct:start").errorHandler(new ErrorHandlerBuilderRef("myDLC")).to("mock:a")
+                from("direct:start").errorHandler(new ErrorHandlerRefDefinition("myDLC")).to("mock:a")
                         .throwException(new IllegalArgumentException("Damn"));
             }
         };
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTest.java
index f1d1029381c..9ca6d5318a9 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTest.java
@@ -19,7 +19,6 @@ package org.apache.camel.issues;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
@@ -63,7 +62,7 @@ public class ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTest extends
             public void configure() throws Exception {
                 onException(IllegalArgumentException.class).handled(false).to("mock:handled").end();
 
-                errorHandler(new ErrorHandlerBuilderRef("myDLC"));
+                errorHandler("myDLC");
 
                 from("direct:start").to("mock:a").throwException(new IllegalArgumentException("Damn"));
             }
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java
index 76fc4100c2d..0e1150a656d 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java
@@ -21,7 +21,6 @@ import java.io.IOException;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
@@ -74,7 +73,7 @@ public class ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                errorHandler(new ErrorHandlerBuilderRef("myDLC"));
+                errorHandler("myDLC");
 
                 onException(IllegalArgumentException.class).handled(false).to("mock:handled").end();
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java
index d5552c6b35d..686cb590c45 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java
@@ -19,8 +19,8 @@ package org.apache.camel.issues;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -61,7 +61,7 @@ public class ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTe
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:start").errorHandler(new ErrorHandlerBuilderRef("myDLC"))
+                from("direct:start").errorHandler(new ErrorHandlerRefDefinition("myDLC"))
                         .onException(IllegalArgumentException.class).handled(false).to("mock:handled").end()
                         .to("mock:a").throwException(new IllegalArgumentException("Damn"));
             }
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
index 98ff479573c..516954788c6 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
@@ -21,7 +21,6 @@ import java.io.IOException;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
@@ -76,10 +75,10 @@ public class ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTw
             public void configure() throws Exception {
                 onException(IllegalArgumentException.class).handled(false).to("mock:handled").end();
 
-                from("direct:foo").errorHandler(new ErrorHandlerBuilderRef("myDLC")).to("mock:foo")
+                from("direct:foo").errorHandler("myDLC").to("mock:foo")
                         .throwException(new IOException("Damn IO"));
 
-                from("direct:start").errorHandler(new ErrorHandlerBuilderRef("myDLC")).to("mock:a")
+                from("direct:start").errorHandler("myDLC").to("mock:a")
                         .throwException(new IllegalArgumentException("Damn"));
             }
         };
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest.java
index 9a74d3a07d1..0c8766ce1eb 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest.java
@@ -18,8 +18,8 @@ package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -54,7 +54,7 @@ public class ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest extends
 
                 onException(IllegalArgumentException.class).handled(true).to("mock:handled").end();
 
-                from("direct:start").errorHandler(new ErrorHandlerBuilderRef("myDLC")).to("mock:a")
+                from("direct:start").errorHandler(new ErrorHandlerRefDefinition("myDLC")).to("mock:a")
                         .throwException(new IllegalArgumentException("Damn"));
             }
         };
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
index 99676a12bdc..ac75f8733c5 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
@@ -20,7 +20,6 @@ import java.io.IOException;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
@@ -66,10 +65,10 @@ public class ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTes
             public void configure() throws Exception {
                 onException(IllegalArgumentException.class).handled(true).to("mock:handled").end();
 
-                from("direct:foo").errorHandler(new ErrorHandlerBuilderRef("myDLC")).to("mock:foo")
+                from("direct:foo").errorHandler("myDLC").to("mock:foo")
                         .throwException(new IOException("Damn IO"));
 
-                from("direct:start").errorHandler(new ErrorHandlerBuilderRef("myDLC")).to("mock:a")
+                from("direct:start").errorHandler("myDLC").to("mock:a")
                         .throwException(new IllegalArgumentException("Damn"));
             }
         };
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionContinuedIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionContinuedIssueTest.java
index 3754e75f152..ec73d8f5700 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionContinuedIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionContinuedIssueTest.java
@@ -21,7 +21,6 @@ import org.apache.camel.Exchange;
 import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.DefaultErrorHandlerBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.junit.jupiter.api.Test;
 
@@ -34,7 +33,7 @@ public class OnExceptionContinuedIssueTest extends ContextTestSupport {
 
     @Test
     public void testOnExceptionWrappedMatch() throws Exception {
-        final DefaultErrorHandlerBuilder defaultErrorHandlerBuilder = new DeadLetterChannelBuilder("direct:dead");
+        final DeadLetterChannelBuilder defaultErrorHandlerBuilder = new DeadLetterChannelBuilder("direct:dead");
         defaultErrorHandlerBuilder.redeliveryDelay(0); // run fast
         defaultErrorHandlerBuilder.maximumRedeliveries(2);
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTest.java
index 312f41a2823..599ccc3bc6f 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTest.java
@@ -18,7 +18,6 @@ package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
@@ -51,7 +50,7 @@ public class OnExceptionErrorHandlerRefIssueTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                errorHandler(new ErrorHandlerBuilderRef("myDLC"));
+                errorHandler("myDLC");
 
                 from("direct:start").onException(IllegalArgumentException.class).handled(true).to("mock:handled").end()
                         .to("mock:a")
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTwoRoutesTest.java
index 53f0d6d07fe..15e978efeaf 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTwoRoutesTest.java
@@ -18,7 +18,6 @@ package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
@@ -62,7 +61,7 @@ public class OnExceptionErrorHandlerRefIssueTwoRoutesTest extends ContextTestSup
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                errorHandler(new ErrorHandlerBuilderRef("myDLC"));
+                errorHandler("myDLC");
 
                 from("direct:foo").to("mock:foo").throwException(new IllegalArgumentException("Damn Foo"));
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTest.java
index a26e7b0d8ef..f125a60f762 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTest.java
@@ -19,7 +19,6 @@ package org.apache.camel.issues;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
@@ -61,7 +60,7 @@ public class OnExceptionNotHandledErrorHandlerRefIssueTest extends ContextTestSu
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                errorHandler(new ErrorHandlerBuilderRef("myDLC"));
+                errorHandler("myDLC");
 
                 from("direct:start").onException(IllegalArgumentException.class).handled(false).to("mock:handled").end()
                         .to("mock:a")
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java
index 3b8087cfa04..73af082df6b 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java
@@ -19,7 +19,6 @@ package org.apache.camel.issues;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
@@ -72,7 +71,7 @@ public class OnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest extends Cont
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                errorHandler(new ErrorHandlerBuilderRef("myDLC"));
+                errorHandler("myDLC");
 
                 from("direct:foo").to("mock:foo").throwException(new IllegalArgumentException("Damn Foo"));
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java
index 36de67ed835..969c670f983 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java
@@ -19,7 +19,6 @@ package org.apache.camel.issues;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
@@ -61,7 +60,7 @@ public class OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest extends Co
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:start").errorHandler(new ErrorHandlerBuilderRef("myDLC"))
+                from("direct:start").errorHandler("myDLC")
                         .onException(IllegalArgumentException.class).handled(false).to("mock:handled").end()
                         .to("mock:a").throwException(new IllegalArgumentException("Damn"));
             }
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
index 32411495be3..1476f58e4b9 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
@@ -19,7 +19,6 @@ package org.apache.camel.issues;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
@@ -72,10 +71,10 @@ public class OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest e
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:foo").errorHandler(new ErrorHandlerBuilderRef("myDLC")).to("mock:foo")
+                from("direct:foo").errorHandler("myDLC").to("mock:foo")
                         .throwException(new IllegalArgumentException("Damn Foo"));
 
-                from("direct:start").errorHandler(new ErrorHandlerBuilderRef("myDLC"))
+                from("direct:start").errorHandler("myDLC")
                         .onException(IllegalArgumentException.class).handled(false).to("mock:handled").end()
                         .to("mock:a").throwException(new IllegalArgumentException("Damn"));
             }
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTest.java
index 4eaf557345e..507f954142d 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTest.java
@@ -18,7 +18,6 @@ package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
@@ -51,7 +50,7 @@ public class OnExceptionRouteScopedErrorHandlerRefIssueTest extends ContextTestS
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:start").errorHandler(new ErrorHandlerBuilderRef("myDLC"))
+                from("direct:start").errorHandler("myDLC")
                         .onException(IllegalArgumentException.class).handled(true).to("mock:handled").end()
                         .to("mock:a").throwException(new IllegalArgumentException("Damn"));
             }
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
index 827b1dfa336..7764d10dd04 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
@@ -18,7 +18,6 @@ package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
@@ -62,10 +61,10 @@ public class OnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest extends Con
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:foo").errorHandler(new ErrorHandlerBuilderRef("myDLC")).to("mock:foo")
+                from("direct:foo").errorHandler("myDLC").to("mock:foo")
                         .throwException(new IllegalArgumentException("Damn Foo"));
 
-                from("direct:start").errorHandler(new ErrorHandlerBuilderRef("myDLC"))
+                from("direct:start").errorHandler("myDLC")
                         .onException(IllegalArgumentException.class).handled(true).to("mock:handled").end()
                         .to("mock:a").throwException(new IllegalArgumentException("Damn"));
             }
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/BodyOnlyAggregationStrategyTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/BodyOnlyAggregationStrategyTest.java
index ab577c834fb..854d781a8e7 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/BodyOnlyAggregationStrategyTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/BodyOnlyAggregationStrategyTest.java
@@ -18,9 +18,9 @@ package org.apache.camel.processor.aggregator;
 
 import org.apache.camel.AggregationStrategy;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExtendedExchange;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.junit.jupiter.api.Test;
 
@@ -45,11 +45,10 @@ public class BodyOnlyAggregationStrategyTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                DeadLetterChannelBuilder deadLetterChannelBuilder = deadLetterChannel("direct:error");
-                deadLetterChannelBuilder.setUseOriginalMessage(true);
+                ErrorHandlerFactory dh = deadLetterChannel("direct:error").useOriginalMessage();
 
                 from("direct:failingRoute")
-                        .errorHandler(deadLetterChannelBuilder)
+                        .errorHandler(dh)
                         .to("mock:failingRoute")
                         .throwException(new RuntimeException("Boem!"));
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/errorhandler/ErrorHandlerSupportTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/errorhandler/ErrorHandlerSupportTest.java
index 72a4231c33a..a89de983635 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/errorhandler/ErrorHandlerSupportTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/errorhandler/ErrorHandlerSupportTest.java
@@ -81,7 +81,7 @@ public class ErrorHandlerSupportTest extends ContextTestSupport {
 
     private static void addExceptionPolicy(
             ErrorHandlerSupport handlerSupport, Route route, OnExceptionDefinition exceptionType) {
-        new DefaultErrorHandlerReifier<>(route, null).addExceptionPolicy(handlerSupport, exceptionType);
+        new DefaultErrorHandlerReifier(route, null).addExceptionPolicy(handlerSupport, exceptionType);
     }
 
     private static String getExceptionPolicyFor(ErrorHandlerSupport support, Throwable childException, int index) {
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/errorhandler/NewDeadLetterChannelTest.java
similarity index 60%
copy from core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest.java
copy to core/camel-core/src/test/java/org/apache/camel/processor/errorhandler/NewDeadLetterChannelTest.java
index 9a74d3a07d1..92dabeaae81 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/errorhandler/NewDeadLetterChannelTest.java
@@ -14,48 +14,37 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.issues;
+package org.apache.camel.processor.errorhandler;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
-/**
- *
- */
-public class ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest extends ContextTestSupport {
+@Deprecated
+public class NewDeadLetterChannelTest extends ContextTestSupport {
 
     @Test
-    public void testOnExceptionErrorHandlerRef() throws Exception {
-        getMockEndpoint("mock:a").expectedMessageCount(1);
-        getMockEndpoint("mock:handled").expectedMessageCount(1);
-        getMockEndpoint("mock:dead").expectedMessageCount(0);
+    public void testNewDeadLetterChannel() throws Exception {
+        getMockEndpoint("mock:dead").expectedMessageCount(1);
 
         template.sendBody("direct:start", "Hello World");
 
         assertMockEndpointsSatisfied();
     }
 
-    @Override
-    protected Registry createRegistry() throws Exception {
-        Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
-        return jndi;
-    }
-
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
+                DeadLetterChannelBuilder dlc = new DeadLetterChannelBuilder();
+                dlc.setDeadLetterUri("mock:dead");
 
-                onException(IllegalArgumentException.class).handled(true).to("mock:handled").end();
+                errorHandler(dlc);
 
-                from("direct:start").errorHandler(new ErrorHandlerBuilderRef("myDLC")).to("mock:a")
-                        .throwException(new IllegalArgumentException("Damn"));
+                from("direct:start")
+                        .throwException(new IllegalArgumentException("Forced"));
             }
         };
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/exceptionpolicy/DefaultExceptionPolicyStrategyTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/exceptionpolicy/DefaultExceptionPolicyStrategyTest.java
index 7889cc3c793..5802957adc6 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/exceptionpolicy/DefaultExceptionPolicyStrategyTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/exceptionpolicy/DefaultExceptionPolicyStrategyTest.java
@@ -56,7 +56,7 @@ public class DefaultExceptionPolicyStrategyTest {
     private ExceptionPolicy exceptionPolicy(Class<? extends Throwable> exceptionClass) {
         CamelContext cc = new DefaultCamelContext();
         Route context = new DefaultRoute(cc, null, null, null, null, null);
-        return new DefaultErrorHandlerReifier<>(context, null)
+        return new DefaultErrorHandlerReifier(context, null)
                 .createExceptionPolicy(new OnExceptionDefinition(exceptionClass));
     }
 
diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
index f65a6c61597..a027585bad2 100644
--- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
+++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
@@ -29,12 +29,14 @@ import java.io.Reader;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import org.apache.camel.LoggingLevel;
 import org.apache.camel.model.*;
 import org.apache.camel.model.cloud.*;
 import org.apache.camel.model.config.BatchResequencerConfig;
 import org.apache.camel.model.config.ResequencerConfig;
 import org.apache.camel.model.config.StreamResequencerConfig;
 import org.apache.camel.model.dataformat.*;
+import org.apache.camel.model.errorhandler.*;
 import org.apache.camel.model.language.*;
 import org.apache.camel.model.loadbalancer.*;
 import org.apache.camel.model.rest.*;
@@ -377,6 +379,20 @@ public class ModelParser extends BaseParser {
             return true;
         }, expressionNodeElementHandler(), noValueHandler());
     }
+    protected ErrorHandlerDefinition doParseErrorHandlerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ErrorHandlerDefinition(),
+            identifiedTypeAttributeHandler(), (def, key) -> {
+            switch (key) {
+                case "deadLetterChannel": def.setErrorHandlerType(doParseDeadLetterChannelDefinition()); break;
+                case "defaultErrorHandler": def.setErrorHandlerType(doParseDefaultErrorHandlerDefinition()); break;
+                case "noErrorHandler": def.setErrorHandlerType(doParseNoErrorHandlerDefinition()); break;
+                case "jtaTransactionErrorHandler": def.setErrorHandlerType(doParseJtaTransactionErrorHandlerDefinition()); break;
+                case "springTransactionErrorHandler": def.setErrorHandlerType(doParseSpringTransactionErrorHandlerDefinition()); break;
+                default: return false;
+            }
+            return true;
+        }, noValueHandler());
+    }
     protected <T extends FaultToleranceConfigurationCommon> AttributeHandler<T> faultToleranceConfigurationCommonAttributeHandler() {
         return (def, key, val) -> {
             switch (key) {
@@ -667,7 +683,7 @@ public class ModelParser extends BaseParser {
                 case "retryAttemptedLogLevel": def.setRetryAttemptedLogLevel(val); break;
                 case "useCollisionAvoidance": def.setUseCollisionAvoidance(val); break;
                 case "useExponentialBackOff": def.setUseExponentialBackOff(val); break;
-                default: return false;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
             }
             return true;
         }, noElementHandler(), noValueHandler());
@@ -2500,6 +2516,78 @@ public class ModelParser extends BaseParser {
             return true;
         }, noElementHandler(), noValueHandler());
     }
+    protected DeadLetterChannelDefinition doParseDeadLetterChannelDefinition() throws IOException, XmlPullParserException {
+        return doParse(new DeadLetterChannelDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "deadLetterHandleNewException": def.setDeadLetterHandleNewException(val); break;
+                case "deadLetterUri": def.setDeadLetterUri(val); break;
+                default: return defaultErrorHandlerDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, defaultErrorHandlerDefinitionElementHandler(), noValueHandler());
+    }
+    protected <T extends DefaultErrorHandlerDefinition> AttributeHandler<T> defaultErrorHandlerDefinitionAttributeHandler() {
+        return (def, key, val) -> {
+            switch (key) {
+                case "executorServiceRef": def.setExecutorServiceRef(val); break;
+                case "level": def.setLevel(LoggingLevel.valueOf(val)); break;
+                case "logName": def.setLogName(val); break;
+                case "loggerRef": def.setLoggerRef(val); break;
+                case "onExceptionOccurredRef": def.setOnExceptionOccurredRef(val); break;
+                case "onPrepareFailureRef": def.setOnPrepareFailureRef(val); break;
+                case "onRedeliveryRef": def.setOnRedeliveryRef(val); break;
+                case "redeliveryPolicyRef": def.setRedeliveryPolicyRef(val); break;
+                case "retryWhileRef": def.setRetryWhileRef(val); break;
+                case "useOriginalBody": def.setUseOriginalBody(val); break;
+                case "useOriginalMessage": def.setUseOriginalMessage(val); break;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        };
+    }
+    protected <T extends DefaultErrorHandlerDefinition> ElementHandler<T> defaultErrorHandlerDefinitionElementHandler() {
+        return (def, key) -> {
+            if ("redeliveryPolicy".equals(key)) {
+                def.setRedeliveryPolicy(doParseRedeliveryPolicyDefinition());
+                return true;
+            }
+            return false;
+        };
+    }
+    protected DefaultErrorHandlerDefinition doParseDefaultErrorHandlerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new DefaultErrorHandlerDefinition(), defaultErrorHandlerDefinitionAttributeHandler(), defaultErrorHandlerDefinitionElementHandler(), noValueHandler());
+    }
+    protected ErrorHandlerRefDefinition doParseErrorHandlerRefDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ErrorHandlerRefDefinition(), (def, key, val) -> {
+            if ("ref".equals(key)) {
+                def.setRef(val);
+                return true;
+            }
+            return identifiedTypeAttributeHandler().accept(def, key, val);
+        }, noElementHandler(), noValueHandler());
+    }
+    protected JtaTransactionErrorHandlerDefinition doParseJtaTransactionErrorHandlerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new JtaTransactionErrorHandlerDefinition(),
+            transactionErrorHandlerDefinitionAttributeHandler(), defaultErrorHandlerDefinitionElementHandler(), noValueHandler());
+    }
+    protected <T extends TransactionErrorHandlerDefinition> AttributeHandler<T> transactionErrorHandlerDefinitionAttributeHandler() {
+        return (def, key, val) -> {
+            switch (key) {
+                case "rollbackLoggingLevel": def.setRollbackLoggingLevel(val); break;
+                case "transactedPolicyRef": def.setTransactedPolicyRef(val); break;
+                default: return defaultErrorHandlerDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        };
+    }
+    protected NoErrorHandlerDefinition doParseNoErrorHandlerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new NoErrorHandlerDefinition(),
+            identifiedTypeAttributeHandler(), noElementHandler(), noValueHandler());
+    }
+    protected SpringTransactionErrorHandlerDefinition doParseSpringTransactionErrorHandlerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new SpringTransactionErrorHandlerDefinition(),
+            transactionErrorHandlerDefinitionAttributeHandler(), defaultErrorHandlerDefinitionElementHandler(), noValueHandler());
+    }
     protected CSimpleExpression doParseCSimpleExpression() throws IOException, XmlPullParserException {
         return doParse(new CSimpleExpression(), (def, key, val) -> {
             if ("resultType".equals(key)) {
diff --git a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_17.adoc b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_17.adoc
index 4b2be4980e9..6fa76211adb 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_17.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_17.adoc
@@ -58,6 +58,32 @@ Or
             brokers: "mykafka:1234"
 ----
 
+=== camel-spring-xml / camel-blueprint
+
+The error handling has been made universal and exposed generally in the `camel-core-model`
+with intent to align error handling across DSLs.
+
+However, the XML DSL for Spring `<beans>` and OSGi blueprint is legacy, and they
+have their own special XML parsing and error handling.
+
+This means the model classes has been renamed, which only affect Camel end users whom
+has defined error handling as `<bean>` in Spring or Blueprint XML files:
+
+- `org.apache.camel.builder.DeadLetterChannelBuilder` to `org.apache.camel.builder.LegacyDeadLetterChannelBuilder`
+- `org.apache.camel.builder.DefaultErrorHandlerBuilder` to `org.apache.camel.builder.LegacyDefaultErrorHandlerBuilder`
+- `org.apache.camel.builder.NoErrorHandlerBuilder` to `org.apache.camel.builder.LegacyNoErrorHandlerBuilder`
+- `org.apache.camel.spring.spi.TransactionErrorHandlerBuilder` to `org.apache.camel.spring.spi.LegacyTransactionErrorHandlerBuilder`
+
+Users who has been configured error handling using `<errorHandler>` in Spring or Blueprint XML files should not be affected.
+
+=== camel-cdi / camel-cdi-jta
+
+The class `org.apache.camel.cdi.CdiRouteBuilder` has been removed as you can use `jtaTransactionErrorHandler` builder
+methods from `camel-core` instead.
+
+The class `org.apache.canel.jta.JtaTransactionErrorHandlerBuilder` has been removed, as the JTA error handler builder
+can be used with the `jtaTransactionErrorHandler` from `camel-core-model`.
+
 === camel-kafka
 
 The option `autoCommitOnStop` was removed from the Camel Kafka component. When using `autoCommitEnable` (which is enabled by default) the Kafka consumer will automatically commit on close.
@@ -70,28 +96,4 @@ Asynchronous, Synchronous or NO-OP commit policies from the former `autoCommitOn
 * Async can be set using `kafkaManualCommitFactory=#class:org.apache.camel.component.kafka.consumer.DefaultKafkaManualAsyncCommitFactory`
 * Sync can be set using `kafkaManualCommitFactory=#class:org.apache.camel.component.kafka.consumer.DefaultKafkaManualCommitFactory`
 
-=== camel-cdi
-
-The support for the Camel XML configuration import, that had been marked as deprecated in previous releases, was removed.
-
-=== Deprecated Components
-
-The following components that had been marked as deprecated, were removed in this release:
-
-* camel-atomix
-* camel-beanstalk
-* camel-beanio
-* camel-etcd 
-* camel-elsql 
-* camel-ganglia 
-* camel-nsq 
-* camel-hystrix 
-* camel-jing 
-* camel-leveldb-legacy 
-* camel-msv 
-* camel-nagios 
-* camel-ribbon 
-* camel-sip 
-* camel-soroush 
-* camel-tagsoup 
-* camel-yammer
+
diff --git a/dsl/camel-groovy-dsl/camel-groovy-dsl-common/src/main/groovy/org/apache/camel/dsl/groovy/common/GroovyDSL.groovy b/dsl/camel-groovy-dsl/camel-groovy-dsl-common/src/main/groovy/org/apache/camel/dsl/groovy/common/GroovyDSL.groovy
index 2258c5e4d45..1168ea71237 100644
--- a/dsl/camel-groovy-dsl/camel-groovy-dsl-common/src/main/groovy/org/apache/camel/dsl/groovy/common/GroovyDSL.groovy
+++ b/dsl/camel-groovy-dsl/camel-groovy-dsl-common/src/main/groovy/org/apache/camel/dsl/groovy/common/GroovyDSL.groovy
@@ -16,13 +16,13 @@
  */
 package org.apache.camel.dsl.groovy.common
 
+import org.apache.camel.ErrorHandlerFactory
 import org.apache.camel.Exchange
 import org.apache.camel.Expression
 import org.apache.camel.Predicate
 import org.apache.camel.Processor
 import org.apache.camel.builder.BuilderSupport
 import org.apache.camel.builder.EndpointConsumerBuilder
-import org.apache.camel.builder.ErrorHandlerBuilder
 import org.apache.camel.builder.endpoint.EndpointBuilderFactory
 import org.apache.camel.builder.endpoint.EndpointRouteBuilder
 import org.apache.camel.dsl.groovy.common.model.BeansConfiguration
@@ -114,7 +114,7 @@ class GroovyDSL extends BuilderSupport implements EndpointBuilderFactory {
         return builder.interceptSendToEndpoint(uri)
     }
 
-    void errorHandler(ErrorHandlerBuilder handler) {
+    void errorHandler(ErrorHandlerFactory handler) {
         builder.errorHandler(handler)
     }
 
diff --git a/dsl/camel-js-dsl/src/main/java/org/apache/camel/dsl/js/JavaScriptDSL.java b/dsl/camel-js-dsl/src/main/java/org/apache/camel/dsl/js/JavaScriptDSL.java
index 295d82bf7da..24ede56e15f 100644
--- a/dsl/camel-js-dsl/src/main/java/org/apache/camel/dsl/js/JavaScriptDSL.java
+++ b/dsl/camel-js-dsl/src/main/java/org/apache/camel/dsl/js/JavaScriptDSL.java
@@ -19,11 +19,11 @@ package org.apache.camel.dsl.js;
 import java.util.function.Consumer;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.BuilderSupport;
 import org.apache.camel.builder.EndpointConsumerBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.builder.endpoint.EndpointBuilderFactory;
 import org.apache.camel.builder.endpoint.EndpointRouteBuilder;
 import org.apache.camel.model.InterceptDefinition;
@@ -89,7 +89,7 @@ public class JavaScriptDSL extends BuilderSupport implements EndpointBuilderFact
         return builder.interceptSendToEndpoint(uri);
     }
 
-    public void errorHandler(ErrorHandlerBuilder handler) {
+    public void errorHandler(ErrorHandlerFactory handler) {
         builder.errorHandler(handler);
     }
 
diff --git a/dsl/camel-kotlin-dsl/src/main/kotlin/org/apache/camel/dsl/kotlin/KotlinDSL.kt b/dsl/camel-kotlin-dsl/src/main/kotlin/org/apache/camel/dsl/kotlin/KotlinDSL.kt
index 27212cee092..08e87fe2238 100644
--- a/dsl/camel-kotlin-dsl/src/main/kotlin/org/apache/camel/dsl/kotlin/KotlinDSL.kt
+++ b/dsl/camel-kotlin-dsl/src/main/kotlin/org/apache/camel/dsl/kotlin/KotlinDSL.kt
@@ -16,12 +16,12 @@
  */
 package org.apache.camel.dsl.kotlin
 
+import org.apache.camel.ErrorHandlerFactory
 import org.apache.camel.Exchange
 import org.apache.camel.Predicate
 import org.apache.camel.Processor
 import org.apache.camel.builder.BuilderSupport
 import org.apache.camel.builder.EndpointConsumerBuilder
-import org.apache.camel.builder.ErrorHandlerBuilder
 import org.apache.camel.builder.endpoint.EndpointBuilderFactory
 import org.apache.camel.builder.endpoint.EndpointRouteBuilder
 import org.apache.camel.dsl.kotlin.model.BeansConfiguration
@@ -83,7 +83,7 @@ abstract class KotlinDSL(
         return builder.interceptSendToEndpoint(uri)
     }
 
-    fun errorHandler(handler: ErrorHandlerBuilder) {
+    fun errorHandler(handler: ErrorHandlerFactory) {
         builder.errorHandler(handler)
     }
 
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml
index f674fa1650e..76ba5adf726 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml
@@ -143,11 +143,6 @@
                             <additionalDefinitions>
                                 <!-- saga -->
                                 <additionalDefinition>org.apache.camel.model.SagaActionUriDefinition</additionalDefinition>
-                                <!-- error handler -->
-                                <additionalDefinition>org.apache.camel.builder.DeadLetterChannelBuilder</additionalDefinition>
-                                <additionalDefinition>org.apache.camel.builder.ErrorHandlerBuilderRef</additionalDefinition>
-                                <additionalDefinition>org.apache.camel.builder.NoErrorHandlerBuilder</additionalDefinition>
-                                <additionalDefinition>org.apache.camel.builder.DefaultErrorHandlerBuilder</additionalDefinition>
                             </additionalDefinitions>
                         </configuration>
                     </execution>
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
index d45f255a177..5c9b999cbb7 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
@@ -6,10 +6,6 @@ import java.lang.Override;
 import java.lang.String;
 import java.util.Map;
 import org.apache.camel.CamelContext;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.DefaultErrorHandlerBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
-import org.apache.camel.builder.NoErrorHandlerBuilder;
 import org.apache.camel.dsl.yaml.common.YamlDeserializerBase;
 import org.apache.camel.dsl.yaml.common.YamlDeserializerEndpointAwareBase;
 import org.apache.camel.dsl.yaml.common.YamlDeserializerSupport;
@@ -26,6 +22,7 @@ import org.apache.camel.model.DelayDefinition;
 import org.apache.camel.model.DescriptionDefinition;
 import org.apache.camel.model.DynamicRouterDefinition;
 import org.apache.camel.model.EnrichDefinition;
+import org.apache.camel.model.ErrorHandlerDefinition;
 import org.apache.camel.model.FaultToleranceConfigurationDefinition;
 import org.apache.camel.model.FilterDefinition;
 import org.apache.camel.model.FinallyDefinition;
@@ -166,6 +163,12 @@ import org.apache.camel.model.dataformat.YAMLDataFormat;
 import org.apache.camel.model.dataformat.YAMLTypeFilterDefinition;
 import org.apache.camel.model.dataformat.ZipDeflaterDataFormat;
 import org.apache.camel.model.dataformat.ZipFileDataFormat;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
+import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
+import org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.SpringTransactionErrorHandlerDefinition;
 import org.apache.camel.model.language.CSimpleExpression;
 import org.apache.camel.model.language.ConstantExpression;
 import org.apache.camel.model.language.DatasonnetExpression;
@@ -3807,48 +3810,46 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
     }
 
     @YamlType(
-            inline = true,
-            types = org.apache.camel.builder.DeadLetterChannelBuilder.class,
+            types = org.apache.camel.model.errorhandler.DeadLetterChannelDefinition.class,
             order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
+            nodes = {
+                    "dead-letter-channel",
+                    "deadLetterChannel"
+            },
             properties = {
-                    @YamlProperty(name = "async-delayed-redelivery", type = "boolean"),
                     @YamlProperty(name = "dead-letter-handle-new-exception", type = "boolean"),
-                    @YamlProperty(name = "dead-letter-uri", type = "string"),
+                    @YamlProperty(name = "dead-letter-uri", type = "string", required = true),
                     @YamlProperty(name = "executor-service-ref", type = "string"),
+                    @YamlProperty(name = "id", type = "string"),
+                    @YamlProperty(name = "level", type = "enum:DEBUG,ERROR,INFO,OFF,TRACE,WARN"),
+                    @YamlProperty(name = "log-name", type = "string"),
+                    @YamlProperty(name = "logger-ref", type = "string"),
                     @YamlProperty(name = "on-exception-occurred-ref", type = "string"),
                     @YamlProperty(name = "on-prepare-failure-ref", type = "string"),
                     @YamlProperty(name = "on-redelivery-ref", type = "string"),
+                    @YamlProperty(name = "redelivery-policy", type = "object:org.apache.camel.model.RedeliveryPolicyDefinition"),
+                    @YamlProperty(name = "redelivery-policy-ref", type = "string"),
                     @YamlProperty(name = "retry-while-ref", type = "string"),
                     @YamlProperty(name = "use-original-body", type = "boolean"),
                     @YamlProperty(name = "use-original-message", type = "boolean")
             }
     )
-    public static class DeadLetterChannelBuilderDeserializer extends YamlDeserializerBase<DeadLetterChannelBuilder> {
-        public DeadLetterChannelBuilderDeserializer() {
-            super(DeadLetterChannelBuilder.class);
-        }
-
-        @Override
-        protected DeadLetterChannelBuilder newInstance() {
-            return new DeadLetterChannelBuilder();
+    public static class DeadLetterChannelDefinitionDeserializer extends YamlDeserializerBase<DeadLetterChannelDefinition> {
+        public DeadLetterChannelDefinitionDeserializer() {
+            super(DeadLetterChannelDefinition.class);
         }
 
         @Override
-        protected DeadLetterChannelBuilder newInstance(String value) {
-            return new DeadLetterChannelBuilder(value);
+        protected DeadLetterChannelDefinition newInstance() {
+            return new DeadLetterChannelDefinition();
         }
 
         @Override
-        protected boolean setProperty(DeadLetterChannelBuilder target, String propertyKey,
+        protected boolean setProperty(DeadLetterChannelDefinition target, String propertyKey,
                 String propertyName, Node node) {
             switch(propertyKey) {
-                case "async-delayed-redelivery": {
-                    boolean val = asBoolean(node);
-                    target.setAsyncDelayedRedelivery(val);
-                    break;
-                }
                 case "dead-letter-handle-new-exception": {
-                    boolean val = asBoolean(node);
+                    String val = asText(node);
                     target.setDeadLetterHandleNewException(val);
                     break;
                 }
@@ -3862,6 +3863,25 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setExecutorServiceRef(val);
                     break;
                 }
+                case "id": {
+                    String val = asText(node);
+                    target.setId(val);
+                    break;
+                }
+                case "level": {
+                    target.setLevel(asEnum(node, org.apache.camel.LoggingLevel.class));
+                    break;
+                }
+                case "log-name": {
+                    String val = asText(node);
+                    target.setLogName(val);
+                    break;
+                }
+                case "logger-ref": {
+                    String val = asText(node);
+                    target.setLoggerRef(val);
+                    break;
+                }
                 case "on-exception-occurred-ref": {
                     String val = asText(node);
                     target.setOnExceptionOccurredRef(val);
@@ -3877,18 +3897,28 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setOnRedeliveryRef(val);
                     break;
                 }
+                case "redelivery-policy": {
+                    org.apache.camel.model.RedeliveryPolicyDefinition val = asType(node, org.apache.camel.model.RedeliveryPolicyDefinition.class);
+                    target.setRedeliveryPolicy(val);
+                    break;
+                }
+                case "redelivery-policy-ref": {
+                    String val = asText(node);
+                    target.setRedeliveryPolicyRef(val);
+                    break;
+                }
                 case "retry-while-ref": {
                     String val = asText(node);
                     target.setRetryWhileRef(val);
                     break;
                 }
                 case "use-original-body": {
-                    boolean val = asBoolean(node);
+                    String val = asText(node);
                     target.setUseOriginalBody(val);
                     break;
                 }
                 case "use-original-message": {
-                    boolean val = asBoolean(node);
+                    String val = asText(node);
                     target.setUseOriginalMessage(val);
... 1865 lines suppressed ...