Index: /mnt/d/eclipse/workspace/mapbuilder/lib/model/OwsContext.js
===================================================================
--- /mnt/d/eclipse/workspace/mapbuilder/lib/model/OwsContext.js	(revision 3668)
+++ /mnt/d/eclipse/workspace/mapbuilder/lib/model/OwsContext.js	(working copy)
@@ -241,7 +241,16 @@
    * @return height String URL for the GetMap request
    */
   this.getServerUrl = function(requestName, method, feature) {
-    return feature.selectSingleNode("wmc:Server/wmc:OnlineResource").getAttribute("xlink:href");
+    var service = requestName.split(":");
+    if (service.length > 0) {
+      service = service[0].toUpperCase();
+    }
+    var url = feature.selectSingleNode("wmc:Server[@service='OGC:"+service+"']/wmc:OnlineResource").getAttribute("xlink:href");
+    if (!url) {
+      // fallback to default service
+      url = feature.selectSingleNode("wmc:Server/wmc:OnlineResource").getAttribute("xlink:href");
+    }
+    return url;
   }
 
   /**
Index: /mnt/d/eclipse/workspace/mapbuilder/lib/tool/xsl/wfs_GetFeature.xsl
===================================================================
--- /mnt/d/eclipse/workspace/mapbuilder/lib/tool/xsl/wfs_GetFeature.xsl	(revision 3668)
+++ /mnt/d/eclipse/workspace/mapbuilder/lib/tool/xsl/wfs_GetFeature.xsl	(working copy)
@@ -178,7 +178,7 @@
 
   <!-- template rule matching source root element -->
 
-  <xsl:template match="wmc:FeatureType[wmc:Server/@service='OGC:WFS']">
+  <xsl:template match="*[wmc:Server/@service='OGC:WFS']">
 
     <xsl:param name="resourceName" select="wmc:Name"/>
 
@@ -274,7 +274,7 @@
 
           </xsl:variable>
 
-          <xsl:value-of select="translate(normalize-space($query),' ','')" disable-output-escaping="no"/><xsl:if test="$cFilterStr">&amp;filter=<xsl:value-of select="normalize-space($cFilterStr)"/></xsl:if>
+          <xsl:value-of select="translate(normalize-space($query),' ','')" disable-output-escaping="no"/><xsl:if test="ogc:Filter">&amp;filter=<xsl:value-of select="normalize-space($cFilterStr)"/></xsl:if>
 
 <!-- TBD something still wrong with filter parameter here -->
 
Index: /mnt/d/eclipse/workspace/mapbuilder/lib/widget/GetFeatureInfoWSR.js
===================================================================
--- /mnt/d/eclipse/workspace/mapbuilder/lib/widget/GetFeatureInfoWSR.js	(revision 3668)
+++ /mnt/d/eclipse/workspace/mapbuilder/lib/widget/GetFeatureInfoWSR.js	(working copy)
@@ -7,9 +7,10 @@
 // Ensure this object's dependancies are loaded.
 mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
 /**
- * Implements WMS GetFeatureInfo functionality, using the WebServiceRequest
- * tool. This widget can be used as an example on how to write widgets that
- * use the WebServiceRequest functionality.
+ * Implements GetFeatureInfo functionality, using the WebServiceRequest
+ * tool. This will work with the WMS:GetFeatureInfo request as well as
+ * with WFS:GetFeature. This widget can be used as an example on how to
+ * write widgets that use the WebServiceRequest functionality.
  * @constructor
  * @base ButtonBase
  * @author adair
@@ -25,6 +26,13 @@
   /** WebServiceRequest controller for this widget */
   this.controller = controller ? controller.firstChild.nodeValue : null;
   
+  var tolerance = widgetNode.selectSingleNode("mb:tolerance");
+  /**
+   * tolerance in pixels around the click point for WFS:GetFeature
+   * default is 3
+   */
+  this.tolerance = tolerance ? parseFloat(getNodeValue(tolerance)) : 3;
+  
   /**
    * GetFeatureInfoWSR control
    * @param objRef reference to this object.
@@ -59,11 +67,11 @@
    */
   this.doOnMouseup = function(e) {
     objRef = this;
+    if (!objRef.enabled) return;
     var controller = config.objects[objRef.controller];
-    if (!objRef.enabled) return;
     var layerNameList = new Array();
     var selectedLayer=objRef.targetModel.getParam("selectedLayer");
-    if (selectedLayer==null) {
+    if (!selectedLayer) {
       var queryList = objRef.targetModel.getQueryableLayers();
       if (queryList.length==0) {
          alert(mbGetMessage("noQueryableLayers"));
@@ -70,12 +78,19 @@
          return;
       } else {
         for (var i=0; i<queryList.length; ++i) {
-          layerNameList[i] = queryList[i].firstChild.nodeValue;   //convert to the layer names
+          layerNameList.push(queryList[i].firstChild.nodeValue);   //convert to the layer names
         }
       }
     } else {
-      layerNameList[0]= selectedLayer;
+      layerNameList.push(selectedLayer);
     }
+    
+    var llPx = e.xy.add(-objRef.tolerance, objRef.tolerance);
+    var urPx = e.xy.add(objRef.tolerance, -objRef.tolerance);
+    
+    var ll = objRef.targetModel.map.getLonLatFromPixel(llPx);
+    var ur = objRef.targetModel.map.getLonLatFromPixel(urPx);
+    
     for (var i=0; i<layerNameList.length; ++i) {
       var layerName = layerNameList[i];
       var hidden = objRef.targetModel.getHidden(layerName);
@@ -80,8 +95,12 @@
       var layerName = layerNameList[i];
       var hidden = objRef.targetModel.getHidden(layerName);
       if (hidden == 0) { //query only visible layers
+        controller.requestStylesheet.setParameter("bBoxMinX", ll.x);
+        controller.requestStylesheet.setParameter("bBoxMinY", ll.y);
+        controller.requestStylesheet.setParameter("bBoxMaxX", ur.x);
+        controller.requestStylesheet.setParameter("bBoxMaxY", ur.y);
         controller.requestStylesheet.setParameter("queryLayer", layerName);
-        objRef.targetModel.setParam("wms_GetFeatureInfo", layerName);
+        objRef.targetModel.setParam(controller.requestName.replace(/:/,"_"), layerName);
       }
     }
   }
