diff --git a/data-access/servlet/Makefile b/data-access/servlet/Makefile
index 9bf61a92e47411e9ebf168e9c9c7cb0861c0a31f..a803aa9632e07ac35ce1c0b4003338fa261bc3f3 100644
--- a/data-access/servlet/Makefile
+++ b/data-access/servlet/Makefile
@@ -17,6 +17,8 @@ AUTHFILTERS  = $(wildcard $(AUTH_DIR)/src/main/java/*Filter.java) $(AUTH_DIR)/sr
 FILTERS  = $(wildcard src/main/java/webapi/*Filter.java)
 FILTERS  += $(wildcard src/main/java/authz/*Filter.java)
 SERVLETS = $(wildcard src/main/java/webapi/Servlet*.java)
+UWS = $(wildcard src/main/java/webapi/UWSMCutout.java)
+UWS += $(wildcard src/main/java/webapi/UWSMerge.java)
 #SERVLETS = $(wildcard src/main/java/webapi/*Servlet.java)
 #===============================================================================
 JFLAGS = -g
@@ -26,7 +28,7 @@ CLASSPATH = $(LIB_DIR)/*
 .PHONY: build
 build:
 	echo "class Version { static String asString = \"$(VERSION)\";}" > src/main/java/Version.java
-	javac $(JFLAGS) -cp :$(CLASSPATH) -sourcepath $(SRC_DIR) -d $(CLASS_DIR) $(SERVLETS) $(FILTERS) $(AUTHFILTERS) $(VOSI)
+	javac $(JFLAGS) -cp :$(CLASSPATH) -sourcepath $(SRC_DIR) -d $(CLASS_DIR) $(SERVLETS) $(FILTERS) $(AUTHFILTERS) $(VOSI) $(UWS)
 
 .PHONY: clean
 clean : 
diff --git a/data-access/servlet/src/main/java/cutout/DatasetsImpl.java b/data-access/servlet/src/main/java/cutout/DatasetsImpl.java
index c00c675362c3356a7d1b98fd232963eb9f7873ef..45de1df526f38e7a88ba4357f2123825e08f3d21 100644
--- a/data-access/servlet/src/main/java/cutout/DatasetsImpl.java
+++ b/data-access/servlet/src/main/java/cutout/DatasetsImpl.java
@@ -154,10 +154,11 @@ class DatasetsImpl implements Datasets
          String publisherDid, Coord coord,
          boolean countNullValues)
    {
-      ResolverByObsCore rsl = new ResolverByObsCore(settings.dbConn, subsurveys);
+     // ResolverByObsCore rsl = new ResolverByObsCore(settings.dbConn, subsurveys);
+      Resolver rsl = new ResolverFromId();//settings.dbConn, subsurveys);
       rsl.resolve(publisherDid);
 
-      FitsCard[] extraCards = Subsurvey.subsurveysFindCards(subsurveys, rsl.obsCollection());//rsl.subsurveyId);
+      FitsCard[] extraCards = null;//Subsurvey.subsurveysFindCards(subsurveys, rsl.obsCollection());//rsl.subsurveyId);
       String absSubimgPathname = settings.fitsPaths.cutouts() + "/" + generateSubimgPathname(rsl.relPathname(), rsl.hdunum());
       LOGGER.info("absSubimgPathname: " + absSubimgPathname);
 
diff --git a/data-access/servlet/src/main/java/cutout/json/JdlMCutout.java b/data-access/servlet/src/main/java/cutout/json/JdlMCutout.java
index 5791ca4ab181a3129b116d63399a1c721bf700ea..432910febe1e8f796ed4e8abb9d7470ddc33405c 100644
--- a/data-access/servlet/src/main/java/cutout/json/JdlMCutout.java
+++ b/data-access/servlet/src/main/java/cutout/json/JdlMCutout.java
@@ -32,10 +32,11 @@ public class JdlMCutout
 
             FitsCard[] extraCards = null;
 
-            ResolverByObsCore rsl = new ResolverByObsCore(settings.dbConn, subsurveys);
+            Resolver rsl = new ResolverFromId();//settings.dbConn, subsurveys);
+            //ResolverByObsCore rsl = new ResolverByObsCore(settings.dbConn, subsurveys);
             rsl.resolve(publisherDid);
 
-            extraCards = Subsurvey.subsurveysFindCards(subsurveys, rsl.obsCollection());//subsurveyId);
+            extraCards = null;// Subsurvey.subsurveysFindCards(subsurveys, rsl.obsCollection());//subsurveyId);
 
             /* add resolved info to json */
 
diff --git a/data-access/servlet/src/main/java/webapi/ServletMCutout.java b/data-access/servlet/src/main/java/webapi/ServletMCutout.java
index db6133e8176f502e87f0db2245b2f5e905d3f13c..3afae6d0067fb9ccda3b8d7114b45cffbed26696 100644
--- a/data-access/servlet/src/main/java/webapi/ServletMCutout.java
+++ b/data-access/servlet/src/main/java/webapi/ServletMCutout.java
@@ -96,8 +96,8 @@ public class ServletMCutout extends javax.servlet.http.HttpServlet
 
          OutputStream respOutputStream = response.getOutputStream();
 
-         MCutResult mCutRes = datasets.doMCutout(reqJsonString);
-         DataLink dlk = new DataLink(mCutRes);
+         MCutResult result = datasets.doMCutout(reqJsonString);
+       //  DataLink dlk = new DataLink(mCutRes);
 
          final String contentType = "text/xml"; // FIXME
          final String respEncoding = "utf-8"; // FIXME
@@ -105,7 +105,19 @@ public class ServletMCutout extends javax.servlet.http.HttpServlet
          {
             //LOGGER.info("writing xml");
             PrintWriter writer = new PrintWriter(new OutputStreamWriter(respOutputStream, respEncoding));
-            XmlSerializer.serializeToLegacyCutResults(writer, respEncoding, dlk, showDuration, startTime_msec);
+         // XmlSerializer.serializeToLegacyCutResults(writer, respEncoding, dlk, showDuration, startTime_msec);
+
+
+            String accessUrl = convertLocalPathnameToRemoteUrl(result.fileName,
+                  settings.fitsPaths.cutouts(),
+                  settings.fitsPaths.cutoutsUrl());
+
+            XmlSerializer.serializeToLegacyCutResult(writer, respEncoding,
+                  result, accessUrl,
+                  //id, pos, band, time, pol, pixels, countNullValues,
+                  showDuration, startTime_msec);
+
+
             writer.close();
          }
          else if(contentType.equals("application/tar.gz")) // FIXME mime for tgz ?
@@ -133,5 +145,17 @@ public class ServletMCutout extends javax.servlet.http.HttpServlet
       }
    }
 
