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 1613)
+++ /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/AbstractTC.java	(revision 1614)
@@ -18,4 +18,5 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.io.BufferedReader;
@@ -188,5 +189,5 @@
      *
      */
-    protected String sendDummyMessage(String type, String message, String respMsg)
+    protected String sendDummyMessage(String type, String query, String message, String respMsg)
         throws Exception
     {
@@ -197,11 +198,17 @@
         HttpRequestBase httpRequest = null;
         
+        String uri = "http://localhost:" + PROXY_PORT + "/dummyServlet";
+        
+        if (query != null) {
+            uri += "?" + query;
+        }
+        
         if ("POST".equals(type)) {
-            httpRequest = new HttpPost("http://localhost:" + PROXY_PORT + "/dummyServlet");
+            httpRequest = new HttpPost(uri);
             HttpEntity entity = new StringEntity(message, ContentType.TEXT_PLAIN);
             ((HttpPost) httpRequest).setEntity(entity);
         }
         else if ("GET".equals(type)) {
-            httpRequest = new HttpGet("http://localhost:" + PROXY_PORT + "/dummyServlet");
+            httpRequest = new HttpGet(uri);
         }
         
@@ -210,4 +217,5 @@
             
             assertEquals(message, dummyServlet.getRequest());
+            assertEquals(query, dummyServlet.getQuery());
             System.err.println(response.getStatusLine());
             String responseStr = readStreamContentToString(response.getEntity().getContent());
@@ -223,5 +231,10 @@
      *
      */
-    protected void assertEvent(Event event, String method, String message, String response) {
+    protected void assertEvent(Event  event,
+                               String method,
+                               String query,
+                               String message,
+                               String response)
+    {
         assertNotNull(event);
         assertNotNull(event.getType());
@@ -231,7 +244,26 @@
         assertTrue(event.getTarget() instanceof HTTPTarget);
         
-        HttpExchange exchange = ((HTTPEventType) event.getType()).getExchange();
-        
+        assertExchange(((HTTPEventType) event.getType()).getExchange(),
+                       method, query, message, response);
+    }
+    
+    /**
+     *
+     */
+    protected void assertExchange(HttpExchange exchange,
+                                  String       method,
+                                  String       query,
+                                  String       message,
+                                  String       response)
+    {
         assertEquals(Method.fromValue(method), exchange.getRequest().getMethod());
+        
+        if (query != null) {
+            assertEquals(query, exchange.getRequest().getQuery());
+        }
+        else if (exchange.getRequest().getQuery() != null) {
+            System.err.println(exchange.getRequest().getQuery());
+            fail("unexpected query");
+        }
         
         if (message != null) {
Index: /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/DummyServlet.java
===================================================================
--- /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/DummyServlet.java	(revision 1613)
+++ /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/DummyServlet.java	(revision 1614)
@@ -31,4 +31,7 @@
     
     /** */
+    private String query;
+    
+    /** */
     private String requestMessage;
     
@@ -43,4 +46,5 @@
         throws ServletException, IOException
     {
+        query = request.getQueryString();
         requestMessage = AbstractTC.readStreamContentToString(request.getInputStream());
         
@@ -56,4 +60,5 @@
         throws ServletException, IOException
     {
+        query = request.getQueryString();
         requestMessage = AbstractTC.readStreamContentToString(request.getInputStream());
         
@@ -69,4 +74,5 @@
         throws ServletException, IOException
     {
+        query = request.getQueryString();
         requestMessage = AbstractTC.readStreamContentToString(request.getInputStream());
         
@@ -88,3 +94,10 @@
         return this.requestMessage;
     }
+
+    /**
+     * 
+     */
+    String getQuery() {
+        return this.query;
+    }
 }
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 1613)
+++ /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/HttpMonitorTest.java	(revision 1614)
@@ -98,4 +98,7 @@
     }
     
+    /**
+     *
+     */
     @Test
     public void test_SimulatedSession_MonitorOnly() throws Exception {
@@ -158,5 +161,8 @@
         System.out.println("\n\n");
     }
-
+    
+    /**
+     *
+     */
     @Test
     public void test_SimpleText_ProxyAndMonitor() throws Exception {
@@ -175,5 +181,5 @@
         String message = "dummy message";
         String expectedResponse = "response content";
-        String response = sendDummyMessage("POST", message, expectedResponse);
+        String response = sendDummyMessage("POST", null, message, expectedResponse);
         
         assertEquals(expectedResponse, response);
@@ -207,7 +213,10 @@
         assertEquals(1, sequence.size());
 
-        assertEvent(sequence.get(0), "POST", message, response);
-    }
-
+        assertEvent(sequence.get(0), "POST", null, message, response);
+    }
+    
+    /**
+     *
+     */
     @Test
     public void test_XMLMessage_ProxyAndMonitor() throws Exception {
@@ -259,5 +268,5 @@
             "</httpEvent>";
 
-        String response = sendDummyMessage("POST", message, expectedResponse);
+        String response = sendDummyMessage("POST", null, message, expectedResponse);
         
         assertEquals(expectedResponse, response);
@@ -291,7 +300,10 @@
         assertEquals(1, sequence.size());
 
-        assertEvent(sequence.get(0), "POST", message, response);
-    }
-
+        assertEvent(sequence.get(0), "POST", null, message, response);
+    }
+    
+    /**
+     *
+     */
     @Test
     public void test_SOAP_ProxyAndMonitor() throws Exception {
@@ -348,8 +360,124 @@
         assertEquals(2, sequence.size());
 
-        assertEvent(sequence.get(0), "GET", null, null); // get WSDL
-        assertEvent(sequence.get(1), "POST", null, null); // send request
-    }
-    
+        assertEvent(sequence.get(0), "GET", "wsdl", null, null); // get WSDL
+        assertEvent(sequence.get(1), "POST", null, null, null); // send request
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_LargeRequest_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();
+        
+        StringBuffer message = new StringBuffer();
+        StringBuffer expectedResponse = new StringBuffer();
+        
+        for (int i = 0; i < 1000; i++) {
+            message.append(" # " + i + " test request data");
+            expectedResponse.append(" # " + i + " test response data");
+        }
+        
+        String response =
+            sendDummyMessage("POST", null, message.toString(), expectedResponse.toString());
+        
+        assertEquals(expectedResponse.toString(), 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(1, sequence.size());
+
+        assertEvent(sequence.get(0), "POST", null, message.toString(), response);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_Query_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();
+        
+        String message = "dummy message";
+        String query = "key=value&key2=value2&key3=%3E%3CXXX";
+        String expectedResponse = "response content";
+        String response = sendDummyMessage("POST", query, message, expectedResponse);
+        
+        assertEquals(expectedResponse, 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(1, sequence.size());
+
+        assertEvent(sequence.get(0), "POST", query, message, response);
+    }
+
     /**
      *
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 1613)
+++ /trunk/autoquest-httpmonitor-test/src/test/java/de/ugoe/cs/autoquest/httpmonitor/HttpMonitoringProxyTest.java	(revision 1614)
@@ -48,5 +48,4 @@
 import de.ugoe.cs.autoquest.plugin.http.HTTPLogParser;
 import de.ugoe.cs.autoquest.plugin.http.logdata.HttpExchange;
-import de.ugoe.cs.autoquest.plugin.http.logdata.Method;
 import dummyservice.DummyService;
 import dummyservice.DummyServicePortType;
@@ -111,4 +110,7 @@
     }
     
+    /**
+     *
+     */
     @Test(expected=java.lang.IllegalArgumentException.class)
     public void test_InvalidInitialization_01() throws Exception {
@@ -116,4 +118,7 @@
     }
     
+    /**
+     *
+     */
     @Test
     public void test_SimpleText_Local() throws Exception {
@@ -127,5 +132,5 @@
         String message = "dummy message";
         String expectedResponse = "response content";
-        String response = sendDummyMessage("POST", message, expectedResponse);
+        String response = sendDummyMessage("POST", null, message, expectedResponse);
         
         assertEquals(expectedResponse, response);
@@ -156,7 +161,10 @@
         assertEquals(1, sequence.size());
 
-        assertEvent(sequence.get(0), "POST", message, expectedResponse);
-    }
-
+        assertEvent(sequence.get(0), "POST", null, message, expectedResponse);
+    }
+    
+    /**
+     *
+     */
     @Test
     public void test_SimpleText_Remote() throws Exception {
@@ -170,5 +178,5 @@
         String message = "dummy message";
         String expectedResponse = "response content";
-        String response = sendDummyMessage("POST", message, expectedResponse);
+        String response = sendDummyMessage("POST", null, message, expectedResponse);
         
         assertEquals(expectedResponse, response);
@@ -176,4 +184,5 @@
         // give the proxy some time to send the copy of the message
         while(messages.size() < 1) {
+            System.out.println("waiting for message to be send by the proxy");
             Thread.sleep(1000);
         }
@@ -188,10 +197,10 @@
             (JAXBElement<HttpExchange>) unmarshaller.unmarshal(new StringReader(messages.get(0)));
         
-        HttpExchange exchange = jaxObject.getValue();
-        
-        assertEquals(message, exchange.getRequest().getContent().getData());
-        assertEquals(response, exchange.getResponse().getContent().getData());
-    }
-    
+        assertExchange(jaxObject.getValue(), "POST", null, message, expectedResponse);
+    }
+    
+    /**
+     *
+     */
     @Test
     public void test_XMLMessage_Local() throws Exception {
@@ -238,5 +247,5 @@
             "</httpEvent>";
 
-        String response = sendDummyMessage("POST", message, expectedResponse);
+        String response = sendDummyMessage("POST", null, message, expectedResponse);
         
         assertEquals(expectedResponse, response);
@@ -267,7 +276,10 @@
         assertEquals(1, sequence.size());
 
-        assertEvent(sequence.get(0), "POST", message, expectedResponse);
-    }
-    
+        assertEvent(sequence.get(0), "POST", null, message, expectedResponse);
+    }
+    
+    /**
+     *
+     */
     @Test
     public void test_XMLMessage_Remote() throws Exception {
@@ -314,5 +326,5 @@
             "</httpEvent>";
 
-        String response = sendDummyMessage("POST", message, expectedResponse);
+        String response = sendDummyMessage("POST", null, message, expectedResponse);
         
         assertEquals(expectedResponse, response);
@@ -320,4 +332,5 @@
         // give the proxy some time to send the copy of the message
         while(messages.size() < 1) {
+            System.out.println("waiting for message to be send by the proxy");
             Thread.sleep(1000);
         }
@@ -332,10 +345,10 @@
             (JAXBElement<HttpExchange>) unmarshaller.unmarshal(new StringReader(messages.get(0)));
         
-        HttpExchange exchange = jaxObject.getValue();
-        
-        assertEquals(message, exchange.getRequest().getContent().getData());
-        assertEquals(response, exchange.getResponse().getContent().getData());
-    }
-    
+        assertExchange(jaxObject.getValue(), "POST", null, message, expectedResponse);
+    }
+    
+    /**
+     *
+     */
     @Test
     public void test_SOAP_Local() throws Exception {
@@ -384,8 +397,11 @@
         assertEquals(2, sequence.size());
 
-        assertEvent(sequence.get(0), "GET", null, null); // get WSDL
-        assertEvent(sequence.get(1), "POST", null, null); // send request
-    }
-    
+        assertEvent(sequence.get(0), "GET", "wsdl", null, null); // get WSDL
+        assertEvent(sequence.get(1), "POST", null, null, null); // send request
+    }
+    
+    /**
+     *
+     */
     @SuppressWarnings("unchecked")
     @Test
