diff --git a/data-discovery/src/main/java/output/Dataset.java b/data-discovery/src/main/java/output/Dataset.java
index f2ca86e5cf1e29c59a81c3d389aec716b540d3a3..0ed5590bad0e40a77358f5207c0a1754128c6a9e 100644
--- a/data-discovery/src/main/java/output/Dataset.java
+++ b/data-discovery/src/main/java/output/Dataset.java
@@ -69,7 +69,7 @@ class Dataset
       this.access = new Access();
       this.access.accessFileUrl   = null;
       this.access.accessCutoutUrl = null;
-      this.access.accessMosaicUrl = mergeUrlRoot + "?" + mergeQueryString + publisherDid;
+      this.access.accessMosaicUrl = mergeUrlRoot + "?" + mergeQueryString + "&ID=" + publisherDid;
 
       //this.vertices_deg = mergeVertices(datasetList, /*inputs.*/coord);
    }
diff --git a/data-discovery/src/main/java/output/XmlSerializer.java b/data-discovery/src/main/java/output/XmlSerializer.java
index 5a2013d53d46e78e680c8472bd6136e0e7fa312d..070d376944282361468116f30ad46cef43b35a84 100644
--- a/data-discovery/src/main/java/output/XmlSerializer.java
+++ b/data-discovery/src/main/java/output/XmlSerializer.java
@@ -12,6 +12,7 @@ import java.io.BufferedWriter;
 import java.util.List;
 import java.util.ArrayList;
 