+  private String convertLocalPathnameToRemoteUrl(String localPathname,
+         String FITScutpath, String FITSRemoteUrlCutouts)
+   {   
+      LOGGER.info("trace " + localPathname);
+      String fileName = localPathname.replaceAll(FITScutpath + "/", "");
+      LOGGER.info("local filename: " + fileName);
+      String remotefname = FITSRemoteUrlCutouts + "/" + fileName;
+      LOGGER.info("remote url    : " + remotefname);
+      return remotefname;
+   }   
+
+
 }
 
diff --git a/data-access/servlet/src/main/java/webapi/UWSMCutoutWork.java b/data-access/servlet/src/main/java/webapi/UWSMCutoutWork.java
index 393b81f5e8aae78b0f0ebb5af2a4af8206202e68..14d64c257802ff79bcd90fddd3e2565348a8acfc 100644
--- a/data-access/servlet/src/main/java/webapi/UWSMCutoutWork.java
+++ b/data-access/servlet/src/main/java/webapi/UWSMCutoutWork.java
@@ -35,7 +35,7 @@ import org.json.simple.parser.ParseException;
 
 public class UWSMCutoutWork extends JobThread
 {
-   final String RESP_ENCODING = "utf-8";
+   final String RESPONSE_ENCODING = "utf-8";
 
    private Settings settings = UWSMCutout.settings;
 
@@ -83,13 +83,24 @@ public class UWSMCutoutWork extends JobThread
 
             /* SODA -> Implementation */
 
-            MCutResult mCutResults = datasets.doMCutout(reqJsonString);
-            DataLink dlk = new DataLink(mCutResults);
+            MCutResult mresult = datasets.doMCutout(reqJsonString);
+        //DataLink dlk = new DataLink(mCutResults);
 
             /* Implement -> SODA */
 
-            PrintWriter writer = new PrintWriter(new OutputStreamWriter(respOutputStream, RESP_ENCODING));
-            XmlSerializer.serializeToLegacyCutResults(writer, RESP_ENCODING, dlk, showDuration, startTime_msec);
+            PrintWriter writer = new PrintWriter(new OutputStreamWriter(respOutputStream, RESPONSE_ENCODING));
+
+        //XmlSerializer.serializeToLegacyCutResults(writer, RESPONSE_ENCODING, dlk, showDuration, startTime_msec);
+
+            String accessUrl = convertLocalPathnameToRemoteUrl(mresult.fileName,
+                  settings.fitsPaths.cutouts(),
+                  settings.fitsPaths.cutoutsUrl());
+
+            XmlSerializer.serializeToLegacyCutResult(writer, RESPONSE_ENCODING,
+                  mresult, accessUrl,
+                  //id, pos, band, time, pol, pixels, countNullValues,
+                  showDuration, startTime_msec);
+
             writer.close();
 
             /* SODA -> UWS */
@@ -109,4 +120,16 @@ public class UWSMCutoutWork extends JobThread
       }
    }
 