@@ -415,4 +431,5 @@
         // give the proxy some time to send the copy of the message
         while(messages.size() < 1) {
+            System.out.println("waiting for message to be send by the proxy");
             Thread.sleep(1000);
         }
@@ -426,22 +443,15 @@
             (JAXBElement<HttpExchange>) unmarshaller.unmarshal(new StringReader(messages.get(0)));
         
-        HttpExchange exchange = jaxObject.getValue();
-        
-        assertEquals(Method.GET, exchange.getRequest().getMethod());
-
-        assertNull(exchange.getRequest().getContent());
-        assertNotNull(exchange.getResponse().getContent().getData());
+        assertExchange(jaxObject.getValue(), "GET", "wsdl", null, null);
 
         jaxObject =
             (JAXBElement<HttpExchange>) unmarshaller.unmarshal(new StringReader(messages.get(1)));
             
-        exchange = jaxObject.getValue();
-            
-        assertEquals(Method.POST, exchange.getRequest().getMethod());
-
-        assertNotNull(exchange.getRequest().getContent().getData());
-        assertNotNull(exchange.getResponse().getContent().getData());
-    }
-    
+        assertExchange(jaxObject.getValue(), "POST", null, null, null);
+    }
+    
+    /**
+     *
+     */
     @Test
     public void test_LargeRequest_Local() throws Exception {
@@ -461,5 +471,6 @@
         }
         
