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 2018/02/06 17:12:45 UTC

[camel] branch master updated (e11907e -> ffa712f)

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

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


    from e11907e  Upgrade Activemq to version 5.15.3
     new 8c32d97  CAMEL-8958: Claim Check EIP with push/pop.
     new ffa712f  Regen docs

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 camel-core/readme-eip.adoc                         |   5 +-
 camel-core/src/main/docs/eips/claimCheck-eip.adoc  | 258 +++++++++++++++++
 camel-core/src/main/docs/eips/hystrix-eip.adoc     |   2 +-
 .../src/main/java/org/apache/camel/Exchange.java   |  17 +-
 .../management/mbean/ManagedClaimCheckMBean.java   |  32 +++
 .../camel/impl/DefaultClaimCheckRepository.java    |  84 ++++++
 .../DefaultManagementObjectStrategy.java           |   4 +
 .../camel/management/mbean/ManagedClaimCheck.java  |  57 ++++
 .../apache/camel/model/ClaimCheckDefinition.java   | 291 +++++++++++++++++++
 .../apache/camel/model/ClaimCheckOperation.java    |  31 ++
 .../apache/camel/model/ProcessorDefinition.java    |  55 ++++
 .../processor/ClaimCheckAggregationStrategy.java   | 318 +++++++++++++++++++++
 .../camel/processor/ClaimCheckProcessor.java       | 203 +++++++++++++
 .../org/apache/camel/spi/ClaimCheckRepository.java |  79 +++++
 .../java/org/apache/camel/util/ExchangeHelper.java |   2 +-
 .../resources/org/apache/camel/model/jaxb.index    |   2 +
 .../ClaimCheckEipGetAndRemoveSetTest.java          |  57 ++++
 .../camel/processor/ClaimCheckEipGetSetTest.java   |  56 ++++
 .../processor/ClaimCheckEipPushPopBodyTest.java    |  55 ++++
 .../ClaimCheckEipPushPopExcludeBodyTest.java       |  60 ++++
 .../ClaimCheckEipPushPopHeadersPatternTest.java    |  73 +++++
 .../processor/ClaimCheckEipPushPopHeadersTest.java |  55 ++++
 .../ClaimCheckEipPushPopRemoveHeaderTest.java      |  60 ++++
 .../camel/processor/ClaimCheckEipPushPopTest.java  |  50 ++++
 .../SpringClaimCheckEipGetAndRemoveSetTest.java    |  29 ++
 .../processor/SpringClaimCheckEipGetSetTest.java   |  29 ++
 .../SpringClaimCheckEipPushPopBodyTest.java        |  29 ++
 ...ringClaimCheckEipPushPopHeadersPatternTest.java |  29 ++
 .../SpringClaimCheckEipPushPopHeadersTest.java     |  29 ++
 ...SpringClaimCheckEipPushPopRemoveHeaderTest.java |  29 ++
 .../processor/SpringClaimCheckEipPushPopTest.java  |  29 ++
 .../processor/ClaimCheckEipGetAndRemoveSetTest.xml |  47 +++
 .../spring/processor/ClaimCheckEipGetSetTest.xml   |  47 +++
 .../processor/ClaimCheckEipPushPopBodyTest.xml     |  44 +++
 .../ClaimCheckEipPushPopHeadersPatternTest.xml     |  45 +++
 .../processor/ClaimCheckEipPushPopHeadersTest.xml  |  44 +++
 .../ClaimCheckEipPushPopRemoveHeaderTest.xml       |  51 ++++
 .../spring/processor/ClaimCheckEipPushPopTest.xml  |  41 +++
 components/readme.adoc                             |   5 +-
 docs/user-manual/en/SUMMARY.md                     |   1 +
 40 files changed, 2422 insertions(+), 12 deletions(-)
 create mode 100644 camel-core/src/main/docs/eips/claimCheck-eip.adoc
 create mode 100644 camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedClaimCheckMBean.java
 create mode 100644 camel-core/src/main/java/org/apache/camel/impl/DefaultClaimCheckRepository.java
 create mode 100644 camel-core/src/main/java/org/apache/camel/management/mbean/ManagedClaimCheck.java
 create mode 100644 camel-core/src/main/java/org/apache/camel/model/ClaimCheckDefinition.java
 create mode 100644 camel-core/src/main/java/org/apache/camel/model/ClaimCheckOperation.java
 create mode 100644 camel-core/src/main/java/org/apache/camel/processor/ClaimCheckAggregationStrategy.java
 create mode 100644 camel-core/src/main/java/org/apache/camel/processor/ClaimCheckProcessor.java
 create mode 100644 camel-core/src/main/java/org/apache/camel/spi/ClaimCheckRepository.java
 create mode 100644 camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipGetAndRemoveSetTest.java
 create mode 100644 camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipGetSetTest.java
 create mode 100644 camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopBodyTest.java
 create mode 100644 camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopExcludeBodyTest.java
 create mode 100644 camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopHeadersPatternTest.java
 create mode 100644 camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopHeadersTest.java
 create mode 100644 camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopRemoveHeaderTest.java
 create mode 100644 camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopTest.java
 create mode 100644 components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipGetAndRemoveSetTest.java
 create mode 100644 components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipGetSetTest.java
 create mode 100644 components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopBodyTest.java
 create mode 100644 components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopHeadersPatternTest.java
 create mode 100644 components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopHeadersTest.java
 create mode 100644 components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopRemoveHeaderTest.java
 create mode 100644 components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopTest.java
 create mode 100644 components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipGetAndRemoveSetTest.xml
 create mode 100644 components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipGetSetTest.xml
 create mode 100644 components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopBodyTest.xml
 create mode 100644 components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopHeadersPatternTest.xml
 create mode 100644 components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopHeadersTest.xml
 create mode 100644 components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopRemoveHeaderTest.xml
 create mode 100644 components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopTest.xml

-- 
To stop receiving notification emails like this one, please contact
davsclaus@apache.org.

[camel] 01/02: CAMEL-8958: Claim Check EIP with push/pop.

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8c32d97235ae0e286123948238b5ceebd5eaa718
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Feb 6 16:44:07 2018 +0100

    CAMEL-8958: Claim Check EIP with push/pop.
---
 camel-core/readme-eip.adoc                         |   5 +-
 camel-core/src/main/docs/eips/claimCheck-eip.adoc  | 258 +++++++++++++++++
 camel-core/src/main/docs/eips/hystrix-eip.adoc     |   2 +-
 .../src/main/java/org/apache/camel/Exchange.java   |  17 +-
 .../management/mbean/ManagedClaimCheckMBean.java   |  32 +++
 .../camel/impl/DefaultClaimCheckRepository.java    |  84 ++++++
 .../DefaultManagementObjectStrategy.java           |   4 +
 .../camel/management/mbean/ManagedClaimCheck.java  |  57 ++++
 .../apache/camel/model/ClaimCheckDefinition.java   | 291 +++++++++++++++++++
 .../apache/camel/model/ClaimCheckOperation.java    |  31 ++
 .../apache/camel/model/ProcessorDefinition.java    |  55 ++++
 .../processor/ClaimCheckAggregationStrategy.java   | 318 +++++++++++++++++++++
 .../camel/processor/ClaimCheckProcessor.java       | 203 +++++++++++++
 .../org/apache/camel/spi/ClaimCheckRepository.java |  79 +++++
 .../java/org/apache/camel/util/ExchangeHelper.java |   2 +-
 .../resources/org/apache/camel/model/jaxb.index    |   2 +
 .../ClaimCheckEipGetAndRemoveSetTest.java          |  57 ++++
 .../camel/processor/ClaimCheckEipGetSetTest.java   |  56 ++++
 .../processor/ClaimCheckEipPushPopBodyTest.java    |  55 ++++
 .../ClaimCheckEipPushPopExcludeBodyTest.java       |  60 ++++
 .../ClaimCheckEipPushPopHeadersPatternTest.java    |  73 +++++
 .../processor/ClaimCheckEipPushPopHeadersTest.java |  55 ++++
 .../ClaimCheckEipPushPopRemoveHeaderTest.java      |  60 ++++
 .../camel/processor/ClaimCheckEipPushPopTest.java  |  50 ++++
 .../SpringClaimCheckEipGetAndRemoveSetTest.java    |  29 ++
 .../processor/SpringClaimCheckEipGetSetTest.java   |  29 ++
 .../SpringClaimCheckEipPushPopBodyTest.java        |  29 ++
 ...ringClaimCheckEipPushPopHeadersPatternTest.java |  29 ++
 .../SpringClaimCheckEipPushPopHeadersTest.java     |  29 ++
 ...SpringClaimCheckEipPushPopRemoveHeaderTest.java |  29 ++
 .../processor/SpringClaimCheckEipPushPopTest.java  |  29 ++
 .../processor/ClaimCheckEipGetAndRemoveSetTest.xml |  47 +++
 .../spring/processor/ClaimCheckEipGetSetTest.xml   |  47 +++
 .../processor/ClaimCheckEipPushPopBodyTest.xml     |  44 +++
 .../ClaimCheckEipPushPopHeadersPatternTest.xml     |  45 +++
 .../processor/ClaimCheckEipPushPopHeadersTest.xml  |  44 +++
 .../ClaimCheckEipPushPopRemoveHeaderTest.xml       |  51 ++++
 .../spring/processor/ClaimCheckEipPushPopTest.xml  |  41 +++
 38 files changed, 2417 insertions(+), 11 deletions(-)

diff --git a/camel-core/readme-eip.adoc b/camel-core/readme-eip.adoc
index c7474f3..3d652eb 100644
--- a/camel-core/readme-eip.adoc
+++ b/camel-core/readme-eip.adoc
@@ -4,7 +4,7 @@ Enterprise Integration Patterns
 Camel supports most of the link:http://www.eaipatterns.com/toc.html[Enterprise Integration Patterns] from the excellent book by link:http://www.amazon.com/exec/obidos/search-handle-url/105-9796798-8100401?%5Fencoding=UTF8&search-type=ss&index=books&field-author=Gregor%20Hohpe[Gregor Hohpe] and link:http://www.amazon.com/exec/obidos/search-handle-url/105-9796798-8100401?%5Fencoding=UTF8&search-type=ss&index=books&field-author=Bobby%20Woolf[Bobby Woolf].
 
 // eips: START
