Index: wms/src/main/java/org/vfny/geoserver/wms/responses/GetMapResponse.java
===================================================================
--- wms/src/main/java/org/vfny/geoserver/wms/responses/GetMapResponse.java	(revision 9179)
+++ wms/src/main/java/org/vfny/geoserver/wms/responses/GetMapResponse.java	(working copy)
@@ -23,6 +23,7 @@
 import org.geotools.data.Query;
 import org.geotools.data.QueryCapabilities;
 import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.filter.FilterAttributeExtractor;
 import org.geotools.map.DefaultMapLayer;
 import org.geotools.referencing.crs.DefaultGeographicCRS;
 import org.geotools.resources.coverage.FeatureUtilities;
@@ -31,6 +32,7 @@
 import org.opengis.feature.simple.SimpleFeatureType;
 import org.opengis.filter.Filter;
 import org.opengis.filter.FilterFactory;
+import org.opengis.filter.FilterVisitor;
 import org.opengis.parameter.ParameterNotFoundException;
 import org.opengis.parameter.ParameterValue;
 import org.opengis.parameter.ParameterValueGroup;
@@ -156,7 +158,9 @@
         final MapLayerInfo[] layers = request.getLayers();
         final Style[] styles = (Style[]) request.getStyles().toArray(
                 new Style[] {});
-        final Filter[] filters = buildLayersFilters(request.getFilter(), layers);
+        final Object[] filtersAndProps = buildLayersFiltersAndProps(request.getFilter(), layers);
+        final Filter[] filters = (Filter[])filtersAndProps[0];
+        final String[][] layerProps = (String[][])filtersAndProps[1];
 
 
 
@@ -226,6 +230,7 @@
             for (int i = 0; i < layers.length; i++) {
                 final Style layerStyle = styles[i];
                 final Filter layerFilter = filters[i];
+                final String[] layerPropNames = layerProps[i];
 
                 final DefaultMapLayer layer;
                 if(layers[i].getType() == MapLayerInfo.TYPE_REMOTE_VECTOR) {
@@ -305,6 +310,7 @@
                     final DefaultQuery definitionQuery = new DefaultQuery(source.getSchema().getTypeName());
                     definitionQuery.setVersion(featureVersion);
                     definitionQuery.setFilter(layerFilter);
+                    definitionQuery.setPropertyNames(layerPropNames);
 
                     // check for startIndex + offset
                     final Integer startIndex = request.getStartIndex();
@@ -453,7 +459,7 @@
      * @return a list of filters, one per layer, resulting of anding the user requested filter and
      *         the layer definition filter
      */
-    private Filter[] buildLayersFilters(List/*<Filter>*/ requestFilters, MapLayerInfo[] layers) {
+    private Object[] buildLayersFiltersAndProps(List/*<Filter>*/ requestFilters, MapLayerInfo[] layers) {
         final int nLayers = layers.length;
         if (requestFilters == null || requestFilters.size() == 0) {
             requestFilters = Collections.nCopies(layers.length, (Filter) Filter.INCLUDE);
@@ -462,6 +468,7 @@
                     "requested filters and number of layers do not match");
         }
         Filter[] combinedList = new Filter[nLayers];
+        String[][] combinedProps = new String[nLayers][];
         Filter layerDefinitionFilter;
         Filter userRequestedFilter;
         Filter combined;
@@ -478,9 +485,18 @@
                 }
                 combined = filterFac.and(layerDefinitionFilter, userRequestedFilter);
                 combinedList[i] = combined;
+                
+                try {
+                    FilterAttributeExtractor fe = new FilterAttributeExtractor(layer.getFeature().getFeatureType());
+                    combined.accept(fe, null);
+                    combinedProps[i] = fe.getAttributeNames();
+                } catch (IOException ioe) {
+                    //?
+                }
+                
             }
         }
-        return combinedList;
+        return new Object[] {combinedList, combinedProps};
     }
 
     /**

