Index: src/main/java/org/apache/synapse/transport/passthru/util/SourceResponseFactory.java
===================================================================
--- src/main/java/org/apache/synapse/transport/passthru/util/SourceResponseFactory.java	(revision 167399)
+++ src/main/java/org/apache/synapse/transport/passthru/util/SourceResponseFactory.java	(working copy)
@@ -27,7 +27,9 @@
 import org.apache.synapse.transport.passthru.SourceResponse;
 import org.apache.synapse.transport.passthru.config.SourceConfiguration;
 
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 
@@ -59,6 +61,19 @@
              }
         	 
         }
+        
+        // Add excess respsonse header. 
+		String excessProp = NhttpConstants.EXCESS_TRANSPORT_HEADERS;
+		Map excessHeaders = (Map) msgContext.getProperty(excessProp);
+		if (excessHeaders != null) {
+			for (Iterator iterator = excessHeaders.keySet().iterator(); iterator.hasNext();) {
+				String key = (String) iterator.next();
+				for (String excessVal : (Collection<String>) excessHeaders.get(key)) {
+					sourceResponse.addHeader(key, (String) excessVal);
+				}
+			}
+		}
+
 
         return sourceResponse;
     }
Index: src/main/java/org/apache/synapse/transport/passthru/TargetResponse.java
===================================================================
--- src/main/java/org/apache/synapse/transport/passthru/TargetResponse.java	(revision 167399)
+++ src/main/java/org/apache/synapse/transport/passthru/TargetResponse.java	(working copy)
@@ -16,6 +16,7 @@
 
 package org.apache.synapse.transport.passthru;
 
+import org.apache.commons.collections.map.MultiValueMap;
 import org.apache.http.*;
 import org.apache.http.entity.BasicHttpEntity;
 import org.apache.http.impl.DefaultConnectionReuseStrategy;
@@ -36,6 +37,8 @@
     private Pipe pipe = null;
     /** Headers of the response */
     private Map<String, String> headers = new HashMap<String, String>();
+    /** Excess headers of the response */ 
+    private Map excessHeaders = new MultiValueMap();
     /** The status of the response */
     private int status = HttpStatus.SC_OK;
     /** Http status line */
@@ -70,9 +73,13 @@
         Header[] headers = response.getAllHeaders();
         if (headers != null) {
             for (Header header : headers) {
-                this.headers.put(header.getName(), header.getValue());
+            	if(this.headers.containsKey(header.getName())) {
+            		addExcessHeader(header);
+            	} else {
+            		this.headers.put(header.getName(), header.getValue());
+            	}
             }
-        }
+        }       
 
         this.expectResponseBody = expectResponseBody;
     }    
@@ -153,6 +160,14 @@
         return headers;
     }
 
+    public Map getExcessHeaders() {
+    	return this.excessHeaders;
+    }
+    
+    public void addExcessHeader(Header h) {
+    	this.excessHeaders.put(h.getName(), h.getValue());
+    }
+    
     public Pipe getPipe() {
         return pipe;
     }
Index: src/main/java/org/apache/synapse/transport/passthru/SourceResponse.java
===================================================================
--- src/main/java/org/apache/synapse/transport/passthru/SourceResponse.java	(revision 167399)
+++ src/main/java/org/apache/synapse/transport/passthru/SourceResponse.java	(working copy)
@@ -16,6 +16,7 @@
 
 package org.apache.synapse.transport.passthru;
 
+import org.apache.commons.collections.map.MultiValueMap;
 import org.apache.http.*;
 import org.apache.http.entity.BasicHttpEntity;
 import org.apache.http.impl.DefaultConnectionReuseStrategy;
