Index: /trunk/autoquest-plugin-http/src/main/java/de/ugoe/cs/autoquest/plugin/http/HTTPUtils.java
===================================================================
--- /trunk/autoquest-plugin-http/src/main/java/de/ugoe/cs/autoquest/plugin/http/HTTPUtils.java	(revision 1923)
+++ /trunk/autoquest-plugin-http/src/main/java/de/ugoe/cs/autoquest/plugin/http/HTTPUtils.java	(revision 1924)
@@ -15,11 +15,4 @@
 package de.ugoe.cs.autoquest.plugin.http;
 
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import de.ugoe.cs.autoquest.eventcore.Event;
-import de.ugoe.cs.autoquest.plugin.http.eventcore.SOAPEventType;
-import de.ugoe.cs.autoquest.plugin.http.eventcore.SimpleSOAPEventType;
 import de.ugoe.cs.autoquest.plugin.http.logdata.Address;
 
@@ -128,58 +121,4 @@
     /**
      * <p>
-     * Replaces events with a {@link SOAPEventType} with new events of {@link SimpleSOAPEventType}
-     * and no target.
-     * </p>
-     * 
-     * @param sequence
-     *            sequence where the events are replaced
-     * @param keepOnlySOAPEvents
-     *            if true, all events that are not of SOAPEventType or SimpleSOAPEventType are
-     *            removed
-     * @return sequence with {@link SimpleSOAPEventType}s instead of {@link SOAPEventType}s
-     */
-    public static List<Event> convertToSimpleSOAPEvent(List<Event> sequence,
-                                                       boolean keepOnlySOAPEvents)
-    {
-        List<Event> newSequence = null;
-        if (sequence != null) {
-            newSequence = new LinkedList<>();
-            for (Event event : sequence) {
-                if (event.getType() instanceof SOAPEventType) {
-                    SOAPEventType eventType = (SOAPEventType) event.getType();
-                    newSequence.add(new Event(new SimpleSOAPEventType(eventType.getCalledMethod(),
-                                                                      eventType.getServiceName(),
-                                                                      eventType.getClientName())));
-                }
-                else {
-                    if (!keepOnlySOAPEvents || event.getType() instanceof SimpleSOAPEventType) {
-                        newSequence.add(event);
-                    }
-                }
-            }
-        }
-        return newSequence;
-    }
-    
-    /**
-     * <p>
-     * Removes all non SOAP events from a sequence. Warning: this change is performed in-place!
-     * </p>
-     * 
-     * @param sequence
-     *            sequence where the events are replaced
-     */
-    public static void removeNonSOAPEvents(List<Event> sequence)
-    {
-        for (Iterator<Event> eventIter = sequence.iterator(); eventIter.hasNext();) {
-            Event event = eventIter.next();
-            if (!(event.getType() instanceof SOAPEventType)) {
-                eventIter.remove();
-            }
-        }
-    }
-
-    /**
-     * <p>
      * prevent instantiation
      * </p>
Index: /trunk/autoquest-plugin-http/src/main/java/de/ugoe/cs/autoquest/plugin/http/SOAPUtils.java
===================================================================
--- /trunk/autoquest-plugin-http/src/main/java/de/ugoe/cs/autoquest/plugin/http/SOAPUtils.java	(revision 1924)
+++ /trunk/autoquest-plugin-http/src/main/java/de/ugoe/cs/autoquest/plugin/http/SOAPUtils.java	(revision 1924)
@@ -0,0 +1,220 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed 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 de.ugoe.cs.autoquest.plugin.http;
+
+import java.io.StringWriter;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import de.ugoe.cs.autoquest.eventcore.Event;
+import de.ugoe.cs.autoquest.plugin.http.eventcore.SOAPEventType;
+import de.ugoe.cs.autoquest.plugin.http.eventcore.SimpleSOAPEventType;
+
+/**
+ * <p>
+ * Utilities for working with SOAP events. Their main task is to simply working with
+ * {@link SimpleSOAPEventType} and {@link SOAPEventType}.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ */
+public class SOAPUtils {
+    
+    /**
+     * <p>
+     * Replaces events with a {@link SOAPEventType} with new events of {@link SimpleSOAPEventType}
+     * and no target.
+     * </p>
+     * 
+     * @param sequence
+     *            sequence where the events are replaced
+     * @param keepOnlySOAPEvents
+     *            if true, all events that are not of SOAPEventType or SimpleSOAPEventType are
+     *            removed
+     * @return sequence with {@link SimpleSOAPEventType}s instead of {@link SOAPEventType}s
+     */
+    public static List<Event> convertToSimpleSOAPEvent(List<Event> sequence,
+                                                       boolean keepOnlySOAPEvents)
+    {
+        List<Event> newSequence = null;
+        if (sequence != null) {
+            newSequence = new LinkedList<>();
+            for (Event event : sequence) {
+                if (event.getType() instanceof SOAPEventType) {
+                    SOAPEventType eventType = (SOAPEventType) event.getType();
+                    newSequence.add(new Event(new SimpleSOAPEventType(eventType.getCalledMethod(),
+                                                                      eventType.getServiceName(),
+                                                                      eventType.getClientName(),
+                                                                      eventType.getSoapRequestBody())));
+                }
+                else {
+                    if (!keepOnlySOAPEvents || event.getType() instanceof SimpleSOAPEventType) {
+                        newSequence.add(event);
+                    }
+                }
+            }
+        }
+        return newSequence;
+    }
+    
+    /**
+     * <p>
+     * Removes all non SOAP events from a sequence. Warning: this change is performed in-place!
+     * </p>
+     * 
+     * @param sequence
+     *            sequence where the events are replaced
+     */
+    public static void removeNonSOAPEvents(List<Event> sequence)
+    {
+        for (Iterator<Event> eventIter = sequence.iterator(); eventIter.hasNext();) {
+            Event event = eventIter.next();
+            if (!(event.getType() instanceof SOAPEventType)) {
+                eventIter.remove();
+            }
+        }
+    }
+
+    /**
+     * <p>
+     * Helper function to get the name of a service from a SOAP event.
+     * </p>
+     * 
+     * @param event
+     *            event for which the service name is retrieved
+     * @return service name
+     */
+    public static String getServiceNameFromEvent(Event event) {
+        if (event.getType() instanceof SOAPEventType) {
+            return ((SOAPEventType) event.getType()).getServiceName();
+        }
+        else if (event.getType() instanceof SimpleSOAPEventType) {
+            return ((SimpleSOAPEventType) event.getType()).getServiceName();
+        }
+        else {
+            throw new RuntimeException(
+                                       "Wrong event type. Only SOAPEventType and SimpleSOAPEventType supported but was: " +
+                                           event.getType().getClass().getName());
+        }
+    }
+
+    /**
+     * 
+     * <p>
+     * Helper function to get the called method from a SOAP event
+     * </p>
+     * 
+     * @param event
+     *            event for which the called method is retrieved
+     * @return called method
+     */
+    public static String getCalledMethodFromEvent(Event event) {
+        if (event.getType() instanceof SOAPEventType) {
+            return ((SOAPEventType) event.getType()).getCalledMethod();
+        }
+        else if (event.getType() instanceof SimpleSOAPEventType) {
+            return ((SimpleSOAPEventType) event.getType()).getCalledMethod();
+        }
+        else {
+            throw new RuntimeException(
+                                       "Wrong event type. Only SOAPEventType and SimpleSOAPEventType supported but was: " +
+                                           event.getType().getClass().getName());
+        }
+    }
+
+    /**
+     * <p>
+     * Helper function to get the name of a client from a SOAP event.
+     * </p>
+     * 
+     * @param event
+     *            event for which the client name is retrieved
+     * @return service name
+     */
+    public static String getClientNameFromEvent(Event event) {
+        if (event.getType() instanceof SOAPEventType) {
+            return ((SOAPEventType) event.getType()).getClientName();
+        }
+        else if (event.getType() instanceof SimpleSOAPEventType) {
+            return ((SimpleSOAPEventType) event.getType()).getClientName();
+        }
+        else {
+            throw new RuntimeException(
+                                       "Wrong event type. Only SOAPEventType and SimpleSOAPEventType supported but was: " +
+                                           event.getType().getClass().getName());
+        }
+    }
+
+    /**
+     * <p>
+     * Helper function to get the body of a SOAP request.
+     * </p>
+     * 
+     * @param event
+     *            event for which the SOAP request body is retrieved
+     * @return body of the SOAP event
+     */
+    public static Element getSoapRequestBodyFromEvent(Event event) {
+        Element requestBody = null;
+        if (event.getType() instanceof SOAPEventType) {
+            requestBody = ((SOAPEventType) event.getType()).getSoapRequestBody();
+        }
+        else if (event.getType() instanceof SimpleSOAPEventType) {
+            requestBody = ((SimpleSOAPEventType) event.getType()).getSoapRequestBody();
+        }
+        return requestBody;
+    }
+    
+    /**
+     * <p>
+     * returns the XML serialization of a DOM node; located here because it is used for SOAP request bodies
+     * </p>
+     * 
+     * @param node
+     *            DOM node that is serialized
+     * @return XML serialization as String
+     */
+    public static String getSerialization(Node node) {
+        try {
+            StringWriter writer = new StringWriter();
+            Transformer transformer = TransformerFactory.newInstance().newTransformer();
+            transformer.transform(new DOMSource(node), new StreamResult(writer));
+            return writer.toString();
+        }
+        catch (TransformerFactoryConfigurationError | TransformerException e) {
+            throw new IllegalArgumentException(
+                                               "could not create serialization for SOAP request body.",
+                                               e);
+        }
+    }
+    
+    /**
+     * <p>
+     * prevent instantiation
+     * </p>
+     */
+    private SOAPUtils() {}
+}
Index: /trunk/autoquest-plugin-http/src/main/java/de/ugoe/cs/autoquest/plugin/http/eventcore/SOAPEventType.java
===================================================================
--- /trunk/autoquest-plugin-http/src/main/java/de/ugoe/cs/autoquest/plugin/http/eventcore/SOAPEventType.java	(revision 1923)
+++ /trunk/autoquest-plugin-http/src/main/java/de/ugoe/cs/autoquest/plugin/http/eventcore/SOAPEventType.java	(revision 1924)
@@ -23,4 +23,6 @@
 import javax.xml.soap.SOAPMessage;
 