+  private String convertLocalPathnameToRemoteUrl(String localPathname,
+         String FITScutpath, String FITSRemoteUrlCutouts)
+   {
+      //LOGGER.info("trace " + localPathname);
+      String fileName = localPathname.replaceAll(FITScutpath + "/", "");
+      //LOGGER.info("local filename: " + fileName);
+      String remotefname = FITSRemoteUrlCutouts + "/" + fileName;
+      //LOGGER.info("remote url    : " + remotefname);
+      return remotefname;
+   }
+
+
 }
diff --git a/data-access/servlet/src/main/java/webapi/UWSMergeWork.java b/data-access/servlet/src/main/java/webapi/UWSMergeWork.java
index a6e75ce1216d9402f1b79c49b25746f2e2838f6c..32d1e41c0607583868499efa062043fda2aabc19 100644
--- a/data-access/servlet/src/main/java/webapi/UWSMergeWork.java
+++ b/data-access/servlet/src/main/java/webapi/UWSMergeWork.java
@@ -23,6 +23,8 @@ import java.util.Set;
 import java.util.List;
 import java.util.ArrayList;
 
+import vo.parameter.*;
+
 public class UWSMergeWork extends JobThread
 {
    private Settings settings = UWSMerge.settings;
@@ -31,7 +33,7 @@ public class UWSMergeWork extends JobThread
    final String DEFAULT_RESPONSEFORMAT = settings.defaults.responseFormat;
    final String DEFAULT_SKY_SYSTEM     = settings.defaults.skySystem;
    final String DEFAULT_SPEC_SYSTEM    = settings.defaults.specSystem;
-
+   final String DEFAULT_TIME_SYSTEM = "MJD_UTC";
 
    Datasets datasets = new DatasetsImpl(settings);
 
@@ -56,32 +58,31 @@ public class UWSMergeWork extends JobThread
          long startTime_msec = System.currentTimeMillis();
          boolean showDuration = true;
 
-         Map<SodaParam, String[]> params = collectSodaParams(job);
-         SodaParser parser = new SodaParser(params);
-
-         String id   = null;
-         Pos    pos  = null;
-         Band   band = null;
-         Time   time = null;
-         Pol    pol  = null;
-         String pixels = null;
-
-         if(parser.sodaReq_hasSodaId())
-         {
-            id   = parser.sodaReq_getId();
-            pos  = parser.sodaReq_getPosCirclePolygon();
-            band = parser.sodaReq_getBand();
-            time = parser.sodaReq_getTime();
-            pol  = parser.sodaReq_getPol();
-         }
-         else
-         {
-            id   = parser.vlkbReq_getPubdid();
-            pos  = parser.vlkbReq_getCircleRect();
-            band = parser.vlkbReq_getVelocity();
-         }
-
-         Coord coord = new Coord(pos, band, time, pol);
+         Map<String, String[]> params = collectSodaParams(job);
+
+         String id   = SingleStringParam.parseSingleStringParam(params, "ID");
+         Pos    pos  = Pos.parsePos(params, DEFAULT_SKY_SYSTEM);
+         Band   band = Band.parseBand(params, DEFAULT_SPEC_SYSTEM);
+         Time   time = Time.parseTime(params, DEFAULT_TIME_SYSTEM);
+         Pol    pol  = Pol.parsePol(params);
+         String pixels = SingleStringParam.parseSingleStringParam(params, "PIXELS");
+
+         /*         if(parser.sodaReq_hasSodaId())
+                    {
+                    id   = parser.sodaReq_getId();
+                    pos  = parser.sodaReq_getPosCirclePolygon();
+                    band = parser.sodaReq_getBand();
+                    time = parser.sodaReq_getTime();
+                    pol  = parser.sodaReq_getPol();
+                    }
+                    else
+                    {
+                    id   = parser.vlkbReq_getPubdid();
+                    pos  = parser.vlkbReq_getCircleRect();
+                    band = parser.vlkbReq_getVelocity();
+                    }
+                    */
+         Coord coord = new Coord(pos, band, time, pol, pixels);
 
          CutResult cutResult  = datasets.doMerge(parseLegacyPubdidArr(id), coord, false);//countNullValues);
 
@@ -146,11 +147,11 @@ public class UWSMergeWork extends JobThread
    private String convertLocalPathnameToRemoteUrl(String localPathname,
          String FITScutpath, String FITSRemoteUrlCutouts)
    {
-      LOGGER.info("trace " + localPathname);
+      //LOGGER.info("trace " + localPathname);
       String fileName = localPathname.replaceAll(FITScutpath + "/", "");
-      LOGGER.info("local filename: " + fileName);
+      //LOGGER.info("local filename: " + fileName);
       String remotefname = FITSRemoteUrlCutouts + "/" + fileName;
-      LOGGER.info("remote url    : " + remotefname);
+      //LOGGER.info("remote url    : " + remotefname);
       return remotefname;
    }
 
@@ -170,12 +171,13 @@ public class UWSMergeWork extends JobThread
       return pubdidList.toArray(pubdidArr);
    }
 