-Number of EIPs: 63 (2 deprecated)
+Number of EIPs: 64 (2 deprecated)
 
 [width="100%",cols="4,6",options="header"]
 |===
@@ -25,6 +25,9 @@ Number of EIPs: 63 (2 deprecated)
 | link:src/main/docs/eips/circuitBreaker-eip.adoc[Circuit Breaker] +
 `<circuitBreaker>` | *deprecated* Circuit break load balancer
 
+| link:src/main/docs/eips/claimCheck-eip.adoc[Claim Check] +
+`<claimCheck>` | The Claim Check EIP allows you to replace message content with a claim check (a unique key) which can be used to retrieve the message content at a later time.
+
 | link:src/main/docs/eips/convertBodyTo-eip.adoc[Convert Body To] +
 `<convertBodyTo>` | Converts the message body to another type
 
diff --git a/camel-core/src/main/docs/eips/claimCheck-eip.adoc b/camel-core/src/main/docs/eips/claimCheck-eip.adoc
new file mode 100644
index 0000000..8e8af58
--- /dev/null
+++ b/camel-core/src/main/docs/eips/claimCheck-eip.adoc
@@ -0,0 +1,258 @@
+[[claimCheck-eip]]
+== Claim Check EIP
+
+*Available as of Camel 2.21*
+
+The link:http://www.enterpriseintegrationpatterns.com/patterns/messaging/StoreInLibrary.html[Claim Check] from the link:../../../../readme-eip.adoc[EIP patterns]
+allows you to replace message content with a claim check (a unique key), which can be used to retrieve the message content at a later time.
+
+image:http://www.enterpriseintegrationpatterns.com/img/StoreInLibrary.gif[image]
+
+It can also be useful in situations where you cannot trust the information with an outside party; in this case, you can use the Claim Check to hide the sensitive portions of data.
+
+NOTE: The Camel implementation of this EIP pattern stores the message content temporarily in an internal memory store.
+
+
+// eip options: START
+The Claim Check EIP supports 5 options which are listed below:
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *operation* | *Required* The claim check operation to use. The following operations is supported: Get - Gets (does not remove) the claim check by the given key. GetAndRemove - Gets and remove the claim check by the given key. Set - Sets a new (will override if key already exists) claim check with the given key. Push - Sets a new claim check on the stack (does not use key). Pop - Gets the latest claim check from the stack (does not use key). |  | ClaimCheckOperation
+| *key* | To use a specific key for claim check id. |  | String
+| *filter* | Specified a filter to control what data gets merging data back from the claim check repository. The following syntax is supported: body - to aggregate the message body attachments - to aggregate all the message attachments headers - to aggregate all the message headers header:pattern - to aggregate all the message headers that matches the pattern. The pattern syntax is documented by: link EndpointHelpermatchPattern(String String). You can specify multiple rules separated by  [...]
+| *strategyRef* | To use a custom AggregationStrategy instead of the default implementation. Notice you cannot use both custom aggregation strategy and configure data at the same time. |  | String
+| *strategyMethodName* | This option can be used to explicit declare the method name to use when using POJOs as the AggregationStrategy. |  | String
+|===
+// eip options: END
+
+
+=== Claim Check Operation
+
+When using this EIP you must specify the operation to use which can be of the following:
+
+* Get - Gets (does not remove) the claim check by the given key.
+* GetAndRemove - Gets and remove the claim check by the given key.
+* Set - Sets a new (will override if key already exists) claim check with the given key.
+* Push - Sets a new claim check on the stack (does not use key).
+* Pop - Gets the latest claim check from the stack (does not use key).
+
+When using the `Get`, `GetAndRemove`, or `Set` operation you must specify a key.
+These operations will then store and retrieve the data using this key. You can use this to store multiple data in different keys.
+
+The `Push` and `Pop` operations do *not* use a key but stores the data in a stack structure.
+
+
+=== Filter what data to merge back
+
+The `filter` option is used to define what data to merge back when using the `Get` or `Pop` operation. When data is merged back
+then its merged using a `AggregationStrategy`. The default strategy uses the `filter` option to easily specify what data to merge back.
+
+The `filter` option takes a `String` value with the following syntax:
+
+* `body` = to aggregate the message body
+* `attachments` = to aggregate all the message attachments
+* `headers` = to aggregate all the message headers
+* `header:pattern` = to aggregate all the message headers that matches the pattern.
+
+The pattern rule supports wildcard and regular expression:
+
+* wildcard match (pattern ends with a `*` and the name starts with the pattern)
+* regular expression match
+
+You can specify multiple rules separated by comma.
+
+==== Basic filter examples
+
+For example to include the message body and all headers starting with _foo_:
+
+[text]
+----
+body,header:foo*
+----
+
+To only merge back the message body:
+
+[text]
+----
+body
+----
+
+To only merge back the message attachments:
+
+[text]
+----
+attachments
+----
+
+To only merge back headers:
+
+[text]
+----
+headers
+----
+
+To only merge back a header name foo:
+
+[text]
+----
+header:foo
+----
+
+If the filter rule is specified as empty or as wildcard then everything is merged.
+
+Notice that when merging back data, then any existing data is overwritten, and any other existing data is preserved.
+
+==== Fine grained filtering with include and explude pattern
+
+The syntax also supports the following prefixes which can be used to specify include,exclude, or remove
+
+* `+` = to include (which is the default mode)
+* `-` = to exclude (exclude takes precedence over include)
+* `--` = to remove (remove takes precedence)
+
+For example to skip the message body, and merge back everything else
+----
+-body
+----
+
+Or to skip the message header foo, and merge back everything else
+----
+-header:foo
+----
+
+You can also instruct to remove headers when merging data back, for example to remove all headers starting with _bar_:
+----
+--headers:bar*
+----
+
+Note you cannot have both include (`+`) and exclude (`-`) `header:pattern` at the same time.
+
+
+=== Java Examples
+
+The following example shows the `Push` and `Pop` operations in action;
+
+[java]
+----
+from("direct:start")
+    .to("mock:a")
+    .claimCheck(ClaimCheckOperation.Push)
+    .transform().constant("Bye World")
+    .to("mock:b")
+    .claimCheck(ClaimCheckOperation.Pop)
+    .to("mock:c");
+----
+
+For example if the message body from the beginning is `Hello World` then that data is pushed on the stack of the Claim Check EIP.
+And then the message body is transformed to `Bye World`, which is what `mock:b` endpoint receives. When we `Pop` from the Claim Check EIP
+then the original message body is retrieved and merged back so `mock:c` will retrieve the message body with `Hello World`.
+
+Here is an example using `Get` and `Set` operations, which uses the key `foo`:
+
+[java]
+----
+from("direct:start")
+    .to("mock:a")
+    .claimCheck(ClaimCheckOperation.Set, "foo")
+    .transform().constant("Bye World")
+    .to("mock:b")
+    .claimCheck(ClaimCheckOperation.Get, "foo")
+    .to("mock:c")
+    .transform().constant("Hi World")
+    .to("mock:d")
+    .claimCheck(ClaimCheckOperation.Get, "foo")
+    .to("mock:e");
+----
+
+Notice how we can `Get` the same data twice using the `Get` operation as it will not remove the data. If you only want
+to get the data once, you can use `GetAndRemove`.
+
+The last example shows how to use the `filter` option where we only want to get back header named `foo` or `bar`:
+
+[java]
+----
+from("direct:start")
+    .to("mock:a")
+    .claimCheck(ClaimCheckOperation.Push)
+    .transform().constant("Bye World")
+    .setHeader("foo", constant(456))
+    .removeHeader("bar")
+    .to("mock:b")
+    // only merge in the message headers foo or bar
+    .claimCheck(ClaimCheckOperation.Pop, null, "header:(foo|bar)")
+    .to("mock:c");
+----
+
+=== XML examples
+
+The following example shows the `Push` and `Pop` operations in action;
+
+[xml]
+----
+<route>
+  <from uri="direct:start"/>
+  <to uri="mock:a"/>
+  <claimCheck operation="Push"/>
+  <transform>
+    <constant>Bye World</constant>
+  </transform>
+  <to uri="mock:b"/>
+  <claimCheck operation="Pop"/>
+  <to uri="mock:c"/>
+</route>
+----
+
+For example if the message body from the beginning is `Hello World` then that data is pushed on the stack of the Claim Check EIP.
+And then the message body is transformed to `Bye World`, which is what `mock:b` endpoint receives. When we `Pop` from the Claim Check EIP
+then the original message body is retrieved and merged back so `mock:c` will retrieve the message body with `Hello World`.
+
+Here is an example using `Get` and `Set` operations, which uses the key `foo`:
+
+[xml]
+----
+<route>
+  <from uri="direct:start"/>
+  <to uri="mock:a"/>
+  <claimCheck operation="Set" key="foo"/>
+  <transform>
+    <constant>Bye World</constant>
+  </transform>
+  <to uri="mock:b"/>
+  <claimCheck operation="Get" key="foo"/>
+  <to uri="mock:c"/>
+  <transform>
+    <constant>Hi World</constant>
+  </transform>
+  <to uri="mock:d"/>
+  <claimCheck operation="Get" key="foo"/>
+  <to uri="mock:e"/>
+</route>
+----
+
+Notice how we can `Get` the same data twice using the `Get` operation as it will not remove the data. If you only want
+to get the data once, you can use `GetAndRemove`.
+
+The last example shows how to use the `filter` option where we only want to get back header named `foo` or `bar`:
+
+[xml]
+----
+<route>
+  <from uri="direct:start"/>
+  <to uri="mock:a"/>
+  <claimCheck operation="Push"/>
+  <transform>
+    <constant>Bye World</constant>
+  </transform>
+  <setHeader headerName="foo">
+    <constant>456</constant>
+  </setHeader>
+  <removeHeader headerName="bar"/>
+  <to uri="mock:b"/>
+  <!-- only merge in the message headers foo or bar -->
+  <claimCheck operation="Pop" filter="header:(foo|bar)"/>
+  <to uri="mock:c"/>
+</route>
+----
diff --git a/camel-core/src/main/docs/eips/hystrix-eip.adoc b/camel-core/src/main/docs/eips/hystrix-eip.adoc
index 3cfd897..fd598ad 100644
--- a/camel-core/src/main/docs/eips/hystrix-eip.adoc
+++ b/camel-core/src/main/docs/eips/hystrix-eip.adoc
@@ -1,7 +1,7 @@
 [[hystrix-eip]]
 == Hystrix EIP
 
