diff --git a/data-discovery/src/main/java/vlkb/output/XmlSerializer.java b/data-discovery/src/main/java/vlkb/output/XmlSerializer.java
index eea0ac48514f7f84c1d318e4a2e48276a234688f..ee3c2cde5ba5c28f7ec69bf39bef700dcc1f15fc 100644
--- a/data-discovery/src/main/java/vlkb/output/XmlSerializer.java
+++ b/data-discovery/src/main/java/vlkb/output/XmlSerializer.java
@@ -172,25 +172,25 @@ final class XmlSerializer
          xml.append("<SkySystem>"+coord.pos.system+"</SkySystem>");
          switch(coord.pos.shape)
          {
-            case "CIRCLE" :
-               xml.append("<l>"+coord.pos.circle.lon+"</l>");
-               xml.append("<b>"+coord.pos.circle.lat+"</b>");
-               xml.append("<r>"+String.valueOf(coord.pos.circle.radius)+"</r>"); break;
-            case "RECT"   :
-               xml.append("<l>"+(coord.pos.range.lon1+ coord.pos.range.lon2)/2.0 + "</l>");
-               xml.append("<b>"+(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>");
+            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;
+            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>");
                break;
-            default:
-               xml.append("<shape> unknown shape: "+ coord.pos.shape +" </shape>");
+            default: // POLYGON was not used in VLKB-legacy -> let it fail with error
+               xml.append("<shape> unknown shape: " + coord.pos.shape + " </shape>");
          }
       }
 
       if(coord.band != null)
       {
-         xml.append("<vl>"   + String.valueOf(coord.band.wavelength[0])  +"</vl>");
-         xml.append("<vu>"   + String.valueOf(coord.band.wavelength[1])   +"</vu>");
+         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>");
       }
 
diff --git a/data-discovery/src/main/java/vlkb/search/DbPSearch.java b/data-discovery/src/main/java/vlkb/search/DbPSearch.java
index 3aaab5ef577c9cac401d208ba6c3ee1df2f96552..8c72fb9cb5f424e31ec1b8b0fe7ddf8c4bdf0044 100644
--- a/data-discovery/src/main/java/vlkb/search/DbPSearch.java
+++ b/data-discovery/src/main/java/vlkb/search/DbPSearch.java
@@ -48,8 +48,8 @@ public class DbPSearch
       if(vel_valid)
       {
          String vel_no_overlap
-            = "((em_min > " + Double.toString(coord.band.wavelength[1])
-            + ") OR (em_max < " + Double.toString(coord.band.wavelength[0]) + "))";
+            = "((em_min > " + Double.toString(coord.band.getMax())
+            + ") OR (em_max < " + Double.toString(coord.band.getMin()) + "))";
 
          theQuery += " AND ( (NOT " + vel_no_overlap + ") OR (em_min is null) OR (em_max is null))";
          /* NOTE '... OR (em_min is null)' statement causes to include 2D datasets if they overlap in sky
@@ -217,48 +217,49 @@ public class DbPSearch
 
       String inputRegion = null;
 
-      String shape = pos.shape;
-
-      if(shape.equals("CIRCLE"))
-      {
-         lon = pos.circle.lon;
-         lat = pos.circle.lat;
-         radius = pos.circle.radius;
-         inputRegion = "scircle '<(" + Double.toString(lon) + "d," + Double.toString(lat) + "d),"
-            + Double.toString(radius) + "d>'";
-      }
-      else if (shape.equals("RECT"))
-      {
-         lon =  (pos.range.lon1 + pos.range.lon2)/2.0;
-         lat =  (pos.range.lat1 + pos.range.lat2)/2.0;
-         dlon = (pos.range.lon2 - pos.range.lon1)/2.0;
-         dlat = (pos.range.lat2 - pos.range.lat1)/2.0;
-
-         /* South-West and North-East corners of a box */
-         String sw_lon = Double.toString(lon - dlon/2.0);
-         String sw_lat = Double.toString(lat - dlat/2.0);
-         String ne_lon = Double.toString(lon + dlon/2.0);
-         String ne_lat = Double.toString(lat + dlat/2.0);
-
-         inputRegion = "sbox '( ("+ sw_lon + "d, " + sw_lat + "d), (" + ne_lon +"d, " + ne_lat + "d) )'";
-      }
-      else if (shape.equals("POLYGON"))
+      switch(pos.shape)
       {
-         // FIXME redefine Polygon as point-array:
-         assert(pos.polygon.lon.length == pos.polygon.lat.length);
+         case CIRCLE:
+            lon = pos.circle.lon;
+            lat = pos.circle.lat;
+            radius = pos.circle.radius;
+            inputRegion = "scircle '<(" + Double.toString(lon) + "d," + Double.toString(lat) + "d),"
+               + Double.toString(radius) + "d>'";
+            break;
 
-         // Polygon has at least 3 points
-         inputRegion = "spoly '( (" + pos.polygon.lon[0] + "d, " + pos.polygon.lat[0] + "d),";
-         for(int ii=1; ii < pos.polygon.lon.length; ii++)
-         {
-            inputRegion += ", (" + pos.polygon.lon[ii] + "d, " + pos.polygon.lat[ii] + "d)";
-         }
-         inputRegion += " )'";
-      }
-      else
-      {
-         throw new IllegalArgumentException("Coord::shape was: " + shape + " but valid is CIRCLE or RECT");
+         case RANGE:
+            lon =  (pos.range.lon1 + pos.range.lon2)/2.0;
+            lat =  (pos.range.lat1 + pos.range.lat2)/2.0;
+            dlon = (pos.range.lon2 - pos.range.lon1)/2.0;
+            dlat = (pos.range.lat2 - pos.range.lat1)/2.0;
+
+            /* South-West and North-East corners of a box */
+            String sw_lon = Double.toString(lon - dlon/2.0);
+            String sw_lat = Double.toString(lat - dlat/2.0);
+            String ne_lon = Double.toString(lon + dlon/2.0);
+            String ne_lat = Double.toString(lat + dlat/2.0);
+
+            inputRegion = "sbox '( ("+ sw_lon + "d, " + sw_lat + "d), (" + ne_lon +"d, " + ne_lat + "d) )'";
+            break;
+
+         case POLYGON:
+            // FIXME redefine Polygon as point-array:
+            assert(pos.polygon.lon.length == pos.polygon.lat.length);
+
+            // Polygon has at least 3 points
+            inputRegion = "spoly '( (" + pos.polygon.lon[0] + "d, " + pos.polygon.lat[0] + "d),";
+            for(int ii=1; ii < pos.polygon.lon.length; ii++)
+            {
+               inputRegion += ", (" + pos.polygon.lon[ii] + "d, " + pos.polygon.lat[ii] + "d)";
+            }
+            inputRegion += " )'";
+            break;
+
+         default:
+            throw new IllegalArgumentException("Coord::shape was: " + pos.shape.toString()
+                  + " but valid is CIRCLE or RANGE or POLYGON");
       }
+
       return inputRegion;
    }
 
