diff --git a/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/MessageImpl.java b/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/MessageImpl.java
index 723c897..88b746c 100644
--- a/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/MessageImpl.java
+++ b/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/MessageImpl.java
@@ -48,7 +48,6 @@
 import javax.jws.soap.SOAPBinding.Style;
 import javax.xml.namespace.QName;
 import javax.xml.soap.AttachmentPart;
-import javax.xml.soap.MessageFactory;
 import javax.xml.soap.MimeHeaders;
 import javax.xml.soap.SOAPConstants;
 import javax.xml.soap.SOAPEnvelope;
@@ -57,8 +56,6 @@
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 import javax.xml.ws.WebServiceException;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -188,36 +185,13 @@
             // Get OMElement from XMLPart.
             OMElement element = xmlPart.getAsOMElement();
             
+            SOAPMessage soapMessage = getSAAJConverter().toSAAJ((org.apache.axiom.soap.SOAPEnvelope)element, false);
+            
             // Get the namespace so that we can determine SOAP11 or SOAP12
             OMNamespace ns = element.getNamespace();
             
-            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
-            element.serialize(outStream);
-            
-            // In some cases (usually inbound) the builder will not be closed after
-            // serialization.  In that case it should be closed manually.
-            if (element.getBuilder() != null && !element.getBuilder().isCompleted()) {
-                element.close(false);
-            }
-            
-            byte[] bytes = outStream.toByteArray();
-            
-            if (log.isDebugEnabled()) {
-                String text = new String(bytes);
-                log.debug("  inputstream = " + text);
-            }
-            
-            // Create InputStream
-            ByteArrayInputStream inStream = new ByteArrayInputStream(bytes);
-            
-            // Create MessageFactory that supports the version of SOAP in the om element
-            MessageFactory mf = getSAAJConverter().createMessageFactory(ns.getNamespaceURI());
-            
-            // Create soapMessage object from Message Factory using the input
-            // stream created from OM.
-            
             // Get the MimeHeaders from the transportHeaders map