+import org.w3c.dom.Element;
+
 import de.ugoe.cs.autoquest.plugin.http.HTTPUtils;
 import de.ugoe.cs.autoquest.plugin.http.logdata.Header;
@@ -256,4 +258,16 @@
         return soapResponse;
     }
+    
+    /**
+     * @return the body of the soapRequest
+     */
+    public Element getSoapRequestBody() {
+        try {
+            return soapRequest.getSOAPBody();
+        }
+        catch (SOAPException e) {
+            return null;
+        }
+    }
 
     /* (non-Javadoc)
Index: /trunk/autoquest-plugin-http/src/main/java/de/ugoe/cs/autoquest/plugin/http/eventcore/SimpleSOAPEventType.java
===================================================================
--- /trunk/autoquest-plugin-http/src/main/java/de/ugoe/cs/autoquest/plugin/http/eventcore/SimpleSOAPEventType.java	(revision 1923)
+++ /trunk/autoquest-plugin-http/src/main/java/de/ugoe/cs/autoquest/plugin/http/eventcore/SimpleSOAPEventType.java	(revision 1924)
@@ -15,6 +15,16 @@
 package de.ugoe.cs.autoquest.plugin.http.eventcore;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
 import de.ugoe.cs.autoquest.eventcore.IEventType;
 import de.ugoe.cs.autoquest.plugin.http.HTTPUtils;
+import de.ugoe.cs.autoquest.plugin.http.SOAPUtils;
 
 /**
@@ -44,12 +54,19 @@
      */
     private final String serviceName;