-Available as of Camel 2.18
+*Available as of Camel 2.18*
 
 The Hystrix EIP provides integration with Netflix link:https://github.com/Netflix/Hystrix[Hystrix] to be used as circuit breaker in the Camel routes. Hystrix is a latency and fault tolerance library designed to isolate points of access to remote systems, services and 3rd party libraries, stop cascading failure and enable resilience in complex distributed systems where failure is inevitable.
 
diff --git a/camel-core/src/main/java/org/apache/camel/Exchange.java b/camel-core/src/main/java/org/apache/camel/Exchange.java
index 541ea16..6ca2ac6 100644
--- a/camel-core/src/main/java/org/apache/camel/Exchange.java
+++ b/camel-core/src/main/java/org/apache/camel/Exchange.java
@@ -97,14 +97,15 @@ public interface Exchange {
     // used across other Apache products such as AMQ, SMX etc.
     String BREADCRUMB_ID              = "breadcrumbId";
 
-    String CHARSET_NAME          = "CamelCharsetName";
-    String CIRCUIT_BREAKER_STATE = "CamelCircuitBreakerState";
-    String CREATED_TIMESTAMP     = "CamelCreatedTimestamp";
-    String CONTENT_ENCODING      = "Content-Encoding";
-    String CONTENT_LENGTH        = "Content-Length";
-    String CONTENT_TYPE          = "Content-Type";
-    String COOKIE_HANDLER        = "CamelCookieHandler";
-    String CORRELATION_ID        = "CamelCorrelationId";
+    String CHARSET_NAME           = "CamelCharsetName";
+    String CIRCUIT_BREAKER_STATE  = "CamelCircuitBreakerState";
+    String CREATED_TIMESTAMP      = "CamelCreatedTimestamp";
+    String CLAIM_CHECK_REPOSITORY = "CamelClaimCheckRepository";
+    String CONTENT_ENCODING       = "Content-Encoding";
+    String CONTENT_LENGTH         = "Content-Length";
+    String CONTENT_TYPE           = "Content-Type";
+    String COOKIE_HANDLER         = "CamelCookieHandler";
+    String CORRELATION_ID         = "CamelCorrelationId";
 
     String DATASET_INDEX             = "CamelDataSetIndex";
     String DEFAULT_CHARSET_PROPERTY  = "org.apache.camel.default.charset";
diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedClaimCheckMBean.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedClaimCheckMBean.java
new file mode 100644
index 0000000..6407d55
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedClaimCheckMBean.java
@@ -0,0 +1,32 @@
+/**
+ * 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.api.management.mbean;
+
+import org.apache.camel.api.management.ManagedAttribute;
+
+public interface ManagedClaimCheckMBean extends ManagedProcessorMBean {
+
+    @ManagedAttribute(description = "Claim Check operation")
+    String getOperation();
+
+    @ManagedAttribute(description = "Claim check id")
+    String getKey();
+
+    @ManagedAttribute(description = "Specified a filter to control what data gets merging data back from the claim check repository")
+    String getFilter();
+
+}
\ No newline at end of file
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultClaimCheckRepository.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultClaimCheckRepository.java
new file mode 100644
index 0000000..7f1c630
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultClaimCheckRepository.java
@@ -0,0 +1,84 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.impl;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.ClaimCheckRepository;
+
+/**
+ * The default {@link ClaimCheckRepository} implementation that is an in-memory storage.
+ */
+public class DefaultClaimCheckRepository implements ClaimCheckRepository {
+
+    private final Map<String, Exchange> map = new HashMap<>();
+    private final Deque<Exchange> stack = new ArrayDeque<>();
+
+    @Override
+    public boolean add(String key, Exchange exchange) {
+        return map.put(key, exchange) == null;
+    }
+
+    @Override
+    public boolean contains(String key) {
+        return map.containsKey(key);
+    }
+
+    @Override
+    public Exchange get(String key) {
+        return map.get(key);
+    }
+
+    @Override
+    public Exchange getAndRemove(String key) {
+        return map.remove(key);
+    }
+
+    @Override
+    public void push(Exchange exchange) {
+        stack.push(exchange);
+    }
+
+    @Override
+    public Exchange pop() {
+        if (!stack.isEmpty()) {
+            return stack.pop();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public void clear() {
+        map.clear();
+        stack.clear();
+    }
+
+    @Override
+    public void start() throws Exception {
+        // noop
+    }
+
+    @Override
+    public void stop() throws Exception {
+        // noop
+    }
+}
diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
index e31a78b..a0e2be7 100644
--- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
@@ -40,6 +40,7 @@ import org.apache.camel.management.mbean.ManagedCamelContext;
 import org.apache.camel.management.mbean.ManagedCamelHealth;
 import org.apache.camel.management.mbean.ManagedChoice;
 import org.apache.camel.management.mbean.ManagedCircuitBreakerLoadBalancer;
+import org.apache.camel.management.mbean.ManagedClaimCheck;
 import org.apache.camel.management.mbean.ManagedClusterService;
 import org.apache.camel.management.mbean.ManagedComponent;
 import org.apache.camel.management.mbean.ManagedConsumer;
@@ -109,6 +110,7 @@ import org.apache.camel.model.RecipientListDefinition;
 import org.apache.camel.model.ThreadsDefinition;
 import org.apache.camel.model.loadbalancer.CustomLoadBalancerDefinition;
 import org.apache.camel.processor.ChoiceProcessor;
+import org.apache.camel.processor.ClaimCheckProcessor;
 import org.apache.camel.processor.ConvertBodyProcessor;
 import org.apache.camel.processor.Delayer;
 import org.apache.camel.processor.DynamicRouter;
@@ -321,6 +323,8 @@ public class DefaultManagementObjectStrategy implements ManagementObjectStrategy
                 answer = new ManagedConvertBody(context, (ConvertBodyProcessor) target, definition);
             } else if (target instanceof ChoiceProcessor) {
                 answer = new ManagedChoice(context, (ChoiceProcessor) target, definition);
+            } else if (target instanceof ClaimCheckProcessor) {
+                answer = new ManagedClaimCheck(context, (ClaimCheckProcessor) target, definition);
             } else if (target instanceof Delayer) {
                 answer = new ManagedDelayer(context, (Delayer) target, definition);
             } else if (target instanceof Throttler) {
diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedClaimCheck.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedClaimCheck.java
new file mode 100644
index 0000000..3dc3ecd
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedClaimCheck.java
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.management.mbean;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.api.management.ManagedResource;
+import org.apache.camel.api.management.mbean.ManagedClaimCheckMBean;
+import org.apache.camel.model.ExpressionNode;
+import org.apache.camel.model.ProcessorDefinition;
+import org.apache.camel.processor.ClaimCheckProcessor;
+
+/**
+ * @version 
+ */
+@ManagedResource(description = "Managed Claim Check")
+public class ManagedClaimCheck extends ManagedProcessor implements ManagedClaimCheckMBean {
+    private final ClaimCheckProcessor processor;
+
+    public ManagedClaimCheck(CamelContext context, ClaimCheckProcessor processor, ProcessorDefinition<?> definition) {
+        super(context, processor, definition);
+        this.processor = processor;
+    }
+
+    @Override
+    public ExpressionNode getDefinition() {
+        return (ExpressionNode) super.getDefinition();
+    }
+
+    @Override
+    public String getOperation() {
+        return processor.getOperation();
+    }
+
+    @Override
+    public String getKey() {
+        return processor.getKey();
+    }
+
+    @Override
+    public String getFilter() {
+        return processor.getFilter();
+    }
+}
diff --git a/camel-core/src/main/java/org/apache/camel/model/ClaimCheckDefinition.java b/camel-core/src/main/java/org/apache/camel/model/ClaimCheckDefinition.java
new file mode 100644
index 0000000..760c7c0
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/model/ClaimCheckDefinition.java
@@ -0,0 +1,291 @@
+/**
+ * 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.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.Processor;
+import org.apache.camel.processor.ClaimCheckProcessor;
+import org.apache.camel.processor.aggregate.AggregationStrategy;
+import org.apache.camel.processor.aggregate.AggregationStrategyBeanAdapter;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.RouteContext;
+import org.apache.camel.util.EndpointHelper;
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * The Claim Check EIP allows you to replace message content with a claim check (a unique key),
+ * which can be used to retrieve the message content at a later time.
+ */
+@Metadata(label = "eip,routing")
+@XmlRootElement(name = "claimCheck")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ClaimCheckDefinition extends NoOutputDefinition<ClaimCheckDefinition> {
+
+    @XmlAttribute(required = true)
+    private ClaimCheckOperation operation;
+    @XmlAttribute
+    private String key;
+    @XmlAttribute
+    private String filter;
+    @XmlAttribute(name = "strategyRef") @Metadata(label = "advanced")
+    private String aggregationStrategyRef;
+    @XmlAttribute(name = "strategyMethodName") @Metadata(label = "advanced")
+    private String aggregationStrategyMethodName;
+    @XmlTransient
+    private AggregationStrategy aggregationStrategy;
+
+    public ClaimCheckDefinition() {
+    }
+
+    @Override
+    public String toString() {
+        if (operation != null) {
+            return "ClaimCheck[" + operation + "]";
+        } else {
+            return "ClaimCheck";
+        }
+    }
+
+    @Override
+    public String getLabel() {
+        return "claimCheck";
+    }
+
+    @Override
+    public Processor createProcessor(RouteContext routeContext) throws Exception {
+        ObjectHelper.notNull(operation, "operation", this);
+
+        ClaimCheckProcessor claim = new ClaimCheckProcessor();
+        claim.setOperation(operation.name());
+        claim.setKey(getKey());
+        claim.setFilter(getFilter());
+
+        AggregationStrategy strategy = createAggregationStrategy(routeContext);
+        if (strategy != null) {
+            claim.setAggregationStrategy(strategy);
+        }
+
+        // only filter or aggregation strategy can be configured not both
+        if (getFilter() != null && strategy != null) {
+            throw new IllegalArgumentException("Cannot use both filter and custom aggregation strategy on ClaimCheck EIP");
+        }
+
+        // validate filter, we cannot have both +/- at the same time
+        if (getFilter() != null) {
+            Iterable it = ObjectHelper.createIterable(filter, ",");
+            boolean includeBody = false;
+            boolean excludeBody = false;
+            for (Object o : it) {
+                String pattern = o.toString();
+                if ("body".equals(pattern) || "+body".equals(pattern)) {
+                    includeBody = true;
+                } else if ("-body".equals(pattern)) {
+                    excludeBody = true;
+                }
+            }
+            if (includeBody && excludeBody) {
+                throw new IllegalArgumentException("Cannot have both include and exclude body at the same time in the filter: " + filter);
+            }
+            boolean includeHeaders = false;
+            boolean excludeHeaders = false;
+            for (Object o : it) {
+                String pattern = o.toString();
+                if ("headers".equals(pattern) || "+headers".equals(pattern)) {
+                    includeHeaders = true;
+                } else if ("-headers".equals(pattern)) {
+                    excludeHeaders = true;
+                }
+            }
+            if (includeHeaders && excludeHeaders) {
+                throw new IllegalArgumentException("Cannot have both include and exclude headers at the same time in the filter: " + filter);
+            }
+            boolean includeHeader = false;
+            boolean excludeHeader = false;
+            for (Object o : it) {
+                String pattern = o.toString();
+                if (pattern.startsWith("header:") || pattern.startsWith("+header:")) {
+                    includeHeader = true;
+                } else if (pattern.startsWith("-header:")) {
+                    excludeHeader = true;
+                }
+            }
+            if (includeHeader && excludeHeader) {
+                throw new IllegalArgumentException("Cannot have both include and exclude header at the same time in the filter: " + filter);
+            }
+        }
+
+        return claim;
+    }
+
+    private AggregationStrategy createAggregationStrategy(RouteContext routeContext) {
+        AggregationStrategy strategy = getAggregationStrategy();
+        if (strategy == null && aggregationStrategyRef != null) {
+            Object aggStrategy = routeContext.lookup(aggregationStrategyRef, Object.class);
+            if (aggStrategy instanceof AggregationStrategy) {
+                strategy = (AggregationStrategy) aggStrategy;
+            } else if (aggStrategy != null) {
+                strategy = new AggregationStrategyBeanAdapter(aggStrategy, getAggregationStrategyMethodName());
+            } else {
+                throw new IllegalArgumentException("Cannot find AggregationStrategy in Registry with name: " + aggregationStrategyRef);
+            }
+        }
+
+        if (strategy instanceof CamelContextAware) {
+            ((CamelContextAware) strategy).setCamelContext(routeContext.getCamelContext());
+        }
+
+        return strategy;
+    }
+
+    // Fluent API
+    //-------------------------------------------------------------------------
+
+    /**
+     * The claim check operation to use.
+     * The following operations is supported:
+     * <ul>
+     *     <li>Get</li> - Gets (does not remove) the claim check by the given key.
+     *     <li>GetAndRemove</li> - Gets and remove the claim check by the given key.
+     *     <li>Set</li> - Sets a new (will override if key already exists) claim check with the given key.
+     *     <li>Push</li> - Sets a new claim check on the stack (does not use key).
+     *     <li>Pop</li> - Gets the latest claim check from the stack (does not use key).
+     * </ul>
+     */
+    public ClaimCheckDefinition operation(ClaimCheckOperation operation) {
+        setOperation(operation);
+        return this;
+    }
+
+    /**
+     * To use a specific key for claim check id.
+     */
+    public ClaimCheckDefinition key(String key) {
+        setKey(key);
+        return this;
+    }
+
+    /**
+     * Specified a filter to control what data gets merging data back from the claim check repository.
+     *
+     * The following syntax is supported:
+     * <ul>
+     *     <li>body</li> - to aggregate the message body
+     *     <li>attachments</li> - to aggregate all the message attachments
+     *     <li>headers</li> - to aggregate all the message headers
+     *     <li>header:pattern</li> - to aggregate all the message headers that matches the pattern.
+     *     The pattern syntax is documented by: {@link EndpointHelper#matchPattern(String, String)}.
+     * </ul>
+     * You can specify multiple rules separated by comma. For example to include the message body and all headers starting with foo
+     * <tt>body,header:foo*</tt>.
+     * The syntax supports the following prefixes which can be used to specify include,exclude, or remove
+     * <ul>
+     *     <li>+</li> - to include (which is the default mode)
+     *     <li>-</li> - to exclude (exclude takes precedence over include)
+     *     <li>--</li> - to remove (remove takes precedence)
+     * </ul>
+     * For example to exclude a header name foo, and remove all headers starting with bar
+     * <tt>-header:foo,--headers:bar*</tt>
+     * Note you cannot have both include and exclude <tt>header:pattern</tt> at the same time.
+     */
+    public ClaimCheckDefinition filter(String filter) {
+        setFilter(filter);
+        return this;
+    }
+
+    /**
+     * To use a custom {@link AggregationStrategy} instead of the default implementation.
+     * Notice you cannot use both custom aggregation strategy and configure data at the same time.
+     */
+    public ClaimCheckDefinition aggregationStrategy(AggregationStrategy aggregationStrategy) {
+        setAggregationStrategy(aggregationStrategy);
+        return this;
+    }
+
+    /**
+     * To use a custom {@link AggregationStrategy} instead of the default implementation.
+     * Notice you cannot use both custom aggregation strategy and configure data at the same time.
+     */
+    public ClaimCheckDefinition aggregationStrategyRef(String aggregationStrategyRef) {
+        setAggregationStrategyRef(aggregationStrategyRef);
+        return this;
+    }
+
+    /**
+     * This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy.
+     */
+    public ClaimCheckDefinition aggregationStrategyMethodName(String aggregationStrategyMethodName) {
+        setAggregationStrategyMethodName(aggregationStrategyMethodName);
+        return this;
+    }
+
+    // Properties
+    //-------------------------------------------------------------------------
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public ClaimCheckOperation getOperation() {
+        return operation;
+    }
+
+    public void setOperation(ClaimCheckOperation operation) {
+        this.operation = operation;
+    }
+
+    public String getFilter() {
+        return filter;
+    }
+
+    public void setFilter(String filter) {
+        this.filter = filter;
+    }
+
+    public String getAggregationStrategyRef() {
+        return aggregationStrategyRef;
+    }
+
+    public void setAggregationStrategyRef(String aggregationStrategyRef) {
+        this.aggregationStrategyRef = aggregationStrategyRef;
+    }
+
+    public String getAggregationStrategyMethodName() {
+        return aggregationStrategyMethodName;
+    }
+
+    public void setAggregationStrategyMethodName(String aggregationStrategyMethodName) {
+        this.aggregationStrategyMethodName = aggregationStrategyMethodName;
+    }
+
+    public AggregationStrategy getAggregationStrategy() {
+        return aggregationStrategy;
+    }
+
+    public void setAggregationStrategy(AggregationStrategy aggregationStrategy) {
+        this.aggregationStrategy = aggregationStrategy;
+    }
+}
diff --git a/camel-core/src/main/java/org/apache/camel/model/ClaimCheckOperation.java b/camel-core/src/main/java/org/apache/camel/model/ClaimCheckOperation.java
new file mode 100644
index 0000000..f3b3ec1
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/model/ClaimCheckOperation.java
@@ -0,0 +1,31 @@
+/**
+ * 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.XmlEnum;
+import javax.xml.bind.annotation.XmlType;
+
+/**
+ * Operations for the Claim Check EIP.
+ */
+@XmlType
+@XmlEnum
+public enum ClaimCheckOperation {
+
+    Get, GetAndRemove, Set, Push, Pop
+
+}
diff --git a/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java b/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
index bb74e2a..9544d93 100644
--- a/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
@@ -3445,6 +3445,61 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type>
     }
 
     /**
+     * The <a href="http://camel.apache.org/claim-check.html">Claim Check EIP</a>
+     * allows you to replace message content with a claim check (a unique key),
+     * which can be used to retrieve the message content at a later time.
+     */
+    public ClaimCheckDefinition claimCheck() {
+        ClaimCheckDefinition answer = new ClaimCheckDefinition();
+        addOutput(answer);
+        return answer;
+    }
+
+    /**
+     * The <a href="http://camel.apache.org/claim-check.html">Claim Check EIP</a>
+     * allows you to replace message content with a claim check (a unique key),
+     * which can be used to retrieve the message content at a later time.
+     *
+     * @param operation the claim check operation to use.
+     */
+    public Type claimCheck(ClaimCheckOperation operation) {
+        ClaimCheckDefinition answer = new ClaimCheckDefinition();
+        answer.setOperation(operation);
+        addOutput(answer);
+        return (Type) this;
+    }
+
+    /**
+     * The <a href="http://camel.apache.org/claim-check.html">Claim Check EIP</a>
+     * allows you to replace message content with a claim check (a unique key),
+     * which can be used to retrieve the message content at a later time.
+     *
+     * @param operation the claim check operation to use.
+     * @param key       the unique key to use for the get and set operations, can be <tt>null</tt> for push/pop operations
+     */
+    public Type claimCheck(ClaimCheckOperation operation, String key) {
+        return claimCheck(operation, key, null);
+    }
+
+    /**
+     * The <a href="http://camel.apache.org/claim-check.html">Claim Check EIP</a>
+     * allows you to replace message content with a claim check (a unique key),
+     * which can be used to retrieve the message content at a later time.
+     *
+     * @param operation the claim check operation to use.
+     * @param key       the unique key to use for the get and set operations, can be <tt>null</tt> for push/pop operations
+     * @param filter    describes what data to include/exclude when merging data back when using get or pop operations.
+     */
+    public Type claimCheck(ClaimCheckOperation operation, String key, String filter) {
+        ClaimCheckDefinition answer = new ClaimCheckDefinition();
+        answer.setOperation(operation);
+        answer.setKey(key);
+        answer.setFilter(filter);
+        addOutput(answer);
+        return (Type) this;
+    }
+
+    /**
      * The <a href="http://camel.apache.org/content-enricher.html">Content Enricher EIP</a>
      * enriches an exchange with additional data obtained from a <code>resourceUri</code>.
      * <p/>
diff --git a/camel-core/src/main/java/org/apache/camel/processor/ClaimCheckAggregationStrategy.java b/camel-core/src/main/java/org/apache/camel/processor/ClaimCheckAggregationStrategy.java
new file mode 100644
index 0000000..6416533
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/processor/ClaimCheckAggregationStrategy.java
@@ -0,0 +1,318 @@
+/**
+ * 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.processor;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.processor.aggregate.AggregationStrategy;
+import org.apache.camel.util.EndpointHelper;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.StringHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Default {@link AggregationStrategy} used by the {@link ClaimCheckProcessor} EIP.
+ * <p/>
+ * This strategy supports the following include rules syntax:
+ * <ul>
+ *     <li>body</li> - to aggregate the message body
+ *     <li>attachments</li> - to aggregate all the message attachments
+ *     <li>headers</li> - to aggregate all the message headers
+ *     <li>header:pattern</li> - to aggregate all the message headers that matches the pattern.
+ *     The pattern syntax is documented by: {@link EndpointHelper#matchPattern(String, String)}.
+ * </ul>
+ * You can specify multiple rules separated by comma. For example to include the message body and all headers starting with foo
+ * <tt>body,header:foo*</tt>.
+ * If the include rule is specified as empty or as wildcard then everything is merged.
+ * If you have configured both include and exclude then exclude take precedence over include.
+ */
+public class ClaimCheckAggregationStrategy implements AggregationStrategy {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ClaimCheckAggregationStrategy.class);
+    private String filter;
+
+    public ClaimCheckAggregationStrategy() {
+    }
+
+    public String getFilter() {
+        return filter;
+    }
+
+    public void setFilter(String filter) {
+        this.filter = filter;
+    }
+
+    @Override
+    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
+        if (newExchange == null) {
+            return oldExchange;
+        }
+
+        if (ObjectHelper.isEmpty(filter) || "*".equals(filter)) {
+            // grab everything
+            oldExchange.getMessage().setBody(newExchange.getMessage().getBody());
+            LOG.trace("Including: body");
+            if (newExchange.getMessage().hasHeaders()) {
+                oldExchange.getMessage().getHeaders().putAll(newExchange.getMessage().getHeaders());
+                LOG.trace("Including: headers");
+            }
+            if (newExchange.getMessage().hasAttachments()) {
+                oldExchange.getMessage().getAttachments().putAll(newExchange.getMessage().getAttachments());
+                LOG.trace("Including: attachments");
+            }
+            return oldExchange;
+        }
+
+        // body is by default often included
+        if (isBodyEnabled()) {
+            oldExchange.getMessage().setBody(newExchange.getMessage().getBody());
+            LOG.trace("Including: body");
+        }
+
+        // attachments is by default often included
+        if (isAttachmentsEnabled()) {
+            if (newExchange.getMessage().hasAttachments()) {
+                oldExchange.getMessage().getAttachments().putAll(newExchange.getMessage().getAttachments());
+                LOG.trace("Including: attachments");
+            }
+        }
+
+        // headers is by default often included
+        if (isHeadersEnabled()) {
+            if (newExchange.getMessage().hasHeaders()) {
+                oldExchange.getMessage().getHeaders().putAll(newExchange.getMessage().getHeaders());
+                LOG.trace("Including: headers");
+            }
+        }
+
+        // filter specific header if they are somehow enabled by the filter
+        if (hasHeaderPatterns()) {
+            boolean excludeOnly = isExcludeOnlyHeaderPatterns();
+            for (Map.Entry<String, Object> header : newExchange.getMessage().getHeaders().entrySet()) {
+                String key = header.getKey();
+                if (hasHeaderPattern(key)) {
+                    boolean include = isIncludedHeader(key);
+                    boolean exclude = isExcludedHeader(key);
+                    if (include) {
+                        LOG.trace("Including: header:{}", key);
+                        oldExchange.getMessage().getHeaders().put(key, header.getValue());
+                    } else if (exclude) {
+                        LOG.trace("Excluding: header:{}", key);
+                    } else {
+                        LOG.trace("Skipping: header:{}", key);
+                    }
+                } else if (excludeOnly) {
+                    LOG.trace("Including: header:{}", key);
+                    oldExchange.getMessage().getHeaders().put(key, header.getValue());
+                }
+            }
+        }
+
+        // filter body and all headers
+        if (ObjectHelper.isNotEmpty(filter)) {
+            Iterable it = ObjectHelper.createIterable(filter, ",");
+            for (Object k : it) {
+                String part = k.toString();
+                if (("body".equals(part) || "+body".equals(part)) && !"-body".equals(part)) {
+                    oldExchange.getMessage().setBody(newExchange.getMessage().getBody());
+                    LOG.trace("Including: body");
+                } else if (("headers".equals(part) || "+headers".equals(part)) && !"-headers".equals(part)) {
+                    oldExchange.getMessage().getHeaders().putAll(newExchange.getMessage().getHeaders());
+                    LOG.trace("Including: headers");
+                }
+            }
+        }
+
+        // filter with remove (--) take precedence at the end
+        Iterable it = ObjectHelper.createIterable(filter, ",");
+        for (Object k : it) {
+            String part = k.toString();
+            if ("--body".equals(part)) {
+                oldExchange.getMessage().setBody(null);
+            } else if ("--headers".equals(part)) {
+                oldExchange.getMessage().getHeaders().clear();
+            } else if (part.startsWith("--header:")) {
+                // pattern matching for headers, eg header:foo, header:foo*, header:(foo|bar)
+                String after = StringHelper.after(part, "--header:");
+                Iterable i = ObjectHelper.createIterable(after, ",");
+                Set<String> toRemoveKeys = new HashSet<>();
+                for (Object o : i) {
+                    String pattern = o.toString();
+                    for (Map.Entry<String, Object> header : oldExchange.getMessage().getHeaders().entrySet()) {
+                        String key = header.getKey();
+                        boolean matched = EndpointHelper.matchPattern(key, pattern);
+                        if (matched) {
+                            toRemoveKeys.add(key);
+                        }
+                    }
+                }
+                for (String key : toRemoveKeys) {
+                    LOG.trace("Removing: header:{}", key);
+                    oldExchange.getMessage().removeHeader(key);
+                }
+            }
+        }
+
+        return oldExchange;
+    }
+
+    private boolean hasHeaderPatterns() {
+        String[] parts = filter.split(",");
+        for (String pattern : parts) {
+            if (pattern.startsWith("--")) {
+                continue;
+            }
+            if (pattern.startsWith("header:") || pattern.startsWith("+header:") || pattern.startsWith("-header:")) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean isExcludeOnlyHeaderPatterns() {
+        String[] parts = filter.split(",");
+        for (String pattern : parts) {
+            if (pattern.startsWith("--")) {
+                continue;
+            }
+            if (pattern.startsWith("header:") || pattern.startsWith("+header:")) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private boolean hasHeaderPattern(String key) {
+        String[] parts = filter.split(",");
+        for (String pattern : parts) {
+            if (pattern.startsWith("--")) {
+                continue;
+            }
+            String header = null;
+            if (pattern.startsWith("header:") || pattern.startsWith("+header:")) {
+                header = StringHelper.after(pattern, "header:");
+            } else if (pattern.startsWith("-header:")) {
+                header = StringHelper.after(pattern, "-header:");
+            }
+            if (header != null && EndpointHelper.matchPattern(key, header)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean isIncludedHeader(String key) {
+        String[] parts = filter.split(",");
+        for (String pattern : parts) {
+            if (pattern.startsWith("--")) {
+                continue;
+            }
+            if (pattern.startsWith("header:") || pattern.startsWith("+header:")) {
+                pattern = StringHelper.after(pattern, "header:");
+            }
+            if (EndpointHelper.matchPattern(key, pattern)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean isExcludedHeader(String key) {
+        String[] parts = filter.split(",");
+        for (String pattern : parts) {
+            if (pattern.startsWith("--")) {
+                continue;
+            }
+            if (pattern.startsWith("-header:")) {
+                pattern = StringHelper.after(pattern, "-header:");
+            }
+            if (EndpointHelper.matchPattern(key, pattern)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean isBodyEnabled() {
+        // body is always enabled unless excluded
+        String[] parts = filter.split(",");
+
+        boolean onlyExclude = true;
+        for (String pattern : parts) {
+            if (pattern.startsWith("--")) {
+                continue;
+            }
+            if ("body".equals(pattern) || "+body".equals(pattern)) {
+                return true;
+            } else if ("-body".equals(pattern)) {
+                return false;
+            }
+            onlyExclude &= pattern.startsWith("-");
+        }
+        // body is enabled if we only have exclude patterns
+        return onlyExclude;
+    }
+
+    private boolean isAttachmentsEnabled() {
+        // attachments is always enabled unless excluded
+        String[] parts = filter.split(",");
+
+        boolean onlyExclude = true;
+        for (String pattern : parts) {
+            if (pattern.startsWith("--")) {
+                continue;
+            }
+            if ("attachments".equals(pattern) || "+attachments".equals(pattern)) {
+                return true;
+            } else if ("-attachments".equals(pattern)) {
+                return false;
+            }
+            onlyExclude &= pattern.startsWith("-");
+        }
+        // attachments is enabled if we only have exclude patterns
+        return onlyExclude;
+    }
+
+    private boolean isHeadersEnabled() {
+        // headers may be enabled unless excluded
+        String[] parts = filter.split(",");
+
+        boolean onlyExclude = true;
+        for (String pattern : parts) {
+            if (pattern.startsWith("--")) {
+                continue;
+            }
+            // if there is individual header filters then we cannot rely on this
+            if (pattern.startsWith("header:") || pattern.startsWith("+header:") || pattern.startsWith("-header:")) {
+                return false;
+            }
+            if ("headers".equals(pattern) || "+headers".equals(pattern)) {
+                return true;
+            } else if ("-headers".equals(pattern)) {
+                return false;
+            }
+            onlyExclude &= pattern.startsWith("-");
+        }
+        // headers is enabled if we only have exclude patterns
+        return onlyExclude;
+    }
+
+}
diff --git a/camel-core/src/main/java/org/apache/camel/processor/ClaimCheckProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/ClaimCheckProcessor.java
new file mode 100644
index 0000000..cedf95f
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/processor/ClaimCheckProcessor.java
@@ -0,0 +1,203 @@
+/**
+ * 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.processor;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.AsyncProcessor;
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultClaimCheckRepository;
+import org.apache.camel.processor.aggregate.AggregationStrategy;
+import org.apache.camel.spi.ClaimCheckRepository;
+import org.apache.camel.spi.IdAware;
+import org.apache.camel.support.ServiceSupport;
+import org.apache.camel.util.AsyncProcessorHelper;
+import org.apache.camel.util.ExchangeHelper;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.ServiceHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * ClaimCheck EIP implementation.
+ * <p/>
+ * The current Claim Check EIP implementation in Camel is only intended for temporary memory repository. Likewise
+ * the repository is not shared among {@link Exchange}s, but a private instance is created per {@link Exchange}.
+ * This guards against concurrent and thread-safe issues. For off-memory persistent storage of data, then use
+ * any of the many Camel components that support persistent storage, and do not use this Claim Check EIP implementation.
+ */
+public class ClaimCheckProcessor extends ServiceSupport implements AsyncProcessor, IdAware, CamelContextAware {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ClaimCheckProcessor.class);
+    private CamelContext camelContext;
+    private String id;
+    private String operation;
+    private AggregationStrategy aggregationStrategy;
+    private String key;
+    private String filter;
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getOperation() {
+        return operation;
+    }
+
+    public void setOperation(String operation) {
+        this.operation = operation;
+    }
+
+    public AggregationStrategy getAggregationStrategy() {
+        return aggregationStrategy;
+    }
+
+    public void setAggregationStrategy(AggregationStrategy aggregationStrategy) {
+        this.aggregationStrategy = aggregationStrategy;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getFilter() {
+        return filter;
+    }
+
+    public void setFilter(String filter) {
+        this.filter = filter;
+    }
+
+    public void process(Exchange exchange) throws Exception {
+        AsyncProcessorHelper.process(this, exchange);
+    }
+
+    @Override
+    public boolean process(Exchange exchange, AsyncCallback callback) {
+        // the repository is scoped per exchange
+        ClaimCheckRepository repo = exchange.getProperty(Exchange.CLAIM_CHECK_REPOSITORY, ClaimCheckRepository.class);
+        if (repo == null) {
+            repo = new DefaultClaimCheckRepository();
+            exchange.setProperty(Exchange.CLAIM_CHECK_REPOSITORY, repo);
+        }
+
+        try {
+            if ("Set".equals(operation)) {
+                // copy exchange, and do not share the unit of work
+                Exchange copy = ExchangeHelper.createCorrelatedCopy(exchange, false);
+                boolean addedNew = repo.add(key, copy);
+                if (addedNew) {
+                    LOG.debug("Add: {} -> {}", key, copy);
+                } else {
+                    LOG.debug("Override: {} -> {}", key, copy);
+                }
+            } else if ("Get".equals(operation)) {
+                Exchange copy = repo.get(key);
+                LOG.debug("Get: {} -> {}", key, exchange);
+                if (copy != null) {
+                    Exchange result = aggregationStrategy.aggregate(exchange, copy);
+                    if (result != null) {
+                        ExchangeHelper.copyResultsPreservePattern(exchange, result);
+                    }
+                }
+            } else if ("GetAndRemove".equals(operation)) {
+                Exchange copy = repo.getAndRemove(key);
+                LOG.debug("GetAndRemove: {} -> {}", key, exchange);
+                if (copy != null) {
+                    // prepare the exchanges for aggregation
+                    ExchangeHelper.prepareAggregation(exchange, copy);
+                    Exchange result = aggregationStrategy.aggregate(exchange, copy);
+                    if (result != null) {
+                        ExchangeHelper.copyResultsPreservePattern(exchange, result);
+                    }
+                }
+            } else if ("Push".equals(operation)) {
+                // copy exchange, and do not share the unit of work
+                Exchange copy = ExchangeHelper.createCorrelatedCopy(exchange, false);
+                LOG.debug("Push: {} -> {}", key, copy);
+                repo.push(copy);
+            } else if ("Pop".equals(operation)) {
+                Exchange copy = repo.pop();
+                LOG.debug("Pop: {} -> {}", key, exchange);
+                if (copy != null) {
+                    // prepare the exchanges for aggregation
+                    ExchangeHelper.prepareAggregation(exchange, copy);
+                    Exchange result = aggregationStrategy.aggregate(exchange, copy);
+                    if (result != null) {
+                        ExchangeHelper.copyResultsPreservePattern(exchange, result);
+                    }
+                }
+            }
+        } catch (Throwable e) {
+            exchange.setException(e);
+        }
+
+        callback.done(true);
+        return true;
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        ObjectHelper.notNull(operation, "operation", this);
+
+        if (aggregationStrategy == null) {
+            aggregationStrategy = createAggregationStrategy();
+        }
+        if (aggregationStrategy instanceof CamelContextAware) {
+            ((CamelContextAware) aggregationStrategy).setCamelContext(camelContext);
+        }
+
+        ServiceHelper.startServices(aggregationStrategy);
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        ServiceHelper.stopServices(aggregationStrategy);
+    }
+
+    @Override
+    public String toString() {
+        return "ClaimCheck[" + operation + "]";
+    }
+
+    protected AggregationStrategy createAggregationStrategy() {
+        ClaimCheckAggregationStrategy answer = new ClaimCheckAggregationStrategy();
+        answer.setFilter(filter);
+        return answer;
+    }
+}
diff --git a/camel-core/src/main/java/org/apache/camel/spi/ClaimCheckRepository.java b/camel-core/src/main/java/org/apache/camel/spi/ClaimCheckRepository.java
new file mode 100644
index 0000000..1eb133f
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/spi/ClaimCheckRepository.java
@@ -0,0 +1,79 @@
+/**
+ * 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.spi;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Service;
+
+/**
+ * Access to a repository of keys to implement the
+ * <a href="http://camel.apache.org/claim-check.html">Claim Check</a> pattern.
+ * <p/>
+ * The <tt>add</tt> and <tt>contains</tt> methods is operating according to the {@link java.util.Map} contract,
+ * and the <tt>push</tt> and <tt>pop</tt> methods is operating according to the {@link java.util.Stack} contract.
+ * <p/>
+ * See important details about the Claim Check EIP implementation in Apache Camel at {@link org.apache.camel.processor.ClaimCheckProcessor}.
+ */
+public interface ClaimCheckRepository extends Service {
+
+    /**
+     * Adds the exchange to the repository.
+     *
+     * @param key the claim check key
+     * @return <tt>true</tt> if this repository did <b>not</b> already contain the specified key
+     */
+    boolean add(String key, Exchange exchange);
+
+    /**
+     * Returns <tt>true</tt> if this repository contains the specified key.
+     *
+     * @param key the claim check key
+     * @return <tt>true</tt> if this repository contains the specified key
+     */
+    boolean contains(String key);
+
+    /**
+     * Gets the exchange from the repository.
+     *
+     * @param key the claim check key
+     */
+    Exchange get(String key);
+
+    /**
+     * Gets and removes the exchange from the repository.
+     *
+     * @param key the claim check key
+     * @return the removed exchange, or <tt>null</tt> if the key did not exists.
+     */
+    Exchange getAndRemove(String key);
+
+    /**
+     * Pushes the exchange on top of the repository.
+     */
+    void push(Exchange exchange);
+
+    /**
+     * Pops the repository and returns the latest. Or returns <tt>null</tt> if the stack is empty.
+     */
+    Exchange pop();
+
+    /**
+     * Clear the repository.
+     */
+    void clear();
+
+}
diff --git a/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java b/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
index 3e6ecb6..672523e 100644
--- a/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
@@ -384,8 +384,8 @@ public final class ExchangeHelper {
      * Copies the <code>source</code> exchange to <code>target</code> exchange
      * preserving the {@link ExchangePattern} of <code>target</code>.
      *
-     * @param source source exchange.
      * @param result target exchange.
+     * @param source source exchange.
      */
     public static void copyResultsPreservePattern(Exchange result, Exchange source) {
 
diff --git a/camel-core/src/main/resources/org/apache/camel/model/jaxb.index b/camel-core/src/main/resources/org/apache/camel/model/jaxb.index
index 793f23b..ffe888e 100644
--- a/camel-core/src/main/resources/org/apache/camel/model/jaxb.index
+++ b/camel-core/src/main/resources/org/apache/camel/model/jaxb.index
@@ -19,6 +19,8 @@ AOPDefinition
 BeanDefinition
 CatchDefinition
 ChoiceDefinition
+ClaimCheckDefinition
+ClaimCheckOperation
 ConvertBodyDefinition
 ContextScanDefinition
 DataFormatDefinition
diff --git a/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipGetAndRemoveSetTest.java b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipGetAndRemoveSetTest.java
new file mode 100644
index 0000000..5c234a7
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipGetAndRemoveSetTest.java
@@ -0,0 +1,57 @@
+/**
+ * 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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.ClaimCheckOperation;
+
+public class ClaimCheckEipGetAndRemoveSetTest extends ContextTestSupport {
+
+    public void testGetAndRemoveSet() throws Exception {
+        getMockEndpoint("mock:a").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:b").expectedBodiesReceived("Bye World");
+        getMockEndpoint("mock:c").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:d").expectedBodiesReceived("Hi World");
+        // it was removed so the data is not changed
+        getMockEndpoint("mock:e").expectedBodiesReceived("Hi World");
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .to("mock:a")
+                    .claimCheck(ClaimCheckOperation.Set, "foo")
+                    .transform().constant("Bye World")
+                    .to("mock:b")
+                    .claimCheck(ClaimCheckOperation.GetAndRemove, "foo")
+                    .to("mock:c")
+                    .transform().constant("Hi World")
+                    .to("mock:d")
+                    .claimCheck(ClaimCheckOperation.GetAndRemove, "foo")
+                    .to("mock:e");
+            }
+        };
+    }
+}
diff --git a/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipGetSetTest.java b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipGetSetTest.java
new file mode 100644
index 0000000..96b91e0
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipGetSetTest.java
@@ -0,0 +1,56 @@
+/**
+ * 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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.ClaimCheckOperation;
+
+public class ClaimCheckEipGetSetTest extends ContextTestSupport {
+
+    public void testGetSet() throws Exception {
+        getMockEndpoint("mock:a").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:b").expectedBodiesReceived("Bye World");
+        getMockEndpoint("mock:c").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:d").expectedBodiesReceived("Hi World");
+        getMockEndpoint("mock:e").expectedBodiesReceived("Hello World");
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .to("mock:a")
+                    .claimCheck(ClaimCheckOperation.Set, "foo")
+                    .transform().constant("Bye World")
+                    .to("mock:b")
+                    .claimCheck(ClaimCheckOperation.Get, "foo")
+                    .to("mock:c")
+                    .transform().constant("Hi World")
+                    .to("mock:d")
+                    .claimCheck(ClaimCheckOperation.Get, "foo")
+                    .to("mock:e");
+            }
+        };
+    }
+}
diff --git a/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopBodyTest.java b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopBodyTest.java
new file mode 100644
index 0000000..3b2a5af
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopBodyTest.java
@@ -0,0 +1,55 @@
+/**
+ * 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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.ClaimCheckOperation;
+
+public class ClaimCheckEipPushPopBodyTest extends ContextTestSupport {
+
+    public void testPushPopBody() throws Exception {
+        getMockEndpoint("mock:a").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:a").expectedHeaderReceived("foo", 123);
+        getMockEndpoint("mock:b").expectedBodiesReceived("Bye World");
+        getMockEndpoint("mock:b").expectedHeaderReceived("foo", 456);
+        getMockEndpoint("mock:c").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:c").expectedHeaderReceived("foo", 456);
+
+        template.sendBodyAndHeader("direct:start", "Hello World", "foo", 123);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .to("mock:a")
+                    .claimCheck(ClaimCheckOperation.Push)
+                    .transform().constant("Bye World")
+                    .setHeader("foo", constant(456))
+                    .to("mock:b")
+                    // only merge in the message body
+                    .claimCheck(ClaimCheckOperation.Pop, null, "body")
+                    .to("mock:c");
+            }
+        };
+    }
+}
diff --git a/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopExcludeBodyTest.java b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopExcludeBodyTest.java
new file mode 100644
index 0000000..4e0e0fb
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopExcludeBodyTest.java
@@ -0,0 +1,60 @@
+/**
+ * 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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.ClaimCheckOperation;
+
+public class ClaimCheckEipPushPopExcludeBodyTest extends ContextTestSupport {
+
+    public void testPushPopBodyExclude() throws Exception {
+        getMockEndpoint("mock:a").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:a").expectedHeaderReceived("foo", 123);
+        getMockEndpoint("mock:a").expectedHeaderReceived("bar", "Moes");
+        getMockEndpoint("mock:b").expectedBodiesReceived("Bye World");
+        getMockEndpoint("mock:b").expectedHeaderReceived("foo", 456);
+        getMockEndpoint("mock:b").expectedHeaderReceived("bar", "Jacks");
+        getMockEndpoint("mock:c").expectedBodiesReceived("Bye World");
+        getMockEndpoint("mock:c").expectedHeaderReceived("foo", 123);
+        getMockEndpoint("mock:c").expectedHeaderReceived("bar", "Jacks");
+
+        template.sendBodyAndHeader("direct:start", "Hello World", "foo", 123);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .setHeader("bar", constant("Moes"))
+                    .to("mock:a")
+                    .claimCheck(ClaimCheckOperation.Push)
+                    .transform().constant("Bye World")
+                    .setHeader("foo", constant(456))
+                    .setHeader("bar", constant("Jacks"))
+                    .to("mock:b")
+                    // skip the body and bar header
+                    .claimCheck(ClaimCheckOperation.Pop, null, "-body,-header:bar")
+                    .to("mock:c");
+            }
+        };
+    }
+}
diff --git a/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopHeadersPatternTest.java b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopHeadersPatternTest.java
new file mode 100644
index 0000000..7e2086e
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopHeadersPatternTest.java
@@ -0,0 +1,73 @@
+/**
+ * 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.processor;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.ClaimCheckOperation;
+
+public class ClaimCheckEipPushPopHeadersPatternTest extends ContextTestSupport {
+
+    public void testPushPopHeadersPattern() throws Exception {
+        Map<String, Object> headers = new HashMap<>();
+        headers.put("foo", 123);
+        headers.put("bar", "Moes");
+        headers.put("car", "Toyota");
+
+        getMockEndpoint("mock:a").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:a").expectedHeaderReceived("foo", 123);
+        getMockEndpoint("mock:a").expectedHeaderReceived("bar", "Moes");
+        getMockEndpoint("mock:a").message(0).header("car").isEqualTo("Toyota");
+
+        getMockEndpoint("mock:b").expectedBodiesReceived("Bye World");
+        getMockEndpoint("mock:b").expectedHeaderReceived("foo", 456);
+        getMockEndpoint("mock:b").message(0).header("bar").isNull();
+        getMockEndpoint("mock:b").message(0).header("car").isEqualTo("Toyota");
+
+        getMockEndpoint("mock:c").expectedBodiesReceived("Bye World");
+        getMockEndpoint("mock:c").expectedHeaderReceived("foo", 123);
+        // bar header should be back now
+        getMockEndpoint("mock:c").expectedHeaderReceived("bar", "Moes");
+        getMockEndpoint("mock:c").message(0).header("car").isEqualTo("Toyota");
+
+        template.sendBodyAndHeaders("direct:start", "Hello World", headers);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .to("mock:a")
+                    .claimCheck(ClaimCheckOperation.Push)
+                    .transform().constant("Bye World")
+                    .setHeader("foo", constant(456))
+                    .removeHeader("bar")
+                    .to("mock:b")
+                    // only merge in the message headers
+                    .claimCheck(ClaimCheckOperation.Pop, null, "header:(foo|bar)")
+                    .to("mock:c");
+            }
+        };
+    }
+}
diff --git a/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopHeadersTest.java b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopHeadersTest.java
new file mode 100644
index 0000000..fbbf961
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopHeadersTest.java
@@ -0,0 +1,55 @@
+/**
+ * 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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.ClaimCheckOperation;
+
+public class ClaimCheckEipPushPopHeadersTest extends ContextTestSupport {
+
+    public void testPushPopHeaders() throws Exception {
+        getMockEndpoint("mock:a").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:a").expectedHeaderReceived("foo", 123);
+        getMockEndpoint("mock:b").expectedBodiesReceived("Bye World");
+        getMockEndpoint("mock:b").expectedHeaderReceived("foo", 456);
+        getMockEndpoint("mock:c").expectedBodiesReceived("Bye World");
+        getMockEndpoint("mock:c").expectedHeaderReceived("foo", 123);
+
+        template.sendBodyAndHeader("direct:start", "Hello World", "foo", 123);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .to("mock:a")
+                    .claimCheck(ClaimCheckOperation.Push)
+                    .transform().constant("Bye World")
+                    .setHeader("foo", constant(456))
+                    .to("mock:b")
+                    // only merge in the message headers
+                    .claimCheck(ClaimCheckOperation.Pop, null, "headers")
+                    .to("mock:c");
+            }
+        };
+    }
+}
diff --git a/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopRemoveHeaderTest.java b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopRemoveHeaderTest.java
new file mode 100644
index 0000000..c164d64
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopRemoveHeaderTest.java
@@ -0,0 +1,60 @@
+/**
+ * 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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.ClaimCheckOperation;
+
+public class ClaimCheckEipPushPopRemoveHeaderTest extends ContextTestSupport {
+
+    public void testPushPopBodyRemoveHeader() throws Exception {
+        getMockEndpoint("mock:a").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:a").expectedHeaderReceived("foo", 123);
+        getMockEndpoint("mock:a").expectedHeaderReceived("bar", "Moes");
+        getMockEndpoint("mock:b").expectedBodiesReceived("Bye World");
+        getMockEndpoint("mock:b").expectedHeaderReceived("foo", 456);
+        getMockEndpoint("mock:b").expectedHeaderReceived("bar", "Jacks");
+        getMockEndpoint("mock:c").expectedBodiesReceived("Bye World");
+        getMockEndpoint("mock:c").expectedHeaderReceived("foo", 123);
+        getMockEndpoint("mock:c").message(0).header("bar").isNull();
+
+        template.sendBodyAndHeader("direct:start", "Hello World", "foo", 123);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .setHeader("bar", constant("Moes"))
+                    .to("mock:a")
+                    .claimCheck(ClaimCheckOperation.Push)
+                    .transform().constant("Bye World")
+                    .setHeader("foo", constant(456))
+                    .setHeader("bar", constant("Jacks"))
+                    .to("mock:b")
+                    // skip the body and remove the bar header
+                    .claimCheck(ClaimCheckOperation.Pop, null, "-body,--header:bar")
+                    .to("mock:c");
+            }
+        };
+    }
+}
diff --git a/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopTest.java b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopTest.java
new file mode 100644
index 0000000..ece3b64
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/ClaimCheckEipPushPopTest.java
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.ClaimCheckOperation;
+
+public class ClaimCheckEipPushPopTest extends ContextTestSupport {
+
+    public void testPushPop() throws Exception {
+        getMockEndpoint("mock:a").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:b").expectedBodiesReceived("Bye World");
+        getMockEndpoint("mock:c").expectedBodiesReceived("Hello World");
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .to("mock:a")
+                    .claimCheck(ClaimCheckOperation.Push)
+                    .transform().constant("Bye World")
+                    .to("mock:b")
+                    .claimCheck(ClaimCheckOperation.Pop)
+                    .to("mock:c");
+            }
+        };
+    }
+}
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipGetAndRemoveSetTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipGetAndRemoveSetTest.java
new file mode 100644
index 0000000..77e299b
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipGetAndRemoveSetTest.java
@@ -0,0 +1,29 @@
+/**
+ * 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.spring.processor;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.processor.ClaimCheckEipGetAndRemoveSetTest;
+
+import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
+
+public class SpringClaimCheckEipGetAndRemoveSetTest extends ClaimCheckEipGetAndRemoveSetTest {
+
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/ClaimCheckEipGetAndRemoveSetTest.xml");
+    }
+}
\ No newline at end of file
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipGetSetTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipGetSetTest.java
new file mode 100644
index 0000000..5495e73
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipGetSetTest.java
@@ -0,0 +1,29 @@
+/**
+ * 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.spring.processor;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.processor.ClaimCheckEipGetSetTest;
+
+import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
+
+public class SpringClaimCheckEipGetSetTest extends ClaimCheckEipGetSetTest {
+
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/ClaimCheckEipGetSetTest.xml");
+    }
+}
\ No newline at end of file
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopBodyTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopBodyTest.java
new file mode 100644
index 0000000..b43586f
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopBodyTest.java
@@ -0,0 +1,29 @@
+/**
+ * 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.spring.processor;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.processor.ClaimCheckEipPushPopBodyTest;
+
+import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
+
+public class SpringClaimCheckEipPushPopBodyTest extends ClaimCheckEipPushPopBodyTest {
+
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/ClaimCheckEipPushPopBodyTest.xml");
+    }
+}
\ No newline at end of file
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopHeadersPatternTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopHeadersPatternTest.java
new file mode 100644
index 0000000..11a73a3
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopHeadersPatternTest.java
@@ -0,0 +1,29 @@
+/**
+ * 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.spring.processor;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.processor.ClaimCheckEipPushPopHeadersPatternTest;
+
+import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
+
+public class SpringClaimCheckEipPushPopHeadersPatternTest extends ClaimCheckEipPushPopHeadersPatternTest {
+
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/ClaimCheckEipPushPopHeadersPatternTest.xml");
+    }
+}
\ No newline at end of file
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopHeadersTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopHeadersTest.java
new file mode 100644
index 0000000..d4b6c78
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopHeadersTest.java
@@ -0,0 +1,29 @@
+/**
+ * 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.spring.processor;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.processor.ClaimCheckEipPushPopHeadersTest;
+
+import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
+
+public class SpringClaimCheckEipPushPopHeadersTest extends ClaimCheckEipPushPopHeadersTest {
+
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/ClaimCheckEipPushPopHeadersTest.xml");
+    }
+}
\ No newline at end of file
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopRemoveHeaderTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopRemoveHeaderTest.java
new file mode 100644
index 0000000..15bdb20
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopRemoveHeaderTest.java
@@ -0,0 +1,29 @@
+/**
+ * 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.spring.processor;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.processor.ClaimCheckEipPushPopRemoveHeaderTest;
+
+import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
+
+public class SpringClaimCheckEipPushPopRemoveHeaderTest extends ClaimCheckEipPushPopRemoveHeaderTest {
+
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/ClaimCheckEipPushPopRemoveHeaderTest.xml");
+    }
+}
\ No newline at end of file
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopTest.java
new file mode 100644
index 0000000..cdd3d14
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringClaimCheckEipPushPopTest.java
@@ -0,0 +1,29 @@
+/**
+ * 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.spring.processor;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.processor.ClaimCheckEipPushPopTest;
+
+import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
+
+public class SpringClaimCheckEipPushPopTest extends ClaimCheckEipPushPopTest {
+
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/ClaimCheckEipPushPopTest.xml");
+    }
+}
\ No newline at end of file
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipGetAndRemoveSetTest.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipGetAndRemoveSetTest.xml
new file mode 100644
index 0000000..2d5e643
--- /dev/null
+++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipGetAndRemoveSetTest.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       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
+    ">
+
+  <camelContext xmlns="http://camel.apache.org/schema/spring">
+    <route>
+      <from uri="direct:start"/>
+      <to uri="mock:a"/>
+      <claimCheck operation="Set" key="foo"/>
+      <transform>
+        <constant>Bye World</constant>
+      </transform>
+      <to uri="mock:b"/>
+      <claimCheck operation="GetAndRemove" key="foo"/>
+      <to uri="mock:c"/>
+      <transform>
+        <constant>Hi World</constant>
+      </transform>
+      <to uri="mock:d"/>
+      <claimCheck operation="GetAndRemove" key="foo"/>
+      <to uri="mock:e"/>
+    </route>
+  </camelContext>
+
+</beans>
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipGetSetTest.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipGetSetTest.xml
new file mode 100644
index 0000000..8c54836
--- /dev/null
+++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipGetSetTest.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       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
+    ">
+
+  <camelContext xmlns="http://camel.apache.org/schema/spring">
+    <route>
+      <from uri="direct:start"/>
+      <to uri="mock:a"/>
+      <claimCheck operation="Set" key="foo"/>
+      <transform>
+        <constant>Bye World</constant>
+      </transform>
+      <to uri="mock:b"/>
+      <claimCheck operation="Get" key="foo"/>
+      <to uri="mock:c"/>
+      <transform>
+        <constant>Hi World</constant>
+      </transform>
+      <to uri="mock:d"/>
+      <claimCheck operation="Get" key="foo"/>
+      <to uri="mock:e"/>
+    </route>
+  </camelContext>
+
+</beans>
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopBodyTest.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopBodyTest.xml
new file mode 100644
index 0000000..d6c53ad
--- /dev/null
+++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopBodyTest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       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
+    ">
+
+  <camelContext xmlns="http://camel.apache.org/schema/spring">
+    <route>
+      <from uri="direct:start"/>
+      <to uri="mock:a"/>
+      <claimCheck operation="Push"/>
+      <transform>
+        <constant>Bye World</constant>
+      </transform>
+      <setHeader headerName="foo">
+        <constant>456</constant>
+      </setHeader>
+      <to uri="mock:b"/>
+      <claimCheck operation="Pop" filter="body"/>
+      <to uri="mock:c"/>
+    </route>
+  </camelContext>
+
+</beans>
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopHeadersPatternTest.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopHeadersPatternTest.xml
new file mode 100644
index 0000000..6efad19
--- /dev/null
+++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopHeadersPatternTest.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       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
+    ">
+
+  <camelContext xmlns="http://camel.apache.org/schema/spring">
+    <route>
+      <from uri="direct:start"/>
+      <to uri="mock:a"/>
+      <claimCheck operation="Push"/>
+      <transform>
+        <constant>Bye World</constant>
+      </transform>
+      <setHeader headerName="foo">
+        <constant>456</constant>
+      </setHeader>
+      <removeHeader headerName="bar"/>
+      <to uri="mock:b"/>
+      <claimCheck operation="Pop" filter="header:(foo|bar)"/>
+      <to uri="mock:c"/>
+    </route>
+  </camelContext>
+
+</beans>
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopHeadersTest.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopHeadersTest.xml
new file mode 100644
index 0000000..a0deac7
--- /dev/null
+++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopHeadersTest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       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
+    ">
+
+  <camelContext xmlns="http://camel.apache.org/schema/spring">
+    <route>
+      <from uri="direct:start"/>
+      <to uri="mock:a"/>
+      <claimCheck operation="Push"/>
+      <transform>
+        <constant>Bye World</constant>
+      </transform>
+      <setHeader headerName="foo">
+        <constant>456</constant>
+      </setHeader>
+      <to uri="mock:b"/>
+      <claimCheck operation="Pop" filter="headers"/>
+      <to uri="mock:c"/>
+    </route>
+  </camelContext>
+
+</beans>
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopRemoveHeaderTest.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopRemoveHeaderTest.xml
new file mode 100644
index 0000000..752f2d1
--- /dev/null
+++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopRemoveHeaderTest.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       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
+    ">
+
+  <camelContext xmlns="http://camel.apache.org/schema/spring">
+    <route>
+      <from uri="direct:start"/>
+      <setHeader headerName="bar">
+        <constant>Moes</constant>
+      </setHeader>
+      <to uri="mock:a"/>
+      <claimCheck operation="Push"/>
+      <transform>
+        <constant>Bye World</constant>
+      </transform>
+      <setHeader headerName="foo">
+        <constant>456</constant>
+      </setHeader>
+      <setHeader headerName="bar">
+        <constant>Jacks</constant>
+      </setHeader>
+      <to uri="mock:b"/>
+      <!-- // skip the body and remove the bar header -->
+      <claimCheck operation="Pop" filter="-body,--header:bar"/>
+      <to uri="mock:c"/>
+    </route>
+  </camelContext>
+
+</beans>
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopTest.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopTest.xml
new file mode 100644
index 0000000..049986b
--- /dev/null
+++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ClaimCheckEipPushPopTest.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       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
+    ">
+
+  <camelContext xmlns="http://camel.apache.org/schema/spring">
+    <route>
+      <from uri="direct:start"/>
+      <to uri="mock:a"/>
+      <claimCheck operation="Push"/>
+      <transform>
+        <constant>Bye World</constant>
+      </transform>
+      <to uri="mock:b"/>
+      <claimCheck operation="Pop"/>
+      <to uri="mock:c"/>
+    </route>
+  </camelContext>
+
+</beans>

-- 
To stop receiving notification emails like this one, please contact
davsclaus@apache.org.

[camel] 02/02: Regen docs

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit ffa712f121a7eda7708762e0d774ad61aee391f7
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Feb 6 17:49:26 2018 +0100

    Regen docs
---
 components/readme.adoc         | 5 ++++-
 docs/user-manual/en/SUMMARY.md | 1 +
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/components/readme.adoc b/components/readme.adoc
index 5a98415..854c011 100644
--- a/components/readme.adoc
+++ b/components/readme.adoc
@@ -2,7 +2,7 @@ Components
 ^^^^^^^^^^
 
 // components: START
-Number of Components: 290 in 199 JAR artifacts (19 deprecated)
+Number of Components: 291 in 200 JAR artifacts (19 deprecated)
 
 [width="100%",cols="4,1,5",options="header"]
 |===
@@ -233,6 +233,9 @@ Number of Components: 290 in 199 JAR artifacts (19 deprecated)
 | link:camel-elasticsearch-rest/src/main/docs/elasticsearch-rest-component.adoc[Elastichsearch Rest] (camel-elasticsearch-rest) +
 `elasticsearch-rest:clusterName` | 2.21 | The elasticsearch component is used for interfacing with ElasticSearch server using REST API.
 
+| link:camel-elasticsearch5-rest/src/main/docs/elasticsearch5-rest-component.adoc[Elastichsearch5 Rest] (camel-elasticsearch5-rest) +
+`elasticsearch5-rest:clusterName` | 2.21 | The elasticsearch component is used for interfacing with ElasticSearch server using 5.x REST API.
+
 | link:camel-elasticsearch/src/main/docs/elasticsearch-component.adoc[Elasticsearch] (camel-elasticsearch) +
 `elasticsearch:clusterName` | 2.11 | *deprecated* The elasticsearch component is used for interfacing with ElasticSearch server.
 
diff --git a/docs/user-manual/en/SUMMARY.md b/docs/user-manual/en/SUMMARY.md
index cc0a2ca..4a3d38d 100644
--- a/docs/user-manual/en/SUMMARY.md
+++ b/docs/user-manual/en/SUMMARY.md
@@ -191,6 +191,7 @@
 	* [Ehcache](ehcache-component.adoc)
 	* [EJB](ejb-component.adoc)
 	* [Elastichsearch Rest](elasticsearch-rest-component.adoc)
+	* [Elastichsearch5 Rest](elasticsearch5-rest-component.adoc)
 	* [Elasticsearch](elasticsearch-component.adoc)
 	* [Elasticsearch5](elasticsearch5-component.adoc)
 	* [ElSQL](elsql-component.adoc)

-- 
To stop receiving notification emails like this one, please contact
davsclaus@apache.org.