diff --git a/data-discovery/src/main/java/vlkb/output/XmlSerializer.java b/data-discovery/src/main/java/vlkb/output/XmlSerializer.java
index 105e99f646f013be1d224360474cea1c4b4d52dc..1ff787aa52a5611e29b001ff9de751e4979b6072 100644
--- a/data-discovery/src/main/java/vlkb/output/XmlSerializer.java
+++ b/data-discovery/src/main/java/vlkb/output/XmlSerializer.java
@@ -10,6 +10,25 @@ public final class XmlSerializer
 
    private XmlSerializer() {} // disables instatiation
 
+   public static void serializeToVoTable(PrintWriter writer, String charEncoding, SearchOutputData searchOutputData,
+         boolean showDuration, long startTime_msec)
+   {
+      writer.println("<?xml version=\"1.0\" encoding=\"" + charEncoding + "\" standalone=\"yes\"?>");
+      writer.println("<results>");
+      writer.println("<description> TBD: VOTable " + searchOutputData.description + " </description>");
+      serialize(writer, searchOutputData.inputs);
+      writer.println("<msg> " + searchOutputData.versionString + " </msg>");
+      writer.println("<DatacubeCount> " + searchOutputData.datacubeCount + " </DatacubeCount>");
+      for(Subsurvey subsurvey : searchOutputData.subsurveyArr)
+      {
+         serialize(writer, subsurvey);
+      }
+      if(showDuration)
+         writer.println("<duration unit=\"msec\">" + (System.currentTimeMillis() - startTime_msec) + "</duration>");
+      writer.println("</results>");
+   }
+
+
    public static void serializeToLegacyResults(PrintWriter writer, String charEncoding, SearchOutputData searchOutputData,
          boolean showDuration, long startTime_msec)
    {
diff --git a/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java b/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java
index 49e1955df5971147606c33ef087833112cde0031..20e75edf3ff94cee73980aa9b0b8d1e281063968 100644
--- a/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java
+++ b/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java
@@ -111,11 +111,27 @@ public class FormatResponseFilter implements Filter
                settings.serviceUrls.mergeUrl(),
                dbSubsurveyArr);
 
-         response.setContentType("application/xml");
          response.setCharacterEncoding(RESPONSE_ENCODING);
+         final String respFormat = settings.serviceUrls.responseFormat();
+         LOGGER.info("responseFormat: " + respFormat);
 
-         boolean showDuration = true;
-         XmlSerializer.serializeToLegacyResults(responseWriter, RESPONSE_ENCODING, searchOutputData,showDuration,startTime_msec);
+         if(respFormat.equals("application/vlkb+xml")) // FIXME hsould be application/x-vlkb+xml -> x- is for eXperimental a.k.a. not registered
+         {
+            response.setContentType("application/xml");
+            boolean showDuration = true;
+            XmlSerializer.serializeToLegacyResults(responseWriter, RESPONSE_ENCODING, searchOutputData,showDuration,startTime_msec);
+         }
+         else if(respFormat.equals("application/x-votable+xml"))
+         {
+            response.setContentType(respFormat);
+            boolean showDuration = false;
+            XmlSerializer.serializeToVoTable(responseWriter, RESPONSE_ENCODING, searchOutputData,showDuration,startTime_msec);
+         }
+         else
+         {
+            ; // FIXME throws wrong setting-file param: batter convert string to enum and throw 'unrecoginzed respFormat' then;
+              // here use switch with enums and switch-default: say error: 'unsupported respFromat' type
+         }
 
          responseWriter.close();
       }
diff --git a/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java b/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java
index 9e22cb5ab853ac6301ec81390761bf0793e012be..b2979bd80fd2faeaa50f33f915b352344f9279f4 100644
--- a/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java
+++ b/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java
@@ -36,19 +36,22 @@ class FormatResponseSettings
       private String cutoutUrl;
       private String mergeUrl;
       private String surveysAbsPathname;
+      private String respFormat;
 
       public boolean cutoutUrlIsSet() { return (cutoutUrl != null) && cutoutUrl.trim().isEmpty(); }
       public boolean mergeUrlIsSet()  { return (mergeUrl != null) && mergeUrl.trim().isEmpty(); }
       public boolean surveysAbsPathnameIsSet()
        { return (surveysAbsPathname != null) && surveysAbsPathname.trim().isEmpty(); }
+      public boolean responseFormatIsSet() { return (respFormat != null) && respFormat.trim().isEmpty(); }
 
       public String cutoutUrl() {return cutoutUrl;}
       public String mergeUrl()  {return mergeUrl;}
       public String surveysAbsPathname()  {return surveysAbsPathname;}
+      public String responseFormat()  {return respFormat;}
 
       public String toString()
       {
-         return cutoutUrl + "   "  + mergeUrl + "   " + surveysAbsPathname;
+         return cutoutUrl + "   "  + mergeUrl + "   " + surveysAbsPathname + "    " + respFormat;
       }
    }
 
@@ -114,6 +117,7 @@ class FormatResponseSettings
       serviceUrls.cutoutUrl = properties.getProperty("cutout_url","").strip();
       serviceUrls.mergeUrl  = properties.getProperty("merge_url","").strip();
       serviceUrls.surveysAbsPathname = properties.getProperty("surveys_metadata_abs_pathname","/srv/surveys/surveys_metadata.csv").strip();
+      serviceUrls.respFormat = properties.getProperty("response_format","application/x-votable+xml").strip();
       return serviceUrls;
    }