Index: src/main/java/org/vfny/geoserver/wms/responses/map/kml/KMLRasterTransformer.java
===================================================================
--- src/main/java/org/vfny/geoserver/wms/responses/map/kml/KMLRasterTransformer.java	(revision 9826)
+++ src/main/java/org/vfny/geoserver/wms/responses/map/kml/KMLRasterTransformer.java	(working copy)
@@ -150,7 +150,7 @@
                 element("href", "layer_" + mapLayerOrder + ".png");
             } else {
                 //reference the image as a remote wms call
-                element("href", KMLUtils.getMapUrl(mapContext, mapLayer, false));
+                element("href", KMLUtils.getMapUrl(mapContext, mapLayer, 0,  false));
             }
         }
     }
Index: src/main/java/org/vfny/geoserver/wms/responses/map/kml/KMLUtils.java
===================================================================
--- src/main/java/org/vfny/geoserver/wms/responses/map/kml/KMLUtils.java	(revision 9826)
+++ src/main/java/org/vfny/geoserver/wms/responses/map/kml/KMLUtils.java	(working copy)
@@ -32,6 +32,7 @@
      *
      * @param mapContext The map context.
      * @param mapLayer The Map layer, may be <code>null</code>.
+     * @param layerIndex The index of the layer in the request.
      * @param bbox The bounding box of the request, may be <code>null</code>.
      * @param kvp Additional or overidding kvp parameters, may be <code>null</code>
      * @param tile Flag controlling wether the request should be made against tile cache
@@ -37,17 +38,17 @@
      * @param tile Flag controlling wether the request should be made against tile cache
      *
      * @return The full url for a getMap request.