-   private Map<SodaParam, String[]> collectSodaParams(UWSJob job)
+   private Map<String, String[]> collectSodaParams(UWSJob job)
    {
-      Map<SodaParam, String[]> params = new HashMap<SodaParam, String[]>();
-      for(SodaParam paramToken : SodaParam.values())
+      Map<String, String[]> params = new HashMap<String, String[]>();
+      String[] paraTokens = {"POS", "BAND", "TIME", "POL", "PIXELS"};
+      for(String paramToken : paraTokens)
       {
-         String[] paramValue = (String[])job.getAdditionalParameterValue(paramToken.toString());
+         String[] paramValue = (String[])job.getAdditionalParameterValue(paramToken);
          params.put(paramToken, paramValue);
       }
       return params;
diff --git a/data-access/servlet/src/main/java/webapi/output/XmlSerializer.java b/data-access/servlet/src/main/java/webapi/output/XmlSerializer.java
index f76d3081261554576fa53fc8cc03145979bdefcc..56447ae0f51e80b09830a075d9a77dfefd24468d 100644
--- a/data-access/servlet/src/main/java/webapi/output/XmlSerializer.java
+++ b/data-access/servlet/src/main/java/webapi/output/XmlSerializer.java
@@ -11,7 +11,7 @@ public final class XmlSerializer
    private XmlSerializer() {} // disables instatiation
 
 
-   public static void serializeToLegacyCutResults(PrintWriter writer, String charEncoding, DataLink dataLink,
+/*   public static void serializeToLegacyCutResults(PrintWriter writer, String charEncoding, DataLink dataLink,
          boolean showDuration, long startTime_msec)
    {
       LOGGER.info("trace");
@@ -40,7 +40,7 @@ public final class XmlSerializer
 
       writer.println("</results>");
   }
-
+*/
 
   public static void serializeToLegacyCutResult(PrintWriter writer, String charEncoding,
         CutResult cutResult, String accessUrl,
@@ -82,6 +82,60 @@ public final class XmlSerializer
   }
 
 
+  public static void serializeToLegacyCutResult(PrintWriter writer, String charEncoding,
+        MCutResult result, String accessUrl,
+        //String id, Pos pos, Band band, Time time, Pol pol, String pixels, boolean countNullValues,
+         boolean showDuration, long startTime_msec)
+  {
+     LOGGER.info("trace serialize for accessUrl: " + ((accessUrl==null)? "null":accessUrl));
+
+     writer.println("<?xml version=\"1.0\" encoding=\"" + charEncoding + "\" standalone=\"yes\"?>");
+     writer.println("<results>");
+     writer.println("<description> SODA mcutout </description>");
+
+     //Coord coord   = new Coord(pos, band, time, pol, pixels);// pixels-input
+     //Inputs inputs = new Inputs(id, null, false);//countNullValues);
+     //serialize(writer, inputs);
+
+     // pixels-output
+//     if(cutResult.pixels != null)
+//        writer.println("<CUT> " + result.pixels + " </CUT>");
+
+     if(accessUrl != null) 
+     {
+        writer.println("<URL> " + accessUrl + " </URL>");
+        writer.println("<cutoutSize> " + result.fileSize + " </cutoutSize>");
+     }
+
+
+     if(result.cutResArr != null)
+     {
+        writer.println("<URL_CONTENT> ");
+        for(MCutResult.Cut cut : result.cutResArr)
+        {
+           writer.println("<ITEM>");
+           writer.println("<INDEX> " + cut.index + " </INDEX>");
+           writer.println("<CONTENT_CODE> " + cut.contentType.toString() + " </CONTENT_CODE>");
+           writer.println("<CONTENT> " + cut.content + " </CONTENT>");
+           writer.println("</ITEM>");
+        }
+        writer.println("</URL_CONTENT>");
+     }
+
+     //     if(cutResult.nullValueCount != null)
+     //        writer.println(serialize(cutResult.nullValueCount ));
+
+     writer.println("<msg> " + Version.asString + " </msg>");
+
+     //     writer.println("<DatacubeCount> " + result.cuts.length  + " </DatacubeCount>");
+
+     if(showDuration)
+        writer.println("<duration unit=\"msec\">"+(System.currentTimeMillis() - startTime_msec)+"</duration>");
+
+     writer.println("</results>");
+  }
+
+
 
 
   public static String serialize(NullValueCount nullVals)