-    
+
     /**
      * <p>
-     * the name of the client; this is either the host/ip and port of the sender or, if a path
-     * map is available, a human readable name that may be based also on the receiver
+     * the name of the client; this is either the host/ip and port of the sender or, if a path map
+     * is available, a human readable name that may be based also on the receiver
      * </p>
      */
     private final String clientName;
+
+    /**
+     * <p>
+     * the body of the SOAP request; storage as serialized XML string to allow object serialization
+     * </p>
+     */
+    private final String soapRequestBody;
 
     /**
@@ -59,5 +76,9 @@
      * 
      */
-    public SimpleSOAPEventType(String calledMethod, String serviceName, String clientName) {
+    public SimpleSOAPEventType(String calledMethod,
+                               String serviceName,
+                               String clientName,
+                               Element soapRequestBody)
+    {
         if (calledMethod == null) {
             throw new IllegalArgumentException("called method must not be null");
@@ -69,7 +90,11 @@
             throw new IllegalArgumentException("clientName must not be null");
         }
+        if (soapRequestBody == null) {
+            throw new IllegalArgumentException("soapRequestBody must not be null");
+        }
         this.calledMethod = calledMethod;
         this.serviceName = serviceName;
         this.clientName = clientName;
+        this.soapRequestBody = SOAPUtils.getSerialization(soapRequestBody);
     }
 
@@ -95,14 +120,24 @@
         return serviceName;
     }
-    
+
     /**
      * <p>
      * the name of the client calling in this request
      * </p>
-     *
+     * 
      * @return the name of the client calling in this request
      */
     public String getClientName() {
         return clientName;
+    }
+
+    public Element getSoapRequestBody() {
+        try {
+            return DocumentBuilderFactory.newInstance().newDocumentBuilder()
+                .parse(new ByteArrayInputStream(soapRequestBody.getBytes())).getDocumentElement();
+        }
+        catch (SAXException | IOException | ParserConfigurationException e) {
+            return null;
+        }
     }
 
@@ -129,5 +164,6 @@
         else if (obj instanceof SimpleSOAPEventType) {
             return HTTPUtils.equals(calledMethod, ((SimpleSOAPEventType) obj).calledMethod) &&
-                HTTPUtils.equals(serviceName, ((SimpleSOAPEventType) obj).serviceName);
+                HTTPUtils.equals(serviceName, ((SimpleSOAPEventType) obj).serviceName) &&
+                HTTPUtils.equals(clientName, ((SimpleSOAPEventType) obj).clientName);
         }
         else {
@@ -143,9 +179,11 @@
     @Override
     public int hashCode() {
-        int hashCode = calledMethod.hashCode() + serviceName.hashCode();
+        int hashCode = calledMethod.hashCode() + serviceName.hashCode() + clientName.hashCode();
         return hashCode;
     }
-    
-    /* (non-Javadoc)
+
+    /*
+     * (non-Javadoc)
+     * 
      * @see java.lang.Object#toString()
      */