-     * @deprecated use {@link WMSRequests#getGetMapUrl(WMSMapContext, MapLayer, Envelope, String[])}
+     * @deprecated use {@link WMSRequests#getGetMapUrl(WMSMapContext, MapLayer, int, Envelope, String[])}
      */
-    public static String getMapUrl(WMSMapContext mapContext, MapLayer mapLayer, Envelope bbox,
+    public static String getMapUrl(WMSMapContext mapContext, MapLayer mapLayer, int layerIndex, Envelope bbox,
         String[] kvp, boolean tile) {
        
         if ( tile ) {
-            return WMSRequests.getTiledGetMapUrl( mapContext.getRequest(), mapLayer, bbox, kvp );
+            return WMSRequests.getTiledGetMapUrl( mapContext.getRequest(), mapLayer, layerIndex, bbox, kvp );
 
         }
         
-        return WMSRequests.getGetMapUrl( mapContext.getRequest(), mapLayer, bbox, kvp ); 
+        return WMSRequests.getGetMapUrl( mapContext.getRequest(), mapLayer, layerIndex, bbox, kvp ); 
     }
 
     /**
@@ -58,6 +59,7 @@
      * </p>
      * @param mapContext The map context.
      * @param mapLayer The Map layer, may be <code>null</code>
+     * @param layerIndex The index of the layer in the request.     * 
      * @param kvp Additional or overidding kvp parameters, may be <code>null</code>
      * @param tile Flag controlling wether the request should be made against tile cache
      *
@@ -64,8 +66,8 @@
      * @return The full url for a getMap request.
      * @deprecated use {@link WMSRequests#getGetMapUrl(WMSMapContext, MapLayer, Envelope, String[])}
      */
-    public static String getMapUrl(WMSMapContext mapContext, MapLayer mapLayer, boolean tile) {
-        return getMapUrl(mapContext, mapLayer, mapContext.getAreaOfInterest(), null, tile);
+    public static String getMapUrl(WMSMapContext mapContext, MapLayer mapLayer, int layerIndex, boolean tile) {
+        return getMapUrl(mapContext, mapLayer, layerIndex, mapContext.getAreaOfInterest(), null, tile);
     }
 
     /**
Index: src/main/java/org/vfny/geoserver/wms/responses/map/kml/KMLSuperOverlayTransformer.java
===================================================================
--- src/main/java/org/vfny/geoserver/wms/responses/map/kml/KMLSuperOverlayTransformer.java	(revision 9826)
+++ src/main/java/org/vfny/geoserver/wms/responses/map/kml/KMLSuperOverlayTransformer.java	(working copy)
@@ -190,7 +190,7 @@
 
             start("Icon");
 
-            String href = KMLUtils.getMapUrl(mapContext, mapLayer, box,
+            String href = KMLUtils.getMapUrl(mapContext, mapLayer, 0, box,
                     new String[] { "width", "256", "height", "256" }, true);
             element("href", href);
             LOGGER.fine(href);
@@ -224,7 +224,7 @@
 
             start("Link");
 
-            String getMap = KMLUtils.getMapUrl(mapContext, mapLayer, box,
+            String getMap = KMLUtils.getMapUrl(mapContext, mapLayer, 0, box,
                     new String[] {
                         "format", KMLMapProducerFactory.MIME_TYPE, "width", "256", "height", "256",
                         "superoverlay", "true"
Index: src/main/java/org/vfny/geoserver/wms/responses/map/georss/RSSGeoRSSTransformer.java
===================================================================
--- src/main/java/org/vfny/geoserver/wms/responses/map/georss/RSSGeoRSSTransformer.java	(revision 9826)
+++ src/main/java/org/vfny/geoserver/wms/responses/map/georss/RSSGeoRSSTransformer.java	(working copy)
@@ -71,7 +71,7 @@
             
             start( "link" );
             
-            cdata(WMSRequests.getGetMapUrl(map.getRequest(),null,null,null));
+            cdata(WMSRequests.getGetMapUrl(map.getRequest(),null, 0, null,null));
             end( "link" );
             
             //element( "description", "description" );
Index: src/main/java/org/vfny/geoserver/wms/responses/map/kml/KMLNetworkLinkTransformer.java
===================================================================
--- src/main/java/org/vfny/geoserver/wms/responses/map/kml/KMLNetworkLinkTransformer.java	(revision 9826)
+++ src/main/java/org/vfny/geoserver/wms/responses/map/kml/KMLNetworkLinkTransformer.java	(working copy)
@@ -1,8 +1,10 @@
 package org.vfny.geoserver.wms.responses.map.kml;
 
 import java.io.IOException;
+import java.util.List;
 import java.util.logging.Logger;
 
+import org.geoserver.ows.util.KvpUtils;
 import org.geoserver.wms.util.WMSRequests;
 import org.geotools.xml.transform.TransformerBase;
 import org.geotools.xml.transform.Translator;
@@ -96,7 +98,7 @@
                 //link
                 start("Link" );
   
-                String href = WMSRequests.getGetMapUrl(request, layers[i].getName(),null, null, null);
+                String href = WMSRequests.getGetMapUrl(request, layers[i].getName(), i, null, null, null);
                 start( "href" );
                 cdata( href );
                 end( "href" );
@@ -109,7 +111,7 @@
         }
         
         protected void encodeAsOverlay( GetMapRequest request ) {
-            MapLayerInfo[] layers = request.getLayers();
+            MapLayerInfo[] layers = request.getLayers();         
             for ( int i = 0; i < layers.length; i++ ) {
                 start("NetworkLink");
                 element( "name", layers[i].getName() );
@@ -119,10 +121,10 @@
                 start( "Url" );
                 
                 //set bbox to null so its not included in the request, google 
-                // earth will append it for us
+                // earth will append it for us                
                 request.setBbox(null);
                 
-                String href = WMSRequests.getGetMapUrl(request, layers[i].getName(),null, null, null);
+                String href = WMSRequests.getGetMapUrl(request, layers[i].getName(), i, null, null, null);
                 start( "href" );
                 cdata( href );
                 end( "href" );
Index: src/main/java/org/geoserver/wms/util/WMSRequests.java
===================================================================
--- src/main/java/org/geoserver/wms/util/WMSRequests.java	(revision 9826)
+++ src/main/java/org/geoserver/wms/util/WMSRequests.java	(working copy)
@@ -4,7 +4,9 @@
  */
 package org.geoserver.wms.util;
 
+import java.io.UnsupportedEncodingException;
 import java.lang.reflect.Array;
+import java.net.URLEncoder;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -16,6 +18,7 @@
 import org.geoserver.ows.util.KvpUtils;
 import org.geotools.map.MapLayer;
 import org.geotools.styling.Style;
+import org.vfny.geoserver.ServiceException;
 import org.vfny.geoserver.global.GeoServer;
 import org.vfny.geoserver.global.MapLayerInfo;
 import org.vfny.geoserver.util.Requests;
@@ -23,6 +26,7 @@
 import org.vfny.geoserver.wms.requests.GetMapRequest;
 import org.vfny.geoserver.wms.requests.WMSRequest;
 
+import com.lowagie.text.html.HtmlEncoder;
 import com.vividsolutions.jts.geom.Envelope;
 
 /**
@@ -91,6 +95,7 @@
      *
      * @param req The getMap request.
      * @param layer The Map layer, may be <code>null</code>.
+     * @param layerIndex The index of the layer in the request. 
      * @param bbox The bounding box of the request, may be <code>null</code>.
      * @param kvp Additional or overidding kvp parameters, may be <code>null</code>
      *
@@ -96,7 +101,7 @@
      *
      * @return The full url for a getMap request.
      */
-    public static String getTiledGetMapUrl(GetMapRequest req, MapLayer layer, Envelope bbox, String[] kvp) {
+    public static String getTiledGetMapUrl(GetMapRequest req, MapLayer layer, int layerIndex, Envelope bbox, String[] kvp) {
         String baseUrl = Requests.getTileCacheBaseUrl(req.getHttpServletRequest(),
                     req.getGeoServer());
         
@@ -101,11 +106,11 @@
                     req.getGeoServer());
         
         if ( baseUrl == null ) {
-            return getGetMapUrl( req, layer, bbox, kvp );
+            return getGetMapUrl( req, layer, layerIndex, bbox, kvp );
 
         }
         
-        return getGetMapUrl( baseUrl, req, layer.getTitle(),layer.getStyle().getName(), bbox, kvp );
+        return getGetMapUrl( baseUrl, req, layer.getTitle(), layerIndex, layer.getStyle().getName(), bbox, kvp );
     }
 
     /**
@@ -121,6 +126,7 @@
      *
      * @param req The getMap request
      * @param layer The Map layer, may be <code>null</code>.
+     * @param layerIndex The index of the layer in the request. 
      * @param bbox The bounding box of the request, may be <code>null</code>.
      * @param kvp Additional or overidding kvp parameters, may be <code>null</code>
      *
@@ -126,7 +132,7 @@
      *
      * @return The full url for a getMap request.
      */
-    public static String getGetMapUrl(GetMapRequest req, MapLayer layer, Envelope bbox, String[] kvp) {
+    public static String getGetMapUrl(GetMapRequest req, MapLayer layer, int layerIndex, Envelope bbox, String[] kvp) {
         //base url
         String baseUrl = getBaseUrl( req );
     
@@ -133,9 +139,11 @@
         String layerName = layer != null ? layer.getTitle() : null;
         String style = layer != null ? layer.getStyle().getTitle() : null;
         
-        return getGetMapUrl( baseUrl, req, layerName,style, bbox, kvp );
+        return getGetMapUrl( baseUrl, req, layerName, layerIndex, style, bbox, kvp );
     }
-
+  
+    
+    
     /**
      * Encodes the url of a GetMap request.
      * <p>
@@ -154,6 +162,7 @@
      *
      * @param req The getMap request
      * @param layer The layer name, may be <code>null</code>.
+     * @param layerIndex The index of the layer in the request. 
      * @param style The style name, may be <code>null</code>
      * @param bbox The bounding box of the request, may be <code>null</code>.
      * @param kvp Additional or overidding kvp parameters, may be <code>null</code>
@@ -160,11 +169,11 @@
      *
      * @return The full url for a getMap request.
      */
-    public static String getGetMapUrl(GetMapRequest req, String layer, String style, Envelope bbox, String[] kvp) {
+    public static String getGetMapUrl(GetMapRequest req, String layer, int layerIndex, String style, Envelope bbox, String[] kvp) {
         //base url
         String baseUrl = getBaseUrl( req );
     
-        return getGetMapUrl( baseUrl, req, layer, style, bbox, kvp );
+        return getGetMapUrl( baseUrl, req, layer, layerIndex, style, bbox, kvp );
     }
     
     /**
@@ -202,7 +211,7 @@
      * Helper method for encoding GetMap request.
      *
      */
-    static String getGetMapUrl( String baseUrl, GetMapRequest req, String layer, String style, Envelope bbox, String[] kvp ) {
+    static String getGetMapUrl( String baseUrl, GetMapRequest req, String layer, int layerIndex, String style, Envelope bbox, String[] kvp ) {
         //parameters
         HashMap params = new HashMap();
 
@@ -215,6 +224,30 @@
         StringBuffer layers = new StringBuffer();
         StringBuffer styles = new StringBuffer();
         
+        
+        /*---------------------------------------------------------*
+         * GEOS-2131: Pass the layer index into this method now to *
+         * account for multiple layers with the same name but a    *
+         * different filter.  This block of code is to maintain    *
+         * existing behavior if the request does not contain       *
+         * multiple requests for the same layer name.  In that     *
+         * case continue to use the layer name as the search       *
+         * criteria.											   *
+         * //TODO: remove this once we are sure all usage of the   *
+         * layer index is working.                                 *
+         *---------------------------------------------------------*/
+        boolean useLayerIndex = true;
+        int count=0;
+        for ( int i = 0; i < req.getLayers().length; i++ ) {
+            if ( layer.equals( req.getLayers()[i].getName() ) ) {
+            	++count;
+            }
+        }
+        // only one of each layer in the request
+        if (count == 1) {
+        	useLayerIndex = false;
+        }
+        
         if ( layer != null ) {
              layers.append( layer );
              if ( style != null ) {
@@ -222,11 +255,15 @@
              }
              else {
                  //use default for layer
-                 for ( int i = 0; i < req.getLayers().length; i++ ) {
-                     if ( layer.equals( req.getLayers()[i].getName() ) ) {
-                         styles.append( req.getLayers()[i].getDefaultStyle().getName() );
-                     }
-                 }
+            	 if (useLayerIndex) {
+            		 styles.append( req.getLayers()[layerIndex].getDefaultStyle().getName() );	                 
+            	 } else {
+            		 for ( int i = 0; i < req.getLayers().length; i++ ) {
+	                     if ( layer.equals( req.getLayers()[i].getName() ) ) {
+	                         styles.append( req.getLayers()[i].getDefaultStyle().getName() );
+	                     }
+	                 }            		 
+            	 }
              }
         }
         else {
@@ -250,7 +287,7 @@
         //filters, we grab them from the original raw kvp since re-encoding 
         // them from objects is kind of silly
         if (layer != null) {
-            //only get filters for hte layer
+            //only get filters for the layer
             int index = 0;
             for ( ; index < req.getLayers().length; index++) {
                 if ( req.getLayers()[index].getName().equals( layer ) ) {
@@ -258,6 +295,10 @@
                 }
             }
             
+            if (useLayerIndex) {
+            	index = layerIndex;
+            }
+            
             if ( req.getRawKvp().get("filter") != null ) {
                 //split out the filter we need
                 List filters = KvpUtils.readFlat((String) req.getRawKvp().get("filter"),
@@ -271,7 +312,7 @@
                 params.put( "cql_filter", filters.get(index) );
             }
             else if ( req.getRawKvp().get("featureid") != null  ) {
-                //semantics of feautre id slightly different, replicate entire value
+                //semantics of feature id slightly different, replicate entire value
                 params.put("featureid", req.getRawKvp().get("featureid"));
             }
         
@@ -383,7 +424,15 @@
       
         for (Iterator e = kvp.entrySet().iterator(); e.hasNext();) {
             Map.Entry entry = (Map.Entry) e.next();
-            query.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
+            String name = (String)entry.getKey();
+            String value = (String)entry.getValue();
+            try {
+            	name = URLEncoder.encode(name, "UTF-8");
+            	value = URLEncoder.encode(value, "UTF-8");
+            } catch (UnsupportedEncodingException uex) {
+            	throw new ServiceException("Error encoding name-value pairs" + uex.getMessage(), uex);
+            }
+            query.append(name).append("=").append(value).append("&");
         }
 
         query.setLength(query.length() - 1);