@@ -27,14 +28,18 @@
 import org.apache.synapse.transport.passthru.config.SourceConfiguration;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 
 public class SourceResponse {
     private Pipe pipe = null;
     /** Transport headers */
-    private Map<String, String> headers = new HashMap<String, String>();
+    //private Map<String, String> headers = new HashMap<String, String>();
+    private Map<String, TreeSet<String>> headers = new HashMap<String, TreeSet<String>>(); //MultiValueMap();
     /** Status of the response */
     private int status = HttpStatus.SC_OK;
     /** Status line */
@@ -93,7 +98,10 @@
         BasicHttpEntity entity = new BasicHttpEntity();
 
         int contentLength = -1;
-        String contentLengthHeader = headers.get(HTTP.CONTENT_LEN);
+    	String contentLengthHeader = null; 
+        if(headers.get(HTTP.CONTENT_LEN) != null && headers.get(HTTP.CONTENT_LEN).size() > 0) {
+        	contentLengthHeader = headers.get(HTTP.CONTENT_LEN).first();
+        } 
         if (contentLengthHeader != null) {
             contentLength = Integer.parseInt(contentLengthHeader);
 
@@ -110,11 +118,14 @@
         response.setEntity(entity);
 
         // set any transport headers
-        Set<Map.Entry<String, String>> entries = headers.entrySet();
+        Set<Map.Entry<String, TreeSet<String>>> entries = headers.entrySet();
 
-        for (Map.Entry<String, String> entry : entries) {
-            if (entry.getKey() != null) {
-                response.addHeader(entry.getKey(), entry.getValue());
+        for (Map.Entry<String, TreeSet<String>> entry : entries) {
+            if (entry.getKey() != null) {     
+            	Iterator<String> i = entry.getValue().iterator();
+                while(i.hasNext()) {
+                	response.addHeader(entry.getKey(), i.next());
+                }              
             }
         }
 
@@ -174,7 +185,14 @@
     }
 
     public void addHeader(String name, String value) {
-        headers.put(name, value);
+    	if(headers.get(name) == null) {
+    		TreeSet<String> values = new TreeSet<String>(); 
+    		values.add(value);
+    		headers.put(name, values);
+    	} else {
+    		TreeSet<String> values = headers.get(name);
+    		values.add(value);
+    	}
     }
 
     public void setStatus(int status) {
Index: src/main/java/org/apache/synapse/transport/passthru/PassThroughHttpSender.java
===================================================================
--- src/main/java/org/apache/synapse/transport/passthru/PassThroughHttpSender.java	(revision 167399)
+++ src/main/java/org/apache/synapse/transport/passthru/PassThroughHttpSender.java	(working copy)
@@ -195,7 +195,7 @@
 
 
     public InvocationResponse invoke(org.apache.axis2.context.MessageContext msgContext) throws AxisFault {
-        // remove unwanted HTTP headers (if any from the current message)
+        // remove unwanted HTTP headers (if any from the current message)    	
         PassThroughTransportUtils.removeUnwantedHeaders(msgContext,
                 targetConfiguration.isPreserveServerHeader(),
                 targetConfiguration.isPreserveUserAgentHeader());
Index: src/main/java/org/apache/synapse/transport/passthru/ClientWorker.java
===================================================================
--- src/main/java/org/apache/synapse/transport/passthru/ClientWorker.java	(revision 167399)
+++ src/main/java/org/apache/synapse/transport/passthru/ClientWorker.java	(working copy)
@@ -62,6 +62,7 @@
         this.expectEntityBody = response.isExpectResponseBody();
 
         Map<String,String> headers = response.getHeaders();
+        Map excessHeaders = response.getExcessHeaders();
       
 		String oriURL = headers.get(PassThroughConstants.LOCATION);
 		
@@ -133,7 +134,9 @@
         for (Map.Entry<String, String> headerEntry : headerEntries) {
             headerMap.put(headerEntry.getKey(), headerEntry.getValue());
         }
-        responseMsgCtx.setProperty(MessageContext.TRANSPORT_HEADERS, headerMap);
+        responseMsgCtx.setProperty(MessageContext.TRANSPORT_HEADERS, headerMap);      
+        responseMsgCtx.setProperty(NhttpConstants.EXCESS_TRANSPORT_HEADERS, excessHeaders);
+
 
         if (response.getStatus() == 202) {
             responseMsgCtx.setProperty(AddressingConstants.