-        String response = sendDummyMessage("POST", message.toString(), expectedResponse.toString());
+        String response =
+            sendDummyMessage("POST", null, message.toString(), expectedResponse.toString());
         
         assertEquals(expectedResponse.toString(), response);
@@ -490,7 +501,10 @@
         assertEquals(1, sequence.size());
 
-        assertEvent(sequence.get(0), "POST", message.toString(), expectedResponse.toString());
-    }
-
+        assertEvent(sequence.get(0), "POST", null, message.toString(), expectedResponse.toString());
+    }
+    
+    /**
+     *
+     */
     @Test
     public void test_LargeRequest_Remote() throws Exception {
@@ -511,5 +525,6 @@
         }
         
-        String response = sendDummyMessage("POST", message.toString(), expectedResponse.toString());
+        String response =
+            sendDummyMessage("POST", null, message.toString(), expectedResponse.toString());
         
         assertEquals(expectedResponse.toString(), response);
@@ -517,4 +532,5 @@
         // give the proxy some time to send the copy of the message
         while(messages.size() < 1) {
+            System.out.println("waiting for message to be send by the proxy");
             Thread.sleep(1000);
         }
@@ -529,8 +545,90 @@
             (JAXBElement<HttpExchange>) unmarshaller.unmarshal(new StringReader(messages.get(0)));
         