-            MimeHeaders defaultHeaders = new MimeHeaders();
+            MimeHeaders defaultHeaders = soapMessage.getMimeHeaders();
             if (transportHeaders != null) {
                 Iterator it = transportHeaders.entrySet().iterator();
                 while (it.hasNext()) {
@@ -266,7 +240,6 @@
             if (log.isDebugEnabled()) {
                 log.debug("  setContentType =" + ctValue);
             }
-            SOAPMessage soapMessage = mf.createMessage(defaultHeaders, inStream);
             
             // At this point the XMLPart is still an OMElement.  
             // We need to change it to the new SOAPEnvelope.
diff --git a/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/XMLPartImpl.java b/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/XMLPartImpl.java
index 331d2a3..dc1d6c9 100644
--- a/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/XMLPartImpl.java
+++ b/modules/jaxws/src/org/apache/axis2/jaxws/message/impl/XMLPartImpl.java
@@ -21,6 +21,7 @@
 
 import org.apache.axiom.attachments.Attachments;
 import org.apache.axiom.om.OMElement;
+import org.apache.axis2.jaxws.ExceptionFactory;
 import org.apache.axis2.jaxws.message.Message;
 import org.apache.axis2.jaxws.message.Protocol;
 import org.apache.axis2.jaxws.message.factory.SAAJConverterFactory;
@@ -28,6 +29,7 @@
 import org.apache.axis2.jaxws.registry.FactoryRegistry;
 
 import javax.xml.soap.SOAPEnvelope;
+import javax.xml.soap.SOAPException;
 import javax.xml.ws.WebServiceException;
 
 /**
@@ -92,7 +94,11 @@
 
     @Override
     protected SOAPEnvelope _convertOM2SE(OMElement om) throws WebServiceException {
-        return getSAAJConverter().toSAAJ((org.apache.axiom.soap.SOAPEnvelope)om);
+        try {
+            return getSAAJConverter().toSAAJ((org.apache.axiom.soap.SOAPEnvelope)om, true).getSOAPPart().getEnvelope();
+        } catch (SOAPException ex) {
+            throw ExceptionFactory.makeWebServiceException(ex);
+        }
     }
 
     @Override
diff --git a/modules/jaxws/src/org/apache/axis2/jaxws/message/util/SAAJConverter.java b/modules/jaxws/src/org/apache/axis2/jaxws/message/util/SAAJConverter.java
index 3fe42e1..6bcf7ee 100644
--- a/modules/jaxws/src/org/apache/axis2/jaxws/message/util/SAAJConverter.java
+++ b/modules/jaxws/src/org/apache/axis2/jaxws/message/util/SAAJConverter.java
@@ -27,6 +27,7 @@
 import javax.xml.soap.SOAPEnvelope;
 import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPFactory;
+import javax.xml.soap.SOAPMessage;
 import javax.xml.ws.WebServiceException;
 
 /** SAAJConverter Provides Conversion between SAAJ and OM Constructed via the SAAJConverterFactory */
@@ -35,13 +36,18 @@
 	public final static String OM_ATTRIBUTE_KEY = "ATTRIBUTE_TYPE_KEY";
 	
     /**
-     * Convert OM SOAPEnvleope to SAAJ SOAPEnvelope
+     * Convert OM {@link org.apache.axiom.soap.SOAPEnvelope} to SAAJ {@link SOAPMessage}.
      *
      * @param omElement
-     * @return SOAPEnvelope
+     * @param inlineMtom
+     *            Specifies how optimized base64 encoded content is handled. {@code true} indicates
+     *            that such content should be inlined (i.e. converted to text nodes). {@code false}
+     *            instructs the method to produce an XOP encoded message and add the optimized
+     *            content as attachment parts to the returned message.
+     * @return the converted message
      * @throws WebServiceException
      */
-    public SOAPEnvelope toSAAJ(org.apache.axiom.soap.SOAPEnvelope omElement)
+    public SOAPMessage toSAAJ(org.apache.axiom.soap.SOAPEnvelope omElement, boolean inlineMtom)
             throws WebServiceException;
 
     /**
diff --git a/modules/jaxws/src/org/apache/axis2/jaxws/message/util/impl/SAAJConverterImpl.java b/modules/jaxws/src/org/apache/axis2/jaxws/message/util/impl/SAAJConverterImpl.java
index 9d2a0bd..f1f63b7 100644
--- a/modules/jaxws/src/org/apache/axis2/jaxws/message/util/impl/SAAJConverterImpl.java
+++ b/modules/jaxws/src/org/apache/axis2/jaxws/message/util/impl/SAAJConverterImpl.java
@@ -28,18 +28,23 @@
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.impl.builder.MTOMStAXSOAPModelBuilder;
 import org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder;
+import org.apache.axiom.util.stax.xop.MimePartProvider;
+import org.apache.axiom.util.stax.xop.XOPEncodedStream;
+import org.apache.axiom.util.stax.xop.XOPUtils;
 import org.apache.axis2.jaxws.ExceptionFactory;
 import org.apache.axis2.jaxws.i18n.Messages;
 import org.apache.axis2.jaxws.message.util.SAAJConverter;
 import org.apache.axis2.jaxws.message.util.SOAPElementReader;
 import org.apache.axis2.jaxws.utility.JavaUtils;
 import org.apache.axis2.jaxws.utility.SAAJFactory;
+import org.apache.axis2.namespace.Constants;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.w3c.dom.Node;
-import org.w3c.dom.Attr; 
+import org.w3c.dom.Attr;
 
 import javax.xml.namespace.QName;
+import javax.xml.soap.AttachmentPart;
 import javax.xml.soap.Detail;
 import javax.xml.soap.MessageFactory;
 import javax.xml.soap.Name;
@@ -62,6 +67,7 @@
 import javax.xml.ws.WebServiceException;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.util.Iterator;
 
 /** SAAJConverterImpl Provides an conversion methods between OM<->SAAJ */
@@ -77,21 +83,20 @@
     /* (non-Javadoc)
       * @see org.apache.axis2.jaxws.message.util.SAAJConverter#toSAAJ(org.apache.axiom.soap.SOAPEnvelope)
       */
-    public SOAPEnvelope toSAAJ(org.apache.axiom.soap.SOAPEnvelope omEnvelope)
+    public SOAPMessage toSAAJ(org.apache.axiom.soap.SOAPEnvelope omEnvelope, boolean inlineMtom)
             throws WebServiceException {
     	if (log.isDebugEnabled()) {
-    	    log.debug("Converting OM SOAPEnvelope to SAAJ SOAPEnvelope");
+    	    log.debug("Converting OM SOAPEnvelope to SAAJ SOAPMessage");
     	    log.debug("The conversion occurs due to " + JavaUtils.stackToString());
     	}
     	
-        SOAPEnvelope soapEnvelope = null;
         try {
             // Build the default envelope
             OMNamespace ns = omEnvelope.getNamespace();
             MessageFactory mf = createMessageFactory(ns.getNamespaceURI());
             SOAPMessage sm = mf.createMessage();
             SOAPPart sp = sm.getSOAPPart();
-            soapEnvelope = sp.getEnvelope();
+            SOAPEnvelope soapEnvelope = sp.getEnvelope();
 
             // The getSOAPEnvelope() call creates a default SOAPEnvelope with a SOAPHeader and SOAPBody.
             // The SOAPHeader and SOAPBody are removed (they will be added back in if they are present in the
@@ -109,15 +114,23 @@
             // The best way to walk the data is to get the XMLStreamReader and use this
             // to build the SOAPElements
             XMLStreamReader reader = omEnvelope.getXMLStreamReader();
+            MimePartProvider mimePartProvider;
+            if (inlineMtom) {
+                mimePartProvider = null;
+            } else {
+                XOPEncodedStream xop = XOPUtils.getXOPEncodedStream(reader);
+                mimePartProvider = xop.getMimePartProvider();
+                reader = xop.getReader();
+            }
 
             NameCreator nc = new NameCreator(soapEnvelope);
-            buildSOAPTree(nc, soapEnvelope, null, reader, false);
+            buildSOAPTree(nc, sm, soapEnvelope, null, reader, mimePartProvider, false);
+            return sm;
         } catch (WebServiceException e) {
             throw e;
         } catch (SOAPException e) {
             throw ExceptionFactory.makeWebServiceException(e);
         }
-        return soapEnvelope;
     }
 
     /* (non-Javadoc)
@@ -253,7 +266,7 @@
                     .makeWebServiceException(Messages.getMessage("SAAJConverterErr1"));
         }
         NameCreator nc = new NameCreator((SOAPEnvelope)env);
-        return buildSOAPTree(nc, null, parent, reader, false);
+        return buildSOAPTree(nc, null, null, parent, reader, null, false);
     }
 
 
@@ -279,7 +292,7 @@
             reader = omElement.getXMLStreamReaderWithoutCaching();
         }
         NameCreator nc = new NameCreator(sf);
-        return buildSOAPTree(nc, null, parent, reader, false);
+        return buildSOAPTree(nc, null, null, parent, reader, null, false);
     }
 
 
@@ -295,9 +308,11 @@
      * @param quitAtBody - true if quit reading after the body START_ELEMENT
      */
     protected SOAPElement buildSOAPTree(NameCreator nc,
+                                        SOAPMessage message,
                                         SOAPElement root,
                                         SOAPElement parent,
                                         XMLStreamReader reader,
+                                        MimePartProvider mimePartProvider,
                                         boolean quitAtBody)
             throws WebServiceException {
         try {
@@ -316,6 +331,18 @@
                                 root = parent;
                             }
                         }
+                        if (message != null && mimePartProvider != null
+                                && Constants.ELEM_XOP_INCLUDE.equals(reader.getLocalName())
+                                && Constants.URI_XOP_INCLUDE.equals(reader.getNamespaceURI())) {
+                            String href = reader.getAttributeValue(null, "href");
+                            if (href != null) {
+                                String contentId = XOPUtils.getContentIDFromURL(href);
+                                AttachmentPart part = message.createAttachmentPart();
+                                part.setContentId(contentId);
+                                part.setDataHandler(mimePartProvider.getDataHandler(contentId));
+                                message.addAttachmentPart(part);
+                            }
+                        }
                         if (quitAtBody && parent instanceof SOAPBody) {
                             return root;
                         }
@@ -388,6 +415,8 @@
             throw ExceptionFactory.makeWebServiceException(e);
         } catch (SOAPException e) {
             throw ExceptionFactory.makeWebServiceException(e);
+        } catch (IOException e) {
+            throw ExceptionFactory.makeWebServiceException(e);
         }
         return root;
     }
