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

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

commit 381624851961237bc981a7704c52c63af43b63d4
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Mon Jul 8 09:12:19 2019 +0200

    CAMEL-13678: Move attachments out of camel-core into camel-attachments.
---
 bom/camel-bom/pom.xml                              |  5 ++
 .../camel/component/chunk/ChunkEndpoint.java       |  1 -
 components/camel-cxf/pom.xml                       |  4 +
 .../camel/component/cxf/DefaultCxfBinding.java     | 60 +++++++-------
 .../component/cxf/jaxrs/SimpleCxfRsBinding.java    |  7 +-
 .../camel/component/cxf/DefaultCxfBindingTest.java | 13 ++--
 .../CxfRsConsumerSimpleBindingTest.java            |  9 ++-
 .../cxf/mtom/CxfJavaMtomProducerPayloadTest.java   |  3 +-
 .../cxf/mtom/CxfMtomConsumerPayloadModeTest.java   | 13 ++--
 .../component/cxf/mtom/CxfMtomConsumerTest.java    |  3 +-
 .../CxfMtomDisabledConsumerPayloadModeTest.java    |  9 ++-
 .../CxfMtomDisabledProducerPayloadModeTest.java    |  9 ++-
 .../cxf/mtom/CxfMtomPOJOProducerTest.java          |  3 +-
 .../cxf/mtom/CxfMtomProducerPayloadModeTest.java   |  9 ++-
 .../component/freemarker/FreemarkerEndpoint.java   |  1 -
 .../apache/camel/component/gora/GoraProducer.java  |  3 +-
 components/camel-http-common/pom.xml               | 11 ++-
 .../camel/http/common/DefaultHttpBinding.java      |  4 +-
 .../component/jetty9/AttachmentHttpBinding.java    | 16 ++--
 .../jetty/HttpBridgeMultipartRouteTest.java        |  3 +-
 .../component/jetty/MultiPartFormOkHttpTest.java   |  8 +-
 .../camel/component/jetty/MultiPartFormTest.java   |  3 +-
 .../jetty/MultiPartFormWithCustomFilterTest.java   |  6 +-
 .../org/apache/camel/component/jms/JmsMessage.java |  5 --
 .../apache/camel/component/jolt/JoltEndpoint.java  |  1 -
 .../apache/camel/component/ldap/LdapProducer.java  |  1 -
 components/camel-mail/pom.xml                      |  4 +
 .../apache/camel/component/mail/MailBinding.java   | 13 ++--
 .../apache/camel/component/mail/MailConsumer.java  |  1 -
 .../apache/camel/component/mail/MailMessage.java   | 23 ------
 .../component/mail/SplitAttachmentsExpression.java | 12 +--
 .../mime/multipart/MimeMultipartDataFormat.java    | 49 ++++++------
 .../mail/MailAttachmentDuplicateNamesTest.java     |  7 +-
 .../mail/MailAttachmentRedeliveryTest.java         |  9 ++-
 .../camel/component/mail/MailAttachmentTest.java   | 11 +--
 .../mail/MailAttachmentsUmlautIssueTest.java       |  7 +-
 .../mail/MailBindingAttachmentFileTest.java        |  3 +-
 .../mail/MailContentTypeResolverTest.java          |  7 +-
 .../component/mail/MailHtmlAttachmentTest.java     |  7 +-
 .../apache/camel/component/mail/MailRouteTest.java |  3 +-
 .../component/mail/MailSplitAttachmentsTest.java   | 11 +--
 .../camel/component/mail/MailSubjectTest.java      |  3 +-
 .../component/mail/MimeMessageConsumeTest.java     |  7 +-
 .../mail/MimeMultipartAlternativeTest.java         |  5 +-
 ...MultipartAlternativeWithLongerFilenameTest.java |  5 +-
 .../mail/NestedMimeMessageConsumeTest.java         |  7 +-
 .../mail/SpringMailSplitAttachmentsTest.java       | 11 +--
 .../multipart/MimeMultipartDataFormatTest.java     | 37 +++++----
 .../component/servlet/AttachmentHttpBinding.java   |  8 +-
 .../apache/camel/component/sql/SqlProducer.java    |  3 -
 .../component/sql/SqlProducerOutputAttachment.java | 91 ----------------------
 .../apache/camel/component/ssh/SshProducer.java    |  3 +-
 .../undertow/DefaultUndertowHttpBinding.java       |  9 ++-
 .../component/undertow/MultiPartFormTest.java      |  5 +-
 parent/pom.xml                                     |  5 ++
 55 files changed, 260 insertions(+), 316 deletions(-)

diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index 22c93e9..494b298 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -173,6 +173,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-attachments</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-avro</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git 
a/components/camel-chunk/src/main/java/org/apache/camel/component/chunk/ChunkEndpoint.java
 
b/components/camel-chunk/src/main/java/org/apache/camel/component/chunk/ChunkEndpoint.java
index 52d618d..9773a80 100644
--- 
a/components/camel-chunk/src/main/java/org/apache/camel/component/chunk/ChunkEndpoint.java
+++ 
b/components/camel-chunk/src/main/java/org/apache/camel/component/chunk/ChunkEndpoint.java
@@ -114,7 +114,6 @@ public class ChunkEndpoint extends ResourceEndpoint {
             Message out = exchange.getOut();
             out.setBody(newChunk.toString());
             out.setHeaders(exchange.getIn().getHeaders());
-            out.setAttachments(exchange.getIn().getAttachments());
         } else {
             exchange.getIn().removeHeader(ChunkConstants.CHUNK_RESOURCE_URI);
             ChunkEndpoint newEndpoint = 
getCamelContext().getEndpoint(CHUNK_ENDPOINT_URI_PREFIX + newResourceUri, 
ChunkEndpoint.class);
diff --git a/components/camel-cxf/pom.xml b/components/camel-cxf/pom.xml
index f1a083b..e636a86 100644
--- a/components/camel-cxf/pom.xml
+++ b/components/camel-cxf/pom.xml
@@ -77,6 +77,10 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
+            <artifactId>camel-attachments</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
             <artifactId>camel-spring</artifactId>
         </dependency>
         <dependency>
diff --git 
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
 
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
index b6b9348..2c1e632 100644
--- 
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
+++ 
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
@@ -45,12 +45,13 @@ import org.w3c.dom.Node;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.attachment.DefaultAttachment;
 import org.apache.camel.component.cxf.common.header.CxfHeaderHelper;
 import org.apache.camel.component.cxf.common.message.CxfConstants;
 import org.apache.camel.component.cxf.util.ReaderInputStream;
 import org.apache.camel.spi.HeaderFilterStrategy;
 import org.apache.camel.spi.HeaderFilterStrategyAware;
-import org.apache.camel.support.DefaultAttachment;
 import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.cxf.attachment.AttachmentImpl;
@@ -132,18 +133,20 @@ public class DefaultCxfBinding implements CxfBinding, 
HeaderFilterStrategyAware
         // we should avoid adding the attachments if the data format is 
CXFMESSAGE, as the message stream 
         // already has the attachment information
         if (!DataFormat.CXF_MESSAGE.equals(dataFormat)) {
-            for (Map.Entry<String, org.apache.camel.Attachment> entry : 
camelExchange.getIn().getAttachmentObjects().entrySet()) {
-                if (attachments == null) {
-                    attachments = new HashSet<>();
-                }
-                AttachmentImpl attachment = new AttachmentImpl(entry.getKey());
-                org.apache.camel.Attachment camelAttachment = entry.getValue();
-                attachment.setDataHandler(camelAttachment.getDataHandler());
-                for (String name : camelAttachment.getHeaderNames()) {
-                    attachment.setHeader(name, 
camelAttachment.getHeader(name));
+            if (camelExchange.getIn(AttachmentMessage.class).hasAttachments()) 
{
+                for (Map.Entry<String, org.apache.camel.attachment.Attachment> 
entry : 
camelExchange.getIn(AttachmentMessage.class).getAttachmentObjects().entrySet()) 
{
+                    if (attachments == null) {
+                        attachments = new HashSet<>();
+                    }
+                    AttachmentImpl attachment = new 
AttachmentImpl(entry.getKey());
+                    org.apache.camel.attachment.Attachment camelAttachment = 
entry.getValue();
+                    
attachment.setDataHandler(camelAttachment.getDataHandler());
+                    for (String name : camelAttachment.getHeaderNames()) {
+                        attachment.setHeader(name, 
camelAttachment.getHeader(name));
+                    }
+                    attachment.setXOP(isXop);
+                    attachments.add(attachment);
                 }
-                attachment.setXOP(isXop);
-                attachments.add(attachment);
             }
         }
         
@@ -193,7 +196,7 @@ public class DefaultCxfBinding implements CxfBinding, 
HeaderFilterStrategyAware
         if (cxfMessage.getAttachments() != null) {
             // propagate attachments
             for (Attachment attachment : cxfMessage.getAttachments()) {
-                camelExchange.getOut().addAttachmentObject(attachment.getId(), 
createCamelAttachment(attachment));
+                
camelExchange.getOut(AttachmentMessage.class).addAttachmentObject(attachment.getId(),
 createCamelAttachment(attachment));
             }        
         }
     }
@@ -308,7 +311,7 @@ public class DefaultCxfBinding implements CxfBinding, 
HeaderFilterStrategyAware
         if (cxfMessage.getAttachments() != null 
             && !camelExchange.getProperty(CxfConstants.DATA_FORMAT_PROPERTY, 
DataFormat.class).equals(DataFormat.POJO)) {
             for (Attachment attachment : cxfMessage.getAttachments()) {
-                camelExchange.getIn().addAttachmentObject(attachment.getId(), 
createCamelAttachment(attachment));
+                
camelExchange.getIn(AttachmentMessage.class).addAttachmentObject(attachment.getId(),
 createCamelAttachment(attachment));
             }
         }
     }
@@ -408,28 +411,27 @@ public class DefaultCxfBinding implements CxfBinding, 
HeaderFilterStrategyAware
         }
         
         // propagate attachments
-        
         Set<Attachment> attachments = null;
         boolean isXop = 