-        HttpExchange exchange = jaxObject.getValue();
-        
-        assertEquals(message.toString(), exchange.getRequest().getContent().getData());
-        assertEquals(response.toString(), exchange.getResponse().getContent().getData());
+        assertExchange(jaxObject.getValue(), "POST", null,
+                       message.toString(), expectedResponse.toString());
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_Query_Local() throws Exception {
+        proxy = new HttpMonitoringProxy
+            (new String[] { LOG_FILE_DIR, PROXY_PORT + "", "localhost:" + DUMMY_SERVER_PORT,
+                            "local" });
+
+        proxy.init();
+        proxy.start();
+        
+        String message = "dummy message";
+        String expectedResponse = "response content";
+        String query = "key=value&key2=value2&key3=%3E%3CXXX";
+        String response = sendDummyMessage("POST", query, message, expectedResponse);
+        
+        assertEquals(expectedResponse, response);
+        
+        proxy.stop();
+        proxy = 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(1, sequence.size());
+
+        assertEvent(sequence.get(0), "POST", query, message, expectedResponse);
+    }
+    
+    /**
+     *
+     */
+    @Test
+    public void test_Query_Remote() throws Exception {
+        proxy = new HttpMonitoringProxy
+            (new String[] { LOG_FILE_DIR, PROXY_PORT + "",
+                            "localhost:" + DUMMY_SERVER_PORT, "localhost:" + MONITOR_PORT });
+
+        proxy.init();
+        proxy.start();
+        
+        String message = "dummy message";
+        String expectedResponse = "response content";
+        String query = "key=value&key2=value2&key3=%3E%3CXXX";
+        String response = sendDummyMessage("POST", query, message, expectedResponse);
+        
+        assertEquals(expectedResponse, response);
+        
+        // give the proxy some time to send the copy of the message
+        while(messages.size() < 1) {
+            System.out.println("waiting for message to be send by the proxy");
+            Thread.sleep(1000);
+        }
+        
+        assertEquals(1, messages.size());
+        
+        JAXBContext jaxbContext = JAXBContext.newInstance(HttpExchange.class.getPackage().getName());
+        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+        
+        @SuppressWarnings("unchecked")
+        JAXBElement<HttpExchange> jaxObject =
+            (JAXBElement<HttpExchange>) unmarshaller.unmarshal(new StringReader(messages.get(0)));
+        
+        assertExchange(jaxObject.getValue(), "POST", query, message, expectedResponse);
     }
 
@@ -553,4 +651,5 @@
             
             resp.setStatus(HttpServletResponse.SC_OK);
+            System.out.println("send ok response");
         }
         
Index: /trunk/autoquest-httpmonitor/src/main/java/de/ugoe/cs/autoquest/httpmonitor/proxy/HttpMonitorRemoteExchangeHandler.java
===================================================================
--- /trunk/autoquest-httpmonitor/src/main/java/de/ugoe/cs/autoquest/httpmonitor/proxy/HttpMonitorRemoteExchangeHandler.java	(revision 1613)
+++ /trunk/autoquest-httpmonitor/src/main/java/de/ugoe/cs/autoquest/httpmonitor/proxy/HttpMonitorRemoteExchangeHandler.java	(revision 1614)
@@ -142,46 +142,51 @@
      */
     @Override
