diff --git a/data-discovery/src/main/java/common/Subsurvey.java b/data-discovery/src/main/java/common/Subsurvey.java
index c925b0fb87da78013fdf18d14ca8287d6894831b..b8550a1c64c8b08a473dfecf82f599bbe26fdd9a 100644
--- a/data-discovery/src/main/java/common/Subsurvey.java
+++ b/data-discovery/src/main/java/common/Subsurvey.java
@@ -64,6 +64,12 @@ class Subsurvey
 
       try
       {
+         // FIXME parser not robust:
+         // * eats space-character also within the field:  ,  hu ha ,  --> "huha" not "hu ha"
+         // * double quote used inside string not escaped: ,"blabla 25\" res",
+         // * last record (line) is missing if that line is not closed with EOL
+         // * UTF-8 or US-ASACII ?
+         // * else ? how to validate/verify correctness
 
          CSVReaderHeaderAware csvReader = new CSVReaderHeaderAware(new FileReader(csvFilename));
 
diff --git a/data-discovery/src/main/java/output/Dataset.java b/data-discovery/src/main/java/output/Dataset.java
index 0ed5590bad0e40a77358f5207c0a1754128c6a9e..d3aec3953af9c1044770ad6d64bc44d9e197e2cc 100644
--- a/data-discovery/src/main/java/output/Dataset.java
+++ b/data-discovery/src/main/java/output/Dataset.java
@@ -59,7 +59,7 @@ class Dataset
    }
 
 
