diff --git a/src/community/wcs2_0/src/main/java/applicationContext.xml b/src/community/wcs2_0/src/main/java/applicationContext.xml
index 0242c3e..70d16b7 100644
--- a/src/community/wcs2_0/src/main/java/applicationContext.xml
+++ b/src/community/wcs2_0/src/main/java/applicationContext.xml
@@ -72,6 +72,8 @@
   <!-- GetCoverage -->
   <bean id="wcs20subsetKvpParser" class="org.geoserver.wcs2_0.kvp.SubsetKvpParser"/>
   
+  <bean id="wcs20getCoverageKvpParser" class="org.geoserver.wcs2_0.kvp.WCS20GetCoverageRequestReader"/>
+  
   <bean id="wcs201GetCoverageRequestReader" class="org.geoserver.wcs2_0.xml.WcsXmlReader">
     <constructor-arg value="GetCoverage" />
     <constructor-arg value="2.0.1" />
diff --git a/src/community/wcs2_0/src/main/java/org/geoserver/wcs2_0/kvp/WCS20GetCapabilitiesRequestReader.java b/src/community/wcs2_0/src/main/java/org/geoserver/wcs2_0/kvp/WCS20GetCapabilitiesRequestReader.java
index ab84ca0..c5bcfcd 100644
--- a/src/community/wcs2_0/src/main/java/org/geoserver/wcs2_0/kvp/WCS20GetCapabilitiesRequestReader.java
+++ b/src/community/wcs2_0/src/main/java/org/geoserver/wcs2_0/kvp/WCS20GetCapabilitiesRequestReader.java
@@ -5,13 +5,12 @@
 package org.geoserver.wcs2_0.kvp;
 
 import java.util.Map;
-import net.opengis.ows20.AcceptVersionsType;
 
+import net.opengis.ows20.AcceptVersionsType;
 import net.opengis.wcs20.GetCapabilitiesType;
 import net.opengis.wcs20.Wcs20Factory;
-import org.eclipse.emf.ecore.EObject;
-import org.geoserver.ows.kvp.AcceptVersionsKvpParser;
 
+import org.geoserver.ows.kvp.AcceptVersionsKvpParser;
 import org.geoserver.ows.kvp.EMFKvpRequestReader;
 
 /**
diff --git a/src/main/src/main/java/org/vfny/geoserver/util/ResponseUtils.java b/src/main/src/main/java/org/vfny/geoserver/util/ResponseUtils.java
index 900ff10..4fad3a8 100644
--- a/src/main/src/main/java/org/vfny/geoserver/util/ResponseUtils.java
+++ b/src/main/src/main/java/org/vfny/geoserver/util/ResponseUtils.java
@@ -12,7 +12,9 @@ import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.util.HashMap;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -56,7 +58,11 @@ public final class ResponseUtils {
                     //interpret no host as backreference to server
                     Map<String, String> kvp = null;
                     if (uri.getQuery() != null && !"".equals(uri.getQuery())) {
-                        kvp = KvpUtils.parseQueryString("?" + uri.getQuery());
+                        Map<String, Object> parsed = KvpUtils.parseQueryString("?" + uri.getQuery());
+                        kvp = new HashMap<String, String>();
+                        for (Entry<String, Object> entry : parsed.entrySet()) {
+                            kvp.put(entry.getKey(), (String) entry.getValue());
+                        }
                     }
 
                     content = buildURL(baseURL, uri.getPath(), kvp, URLType.RESOURCE);
diff --git a/src/main/src/test/java/org/geoserver/test/GeoServerAbstractTestSupport.java b/src/main/src/test/java/org/geoserver/test/GeoServerAbstractTestSupport.java
index c662867..eef2b7b 100644
--- a/src/main/src/test/java/org/geoserver/test/GeoServerAbstractTestSupport.java
+++ b/src/main/src/test/java/org/geoserver/test/GeoServerAbstractTestSupport.java
@@ -1164,10 +1164,18 @@ public abstract class GeoServerAbstractTestSupport extends OneTimeSetupTest {
      * Helper method to create the kvp params from the query string.
      */
     private void kvp(MockHttpServletRequest request, String path) {
-         Map<String, String> params = KvpUtils.parseQueryString(path);
+         Map<String, Object> params = KvpUtils.parseQueryString(path);
          for (String key : params.keySet()) {
-            String value = params.get(key);
-            request.setupAddParameter(key, value);
+            Object value = params.get(key);
+            if(value instanceof String) {
+                request.setupAddParameter(key, (String) value);
+            } else {
+                String[] values = (String[]) value;
+                for (String v: values) {
+                    request.setupAddParameter(key, v);
+                }
+            }
+            
         }
          
     }
