Index: /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/AbstractTC.java
===================================================================
--- /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/AbstractTC.java	(revision 1391)
+++ /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/AbstractTC.java	(revision 1392)
@@ -15,4 +15,8 @@
 package de.ugoe.cs.autoquest.httpmonitor;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
 import java.io.BufferedReader;
 import java.io.File;
@@ -35,4 +39,9 @@
 import org.junit.Before;
 
+import de.ugoe.cs.autoquest.eventcore.Event;
+import de.ugoe.cs.autoquest.httpmonitor.exchange.HttpExchange;
+import de.ugoe.cs.autoquest.httpmonitor.exchange.Method;
+import de.ugoe.cs.autoquest.plugin.http.eventcore.HTTPEventType;
+import de.ugoe.cs.autoquest.plugin.http.eventcore.HTTPTarget;
 import de.ugoe.cs.util.console.TextConsole;
 
@@ -208,4 +217,34 @@
         return message.toString();
     }
+    
+    /**
+     *
+     */
+    protected void assertEvent(Event event, String method, String message, String response) {
+        assertNotNull(event);
+        assertNotNull(event.getType());
+        assertNotNull(event.getTarget());
+        
+        assertTrue(event.getType() instanceof HTTPEventType);
+        assertTrue(event.getTarget() instanceof HTTPTarget);
+        
+        HttpExchange exchange = ((HTTPEventType) event.getType()).getExchange();
+        
+        assertEquals(Method.fromValue(method), exchange.getRequest().getMethod());
+        
+        if (message != null) {
+            assertEquals(message, exchange.getRequest().getContent().getData());
+        }
+        else if (exchange.getRequest().getContent() != null) {
+            System.err.println(exchange.getRequest().getContent().getData());
+        }
+        
+        if (response != null) {
+            assertEquals(response, exchange.getResponse().getContent().getData());
+        }
+        else if (exchange.getResponse().getContent() != null) {
+            System.err.println(exchange.getResponse().getContent().getData());
+        }
+    }
 
     /**
Index: /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/HttpMonitorTest.java
===================================================================
--- /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/HttpMonitorTest.java	(revision 1391)
+++ /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/HttpMonitorTest.java	(revision 1392)
@@ -22,4 +22,5 @@
 import java.io.File;
 import java.io.StringWriter;
+import java.net.URL;
 import java.util.Collection;
 import java.util.Iterator;
@@ -28,4 +29,5 @@
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.Marshaller;
+import javax.xml.namespace.QName;
 
 import org.apache.http.HttpEntity;
@@ -46,4 +48,8 @@
 import de.ugoe.cs.autoquest.plugin.http.eventcore.HTTPEventType;
 import de.ugoe.cs.autoquest.plugin.http.eventcore.HTTPTarget;
+import dummyservice.DummyService;
+import dummyservice.DummyServicePortType;
+import dummyservice.VerifyUserInMsgType;
+import dummyservice.VerifyUserOutMsgType;
 
 /**
@@ -201,15 +207,5 @@
         assertEquals(1, sequence.size());
 
-        assertNotNull(sequence.get(0));
-        assertNotNull(sequence.get(0).getType());
-        assertTrue(sequence.get(0).getType() instanceof HTTPEventType);
-
-        assertNotNull(sequence.get(0).getTarget());
-        assertTrue(sequence.get(0).getTarget() instanceof HTTPTarget);
-
-        HttpExchange exchange = ((HTTPEventType) sequence.get(0).getType()).getExchange();
-        
-        assertEquals(message, exchange.getRequest().getContent().getData());
-        assertEquals(response, exchange.getResponse().getContent().getData());
+        assertEvent(sequence.get(0), "POST", message, response);
     }
 
@@ -295,15 +291,63 @@
         assertEquals(1, sequence.size());
 
-        assertNotNull(sequence.get(0));
-        assertNotNull(sequence.get(0).getType());
-        assertTrue(sequence.get(0).getType() instanceof HTTPEventType);
-
-        assertNotNull(sequence.get(0).getTarget());
-        assertTrue(sequence.get(0).getTarget() instanceof HTTPTarget);
-
-        HttpExchange exchange = ((HTTPEventType) sequence.get(0).getType()).getExchange();
-        
-        assertEquals(message, exchange.getRequest().getContent().getData());
-        assertEquals(response, exchange.getResponse().getContent().getData());
+        assertEvent(sequence.get(0), "POST", message, response);
+    }
+
+    @Test
+    public void test_SOAP_ProxyAndMonitor() throws Exception {
+        monitor = new HttpMonitor(new String[] { LOG_FILE_DIR, MONITOR_PORT + "" });
+
+        monitor.init();
+        monitor.start();
+
+        proxy = new HttpMonitoringProxy
+            (new String[] { LOG_FILE_DIR, PROXY_PORT + "",
+                            "localhost:" + DUMMY_SERVER_PORT, "localhost:" + MONITOR_PORT });
+
+        proxy.init();
+        proxy.start();
+
+        DummyService service = new DummyService
+            (new URL("http://localhost:" + PROXY_PORT + "/dummyWebapp/DummyServiceSOAPPort?wsdl"),
+             new QName("DummyService", "DummyService"));
+
+        DummyServicePortType dummyService = service.getDummyServiceSOAPPort();
+        
+        dummyservice.ObjectFactory factory = new dummyservice.ObjectFactory();
+        VerifyUserInMsgType request = factory.createVerifyUserInMsgType();
+        VerifyUserOutMsgType response = dummyService.verifyUser(request);
+
+        assertNotNull(response);
+        
+        // the monitor needs some time to receive the exchange --> give it
+        Thread.sleep(1000);
+        
+        monitor.stop();
+        monitor = null;
+
+        File logFile = new File(LOG_FILE_DIR + File.separator + "httpmonitor_000.log");
+        
+        assertTrue(logFile.exists());
+        
+        HTTPLogParser parser = new HTTPLogParser();
+
+        parser.parseFile(logFile);
+
+        // check the sequences
+        Collection<List<Event>> sequences = parser.getSequences();
+
+        assertNotNull(sequences);
+
+        Iterator<List<Event>> iterator = sequences.iterator();
+        assertTrue(iterator.hasNext());
+
+        List<Event> sequence = iterator.next();
+        assertFalse(iterator.hasNext());
+
+        assertNotNull(sequence);
+        assertEquals(2, sequence.size());
+
+        assertEvent(sequence.get(0), "GET", null, null); // get WSDL
+        assertEvent(sequence.get(1), "POST", null, null); // send request
     }
     
Index: /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/HttpMonitoringProxyTest.java
===================================================================
--- /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/HttpMonitoringProxyTest.java	(revision 1391)
+++ /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/HttpMonitoringProxyTest.java	(revision 1392)
@@ -49,6 +49,4 @@
 import de.ugoe.cs.autoquest.httpmonitor.proxy.HttpMonitoringProxy;
 import de.ugoe.cs.autoquest.plugin.http.HTTPLogParser;
-import de.ugoe.cs.autoquest.plugin.http.eventcore.HTTPEventType;
-import de.ugoe.cs.autoquest.plugin.http.eventcore.HTTPTarget;
 import dummyservice.DummyService;
 import dummyservice.DummyServicePortType;
@@ -445,34 +443,4 @@
         assertNotNull(exchange.getResponse().getContent().getData());
     }
-    
-    /**
-     *
-     */
-    private void assertEvent(Event event, String method, String message, String response) {
-        assertNotNull(event);
-        assertNotNull(event.getType());
-        assertNotNull(event.getTarget());
-        
-        assertTrue(event.getType() instanceof HTTPEventType);
-        assertTrue(event.getTarget() instanceof HTTPTarget);
-        
-        HttpExchange exchange = ((HTTPEventType) event.getType()).getExchange();
-        
-        assertEquals(Method.fromValue(method), exchange.getRequest().getMethod());
-        
-        if (message != null) {
-            assertEquals(message, exchange.getRequest().getContent().getData());
-        }
-        else if (exchange.getRequest().getContent() != null) {
-            System.err.println(exchange.getRequest().getContent().getData());
-        }
-        
-        if (response != null) {
-            assertEquals(response, exchange.getResponse().getContent().getData());
-        }
-        else if (exchange.getResponse().getContent() != null) {
-            System.err.println(exchange.getResponse().getContent().getData());
-        }
-    }
 
     /**
Index: /trunk/autoquest-httpmonitor/src/main/java/de/ugoe/cs/autoquest/httpmonitor/proxy/HttpMonitoringProxyServlet.java
===================================================================
--- /trunk/autoquest-httpmonitor/src/main/java/de/ugoe/cs/autoquest/httpmonitor/proxy/HttpMonitoringProxyServlet.java	(revision 1391)
+++ /trunk/autoquest-httpmonitor/src/main/java/de/ugoe/cs/autoquest/httpmonitor/proxy/HttpMonitoringProxyServlet.java	(revision 1392)
@@ -16,16 +16,24 @@
 
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.net.URLEncoder;
 import java.nio.ByteBuffer;
+import java.nio.charset.UnsupportedCharsetException;
 import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.HttpRequest;
 import org.eclipse.jetty.client.api.ContentProvider;
 import org.eclipse.jetty.client.api.Request;
 import org.eclipse.jetty.client.api.Response;
 import org.eclipse.jetty.proxy.ProxyServlet;
+import org.eclipse.jetty.util.Fields;
 
 import de.ugoe.cs.autoquest.httpmonitor.exchange.Status;
@@ -41,4 +49,8 @@
  * recorded exchange.
  * </p>
+ * <p>
+ * The implementation also overrides the default implementation of the jetty HTTP client
+ * and the jetty HTTP request to fix a bug in forwarding queries.
+ * </p>
  * 
  * @author Patrick Harms
@@ -97,4 +109,12 @@
             return null;
         }
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jetty.proxy.ProxyServlet#newHttpClient()
+     */
+    @Override
+    protected HttpClient newHttpClient() {
+        return new BugfixedHttpClient();
     }
 