+import vo.parameter.*;
 
 final class XmlSerializer
 {
@@ -255,7 +256,7 @@ final class XmlSerializer
 
    public static void serializeToLegacyResults(
          PrintWriter writer, String charEncoding,
-         AuthPolicy inputAuth, Coord inputCoord, SubsurveyId inputSubsurveyId,
+         AuthPolicy inputAuth, Pos pos, Band band, SubsurveyId inputSubsurveyId,
          SearchOutputData searchOutputData,
          boolean showDuration, long startTime_msec)
    {
@@ -265,7 +266,8 @@ final class XmlSerializer
 
       writer.println("<inputs>");
       if(inputSubsurveyId != null) writer.println(serialize(inputSubsurveyId));
-      if(inputCoord       != null) writer.println(serialize(inputCoord));
+      if(pos       != null) writer.println(serialize(pos));
+      if(band       != null) writer.println(serialize(band));
       if(inputAuth        != null) writer.println(serialize(inputAuth));
       writer.println("</inputs>");
 
@@ -280,34 +282,40 @@ final class XmlSerializer
       writer.println("</results>");
    }
 
-   private static String serialize(Coord coord)
+   private static String serialize(Pos pos)
    {
       StringBuilder xml = new StringBuilder();
-      if(coord.pos != null)
+      if(pos != null)
       {
-         xml.append("<SkySystem>"+coord.pos.system+"</SkySystem>");
-         switch(coord.pos.shape)
+         xml.append("<SkySystem>"+pos.system+"</SkySystem>");
+         switch(pos.shape)
          {
             case CIRCLE:
-               xml.append("<l>" + String.valueOf(coord.pos.circle.lon) + "</l>");
-               xml.append("<b>" + String.valueOf(coord.pos.circle.lat) + "</b>");
-               xml.append("<r>" + String.valueOf(coord.pos.circle.radius)+"</r>"); break;
+               xml.append("<l>" + String.valueOf(pos.circle.lon) + "</l>");
+               xml.append("<b>" + String.valueOf(pos.circle.lat) + "</b>");
+               xml.append("<r>" + String.valueOf(pos.circle.radius)+"</r>");
+               break;
             case RANGE:
-               xml.append("<l>" + String.valueOf((coord.pos.range.lon1 + coord.pos.range.lon2)/2.0) + "</l>");
-               xml.append("<b>" + String.valueOf((coord.pos.range.lat1 + coord.pos.range.lat2)/2.0) + "</b>");
-               xml.append("<dl>" + String.valueOf(coord.pos.range.lon2 - coord.pos.range.lon1) + "</dl>");
-               xml.append("<db>" + String.valueOf(coord.pos.range.lat2 - coord.pos.range.lat1) + "</db>");
+               xml.append("<l>" + String.valueOf((pos.range.lon1 + pos.range.lon2)/2.0) + "</l>");
+               xml.append("<b>" + String.valueOf((pos.range.lat1 + pos.range.lat2)/2.0) + "</b>");
+               xml.append("<dl>" + String.valueOf(pos.range.lon2 - pos.range.lon1) + "</dl>");
+               xml.append("<db>" + String.valueOf(pos.range.lat2 - pos.range.lat1) + "</db>");
                break;
             default: // POLYGON was not used in VLKB-legacy -> let it fail with error
-               xml.append("<shape> unknown shape: " + coord.pos.shape + " </shape>");
+               xml.append("<shape> unknown shape: " + pos.shape + " </shape>");
          }
       }
+      return xml.toString();
+   }
 
-      if(coord.band != null)
+   private static String serialize(Band band)
+   {
+      StringBuilder xml = new StringBuilder();
+      if(band != null)
       {
-         xml.append("<vl>"   + String.valueOf(coord.band.getMin())  +"</vl>");
-         xml.append("<vu>"   + String.valueOf(coord.band.getMax())   +"</vu>");
-         xml.append("<vtype>"+ coord.band.system                 +"</vtype>");
+         xml.append("<vl>"   + String.valueOf(band.getMin())  +"</vl>");
+         xml.append("<vu>"   + String.valueOf(band.getMax())   +"</vu>");
+         xml.append("<vtype>"+ band.system                 +"</vtype>");
       }
 
       return xml.toString();
diff --git a/data-discovery/src/main/java/search/DbPSearch.java b/data-discovery/src/main/java/search/DbPSearch.java
index 6eeecbb42f00394f25ee885329b5f61b531a3139..d4d066d1f8a26b4f77fe45d78109eb858145041a 100644
--- a/data-discovery/src/main/java/search/DbPSearch.java
+++ b/data-discovery/src/main/java/search/DbPSearch.java
@@ -163,14 +163,14 @@ public class DbPSearch
 
 
 
-   public FormatResponseFilter.ObsCore[] queryOutputData(String[] pubdidArr, Coord coord)
+   public FormatResponseFilter.ObsCore[] queryOutputData(String[] pubdidArr, Pos pos)
    {
       LOGGER.info("");
 
       String commaSepPubdids  = String.join("\',\'", pubdidArr);
 
-      String inputRegion = toPgSphereSqlTypeString(coord.pos);
-      String dbRegion    = toRegionColumnName(coord.pos.system);
+      String inputRegion = toPgSphereSqlTypeString(pos);
+      String dbRegion    = toRegionColumnName(pos.system);
 
       String theQuery ="SELECT *," 
          + inputRegion + " <@ " + dbRegion + " AS inputInsideDb, " 
diff --git a/data-discovery/src/main/java/webapi/FormatResponseFilter.java b/data-discovery/src/main/java/webapi/FormatResponseFilter.java
index 89912a0adb551054238710d08c29aa1f07944082..d5adcd81a6737526d70e6e6468be1d08881dacc0 100644
--- a/data-discovery/src/main/java/webapi/FormatResponseFilter.java
+++ b/data-discovery/src/main/java/webapi/FormatResponseFilter.java
@@ -101,30 +101,26 @@ public class FormatResponseFilter implements Filter
       {
          PrintWriter responseWriter = ((HttpServletResponse)response).getWriter();
 
+         // VLKB: reconstruct cutout/merge queryStrings and overlap code
          Map<String, String[]> params = request.getParameterMap();
-//         Coord       coord            = new Coord(params);
-         SubsurveyId subsurveyId      = new SubsurveyId(params);
-         // FIXME add invalid param excpetions -> params already parsed in servlet
-
-         Coord coord = new Coord();
-         coord.pos  = Pos.parsePos(params, DEFAULT_SKY_SYSTEM);
-         coord.band = Band.parseBand(params, DEFAULT_SPEC_SYSTEM);
-         coord.time = Time.parseTime(params, DEFAULT_TIME_SYSTEM);
-         coord.pol  = Pol.parsePol(params);
+         SubsurveyId subsurveyId = new SubsurveyId(params);
+         Pos  pos  = Pos.parsePos(params, DEFAULT_SKY_SYSTEM);
+         Band band = Band.parseBand(params, DEFAULT_SPEC_SYSTEM);
+         String queryStringBase = toQueryString(pos, band);
 
          ObsCore[] obsCoreArr = queryObsCore(pubdidArr,
-               coord); // VLKB: calc overlap-code for sky
+               pos); // VLKB: calc overlap-code for sky
 
          Dataset[] datasetArr = convert(obsCoreArr,
-               coord, // VLKB: calc overlap-code for velocity
+               band, // VLKB: calc overlap-code for velocity
                settings.serviceUrls.cutoutUrl(),
-               toQueryString(coord));
+               queryStringBase);
 
          SearchOutputData searchOutputData = SearchOutputData.marshall(datasetArr,
                subsurveyId,
                dbSubsurveyArr,
                settings.serviceUrls.mergeUrl(),
-               toQueryString(coord));
+               queryStringBase);
 
          String respFormat;
          String respFormatReq[] = params.get("RESPONSEFORMAT");
@@ -146,7 +142,7 @@ public class FormatResponseFilter implements Filter
             response.setContentType("application/xml");
             boolean showDuration = true;
             XmlSerializer.serializeToLegacyResults(responseWriter, RESPONSE_ENCODING,
-                  responseWrapper.auth, coord, subsurveyId, // <inputs/>
+                  responseWrapper.auth, pos, band, subsurveyId, // <inputs/>
                   searchOutputData,
                   showDuration,startTime_msec);
          }