diff --git a/modules/jaxws/test/org/apache/axis2/jaxws/message/SAAJConverterTests.java b/modules/jaxws/test/org/apache/axis2/jaxws/message/SAAJConverterTests.java
index bd499bc..0473782 100644
--- a/modules/jaxws/test/org/apache/axis2/jaxws/message/SAAJConverterTests.java
+++ b/modules/jaxws/test/org/apache/axis2/jaxws/message/SAAJConverterTests.java
@@ -107,7 +107,7 @@
 		SAAJConverter converter = f.getSAAJConverter();
 		
 		// Step 2: Convert the OM SOAPEnvelope to an SAAJ SOAPEnvelope
-		SOAPEnvelope saajEnvelope = converter.toSAAJ(omEnvelope);
+		SOAPEnvelope saajEnvelope = converter.toSAAJ(omEnvelope, true).getSOAPPart().getEnvelope();
 		
 		// Step 2a: Simple assertion check to ensure correctness.
 		String name = saajEnvelope.getBody().getFirstChild().getLocalName();
@@ -121,7 +121,7 @@
 		assertTrue("a".equals(name));
 		
 		// Step 4: Rinse and repeat
-		saajEnvelope = converter.toSAAJ(omEnvelope);
+		saajEnvelope = converter.toSAAJ(omEnvelope, true).getSOAPPart().getEnvelope();
 		name = saajEnvelope.getBody().getFirstChild().getLocalName();
 		assertTrue("a".equals(name));
 		omEnvelope = converter.toOM(saajEnvelope);