@@ -200,7 +220,8 @@
 
     /**
-     * This iterator is used to implement the {@link DubbingContentProvider}. It works in the 
-     * same manner and uses delegation for wrapping the original iterator and forwards all copied
-     * data to the exchange listener manager.
+     * This iterator is used to implement the {@link DubbingContentProvider}. It uses delegation
+     * for wrapping the original iterator and forwards all copied data to the exchange listener
+     * manager. Furthermore, it combines several buffers into one. This seems to be required if
+     * SOAP messages are proxied.
      */
     public class DubbingByteBufferIterator implements Iterator<ByteBuffer> {
@@ -237,7 +258,28 @@
         @Override
         public ByteBuffer next() {
-            ByteBuffer next = delegate.next();
-            exchangeListenerManager.onRequestContent(request, next.duplicate());
-            return next;
+            List<ByteBuffer> buffers = new LinkedList<ByteBuffer>();
+            
+            int size = 0;
+            while (delegate.hasNext()) {
+                ByteBuffer next = delegate.next();
+                exchangeListenerManager.onRequestContent(request, next.duplicate());
+
+                ByteBuffer copy = ByteBuffer.allocate(next.limit());
+                copy.put(next);
+                copy.position(0);
+                buffers.add(copy);
+                
+                size += next.limit();
+            }
+            
+            ByteBuffer buffer = ByteBuffer.allocate(size);
+            
+            for (ByteBuffer orig : buffers) {
+                buffer.put(orig);
+            }
+            
+            buffer.position(0);
+            
+            return buffer;
         }
 
@@ -247,8 +289,108 @@
         @Override
         public void remove() {
-            delegate.remove();
-        }
-
-    }
-
+            while (delegate.hasNext()) {
+                delegate.remove();
+            }
+        }
+
+    }
+
+    /**
+     * <p>
+     * bugfix implementation of the jetty HTTP client to be able to use only bugfixed HTTP requests
+     * </p>
+     * 
+     * @author Patrick Harms
+     */
+    private class BugfixedHttpClient extends HttpClient {
+
+        /* (non-Javadoc)
+         * @see org.eclipse.jetty.client.HttpClient#newRequest(java.net.URI)
+         */
+        @Override
+        public Request newRequest(URI uri) {
+            return new BugfixedHttpRequest(this, uri);
+        }
+
+    }
+
+    /**
+     * <p>
+     * bugfix implementation of the jetty HTTP request. This ensures that query string
+     * representations are correctly forwarded in the case that a query parameter does not have
+     * a value. 
+     * </p>
+     * 
+     * @author Patrick Harms
+     */
+    private class BugfixedHttpRequest extends HttpRequest {
+
+        /**
+         * <p>
+         * Constructor to override parent constructor
+         * </p> 
+         */
+        BugfixedHttpRequest(HttpClient client, URI uri) {
+            super(client, uri);
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see org.eclipse.jetty.client.HttpRequest#getQuery()
+         */
+        @Override
+        public String getQuery() {
+            return buildQuery();
+        }
+
+        /**
+         * <p>
+         * this corrects the bug implemented in the parent class on creating the query string
+         * </p>
+         * 
+         * @return the correct query string
+         */
+        private String buildQuery() {
+            StringBuilder result = new StringBuilder();
+            for (Iterator<Fields.Field> iterator = super.getParams().iterator(); iterator.hasNext();)
+            {
+                Fields.Field field = iterator.next();
+                String[] values = field.values();
+                for (int i = 0; i < values.length; ++i) {
+                    if (i > 0) {
+                        result.append("&");
+                    }
+
+                    result.append(field.name());
+
+                    if ((values[i] != null) && (!"".equals(values[i].trim()))) {
+                        result.append("=");
+                        result.append(urlEncode(values[i]));
+                    }
+                }
+                if (iterator.hasNext()) {
+                    result.append("&");
+                }
+            }
+            return result.toString();
+        }
+
+        /**
+         * <p>
+         * convenience method copied from parent class, as it is private there.
+         * </p>
+         * 
+         * @see HttpRequest#urlEncode(String)
+         */
+        private String urlEncode(String value) {
+            String encoding = "UTF-8";
+            try {
+                return URLEncoder.encode(value, encoding);
+            }
+            catch (UnsupportedEncodingException e) {
+                throw new UnsupportedCharsetException(encoding);
+            }
+        }
+    }
 }