@@ -241,7 +237,7 @@ public class FormatResponseFilter implements Filter
 
 
 
-   private FormatResponseFilter.ObsCore[] queryObsCore(String[] pubdidArr, Coord coord)//, String fitsRemotePath)
+   private FormatResponseFilter.ObsCore[] queryObsCore(String[] pubdidArr, Pos pos)//, String fitsRemotePath)
    {
       LOGGER.info("trace");
 
@@ -251,7 +247,7 @@ public class FormatResponseFilter implements Filter
          dbps = new DbPSearch(settings.dbConn);
       }
 
-      return dbps.queryOutputData(pubdidArr, coord);
+      return dbps.queryOutputData(pubdidArr, pos);
       //FormatResponseFilter.ObsCore[] obsCoreArr = dbps.queryOutputData(pubdidArr, coord);
       //return convert(obsCoreArr, coord, fitsRemotePath);
    }
@@ -260,7 +256,7 @@ public class FormatResponseFilter implements Filter
 
 
 
-   private Dataset[] convert(FormatResponseFilter.ObsCore[] obsCoreArr, Coord coord,
+   private Dataset[] convert(FormatResponseFilter.ObsCore[] obsCoreArr, Band band,
          String cutoutUrlRoot, String cutoutQueryString)
    {
       List<Dataset> datasetList  = new ArrayList<Dataset>();
@@ -273,13 +269,13 @@ public class FormatResponseFilter implements Filter
 
          dataset.subsurvey_id   = obsCore.obs_collection;
          dataset.overlapCodeSky = convertToOverlapCodeSky(obsCore.inputInsideDb, obsCore.dbInsideInput);
-         dataset.overlapCodeVel = convertToOverlapCodeVel(coord,obsCore.em_valid,obsCore.em_min,obsCore.em_max);
+         dataset.overlapCodeVel = convertToOverlapCodeVel(band,obsCore.em_valid,obsCore.em_min,obsCore.em_max);
          dataset.overlapCode    = convertToOverlapCode(dataset.overlapCodeSky, dataset.overlapCodeVel);
          dataset.dataType       = obsCore.dataproduct_type;
          dataset.publisherDid   = obsCore.obs_publisher_did;
 
          dataset.access.accessFileUrl   = obsCore.access_url;
-         dataset.access.accessCutoutUrl = cutoutUrlRoot + "?" + cutoutQueryString + dataset.publisherDid;
+         dataset.access.accessCutoutUrl = cutoutUrlRoot + "?" + cutoutQueryString + "&ID=" + dataset.publisherDid;
          dataset.access.accessMosaicUrl  = null;
 
          dataset.vertices_deg = convertToVertices(obsCore.vertices_str);
@@ -300,20 +296,20 @@ public class FormatResponseFilter implements Filter
    }
 
 
-   private int convertToOverlapCodeVel(Coord coord, boolean v_valid, double v_min, double v_max)
+   private int convertToOverlapCodeVel(Band band, boolean v_valid, double v_min, double v_max)
    {
-      if((coord.band != null) && v_valid)
+      if((band != null) && v_valid)
       {
-         if(coord.band.system == Band.System.VELO_LSRK)
+         if(band.system == Band.System.VELO_LSRK)
          {
             // FIXME assert coord: vel_min <= vel_max
             // FIXME assert cube:  v_min   <= v_max
 
-            boolean dbInInp = (coord.band.getMin() <= v_min) && (v_min <= coord.band.getMax())
-               && (coord.band.getMin() <= v_max) && (v_max <= coord.band.getMax());
+            boolean dbInInp = (band.getMin() <= v_min) && (v_min <= band.getMax())
+               && (band.getMin() <= v_max) && (v_max <= band.getMax());
 
-            boolean inpInDb = (v_min <= coord.band.getMin()) && (coord.band.getMin() <= v_max)
-               && (v_min <= coord.band.getMax() ) && (coord.band.getMax() <= v_max);
+            boolean inpInDb = (v_min <= band.getMin()) && (band.getMin() <= v_max)
+               && (v_min <= band.getMax() ) && (band.getMax() <= v_max);
 
             return convertToOverlapCodeSky(inpInDb, dbInInp);
 
@@ -361,40 +357,40 @@ public class FormatResponseFilter implements Filter
 
 
 
-      // generate cutout/merge queryStrings
-   private String toQueryString(Coord coord)
+   // generate cutout/merge queryStrings
+   private String toQueryString(Pos pos, Band band)
    {
       LOGGER.info("trace");
 
       StringBuilder sb = new StringBuilder();
 
-      //sb.append("POSSYS=" + coord.pos.system.toString());
-      switch(coord.pos.shape)
+      if(pos!=null)
       {
-         case CIRCLE:
-            sb.append("POS=" + coord.pos.circle.toString());
-            break;
+         switch(pos.shape)
+         {
+            case CIRCLE:
+               sb.append("POS=" + pos.circle.toString());
+               break;
 
-         case RANGE:
-            sb.append("POS=" + coord.pos.range.toString());
-            break;
+            case RANGE:
+               sb.append("POS=" + pos.range.toString());
+               break;
 
-         case POLYGON:
-            sb.append("POS=" + coord.pos.polygon.toString());
-            break;
+            case POLYGON:
+               sb.append("POS=" + pos.polygon.toString());
+               break;
 
-         default:
-            LOGGER.info("Coord::toQueryString: unknown shape: " + coord.pos.shape.toString());
+            default:
+               LOGGER.info("Coord::toQueryString: unknown shape: " + pos.shape.toString());
+         }
       }
+      sb.append("&POSSYS=" + pos.system.toString());
 
-      if(coord.band != null)
+      if(band != null)
       {
-         sb.append("&" + coord.band.toString());
-         //sb.append("&BANDSYS=" + coord.band.system.toString() );
+         sb.append("&" + band.toString());
       }
 
-      sb.append("&ID="); // FIXME id-value will be added in FormatResponseFilter
-
       return sb.toString();
    }