-   public Dataset(List<Dataset> datasetList, SubsurveyId subsurveyId, String mergeUrlRoot, String mergeQueryString)
+   public Dataset(List<Dataset> datasetList, /*SubsurveyId subsurveyId,*/ String mergeUrlRoot, String mergeQueryString)
    {
       this.subsurvey_id = datasetList.get(0).subsurvey_id; // mergeabiity condition is more then 1 element in list
       this.overlapCode  = 5; // 5: exact match --> legacy used 0 here FIXME 5 will not be correct on edges of Subsurvey coverage
diff --git a/data-discovery/src/main/java/output/SearchOutputData.java b/data-discovery/src/main/java/output/SearchOutputData.java
index 8c9cdb08270ef74712b6e8d6ba1bc25d85b743a3..9d2ab54505564070c147403d344ac8dedaa7c193 100644
--- a/data-discovery/src/main/java/output/SearchOutputData.java
+++ b/data-discovery/src/main/java/output/SearchOutputData.java
@@ -13,7 +13,7 @@ class SearchOutputData
 
 
    public static SearchOutputData  marshall(Dataset[] datasetArr,
-         SubsurveyId subsurveyId, Subsurvey[] dbSubsurveys,
+         /*SubsurveyId subsurveyId,*/ Subsurvey[] dbSubsurveys,
          String mergeUrlRoot, String mergeQueryString)
    {
       SearchOutputData sod = new SearchOutputData();
@@ -22,13 +22,13 @@ class SearchOutputData
       sod.versionString = "Search (pgSphere) version " + Version.asString;
       sod.datacubeCount = datasetArr.length;
 
-      sod.subsurveyArr = groupBySubsurveys(datasetArr, subsurveyId, dbSubsurveys, mergeUrlRoot, mergeQueryString);
+      sod.subsurveyArr = groupBySubsurveys(datasetArr, /*subsurveyId,*/ dbSubsurveys, mergeUrlRoot, mergeQueryString);
       return sod;
    }
 
    // assumes datasetArr is already ordered by subsurveys
    private static Subsurvey[] groupBySubsurveys(Dataset[] datasetArr,
-         SubsurveyId subsurveyId, Subsurvey[] dbSubsurveys,
+         /*SubsurveyId subsurveyId,*/ Subsurvey[] dbSubsurveys,
          String mergeUrlRoot, String mergeQueryString)
    {
       List<Subsurvey> subsurveyList = new ArrayList<Subsurvey>();
@@ -45,7 +45,7 @@ class SearchOutputData
             {
                if( false )//Dataset.areDatasetsMergeable(datasetList) )
                {
-                  Dataset mergedDataset = new Dataset(datasetList, subsurveyId, mergeUrlRoot, mergeQueryString);
+                  Dataset mergedDataset = new Dataset(datasetList, /*subsurveyId,*/ mergeUrlRoot, mergeQueryString);
                   datasetList.add(mergedDataset);
                }
 
@@ -64,7 +64,7 @@ class SearchOutputData
 
          if( false )//Dataset.areDatasetsMergeable(datasetList) )
          {
-            Dataset mergedDataset = new Dataset(datasetList, subsurveyId, mergeUrlRoot, mergeQueryString);
+            Dataset mergedDataset = new Dataset(datasetList, /*subsurveyId,*/ mergeUrlRoot, mergeQueryString);
             datasetList.add(mergedDataset);
          }
 
diff --git a/data-discovery/src/main/java/output/XmlSerializer.java b/data-discovery/src/main/java/output/XmlSerializer.java
index 96d8410511d5ea1d0d08b4b13d9699fdd5ff1dc7..b0f692841037c48e9df6d3b7bf51f3d2bb388165 100644
--- a/data-discovery/src/main/java/output/XmlSerializer.java
+++ b/data-discovery/src/main/java/output/XmlSerializer.java
@@ -23,6 +23,7 @@ final class XmlSerializer
    public static void serializeToVoTable(
          PrintWriter writer, String charEncoding,
          SearchOutputData searchOutputData,
+         String cutoutUrl, String mergeUrl,
          boolean showDuration, long startTime_msec) throws IOException
    {
       StarTable dstable = makeSearchResultsTable( searchOutputData.subsurveyArr );
@@ -39,12 +40,22 @@ final class XmlSerializer
 
       out.write("<?xml-stylesheet type='text/xsl' href='VOTable2XHTML.xsl'?>");
       out.write( "<VOTABLE version='1.1'>" );
-      out.write( "<RESOURCE>" );
+      out.write( "<RESOURCE type=\"results\">" );
       out.write( "<DESCRIPTION> " + searchOutputData.versionString + " </DESCRIPTION>" );
 
       VOSerializer.makeSerializer( DataFormat.TABLEDATA, dstable ).writeInlineTableElement( out );
 
       out.write( "</RESOURCE>" );
+
+      out.write( "<RESOURCE type=\"meta\" utype=\"adhoc:service\" name=\"CutoutService\" >" );
+      out.write( "<DESCRIPTION> VLKB cutout service </DESCRIPTION>");
+      out.write( "<PARAM name=\"standardID\" datatype=\"char\" arraysize=\"*\" value=\"ivo://ivoa.net/std/SODA#sync-1.0\" />");
+      out.write( "<PARAM name=\"accessURL\" datatype=\"char\" arraysize=\"*\" value=\"" + cutoutUrl +  "\" />");
+      out.write( "<GROUP name=\"inputParams\">");
+      out.write( "<PARAM name=\"ID\" datatype=\"char\" arraysize=\"*\" value=\"\" ref=\"primaryID\" />"); // FIXME results table obs_publisher_did FIELD must have attrib: ID="primaryID"
+      out.write( "</GROUP>");
+      out.write( "</RESOURCE>" );
+
       out.write( "</VOTABLE>" );
       out.flush();
    }
diff --git a/data-discovery/src/main/java/webapi/FormatResponseFilter.java b/data-discovery/src/main/java/webapi/FormatResponseFilter.java
index c8e745c7e4f27d34eba8ad4ffbca49588341a4b2..7c01c846a31bea0139d17a1910ad4d15acd0d42c 100644
--- a/data-discovery/src/main/java/webapi/FormatResponseFilter.java
+++ b/data-discovery/src/main/java/webapi/FormatResponseFilter.java
@@ -103,7 +103,7 @@ public class FormatResponseFilter implements Filter
 
          // VLKB: reconstruct cutout/merge queryStrings and overlap code
          Map<String, String[]> params = request.getParameterMap();
-         SubsurveyId subsurveyId = new SubsurveyId(params);
+         SubsurveyId subsurveyId = new SubsurveyId(params); // for legacy-only Input
          Pos  pos  = Pos.parsePos(params, DEFAULT_SKY_SYSTEM);
          Band band = Band.parseBand(params, DEFAULT_SPEC_SYSTEM);
          String queryStringBase = toQueryString(pos, band);
@@ -117,7 +117,7 @@ public class FormatResponseFilter implements Filter
                queryStringBase);
 
          SearchOutputData searchOutputData = SearchOutputData.marshall(datasetArr,
-               subsurveyId,
+               /*subsurveyId,*/
                dbSubsurveyArr,
                settings.serviceUrls.mergeUrl(),
                queryStringBase);
@@ -159,7 +159,9 @@ public class FormatResponseFilter implements Filter
                      searchOutputData,showDuration,startTime_msec);
             else
                XmlSerializer.serializeToVoTable(responseWriter, RESPONSE_ENCODING,
-                     searchOutputData,showDuration,startTime_msec);
+                     searchOutputData,
+                     settings.serviceUrls.cutoutUrl(),settings.serviceUrls.mergeUrl(),
+                     showDuration,startTime_msec);
 
          }
          else