diff --git a/docker/Dockerfile.vlkb b/docker/Dockerfile.vlkb
new file mode 100644
index 0000000000000000000000000000000000000000..91d5150e6126bac47a470a110d9daea56cc94959
--- /dev/null
+++ b/docker/Dockerfile.vlkb
@@ -0,0 +1,68 @@
+FROM debian:bullseye-slim
+LABEL Description="vlkb tomcat9"
+
+WORKDIR /root
+ENV HOME /root
+
+
+RUN apt -y update \
+ && apt -y install sudo procps psmisc tree wget curl vim make build-essential checkinstall git \
+                   libcfitsio-dev libpqxx-dev librabbitmq-dev libcsv-dev gfortran \
+                   openjdk-17-jre-headless unzip \
+                   rabbitmq-server openjdk-17-jre openjdk-17-jdk tomcat9 tomcat9-admin \
+                   postgresql-client
+
+COPY ast_9.2.9-1_amd64.deb ./
+RUN dpkg -i /root/ast_9.2.9-1_amd64.deb && ldconfig \
+ && mkdir -p /webapps/vlkb-search && mkdir -p /webapps/vlkb-cutout && mkdir /config \
+ && mkdir -p /srv/surveys && mkdir -p /srv/cutouts
+
+ARG VLKB_VERSION
+
+COPY vlkb-${VLKB_VERSION}.deb vlkb-obscore-${VLKB_VERSION}.deb vlkbd-${VLKB_VERSION}.deb ./
+COPY vlkb-search-${VLKB_VERSION}.war /webapps/vlkb-search/
+COPY vlkb-cutout-${VLKB_VERSION}.war /webapps/vlkb-cutout/
+RUN dpkg -i vlkb-${VLKB_VERSION}.deb vlkb-obscore-${VLKB_VERSION}.deb vlkbd-${VLKB_VERSION}.deb \
+ && cd /webapps/vlkb-search && jar -xf vlkb-search-${VLKB_VERSION}.war \
+ && cd /webapps/vlkb-cutout && jar -xf vlkb-cutout-${VLKB_VERSION}.war
+ 
+COPY postgresql-*.jar  /var/lib/tomcat9/lib
+
+# Lines with postgresql_*.jar: provide DB-driver so Tomcat loads it
+# vlkb-search vlkb-cutout do not explicitely load DB-drivers
+
+
+
+# configure instance
+
+ENV INST_DIR=/usr/local
+
+COPY vlkbd_exec.sh ${INST_DIR}/bin
+
+RUN mkdir -p ${INST_DIR}/etc/vlkb-obscore \
+ && mkdir -p ${INST_DIR}/etc/vlkbd \
+ && echo "${INST_DIR}/lib" > /etc/ld.so.conf.d/ast.conf \
+ && ldconfig
+
+# configure during docker build-time
+
+COPY config-vlkb/vlkb-obscore.datasets.conf ${INST_DIR}/etc/vlkb-obscore/datasets.conf
+COPY config-vlkb/vlkbd.datasets.conf ${INST_DIR}/etc/vlkbd/datasets.conf
+
+# created in entrypoint.sh COPY config-vlkb/servlet.cutout.properties /webapps/vlkb-cutout/WEB-INF/classes/cutout.properties
+
+COPY config-vlkb/auth.properties config-vlkb/neatoken.properties config-vlkb/iamtoken.properties /webapps/vlkb-cutout/WEB-INF/classes/
+COPY config-vlkb/auth.properties config-vlkb/neatoken.properties config-vlkb/iamtoken.properties config-vlkb/formatresponsefilter.properties /webapps/vlkb-search/WEB-INF/classes/
+
+#COPY ssl/keystore.jks /root/
+COPY ssl/server.xml ssl/server-connector-8080.xml ssl/server-connector-8443.xml /etc/tomcat9/
+
+# configure during docker run-time
+
+COPY entrypoint.sh /root
+
+# run
+
+RUN pwd && chmod +x /root/entrypoint.sh
+CMD ["sh", "-c", "/root/entrypoint.sh"]
+
diff --git a/docker/Makefile b/docker/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..3f8f87798cca0290af7ff60daca293b028d91765
--- /dev/null
+++ b/docker/Makefile
@@ -0,0 +1,72 @@
+
+VERSION ?= $(shell git describe)
+
+
+all:
+
+
+download-all: vlkb-search vlkb-cutout vlkbd vlkb-obscore vlkb
+
+vlkb-search vlkb-cutout:
+	make download PACK_FILE=$@-$(VERSION).war
+
+vlkbd vlkb-obscore vlkb:
+	make download PACK_FILE=$@-$(VERSION).rpm
+	make download PACK_FILE=$@-$(VERSION).deb
+
+
+.PHONY: download
+download: GITLAB_PROJ_ID := 79
+download: GITLAB_PROJ_NAME := $(shell basename -s .git `git config --get remote.origin.url`)
+download: VER_MAJOR := $(shell echo $(VERSION) | cut -f1 -d.)
+download: VER_MINOR := $(shell echo $(VERSION) | cut -f2 -d.)
+download: PACK_URL := "https://ict.inaf.it/gitlab/api/v4/projects/$(GITLAB_PROJ_ID)/packages/generic/$(GITLAB_PROJ_NAME)/$(VER_MAJOR).$(VER_MINOR)/$(PACK_FILE)"
+download:
+	curl -O --header "PRIVATE-TOKEN: glpat-CJZDcks7bYqE__ePn4J6" $(PACK_URL)
+
+
+ast-9.2.9.tar.gz:
+	wget https://github.com/Starlink/ast/files/8843897/ast-9.2.9.tar.gz
+
+
+
+.PHONY: build
+build:
+	docker build --build-arg VLKB_VERSION=$(VERSION) -t soda -f Dockerfile.vlkb .
+
+# the docker-login below needed a ca-cert(?) which in the middle of the certificate-chain,
+# but was not automatically downloaded and also local cert/ket pair(?) ->
+# -> see: /etc/docker/certs.d/git.ia2.ianf.it:5050/*
+#
+# docker login git.ia2.inaf.it:5050 (robert.butora C-tol szokasos-hossu)
+# to download: use image: ... in compose.yaml or
+# docker run ... git.ia2.inaf.it:5050/vialactea/vlkb-soda
+
+publish-locally-soda:
+	docker tag soda git.ia2.inaf.it:5050/vialactea/vlkb-soda/soda:$(VERSION)
+	docker push     git.ia2.inaf.it:5050/vialactea/vlkb-soda/soda:$(VERSION)
+	docker image rm git.ia2.inaf.it:5050/vialactea/vlkb-soda/soda:$(VERSION)
+
+
+##docker login registry.gitlab.com --> robert.butora xC*n
+publish-remotely-to-ska:
+	docker tag soda registry.gitlab.com/ska-telescope/src/visivo-vlkb-soda:$(VERSION)
+	docker push     registry.gitlab.com/ska-telescope/src/visivo-vlkb-soda:$(VERSION)
+	docker image rm registry.gitlab.com/ska-telescope/src/visivo-vlkb-soda:$(VERSION)
+
+###############################################################################
+#TAG ?= $(VERSION)
+#REMOTE_SODA_IMAGE_NAME = registry.gitlab.com/ska-telescope/src/visivo-vlkb-soda:$(TAG)
+#SODA_IMAGE_NAME = soda:$(TAG)
+# https://gitlab.com/ska-telescope/src/visivo-vlkb-soda/container_registry/3917365
+###############################################################################
+#.PHONY: publish
+#publish:
+#	docker tag $(SODA_IMAGE_NAME) $(REMOTE_SODA_IMAGE_NAME)
+#	docker push $(REMOTE_SODA_IMAGE_NAME)
+#	docker image rm $(REMOTE_SODA_IMAGE_NAME)
+#	@echo "SODA_IMAGE_NAME        : "$(SODA_IMAGE_NAME)
+#	@echo "REMOTE_SODA_IMAGE_NAME : "$(REMOTE_SODA_IMAGE_NAME)
+###############################################################################
+
+
diff --git a/docker/ast-9.2.9.tar.gz b/docker/ast-9.2.9.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..240e419c4ba498499507a6c370244e989a375857
Binary files /dev/null and b/docker/ast-9.2.9.tar.gz differ
diff --git a/docker/ast_9.2.9-1_amd64.deb b/docker/ast_9.2.9-1_amd64.deb
new file mode 100644
index 0000000000000000000000000000000000000000..c9b2a9fa7d2c8a41bd3b24d91af96f23d8d4437d
Binary files /dev/null and b/docker/ast_9.2.9-1_amd64.deb differ
diff --git a/docker/compose-example-ska-soda.yaml b/docker/compose-example-ska-soda.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ddc66c740ff9a95a92cf955fa35e6af3af49097e
--- /dev/null
+++ b/docker/compose-example-ska-soda.yaml
@@ -0,0 +1,39 @@
+version: '3'
+
+services:
+
+  ska:
+    container_name: ska
+    #image: git.ia2.inaf.it:5050/butora/vlkb-datasets/soda:latest
+    image: registry.gitlab.com/ska-telescope/src/visivo-vlkb-soda:1.5.6
+    #image: soda:latest
+    ports:
+      - 18019:8080
+    environment:
+      - SECURITY=
+      - ACCESS_CONTEXT_ROOT=ska#datasets
+      #- RESPONSE_FORMAT=application/fits
+      #- RESPONSE_FORMAT=application/fits;createfile=yes
+    volumes:
+      - /srv/ska/surveys:/srv/surveys:z,ro
+      - /srv/ska/cutouts:/srv/cutouts:z,rw
+    restart: always
+
+
+  ska-ssl:
+    container_name: ska-ssl
+    #image: git.ia2.inaf.it:5050/butora/vlkb-datasets/soda:latest
+    image: registry.gitlab.com/ska-telescope/src/visivo-vlkb-soda:1.5.6
+    #image: soda:latest
+    ports:
+      - 18025:8443
+    environment:
+      - SECURITY=iamtoken
+      - ACCESS_CONTEXT_ROOT=ska#datasets
+      #- RESPONSE_FORMAT=application/fits
+      #- RESPONSE_FORMAT=application/fits;createfile=yes
+    volumes:
+      - /srv/ska/surveys:/srv/surveys:z,ro
+      - /srv/ska/cutouts:/srv/cutouts:z,rw
+    restart: always
+
diff --git a/docker/compose-example-vlkb.yaml b/docker/compose-example-vlkb.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..45de84ae3ffb061e7359ffa16f7b93c65eea10ad
--- /dev/null
+++ b/docker/compose-example-vlkb.yaml
@@ -0,0 +1,50 @@
+version: '2'
+
+services:
+
+  vlkb-db:
+    container_name: vlkb-db
+    image: git.ia2.inaf.it:5050/butora/vlkb-datasets/postgres-pgsphere:latest
+    #image: registry.gitlab.com/ska-telescope/src/visivo-vlkb-soda:1.5.2
+    hostname: vlkb-db
+    ports:
+            - 5432:5432
+    #image: postgres-pgsphere:latest
+    #network_mode: "host"
+    environment:
+      - SECURITY=
+      - POSTGRES_PASSWORD=ia2vlkb
+    volumes:
+      - postgres-data:/var/lib/postgresql/data
+
+
+  vlkb:
+    container_name: vlkb
+    image: soda:latest
+    #image: git.ia2.inaf.it:5050/butora/vlkb-datasets/soda:latest
+    hostname: vlkb
+    ports:
+           - 8080:8080
+    environment:
+      - SECURITY=
+        #- SECURITY=ia2token
+      - DISCOVERY_CONTEXT_ROOT=vlkb#datasets#vlkb_search
+      - DISCOVERY_DB_URI=jdbc:postgresql://pasquale.ia2.ianf.it:5432/vialactea
+      - DB_USERNAME=vialactea
+      - DB_PASSWORD=ia2vlkb
+      - VLKBOBSCORE_PG_URI=postgresql://vialactea:ia2vlkb@pasquale.ia2.inaf.it:5432/vialactea
+      - ACCESS_CONTEXT_ROOT=vlkb#datasets
+      - URL_CUTOUTS=vlkb-devel.ia2.inaf.it:8004/cutouts
+      #- RESPONSE_FORMAT=application/fits
+      - RESPONSE_FORMAT=application/vlkb+xml
+      #- RESPONSE_FORMAT=application/fits;createfile=yes
+    volumes:
+      #- ./config-vlkb:/config:Z
+      - /srv/vlkb/surveys:/srv/surveys:z,ro
+      - /srv/vlkb/cutouts:/srv/cutouts:z,rw
+    restart: always
+
+
+volumes:
+  postgres-data:
+
diff --git a/docker/config-vlkb/auth.properties b/docker/config-vlkb/auth.properties
new file mode 100644
index 0000000000000000000000000000000000000000..c9c8aee27f0017b03a10a17896236eae4a93a018
--- /dev/null
+++ b/docker/config-vlkb/auth.properties
@@ -0,0 +1,10 @@
+rap_uri=https://sso.ia2.inaf.it/rap-ia2
+gms_uri=https://sso.ia2.inaf.it/gms
+client_id=vospace_ui_demo
+client_secret=VOSpaceDemo123
+
+groups_autoload=true
+store_state_on_login_endpoint=true
+scope=openid email profile read:rap
+
+allow_anonymous_access=true
diff --git a/docker/config-vlkb/authpolicy.properties b/docker/config-vlkb/authpolicy.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1c59ef6ea99316ff778ca7dda6cb2cb3493aa9b3
--- /dev/null
+++ b/docker/config-vlkb/authpolicy.properties
@@ -0,0 +1,6 @@
+db_uri=jdbc:postgresql://127.0.0.1:5432/vialactea
+db_schema=datasets
+db_user_name=vialactea
+db_password=ia2vlkb
+
+
diff --git a/docker/config-vlkb/context-cutout.xml b/docker/config-vlkb/context-cutout.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4f5f504df9c52f4119d68bf48434f3afb0ae3861
--- /dev/null
+++ b/docker/config-vlkb/context-cutout.xml
@@ -0,0 +1,15 @@
+<Context docBase="/webapps/vlkb-cutout">
+
+        <Resources allowLinking="true">
+                <PostResources readOnly="false"
+                        className="org.apache.catalina.webresources.DirResourceSet"
+                        base="/srv/cutouts"
+                        webAppMount="/cutouts"/>
+                <PostResources readOnly="true"
+                        className="org.apache.catalina.webresources.DirResourceSet"
+                        base="/srv/surveys"
+                        webAppMount="/surveys"/>
+        </Resources>
+
+</Context>
+
diff --git a/docker/config-vlkb/formatresponsefilter.properties b/docker/config-vlkb/formatresponsefilter.properties
new file mode 100644
index 0000000000000000000000000000000000000000..b8acc01981bfba522a55bb187daebe3a2b1cecf0
--- /dev/null
+++ b/docker/config-vlkb/formatresponsefilter.properties
@@ -0,0 +1,7 @@
+
+# used to retrieve extraCards to add to FITS_header (VLKB-only)
+surveys_metadata_abs_pathname=/srv/surveys/survey_populate.csv
+
+# these URL's are used to construct cutout merge requests strings in response.xml
+cutout_url=http://vlkb-devel.ia2.inaf.it:8080/vlkb/datasets/vlkb_cutout
+merge_url=http://vlkb-devel.ia2.inaf.it:8080/vlkb/datasets/vlkb_merge
diff --git a/docker/config-vlkb/iamtoken.properties b/docker/config-vlkb/iamtoken.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e0935bb1f2d6f832b04b22c9dac817eac6741e5d
--- /dev/null
+++ b/docker/config-vlkb/iamtoken.properties
@@ -0,0 +1,10 @@
+
+#jwks_url=https://iam-escape.cloud.cnaf.infn.it/jwk
+introspect=https://iam-escape.cloud.cnaf.infn.it/introspect
+client_name=02cc260f-9837-4907-b2cb-a1a2d764fb15
+client_password=AJMi3qrB6AHRp_6y55tEwU-IpJ8uZ6X4QXeQ3W4la6dc-BlkzAY1OQpAE9hb1W7-VfYl4208FUtjE2Cl3hUYLkQ
+
+resource_id=vlkb
+
+non_authn_username=anonymous
+
diff --git a/docker/config-vlkb/neatoken.properties b/docker/config-vlkb/neatoken.properties
new file mode 100644
index 0000000000000000000000000000000000000000..21793e2600441bc6122e1ce54387ad8525bbd297
--- /dev/null
+++ b/docker/config-vlkb/neatoken.properties
@@ -0,0 +1,7 @@
+
+jwks_url=https://sso.neanias.eu/auth/realms/neanias-production/protocol/openid-connect/certs
+
+resource_id=vlkb
+
+non_authn_username=anonymous
+
diff --git a/docker/config-vlkb/tomcat-users.xml b/docker/config-vlkb/tomcat-users.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6587e75e97ec68e52749cd93b9e2a54f5a28e76d
--- /dev/null
+++ b/docker/config-vlkb/tomcat-users.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<tomcat-users xmlns="http://tomcat.apache.org/xml"
+              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
+              version="1.0">
+<!--
+  NOTE:  By default, no user is included in the "manager-gui" role required
+  to operate the "/manager/html" web application.  If you wish to use this app,
+  you must define such a user - the username and password are arbitrary. It is
+  strongly recommended that you do NOT use one of the users in the commented out
+  section below since they are intended for use with the examples web
+  application.
+-->
+<!--
+  NOTE:  The sample user and role entries below are intended for use with the
+  examples web application. They are wrapped in a comment and thus are ignored
+  when reading this file. If you wish to configure these users for use with the
+  examples web application, do not forget to remove the <!.. ..> that surrounds
+  them. You will also need to set the passwords to something appropriate.
+-->
+<!--
+  <role rolename="tomcat"/>
+  <role rolename="role1"/>
+  <user username="tomcat" password="<must-be-changed>" roles="tomcat"/>
+  <user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
+  <user username="role1" password="<must-be-changed>" roles="role1"/>
+-->
+
+  <role rolename="manager-script"/>
+  <user username="admin" password="IA2lbt09" roles="manager-script"/>
+</tomcat-users>
+
diff --git a/docker/config-vlkb/vlkb-obscore.datasets.conf b/docker/config-vlkb/vlkb-obscore.datasets.conf
new file mode 100644
index 0000000000000000000000000000000000000000..9572cd452614d5a6e0de043eaed03c2d1c168f82
--- /dev/null
+++ b/docker/config-vlkb/vlkb-obscore.datasets.conf
@@ -0,0 +1,15 @@
+
+# root of path for local access
+fits_path_surveys=/srv/surveys
+
+# obs_publisher_did = <obscore publisher> ? <generated-pubdid>
+obscore_publisher=ivo://ia2.inaf.it/vlkb/datasets
+
+# full access URL: <obscore_access_url>/<storage-path>/<file-name>
+obscore_access_url=https://vlkb-devel.ia2.inaf.it:8443/vlkb/datasets/surveys
+obscore_access_format=application/fits
+
+# logging (holds last exec only)
+# log_dir=/tmp
+# log_filename=vlkb-obscore.log
+
diff --git a/docker/config-vlkb/vlkbd.datasets.conf b/docker/config-vlkb/vlkbd.datasets.conf
new file mode 100644
index 0000000000000000000000000000000000000000..bccc41819036738345cde389866cc381c672eb2f
--- /dev/null
+++ b/docker/config-vlkb/vlkbd.datasets.conf
@@ -0,0 +1,10 @@
+
+# path to original files
+fits_path_surveys=/srv/surveys
+# path to generated cutouts
+fits_path_cutouts=/srv/cutouts
+
+# logging records last request only
+# log_dir=/tmp
+# log_filename=vlkbd.log
+
diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..bc1795fc141bd99e89ed49cb5364872705648694
--- /dev/null
+++ b/docker/entrypoint.sh
@@ -0,0 +1,151 @@
+#!/bin/bash
+
+set +e
+LOG_FILE=/tmp/entrypoint.log
+
+{
+date
+whoami
+env
+#########################################################################
+#INST_DIR="/usr/local"
+WEBAPP_DIR=/webapps
+#CONFIG_DIR=/config
+QUEUE_NAME=dockervlkb$ACCESS_CONTEXT_ROOT
+
+echo "SECURITY   : "$SECURITY
+echo "VLKBOBSCORE_PG_URI     : "$VLKBOBSCORE_PG_URI
+echo "ACCESS_CONTEXT_ROOT    : "$ACCESS_CONTEXT_ROOT
+echo "RESPONSE_FORMAT        : "$RESPONSE_FORMAT
+echo "URL_CUTOUTS            : "$URL_CUTOUTS
+echo "INST_DIR   : "$INST_DIR
+echo "WEBAPP_DIR : "$WEBAPP_DIR
+#echo "CONFIG_DIR : "$CONFIG_DIR
+echo "QUEUE_NAME : "$QUEUE_NAME
+#########################################################################
+
+
+
+## configure vlkb-tools
+#mkdir -p $INST_DIR/etc/vlkb-obscore
+#cp $CONFIG_DIR/vlkb-obscore.datasets.conf $INST_DIR/etc/vlkb-obscore/datasets.conf
+if test -n "$VLKBOBSCORE_PG_URI"
+then
+   echo "pg_uri=$VLKBOBSCORE_PG_URI" >> $INST_DIR/etc/vlkb-obscore/datasets.conf
+   echo "pg_schema=datasets"         >> $INST_DIR/etc/vlkb-obscore/datasets.conf
+fi
+
+
+## configure VLKB access
+if test -n "$ACCESS_CONTEXT_ROOT"
+then
+
+   if test -n "$SECURITY"
+   then
+      cd $WEBAPP_DIR/vlkb-cutout/WEB-INF/ && rm -f web.xml && cp web-cutout-$SECURITY.xml web.xml && cd -
+   fi
+
+#   cp $CONFIG_DIR/{auth.properties,neatoken.properties} $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/
+   #echo "<Context docBase=\"$WEBAPP_DIR/vlkb-cutout\"/>" > /var/lib/tomcat9/conf/Catalina/localhost/$ACCESS_CONTEXT_ROOT.xml
+   cp $WEBAPP_DIR/vlkb-cutout/META-INF/context.xml /var/lib/tomcat9/conf/Catalina/localhost/$ACCESS_CONTEXT_ROOT.xml
+   echo "db_uri=$DISCOVERY_DB_URI"  >  $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/authpolicy.properties
+   echo "db_schema=datasets"        >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/authpolicy.properties
+   echo "db_user_name=$DB_USERNAME" >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/authpolicy.properties
+   echo "db_password=$DB_PASSWORD"  >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/authpolicy.properties
+
+
+   echo "fits_path_surveys=/srv/surveys" > $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+   echo "fits_path_cutouts=/srv/cutouts" >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+   if test -f /srv/surveys/survey_populate.csv
+   then
+      echo "surveys_metadata_abs_pathname=/srv/surveys/survey_populate.csv" >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+      echo "fits_url_cutouts=$URL_CUTOUTS" >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+   fi
+   if test -n "$RESPONSE_FORMAT"
+   then
+      echo "default_response_format=$RESPONSE_FORMAT" >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+   fi
+
+   case $RESPONSE_FORMAT in application/x-vlkb*)
+      echo "default_sky_system=GALACTIC"   >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+      echo "default_spec_system=VELO_LSRK" >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+      echo "show_duration=yes"             >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+   esac
+
+   # for resolver (id & extraCards)
+   echo "db_uri=$DISCOVERY_DB_URI"  >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+   echo "db_schema=datasets"        >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+   echo "db_user_name=$DB_USERNAME" >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+   echo "db_password=$DB_PASSWORD"  >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+
+   echo "amqp_host_name=localhost"     >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+   echo "amqp_port=5672"               >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+   echo "amqp_routing_key=$QUEUE_NAME" >> $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/cutout.properties
+
+   case $RESPONSE_FORMAT in application/x-vlkb*)
+      service rabbitmq-server start
+      $INST_DIR/bin/vlkbd_exec.sh localhost $QUEUE_NAME $INST_DIR/etc/vlkbd/datasets.conf
+   esac
+fi
+
+
+
+# configure port/SSL connector: (path is relative to the dir where compose.yaml is
+# - web.xml to run filters set above
+# * ssl: set tomcat connector with certificates (ia2 needs SECTIGO, iam needs self-signed keystore.jks)
+# * keep right jjwt*.jar libs (ia2 authlib needs v0.11, iam needs v0.12)
+# assume all files in ssl sub-dir relative to where compose.yaml is
+# set volume mapping in compose.yaml: ssl/ -> /etc/pki/tls/
+case $SECURITY in
+   ia2token)
+      #cp ssl/server-connector-8443.xml-SECTIGO-vlkb_ia2_inaf_it  /etc/tomcat9/server-connector-8443.xml
+      cp /root/ssl/server-connector-8443.xml /etc/tomcat9/server-connector-8443.xml
+      # map volume instead of this: cp -r ssl/SECTIGO /etc/pki/tls/
+      rm /webapps/vlkb-cutout/WEB-INF/lib/jjwt-*0.12*.jar
+      ;;
+   iamtoken)
+      #cp ssl/server-connector-8443.xml-keystore-self-signed  /etc/tomcat9/server-connector-8443.xml
+      cp /root/ssl/server-connector-8443.xml  /etc/tomcat9/server-connector-8443.xml
+      # map volume somedir:/etc/pki/tls with somedir/{keystore.jks,SECTIGO/*} XXX cp ssl/keystore.jks /etc/pki/tls/
+      rm /webapps/vlkb-cutout/WEB-INF/lib/jjwt-*0.11*.jar
+      ;;
+   *)
+      echo "Security not configured, runs open."
+      ;;
+esac
+
+
+
+#if test -f /srv/surveys/keystore.jks
+#then
+#   cp /srv/surveys/keystore.jks /root/
+#fi
+#if test -f /srv/surveys/server-connector-8443.xml /etc/tomcat9/
+#then
+#   cp /srv/surveys/server-connector-8443.xml /etc/tomcat9/
+#fi
+#
+if test -n "$SECURITY"
+then
+   cd /etc/tomcat9/ && ln -s server-connector-8443.xml server-connector.xml && cd -
+else
+   cd /etc/tomcat9/ && ln -s server-connector-8080.xml server-connector.xml && cd -
+fi
+
+# configure access-token validation
+if test -f /srv/surveys/iamtoken.properties
+then
+   cp /srv/surveys/iamtoken.properties $WEBAPP_DIR/vlkb-cutout/WEB-INF/classes/
+fi
+
+
+#########################################################################
+
+date
+
+} 1> $LOG_FILE 2>&1
+
+JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 CATALINA_BASE=/var/lib/tomcat9 CATALINA_HOME=/usr/share/tomcat9 CATALINA_TMPDIR=/tmp /usr/libexec/tomcat9/tomcat-start.sh &
+
+wait -n
+
diff --git a/docker/ssl/How to generate a self-signed SSL certificate using OpenSSL - Stack Overflow.pdf b/docker/ssl/How to generate a self-signed SSL certificate using OpenSSL - Stack Overflow.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..2d7b3fd09bb0a24f3f7a1f04af33ee0ec8269d5e
Binary files /dev/null and b/docker/ssl/How to generate a self-signed SSL certificate using OpenSSL - Stack Overflow.pdf differ
diff --git a/docker/ssl/How to use OpenSSL and the Internet PKI on Linux systems Enable Sysadmin.pdf b/docker/ssl/How to use OpenSSL and the Internet PKI on Linux systems Enable Sysadmin.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..c2e26bc3bcf6a7aadf1b8ab23fab0434464168ba
Binary files /dev/null and b/docker/ssl/How to use OpenSSL and the Internet PKI on Linux systems Enable Sysadmin.pdf differ
diff --git a/docker/ssl/Makefile b/docker/ssl/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..cdc5c8deb2b2141a315d28b58e362d658237b0f7
--- /dev/null
+++ b/docker/ssl/Makefile
@@ -0,0 +1,10 @@
+
+
+
+keystore.jks:
+	keytool -genkey -keyalg RSA -noprompt -alias tomcat -dname "CN=localhost, OU=NA, O=NA, L=NA, S=NA, C=NA" -keystore keystore.jks -validity 9999 -storepass tomcatskassl -keypass tomcatskassl
+
+
+showxml:
+	xmlstarlet c14n server.xml
+
diff --git a/docker/ssl/keystore.jks b/docker/ssl/keystore.jks
new file mode 100644
index 0000000000000000000000000000000000000000..57c469584925bdc3de5f6919123d67c5a3189560
Binary files /dev/null and b/docker/ssl/keystore.jks differ
diff --git a/docker/ssl/server-connector-8080.xml b/docker/ssl/server-connector-8080.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2917f61d66eeec97c63fd9718c4530337a0a339a
--- /dev/null
+++ b/docker/ssl/server-connector-8080.xml
@@ -0,0 +1,3 @@
+   <Connector port="8080" protocol="HTTP/1.1"
+               connectionTimeout="20000" />
+
diff --git a/docker/ssl/server-connector-8443.xml b/docker/ssl/server-connector-8443.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1ad61476dbe60e77851fa636d3c40009af30232e
--- /dev/null
+++ b/docker/ssl/server-connector-8443.xml
@@ -0,0 +1,11 @@
+  <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
+        sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
+               maxThreads="150" SSLEnabled="true">
+         <SSLHostConfig>
+            <Certificate certificateKeyFile="/etc/pki/tls/SECTIGO/vlkb_ia2_inaf_it.key"
+                         certificateFile="/etc/pki/tls/SECTIGO/vlkb_ia2_inaf_it.crt"
+                         certificateChainFile="/etc/pki/tls/SECTIGO/CA.crt"
+                         type="RSA" />
+        </SSLHostConfig>
+    </Connector>
+
diff --git a/docker/ssl/server-connector-8443.xml-SECTIGO-vlkb.ia2.inaf.it b/docker/ssl/server-connector-8443.xml-SECTIGO-vlkb.ia2.inaf.it
new file mode 100644
index 0000000000000000000000000000000000000000..1ad61476dbe60e77851fa636d3c40009af30232e
--- /dev/null
+++ b/docker/ssl/server-connector-8443.xml-SECTIGO-vlkb.ia2.inaf.it
@@ -0,0 +1,11 @@
+  <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
+        sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
+               maxThreads="150" SSLEnabled="true">
+         <SSLHostConfig>
+            <Certificate certificateKeyFile="/etc/pki/tls/SECTIGO/vlkb_ia2_inaf_it.key"
+                         certificateFile="/etc/pki/tls/SECTIGO/vlkb_ia2_inaf_it.crt"
+                         certificateChainFile="/etc/pki/tls/SECTIGO/CA.crt"
+                         type="RSA" />
+        </SSLHostConfig>
+    </Connector>
+
diff --git a/docker/ssl/server-connector-8443.xml-self-signed-keystore-jks b/docker/ssl/server-connector-8443.xml-self-signed-keystore-jks
new file mode 100644
index 0000000000000000000000000000000000000000..02ca4500189bcdf839f61eb03958e8284c4c9205
--- /dev/null
+++ b/docker/ssl/server-connector-8443.xml-self-signed-keystore-jks
@@ -0,0 +1,11 @@
+   <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
+               maxThreads="150" SSLEnabled="true" >
+        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
+        <SSLHostConfig>
+            <Certificate certificateKeyAlias="tomcat"
+                         certificateKeystoreFile="/etc/pki/tls/keystore.jks"
+                         certificateKeystorePassword="tomcatskassl"
+                         type="RSA" />
+        </SSLHostConfig>
+   </Connector>
+
diff --git a/docker/ssl/server-connector-8443.xml-self-signed-keystore-jks-ORIG b/docker/ssl/server-connector-8443.xml-self-signed-keystore-jks-ORIG
new file mode 100644
index 0000000000000000000000000000000000000000..323456aa568ff5e7589dd347879f495d63833b51
--- /dev/null
+++ b/docker/ssl/server-connector-8443.xml-self-signed-keystore-jks-ORIG
@@ -0,0 +1,11 @@
+   <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
+               maxThreads="150" SSLEnabled="true" >
+        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
+        <SSLHostConfig>
+            <Certificate certificateKeyAlias="tomcat"
+                         certificateKeystoreFile="/root/keystore.jks"
+                         certificateKeystorePassword="tomcatskassl"
+                         type="RSA" />
+        </SSLHostConfig>
+   </Connector>
+
diff --git a/docker/ssl/server-connector.xml b/docker/ssl/server-connector.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1ad61476dbe60e77851fa636d3c40009af30232e
--- /dev/null
+++ b/docker/ssl/server-connector.xml
@@ -0,0 +1,11 @@
+  <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
+        sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
+               maxThreads="150" SSLEnabled="true">
+         <SSLHostConfig>
+            <Certificate certificateKeyFile="/etc/pki/tls/SECTIGO/vlkb_ia2_inaf_it.key"
+                         certificateFile="/etc/pki/tls/SECTIGO/vlkb_ia2_inaf_it.crt"
+                         certificateChainFile="/etc/pki/tls/SECTIGO/CA.crt"
+                         type="RSA" />
+        </SSLHostConfig>
+    </Connector>
+
diff --git a/docker/ssl/server.xml b/docker/ssl/server.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3ea14238c9561459974a2e3bf1c2c5d4c7730663
--- /dev/null
+++ b/docker/ssl/server.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE server-xml [
+      <!ENTITY connector-config SYSTEM "server-connector.xml">
+]>
+
+<Server port="-1" shutdown="SHUTDOWN">
+  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
+  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
+  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
+  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
+  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
+
+  <GlobalNamingResources>
+    <Resource name="UserDatabase" auth="Container"
+              type="org.apache.catalina.UserDatabase"
+              description="User database that can be updated and saved"
+              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
+              pathname="conf/tomcat-users.xml" />
+  </GlobalNamingResources>
+
+  <Service name="Catalina">
+
+    &connector-config;
+
+    <Engine name="Catalina" defaultHost="localhost">
+      <Realm className="org.apache.catalina.realm.LockOutRealm">
+        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
+               resourceName="UserDatabase"/>
+      </Realm>
+      <Host name="localhost"  appBase="webapps"
+            unpackWARs="true" autoDeploy="true">
+        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
+               prefix="localhost_access_log" suffix=".txt"
+               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
+      </Host>
+    </Engine>
+  </Service>
+</Server>
diff --git a/docker/vlkbd_exec.sh b/docker/vlkbd_exec.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f9c87f1064afd81482f72f9034972bf5a09313ad
--- /dev/null
+++ b/docker/vlkbd_exec.sh
@@ -0,0 +1,44 @@
+
+# how to all vlkbd in Makefile:
+
+# killall -q vlkbd-$(VERNUM); test $$? -eq 1
+
+
+if [ "$#" -lt 1 ]; then
+    echo -e "Run vlkbd-<version> on all CPU-cores, connecting to RabbitMQ on <amqphost>.\nUsage:\n\t $0 <amqphost> <queue_name> <datasets_conf>\n"
+    exit
+fi
+
+ncores=$(grep '^processor' /proc/cpuinfo | sort -u | wc -l)
+
+AMQPHOST=$1
+
+
+for core in $(seq 0 $(expr $ncores - 1) )
+do
+
+   # FIXME /usr/local should be configurable from engine/Makefile -> INSTALL_DIR
+   # or vlkbd_exec.sh sould be under resources and handled together with datasets.conf
+   taskset -c $core vlkbd $AMQPHOST 5672 $2 $3
+
+done
+
+ps ax | grep vlkbd
+
+
+
+# with bitmask:
+
+# usage: run on 2nd cpu ore
+#taskset 0x02 ./vlkb_amqp localhost 5672 test
+# run on 1st cpu ore
+#taskset 0x01 ./vlkb_amqp localhost 5672 test
+# Note that a bitmask uses "hexadecimal" notation. 
+# "0x11" is "00010001" in a binary format, which corresponds 
+# to CPU core 0 and 4. 
+# CPU core 0 and 1 is represented by CPU affinity "0x3".
+# taskset $1 ./vlkb_amqp localhost 5672 test
+
+
+# use defualt exchange
+#./amqp_listen localhost 5672 "" "test"