diff --git a/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java b/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java
index 53eee4a3e4a5679b2d8c46a45fdc4afad1190a76..4294cc02f9097381d186c5bc645850737b8b1b90 100644
--- a/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java
+++ b/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java
@@ -303,11 +303,11 @@ public class FormatResponseFilter implements Filter
             // FIXME assert coord: vel_min <= vel_max
             // FIXME assert cube:  v_min   <= v_max
 
-            boolean dbInInp = (coord.band.wavelength[0] <= v_min) && (v_min <= coord.band.wavelength[1])
-               && (coord.band.wavelength[0] <= v_max) && (v_max <= coord.band.wavelength[1]);
+            boolean dbInInp = (coord.band.getMin() <= v_min) && (v_min <= coord.band.getMax())
+               && (coord.band.getMin() <= v_max) && (v_max <= coord.band.getMax());
 
-            boolean inpInDb = (v_min <= coord.band.wavelength[0]) && (coord.band.wavelength[0] <= v_max)
-               && (v_min <= coord.band.wavelength[1] ) && (coord.band.wavelength[1] <= v_max);
+            boolean inpInDb = (v_min <= coord.band.getMin()) && (coord.band.getMin() <= v_max)
+               && (v_min <= coord.band.getMax() ) && (coord.band.getMax() <= v_max);
 
             return convertToOverlapCodeSky(inpInDb, dbInInp);
 
@@ -362,35 +362,29 @@ public class FormatResponseFilter implements Filter
 
       StringBuilder sb = new StringBuilder();
 
-      sb.append("skysystem=" + coord.pos.system);
-
+      sb.append("POSSYS=" + coord.pos.system.toString());
       switch(coord.pos.shape)
       {
-         case "CIRCLE" :
-            sb.append("&POS=CIRCLE "  + coord.pos.circle.lon
-                  + " " + coord.pos.circle.lat + " " + coord.pos.circle.radius);
+         case CIRCLE:
+            sb.append("&POS=" + coord.pos.circle.toString());
             break;
 
-         case "RECT" :
-            if(coord.band != null)
-               sb.append("&POS=RANGE="
-                     + " " + coord.pos.range.lon1 + " " + coord.pos.range.lon2
-                     + " " + coord.pos.range.lat1 + " " + coord.pos.range.lat2
-                     + " " + coord.band.wavelength[0]  + " " + coord.band.wavelength[1]);
-            else
-               sb.append("&POS=RANGE="
-                     + " " + coord.pos.range.lon1 + " " + coord.pos.range.lon2
-                     + " " + coord.pos.range.lat1 + " " + coord.pos.range.lat2);
+         case RANGE:
+            sb.append("&POS=" + coord.pos.range.toString());
+            break;
+
+         case POLYGON:
+            sb.append("&POS=" + coord.pos.polygon.toString());
             break;
 
          default:
-            LOGGER.info("Coord::toVoQueryString: unknown shape: " + coord.pos.shape);
+            LOGGER.info("Coord::toQueryString: unknown shape: " + coord.pos.shape.toString());
       }
 
       if(coord.band != null)
       {
-         sb.append("&BAND= " + coord.band.wavelength[0] + " " + coord.band.wavelength[1]);
-         sb.append("&specsystem=" + coord.band.system );
+         sb.append("&" + coord.band.toString());
+         sb.append("&BANDSYS=" + coord.band.system.toString() );
       }
 
       sb.append("&ID="); // FIXME id-value will be added in FormatResponseFilter
diff --git a/java-libs/lib/vlkb-volib-0.9-SNAPSHOT.jar b/java-libs/lib/vlkb-volib-0.9-SNAPSHOT.jar
index 9ba5160584a847c38f4cae9a2732f69845e30032..edd31c5773f5ab0d4a04df802e5dbbf951bc0218 100644
Binary files a/java-libs/lib/vlkb-volib-0.9-SNAPSHOT.jar and b/java-libs/lib/vlkb-volib-0.9-SNAPSHOT.jar differ