@@ -212,7 +212,7 @@
 		SAAJConverter converter = f.getSAAJConverter();
 		
 		// Step 2: Convert the OM SOAPEnvelope to an SAAJ SOAPEnvelope
-		SOAPEnvelope saajEnvelope = converter.toSAAJ(omEnvelope);
+		SOAPEnvelope saajEnvelope = converter.toSAAJ(omEnvelope, true).getSOAPPart().getEnvelope();
 		
 		// Step 3: Verify attribute type is stored after conversion
 		Element testElement = (Element) saajEnvelope.getBody().getFirstChild().getFirstChild();
diff --git a/modules/kernel/src/org/apache/axis2/builder/MTOMBuilder.java b/modules/kernel/src/org/apache/axis2/builder/MTOMBuilder.java
index 4ddb79d..9a04afa 100644
--- a/modules/kernel/src/org/apache/axis2/builder/MTOMBuilder.java
+++ b/modules/kernel/src/org/apache/axis2/builder/MTOMBuilder.java
@@ -43,9 +43,6 @@
     public OMElement processMIMEMessage(Attachments attachments, String contentType,
             MessageContext messageContext) throws AxisFault {
         try {
-            // TODO: this will be changed later (see AXIS2-5308)
-            messageContext.setAttachmentMap(attachments);
-            
             SOAPModelBuilder builder = OMXMLBuilderFactory.createSOAPModelBuilder(attachments);
             OMDocument document = builder.getDocument();
             String charsetEncoding = document.getCharsetEncoding();