-    public void handleHttpExchange(HttpExchange httpExchange) {
+    public synchronized void handleHttpExchange(HttpExchange httpExchange) {
         // send the exchange to the server and wait for completion
-        synchronized (openRequests) {
-            Request httpMonitorRequest = httpClient.newRequest(httpMonitorServer, httpMonitorPort);
-            httpMonitorRequest.method(HttpMethod.POST);
-            httpMonitorRequest.version(HttpVersion.HTTP_1_1);
-
-            OutputStreamContentProvider out = new OutputStreamContentProvider();
-            httpMonitorRequest.content(out);
-            httpMonitorRequest.send(this);
-
-            try {
-                JAXBContext jaxbContext =
-                        JAXBContext.newInstance(HttpExchange.class.getPackage().getName());
-                Marshaller marshaller = jaxbContext.createMarshaller();
-
-                OutputStreamWriter writer = new OutputStreamWriter(out.getOutputStream(), "UTF-8");
-                marshaller.marshal(new ObjectFactory().createHttpExchange(httpExchange), writer);
-
-                out.getOutputStream().close();
-            }
-            catch (JAXBException e) {
-                Console.printerrln("could not convert request and response to XML string: " + e);
-                Console.logException(e);
-            }
-            catch (IOException e) {
-                Console.printerrln
+        Request httpMonitorRequest = httpClient.newRequest(httpMonitorServer, httpMonitorPort);
+        httpMonitorRequest.method(HttpMethod.POST);
+        httpMonitorRequest.version(HttpVersion.HTTP_1_1);
+
+        OutputStreamContentProvider out = new OutputStreamContentProvider();
+        httpMonitorRequest.content(out);
+        
+        openRequests.add(httpMonitorRequest);
+        httpMonitorRequest.send(this);
+
+        try {
+            JAXBContext jaxbContext =
+                JAXBContext.newInstance(HttpExchange.class.getPackage().getName());
+            Marshaller marshaller = jaxbContext.createMarshaller();
+
+            OutputStreamWriter writer = new OutputStreamWriter(out.getOutputStream(), "UTF-8");
+            marshaller.marshal(new ObjectFactory().createHttpExchange(httpExchange), writer);
+
+            out.getOutputStream().close();
+        }
+        catch (JAXBException e) {
+            Console.printerrln("could not convert request and response to XML string: " + e);
+            Console.logException(e);
+        }
+        catch (IOException e) {
+            Console.printerrln
                 ("could not close the stream for sending data to the HTML monitor: " + e);
-                Console.logException(e);
-            }
-            
-            openRequests.add(httpMonitorRequest);
-            
-            try {
-                // wait for the request to be removed fromt the list asynchronously
-                while (openRequests.contains(httpMonitorRequest)) {
-                    openRequests.wait();
+            Console.logException(e);
+        }
+
+        try {
+            // wait for the request to be removed from the list asynchronously
+            int count = 30;
+            while (openRequests.contains(httpMonitorRequest)) {
+                this.wait(1000);
+                
+                if (--count == 0) {
+                    // after 30 seconds, cancel the sending of the loggin request
+                    openRequests.remove(httpMonitorRequest);
+                    break;
                 }
             }
-            catch (InterruptedException e) {
-                // ignore, as this may only happen on system shutdown
-            }
+        }
+        catch (InterruptedException e) {
+            // ignore, as this may only happen on system shutdown
         }
     }
@@ -191,5 +196,5 @@
      */
     @Override
-    public void onComplete(Result result) {
+    public synchronized void onComplete(Result result) {
         if (result.isFailed()) {
             Console.traceln
@@ -198,8 +203,6 @@
         }
         
-        synchronized (openRequests) {
-            openRequests.remove(result.getRequest());
-            openRequests.notify();
-        }
+        openRequests.remove(result.getRequest());
+        this.notify();
     }
 
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 1613)
+++ /trunk/autoquest-httpmonitor/src/main/java/de/ugoe/cs/autoquest/httpmonitor/proxy/HttpMonitoringProxyServlet.java	(revision 1614)
@@ -19,4 +19,5 @@
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.net.URLDecoder;
 import java.net.URLEncoder;
 import java.nio.ByteBuffer;
@@ -99,8 +100,19 @@
     protected URI rewriteURI(HttpServletRequest request) {
         try {
+            String query = request.getQueryString();
+            
+            if (query != null) {
+                query = URLDecoder.decode(query, "UTF-8");
+            }
+            
             return new URI(request.getScheme(), null, proxiedServer, proxiedPort,
-                           request.getPathInfo(), request.getQueryString(), null);
+                           request.getPathInfo(), query, null);
         }
         catch (URISyntaxException e) {
+            Console.printerrln("could not rewrite URI: " + e);
+            Console.logException(e);
+            return null;
+        }
+        catch (UnsupportedEncodingException e) {
             Console.printerrln("could not rewrite URI: " + e);
             Console.logException(e);
@@ -365,5 +377,11 @@
                 }
             }
-            return result.toString();
+            
+            if (result.length() <= 0) {
+                return null;
+            }
+            else {
+                return result.toString();
+            }
         }
 