diff --git a/src/main/src/test/java/org/geoserver/test/GeoServerSystemTestSupport.java b/src/main/src/test/java/org/geoserver/test/GeoServerSystemTestSupport.java
index a400b34..5a3d13c 100644
--- a/src/main/src/test/java/org/geoserver/test/GeoServerSystemTestSupport.java
+++ b/src/main/src/test/java/org/geoserver/test/GeoServerSystemTestSupport.java
@@ -1364,10 +1364,17 @@ public class GeoServerSystemTestSupport extends GeoServerBaseTestSupport<SystemT
      * Helper method to create the kvp params from the query string.
      */
     private void kvp(MockHttpServletRequest request, String path) {
-         Map<String, String> params = KvpUtils.parseQueryString(path);
+         Map<String, Object> params = KvpUtils.parseQueryString(path);
          for (String key : params.keySet()) {
-            String value = params.get(key);
-            request.setupAddParameter(key, value);
+            Object value = params.get(key);
+            if(value instanceof String) {
+                request.setupAddParameter(key, (String) value);
+            } else {
+                String[] values = (String[]) value;
+                for (String v : values) {
+                    request.setupAddParameter(key, v);
+                }
+            }
         }
          
     }
diff --git a/src/ows/src/main/java/org/geoserver/ows/util/KvpUtils.java b/src/ows/src/main/java/org/geoserver/ows/util/KvpUtils.java
index 5528198..961999e 100644
--- a/src/ows/src/main/java/org/geoserver/ows/util/KvpUtils.java
+++ b/src/ows/src/main/java/org/geoserver/ows/util/KvpUtils.java
@@ -328,18 +328,26 @@ public class KvpUtils {
         for (Iterator itr = kvp.entrySet().iterator(); itr.hasNext();) {
             Map.Entry entry = (Map.Entry) itr.next();
             String key = (String) entry.getKey();
-            String value = null;
+            Object value = null;
 
             if (entry.getValue() instanceof String) {
-                value = (String) entry.getValue();
+                value = trim((String) entry.getValue());
             } else if (entry.getValue() instanceof String[]) {
-                //TODO: perhaps handle multiple values for a key
-                value = (String) ((String[]) entry.getValue())[0];
-            }
-
-            //trim the string
-            if ( value != null ) {
-                value = value.trim(); 
+                String[] values = (String[]) entry.getValue();
+                List<String> normalized = new ArrayList<String>();
+                for (String v : values) {
+                    v = trim(v);
+                    if(v != null) {
+                        normalized.add(v);
+                    }
+                }
+                if(normalized.size() == 0) {
+                    value = null;
+                } else if(normalized.size() == 1) {
+                    value = normalized.get(0);
+                } else {
+                    value = (String[]) normalized.toArray(new String[normalized.size()]);
+                }
             }
             
             //convert key to lowercase 
@@ -348,6 +356,14 @@ public class KvpUtils {
         
         return normalizedKvp;
     }
+
+    private static String trim(String value) {
+        // trim the string
+        if ( value != null ) {
+            value = value.trim(); 
+        }
+        return value;
+    }
     
     /**
      * Parses a map of key value pairs.
@@ -400,19 +416,15 @@ public class KvpUtils {
         for (Iterator itr = kvp.entrySet().iterator(); itr.hasNext();) {
             Map.Entry entry = (Map.Entry) itr.next();
             String key = (String) entry.getKey();
-            String value = (String) entry.getValue();
             
-            //find the parser for this key value pair
-            Object parsed = null;
-
+            // find the parser for this key value pair
             KvpParser parser = null;
-            for (Iterator pitr = parsers.iterator(); pitr.hasNext() && parsed == null;) {
+            for (Iterator pitr = parsers.iterator(); pitr.hasNext();) {
                 KvpParser candidate = (KvpParser) pitr.next();
                 if (key.equalsIgnoreCase(candidate.getKey())) {
                     if (parser == null) {
                         parser = candidate;
-                    }
-                    else {
+                    } else {
                         String curService = parser.getService();
                         Version curVersion = parser.getVersion();
 
@@ -448,9 +460,21 @@ public class KvpUtils {
                 }
             }
 
+            // parse the value
+            Object parsed = null;
             if (parser != null) {
                 try {
-                    parsed = parser.parse(value);
+                    if(entry.getValue() instanceof String) {
+                        String value = (String) entry.getValue();
+                        parsed = parser.parse(value);
+                    } else {
+                        String[] values = (String[]) entry.getValue();
+                        List result = new ArrayList();
+                        for (String v : values) {
+                            result.add(parser.parse(v));
+                        }
+                        parsed = result;
+                    }
                 } catch (Throwable t) {
                     //dont throw any exceptions yet, befor the service is
                     // known
@@ -475,7 +499,7 @@ public class KvpUtils {
      * @param path a url in the form path?k1=v1&k2=v2&,,,
      * @return
      */
-    public static Map<String, String> parseQueryString(String path) {
+    public static Map<String, Object> parseQueryString(String path) {
         int index = path.indexOf('?');
 
         if (index == -1) {
@@ -484,7 +508,7 @@ public class KvpUtils {
 
         String queryString = path.substring(index + 1);
         StringTokenizer st = new StringTokenizer(queryString, "&");
-        Map<String, String> result = new HashMap<String, String>();
+        Map<String, Object> result = new HashMap<String, Object>();
         while (st.hasMoreTokens()) {
             String token = st.nextToken();
             String[] keyValuePair;
@@ -511,7 +535,25 @@ public class KvpUtils {
                 
             }
          
-            result.put(keyValuePair[0], keyValuePair.length > 1 ?  keyValuePair[1] : "");
+            String key = keyValuePair[0];
+            String value = keyValuePair.length > 1 ?  keyValuePair[1] : "";
+            if(result.get(key) == null) {
+                result.put(key, value);
+            } else {
+                String[] array;
+                Object oldValue = result.get(key);
+                if(oldValue instanceof String) {
+                    array = new String[2];
+                    array[0] = (String) oldValue;
+                    array[1] = value;
+                } else {
+                    String[] oldArray = (String[]) oldValue;
+                    array = new String[oldArray.length + 1];
+                    System.arraycopy(oldArray, 0, array, 0, oldArray.length);
+                    array[oldArray.length] = value;
+                }
+                result.put(key, array);
+            }
         }
         
         return result;
diff --git a/src/ows/src/test/java/org/geoserver/ows/kvp/KvpUtilsTest.java b/src/ows/src/test/java/org/geoserver/ows/kvp/KvpUtilsTest.java
index 8b13240..5d6182a 100644
--- a/src/ows/src/test/java/org/geoserver/ows/kvp/KvpUtilsTest.java
+++ b/src/ows/src/test/java/org/geoserver/ows/kvp/KvpUtilsTest.java
@@ -162,11 +162,20 @@ public class KvpUtilsTest extends TestCase {
     }
     
     public static void testParseQueryString() {
-        Map<String, String> kvp = KvpUtils.parseQueryString("geoserver?request=WMS&version=1.0.0&CQL_FILTER=NAME='geoserver'");
+        Map<String, Object> kvp = KvpUtils.parseQueryString("geoserver?request=WMS&version=1.0.0&CQL_FILTER=NAME='geoserver'");
         assertEquals(3, kvp.size());
         assertEquals("WMS", kvp.get("request"));
         assertEquals("1.0.0", kvp.get("version"));
         assertEquals("NAME='geoserver'", kvp.get("CQL_FILTER"));
     }
     
+    public static void testParseQueryStringRepeated() {
+        Map<String, Object> kvp = KvpUtils.parseQueryString("geoserver?request=WMS&version=1.0.0&version=2.0.0&CQL_FILTER=NAME='geoserver'");
+        assertEquals(3, kvp.size());
+        assertEquals("WMS", kvp.get("request"));
+        assertTrue(Arrays.equals(new String[] {"1.0.0", "2.0.0"}, (String[]) kvp.get("version")));
+        assertEquals("NAME='geoserver'", kvp.get("CQL_FILTER"));
+    }
+
+    
 }