Boolean.valueOf(camelExchange.getProperty(Message.MTOM_ENABLED, String.class));
-        for (Map.Entry<String, org.apache.camel.Attachment> entry : 
camelExchange.getOut().getAttachmentObjects().entrySet()) {
-            if (attachments == null) {
-                attachments = new HashSet<>();
-            }
-            AttachmentImpl attachment = new AttachmentImpl(entry.getKey());
-            org.apache.camel.Attachment camelAttachment = entry.getValue();
-            attachment.setDataHandler(camelAttachment.getDataHandler());
-            for (String name : camelAttachment.getHeaderNames()) {
-                attachment.setHeader(name, camelAttachment.getHeader(name));
+        if (camelExchange.getOut(AttachmentMessage.class).hasAttachments()) {
+            for (Map.Entry<String, org.apache.camel.attachment.Attachment> 
entry : 
camelExchange.getOut(AttachmentMessage.class).getAttachmentObjects().entrySet())
 {
+                if (attachments == null) {
+                    attachments = new HashSet<>();
+                }
+                AttachmentImpl attachment = new AttachmentImpl(entry.getKey());
+                org.apache.camel.attachment.Attachment camelAttachment = 
entry.getValue();
+                attachment.setDataHandler(camelAttachment.getDataHandler());
+                for (String name : camelAttachment.getHeaderNames()) {
+                    attachment.setHeader(name, 
camelAttachment.getHeader(name));
+                }
+                attachment.setXOP(isXop);
+                attachments.add(attachment);
             }
-            attachment.setXOP(isXop);
-            attachments.add(attachment);
         }
-
         if (attachments != null) {
             outMessage.setAttachments(attachments);
         }
-        
-       
+
         BindingOperationInfo boi = cxfExchange.get(BindingOperationInfo.class);
         if (boi != null) {
             cxfExchange.put(BindingMessageInfo.class, boi.getOutput());
diff --git 
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/SimpleCxfRsBinding.java
 
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/SimpleCxfRsBinding.java
index ee02d5a..f582c7a 100644
--- 
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/SimpleCxfRsBinding.java
+++ 
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/SimpleCxfRsBinding.java
@@ -43,8 +43,9 @@ import javax.ws.rs.core.Response.ResponseBuilder;
 import javax.ws.rs.core.Response.Status;
 
 import org.apache.camel.Message;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.attachment.DefaultAttachment;
 import org.apache.camel.spi.HeaderFilterStrategy;
-import org.apache.camel.support.DefaultAttachment;
 import org.apache.cxf.jaxrs.ext.multipart.Attachment;
 import org.apache.cxf.jaxrs.ext.multipart.InputStreamDataSource;
 import org.apache.cxf.jaxrs.ext.multipart.Multipart;
@@ -280,7 +281,7 @@ public class SimpleCxfRsBinding extends DefaultCxfRsBinding 
{
     }
 
     private void transferBinaryMultipartParameter(Object toMap, String 
parameterName, String multipartType, Message in) {
-        org.apache.camel.Attachment dh = null;
+        org.apache.camel.attachment.Attachment dh = null;
         if (toMap instanceof Attachment) {
             dh = createCamelAttachment((Attachment) toMap);
         } else if (toMap instanceof DataSource) {
@@ -291,7 +292,7 @@ public class SimpleCxfRsBinding extends DefaultCxfRsBinding 
{
             dh = new DefaultAttachment(new InputStreamDataSource((InputStream) 
toMap, multipartType == null ? "application/octet-stream" : multipartType));
         }
         if (dh != null) {
-            in.addAttachmentObject(parameterName, dh);
+            
in.getExchange().getMessage(AttachmentMessage.class).addAttachmentObject(parameterName,
 dh);
         }
     }
 
diff --git 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/DefaultCxfBindingTest.java
 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/DefaultCxfBindingTest.java
index b2b86dd..47addfb 100644
--- 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/DefaultCxfBindingTest.java
+++ 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/DefaultCxfBindingTest.java
@@ -29,6 +29,7 @@ import javax.activation.FileDataSource;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 
+import org.apache.camel.attachment.AttachmentMessage;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -156,8 +157,8 @@ public class DefaultCxfBindingTest extends Assert {
         exchange.getIn().setHeader("soapAction", "urn:hello:world");
         exchange.getIn().setHeader("MyFruitHeader", "peach");
         exchange.getIn().setHeader("MyBrewHeader", Arrays.asList("cappuccino", 
"espresso"));
-        exchange.getIn().addAttachment("att-1", new DataHandler(new 
FileDataSource("pom.xml")));
-        
exchange.getIn().getAttachmentObject("att-1").setHeader("attachment-header", 
"value 1");
+        exchange.getIn(AttachmentMessage.class).addAttachment("att-1", new 
DataHandler(new FileDataSource("pom.xml")));
+        
exchange.getIn(AttachmentMessage.class).getAttachmentObject("att-1").setHeader("attachment-header",
 "value 1");
 
         cxfBinding.populateCxfRequestFromExchange(cxfExchange, exchange, 
requestContext);
         
@@ -246,7 +247,7 @@ public class DefaultCxfBindingTest extends Assert {
         assertNotNull(camelHeaders);
         assertEquals(responseContext, 
camelHeaders.get(Client.RESPONSE_CONTEXT));
         
-        Map<String, org.apache.camel.Attachment> camelAttachments = 
exchange.getOut().getAttachmentObjects();
+        Map<String, org.apache.camel.attachment.Attachment> camelAttachments = 
exchange.getOut(AttachmentMessage.class).getAttachmentObjects();
         assertNotNull(camelAttachments);
         assertNotNull(camelAttachments.get("att-1"));
         assertEquals("value 1", 
camelAttachments.get("att-1").getHeader("additional-header"));
@@ -286,8 +287,8 @@ public class DefaultCxfBindingTest extends Assert {
         
         exchange.getOut().setHeader("soapAction", "urn:hello:world");
         exchange.getOut().setHeader("MyFruitHeader", "peach");
-        exchange.getOut().addAttachment("att-1", new DataHandler(new 
FileDataSource("pom.xml")));
-        
exchange.getOut().getAttachmentObject("att-1").setHeader("attachment-header", 
"value 1");
+        exchange.getOut(AttachmentMessage.class).addAttachment("att-1", new 
DataHandler(new FileDataSource("pom.xml")));
+        
exchange.getOut(AttachmentMessage.class).getAttachmentObject("att-1").setHeader("attachment-header",
 "value 1");
         
         Endpoint endpoint = mock(Endpoint.class);
         Binding binding = mock(Binding.class);
@@ -355,7 +356,7 @@ public class DefaultCxfBindingTest extends Assert {
         assertEquals("peach", camelHeaders.get("MyFruitHeader"));
         assertEquals(Arrays.asList("cappuccino", "espresso"), 
camelHeaders.get("MyBrewHeader"));
 
-        Map<String, org.apache.camel.Attachment> camelAttachments = 
exchange.getIn().getAttachmentObjects();
+        Map<String, org.apache.camel.attachment.Attachment> camelAttachments = 
exchange.getIn(AttachmentMessage.class).getAttachmentObjects();
         assertNotNull(camelAttachments);
         assertNotNull(camelAttachments.get("att-1"));
         assertEquals("value 1", 
camelAttachments.get("att-1").getHeader("attachment-header"));
diff --git 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/simplebinding/CxfRsConsumerSimpleBindingTest.java
 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/simplebinding/CxfRsConsumerSimpleBindingTest.java
index ffe8127..0b521d7 100644
--- 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/simplebinding/CxfRsConsumerSimpleBindingTest.java
+++ 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/simplebinding/CxfRsConsumerSimpleBindingTest.java
@@ -27,6 +27,7 @@ import javax.xml.bind.JAXBContext;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.cxf.CXFTestSupport;
 import org.apache.camel.component.cxf.jaxrs.simplebinding.testbean.Customer;
@@ -175,8 +176,8 @@ public class CxfRsConsumerSimpleBindingTest extends 
CamelTestSupport {
                     public void process(Exchange exchange) throws Exception {
                         assertEquals("abcd", 
exchange.getIn().getHeader("query"));
                         assertEquals("123", exchange.getIn().getHeader("id"));
-                        assertNotNull(exchange.getIn().getAttachment("part1"));
-                        assertNotNull(exchange.getIn().getAttachment("part2"));
+                        
assertNotNull(exchange.getIn(AttachmentMessage.class).getAttachment("part1"));
+                        
assertNotNull(exchange.getIn(AttachmentMessage.class).getAttachment("part2"));
                         assertNull(exchange.getIn().getHeader("part1"));
                         assertNull(exchange.getIn().getHeader("part2"));
                         assertEquals(Customer.class, 
exchange.getIn().getHeader("body").getClass());
@@ -186,8 +187,8 @@ public class CxfRsConsumerSimpleBindingTest extends 
CamelTestSupport {
                 
                 from("direct:multipartPostWithoutParameters").process(new 
Processor() {
                     public void process(Exchange exchange) throws Exception {
-                        assertNotNull(exchange.getIn().getAttachment("part1"));
-                        assertNotNull(exchange.getIn().getAttachment("part2"));
+                        
assertNotNull(exchange.getIn(AttachmentMessage.class).getAttachment("part1"));
+                        
assertNotNull(exchange.getIn(AttachmentMessage.class).getAttachment("part2"));
                         assertNull(exchange.getIn().getHeader("part1"));
                         assertNull(exchange.getIn().getHeader("part2"));
                         assertEquals(Customer.class, 
exchange.getIn().getHeader("body").getClass());
diff --git 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfJavaMtomProducerPayloadTest.java
 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfJavaMtomProducerPayloadTest.java
index 15f4016..24a7902 100644
--- 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfJavaMtomProducerPayloadTest.java
+++ 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfJavaMtomProducerPayloadTest.java
@@ -22,6 +22,7 @@ import javax.xml.ws.Holder;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.junit.Test;
 
 public class CxfJavaMtomProducerPayloadTest extends CxfMtomConsumerTest {
@@ -50,7 +51,7 @@ public class CxfJavaMtomProducerPayloadTest extends 
CxfMtomConsumerTest {
         });
         
         // Make sure we don't put the attachement into out message
-        assertEquals("The attachement size should be 0 ", 0, 
exchange.getOut().getAttachments().size());
+        assertEquals("The attachement size should be 0 ", 0, 
exchange.getOut(AttachmentMessage.class).getAttachments().size());
         
         Object[] result = exchange.getOut().getBody(Object[].class);
         
diff --git 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomConsumerPayloadModeTest.java
 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomConsumerPayloadModeTest.java
index ad538cf..360bd3a 100644
--- 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomConsumerPayloadModeTest.java
+++ 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomConsumerPayloadModeTest.java
@@ -28,6 +28,7 @@ import javax.xml.transform.Source;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.xpath.XPathConstants;
 
+import org.apache.camel.attachment.AttachmentMessage;
 import org.w3c.dom.Element;
 
 import org.apache.camel.CamelContext;
@@ -75,10 +76,10 @@ public class CxfMtomConsumerPayloadModeTest extends 
AbstractJUnit4SpringContextT
                 CxfPayload<SoapHeader> body = new CxfPayload<>(new 
ArrayList<SoapHeader>(),
                     elements, null);
                 exchange.getIn().setBody(body);
-                exchange.getIn().addAttachment(MtomTestHelper.REQ_PHOTO_CID, 
+                
exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_PHOTO_CID,
                     new DataHandler(new 
ByteArrayDataSource(MtomTestHelper.REQ_PHOTO_DATA, 
"application/octet-stream")));
 
-                exchange.getIn().addAttachment(MtomTestHelper.REQ_IMAGE_CID, 
+                
exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_IMAGE_CID,
                     new DataHandler(new 
ByteArrayDataSource(MtomTestHelper.requestJpeg, "image/jpeg")));
             }
         });
@@ -110,11 +111,11 @@ public class CxfMtomConsumerPayloadModeTest extends 
AbstractJUnit4SpringContextT
             String imageId = ele.getAttribute("href").substring(4); // skip 
"cid:"
             assertEquals(MtomTestHelper.REQ_IMAGE_CID, imageId);
 
-            DataHandler dr = exchange.getIn().getAttachment(photoId);
+            DataHandler dr = 
exchange.getIn(AttachmentMessage.class).getAttachment(photoId);
             assertEquals("application/octet-stream", dr.getContentType());
             MtomTestHelper.assertEquals(MtomTestHelper.REQ_PHOTO_DATA, 
IOUtils.readBytesFromStream(dr.getInputStream()));
        
-            dr = exchange.getIn().getAttachment(imageId);
+            dr = 
exchange.getIn(AttachmentMessage.class).getAttachment(imageId);
             assertEquals("image/jpeg", dr.getContentType());
             MtomTestHelper.assertEquals(MtomTestHelper.requestJpeg, 
IOUtils.readBytesFromStream(dr.getInputStream()));
 
@@ -124,10 +125,10 @@ public class CxfMtomConsumerPayloadModeTest extends 
AbstractJUnit4SpringContextT
             CxfPayload<SoapHeader> sbody = new CxfPayload<>(new 
ArrayList<SoapHeader>(),
                 elements, null);
             exchange.getOut().setBody(sbody);
-            exchange.getOut().addAttachment(MtomTestHelper.RESP_PHOTO_CID, 
+            
exchange.getOut(AttachmentMessage.class).addAttachment(MtomTestHelper.RESP_PHOTO_CID,
                 new DataHandler(new 
ByteArrayDataSource(MtomTestHelper.RESP_PHOTO_DATA, 
"application/octet-stream")));
 
-            exchange.getOut().addAttachment(MtomTestHelper.RESP_IMAGE_CID, 
+            
exchange.getOut(AttachmentMessage.class).addAttachment(MtomTestHelper.RESP_IMAGE_CID,
                 new DataHandler(new 
ByteArrayDataSource(MtomTestHelper.responseJpeg, "image/jpeg")));
 
         }
diff --git 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomConsumerTest.java
 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomConsumerTest.java
index 0a84fcf..df22843 100644
--- 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomConsumerTest.java
+++ 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomConsumerTest.java
@@ -29,6 +29,7 @@ import javax.xml.ws.soap.SOAPBinding;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.cxf.CXFTestSupport;
 import org.apache.camel.cxf.mtom_feature.Hello;
@@ -53,7 +54,7 @@ public class CxfMtomConsumerTest extends CamelTestSupport {
                 from(MTOM_ENDPOINT_URI).process(new Processor() {
                     @SuppressWarnings("unchecked")
                     public void process(final Exchange exchange) throws 
Exception {
-                        Message in = exchange.getIn();
+                        AttachmentMessage in = 
exchange.getIn(AttachmentMessage.class);
                         assertEquals("We should not get any attachements 
here.", 0, in.getAttachments().size());
                         assertEquals("Get a wrong Content-Type header", 
"application/xop+xml", in.getHeader("Content-Type"));
                         // Get the parameter list
diff --git 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomDisabledConsumerPayloadModeTest.java
 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomDisabledConsumerPayloadModeTest.java
index eef3b39..f872e05 100644
--- 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomDisabledConsumerPayloadModeTest.java
+++ 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomDisabledConsumerPayloadModeTest.java
@@ -27,6 +27,7 @@ import javax.xml.transform.dom.DOMSource;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.component.cxf.CXFTestSupport;
 import org.apache.camel.component.cxf.CxfPayload;
 import org.apache.cxf.binding.soap.SoapHeader;
@@ -57,11 +58,11 @@ public class CxfMtomDisabledConsumerPayloadModeTest extends 
CxfMtomConsumerPaylo
             // verify request
             Assert.assertEquals(1, in.getBody().size());
             
-            DataHandler dr = 
exchange.getIn().getAttachment(MtomTestHelper.REQ_PHOTO_CID);
+            DataHandler dr = 
exchange.getIn(AttachmentMessage.class).getAttachment(MtomTestHelper.REQ_PHOTO_CID);
             Assert.assertEquals("application/octet-stream", 
dr.getContentType());
             MtomTestHelper.assertEquals(MtomTestHelper.REQ_PHOTO_DATA, 
IOUtils.readBytesFromStream(dr.getInputStream()));
        
-            dr = exchange.getIn().getAttachment(MtomTestHelper.REQ_IMAGE_CID);
+            dr = 
exchange.getIn(AttachmentMessage.class).getAttachment(MtomTestHelper.REQ_IMAGE_CID);
             Assert.assertEquals("image/jpeg", dr.getContentType());
             MtomTestHelper.assertEquals(MtomTestHelper.requestJpeg, 
IOUtils.readBytesFromStream(dr.getInputStream()));
 
@@ -71,10 +72,10 @@ public class CxfMtomDisabledConsumerPayloadModeTest extends 
CxfMtomConsumerPaylo
             CxfPayload<SoapHeader> body = new CxfPayload<>(new 
ArrayList<SoapHeader>(),
                 elements, null);
             exchange.getOut().setBody(body);
-            exchange.getOut().addAttachment(MtomTestHelper.RESP_PHOTO_CID, 
+            
exchange.getOut(AttachmentMessage.class).addAttachment(MtomTestHelper.RESP_PHOTO_CID,
                 new DataHandler(new 
ByteArrayDataSource(MtomTestHelper.RESP_PHOTO_DATA, 
"application/octet-stream")));
 
-            exchange.getOut().addAttachment(MtomTestHelper.RESP_IMAGE_CID, 
+            
exchange.getOut(AttachmentMessage.class).addAttachment(MtomTestHelper.RESP_IMAGE_CID,
                 new DataHandler(new 
ByteArrayDataSource(MtomTestHelper.responseJpeg, "image/jpeg")));
 
         }
diff --git 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomDisabledProducerPayloadModeTest.java
 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomDisabledProducerPayloadModeTest.java
index ea5b945..d2671e5 100644
--- 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomDisabledProducerPayloadModeTest.java
+++ 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomDisabledProducerPayloadModeTest.java
@@ -39,6 +39,7 @@ import javax.xml.ws.handler.MessageContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
 import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.component.cxf.CxfPayload;
 import org.apache.camel.cxf.mtom_feature.Hello;
 import org.apache.cxf.attachment.AttachmentDataSource;
@@ -86,10 +87,10 @@ public class CxfMtomDisabledProducerPayloadModeTest extends 
CxfMtomProducerPaylo
                 CxfPayload<SoapHeader> body = new CxfPayload<>(new 
ArrayList<SoapHeader>(),
                     elements, null);
                 exchange.getIn().setBody(body);
-                exchange.getIn().addAttachment(MtomTestHelper.REQ_PHOTO_CID, 
+                
exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_PHOTO_CID,
                     new DataHandler(new 
ByteArrayDataSource(MtomTestHelper.REQ_PHOTO_DATA, 
"application/octet-stream")));
 
-                exchange.getIn().addAttachment(MtomTestHelper.REQ_IMAGE_CID, 
+                
exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_IMAGE_CID,
                     new DataHandler(new 
ByteArrayDataSource(MtomTestHelper.requestJpeg, "image/jpeg")));
 
             }
@@ -102,11 +103,11 @@ public class CxfMtomDisabledProducerPayloadModeTest 
extends CxfMtomProducerPaylo
         Assert.assertEquals(1, out.getBody().size());
         
 
-        DataHandler dr = 
exchange.getOut().getAttachment(MtomTestHelper.RESP_PHOTO_CID);
+        DataHandler dr = 
exchange.getOut(AttachmentMessage.class).getAttachment(MtomTestHelper.RESP_PHOTO_CID);
         Assert.assertEquals("application/octet-stream", dr.getContentType());
         MtomTestHelper.assertEquals(MtomTestHelper.RESP_PHOTO_DATA, 
IOUtils.readBytesFromStream(dr.getInputStream()));
    
-        dr = exchange.getOut().getAttachment(MtomTestHelper.RESP_IMAGE_CID);
+        dr = 
exchange.getOut(AttachmentMessage.class).getAttachment(MtomTestHelper.RESP_IMAGE_CID);
         Assert.assertEquals("image/jpeg", dr.getContentType());
         
         BufferedImage image = ImageIO.read(dr.getInputStream());
diff --git 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomPOJOProducerTest.java
 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomPOJOProducerTest.java
index 32e319d..a918eb0 100644
--- 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomPOJOProducerTest.java
+++ 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomPOJOProducerTest.java
@@ -27,6 +27,7 @@ import javax.xml.ws.soap.SOAPBinding;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.component.cxf.CXFTestSupport;
 import org.junit.After;
 import org.junit.Assert;
@@ -84,7 +85,7 @@ public class CxfMtomPOJOProducerTest extends 
AbstractJUnit4SpringContextTests {
             
         });
         
-        assertEquals("The attachement size should be 2 ", 2, 
exchange.getOut().getAttachments().size());
+        assertEquals("The attachement size should be 2 ", 2, 
exchange.getOut(AttachmentMessage.class).getAttachments().size());
         
         Object[] result = exchange.getOut().getBody(Object[].class);
         Holder<byte[]> photo1 = (Holder<byte[]>) result[1];
diff --git 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomProducerPayloadModeTest.java
 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomProducerPayloadModeTest.java
index e75a9f7..0bbe8fc 100644
--- 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomProducerPayloadModeTest.java
+++ 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomProducerPayloadModeTest.java
@@ -33,6 +33,7 @@ import javax.xml.ws.Endpoint;
 import javax.xml.ws.soap.SOAPBinding;
 import javax.xml.xpath.XPathConstants;
 
+import org.apache.camel.attachment.AttachmentMessage;
 import org.w3c.dom.Element;
 
 import org.apache.camel.CamelContext;
@@ -99,10 +100,10 @@ public class CxfMtomProducerPayloadModeTest extends 
AbstractJUnit4SpringContextT
                 CxfPayload<SoapHeader> body = new CxfPayload<>(new 
ArrayList<SoapHeader>(),
                     elements, null);
                 exchange.getIn().setBody(body);
-                exchange.getIn().addAttachment(MtomTestHelper.REQ_PHOTO_CID, 
+                
exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_PHOTO_CID,
                     new DataHandler(new 
ByteArrayDataSource(MtomTestHelper.REQ_PHOTO_DATA, 
"application/octet-stream")));
 
-                exchange.getIn().addAttachment(MtomTestHelper.REQ_IMAGE_CID, 
+                
exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_IMAGE_CID,
                     new DataHandler(new 
ByteArrayDataSource(MtomTestHelper.requestJpeg, "image/jpeg")));
 
             }
@@ -129,11 +130,11 @@ public class CxfMtomProducerPayloadModeTest extends 
AbstractJUnit4SpringContextT
         String imageId = ele.getAttribute("href").substring(4); // skip "cid:"
 
         
-        DataHandler dr = 
exchange.getOut().getAttachment(decodingReference(photoId));
+        DataHandler dr = 
exchange.getOut(AttachmentMessage.class).getAttachment(decodingReference(photoId));
         Assert.assertEquals("application/octet-stream", dr.getContentType());
         MtomTestHelper.assertEquals(MtomTestHelper.RESP_PHOTO_DATA, 
IOUtils.readBytesFromStream(dr.getInputStream()));
    
-        dr = exchange.getOut().getAttachment(decodingReference(imageId));
+        dr = 
exchange.getOut(AttachmentMessage.class).getAttachment(decodingReference(imageId));
         Assert.assertEquals("image/jpeg", dr.getContentType());
         
         BufferedImage image = ImageIO.read(dr.getInputStream());
diff --git 
a/components/camel-freemarker/src/main/java/org/apache/camel/component/freemarker/FreemarkerEndpoint.java
 
b/components/camel-freemarker/src/main/java/org/apache/camel/component/freemarker/FreemarkerEndpoint.java
index 4fe1013..00541bd 100644
--- 
a/components/camel-freemarker/src/main/java/org/apache/camel/component/freemarker/FreemarkerEndpoint.java
+++ 
b/components/camel-freemarker/src/main/java/org/apache/camel/component/freemarker/FreemarkerEndpoint.java
@@ -157,6 +157,5 @@ public class FreemarkerEndpoint extends ResourceEndpoint {
         Message out = exchange.getOut();
         out.setBody(buffer.toString());
         out.setHeaders(exchange.getIn().getHeaders());
-        out.setAttachments(exchange.getIn().getAttachments());
     }
 }
\ No newline at end of file
diff --git 
a/components/camel-gora/src/main/java/org/apache/camel/component/gora/GoraProducer.java
 
b/components/camel-gora/src/main/java/org/apache/camel/component/gora/GoraProducer.java
index 0ff3b2a..2fa389a 100644
--- 
a/components/camel-gora/src/main/java/org/apache/camel/component/gora/GoraProducer.java
+++ 
b/components/camel-gora/src/main/java/org/apache/camel/component/gora/GoraProducer.java
@@ -102,9 +102,8 @@ public class GoraProducer extends DefaultProducer {
         }
 
         exchange.getOut().setBody(result);
-        // preserve headers and attachments
+        // preserve headers
         exchange.getOut().setHeaders(exchange.getIn().getHeaders());
-        exchange.getOut().setAttachments(exchange.getIn().getAttachments());
     }
 
 }
diff --git a/components/camel-http-common/pom.xml 
b/components/camel-http-common/pom.xml
index 5336a42..0e08ff4 100644
--- a/components/camel-http-common/pom.xml
+++ b/components/camel-http-common/pom.xml
@@ -44,9 +44,18 @@
         <!-- TODO: requires camel-core due camel.cloud is not in camel-support 
-->
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-core</artifactId>
+            <artifactId>camel-cloud</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-support</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-attachments</artifactId>
+        </dependency>
+
+        <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
             <version>${javax.servlet-api-version}</version>
diff --git 
a/components/camel-http-common/src/main/java/org/apache/camel/http/common/DefaultHttpBinding.java
 
b/components/camel-http-common/src/main/java/org/apache/camel/http/common/DefaultHttpBinding.java
index 78efca1..320fd2a 100644
--- 
a/components/camel-http-common/src/main/java/org/apache/camel/http/common/DefaultHttpBinding.java
+++ 
b/components/camel-http-common/src/main/java/org/apache/camel/http/common/DefaultHttpBinding.java
@@ -44,6 +44,7 @@ import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.Message;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.StreamCache;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.converter.stream.CachedOutputStream;
 import org.apache.camel.spi.HeaderFilterStrategy;
 import org.apache.camel.support.ExchangeHelper;
@@ -316,7 +317,8 @@ public class DefaultHttpBinding implements HttpBinding {
                     }
                 }
                 if (accepted) {
-                    message.addAttachment(fileName, new DataHandler(new 
CamelFileDataSource((File) object, fileName)));
+                    AttachmentMessage am = 
message.getExchange().getMessage(AttachmentMessage.class);
+                    am.addAttachment(fileName, new DataHandler(new 
CamelFileDataSource((File) object, fileName)));
                 } else {
                     LOG.debug("Cannot add file as attachment: {} because the 
file is not accepted according to fileNameExtWhitelist: {}", fileName, 
fileNameExtWhitelist);
                 }
diff --git 
a/components/camel-jetty/src/main/java/org/apache/camel/component/jetty9/AttachmentHttpBinding.java
 
b/components/camel-jetty/src/main/java/org/apache/camel/component/jetty9/AttachmentHttpBinding.java
index fd5c00a..10ff26a 100644
--- 
a/components/camel-jetty/src/main/java/org/apache/camel/component/jetty9/AttachmentHttpBinding.java
+++ 
b/components/camel-jetty/src/main/java/org/apache/camel/component/jetty9/AttachmentHttpBinding.java
@@ -28,13 +28,14 @@ import javax.activation.DataSource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.Part;
 
-import org.apache.camel.Attachment;
 import org.apache.camel.Exchange;
 import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.attachment.Attachment;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.attachment.DefaultAttachment;
 import org.apache.camel.http.common.DefaultHttpBinding;
 import org.apache.camel.http.common.HttpHelper;
 import org.apache.camel.http.common.HttpMessage;
-import org.apache.camel.support.DefaultAttachment;
 import org.eclipse.jetty.util.MultiPartInputStreamParser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -66,7 +67,8 @@ final class AttachmentHttpBinding extends DefaultHttpBinding {
                             attachment.addHeader(headerName, headerValue);
                         }
                     }
-                    message.addAttachmentObject(part.getName(), attachment);
+                    AttachmentMessage am = 
message.getExchange().getMessage(AttachmentMessage.class);
+                    am.addAttachmentObject(part.getName(), attachment);
                 }
             } catch (Exception e) {
                 throw new RuntimeCamelException("Cannot populate attachments", 
e);
@@ -82,12 +84,14 @@ final class AttachmentHttpBinding extends 
DefaultHttpBinding {
             org.eclipse.jetty.server.Request jettyRequest = 
(org.eclipse.jetty.server.Request)request;
             jettyRequest.getHttpFields().remove(Exchange.CONTENT_ENCODING);
         }
-        
+
+        AttachmentMessage am = 
message.getExchange().getMessage(AttachmentMessage.class);
+
         Enumeration<?> names = request.getParameterNames();
         while (names.hasMoreElements()) {
             String name = (String)names.nextElement();
-            if (message.getAttachment(name) != null) {
-                DataHandler dh = message.getAttachment(name);
+            if (am.getAttachment(name) != null) {
+                DataHandler dh = am.getAttachment(name);
                 Object value = dh;
                 if (dh.getContentType() == null || 
dh.getContentType().startsWith("text/plain")) {
                     value = request.getParameter(name);
diff --git 
a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeMultipartRouteTest.java
 
b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeMultipartRouteTest.java
index bd69e9c..53d0bd0 100644
--- 
a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeMultipartRouteTest.java
+++ 
b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpBridgeMultipartRouteTest.java
@@ -21,6 +21,7 @@ import java.io.File;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.http4.HttpEndpoint;
 import org.apache.camel.support.DefaultHeaderFilterStrategy;
@@ -79,7 +80,7 @@ public class HttpBridgeMultipartRouteTest extends 
BaseJettyTest {
 
                 Processor serviceProc = new Processor() {
                     public void process(Exchange exchange) throws Exception {
-                        Message in = exchange.getIn();
+                        AttachmentMessage in = 
exchange.getIn(AttachmentMessage.class);
                         // put the number of attachments in a response header
                         exchange.getOut().setHeader("numAttachments", 
in.getAttachments().size());
                         exchange.getOut().setBody(in.getHeader("body"));
diff --git 
a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/MultiPartFormOkHttpTest.java
 
b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/MultiPartFormOkHttpTest.java
index 6e05b96..fa2483e 100644
--- 
a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/MultiPartFormOkHttpTest.java
+++ 
b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/MultiPartFormOkHttpTest.java
@@ -25,6 +25,7 @@ import okhttp3.RequestBody;
 import okhttp3.Response;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.junit.Test;
 
@@ -58,11 +59,12 @@ public class MultiPartFormOkHttpTest extends BaseJettyTest {
             public void configure() throws Exception {
                 from("jetty://http://localhost:{{port}}/test";).process(new 
Processor() {
                     public void process(Exchange exchange) throws Exception {
-                        assertTrue("Should have attachment", 
exchange.getIn().hasAttachments());
+                        AttachmentMessage message = 
exchange.getMessage(AttachmentMessage.class);
+                        assertTrue("Should have attachment", 
message.hasAttachments());
 
-                        InputStream is = 
exchange.getIn().getAttachment("test").getInputStream();
+                        InputStream is = 
message.getAttachment("test").getInputStream();
                         assertNotNull(is);
-                        assertEquals("form-data; name=\"test\"", 
exchange.getIn().getAttachmentObject("test").getHeader("content-disposition"));
+                        assertEquals("form-data; name=\"test\"", 
message.getAttachmentObject("test").getHeader("content-disposition"));
                         String data = 
exchange.getContext().getTypeConverter().convertTo(String.class, exchange, is);
                         assertNotNull("Should have data", data);
                         assertEquals("some data here", data);
diff --git 
a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/MultiPartFormTest.java
 
b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/MultiPartFormTest.java
index 51740f1..2b884ae 100644
--- 
a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/MultiPartFormTest.java
+++ 
b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/MultiPartFormTest.java
@@ -23,6 +23,7 @@ import javax.activation.DataHandler;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.util.IOHelper;
 import org.apache.http.HttpEntity;
@@ -76,7 +77,7 @@ public class MultiPartFormTest extends BaseJettyTest {
                 from("jetty://http://localhost:{{port}}/test";).process(new 
Processor() {
 
                     public void process(Exchange exchange) throws Exception {
-                        Message in = exchange.getIn();
+                        AttachmentMessage in = 
exchange.getIn(AttachmentMessage.class);
                         assertEquals("Get a wrong attachement size", 2, 
in.getAttachments().size());
                         // The file name is attachment id
                         DataHandler data = 
in.getAttachment("log4j2.properties");
diff --git 
a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/MultiPartFormWithCustomFilterTest.java
 
b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/MultiPartFormWithCustomFilterTest.java
index 22b40de..4a5face 100644
--- 
a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/MultiPartFormWithCustomFilterTest.java
+++ 
b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/MultiPartFormWithCustomFilterTest.java
@@ -27,8 +27,8 @@ import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.camel.Exchange;
-import org.apache.camel.Message;
 import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.JndiRegistry;
 import org.apache.commons.httpclient.HttpClient;
@@ -113,7 +113,7 @@ public class MultiPartFormWithCustomFilterTest extends 
BaseJettyTest {
                 
                 
from("jetty://http://localhost:{{port}}/test?multipartFilterRef=myMultipartFilter";).process(new
 Processor() {
                     public void process(Exchange exchange) throws Exception {
-                        Message in = exchange.getIn();
+                        AttachmentMessage in = 
exchange.getMessage(AttachmentMessage.class);
                         assertEquals("Get a wrong attachement size", 2, 
in.getAttachments().size());
                         // The file name is attachment id
                         DataHandler data = 
in.getAttachment("log4j2.properties");
@@ -137,7 +137,7 @@ public class MultiPartFormWithCustomFilterTest extends 
BaseJettyTest {
                 // Test to ensure that setting a multipartFilterRef overrides 
the enableMultipartFilter=false parameter
                 
from("jetty://http://localhost:{{port}}/test2?multipartFilterRef=myMultipartFilter&enableMultipartFilter=false";).process(new
 Processor() {
                     public void process(Exchange exchange) throws Exception {
-                        Message in = exchange.getIn();
+                        AttachmentMessage in = 
exchange.getMessage(AttachmentMessage.class);
                         assertEquals("Get a wrong attachement size", 2, 
in.getAttachments().size());
                         DataHandler data = 
in.getAttachment("log4j2.properties");
 
diff --git 
a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java
 
b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java
index 73fdb45..440635d 100644
--- 
a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java
+++ 
b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java
@@ -100,11 +100,6 @@ public class JmsMessage extends DefaultMessage {
         if (that.hasHeaders()) {
             getHeaders().putAll(that.getHeaders());
         }
-
-        getAttachments().clear();
-        if (that.hasAttachments()) {
-            getAttachmentObjects().putAll(that.getAttachmentObjects());
-        }
     }
 
     public JmsBinding getBinding() {
diff --git 
a/components/camel-jolt/src/main/java/org/apache/camel/component/jolt/JoltEndpoint.java
 
b/components/camel-jolt/src/main/java/org/apache/camel/component/jolt/JoltEndpoint.java
index 246dfc2..b55e2d4 100644
--- 
a/components/camel-jolt/src/main/java/org/apache/camel/component/jolt/JoltEndpoint.java
+++ 
b/components/camel-jolt/src/main/java/org/apache/camel/component/jolt/JoltEndpoint.java
@@ -191,6 +191,5 @@ public class JoltEndpoint extends ResourceEndpoint {
             out.setBody(output);
         }
         out.setHeaders(exchange.getIn().getHeaders());
-        out.setAttachments(exchange.getIn().getAttachments());
     }
 }
diff --git 
a/components/camel-ldap/src/main/java/org/apache/camel/component/ldap/LdapProducer.java
 
b/components/camel-ldap/src/main/java/org/apache/camel/component/ldap/LdapProducer.java
index a6f9462..ecaa452 100644
--- 
a/components/camel-ldap/src/main/java/org/apache/camel/component/ldap/LdapProducer.java
+++ 
b/components/camel-ldap/src/main/java/org/apache/camel/component/ldap/LdapProducer.java
@@ -78,7 +78,6 @@ public class LdapProducer extends DefaultProducer {
             }
             exchange.getOut().setBody(data);
             exchange.getOut().setHeaders(exchange.getIn().getHeaders());
-            
exchange.getOut().setAttachments(exchange.getIn().getAttachments());
         } finally {
             if (dirContext != null) {
                 dirContext.close();
diff --git a/components/camel-mail/pom.xml b/components/camel-mail/pom.xml
index a0d0f766..253350b 100644
--- a/components/camel-mail/pom.xml
+++ b/components/camel-mail/pom.xml
@@ -41,6 +41,10 @@
             <artifactId>camel-support</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-attachments</artifactId>
+        </dependency>
+        <dependency>
             <groupId>com.sun.mail</groupId>
             <artifactId>javax.mail</artifactId>
             <version>${javax-mail-version}</version>
diff --git 
a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java
 
b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java
index 048bc4d..603313b 100644
--- 
a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java
+++ 
b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java
@@ -45,11 +45,12 @@ import javax.mail.internet.MimeMultipart;
 import javax.mail.internet.MimeUtility;
 import javax.mail.util.ByteArrayDataSource;
 
-import org.apache.camel.Attachment;
 import org.apache.camel.Exchange;
 import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.attachment.Attachment;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.attachment.DefaultAttachment;
 import org.apache.camel.spi.HeaderFilterStrategy;
-import org.apache.camel.support.DefaultAttachment;
 import org.apache.camel.support.DefaultHeaderFilterStrategy;
 import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.support.ObjectHelper;
@@ -129,7 +130,7 @@ public class MailBinding {
         if (hasAlternativeBody(endpoint.getConfiguration(), exchange)) {
             createMultipartAlternativeMessage(mimeMessage, 
endpoint.getConfiguration(), exchange);
         } else {
-            if (exchange.getIn().hasAttachments()) {
+            if (exchange.getIn(AttachmentMessage.class).hasAttachments()) {
                 appendAttachmentsFromCamel(mimeMessage, 
endpoint.getConfiguration(), exchange);
             } else {
                 populateContentOnMimeMessage(mimeMessage, 
endpoint.getConfiguration(), exchange);
@@ -467,7 +468,7 @@ public class MailBinding {
         addBodyToMultipart(configuration, multipart, exchange);
         String partDisposition = configuration.isUseInlineAttachments() ? 
Part.INLINE : Part.ATTACHMENT;
         AttachmentsContentTransferEncodingResolver 
contentTransferEncodingResolver = 
configuration.getAttachmentsContentTransferEncodingResolver();
-        if (exchange.getIn().hasAttachments()) {
+        if (exchange.getIn(AttachmentMessage.class).hasAttachments()) {
             addAttachmentsToMultipart(multipart, partDisposition, 
contentTransferEncodingResolver, exchange);
         }
         return multipart;
@@ -477,7 +478,7 @@ public class MailBinding {
                                              
AttachmentsContentTransferEncodingResolver encodingResolver, Exchange exchange) 
throws MessagingException {
         LOG.trace("Adding attachments +++ start +++");
         int i = 0;
-        for (Map.Entry<String, Attachment> entry : 
exchange.getIn().getAttachmentObjects().entrySet()) {
+        for (Map.Entry<String, Attachment> entry : 
exchange.getIn(AttachmentMessage.class).getAttachmentObjects().entrySet()) {
             String attachmentFilename = entry.getKey();
             Attachment attachment = entry.getValue();
 
@@ -565,7 +566,7 @@ public class MailBinding {
         multipartAlternative.addBodyPart(plainText);
 
         // if there are no attachments, add the body to the same mulitpart 
message
-        if (!exchange.getIn().hasAttachments()) {
+        if (!exchange.getIn(AttachmentMessage.class).hasAttachments()) {
             addBodyToMultipart(configuration, multipartAlternative, exchange);
         } else {
             // if there are attachments, but they aren't set to be inline, add 
them to
diff --git 
a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConsumer.java
 
b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConsumer.java
index 9384976..6acb9f5 100644
--- 
a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConsumer.java
+++ 
b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConsumer.java
@@ -351,7 +351,6 @@ public class MailConsumer extends 
ScheduledBatchPollingConsumer {
                         log.trace("Mapping #{} from javax.mail.Message to 
Camel MailMessage", i);
                         exchange.getIn().getBody();
                         exchange.getIn().getHeaders();
-                        exchange.getIn().getAttachments();
                     }
 
                     // If the protocol is POP3 we need to remember the uid on 
the exchange
diff --git 
a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailMessage.java
 
b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailMessage.java
index 6c24104..836c9ee 100644
--- 
a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailMessage.java
+++ 
b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailMessage.java
@@ -18,11 +18,9 @@ package org.apache.camel.component.mail;
 
 import java.io.IOException;
 import java.util.Map;
-
 import javax.mail.Message;
 import javax.mail.MessagingException;
 
-import org.apache.camel.Attachment;
 import org.apache.camel.Exchange;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.support.DefaultMessage;
@@ -55,13 +53,6 @@ public class MailMessage extends DefaultMessage {
         MailMessage answer = (MailMessage)super.copy();
         answer.originalMailMessage = originalMailMessage;
         answer.mailMessage = mailMessage;
-
-        if (mapMailMessage) {
-            // force attachments to be created (by getting attachments) to 
ensure they are always available due Camel error handler
-            // makes defensive copies, and we have optimized it to avoid 
populating initial attachments, when not needed,
-            // as all other Camel components do not use attachments
-            getAttachments();
-        }
         return answer;
     }
 
@@ -116,20 +107,6 @@ public class MailMessage extends DefaultMessage {
         }
     }
 
-    @Override
-    protected void populateInitialAttachments(Map<String, Attachment> map) {
-        if (mailMessage != null) {
-            try {
-                MailBinding binding = ExchangeHelper.getBinding(getExchange(), 
MailBinding.class);
-                if (binding != null) {
-                    binding.extractAttachmentsFromMail(mailMessage, map);
-                }
-            } catch (Exception e) {
-                throw new RuntimeCamelException("Error populating the initial 
mail message attachments", e);
-            }
-        }
-    }
-
     public void copyFrom(org.apache.camel.Message that) {
         // only do a deep copy if we need to (yes when that is not a mail 
message, or if the mapMailMessage is true)
         boolean needCopy = !(that instanceof MailMessage) || (((MailMessage) 
that).mapMailMessage);
diff --git 
a/components/camel-mail/src/main/java/org/apache/camel/component/mail/SplitAttachmentsExpression.java
 
b/components/camel-mail/src/main/java/org/apache/camel/component/mail/SplitAttachmentsExpression.java
index 98f57c4..66feaf7 100644
--- 
a/components/camel-mail/src/main/java/org/apache/camel/component/mail/SplitAttachmentsExpression.java
+++ 
b/components/camel-mail/src/main/java/org/apache/camel/component/mail/SplitAttachmentsExpression.java
@@ -22,10 +22,11 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.camel.Attachment;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.attachment.Attachment;
 import org.apache.camel.support.DefaultMessage;
 import org.apache.camel.support.ExpressionAdapter;
 import org.apache.camel.util.IOHelper;
@@ -71,13 +72,13 @@ public class SplitAttachmentsExpression extends 
ExpressionAdapter {
     @Override
     public Object evaluate(Exchange exchange) {
         // must use getAttachments to ensure attachments is initial populated
-        if (exchange.getIn().getAttachments().isEmpty()) {
+        if (!exchange.getIn(AttachmentMessage.class).hasAttachments()) {
             return null;
         }
 
         try {
             List<Message> answer = new ArrayList<>();
-            Message inMessage = exchange.getIn();
+            AttachmentMessage inMessage = 
exchange.getIn(AttachmentMessage.class);
             for (Map.Entry<String, Attachment> entry : 
inMessage.getAttachmentObjects().entrySet()) {
                 Message attachmentMessage;
                 if (extractAttachments) {
@@ -99,14 +100,15 @@ public class SplitAttachmentsExpression extends 
ExpressionAdapter {
 
     private Message splitAttachment(Message inMessage, String attachmentName, 
Attachment attachmentHandler) {
         final Message copy = inMessage.copy();
-        Map<String, Attachment> attachments = copy.getAttachmentObjects();
+        final AttachmentMessage am = 
copy.getExchange().getMessage(AttachmentMessage.class);
+        Map<String, Attachment> attachments = am.getAttachmentObjects();
         attachments.clear();
         attachments.put(attachmentName, attachmentHandler);
         copy.setHeader(HEADER_NAME, attachmentName);
         return copy;
     }
 
-    private Message extractAttachment(Message inMessage, String 
attachmentName) throws Exception {
+    private Message extractAttachment(AttachmentMessage inMessage, String 
attachmentName) throws Exception {
         final Message outMessage = new 
DefaultMessage(inMessage.getExchange().getContext());
         outMessage.setHeader(HEADER_NAME, attachmentName);
         Object attachment = 
inMessage.getAttachment(attachmentName).getContent();
diff --git 
a/components/camel-mail/src/main/java/org/apache/camel/dataformat/mime/multipart/MimeMultipartDataFormat.java
 
b/components/camel-mail/src/main/java/org/apache/camel/dataformat/mime/multipart/MimeMultipartDataFormat.java
index 975902f..95ce503 100644
--- 
a/components/camel-mail/src/main/java/org/apache/camel/dataformat/mime/multipart/MimeMultipartDataFormat.java
+++ 
b/components/camel-mail/src/main/java/org/apache/camel/dataformat/mime/multipart/MimeMultipartDataFormat.java
@@ -44,12 +44,13 @@ import javax.mail.internet.MimeUtility;
 import javax.mail.internet.ParseException;
 import javax.mail.util.ByteArrayDataSource;
 
-import org.apache.camel.Attachment;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.NoTypeConversionAvailableException;
+import org.apache.camel.attachment.Attachment;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.attachment.DefaultAttachment;
 import org.apache.camel.spi.annotations.Dataformat;
-import org.apache.camel.support.DefaultAttachment;
 import org.apache.camel.support.DefaultDataFormat;
 import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.support.MessageHelper;
@@ -94,7 +95,7 @@ public class MimeMultipartDataFormat extends 
DefaultDataFormat {
     @Override
     public void marshal(Exchange exchange, Object graph, OutputStream stream)
             throws NoTypeConversionAvailableException, MessagingException, 
IOException {
-        if (multipartWithoutAttachment || headersInline || 
exchange.getIn().hasAttachments()) {
+        if (multipartWithoutAttachment || headersInline || 
exchange.getIn(AttachmentMessage.class).hasAttachments()) {
             ContentType contentType = getContentType(exchange);
             // remove the Content-Type header. This will be wrong afterwards...
             exchange.getOut().removeHeader(Exchange.CONTENT_TYPE);
@@ -105,27 +106,29 @@ public class MimeMultipartDataFormat extends 
DefaultDataFormat {
             BodyPart part = new MimeBodyPart();
             writeBodyPart(bodyContent, part, contentType);
             mp.addBodyPart(part);
-            for (Map.Entry<String, Attachment> entry : 
exchange.getIn().getAttachmentObjects().entrySet()) {
-                String attachmentFilename = entry.getKey();
-                Attachment attachment = entry.getValue();
-                part = new MimeBodyPart();
-                part.setDataHandler(attachment.getDataHandler());
-                part.setFileName(MimeUtility.encodeText(attachmentFilename, 
"UTF-8", null));
-                String ct = attachment.getDataHandler().getContentType();
-                contentType = new ContentType(ct);
-                part.setHeader(CONTENT_TYPE, ct);
-                if (!contentType.match("text/*") && binaryContent) {
-                    part.setHeader(CONTENT_TRANSFER_ENCODING, "binary");
-                }
-                // Set headers to the attachment
-                for (String headerName : attachment.getHeaderNames()) {
-                    List<String> values = 
attachment.getHeaderAsList(headerName);
-                    for (String value : values) {
-                        part.setHeader(headerName, value);
+            if (exchange.getIn(AttachmentMessage.class).hasAttachments()) {
+                for (Map.Entry<String, Attachment> entry : 
exchange.getIn(AttachmentMessage.class).getAttachmentObjects().entrySet()) {
+                    String attachmentFilename = entry.getKey();
+                    Attachment attachment = entry.getValue();
+                    part = new MimeBodyPart();
+                    part.setDataHandler(attachment.getDataHandler());
+                    
part.setFileName(MimeUtility.encodeText(attachmentFilename, "UTF-8", null));
+                    String ct = attachment.getDataHandler().getContentType();
+                    contentType = new ContentType(ct);
+                    part.setHeader(CONTENT_TYPE, ct);
+                    if (!contentType.match("text/*") && binaryContent) {
+                        part.setHeader(CONTENT_TRANSFER_ENCODING, "binary");
+                    }
+                    // Set headers to the attachment
+                    for (String headerName : attachment.getHeaderNames()) {
+                        List<String> values = 
attachment.getHeaderAsList(headerName);
+                        for (String value : values) {
+                            part.setHeader(headerName, value);
+                        }
                     }
+                    mp.addBodyPart(part);
+                    
exchange.getOut(AttachmentMessage.class).removeAttachment(attachmentFilename);
                 }
-                mp.addBodyPart(part);
-                exchange.getOut().removeAttachment(attachmentFilename);
             }
             mm.setContent(mp);
             // copy headers if required and if the content can be converted 
into
@@ -256,7 +259,7 @@ public class MimeMultipartDataFormat extends 
DefaultDataFormat {
                     Header header = headers.nextElement();
                     camelAttachment.addHeader(header.getName(), 
header.getValue());
                 }
-                camelMessage.addAttachmentObject(getAttachmentKey(bp), 
camelAttachment);
+                
camelMessage.getExchange().getOut(AttachmentMessage.class).addAttachmentObject(getAttachmentKey(bp),
 camelAttachment);
             }
         }
         if (content instanceof BodyPart) {
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentDuplicateNamesTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentDuplicateNamesTest.java
index f2c1143..44ba7a2 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentDuplicateNamesTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentDuplicateNamesTest.java
@@ -25,6 +25,7 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Producer;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -48,7 +49,7 @@ public class MailAttachmentDuplicateNamesTest extends 
CamelTestSupport {
 
         // create the exchange with the mail message that is multipart with a 
file and a Hello World text/plain message.
         Exchange exchange = endpoint.createExchange();
-        Message in = exchange.getIn();
+        AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
         in.setBody("Hello World");
         in.addAttachment("logo.jpeg", new DataHandler(new 
FileDataSource("src/test/data/logo.jpeg")));
         in.addAttachment("logo.jpeg", new DataHandler(new 
FileDataSource("src/test/data/logo.jpeg")));
@@ -71,11 +72,11 @@ public class MailAttachmentDuplicateNamesTest extends 
CamelTestSupport {
         assertEquals("Hello World", out.getIn().getBody(String.class));
 
         // attachment
-        Map<String, DataHandler> attachments = out.getIn().getAttachments();
+        Map<String, DataHandler> attachments = 
out.getIn(AttachmentMessage.class).getAttachments();
         assertNotNull("Should have attachments", attachments);
         assertEquals(1, attachments.size());
 
-        DataHandler handler = out.getIn().getAttachment("logo.jpeg");
+        DataHandler handler = 
out.getIn(AttachmentMessage.class).getAttachment("logo.jpeg");
         assertNotNull("The logo should be there", handler);
 
         // content type should match
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentRedeliveryTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentRedeliveryTest.java
index 909fcb8..7e3d170 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentRedeliveryTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentRedeliveryTest.java
@@ -28,6 +28,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -51,7 +52,7 @@ public class MailAttachmentRedeliveryTest extends 
CamelTestSupport {
 
         // create the exchange with the mail message that is multipart with a 
file and a Hello World text/plain message.
         Exchange exchange = endpoint.createExchange();
-        Message in = exchange.getIn();
+        AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
         in.setBody("Hello World");
         in.addAttachment("logo.jpeg", new DataHandler(new 
FileDataSource("src/test/data/logo.jpeg")));
 
@@ -71,11 +72,11 @@ public class MailAttachmentRedeliveryTest extends 
CamelTestSupport {
         assertEquals("Hello World", out.getIn().getBody(String.class));
 
         // attachment
-        Map<String, DataHandler> attachments = out.getIn().getAttachments();
+        Map<String, DataHandler> attachments = 
out.getIn(AttachmentMessage.class).getAttachments();
         assertNotNull("Should have attachments", attachments);
         assertEquals(1, attachments.size());
 
-        DataHandler handler = out.getIn().getAttachment("logo.jpeg");
+        DataHandler handler = 
out.getIn(AttachmentMessage.class).getAttachment("logo.jpeg");
         assertNotNull("The logo should be there", handler);
 
         // content type should match
@@ -103,7 +104,7 @@ public class MailAttachmentRedeliveryTest extends 
CamelTestSupport {
                             private int counter;
                             @Override
                             public void process(Exchange exchange) throws 
Exception {
-                                Map<String, DataHandler> map = 
exchange.getIn().getAttachments();
+                                Map<String, DataHandler> map = 
exchange.getIn(AttachmentMessage.class).getAttachments();
                                 assertNotNull(map);
                                 assertEquals(1, map.size());
                                 names.add(map.keySet().iterator().next());
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentTest.java
index 0a2f4f0..3bfc4f1 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentTest.java
@@ -21,14 +21,15 @@ import java.util.Map;
 import javax.activation.DataHandler;
 import javax.activation.FileDataSource;
 
-import org.apache.camel.Attachment;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Producer;
+import org.apache.camel.attachment.Attachment;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.attachment.DefaultAttachment;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.support.DefaultAttachment;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
 import org.jvnet.mock_javamail.Mailbox;
@@ -50,7 +51,7 @@ public class MailAttachmentTest extends CamelTestSupport {
 
         // create the exchange with the mail message that is multipart with a 
file and a Hello World text/plain message.
         Exchange exchange = endpoint.createExchange();
-        Message in = exchange.getIn();
+        AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
         in.setBody("Hello World");
         DefaultAttachment att = new DefaultAttachment(new 
FileDataSource("src/test/data/logo.jpeg"));
         att.addHeader("Content-Description", "some sample content");
@@ -74,11 +75,11 @@ public class MailAttachmentTest extends CamelTestSupport {
         assertEquals("Hello World", out.getIn().getBody(String.class));
 
         // attachment
-        Map<String, Attachment> attachments = 
out.getIn().getAttachmentObjects();
+        Map<String, Attachment> attachments = 
out.getIn(AttachmentMessage.class).getAttachmentObjects();
         assertNotNull("Should have attachments", attachments);
         assertEquals(1, attachments.size());
 
-        Attachment attachment = out.getIn().getAttachmentObject("logo.jpeg");
+        Attachment attachment = 
out.getIn(AttachmentMessage.class).getAttachmentObject("logo.jpeg");
         DataHandler handler = attachment.getDataHandler();
         assertNotNull("The logo should be there", handler);
 
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentsUmlautIssueTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentsUmlautIssueTest.java
index d6df901..c58226b 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentsUmlautIssueTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailAttachmentsUmlautIssueTest.java
@@ -27,6 +27,7 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Producer;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -50,7 +51,7 @@ public class MailAttachmentsUmlautIssueTest extends 
CamelTestSupport {
 
         // create the exchange with the mail message that is multipart with a 
file and a Hello World text/plain message.
         Exchange exchange = endpoint.createExchange();
-        Message in = exchange.getIn();
+        AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
         in.setBody("Hello World");
         // unicode 00DC is german umlaut
         String name = "logo2\u00DC";
@@ -76,11 +77,11 @@ public class MailAttachmentsUmlautIssueTest extends 
CamelTestSupport {
         assertEquals("Hello World", out.getIn().getBody(String.class));
 
         // attachment
-        Map<String, DataHandler> attachments = out.getIn().getAttachments();
+        Map<String, DataHandler> attachments = 
out.getIn(AttachmentMessage.class).getAttachments();
         assertNotNull("Should have attachments", attachments);
         assertEquals(1, attachments.size());
 
-        DataHandler handler = out.getIn().getAttachment(name);
+        DataHandler handler = 
out.getIn(AttachmentMessage.class).getAttachment(name);
         assertNotNull("The " + name + " should be there", handler);
 
         String nameURLEncoded = URLEncoder.encode(name, 
Charset.defaultCharset().name());
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailBindingAttachmentFileTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailBindingAttachmentFileTest.java
index 9293e0c..882c28d 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailBindingAttachmentFileTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailBindingAttachmentFileTest.java
@@ -21,7 +21,6 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
-
 import javax.activation.DataHandler;
 import javax.mail.Message;
 import javax.mail.MessagingException;
@@ -31,7 +30,7 @@ import javax.mail.internet.MimeBodyPart;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
 
-import org.apache.camel.Attachment;
+import org.apache.camel.attachment.Attachment;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailContentTypeResolverTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailContentTypeResolverTest.java
index 9b0505f..25c3a87 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailContentTypeResolverTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailContentTypeResolverTest.java
@@ -25,6 +25,7 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Producer;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -46,7 +47,7 @@ public class MailContentTypeResolverTest extends 
CamelTestSupport {
 
         // create the exchange with the mail message that is multipart with a 
file and a Hello World text/plain message.
         Exchange exchange = endpoint.createExchange();
-        Message in = exchange.getIn();
+        AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
         in.setBody("Hello World");
         in.addAttachment("logo.jpeg", new DataHandler(new 
FileDataSource("src/test/data/logo.jpeg")));
 
@@ -66,11 +67,11 @@ public class MailContentTypeResolverTest extends 
CamelTestSupport {
         assertEquals("Hello World", out.getIn().getBody(String.class));
 
         // attachment
-        Map<String, DataHandler> attachments = out.getIn().getAttachments();
+        Map<String, DataHandler> attachments = 
out.getIn(AttachmentMessage.class).getAttachments();
         assertNotNull("Should have attachments", attachments);
         assertEquals(1, attachments.size());
 
-        DataHandler handler = out.getIn().getAttachment("logo.jpeg");
+        DataHandler handler = 
out.getIn(AttachmentMessage.class).getAttachment("logo.jpeg");
         assertNotNull("The logo should be there", handler);
 
         // as we use a custom content type resolver the content type should 
then be fixed and correct
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHtmlAttachmentTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHtmlAttachmentTest.java
index ff80ac6..4b06949 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHtmlAttachmentTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailHtmlAttachmentTest.java
@@ -25,6 +25,7 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Producer;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -48,7 +49,7 @@ public class MailHtmlAttachmentTest extends CamelTestSupport {
 
         // create the exchange with the mail message that is multipart with a 
file and a Hello World text/plain message.
         Exchange exchange = endpoint.createExchange();
-        Message in = exchange.getIn();
+        AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
         in.setBody("<html><body><h1>Hello</h1>World</body></html>");
         in.addAttachment("logo.jpeg", new DataHandler(new 
FileDataSource("src/test/data/logo.jpeg")));
 
@@ -73,11 +74,11 @@ public class MailHtmlAttachmentTest extends 
CamelTestSupport {
         assertEquals("<html><body><h1>Hello</h1>World</body></html>", 
out.getIn().getBody(String.class));
 
         // attachment
-        Map<String, DataHandler> attachments = out.getIn().getAttachments();
+        Map<String, DataHandler> attachments = 
out.getIn(AttachmentMessage.class).getAttachments();
         assertNotNull("Should have attachments", attachments);
         assertEquals(1, attachments.size());
 
-        DataHandler handler = out.getIn().getAttachment("logo.jpeg");
+        DataHandler handler = 
out.getIn(AttachmentMessage.class).getAttachment("logo.jpeg");
         assertNotNull("The logo should be there", handler);
         byte[] bytes = context.getTypeConverter().convertTo(byte[].class, 
handler.getInputStream());
         assertNotNull("content should be there", bytes);
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRouteTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRouteTest.java
index 351eacd..e7fc34e 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRouteTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailRouteTest.java
@@ -27,6 +27,7 @@ import javax.mail.MessagingException;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -85,7 +86,7 @@ public class MailRouteTest extends CamelTestSupport {
 
         mock.assertIsSatisfied();
 
-        assertFalse("Should not have attachements", 
mock.getExchanges().get(0).getIn().hasAttachments());
+        assertFalse("Should not have attachements", 
mock.getExchanges().get(0).getIn(AttachmentMessage.class).hasAttachments());
 
     }
 
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailSplitAttachmentsTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailSplitAttachmentsTest.java
index ed75cd8..21f6728 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailSplitAttachmentsTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailSplitAttachmentsTest.java
@@ -23,6 +23,7 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Producer;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -50,7 +51,7 @@ public class MailSplitAttachmentsTest extends 
CamelTestSupport {
         // create the exchange with the mail message that is multipart with a 
file and a Hello World text/plain message.
         endpoint = 
context.getEndpoint("smtp://ja...@mymailserver.com?password=secret");
         exchange = endpoint.createExchange();
-        Message in = exchange.getIn();
+        AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
         in.setBody("Hello World");
         in.addAttachment("logo.jpeg", new DataHandler(new 
FileDataSource("src/test/data/logo.jpeg")));
         in.addAttachment("log4j2.properties", new DataHandler(new 
FileDataSource("src/test/resources/log4j2.properties")));
@@ -67,8 +68,8 @@ public class MailSplitAttachmentsTest extends 
CamelTestSupport {
 
         mock.assertIsSatisfied();
 
-        Message first = mock.getReceivedExchanges().get(0).getIn();
-        Message second = mock.getReceivedExchanges().get(1).getIn();
+        AttachmentMessage first = 
mock.getReceivedExchanges().get(0).getIn(AttachmentMessage.class);
+        AttachmentMessage second = 
mock.getReceivedExchanges().get(1).getIn(AttachmentMessage.class);
 
         assertEquals(1, first.getAttachments().size());
         assertEquals(1, second.getAttachments().size());
@@ -97,8 +98,8 @@ public class MailSplitAttachmentsTest extends 
CamelTestSupport {
 
         mock.assertIsSatisfied();
 
-        Message first = mock.getReceivedExchanges().get(0).getIn();
-        Message second = mock.getReceivedExchanges().get(1).getIn();
+        AttachmentMessage first = 
mock.getReceivedExchanges().get(0).getIn(AttachmentMessage.class);
+        AttachmentMessage second = 
mock.getReceivedExchanges().get(1).getIn(AttachmentMessage.class);
 
         // check it's no longer an attachment, but is the message body
         assertEquals(0, first.getAttachments().size());
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailSubjectTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailSubjectTest.java
index b578e2e..1dfeec8 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailSubjectTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MailSubjectTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.mail;
 
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -43,7 +44,7 @@ public class MailSubjectTest extends CamelTestSupport {
 
         mock.assertIsSatisfied();
 
-        assertFalse("Should not have attachements", 
mock.getExchanges().get(0).getIn().hasAttachments());
+        assertFalse("Should not have attachements", 
mock.getExchanges().get(0).getIn(AttachmentMessage.class).hasAttachments());
     }
 
     protected RouteBuilder createRouteBuilder() throws Exception {
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMessageConsumeTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMessageConsumeTest.java
index 169b1c8..f171b66 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMessageConsumeTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMessageConsumeTest.java
@@ -36,6 +36,7 @@ import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -70,9 +71,9 @@ public class MimeMessageConsumeTest extends CamelTestSupport {
         String text = exchange.getIn().getBody(String.class);
         assertEquals("mail body", body, text);
 
-        assertNotNull("attachments got lost", 
exchange.getIn().getAttachments());
-        for (String s : exchange.getIn().getAttachmentNames()) {
-            DataHandler dh = exchange.getIn().getAttachment(s);
+        assertNotNull("attachments got lost", 
exchange.getIn(AttachmentMessage.class).getAttachments());
+        for (String s : 
exchange.getIn(AttachmentMessage.class).getAttachmentNames()) {
+            DataHandler dh = 
exchange.getIn(AttachmentMessage.class).getAttachment(s);
             Object content = dh.getContent();
             assertNotNull("Content should not be empty", content);
             assertEquals("log4j2.properties", dh.getName());
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeTest.java
index a0be602..c4b07b8 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeTest.java
@@ -25,6 +25,7 @@ import javax.mail.internet.MimeMultipart;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -47,7 +48,7 @@ public class MimeMultipartAlternativeTest extends 
CamelTestSupport {
 
         // create the exchange with the mail message that is multipart with a 
file and a Hello World text/plain message.
         Exchange exchange = endpoint.createExchange();
-        Message in = exchange.getIn();
+        AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
         in.setBody(htmlBody);
         in.setHeader(MAIL_ALTERNATIVE_BODY, alternativeBody);
         in.addAttachment("cid:0001", new DataHandler(new 
FileDataSource("src/test/data/logo.jpeg")));
@@ -75,7 +76,7 @@ public class MimeMultipartAlternativeTest extends 
CamelTestSupport {
         assertEquals(alternativeBody, out.getIn().getBody(String.class));
 
         // attachment
-        Map<String, DataHandler> attachments = out.getIn().getAttachments();
+        Map<String, DataHandler> attachments = 
out.getIn(AttachmentMessage.class).getAttachments();
         assertNotNull("Should not have null attachments", attachments);
         assertEquals(1, attachments.size());
         assertEquals("multipart body should have 2 parts", 2, 
out.getIn().getBody(MimeMultipart.class).getCount());
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeWithLongerFilenameTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeWithLongerFilenameTest.java
index e73f415..6712c3c 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeWithLongerFilenameTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeWithLongerFilenameTest.java
@@ -25,6 +25,7 @@ import javax.mail.internet.MimeMultipart;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -47,7 +48,7 @@ public class MimeMultipartAlternativeWithLongerFilenameTest 
extends CamelTestSup
 
         // create the exchange with the mail message that is multipart with a 
file and a Hello World text/plain message.
         Exchange exchange = endpoint.createExchange();
-        Message in = exchange.getIn();
+        AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
         in.setBody(htmlBody);
         in.setHeader(MAIL_ALTERNATIVE_BODY, alternativeBody);
         in.addAttachment("cid:myCoolLogo.jpeg", new DataHandler(new 
FileDataSource("src/test/data/logo.jpeg")));
@@ -75,7 +76,7 @@ public class MimeMultipartAlternativeWithLongerFilenameTest 
extends CamelTestSup
         assertEquals(alternativeBody, out.getIn().getBody(String.class));
 
         // attachment
-        Map<String, DataHandler> attachments = out.getIn().getAttachments();
+        Map<String, DataHandler> attachments = 
out.getIn(AttachmentMessage.class).getAttachments();
         assertNotNull("Should not have null attachments", attachments);
         assertEquals(1, attachments.size());
         assertEquals("multipart body should have 2 parts", 2, 
out.getIn().getBody(MimeMultipart.class).getCount());
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/NestedMimeMessageConsumeTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/NestedMimeMessageConsumeTest.java
index 212b320..323e074 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/NestedMimeMessageConsumeTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/NestedMimeMessageConsumeTest.java
@@ -26,8 +26,9 @@ import javax.mail.MessagingException;
 import javax.mail.Store;
 import javax.mail.internet.MimeMessage;
 
-import org.apache.camel.Attachment;
 import org.apache.camel.Exchange;
+import org.apache.camel.attachment.Attachment;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -56,11 +57,11 @@ public class NestedMimeMessageConsumeTest extends 
CamelTestSupport {
         assertThat(text, containsString("Test with bold face, pictures and 
attachments"));
         assertEquals("text/plain; charset=us-ascii", 
exchange.getIn().getHeader("Content-Type"));
 
-        Set<String> attachmentNames = exchange.getIn().getAttachmentNames();
+        Set<String> attachmentNames = 
exchange.getIn(AttachmentMessage.class).getAttachmentNames();
         assertNotNull("attachments got lost", attachmentNames);
         assertEquals(2, attachmentNames.size());
         for (String s : attachmentNames) {
-            Attachment att = exchange.getIn().getAttachmentObject(s);
+            Attachment att = 
exchange.getIn(AttachmentMessage.class).getAttachmentObject(s);
             DataHandler dh = att.getDataHandler();
             Object content = dh.getContent();
             assertNotNull("Content should not be empty", content);
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/SpringMailSplitAttachmentsTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/SpringMailSplitAttachmentsTest.java
index e2a4652..c12f7f9 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/component/mail/SpringMailSplitAttachmentsTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/component/mail/SpringMailSplitAttachmentsTest.java
@@ -23,6 +23,7 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Producer;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.spring.CamelSpringTestSupport;
 import org.apache.commons.io.IOUtils;
@@ -55,7 +56,7 @@ public class SpringMailSplitAttachmentsTest extends 
CamelSpringTestSupport {
         // create the exchange with the mail message that is multipart with a 
file and a Hello World text/plain message.
         endpoint = 
context.getEndpoint("smtp://ja...@mymailserver.com?password=secret");
         exchange = endpoint.createExchange();
-        Message in = exchange.getIn();
+        AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
         in.setBody("Hello World");
         in.addAttachment("logo.jpeg", new DataHandler(new 
FileDataSource("src/test/data/logo.jpeg")));
         in.addAttachment("log4j2.properties", new DataHandler(new 
FileDataSource("src/test/resources/log4j2.properties")));
@@ -72,8 +73,8 @@ public class SpringMailSplitAttachmentsTest extends 
CamelSpringTestSupport {
 
         mock.assertIsSatisfied();
 
-        Message first = mock.getReceivedExchanges().get(0).getIn();
-        Message second = mock.getReceivedExchanges().get(1).getIn();
+        AttachmentMessage first = 
mock.getReceivedExchanges().get(0).getIn(AttachmentMessage.class);
+        AttachmentMessage second = 
mock.getReceivedExchanges().get(1).getIn(AttachmentMessage.class);
 
         assertEquals(1, first.getAttachments().size());
         assertEquals(1, second.getAttachments().size());
@@ -103,8 +104,8 @@ public class SpringMailSplitAttachmentsTest extends 
CamelSpringTestSupport {
 
         mock.assertIsSatisfied();
 
-        Message first = mock.getReceivedExchanges().get(0).getIn();
-        Message second = mock.getReceivedExchanges().get(1).getIn();
+        AttachmentMessage first = 
mock.getReceivedExchanges().get(0).getIn(AttachmentMessage.class);
+        AttachmentMessage second = 
mock.getReceivedExchanges().get(1).getIn(AttachmentMessage.class);
 
         // check it's no longer an attachment, but is the message body
         assertEquals(0, first.getAttachments().size());
diff --git 
a/components/camel-mail/src/test/java/org/apache/camel/dataformat/mime/multipart/MimeMultipartDataFormatTest.java
 
b/components/camel-mail/src/test/java/org/apache/camel/dataformat/mime/multipart/MimeMultipartDataFormatTest.java
index d3e9cd8..e9e29e9 100644
--- 
a/components/camel-mail/src/test/java/org/apache/camel/dataformat/mime/multipart/MimeMultipartDataFormatTest.java
+++ 
b/components/camel-mail/src/test/java/org/apache/camel/dataformat/mime/multipart/MimeMultipartDataFormatTest.java
@@ -24,16 +24,15 @@ import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.util.HashMap;
 import java.util.Map;
-
 import javax.activation.DataHandler;
 import javax.activation.DataSource;
 import javax.mail.util.ByteArrayDataSource;
 
-import org.apache.camel.Attachment;
 import org.apache.camel.Exchange;
-import org.apache.camel.Message;
+import org.apache.camel.attachment.Attachment;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.attachment.DefaultAttachment;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.support.DefaultAttachment;
 import org.apache.camel.support.DefaultExchange;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.apache.camel.util.IOHelper;
@@ -48,13 +47,13 @@ import static org.hamcrest.core.StringStartsWith.startsWith;
 
 public class MimeMultipartDataFormatTest extends CamelTestSupport {
     private Exchange exchange;
-    private Message in;
+    private AttachmentMessage in;
 
     @Before
     public void setUp() throws Exception {
         super.setUp();
         exchange = new DefaultExchange(context);
-        in = exchange.getIn();
+        in = exchange.getIn(AttachmentMessage.class);
     }
 
     @Test
@@ -70,7 +69,7 @@ public class MimeMultipartDataFormatTest extends 
CamelTestSupport {
         headers.put("X-AdditionalData", "additional data");
         addAttachment(attContentType, attText, attFileName, headers);
         Exchange result = template.send("direct:roundtrip", exchange);
-        Message out = result.getOut();
+        AttachmentMessage out = result.getOut(AttachmentMessage.class);
         assertEquals("Body text", out.getBody(String.class));
         assertThat(out.getHeader(Exchange.CONTENT_TYPE, String.class), 
startsWith("text/plain"));
         assertEquals("UTF8", out.getHeader(Exchange.CONTENT_ENCODING));
@@ -99,7 +98,7 @@ public class MimeMultipartDataFormatTest extends 
CamelTestSupport {
         in.setHeader(Exchange.CONTENT_ENCODING, "UTF8");
         addAttachment(attContentType, attText, attFileName);
         Exchange result = template.send("direct:roundtripinlineheaders", 
exchange);
-        Message out = result.getOut();
+        AttachmentMessage out = result.getOut(AttachmentMessage.class);
         assertEquals("Body text", out.getBody(String.class));
         assertThat(out.getHeader(Exchange.CONTENT_TYPE, String.class), 
startsWith("text/plain"));
         assertEquals("UTF8", out.getHeader(Exchange.CONTENT_ENCODING));
@@ -126,7 +125,7 @@ public class MimeMultipartDataFormatTest extends 
CamelTestSupport {
         in.setHeader(Exchange.CONTENT_ENCODING, "UTF8");
         addAttachment(attContentType, attText, attFileName);
         Exchange result = template.send("direct:roundtrip", exchange);
-        Message out = result.getOut();
+        AttachmentMessage out = result.getOut(AttachmentMessage.class);
         assertEquals("Body text with special characters: \u00A9", 
out.getBody(String.class));
         assertThat(out.getHeader(Exchange.CONTENT_TYPE, String.class), 
startsWith("text/plain"));
         assertEquals("UTF8", out.getHeader(Exchange.CONTENT_ENCODING));
@@ -151,7 +150,7 @@ public class MimeMultipartDataFormatTest extends 
CamelTestSupport {
         in.setHeader(Exchange.CONTENT_TYPE, 
"text/plain;charset=iso8859-1;other-parameter=true");
         addAttachment(attContentType, attText, attFileName);
         Exchange result = template.send("direct:roundtripbinarycontent", 
exchange);
-        Message out = result.getOut();
+        AttachmentMessage out = result.getOut(AttachmentMessage.class);
         assertEquals("Body text", out.getBody(String.class));
         assertThat(out.getHeader(Exchange.CONTENT_TYPE, String.class), 
startsWith("text/plain"));
         assertEquals("iso8859-1", out.getHeader(Exchange.CONTENT_ENCODING));
@@ -176,7 +175,7 @@ public class MimeMultipartDataFormatTest extends 
CamelTestSupport {
         DataSource ds = new ByteArrayDataSource(attText, attContentType);
         in.addAttachment(attFileName, new DataHandler(ds));
         Exchange result = template.send("direct:roundtrip", exchange);
-        Message out = result.getOut();
+        AttachmentMessage out = result.getOut(AttachmentMessage.class);
         assertEquals("Body text", out.getBody(String.class));
         assertTrue(out.hasAttachments());
         assertEquals(1, out.getAttachmentNames().size());
@@ -199,7 +198,7 @@ public class MimeMultipartDataFormatTest extends 
CamelTestSupport {
         DataSource ds = new ByteArrayDataSource(attText, attContentType);
         in.addAttachment(attFileName, new DataHandler(ds));
         Exchange result = template.send("direct:roundtripbinarycontent", 
exchange);
-        Message out = result.getOut();
+        AttachmentMessage out = result.getOut(AttachmentMessage.class);
         assertEquals("Body text", out.getBody(String.class));
         assertTrue(out.hasAttachments());
         assertEquals(1, out.getAttachmentNames().size());
@@ -217,7 +216,7 @@ public class MimeMultipartDataFormatTest extends 
CamelTestSupport {
     public void roundtripWithoutAttachments() throws IOException {
         in.setBody("Body text");
         Exchange result = template.send("direct:roundtrip", exchange);
-        Message out = result.getOut();
+        AttachmentMessage out = result.getOut(AttachmentMessage.class);
         assertEquals("Body text", out.getBody(String.class));
         assertFalse(out.hasAttachments());
     }
@@ -226,7 +225,7 @@ public class MimeMultipartDataFormatTest extends 
CamelTestSupport {
     public void roundtripWithoutAttachmentsToMultipart() throws IOException {
         in.setBody("Body text");
         Exchange result = template.send("direct:roundtripmultipart", exchange);
-        Message out = result.getOut();
+        AttachmentMessage out = result.getOut(AttachmentMessage.class);
         assertEquals("Body text", out.getBody(String.class));
         assertFalse(out.hasAttachments());
     }
@@ -236,7 +235,7 @@ public class MimeMultipartDataFormatTest extends 
CamelTestSupport {
         in.setBody("Body text");
         in.setHeader("Content-Type", "text/plain");
         Exchange result = template.send("direct:roundtrip", exchange);
-        Message out = result.getOut();
+        AttachmentMessage out = result.getOut(AttachmentMessage.class);
         assertEquals("Body text", out.getBody(String.class));
         assertFalse(out.hasAttachments());
     }
@@ -246,7 +245,7 @@ public class MimeMultipartDataFormatTest extends 
CamelTestSupport {
         in.setBody("Body text");
         in.setHeader("Content-Type", "text?plain");
         Exchange result = template.send("direct:roundtrip", exchange);
-        Message out = result.getOut();
+        AttachmentMessage out = result.getOut(AttachmentMessage.class);
         assertEquals("Body text", out.getBody(String.class));
         assertFalse(out.hasAttachments());
     }
@@ -357,9 +356,9 @@ public class MimeMultipartDataFormatTest extends 
CamelTestSupport {
         String bodyStr = intermediate.getOut().getBody(String.class);
         assertNotNull(bodyStr);
         assertThat(bodyStr, startsWith("25"));
-        assertEquals(1, intermediate.getOut().getAttachmentNames().size());
-        
assertThat(intermediate.getOut().getAttachmentNames().iterator().next(), 
containsString(matcher));
-        Attachment att = 
intermediate.getOut().getAttachmentObject(intermediate.getOut().getAttachmentNames().iterator().next());
+        assertEquals(1, 
intermediate.getOut(AttachmentMessage.class).getAttachmentNames().size());
+        
assertThat(intermediate.getOut(AttachmentMessage.class).getAttachmentNames().iterator().next(),
 containsString(matcher));
+        Attachment att = 
intermediate.getOut(AttachmentMessage.class).getAttachmentObject(intermediate.getOut(AttachmentMessage.class).getAttachmentNames().iterator().next());
         DataHandler dh = att.getDataHandler();
         assertNotNull(dh);
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
diff --git 
a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/AttachmentHttpBinding.java
 
b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/AttachmentHttpBinding.java
index ad040bc..e688a7e 100644
--- 
a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/AttachmentHttpBinding.java
+++ 
b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/AttachmentHttpBinding.java
@@ -25,11 +25,12 @@ import javax.activation.DataSource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.Part;
 
-import org.apache.camel.Attachment;
 import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.attachment.Attachment;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.attachment.DefaultAttachment;
 import org.apache.camel.http.common.DefaultHttpBinding;
 import org.apache.camel.http.common.HttpMessage;
-import org.apache.camel.support.DefaultAttachment;
 import org.apache.camel.util.FileUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -73,7 +74,8 @@ public final class AttachmentHttpBinding extends 
DefaultHttpBinding {
                             attachment.addHeader(headerName, headerValue);
                         }
                     }
-                    message.addAttachmentObject(part.getName(), attachment);
+                    AttachmentMessage am = 
message.getExchange().getMessage(AttachmentMessage.class);
+                    am.addAttachmentObject(part.getName(), attachment);
                 } else {
                     LOG.debug("Cannot add file as attachment: {} because the 
file is not accepted according to fileNameExtWhitelist: {}", fileName, 
getFileNameExtWhitelist());
                 }
diff --git 
a/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java
 
b/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java
index e46e16f..b5276b6 100644
--- 
a/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java
+++ 
b/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java
@@ -162,7 +162,6 @@ public class SqlProducer extends DefaultProducer {
                         if (isResultSet) {
                             // preserve headers first, so we can override the 
SQL_ROW_COUNT header
                             
exchange.getOut().getHeaders().putAll(exchange.getIn().getHeaders());
-                            
exchange.getOut().getAttachments().putAll(exchange.getIn().getAttachments());
 
                             rs = ps.getResultSet();
                             SqlOutputType outputType = 
getEndpoint().getOutputType();
@@ -212,7 +211,6 @@ public class SqlProducer extends DefaultProducer {
                         // if no OUT message yet then create one and propagate 
headers
                         if (!exchange.hasOut()) {
                             
exchange.getOut().getHeaders().putAll(exchange.getIn().getHeaders());
-                            
exchange.getOut().getAttachments().putAll(exchange.getIn().getAttachments());
                         }
 
                         if (isResultSet) {
@@ -284,7 +282,6 @@ public class SqlProducer extends DefaultProducer {
                 ResultSetIterator iterator = 
getEndpoint().queryForStreamList(con, ps, rs);
                 //pass through all headers
                 
exchange.getOut().getHeaders().putAll(exchange.getIn().getHeaders());
-                
exchange.getOut().getAttachments().putAll(exchange.getIn().getAttachments());
 
                 if (getEndpoint().isNoop()) {
                     exchange.getOut().setBody(exchange.getIn().getBody());
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerOutputAttachment.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerOutputAttachment.java
deleted file mode 100644
index 3306ae3..0000000
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerOutputAttachment.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.sql;
-
-import java.net.MalformedURLException;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit4.CamelTestSupport;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
-import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
-import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
-
-import static org.hamcrest.core.Is.is;
-import static org.hamcrest.core.IsNull.notNullValue;
-
-public class SqlProducerOutputAttachment extends CamelTestSupport {
-
-    private EmbeddedDatabase db;
-
-    @Before
-    public void setUp() throws Exception {
-        db = new EmbeddedDatabaseBuilder()
-                
.setType(EmbeddedDatabaseType.DERBY).addScript("sql/createAndPopulateDatabase.sql").build();
-
-        super.setUp();
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        super.tearDown();
-
-        db.shutdown();
-    }
-
-    @Test
-    public void testHeaderAreAvailableAfterProducer()
-            throws InterruptedException, MalformedURLException {
-        MockEndpoint mock = getMockEndpoint("mock:query");
-
-        mock.expectedMessageCount(1);
-        mock.expectedHeaderReceived(SqlConstants.SQL_ROW_COUNT, 1);
-        mock.expectedHeaderReceived("TheProjectID", 1);
-        mock.expectedHeaderReceived("maintain", "this");
-        mock.expects(() -> {
-            
assertThat(mock.getReceivedExchanges().get(0).getIn().getAttachments().size(), 
is(1));
-            
assertThat(mock.getReceivedExchanges().get(0).getIn().getAttachment("att1"), 
notNullValue());
-        });
-        mock.message(0).body().isEqualTo("Hi there!");
-
-        Exchange exchange = 
context.getEndpoint("direct:query").createExchange();
-        exchange.getIn().setBody("Hi there!");
-        exchange.getIn().setHeader("myProject", "Camel");
-        exchange.getIn().setHeader("maintain", "this");
-        template.send("direct:query", exchange);
-
-        assertMockEndpointsSatisfied();
-    }
-
-    @Override
-    protected RouteBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                // required for the sql component
-                getContext().getComponent("sql", 
SqlComponent.class).setDataSource(db);
-
-                from("direct:query")
-                    .to("sql:select id from projects where project = 
:#myProject?outputType=SelectOne&outputHeader=TheProjectID").to("mock:query");
-            }
-        };
-    }
-}
diff --git 
a/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java
 
b/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java
index 30e7657..654e6e8 100644
--- 
a/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java
+++ 
b/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java
@@ -73,8 +73,7 @@ public class SshProducer extends DefaultProducer {
             throw new CamelExchangeException("Cannot execute command: " + 
command, exchange, e);
         }
 
-        // propagate headers and attachments
+        // propagate headers
         exchange.getOut().getHeaders().putAll(in.getHeaders());
-        exchange.getOut().setAttachments(in.getAttachments());
     }
 }
diff --git 
a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
 
b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
index 603a414..5926ba9 100644
--- 
a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
+++ 
b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
@@ -45,8 +45,10 @@ import io.undertow.util.Methods;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.TypeConverter;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.attachment.DefaultAttachment;
+import org.apache.camel.attachment.DefaultAttachmentMessage;
 import org.apache.camel.spi.HeaderFilterStrategy;
-import org.apache.camel.support.DefaultAttachment;
 import org.apache.camel.support.DefaultMessage;
 import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.support.MessageHelper;
@@ -97,7 +99,7 @@ public class DefaultUndertowHttpBinding implements 
UndertowHttpBinding {
 
     @Override
     public Message toCamelMessage(HttpServerExchange httpExchange, Exchange 
exchange) throws Exception {
-        Message result = new DefaultMessage(exchange.getContext());
+        Message result = new DefaultMessage(exchange);
 
         populateCamelHeaders(httpExchange, result.getHeaders(), exchange);
 
@@ -109,7 +111,8 @@ public class DefaultUndertowHttpBinding implements 
UndertowHttpBinding {
                 formData.get(key).forEach(value -> {
                     if (value.isFile()) {
                         DefaultAttachment attachment = new 
DefaultAttachment(new FilePartDataSource(value));
-                        result.addAttachmentObject(key, attachment);
+                        AttachmentMessage am = 
result.getExchange().getMessage(AttachmentMessage.class);
+                        am.addAttachmentObject(key, attachment);
                         body.put(key, attachment.getDataHandler());
                     } else if (headerFilterStrategy != null
                         && 
!headerFilterStrategy.applyFilterToExternalHeaders(key, value.getValue(), 
exchange)) {
diff --git 
a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/MultiPartFormTest.java
 
b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/MultiPartFormTest.java
index 13f4ad1..ef32342 100644
--- 
a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/MultiPartFormTest.java
+++ 
b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/MultiPartFormTest.java
@@ -24,6 +24,7 @@ import javax.activation.DataHandler;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.util.IOHelper;
 import org.apache.http.HttpEntity;
@@ -34,13 +35,13 @@ import org.apache.http.impl.client.HttpClientBuilder;
 import org.junit.Test;
 
 public class MultiPartFormTest extends BaseUndertowTest {
+
     private HttpEntity createMultipartRequestEntity() throws Exception {
         File file = new File("src/test/resources/log4j2.properties");
         return MultipartEntityBuilder.create()
                 .addTextBody("comment", "A binary file of some kind")
                 .addBinaryBody(file.getName(), file)
                 .build();
-
     }
 
     @Test
@@ -69,7 +70,7 @@ public class MultiPartFormTest extends BaseUndertowTest {
                 from("undertow://http://localhost:{{port}}/test";).process(new 
Processor() {
 
                     public void process(Exchange exchange) throws Exception {
-                        Message in = exchange.getIn();
+                        AttachmentMessage in = 
exchange.getIn(AttachmentMessage.class);
                         assertEquals("Get a wrong attachement size", 1, 
in.getAttachments().size());
                         // The file name is attachment id
                         DataHandler data = 
in.getAttachment("log4j2.properties");
diff --git a/parent/pom.xml b/parent/pom.xml
index 840ed85..b93c357 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -919,6 +919,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-attachments</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-atmos</artifactId>
         <version>${project.version}</version>
       </dependency>

Reply via email to