diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..3af0ccb687b45753a5c8b3c917d0ebe7cc4ab466
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/data
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8f73718ee8ee506611cc4025ba56394c3c7430dd
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,68 @@
+variables:
+  DOCKER_TLS_CERTDIR: ""
+
+build-master:
+  image: docker:latest
+  stage: build
+  services:
+    - docker:dind
+  before_script:
+    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
+  script:
+    - VERSION=`grep 'version="*"' core/Dockerfile | cut -d '"' -f2`
+    - IMAGE="$CI_REGISTRY_IMAGE/pdas_core"
+    - docker pull "$IMAGE":latest || true
+    - docker build --cache-from "$IMAGE":latest -t "$IMAGE":latest -t "$IMAGE":$VERSION core/
+    - docker push "$IMAGE":$VERSION
+    - docker push "$IMAGE":latest
+    - VERSION=`grep 'version="*"' preprocessor/Dockerfile | cut -d '"' -f2`
+    - IMAGE="$CI_REGISTRY_IMAGE/pdas_preprocessor"
+    - docker pull "$IMAGE":latest || true
+    - docker build --cache-from "$IMAGE":latest -t "$IMAGE":latest -t "$IMAGE":$VERSION preprocessor/
+    - docker push "$IMAGE":$VERSION
+    - docker push "$IMAGE":latest
+    - VERSION=`grep 'version="*"' client/Dockerfile | cut -d '"' -f2`
+    - IMAGE="$CI_REGISTRY_IMAGE/pdas_client"
+    - docker pull "$IMAGE":latest || true
+    - docker build --cache-from "$IMAGE":latest -t "$IMAGE":latest -t "$IMAGE":$VERSION client/
+    - docker push "$IMAGE":$VERSION
+    - docker push "$IMAGE":latest
+    - VERSION=`grep 'version="*"' cache/Dockerfile | cut -d '"' -f2`
+    - IMAGE="$CI_REGISTRY_IMAGE/pdas_cache"
+    - docker pull "$IMAGE":latest || true
+    - docker build --cache-from "$IMAGE":latest -t "$IMAGE":latest -t "$IMAGE":$VERSION cache/
+    - docker push "$IMAGE":$VERSION
+    - docker push "$IMAGE":latest
+  only:
+    - master
+
+build:
+  image: docker:latest
+  stage: build
+  services:
+    - docker:dind
+  before_script:
+    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
+  script:
+    - IMAGE="$CI_REGISTRY_IMAGE/pdas_core"
+    - docker pull "$IMAGE":$CI_COMMIT_REF_NAME || true
+    - docker build --cache-from "$IMAGE":$CI_COMMIT_REF_NAME -t "$IMAGE":$CI_COMMIT_REF_SLUG -t "$IMAGE":$CI_COMMIT_REF_NAME core/
+    - docker push "$IMAGE:$CI_COMMIT_REF_SLUG"
+    - docker push "$IMAGE:$CI_COMMIT_REF_NAME"
+    - IMAGE="$CI_REGISTRY_IMAGE/pdas_preprocessor"
+    - docker pull "$IMAGE":$CI_COMMIT_REF_NAME || true
+    - docker build --cache-from "$IMAGE":$CI_COMMIT_REF_NAME -t "$IMAGE":$CI_COMMIT_REF_SLUG -t "$IMAGE":$CI_COMMIT_REF_NAME preprocessor/
+    - docker push "$IMAGE:$CI_COMMIT_REF_SLUG"
+    - docker push "$IMAGE:$CI_COMMIT_REF_NAME"
+    - IMAGE="$CI_REGISTRY_IMAGE/pdas_client"
+    - docker pull "$IMAGE":$CI_COMMIT_REF_NAME || true
+    - docker build --cache-from "$IMAGE":$CI_COMMIT_REF_NAME -t "$IMAGE":$CI_COMMIT_REF_SLUG -t "$IMAGE":$CI_COMMIT_REF_NAME client/
+    - docker push "$IMAGE:$CI_COMMIT_REF_SLUG"
+    - docker push "$IMAGE:$CI_COMMIT_REF_NAME"
+    - IMAGE="$CI_REGISTRY_IMAGE/pdas_cache"
+    - docker pull "$IMAGE":$CI_COMMIT_REF_NAME || true
+    - docker build --cache-from "$IMAGE":$CI_COMMIT_REF_NAME -t "$IMAGE":$CI_COMMIT_REF_SLUG -t "$IMAGE":$CI_COMMIT_REF_NAME cache/
+    - docker push "$IMAGE:$CI_COMMIT_REF_SLUG"
+    - docker push "$IMAGE:$CI_COMMIT_REF_NAME"
+  except:
+    - master
diff --git a/config/emg_index-dev.html b/config/emg_index-dev.html
new file mode 100644
index 0000000000000000000000000000000000000000..cfd45fc73a6bf2850643c541749666479a993707
--- /dev/null
+++ b/config/emg_index-dev.html
@@ -0,0 +1,303 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+  <meta charset="UTF-8">
+  <title>PRISM Data Access Service</title>
+  <link rel="icon" href="//eox.at/wp-content/uploads/2015/06/cropped-eox_eye-192x192.png" sizes="192x192" />
+  <link rel="apple-touch-icon-precomposed" href="//eox.at/wp-content/uploads/2015/06/cropped-eox_eye-180x180.png" />
+</head>
+<body>
+  <header id="header" style="width: 100%; height:70px;">
+    <h3 style="width:100%;text-align:center;
+    color: #006699;">PRISM Data Access Service (PDAS) Client powered by
+    <a href="//eox.at"><img src="//eox.at/wp-content/uploads/2017/09/EOX_Logo.svg" alt="EOX" style="height:25px;margin-left:10px"/></a>
+    </h3>
+  </header>
+  <div id="app" style="width: 100%; top: 60px; bottom: 0; position: absolute; margin: 0; padding:0;"></div>
+  <script src="prism.js"></script>
+  <script>
+  var today = new Date();
+  today.setUTCHours(24, 0, 0, 0);
+  var baseUrl = '//127.0.0.1';
+  var config = {
+    "settings": {
+        "rightPanelOpen": true,
+        "leftPanelOpen": false,
+        "leftPanelTabIndex": 0,
+        "tutorial": "once",
+        "uploadEnabled": false,
+        "selectFilesDownloadEnabled": false,
+        "downloadEnabled": true,
+        "searchEnabled" : true,
+        "searchDebounceTime": 500,
+        "language": "en",
+        "timeDomain": [
+            "2015-01-01T00:00:00Z",
+            today.toISOString(),
+        ],
+        "constrainTimeDomain": true,
+        "displayTimeDomain": [
+            "2019-01-01T00:00:00Z",
+            "2019-12-31T23:59:59Z",
+        ],
+        "displayInterval": "P1096D",
+        "selectedTimeDomain": [
+            "2019-01-01T00:00:00Z",
+            "2019-12-31T23:59:59Z",
+        ],
+        "selectableInterval": "P1096D",
+        "timeSliderControls": true,
+        "maxTooltips": 1,
+        "center": [12, 49],
+        "zoom": 5,
+        "maxZoom": 17,
+        "footprintFillColor": "rgba(0, 0, 0, 0.2)",
+        "footprintStrokeColor": "rgba(0, 0, 0, 1)",
+        "filterFillColor": "rgba(0, 165, 255, 0)",
+        "filterStrokeColor": "rgba(0, 165, 255, 1)",
+        "filterOutsideColor": "rgba(0, 0, 0, 0.5)",
+        "selectedFootprintFillColor": "rgba(255, 0, 0, 0.2)",
+        "selectedFootprintStrokeColor": "rgba(255, 0, 0, 1)",
+        "highlightFillColor": "rgba(246, 182, 0, 0.5)",
+        "highlightStrokeColor": "rgba(246, 182, 0, 1)",
+        "highlightStrokeWidth": 3,
+        "translations": {
+            "en": {
+                "Cloud Cover": "Cloud coverage (%)",
+                "Error: NoApplicableCode": "Search timed out. Please refine the filter criteria.",
+            }
+        },
+        "filterSettings": {
+            "time": {
+                "hidden": true,
+            }
+        },
+        "downloadFormats": [
+            {
+                "name": "TIFF",
+                "mimeType": "image/tiff"
+            },
+            {
+                "name": "JPEG 2000",
+                "mimeType": "image/jp2"
+            },
+            {
+                "name": "HDF",
+                "mimeType": "application/x-hdf",
+            },
+        ],
+        "downloadProjections": [
+            {
+                "name": "WGS-84",
+                "identifier": "http://www.opengis.net/def/crs/EPSG/0/4326"
+            },
+            {
+                "name": "Web Mercator",
+                "identifier": "http://www.opengis.net/def/crs/EPSG/0/3857"
+            },
+            {
+                "name": "ETRS89 / LAEA Europe",
+                "identifier": "http://www.opengis.net/def/crs/EPSG/0/3035"
+            }
+        ],
+        "downloadInterpolations": [
+            {
+              "name": "Bilinear",
+              "identifier": "http://www.opengis.net/def/interpolation/OGC/1/bilinear"
+            },
+            {
+                "name": "Nearest Neighbour",
+                "identifier": "http://www.opengis.net/def/interpolation/OGC/1/nearest-neighbour"
+            },
+            // {
+            //     "name": "Cubic",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/cubic"
+            // },
+            // {
+            //     "name": "Cubic Spline",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/cubic-spline"
+            // },
+            {
+                "name": "Average",
+                "identifier": "http://www.opengis.net/def/interpolation/OGC/1/average"
+            },
+            // {
+            //     "name": "Lanczos",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/lanczos"
+            // },
+            // {
+            //     "name": "Mode",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/mode"
+            // },
+        ]
+    },
+    "baseLayers": [
+        {
+            "id": "terrain-light",
+            "displayName": "EOX Terrain-Light",
+            "display": {
+                "id": "terrain-light",
+                "visible": true,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.s2maps-tiles.eu/wmts/",
+                    "//e.s2maps-tiles.eu/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "style": "default",
+                "attribution": "Terrain-Light { Data &copy; <a href=\"//www.openstreetmap.org/copyright\" target=\"_blank\">OpenStreetMap</a> contributors and <a href='javascript:;' onClick='toggle(terrain_attribution)'>others</a>, Rendering &copy; <a href=\"//eox.at\" target=\"_blank\">EOX</a> }"
+            }
+        }, {
+            "id": "terrain",
+            "displayName": "EOX Terrain",
+            "display": {
+                "id": "terrain",
+                "visible": false,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.s2maps-tiles.eu/wmts/",
+                    "//e.s2maps-tiles.eu/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "style": "default",
+                "attribution": "Terrain { Data &copy; <a href=\"//www.openstreetmap.org/copyright\" target=\"_blank\">OpenStreetMap</a> contributors and <a href='javascript:;' onClick='toggle(terrain_attribution)'>others</a>, Rendering &copy; <a href=\"//eox.at\" target=\"_blank\">EOX</a> }"
+            }
+        },  {
+            "id": "s2cloudless",
+            "displayName": "EOX Sentinel-2 cloudless",
+            "display": {
+                "id": "s2cloudless-2018",
+                "visible": false,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.s2maps-tiles.eu/wmts/",
+                    "//e.s2maps-tiles.eu/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "style": "default",
+                "attribution": "<a xmlns:dct=\"//purl.org/dc/terms/\" href=\"//s2maps.eu\" property=\"dct:title\">Sentinel-2 cloudless - //s2maps.eu</a> by <a xmlns:cc=\"//creativecommons.org/ns#\" href=\"s://eox.at\" property=\"cc:attributionName\" rel=\"cc:attributionURL\">EOX IT Services GmbH</a> (Contains modified Copernicus Sentinel data 2017 &amp; 2018)"
+            }
+        }
+    ],
+    "layers": [
+        {
+            "id": 'Emergency',
+            "displayName": 'Emergency',
+            "displayColor": '#eb3700',
+            "display": {
+                "id": 'Emergency__TRUE_COLOR',
+                "visible": true,
+                "protocol": 'WMS',
+                "url": baseUrl + ':83/ows',
+                "format": 'image/png',
+                "projection": 'EPSG:4326',
+                "style": '',
+                "useMilliseconds": false,
+                "maxZoom": 17,
+                "options": [{
+                    "name": "Style",
+                    "target": "display.extraParameters.LAYERS",
+                    "values": [{
+                      "label": "Emergency True Color",
+                      "value": "Emergency__TRUE_COLOR",
+                    }, {
+                      "label": "Emergency False Color",
+                      "value": "Emergency__FALSE_COLOR",
+                    }, {
+                      "label": "Emergency NDVI",
+                      "value": "Emergency__NDVI",
+                    }]
+                }],
+            },
+            "search": {
+                "protocol": "OpenSearch",
+                "url": baseUrl + ":81/opensearch/collections/Emergency/",
+                "id": "Emergency",
+                "histogramBinCount": 28,
+                "format": "application/atom+xml",
+                "method": "GET",
+                "histogramThreshold": 600,
+                "lightweightBuckets": true,
+                "searchLimit": 600,
+                "loadMore": 600,
+                "pageSize": 200,
+                "countZeroRecords": true,
+                "parameters": [
+                  {
+                      "max": 100,
+                      "min": 0,
+                      "range": true,
+                      "type": "eo:cloudCover",
+                      "title": "Cloud Coverage"
+                  },
+                ],
+                "parametersFilterSettings": {
+                    "collapsed": false,
+                },
+            },
+            "download": {
+                "protocol": "EO-WCS",
+                "url": baseUrl + ":81/ows/",
+                // "method": "GET",
+                "rewrite": {
+                  // add __coverage to the coverageId
+                  "from": "({{id}})",
+                  "to": "$1__coverage"
+                }
+            }
+        },
+    ],
+    "overlayLayers": [
+        {
+            "id": "overlay_base",
+            "displayName": "EOX Borders and Labels",
+            "display": {
+                "id": "overlay_base",
+                "visible": false,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.tiles.maps.eox.at/wmts/",
+                    "//e.tiles.maps.eox.at/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "style": "default",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "attribution": "Overlay { Data &copy; <a href=\"//www.openstreetmap.org/copyright\" target=\"_blank\">OpenStreetMap</a> contributors, Rendering &copy; <a href=\"//eox.at\" target=\"_blank\">EOX</a> and <a href=\"//github.com/mapserver/basemaps\" target=\"_blank\">MapServer</a> }"
+            }
+        },
+        {
+            "id": 'Emergency__outlines',
+            "displayName": 'Emergency Outlines',
+            "displayColor": '#187465',
+            "display": {
+                "id": 'Emergency__outlines',
+                "visible": false,
+                "protocol": 'WMS',
+                "url": baseUrl + ':81/ows',
+                "format": 'image/png',
+                "projection": 'EPSG:4326',
+                "style": 'red',
+                "useMilliseconds": false,
+                "maxZoom": 17,
+                "synchronizeTime": true,
+            },
+        }
+    ]
+};
+
+    var app = new Application({
+      config: config,
+      container: document.getElementById('app'),
+    });
+    app.start();
+  </script>
+</body>
+</html>
diff --git a/config/emg_index-ops.html b/config/emg_index-ops.html
new file mode 100644
index 0000000000000000000000000000000000000000..6c9ea0bdaf405a3d087a53c722c376337df00a89
--- /dev/null
+++ b/config/emg_index-ops.html
@@ -0,0 +1,303 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+  <meta charset="UTF-8">
+  <title>PRISM Data Access Service</title>
+  <link rel="icon" href="//eox.at/wp-content/uploads/2015/06/cropped-eox_eye-192x192.png" sizes="192x192" />
+  <link rel="apple-touch-icon-precomposed" href="//eox.at/wp-content/uploads/2015/06/cropped-eox_eye-180x180.png" />
+</head>
+<body>
+  <header id="header" style="width: 100%; height:70px;">
+    <h3 style="width:100%;text-align:center;
+    color: #006699;">PRISM Data Access Service (PDAS) Client powered by
+    <a href="//eox.at"><img src="//eox.at/wp-content/uploads/2017/09/EOX_Logo.svg" alt="EOX" style="height:25px;margin-left:10px"/></a>
+    </h3>
+  </header>
+  <div id="app" style="width: 100%; top: 60px; bottom: 0; position: absolute; margin: 0; padding:0;"></div>
+  <script src="prism.js"></script>
+  <script>
+  var today = new Date();
+  today.setUTCHours(24, 0, 0, 0);
+  var baseUrl = '//emg.pdas.prism.eox.at/';
+  var config = {
+    "settings": {
+        "rightPanelOpen": true,
+        "leftPanelOpen": false,
+        "leftPanelTabIndex": 0,
+        "tutorial": "once",
+        "uploadEnabled": false,
+        "selectFilesDownloadEnabled": false,
+        "downloadEnabled": true,
+        "searchEnabled" : true,
+        "searchDebounceTime": 500,
+        "language": "en",
+        "timeDomain": [
+            "2015-01-01T00:00:00Z",
+            today.toISOString(),
+        ],
+        "constrainTimeDomain": true,
+        "displayTimeDomain": [
+            "2019-01-01T00:00:00Z",
+            "2019-12-31T23:59:59Z",
+        ],
+        "displayInterval": "P1096D",
+        "selectedTimeDomain": [
+            "2019-01-01T00:00:00Z",
+            "2019-12-31T23:59:59Z",
+        ],
+        "selectableInterval": "P1096D",
+        "timeSliderControls": true,
+        "maxTooltips": 1,
+        "center": [12, 49],
+        "zoom": 5,
+        "maxZoom": 17,
+        "footprintFillColor": "rgba(0, 0, 0, 0.2)",
+        "footprintStrokeColor": "rgba(0, 0, 0, 1)",
+        "filterFillColor": "rgba(0, 165, 255, 0)",
+        "filterStrokeColor": "rgba(0, 165, 255, 1)",
+        "filterOutsideColor": "rgba(0, 0, 0, 0.5)",
+        "selectedFootprintFillColor": "rgba(255, 0, 0, 0.2)",
+        "selectedFootprintStrokeColor": "rgba(255, 0, 0, 1)",
+        "highlightFillColor": "rgba(246, 182, 0, 0.5)",
+        "highlightStrokeColor": "rgba(246, 182, 0, 1)",
+        "highlightStrokeWidth": 3,
+        "translations": {
+            "en": {
+                "Cloud Cover": "Cloud coverage (%)",
+                "Error: NoApplicableCode": "Search timed out. Please refine the filter criteria.",
+            }
+        },
+        "filterSettings": {
+            "time": {
+                "hidden": true,
+            }
+        },
+        "downloadFormats": [
+            {
+                "name": "TIFF",
+                "mimeType": "image/tiff"
+            },
+            {
+                "name": "JPEG 2000",
+                "mimeType": "image/jp2"
+            },
+            {
+                "name": "HDF",
+                "mimeType": "application/x-hdf",
+            },
+        ],
+        "downloadProjections": [
+            {
+                "name": "WGS-84",
+                "identifier": "http://www.opengis.net/def/crs/EPSG/0/4326"
+            },
+            {
+                "name": "Web Mercator",
+                "identifier": "http://www.opengis.net/def/crs/EPSG/0/3857"
+            },
+            {
+                "name": "ETRS89 / LAEA Europe",
+                "identifier": "http://www.opengis.net/def/crs/EPSG/0/3035"
+            }
+        ],
+        "downloadInterpolations": [
+            {
+              "name": "Bilinear",
+              "identifier": "http://www.opengis.net/def/interpolation/OGC/1/bilinear"
+            },
+            {
+                "name": "Nearest Neighbour",
+                "identifier": "http://www.opengis.net/def/interpolation/OGC/1/nearest-neighbour"
+            },
+            // {
+            //     "name": "Cubic",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/cubic"
+            // },
+            // {
+            //     "name": "Cubic Spline",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/cubic-spline"
+            // },
+            {
+                "name": "Average",
+                "identifier": "http://www.opengis.net/def/interpolation/OGC/1/average"
+            },
+            // {
+            //     "name": "Lanczos",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/lanczos"
+            // },
+            // {
+            //     "name": "Mode",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/mode"
+            // },
+        ]
+    },
+    "baseLayers": [
+        {
+            "id": "terrain-light",
+            "displayName": "EOX Terrain-Light",
+            "display": {
+                "id": "terrain-light",
+                "visible": true,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.s2maps-tiles.eu/wmts/",
+                    "//e.s2maps-tiles.eu/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "style": "default",
+                "attribution": "Terrain-Light { Data &copy; <a href=\"//www.openstreetmap.org/copyright\" target=\"_blank\">OpenStreetMap</a> contributors and <a href='javascript:;' onClick='toggle(terrain_attribution)'>others</a>, Rendering &copy; <a href=\"//eox.at\" target=\"_blank\">EOX</a> }"
+            }
+        }, {
+            "id": "terrain",
+            "displayName": "EOX Terrain",
+            "display": {
+                "id": "terrain",
+                "visible": false,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.s2maps-tiles.eu/wmts/",
+                    "//e.s2maps-tiles.eu/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "style": "default",
+                "attribution": "Terrain { Data &copy; <a href=\"//www.openstreetmap.org/copyright\" target=\"_blank\">OpenStreetMap</a> contributors and <a href='javascript:;' onClick='toggle(terrain_attribution)'>others</a>, Rendering &copy; <a href=\"//eox.at\" target=\"_blank\">EOX</a> }"
+            }
+        },  {
+            "id": "s2cloudless",
+            "displayName": "EOX Sentinel-2 cloudless",
+            "display": {
+                "id": "s2cloudless-2018",
+                "visible": false,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.s2maps-tiles.eu/wmts/",
+                    "//e.s2maps-tiles.eu/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "style": "default",
+                "attribution": "<a xmlns:dct=\"//purl.org/dc/terms/\" href=\"//s2maps.eu\" property=\"dct:title\">Sentinel-2 cloudless - //s2maps.eu</a> by <a xmlns:cc=\"//creativecommons.org/ns#\" href=\"s://eox.at\" property=\"cc:attributionName\" rel=\"cc:attributionURL\">EOX IT Services GmbH</a> (Contains modified Copernicus Sentinel data 2017 &amp; 2018)"
+            }
+        }
+    ],
+    "layers": [
+        {
+            "id": 'Emergency',
+            "displayName": 'Emergency',
+            "displayColor": '#eb3700',
+            "display": {
+                "id": 'Emergency__TRUE_COLOR',
+                "visible": true,
+                "protocol": 'WMS',
+                "url": baseUrl + 'cache/ows',
+                "format": 'image/png',
+                "projection": 'EPSG:4326',
+                "style": '',
+                "useMilliseconds": false,
+                "maxZoom": 17,
+                "options": [{
+                    "name": "Style",
+                    "target": "display.extraParameters.LAYERS",
+                    "values": [{
+                      "label": "Emergency True Color",
+                      "value": "Emergency__TRUE_COLOR",
+                    }, {
+                      "label": "Emergency False Color",
+                      "value": "Emergency__FALSE_COLOR",
+                    }, {
+                      "label": "Emergency NDVI",
+                      "value": "Emergency__NDVI",
+                    }]
+                }],
+            },
+            "search": {
+                "protocol": "OpenSearch",
+                "url": baseUrl + "opensearch/collections/Emergency/",
+                "id": "Emergency",
+                "histogramBinCount": 28,
+                "format": "application/atom+xml",
+                "method": "GET",
+                "histogramThreshold": 600,
+                "lightweightBuckets": true,
+                "searchLimit": 600,
+                "loadMore": 600,
+                "pageSize": 200,
+                "countZeroRecords": true,
+                "parameters": [
+                  {
+                      "max": 100,
+                      "min": 0,
+                      "range": true,
+                      "type": "eo:cloudCover",
+                      "title": "Cloud Coverage"
+                  },
+                ],
+                "parametersFilterSettings": {
+                    "collapsed": false,
+                },
+            },
+            "download": {
+                "protocol": "EO-WCS",
+                "url": baseUrl + "ows",
+                // "method": "GET",
+                "rewrite": {
+                  // add __coverage to the coverageId
+                  "from": "({{id}})",
+                  "to": "$1__coverage"
+                }
+            }
+        },
+    ],
+    "overlayLayers": [
+        {
+            "id": "overlay_base",
+            "displayName": "EOX Borders and Labels",
+            "display": {
+                "id": "overlay_base",
+                "visible": false,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.tiles.maps.eox.at/wmts/",
+                    "//e.tiles.maps.eox.at/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "style": "default",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "attribution": "Overlay { Data &copy; <a href=\"//www.openstreetmap.org/copyright\" target=\"_blank\">OpenStreetMap</a> contributors, Rendering &copy; <a href=\"//eox.at\" target=\"_blank\">EOX</a> and <a href=\"//github.com/mapserver/basemaps\" target=\"_blank\">MapServer</a> }"
+            }
+        },
+        {
+            "id": 'Emergency__outlines',
+            "displayName": 'Emergency Outlines',
+            "displayColor": '#187465',
+            "display": {
+                "id": 'Emergency__outlines',
+                "visible": false,
+                "protocol": 'WMS',
+                "url": baseUrl + 'ows',
+                "format": 'image/png',
+                "projection": 'EPSG:4326',
+                "style": 'red',
+                "useMilliseconds": false,
+                "maxZoom": 17,
+                "synchronizeTime": true,
+            },
+        }
+    ]
+};
+
+    var app = new Application({
+      config: config,
+      container: document.getElementById('app'),
+    });
+    app.start();
+  </script>
+</body>
+</html>
diff --git a/config/emg_mapcache-dev.xml b/config/emg_mapcache-dev.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5950aa3b6cbe8ba94efec83a5eaa6fe4f61f7a8e
--- /dev/null
+++ b/config/emg_mapcache-dev.xml
@@ -0,0 +1,167 @@
+<mapcache>
+  <default_format>mixed</default_format>
+  <format name="mypng" type="PNG">
+    <compression>fast</compression>
+  </format>
+  <format name="myjpeg" type="JPEG">
+    <quality>75</quality>
+    <photometric>ycbcr</photometric>
+  </format>
+  <format name="mixed" type="MIXED">
+    <transparent>mypng</transparent>
+    <opaque>myjpeg</opaque>
+  </format>
+  <service type="wms" enabled="true">
+    <full_wms>assemble</full_wms>
+    <resample_mode>bilinear</resample_mode>
+    <format>mixed</format>
+    <maxsize>4096</maxsize>
+    <!-- <forwarding_rule name="wms">
+      <param name="SERVICE" type="values">WMS</param>
+      <http>
+        <url>http://localhost/browse/ows</url>
+      </http>
+    </forwarding_rule> -->
+  </service>
+  <service type="wmts" enabled="true"/>
+  <metadata>
+    <title>Pre-rendered View Service (pdas) developed by EOX</title>
+    <abstract>Pre-rendered View Service (pdas) developed by EOX</abstract>
+    <keyword>view service</keyword>
+    <accessconstraints>UNKNOWN</accessconstraints>
+    <fees>UNKNOWN</fees>
+    <contactname>Stephan Meissl</contactname>
+    <contactphone>Please contact via mail.</contactphone>
+    <contactfacsimile>None</contactfacsimile>
+    <contactorganization>EOX IT Services GmbH</contactorganization>
+    <contactcity>Vienna</contactcity>
+    <contactstateorprovince>Vienna</contactstateorprovince>
+    <contactpostcode>1090</contactpostcode>
+    <contactcountry>Austria</contactcountry>
+    <contactelectronicmailaddress>office@eox.at</contactelectronicmailaddress>
+    <contactposition>CTO</contactposition>
+    <providername>EOX</providername>
+    <providerurl>https://eox.at</providerurl>
+    <inspire_profile>true</inspire_profile>
+    <inspire_metadataurl>TBD</inspire_metadataurl>
+    <defaultlanguage>eng</defaultlanguage>
+    <language>eng</language>
+  </metadata>
+  <errors>empty_img</errors>
+  <lock_dir>/tmp</lock_dir>
+  <threaded_fetching>true</threaded_fetching>
+  <cache name="emg" type="sqlite3">
+    <dbfile>/tmp/cache.db</dbfile>
+  </cache>
+
+  <!-- SOURCES Emergency -->
+  <source type="wms" name="emg_true_color">
+    <getmap>
+      <params>
+        <LAYERS>Emergency__TRUE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://localhost/ows</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="emg_false_color">
+    <getmap>
+      <params>
+        <LAYERS>Emergency__FALSE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://localhost/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="emg_ndvi">
+    <getmap>
+      <params>
+        <LAYERS>Emergency__NDVI</LAYERS>
+        <STYLES>earth</STYLES>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://localhost/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+
+  <!-- TILESETS Emergency -->
+  <tileset name="Emergency__TRUE_COLOR">
+    <metadata>
+      <title>Emergency True Color</title>
+      <abstract>Emergency True Color</abstract>
+    </metadata>
+    <source>emg_true_color</source>
+    <cache>emg</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/emg_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="Emergency__FALSE_COLOR">
+    <metadata>
+      <title>Emergency False Color</title>
+      <abstract>Emergency False Color</abstract>
+    </metadata>
+    <source>emg_false_color</source>
+    <cache>emg</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/emg_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="Emergency__NDVI">
+    <metadata>
+      <title>Emergency NDVI</title>
+      <abstract>Emergency NDVI</abstract>
+    </metadata>
+    <source>emg_ndvi</source>
+    <cache>emg</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/emg_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+
+</mapcache>
diff --git a/config/emg_mapcache-ops.xml b/config/emg_mapcache-ops.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d6e904c19b1a0036a225f755a80548d22021fdc5
--- /dev/null
+++ b/config/emg_mapcache-ops.xml
@@ -0,0 +1,171 @@
+<mapcache>
+  <default_format>mixed</default_format>
+  <format name="mypng" type="PNG">
+    <compression>fast</compression>
+  </format>
+  <format name="myjpeg" type="JPEG">
+    <quality>75</quality>
+    <photometric>ycbcr</photometric>
+  </format>
+  <format name="mixed" type="MIXED">
+    <transparent>mypng</transparent>
+    <opaque>myjpeg</opaque>
+  </format>
+  <service type="wms" enabled="true">
+    <full_wms>assemble</full_wms>
+    <resample_mode>bilinear</resample_mode>
+    <format>mixed</format>
+    <maxsize>4096</maxsize>
+    <!-- <forwarding_rule name="wms">
+      <param name="SERVICE" type="values">WMS</param>
+      <http>
+        <url>http://localhost/browse/ows</url>
+      </http>
+    </forwarding_rule> -->
+  </service>
+  <service type="wmts" enabled="true"/>
+  <metadata>
+    <title>Pre-rendered View Service (pdas) developed by EOX</title>
+    <abstract>Pre-rendered View Service (pdas) developed by EOX</abstract>
+    <url>https://emg.pdas.prism.eox.at/cache/ows</url>
+    <keyword>view service</keyword>
+    <accessconstraints>UNKNOWN</accessconstraints>
+    <fees>UNKNOWN</fees>
+    <contactname>Stephan Meissl</contactname>
+    <contactphone>Please contact via mail.</contactphone>
+    <contactfacsimile>None</contactfacsimile>
+    <contactorganization>EOX IT Services GmbH</contactorganization>
+    <contactcity>Vienna</contactcity>
+    <contactstateorprovince>Vienna</contactstateorprovince>
+    <contactpostcode>1090</contactpostcode>
+    <contactcountry>Austria</contactcountry>
+    <contactelectronicmailaddress>office@eox.at</contactelectronicmailaddress>
+    <contactposition>CTO</contactposition>
+    <providername>EOX</providername>
+    <providerurl>https://eox.at</providerurl>
+    <inspire_profile>true</inspire_profile>
+    <inspire_metadataurl>TBD</inspire_metadataurl>
+    <defaultlanguage>eng</defaultlanguage>
+    <language>eng</language>
+  </metadata>
+  <errors>empty_img</errors>
+  <lock_dir>/tmp</lock_dir>
+  <threaded_fetching>true</threaded_fetching>
+  <cache name="emg" type="rest">
+    <url>{{OS_STORAGE_URL}}/{{BUCKET_NAME}}/{tileset}/{grid}/{dim}/{z}/{x}/{y}.{ext}</url>
+    <headers>
+      <X-Auth-Token>{{OS_AUTH_TOKEN}}</X-Auth-Token>
+    </headers>
+  </cache>
+
+  <!-- SOURCES Emergency -->
+  <source type="wms" name="emg_true_color">
+    <getmap>
+      <params>
+        <LAYERS>Emergency__TRUE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://localhost/ows</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="emg_false_color">
+    <getmap>
+      <params>
+        <LAYERS>Emergency__FALSE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://localhost/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="emg_ndvi">
+    <getmap>
+      <params>
+        <LAYERS>Emergency__NDVI</LAYERS>
+        <STYLES>earth</STYLES>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://localhost/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+
+  <!-- TILESETS Emergency -->
+  <tileset name="Emergency__TRUE_COLOR">
+    <metadata>
+      <title>Emergency True Color</title>
+      <abstract>Emergency True Color</abstract>
+    </metadata>
+    <source>emg_true_color</source>
+    <cache>emg</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/emg_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="Emergency__FALSE_COLOR">
+    <metadata>
+      <title>Emergency False Color</title>
+      <abstract>Emergency False Color</abstract>
+    </metadata>
+    <source>emg_false_color</source>
+    <cache>emg</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/emg_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="Emergency__NDVI">
+    <metadata>
+      <title>Emergency NDVI</title>
+      <abstract>Emergency NDVI</abstract>
+    </metadata>
+    <source>emg_ndvi</source>
+    <cache>emg</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/emg_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+
+</mapcache>
diff --git a/config/vhr18_index-dev.html b/config/vhr18_index-dev.html
new file mode 100644
index 0000000000000000000000000000000000000000..bf3b39337236b219a84d567ac6a1b8ef2c77f261
--- /dev/null
+++ b/config/vhr18_index-dev.html
@@ -0,0 +1,401 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+  <meta charset="UTF-8">
+  <title>PRISM Data Access Service</title>
+  <link rel="icon" href="//eox.at/wp-content/uploads/2015/06/cropped-eox_eye-192x192.png" sizes="192x192" />
+  <link rel="apple-touch-icon-precomposed" href="//eox.at/wp-content/uploads/2015/06/cropped-eox_eye-180x180.png" />
+</head>
+<body>
+  <header id="header" style="width: 100%; height:70px;">
+    <h3 style="width:100%;text-align:center;
+    color: #006699;">PRISM Data Access Service (PDAS) Client powered by
+    <a href="//eox.at"><img src="//eox.at/wp-content/uploads/2017/09/EOX_Logo.svg" alt="EOX" style="height:25px;margin-left:10px"/></a>
+    </h3>
+  </header>
+  <div id="app" style="width: 100%; top: 60px; bottom: 0; position: absolute; margin: 0; padding:0;"></div>
+  <script src="prism.js"></script>
+  <script>
+  var baseUrl = '//127.0.0.1';
+  var config = {
+    "settings": {
+        "rightPanelOpen": true,
+        "leftPanelOpen": false,
+        "leftPanelTabIndex": 0,
+        "tutorial": "once",
+        "uploadEnabled": false,
+        "selectFilesDownloadEnabled": false,
+        "downloadEnabled": true,
+        "searchEnabled" : true,
+        "searchDebounceTime": 500,
+        "language": "en",
+        "timeDomain": [
+            "2017-01-01T00:00:00Z",
+            "2019-12-31T23:59:59Z",
+        ],
+        "constrainTimeDomain": true,
+        "displayTimeDomain": [
+            "2017-01-01T00:00:00Z",
+            "2019-12-31T23:59:59Z",
+        ],
+        "displayInterval": "P1096D",
+        "selectedTimeDomain": [
+            "2018-08-01T00:00:00Z",
+            "2018-08-31T23:59:59Z",
+        ],
+        "selectableInterval": "P1096D",
+        "timeSliderControls": true,
+        "maxTooltips": 1,
+        "center": [12, 49],
+        "zoom": 5,
+        "maxZoom": 17,
+        "footprintFillColor": "rgba(0, 0, 0, 0.2)",
+        "footprintStrokeColor": "rgba(0, 0, 0, 1)",
+        "filterFillColor": "rgba(0, 165, 255, 0)",
+        "filterStrokeColor": "rgba(0, 165, 255, 1)",
+        "filterOutsideColor": "rgba(0, 0, 0, 0.5)",
+        "selectedFootprintFillColor": "rgba(255, 0, 0, 0.2)",
+        "selectedFootprintStrokeColor": "rgba(255, 0, 0, 1)",
+        "highlightFillColor": "rgba(246, 182, 0, 0.5)",
+        "highlightStrokeColor": "rgba(246, 182, 0, 1)",
+        "highlightStrokeWidth": 3,
+        "translations": {
+            "en": {
+                "Cloud Cover": "Cloud coverage (%)",
+                "Error: NoApplicableCode": "Search timed out. Please refine the filter criteria.",
+            }
+        },
+        "filterSettings": {
+            "time": {
+                "hidden": true,
+            }
+        },
+        "downloadFormats": [
+            {
+                "name": "TIFF",
+                "mimeType": "image/tiff"
+            },
+            {
+                "name": "JPEG 2000",
+                "mimeType": "image/jp2"
+            },
+            {
+                "name": "HDF",
+                "mimeType": "application/x-hdf",
+            },
+        ],
+        "downloadProjections": [
+            {
+                "name": "WGS-84",
+                "identifier": "http://www.opengis.net/def/crs/EPSG/0/4326"
+            },
+            {
+                "name": "Web Mercator",
+                "identifier": "http://www.opengis.net/def/crs/EPSG/0/3857"
+            },
+            {
+                "name": "ETRS89 / LAEA Europe",
+                "identifier": "http://www.opengis.net/def/crs/EPSG/0/3035"
+            }
+        ],
+        "downloadInterpolations": [
+            {
+              "name": "Bilinear",
+              "identifier": "http://www.opengis.net/def/interpolation/OGC/1/bilinear"
+            },
+            {
+                "name": "Nearest Neighbour",
+                "identifier": "http://www.opengis.net/def/interpolation/OGC/1/nearest-neighbour"
+            },
+            // {
+            //     "name": "Cubic",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/cubic"
+            // },
+            // {
+            //     "name": "Cubic Spline",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/cubic-spline"
+            // },
+            {
+                "name": "Average",
+                "identifier": "http://www.opengis.net/def/interpolation/OGC/1/average"
+            },
+            // {
+            //     "name": "Lanczos",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/lanczos"
+            // },
+            // {
+            //     "name": "Mode",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/mode"
+            // },
+        ]
+    },
+    "baseLayers": [
+        {
+            "id": "terrain-light",
+            "displayName": "EOX Terrain-Light",
+            "display": {
+                "id": "terrain-light",
+                "visible": true,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.s2maps-tiles.eu/wmts/",
+                    "//e.s2maps-tiles.eu/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "style": "default",
+                "attribution": "Terrain-Light { Data &copy; <a href=\"//www.openstreetmap.org/copyright\" target=\"_blank\">OpenStreetMap</a> contributors and <a href='javascript:;' onClick='toggle(terrain_attribution)'>others</a>, Rendering &copy; <a href=\"//eox.at\" target=\"_blank\">EOX</a> }"
+            }
+        }, {
+            "id": "terrain",
+            "displayName": "EOX Terrain",
+            "display": {
+                "id": "terrain",
+                "visible": false,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.s2maps-tiles.eu/wmts/",
+                    "//e.s2maps-tiles.eu/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "style": "default",
+                "attribution": "Terrain { Data &copy; <a href=\"//www.openstreetmap.org/copyright\" target=\"_blank\">OpenStreetMap</a> contributors and <a href='javascript:;' onClick='toggle(terrain_attribution)'>others</a>, Rendering &copy; <a href=\"//eox.at\" target=\"_blank\">EOX</a> }"
+            }
+        },  {
+            "id": "s2cloudless",
+            "displayName": "EOX Sentinel-2 cloudless",
+            "display": {
+                "id": "s2cloudless-2018",
+                "visible": false,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.s2maps-tiles.eu/wmts/",
+                    "//e.s2maps-tiles.eu/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "style": "default",
+                "attribution": "<a xmlns:dct=\"//purl.org/dc/terms/\" href=\"//s2maps.eu\" property=\"dct:title\">Sentinel-2 cloudless - //s2maps.eu</a> by <a xmlns:cc=\"//creativecommons.org/ns#\" href=\"s://eox.at\" property=\"cc:attributionName\" rel=\"cc:attributionURL\">EOX IT Services GmbH</a> (Contains modified Copernicus Sentinel data 2017 &amp; 2018)"
+            }
+        }
+    ],
+    "layers": [
+        {
+            "id": 'VHR_IMAGE_2018_Level_1',
+            "displayName": 'VHR Image 2018 Level 1',
+            "displayColor": '#eb3700',
+            "display": {
+                "id": 'VHR_IMAGE_2018_Level_1__TRUE_COLOR',
+                "visible": false,
+                "protocol": 'WMS',
+                "url": baseUrl + ':83/ows',
+                "format": 'image/png',
+                "projection": 'EPSG:4326',
+                "style": '',
+                "useMilliseconds": false,
+                "maxZoom": 17,
+                "options": [{
+                    "name": "Style",
+                    "target": "display.extraParameters.LAYERS",
+                    "values": [{
+                      "label": "VHR Image 2018 True Color",
+                      "value": "VHR_IMAGE_2018_Level_1__TRUE_COLOR",
+                    }, {
+                      "label": "VHR Image 2018 True Color with masked validity",
+                      "value": "VHR_IMAGE_2018_Level_1__masked_validity",
+                    }, {
+                      "label": "VHR Image 2018 False Color",
+                      "value": "VHR_IMAGE_2018_Level_1__FALSE_COLOR",
+                    }, {
+                      "label": "VHR Image 2018 NDVI",
+                      "value": "VHR_IMAGE_2018_Level_1__NDVI",
+                    }]
+                }],
+            },
+            "search": {
+                "protocol": "OpenSearch",
+                "url": baseUrl + ":81/opensearch/collections/VHR_IMAGE_2018_Level_1/",
+                "id": "VHR_IMAGE_2018_Level_1",
+                "histogramBinCount": 28,
+                "format": "application/atom+xml",
+                "method": "GET",
+                "histogramThreshold": 600,
+                "lightweightBuckets": true,
+                "searchLimit": 600,
+                "loadMore": 600,
+                "pageSize": 200,
+                "countZeroRecords": true,
+                "parameters": [
+                  {
+                      "max": 100,
+                      "min": 0,
+                      "range": true,
+                      "type": "eo:cloudCover",
+                      "title": "Cloud Coverage"
+                  },
+                ],
+                "parametersFilterSettings": {
+                    "collapsed": false,
+                },
+            },
+            "download": {
+                "protocol": "EO-WCS",
+                "url": baseUrl + ":81/ows/",
+                // "method": "GET",
+                "rewrite": {
+                  // add __coverage to the coverageId
+                  "from": "({{id}})",
+                  "to": "$1__coverage"
+                }
+            }
+        },
+        {
+            "id": 'VHR_IMAGE_2018_Level_3',
+            "displayName": 'VHR Image 2018 Level 3',
+            "displayColor": '#37eb00',
+            "display": {
+                "id": 'VHR_IMAGE_2018_Level_3__TRUE_COLOR',
+                "visible": true,
+                "protocol": 'WMS',
+                "url": baseUrl + ':83/ows',
+                "format": 'image/png',
+                "projection": 'EPSG:4326',
+                "style": '',
+                "useMilliseconds": false,
+                "maxZoom": 17,
+                "options": [{
+                    "name": "Style",
+                    "target": "display.extraParameters.LAYERS",
+                    "values": [{
+                      "label": "VHR Image 2018 True Color",
+                      "value": "VHR_IMAGE_2018_Level_3__TRUE_COLOR",
+                    }, {
+                      "label": "VHR Image 2018 True Color with masked validity",
+                      "value": "VHR_IMAGE_2018_Level_3__masked_validity",
+                    }, {
+                      "label": "VHR Image 2018 False Color",
+                      "value": "VHR_IMAGE_2018_Level_3__FALSE_COLOR",
+                    }, {
+                      "label": "VHR Image 2018 NDVI",
+                      "value": "VHR_IMAGE_2018_Level_3__NDVI",
+                    }]
+                }],
+            },
+            "search": {
+                "protocol": "OpenSearch",
+                "url": baseUrl + ":81/opensearch/collections/VHR_IMAGE_2018_Level_3/",
+                "id": "VHR_IMAGE_2018_Level_3",
+                "histogramBinCount": 28,
+                "format": "application/atom+xml",
+                "method": "GET",
+                "histogramThreshold": 600,
+                "lightweightBuckets": true,
+                "searchLimit": 600,
+                "loadMore": 600,
+                "pageSize": 200,
+                "countZeroRecords": true,
+                "parameters": [
+                  {
+                      "max": 100,
+                      "min": 0,
+                      "range": true,
+                      "type": "eo:cloudCover",
+                      "title": "Cloud Coverage"
+                  },
+                ],
+                "parametersFilterSettings": {
+                    "collapsed": false,
+                },
+            },
+            "download": {
+                "protocol": "EO-WCS",
+                "url": baseUrl + ":81/ows/",
+                // "method": "GET",
+                "rewrite": {
+                  // add __coverage to the coverageId
+                  "from": "({{id}})",
+                  "to": "$1__coverage"
+                }
+            }
+        },
+    ],
+    "overlayLayers": [
+        {
+            "id": "overlay_base",
+            "displayName": "EOX Borders and Labels",
+            "display": {
+                "id": "overlay_base",
+                "visible": false,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.tiles.maps.eox.at/wmts/",
+                    "//e.tiles.maps.eox.at/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "style": "default",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "attribution": "Overlay { Data &copy; <a href=\"//www.openstreetmap.org/copyright\" target=\"_blank\">OpenStreetMap</a> contributors, Rendering &copy; <a href=\"//eox.at\" target=\"_blank\">EOX</a> and <a href=\"//github.com/mapserver/basemaps\" target=\"_blank\">MapServer</a> }"
+            }
+        },
+        {
+            "id": 'VHR_IMAGE_2018_Level_3__outlines',
+            "displayName": 'VHR Image 2018 Level 3 Outlines',
+            "displayColor": '#187465',
+            "display": {
+                "id": 'VHR_IMAGE_2018_Level_3__outlines',
+                "visible": false,
+                "protocol": 'WMS',
+                "url": baseUrl + ':81/ows',
+                "format": 'image/png',
+                "projection": 'EPSG:4326',
+                "style": 'red',
+                "useMilliseconds": false,
+                "maxZoom": 17,
+                "synchronizeTime": true,
+            },
+        },
+        {
+            "id": 'VHR_IMAGE_2018_Level_3__masked_validity__Full',
+            "displayName": 'VHR Image 2018 Level 3 True Color with masked validity Full Coverage',
+            "display": {
+                "id": 'VHR_IMAGE_2018_Level_3__masked_validity__Full',
+                "visible": false,
+                "protocol": 'WMS',
+                "url": baseUrl + ':83/ows',
+                "format": 'image/png',
+                "projection": 'EPSG:4326',
+                "maxZoom": 17,
+                "synchronizeTime": false,
+            },
+        },
+        {
+            "id": 'VHR_IMAGE_2018_Level_3__Full',
+            "displayName": 'VHR Image 2018 Level 3 True Color Full Coverage',
+            "display": {
+                "id": 'VHR_IMAGE_2018_Level_3__Full',
+                "visible": false,
+                "protocol": 'WMS',
+                "url": baseUrl + ':83/ows',
+                "format": 'image/png',
+                "projection": 'EPSG:4326',
+                "maxZoom": 17,
+                "synchronizeTime": false,
+            },
+        }
+    ]
+};
+
+    var app = new Application({
+      config: config,
+      container: document.getElementById('app'),
+    });
+    app.start();
+  </script>
+</body>
+</html>
diff --git a/config/vhr18_index-ops.html b/config/vhr18_index-ops.html
new file mode 100644
index 0000000000000000000000000000000000000000..2bf79c662b6f0a623f56b013c755fa44ebef0330
--- /dev/null
+++ b/config/vhr18_index-ops.html
@@ -0,0 +1,401 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+  <meta charset="UTF-8">
+  <title>PRISM Data Access Service</title>
+  <link rel="icon" href="//eox.at/wp-content/uploads/2015/06/cropped-eox_eye-192x192.png" sizes="192x192" />
+  <link rel="apple-touch-icon-precomposed" href="//eox.at/wp-content/uploads/2015/06/cropped-eox_eye-180x180.png" />
+</head>
+<body>
+  <header id="header" style="width: 100%; height:70px;">
+    <h3 style="width:100%;text-align:center;
+    color: #006699;">PRISM Data Access Service (PDAS) Client powered by
+    <a href="//eox.at"><img src="//eox.at/wp-content/uploads/2017/09/EOX_Logo.svg" alt="EOX" style="height:25px;margin-left:10px"/></a>
+    </h3>
+  </header>
+  <div id="app" style="width: 100%; top: 60px; bottom: 0; position: absolute; margin: 0; padding:0;"></div>
+  <script src="prism.js"></script>
+  <script>
+  var baseUrl = '//vhr18.pdas.prism.eox.at/';
+  var config = {
+    "settings": {
+        "rightPanelOpen": true,
+        "leftPanelOpen": false,
+        "leftPanelTabIndex": 0,
+        "tutorial": "once",
+        "uploadEnabled": false,
+        "selectFilesDownloadEnabled": false,
+        "downloadEnabled": true,
+        "searchEnabled" : true,
+        "searchDebounceTime": 500,
+        "language": "en",
+        "timeDomain": [
+            "2017-01-01T00:00:00Z",
+            "2019-12-31T23:59:59Z",
+        ],
+        "constrainTimeDomain": true,
+        "displayTimeDomain": [
+            "2017-01-01T00:00:00Z",
+            "2019-12-31T23:59:59Z",
+        ],
+        "displayInterval": "P1096D",
+        "selectedTimeDomain": [
+            "2018-08-01T00:00:00Z",
+            "2018-08-31T23:59:59Z",
+        ],
+        "selectableInterval": "P1096D",
+        "timeSliderControls": true,
+        "maxTooltips": 1,
+        "center": [12, 49],
+        "zoom": 5,
+        "maxZoom": 17,
+        "footprintFillColor": "rgba(0, 0, 0, 0.2)",
+        "footprintStrokeColor": "rgba(0, 0, 0, 1)",
+        "filterFillColor": "rgba(0, 165, 255, 0)",
+        "filterStrokeColor": "rgba(0, 165, 255, 1)",
+        "filterOutsideColor": "rgba(0, 0, 0, 0.5)",
+        "selectedFootprintFillColor": "rgba(255, 0, 0, 0.2)",
+        "selectedFootprintStrokeColor": "rgba(255, 0, 0, 1)",
+        "highlightFillColor": "rgba(246, 182, 0, 0.5)",
+        "highlightStrokeColor": "rgba(246, 182, 0, 1)",
+        "highlightStrokeWidth": 3,
+        "translations": {
+            "en": {
+                "Cloud Cover": "Cloud coverage (%)",
+                "Error: NoApplicableCode": "Search timed out. Please refine the filter criteria.",
+            }
+        },
+        "filterSettings": {
+            "time": {
+                "hidden": true,
+            }
+        },
+        "downloadFormats": [
+            {
+                "name": "TIFF",
+                "mimeType": "image/tiff"
+            },
+            {
+                "name": "JPEG 2000",
+                "mimeType": "image/jp2"
+            },
+            {
+                "name": "HDF",
+                "mimeType": "application/x-hdf",
+            },
+        ],
+        "downloadProjections": [
+            {
+                "name": "WGS-84",
+                "identifier": "http://www.opengis.net/def/crs/EPSG/0/4326"
+            },
+            {
+                "name": "Web Mercator",
+                "identifier": "http://www.opengis.net/def/crs/EPSG/0/3857"
+            },
+            {
+                "name": "ETRS89 / LAEA Europe",
+                "identifier": "http://www.opengis.net/def/crs/EPSG/0/3035"
+            }
+        ],
+        "downloadInterpolations": [
+            {
+              "name": "Bilinear",
+              "identifier": "http://www.opengis.net/def/interpolation/OGC/1/bilinear"
+            },
+            {
+                "name": "Nearest Neighbour",
+                "identifier": "http://www.opengis.net/def/interpolation/OGC/1/nearest-neighbour"
+            },
+            // {
+            //     "name": "Cubic",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/cubic"
+            // },
+            // {
+            //     "name": "Cubic Spline",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/cubic-spline"
+            // },
+            {
+                "name": "Average",
+                "identifier": "http://www.opengis.net/def/interpolation/OGC/1/average"
+            },
+            // {
+            //     "name": "Lanczos",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/lanczos"
+            // },
+            // {
+            //     "name": "Mode",
+            //     "identifier": "http://www.opengis.net/def/interpolation/OGC/1/mode"
+            // },
+        ]
+    },
+    "baseLayers": [
+        {
+            "id": "terrain-light",
+            "displayName": "EOX Terrain-Light",
+            "display": {
+                "id": "terrain-light",
+                "visible": true,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.s2maps-tiles.eu/wmts/",
+                    "//e.s2maps-tiles.eu/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "style": "default",
+                "attribution": "Terrain-Light { Data &copy; <a href=\"//www.openstreetmap.org/copyright\" target=\"_blank\">OpenStreetMap</a> contributors and <a href='javascript:;' onClick='toggle(terrain_attribution)'>others</a>, Rendering &copy; <a href=\"//eox.at\" target=\"_blank\">EOX</a> }"
+            }
+        }, {
+            "id": "terrain",
+            "displayName": "EOX Terrain",
+            "display": {
+                "id": "terrain",
+                "visible": false,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.s2maps-tiles.eu/wmts/",
+                    "//e.s2maps-tiles.eu/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "style": "default",
+                "attribution": "Terrain { Data &copy; <a href=\"//www.openstreetmap.org/copyright\" target=\"_blank\">OpenStreetMap</a> contributors and <a href='javascript:;' onClick='toggle(terrain_attribution)'>others</a>, Rendering &copy; <a href=\"//eox.at\" target=\"_blank\">EOX</a> }"
+            }
+        },  {
+            "id": "s2cloudless",
+            "displayName": "EOX Sentinel-2 cloudless",
+            "display": {
+                "id": "s2cloudless-2018",
+                "visible": false,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.s2maps-tiles.eu/wmts/",
+                    "//e.s2maps-tiles.eu/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "style": "default",
+                "attribution": "<a xmlns:dct=\"//purl.org/dc/terms/\" href=\"//s2maps.eu\" property=\"dct:title\">Sentinel-2 cloudless - //s2maps.eu</a> by <a xmlns:cc=\"//creativecommons.org/ns#\" href=\"s://eox.at\" property=\"cc:attributionName\" rel=\"cc:attributionURL\">EOX IT Services GmbH</a> (Contains modified Copernicus Sentinel data 2017 &amp; 2018)"
+            }
+        }
+    ],
+    "layers": [
+        {
+            "id": 'VHR_IMAGE_2018_Level_1',
+            "displayName": 'VHR Image 2018 Level 1',
+            "displayColor": '#eb3700',
+            "display": {
+                "id": 'VHR_IMAGE_2018_Level_1__TRUE_COLOR',
+                "visible": false,
+                "protocol": 'WMS',
+                "url": baseUrl + 'cache/ows',
+                "format": 'image/png',
+                "projection": 'EPSG:4326',
+                "style": '',
+                "useMilliseconds": false,
+                "maxZoom": 17,
+                "options": [{
+                    "name": "Style",
+                    "target": "display.extraParameters.LAYERS",
+                    "values": [{
+                      "label": "VHR Image 2018 True Color",
+                      "value": "VHR_IMAGE_2018_Level_1__TRUE_COLOR",
+                    }, {
+                      "label": "VHR Image 2018 True Color with masked validity",
+                      "value": "VHR_IMAGE_2018_Level_1__masked_validity",
+                    }, {
+                      "label": "VHR Image 2018 False Color",
+                      "value": "VHR_IMAGE_2018_Level_1__FALSE_COLOR",
+                    }, {
+                      "label": "VHR Image 2018 NDVI",
+                      "value": "VHR_IMAGE_2018_Level_1__NDVI",
+                    }]
+                }],
+            },
+            "search": {
+                "protocol": "OpenSearch",
+                "url": baseUrl + "opensearch/collections/VHR_IMAGE_2018_Level_1/",
+                "id": "VHR_IMAGE_2018_Level_1",
+                "histogramBinCount": 28,
+                "format": "application/atom+xml",
+                "method": "GET",
+                "histogramThreshold": 600,
+                "lightweightBuckets": true,
+                "searchLimit": 600,
+                "loadMore": 600,
+                "pageSize": 200,
+                "countZeroRecords": true,
+                "parameters": [
+                  {
+                      "max": 100,
+                      "min": 0,
+                      "range": true,
+                      "type": "eo:cloudCover",
+                      "title": "Cloud Coverage"
+                  },
+                ],
+                "parametersFilterSettings": {
+                    "collapsed": false,
+                },
+            },
+            "download": {
+                "protocol": "EO-WCS",
+                "url": baseUrl + "ows",
+                // "method": "GET",
+                "rewrite": {
+                  // add __coverage to the coverageId
+                  "from": "({{id}})",
+                  "to": "$1__coverage"
+                }
+            }
+        },
+        {
+            "id": 'VHR_IMAGE_2018_Level_3',
+            "displayName": 'VHR Image 2018 Level 3',
+            "displayColor": '#37eb00',
+            "display": {
+                "id": 'VHR_IMAGE_2018_Level_3__TRUE_COLOR',
+                "visible": true,
+                "protocol": 'WMS',
+                "url": baseUrl + 'cache/ows',
+                "format": 'image/png',
+                "projection": 'EPSG:4326',
+                "style": '',
+                "useMilliseconds": false,
+                "maxZoom": 17,
+                "options": [{
+                    "name": "Style",
+                    "target": "display.extraParameters.LAYERS",
+                    "values": [{
+                      "label": "VHR Image 2018 True Color",
+                      "value": "VHR_IMAGE_2018_Level_3__TRUE_COLOR",
+                    }, {
+                      "label": "VHR Image 2018 True Color with masked validity",
+                      "value": "VHR_IMAGE_2018_Level_3__masked_validity",
+                    }, {
+                      "label": "VHR Image 2018 False Color",
+                      "value": "VHR_IMAGE_2018_Level_3__FALSE_COLOR",
+                    }, {
+                      "label": "VHR Image 2018 NDVI",
+                      "value": "VHR_IMAGE_2018_Level_3__NDVI",
+                    }]
+                }],
+            },
+            "search": {
+                "protocol": "OpenSearch",
+                "url": baseUrl + "opensearch/collections/VHR_IMAGE_2018_Level_3/",
+                "id": "VHR_IMAGE_2018_Level_3",
+                "histogramBinCount": 28,
+                "format": "application/atom+xml",
+                "method": "GET",
+                "histogramThreshold": 600,
+                "lightweightBuckets": true,
+                "searchLimit": 600,
+                "loadMore": 600,
+                "pageSize": 200,
+                "countZeroRecords": true,
+                "parameters": [
+                  {
+                      "max": 100,
+                      "min": 0,
+                      "range": true,
+                      "type": "eo:cloudCover",
+                      "title": "Cloud Coverage"
+                  },
+                ],
+                "parametersFilterSettings": {
+                    "collapsed": false,
+                },
+            },
+            "download": {
+                "protocol": "EO-WCS",
+                "url": baseUrl + "ows",
+                // "method": "GET",
+                "rewrite": {
+                  // add __coverage to the coverageId
+                  "from": "({{id}})",
+                  "to": "$1__coverage"
+                }
+            }
+        },
+    ],
+    "overlayLayers": [
+        {
+            "id": "overlay_base",
+            "displayName": "EOX Borders and Labels",
+            "display": {
+                "id": "overlay_base",
+                "visible": false,
+                "protocol": "WMTS",
+                "urls": [
+                    "//d.tiles.maps.eox.at/wmts/",
+                    "//e.tiles.maps.eox.at/wmts/"
+                ],
+                "matrixSet": "WGS84",
+                "style": "default",
+                "format": "image/png",
+                "projection": "EPSG:4326",
+                "attribution": "Overlay { Data &copy; <a href=\"//www.openstreetmap.org/copyright\" target=\"_blank\">OpenStreetMap</a> contributors, Rendering &copy; <a href=\"//eox.at\" target=\"_blank\">EOX</a> and <a href=\"//github.com/mapserver/basemaps\" target=\"_blank\">MapServer</a> }"
+            }
+        },
+        {
+            "id": 'VHR_IMAGE_2018_Level_3__outlines',
+            "displayName": 'VHR Image 2018 Level 3 Outlines',
+            "displayColor": '#187465',
+            "display": {
+                "id": 'VHR_IMAGE_2018_Level_3__outlines',
+                "visible": false,
+                "protocol": 'WMS',
+                "url": baseUrl + 'ows',
+                "format": 'image/png',
+                "projection": 'EPSG:4326',
+                "style": 'red',
+                "useMilliseconds": false,
+                "maxZoom": 17,
+                "synchronizeTime": true,
+            },
+        },
+        {
+            "id": 'VHR_IMAGE_2018_Level_3__masked_validity__Full',
+            "displayName": 'VHR Image 2018 Level 3 True Color with masked validity Full Coverage',
+            "display": {
+                "id": 'VHR_IMAGE_2018_Level_3__masked_validity__Full',
+                "visible": false,
+                "protocol": 'WMS',
+                "url": baseUrl + 'cache/ows',
+                "format": 'image/png',
+                "projection": 'EPSG:4326',
+                "maxZoom": 17,
+                "synchronizeTime": false,
+            },
+        },
+        {
+            "id": 'VHR_IMAGE_2018_Level_3__Full',
+            "displayName": 'VHR Image 2018 Level 3 True Color Full Coverage',
+            "display": {
+                "id": 'VHR_IMAGE_2018_Level_3__Full',
+                "visible": false,
+                "protocol": 'WMS',
+                "url": baseUrl + 'cache/ows',
+                "format": 'image/png',
+                "projection": 'EPSG:4326',
+                "maxZoom": 17,
+                "synchronizeTime": false,
+            },
+        }
+    ]
+};
+
+    var app = new Application({
+      config: config,
+      container: document.getElementById('app'),
+    });
+    app.start();
+  </script>
+</body>
+</html>
diff --git a/config/vhr18_mapcache-dev.xml b/config/vhr18_mapcache-dev.xml
new file mode 100644
index 0000000000000000000000000000000000000000..27e720828974891cae4c9f7295442bb9425cde42
--- /dev/null
+++ b/config/vhr18_mapcache-dev.xml
@@ -0,0 +1,516 @@
+<mapcache>
+  <default_format>mixed</default_format>
+  <format name="mypng" type="PNG">
+    <compression>fast</compression>
+  </format>
+  <format name="myjpeg" type="JPEG">
+    <quality>75</quality>
+    <photometric>ycbcr</photometric>
+  </format>
+  <format name="mixed" type="MIXED">
+    <transparent>mypng</transparent>
+    <opaque>myjpeg</opaque>
+  </format>
+  <service type="wms" enabled="true">
+    <full_wms>assemble</full_wms>
+    <resample_mode>bilinear</resample_mode>
+    <format>mixed</format>
+    <maxsize>4096</maxsize>
+    <!-- <forwarding_rule name="wms">
+      <param name="SERVICE" type="values">WMS</param>
+      <http>
+        <url>http://localhost/browse/ows</url>
+      </http>
+    </forwarding_rule> -->
+  </service>
+  <service type="wmts" enabled="true"/>
+  <metadata>
+    <title>Pre-rendered View Service (pdas) developed by EOX</title>
+    <abstract>Pre-rendered View Service (pdas) developed by EOX</abstract>
+    <keyword>view service</keyword>
+    <accessconstraints>UNKNOWN</accessconstraints>
+    <fees>UNKNOWN</fees>
+    <contactname>Stephan Meissl</contactname>
+    <contactphone>Please contact via mail.</contactphone>
+    <contactfacsimile>None</contactfacsimile>
+    <contactorganization>EOX IT Services GmbH</contactorganization>
+    <contactcity>Vienna</contactcity>
+    <contactstateorprovince>Vienna</contactstateorprovince>
+    <contactpostcode>1090</contactpostcode>
+    <contactcountry>Austria</contactcountry>
+    <contactelectronicmailaddress>office@eox.at</contactelectronicmailaddress>
+    <contactposition>CTO</contactposition>
+    <providername>EOX</providername>
+    <providerurl>https://eox.at</providerurl>
+    <inspire_profile>true</inspire_profile>
+    <inspire_metadataurl>TBD</inspire_metadataurl>
+    <defaultlanguage>eng</defaultlanguage>
+    <language>eng</language>
+  </metadata>
+  <errors>empty_img</errors>
+  <lock_dir>/tmp</lock_dir>
+  <threaded_fetching>true</threaded_fetching>
+  <cache name="vhr18" type="sqlite3">
+    <dbfile>/tmp/cache.db</dbfile>
+  </cache>
+
+  <!-- SOURCES VHR_IMAGE_2018 -->
+  <source type="wms" name="vhr18_true_color">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018__TRUE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_validity">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018__masked_validity</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_false_color">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018__FALSE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_ndvi">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018__NDVI</LAYERS>
+        <STYLES>earth</STYLES>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+
+  <!-- TILESETS VHR_IMAGE_2018 -->
+  <tileset name="VHR_IMAGE_2018__TRUE_COLOR">
+    <metadata>
+      <title>VHR Image 2018 True Color</title>
+      <abstract>VHR Image 2018 True Color</abstract>
+    </metadata>
+    <source>vhr18_true_color</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018__masked_validity">
+    <metadata>
+      <title>VHR Image 2018 True Color with masked validity</title>
+      <abstract>VHR Image 2018 True Color with masked validity</abstract>
+    </metadata>
+    <source>vhr18_validity</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018__FALSE_COLOR">
+    <metadata>
+      <title>VHR Image 2018 False Color</title>
+      <abstract>VHR Image 2018 False Color</abstract>
+    </metadata>
+    <source>vhr18_false_color</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018__NDVI">
+    <metadata>
+      <title>VHR Image 2018 NDVI</title>
+      <abstract>VHR Image 2018 NDVI</abstract>
+    </metadata>
+    <source>vhr18_ndvi</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+
+  <!-- SOURCES VHR_IMAGE_2018_Level_1 -->
+  <source type="wms" name="vhr18_true_color_l1">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_1__TRUE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_validity_l1">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_1__masked_validity</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_false_color_l1">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_1__FALSE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_ndvi_l1">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_1__NDVI</LAYERS>
+        <STYLES>earth</STYLES>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+
+  <!-- TILESETS VHR_IMAGE_2018_Level_1 -->
+  <tileset name="VHR_IMAGE_2018_Level_1__TRUE_COLOR">
+    <metadata>
+      <title>VHR Image 2018 Level 1 True Color</title>
+      <abstract>VHR Image 2018 Level 1 True Color</abstract>
+    </metadata>
+    <source>vhr18_true_color_l1</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_1__masked_validity">
+    <metadata>
+      <title>VHR Image 2018 Level 1 True Color with masked validity</title>
+      <abstract>VHR Image 2018 Level 1 True Color with masked validity</abstract>
+    </metadata>
+    <source>vhr18_validity_l1</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_1__FALSE_COLOR">
+    <metadata>
+      <title>VHR Image 2018 Level 1 False Color</title>
+      <abstract>VHR Image 2018 Level 1 False Color</abstract>
+    </metadata>
+    <source>vhr18_false_color_l1</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_1__NDVI">
+    <metadata>
+      <title>VHR Image 2018 Level 1 NDVI</title>
+      <abstract>VHR Image 2018 Level 1 NDVI</abstract>
+    </metadata>
+    <source>vhr18_ndvi_l1</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+
+  <!-- SOURCES VHR_IMAGE_2018_Level_3 -->
+  <source type="wms" name="vhr18_true_color_l3">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_3__TRUE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_validity_l3">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_3__masked_validity</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_false_color_l3">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_3__FALSE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_ndvi_l3">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_3__NDVI</LAYERS>
+        <STYLES>earth</STYLES>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+
+  <!-- TILESETS VHR_IMAGE_2018_Level_3 -->
+  <tileset name="VHR_IMAGE_2018_Level_3__Full">
+    <metadata>
+      <title>VHR Image 2018 Level 3 True Color Full Coverage</title>
+      <abstract>VHR Image 2018 Level 3 True Color Full Coverage</abstract>
+    </metadata>
+    <source>vhr18_true_color_l3</source>
+    <cache>vhr18</cache>
+    <grid restricted_extent="-24.7 27.5 45 71.3" max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_3__masked_validity__Full">
+    <metadata>
+      <title>VHR Image 2018 Level 3 True Color with masked validity Full Coverage</title>
+      <abstract>VHR Image 2018 Level 3 True Color with masked validity Full Coverage</abstract>
+    </metadata>
+    <source>vhr18_validity_l3</source>
+    <cache>vhr18</cache>
+    <grid restricted_extent="-24.7 27.5 45 71.3" max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_3__TRUE_COLOR">
+    <metadata>
+      <title>VHR Image 2018 Level 3 True Color</title>
+      <abstract>VHR Image 2018 Level 3 True Color</abstract>
+    </metadata>
+    <source>vhr18_true_color_l3</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_3__masked_validity">
+    <metadata>
+      <title>VHR Image 2018 Level 3 True Color with masked validity</title>
+      <abstract>VHR Image 2018 Level 3 True Color with masked validity</abstract>
+    </metadata>
+    <source>vhr18_validity_l3</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_3__FALSE_COLOR">
+    <metadata>
+      <title>VHR Image 2018 Level 3 False Color</title>
+      <abstract>VHR Image 2018 Level 3 False Color</abstract>
+    </metadata>
+    <source>vhr18_false_color_l3</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_3__NDVI">
+    <metadata>
+      <title>VHR Image 2018 Level 3 NDVI</title>
+      <abstract>VHR Image 2018 Level 3 NDVI</abstract>
+    </metadata>
+    <source>vhr18_ndvi_l3</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+
+</mapcache>
diff --git a/config/vhr18_mapcache-ops.xml b/config/vhr18_mapcache-ops.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d7d6bec9942b7b12ea84a79358c1828f60e9ff09
--- /dev/null
+++ b/config/vhr18_mapcache-ops.xml
@@ -0,0 +1,520 @@
+<mapcache>
+  <default_format>mixed</default_format>
+  <format name="mypng" type="PNG">
+    <compression>fast</compression>
+  </format>
+  <format name="myjpeg" type="JPEG">
+    <quality>75</quality>
+    <photometric>ycbcr</photometric>
+  </format>
+  <format name="mixed" type="MIXED">
+    <transparent>mypng</transparent>
+    <opaque>myjpeg</opaque>
+  </format>
+  <service type="wms" enabled="true">
+    <full_wms>assemble</full_wms>
+    <resample_mode>bilinear</resample_mode>
+    <format>mixed</format>
+    <maxsize>4096</maxsize>
+    <!-- <forwarding_rule name="wms">
+      <param name="SERVICE" type="values">WMS</param>
+      <http>
+        <url>http://localhost/browse/ows</url>
+      </http>
+    </forwarding_rule> -->
+  </service>
+  <service type="wmts" enabled="true"/>
+  <metadata>
+    <title>Pre-rendered View Service (pdas) developed by EOX</title>
+    <abstract>Pre-rendered View Service (pdas) developed by EOX</abstract>
+    <url>https://vhr18.pdas.prism.eox.at/cache/ows</url>
+    <keyword>view service</keyword>
+    <accessconstraints>UNKNOWN</accessconstraints>
+    <fees>UNKNOWN</fees>
+    <contactname>Stephan Meissl</contactname>
+    <contactphone>Please contact via mail.</contactphone>
+    <contactfacsimile>None</contactfacsimile>
+    <contactorganization>EOX IT Services GmbH</contactorganization>
+    <contactcity>Vienna</contactcity>
+    <contactstateorprovince>Vienna</contactstateorprovince>
+    <contactpostcode>1090</contactpostcode>
+    <contactcountry>Austria</contactcountry>
+    <contactelectronicmailaddress>office@eox.at</contactelectronicmailaddress>
+    <contactposition>CTO</contactposition>
+    <providername>EOX</providername>
+    <providerurl>https://eox.at</providerurl>
+    <inspire_profile>true</inspire_profile>
+    <inspire_metadataurl>TBD</inspire_metadataurl>
+    <defaultlanguage>eng</defaultlanguage>
+    <language>eng</language>
+  </metadata>
+  <errors>empty_img</errors>
+  <lock_dir>/tmp</lock_dir>
+  <threaded_fetching>true</threaded_fetching>
+  <cache name="vhr18" type="rest">
+    <url>{{OS_STORAGE_URL}}/vhr18_cache/{tileset}/{grid}/{dim}/{z}/{x}/{y}.{ext}</url>
+    <headers>
+      <X-Auth-Token>{{OS_AUTH_TOKEN}}</X-Auth-Token>
+    </headers>
+  </cache>
+
+  <!-- SOURCES VHR_IMAGE_2018 -->
+  <source type="wms" name="vhr18_true_color">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018__TRUE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_validity">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018__masked_validity</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_false_color">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018__FALSE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_ndvi">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018__NDVI</LAYERS>
+        <STYLES>earth</STYLES>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+
+  <!-- TILESETS VHR_IMAGE_2018 -->
+  <tileset name="VHR_IMAGE_2018__TRUE_COLOR">
+    <metadata>
+      <title>VHR Image 2018 True Color</title>
+      <abstract>VHR Image 2018 True Color</abstract>
+    </metadata>
+    <source>vhr18_true_color</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018__masked_validity">
+    <metadata>
+      <title>VHR Image 2018 True Color with masked validity</title>
+      <abstract>VHR Image 2018 True Color with masked validity</abstract>
+    </metadata>
+    <source>vhr18_validity</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018__FALSE_COLOR">
+    <metadata>
+      <title>VHR Image 2018 False Color</title>
+      <abstract>VHR Image 2018 False Color</abstract>
+    </metadata>
+    <source>vhr18_false_color</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018__NDVI">
+    <metadata>
+      <title>VHR Image 2018 NDVI</title>
+      <abstract>VHR Image 2018 NDVI</abstract>
+    </metadata>
+    <source>vhr18_ndvi</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+
+  <!-- SOURCES VHR_IMAGE_2018_Level_1 -->
+  <source type="wms" name="vhr18_true_color_l1">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_1__TRUE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_validity_l1">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_1__masked_validity</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_false_color_l1">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_1__FALSE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_ndvi_l1">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_1__NDVI</LAYERS>
+        <STYLES>earth</STYLES>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+
+  <!-- TILESETS VHR_IMAGE_2018_Level_1 -->
+  <tileset name="VHR_IMAGE_2018_Level_1__TRUE_COLOR">
+    <metadata>
+      <title>VHR Image 2018 Level 1 True Color</title>
+      <abstract>VHR Image 2018 Level 1 True Color</abstract>
+    </metadata>
+    <source>vhr18_true_color_l1</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_1__masked_validity">
+    <metadata>
+      <title>VHR Image 2018 Level 1 True Color with masked validity</title>
+      <abstract>VHR Image 2018 Level 1 True Color with masked validity</abstract>
+    </metadata>
+    <source>vhr18_validity_l1</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_1__FALSE_COLOR">
+    <metadata>
+      <title>VHR Image 2018 Level 1 False Color</title>
+      <abstract>VHR Image 2018 Level 1 False Color</abstract>
+    </metadata>
+    <source>vhr18_false_color_l1</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_1__NDVI">
+    <metadata>
+      <title>VHR Image 2018 Level 1 NDVI</title>
+      <abstract>VHR Image 2018 Level 1 NDVI</abstract>
+    </metadata>
+    <source>vhr18_ndvi_l1</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+
+  <!-- SOURCES VHR_IMAGE_2018_Level_3 -->
+  <source type="wms" name="vhr18_true_color_l3">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_3__TRUE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_validity_l3">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_3__masked_validity</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_false_color_l3">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_3__FALSE_COLOR</LAYERS>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+  <source type="wms" name="vhr18_ndvi_l3">
+    <getmap>
+      <params>
+        <LAYERS>VHR_IMAGE_2018_Level_3__NDVI</LAYERS>
+        <STYLES>earth</STYLES>
+        <TRANSPARENT>true</TRANSPARENT>
+      </params>
+    </getmap>
+    <http>
+      <url>http://renderer/ows?</url>
+      <connection_timeout>10</connection_timeout>
+      <timeout>120</timeout>
+    </http>
+  </source>
+
+  <!-- TILESETS VHR_IMAGE_2018_Level_3 -->
+  <tileset name="VHR_IMAGE_2018_Level_3__Full">
+    <metadata>
+      <title>VHR Image 2018 Level 3 True Color Full Coverage</title>
+      <abstract>VHR Image 2018 Level 3 True Color Full Coverage</abstract>
+    </metadata>
+    <source>vhr18_true_color_l3</source>
+    <cache>vhr18</cache>
+    <grid restricted_extent="-24.7 27.5 45 71.3" max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_3__masked_validity__Full">
+    <metadata>
+      <title>VHR Image 2018 Level 3 True Color with masked validity Full Coverage</title>
+      <abstract>VHR Image 2018 Level 3 True Color with masked validity Full Coverage</abstract>
+    </metadata>
+    <source>vhr18_validity_l3</source>
+    <cache>vhr18</cache>
+    <grid restricted_extent="-24.7 27.5 45 71.3" max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_3__TRUE_COLOR">
+    <metadata>
+      <title>VHR Image 2018 Level 3 True Color</title>
+      <abstract>VHR Image 2018 Level 3 True Color</abstract>
+    </metadata>
+    <source>vhr18_true_color_l3</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_3__masked_validity">
+    <metadata>
+      <title>VHR Image 2018 Level 3 True Color with masked validity</title>
+      <abstract>VHR Image 2018 Level 3 True Color with masked validity</abstract>
+    </metadata>
+    <source>vhr18_validity_l3</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_3__FALSE_COLOR">
+    <metadata>
+      <title>VHR Image 2018 Level 3 False Color</title>
+      <abstract>VHR Image 2018 Level 3 False Color</abstract>
+    </metadata>
+    <source>vhr18_false_color_l3</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+  <tileset name="VHR_IMAGE_2018_Level_3__NDVI">
+    <metadata>
+      <title>VHR Image 2018 Level 3 NDVI</title>
+      <abstract>VHR Image 2018 Level 3 NDVI</abstract>
+    </metadata>
+    <source>vhr18_ndvi_l3</source>
+    <cache>vhr18</cache>
+    <grid max-cached-zoom="15" out-of-zoom-strategy="reassemble">WGS84</grid>
+    <format>mixed</format>
+    <metatile>1 1</metatile>
+    <expires>3600</expires>
+    <dimensions>
+      <assembly_type>stack</assembly_type>
+      <store_assemblies>false</store_assemblies>
+      <subdimensions_read_only>false</subdimensions_read_only>
+      <dimension type="sqlite" name="time" default="2017/2019" time="true">
+        <dbfile>/cache-db/vhr18_mapcache_cache.sqlite</dbfile>
+        <list_query>select strftime('%Y-%m-%dT%H:%M:%SZ', MIN(start_time))||'/'||strftime('%Y-%m-%dT%H:%M:%SZ', MAX(end_time)) from time</list_query>
+        <validate_query>select * from (select strftime('%Y-%m-%dT%H:%M:%SZ',start_time)||'/'||strftime('%Y-%m-%dT%H:%M:%SZ',end_time) as interval from time where (start_time&lt;datetime(:end_timestamp,'unixepoch') and (end_time&gt;datetime(:start_timestamp,'unixepoch')) or (start_time=end_time and start_time&lt;=datetime(:end_timestamp,'unixepoch') and end_time&gt;=datetime(:start_timestamp,'unixepoch'))) and ((maxx&gt;=:minx and minx&lt;=:maxx) or (maxx&gt;180 and (maxx-360.0)&gt;=:minx and (minx-360.0)&lt;=:maxx)) and maxy&gt;=:miny and miny&lt;=:maxy order by end_time desc limit 20) order by interval asc</validate_query>
+      </dimension>
+    </dimensions>
+  </tileset>
+
+</mapcache>
diff --git a/docker-compose.base.ops.yml b/docker-compose.base.ops.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8fb37ee3d2fed2f96f2f43e289549e3c92a4b939
--- /dev/null
+++ b/docker-compose.base.ops.yml
@@ -0,0 +1,35 @@
+version: "3.6"
+services:
+  reverse-proxy:
+    image: traefik:2.1
+    ports:
+      - target: 80
+        published: 80
+        protocol: tcp
+        mode: host
+      - target: 443
+        published: 443
+        protocol: tcp
+        mode: host
+    volumes:
+      - /var/run/docker.sock:/var/run/docker.sock
+      - traefik-data:/etc/traefik/acme
+      - ./traefik.yml:/etc/traefik/traefik.yml
+      - ./traefik-dynamic.yml:/etc/traefik/traefik-dynamic.yml
+    environment:
+      HTTP_PROXY: "http://172.30.252.68:3128"
+      HTTPS_PROXY: "http://172.30.252.68:3128"
+      NO_PROXY: "172.0.0.0/8,192.168.0.0/16,10.0.0.0/8"
+    deploy:
+      placement:
+        constraints: [node.role == manager]
+    networks:
+      - vhr18-extnet
+      - emg-extnet
+volumes:
+  traefik-data:
+networks:
+  vhr18-extnet:
+    name: vhr18-extnet
+  emg-extnet:
+    name: emg-extnet
diff --git a/docker-compose.emg.dev.yml b/docker-compose.emg.dev.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c0cf7b5fe871f6016e0ea485e9238e1a5a229973
--- /dev/null
+++ b/docker-compose.emg.dev.yml
@@ -0,0 +1,41 @@
+version: "3.6"
+services:
+  client:
+    ports:
+      - "80:80"
+    configs:
+      - source: client-dev
+        target: /usr/share/nginx/html/index.html
+  renderer:
+    ports:
+      - "81:80"
+      - "82:8080"
+    volumes:
+      - type: bind
+        source: ./data/
+        target: /data/
+  registrar:
+    volumes:
+      - type: bind
+        source: ./data/
+        target: /data/
+      - type: bind
+        source: ./core/
+        target: /core/
+  cache:
+    ports:
+      - "83:80"
+    volumes:
+      - type: bind
+        source: ./data/
+        target: /data/
+    configs:
+      - source: mapcache-dev
+        target: /mapcache-template.xml
+  preprocessor:
+    volumes:
+      - type: tmpfs
+        target: /tmp
+      - type: bind
+        source: ./preprocessor/
+        target: /preprocessor/
diff --git a/docker-compose.emg.ops.yml b/docker-compose.emg.ops.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5abf2cb20ae1c5101d07ab41e433e74cd86547ec
--- /dev/null
+++ b/docker-compose.emg.ops.yml
@@ -0,0 +1,118 @@
+version: "3.6"
+services:
+  database:
+    volumes:
+      - type: tmpfs
+        target: /dev/shm
+        tmpfs:
+          size: 536870912
+  renderer:
+    environment:
+      INSTALL_DIR: "/var/www/pdas/ops/"
+    deploy:
+      labels:
+        # router for basic auth based access (https)
+        - "traefik.http.routers.emg-renderer.rule=Host(`emg.pdas.prism.eox.at`, `a.emg.pdas.prism.eox.at`, `b.emg.pdas.prism.eox.at`, `c.emg.pdas.prism.eox.at`, `d.emg.pdas.prism.eox.at`, `e.emg.pdas.prism.eox.at`, `f.emg.pdas.prism.eox.at`, `g.emg.pdas.prism.eox.at`, `h.emg.pdas.prism.eox.at`) && PathPrefix(`/ows`, `/opensearch`, `/admin`)"
+        - "traefik.http.routers.emg-renderer.middlewares=auth@file,compress@file"
+        - "traefik.http.routers.emg-renderer.tls=true"
+        - "traefik.http.routers.emg-renderer.tls.certresolver=default"
+        - "traefik.http.routers.emg-renderer.entrypoints=https"
+        # router for basic auth based access (http)
+        - "traefik.http.routers.emg-renderer-redirect.rule=Host(`emg.pdas.prism.eox.at`, `a.emg.pdas.prism.eox.at`, `b.emg.pdas.prism.eox.at`, `c.emg.pdas.prism.eox.at`, `d.emg.pdas.prism.eox.at`, `e.emg.pdas.prism.eox.at`, `f.emg.pdas.prism.eox.at`, `g.emg.pdas.prism.eox.at`, `h.emg.pdas.prism.eox.at`) && PathPrefix(`/ows`, `/opensearch`, `/admin`)"
+        - "traefik.http.routers.emg-renderer-redirect.middlewares=redirect@file"
+        - "traefik.http.routers.emg-renderer-redirect.entrypoints=http"
+        # router for referrer based access (https)
+        - "traefik.http.routers.emg-renderer_referer.rule=Host(`emg.pdas.prism.eox.at`, `a.emg.pdas.prism.eox.at`, `b.emg.pdas.prism.eox.at`, `c.emg.pdas.prism.eox.at`, `d.emg.pdas.prism.eox.at`, `e.emg.pdas.prism.eox.at`, `f.emg.pdas.prism.eox.at`, `g.emg.pdas.prism.eox.at`, `h.emg.pdas.prism.eox.at`) && PathPrefix(`/ows`, `/opensearch`, `/admin`) && HeadersRegexp(`Referer`, `(https?://)?(panda.copernicus.eu|panda.cdsv3.eu|panda-demo.ondaprism.eu|emg.pdas.prism.eox.at)/?`)"
+        - "traefik.http.routers.emg-renderer_referer.middlewares=compress@file"
+        - "traefik.http.routers.emg-renderer_referer.tls=true"
+        - "traefik.http.routers.emg-renderer_referer.tls.certresolver=default"
+        - "traefik.http.routers.emg-renderer_referer.entrypoints=https"
+        # router for referrer based access (http)
+        - "traefik.http.routers.emg-renderer_referer-redirect.rule=Host(`emg.pdas.prism.eox.at`, `a.emg.pdas.prism.eox.at`, `b.emg.pdas.prism.eox.at`, `c.emg.pdas.prism.eox.at`, `d.emg.pdas.prism.eox.at`, `e.emg.pdas.prism.eox.at`, `f.emg.pdas.prism.eox.at`, `g.emg.pdas.prism.eox.at`, `h.emg.pdas.prism.eox.at`) && PathPrefix(`/ows`, `/opensearch`, `/admin`) && HeadersRegexp(`Referer`, `(https?://)?(panda.copernicus.eu|panda.cdsv3.eu|panda-demo.ondaprism.eu|emg.pdas.prism.eox.at)/?`)"
+        - "traefik.http.routers.emg-renderer_referer-redirect.middlewares=redirect@file"
+        - "traefik.http.routers.emg-renderer_referer-redirect.entrypoints=http"
+        # general
+        - "traefik.http.services.emg-renderer.loadbalancer.sticky=false"
+        - "traefik.http.services.emg-renderer.loadbalancer.server.port=80"
+        - "traefik.docker.network=pdas_extnet"
+        - "traefik.docker.lbswarm=true"
+        - "traefik.enable=true"
+      resources:
+        limits:
+          memory: 12G  #TODO 4G ended up with many processes in D state, supposedly because of swapping
+    networks:
+      - extnet
+  cache:
+    configs:
+      - source: mapcache-ops
+        target: /mapcache-template.xml
+    deploy:
+      labels:
+        - "traefik.http.middlewares.cache-stripprefix.stripprefix.prefixes=/cache"
+        # router for basic auth based access (https)
+        - "traefik.http.routers.emg-cache.rule=Host(`emg.pdas.prism.eox.at`, `a.emg.pdas.prism.eox.at`, `b.emg.pdas.prism.eox.at`, `c.emg.pdas.prism.eox.at`, `d.emg.pdas.prism.eox.at`, `e.emg.pdas.prism.eox.at`, `f.emg.pdas.prism.eox.at`, `g.emg.pdas.prism.eox.at`, `h.emg.pdas.prism.eox.at`) && PathPrefix(`/cache`)"
+        - "traefik.http.routers.emg-cache.middlewares=auth@file,cache-stripprefix,compress@file"
+        - "traefik.http.routers.emg-cache.tls=true"
+        - "traefik.http.routers.emg-cache.tls.certresolver=default"
+        - "traefik.http.routers.emg-cache.entrypoints=https"
+        # router for basic auth based access (http)
+        - "traefik.http.routers.emg-cache-redirect.rule=Host(`emg.pdas.prism.eox.at`, `a.emg.pdas.prism.eox.at`, `b.emg.pdas.prism.eox.at`, `c.emg.pdas.prism.eox.at`, `d.emg.pdas.prism.eox.at`, `e.emg.pdas.prism.eox.at`, `f.emg.pdas.prism.eox.at`, `g.emg.pdas.prism.eox.at`, `h.emg.pdas.prism.eox.at`) && PathPrefix(`/cache`)"
+        - "traefik.http.routers.emg-cache-redirect.middlewares=redirect@file"
+        - "traefik.http.routers.emg-cache-redirect.entrypoints=http"
+        # router for referrer based access (https)
+        - "traefik.http.routers.emg-cache_referer.rule=Host(`emg.pdas.prism.eox.at`, `a.emg.pdas.prism.eox.at`, `b.emg.pdas.prism.eox.at`, `c.emg.pdas.prism.eox.at`, `d.emg.pdas.prism.eox.at`, `e.emg.pdas.prism.eox.at`, `f.emg.pdas.prism.eox.at`, `g.emg.pdas.prism.eox.at`, `h.emg.pdas.prism.eox.at`) && PathPrefix(`/cache`) && HeadersRegexp(`Referer`, `(https?://)?(panda.copernicus.eu|panda.cdsv3.eu|panda-demo.ondaprism.eu|emg.pdas.prism.eox.at)/?`)"
+        - "traefik.http.routers.emg-cache_referer.middlewares=cache-stripprefix,compress@file"
+        - "traefik.http.routers.emg-cache_referer.tls=true"
+        - "traefik.http.routers.emg-cache_referer.tls.certresolver=default"
+        - "traefik.http.routers.emg-cache_referer.entrypoints=https"
+        # router for referrer based access (http)
+        - "traefik.http.routers.emg-cache_referer-redirect.rule=Host(`emg.pdas.prism.eox.at`, `a.emg.pdas.prism.eox.at`, `b.emg.pdas.prism.eox.at`, `c.emg.pdas.prism.eox.at`, `d.emg.pdas.prism.eox.at`, `e.emg.pdas.prism.eox.at`, `f.emg.pdas.prism.eox.at`, `g.emg.pdas.prism.eox.at`, `h.emg.pdas.prism.eox.at`) && PathPrefix(`/cache`) && HeadersRegexp(`Referer`, `(https?://)?(panda.copernicus.eu|panda.cdsv3.eu|panda-demo.ondaprism.eu|emg.pdas.prism.eox.at)/?`)"
+        - "traefik.http.routers.emg-cache_referer-redirect.middlewares=redirect@file"
+        - "traefik.http.routers.emg-cache_referer-redirect.entrypoints=http"
+        # general
+        - "traefik.http.services.emg-cache.loadbalancer.sticky=false"
+        - "traefik.http.services.emg-cache.loadbalancer.server.port=80"
+        - "traefik.docker.network=pdas_extnet"
+        - "traefik.docker.lbswarm=true"
+        - "traefik.enable=true"
+    networks:
+      - extnet
+  registrar:
+    environment:
+      INSTALL_DIR: "/var/www/pdas/ops/"
+  # redis-manager:
+  #   environment:
+  #     INSTALL_DIR: "/var/www/pdas/ops/"
+  client:
+    configs:
+      - source: client-ops
+        target: /usr/share/nginx/html/index.html
+    deploy:
+      labels:
+        # router for basic auth based access (https)
+        - "traefik.http.routers.emg-client.rule=Host(`emg.pdas.prism.eox.at`)"
+        - "traefik.http.routers.emg-client.middlewares=auth@file,compress@file"
+        - "traefik.http.routers.emg-client.tls=true"
+        - "traefik.http.routers.emg-client.tls.certresolver=default"
+        - "traefik.http.routers.emg-client.entrypoints=https"
+        # router for basic auth based access (http)
+        - "traefik.http.routers.emg-client-redirect.rule=Host(`emg.pdas.prism.eox.at`)"
+        - "traefik.http.routers.emg-client-redirect.middlewares=redirect@file"
+        - "traefik.http.routers.emg-client-redirect.entrypoints=http"
+        # general
+        - "traefik.http.services.emg-client.loadbalancer.sticky=false"
+        - "traefik.http.services.emg-client.loadbalancer.server.port=80"
+        - "traefik.docker.network=pdas_extnet"
+        - "traefik.docker.lbswarm=true"
+        - "traefik.enable=true"
+    networks:
+      - extnet
+  preprocessor:
+    volumes:
+      - type: bind
+        source: /var/vhr
+        target: /tmp
+networks:
+  extnet:
+    name: emg-extnet
+    external: true
diff --git a/docker-compose.emg.yml b/docker-compose.emg.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3c2fd623f2c4af169ccd5bc5d974b59a24813167
--- /dev/null
+++ b/docker-compose.emg.yml
@@ -0,0 +1,171 @@
+version: "3.6"
+services:
+  database:
+    image: mdillon/postgis:10
+    volumes:
+      - db-data:/var/lib/postgresql/data
+    env_file:
+      - env/emg.env
+      - env/emg_db.env
+    environment:
+      INSTANCE_ID: "prism-data-access-server_database"
+    deploy:
+      placement:
+        constraints: [node.role == manager]
+    networks:
+      - intnet
+  redis:
+    image: redis
+    volumes:
+      - redis-data:/data
+    deploy:
+      placement:
+        constraints: [node.role == manager]
+    networks:
+      - intnet
+  renderer:
+    image: registry.gitlab.eox.at/esa/prism/vs/pdas_core:latest
+    volumes:
+      - type: tmpfs
+        target: /tmp
+      - type: volume
+        source: cache-db
+        target: /cache-db
+      - type: volume
+        source: instance-data
+        target: /var/www/pdas
+    env_file:
+      - env/emg.env
+      - env/emg_db.env
+      - env/emg_django.env
+      - env/emg_obs.env
+    environment:
+      INSTANCE_ID: "prism-data-access-server_renderer"
+      INSTALL_DIR: "/var/www/pdas/dev/"
+    deploy:
+      replicas: 1
+    networks:
+      - intnet
+    command:
+      ["/wait-for-database.sh", "/run-httpd.sh"]
+  cache:
+    image: registry.gitlab.eox.at/esa/prism/vs/pdas_cache:latest
+    volumes:
+      - type: tmpfs
+        target: /tmp
+      - type: volume
+        source: cache-db
+        target: /cache-db
+    env_file:
+      - env/emg.env
+      - env/emg_obs.env
+    environment:
+      INSTANCE_ID: "prism-data-access-server_cache"
+      RENDERER_HOST: renderer
+    deploy:
+      replicas: 1
+    networks:
+      - intnet
+    command:
+      ["/run-httpd.sh"]
+  seeder:
+    image: registry.gitlab.eox.at/esa/prism/vs/pdas_cache:latest
+    volumes:
+      - type: tmpfs
+        target: /tmp
+      - type: volume
+        source: cache-db
+        target: /cache-db
+    env_file:
+      - env/emg.env
+      - env/emg_obs.env
+      - env/emg_redis.env
+    environment:
+      INSTANCE_ID: "prism-data-access-server_seeder"
+      RENDERER_HOST: renderer
+    deploy:
+      replicas: 0
+    networks:
+      - intnet
+    command:
+      ["/run-seeder.sh"]
+  preprocessor:
+    image: registry.gitlab.eox.at/esa/prism/vs/pdas_preprocessor:latest
+    env_file:
+      - env/emg.env
+      - env/emg_obs.env
+      - env/emg_redis.env
+    environment:
+      INSTANCE_ID: "prism-data-access-server_preprocessor"
+    deploy:
+      replicas: 1
+    networks:
+      - intnet
+    command:
+      ["/run-preprocessor.sh"]
+  registrar:
+    image: registry.gitlab.eox.at/esa/prism/vs/pdas_core:latest
+    volumes:
+      - type: tmpfs
+        target: /tmp
+      - type: volume
+        source: instance-data
+        target: /var/www/pdas
+    env_file:
+      - env/emg.env
+      - env/emg_db.env
+      - env/emg_obs.env
+      - env/emg_redis.env
+    environment:
+      INSTANCE_ID: "prism-data-access-server_registrar"
+      INSTALL_DIR: "/var/www/pdas/dev/"
+      SCALEFACTOR: "1"
+      IN_MEMORY: "false"
+    deploy:
+      replicas: 1
+    networks:
+      - intnet
+    command:
+      ["/wait-for-database.sh", "/run-registrar.sh"]
+  # redis-manager:
+  #   image: registry.gitlab.eox.at/esa/prism/vs/pdas_core:latest
+  #   volumes:
+  #     - type: tmpfs
+  #       target: /tmp
+  #     - type: volume
+  #       source: cache-db
+  #       target: /cache-db
+  #   env_file:
+  #     - env/emg.env
+  #     - env/emg_db.env
+  #     - env/emg_redis.env
+  #   environment:
+  #     INSTANCE_ID: "prism-data-access-server_redis-manager"
+  #     INSTALL_DIR: "/var/www/pdas/dev/"
+  #     CACHE_DB_PATH: "/cache-db/emg_mapcache_cache.sqlite"
+  #   deploy:
+  #     replicas: 0
+  #   networks:
+  #     - intnet
+  #   command:
+  #     ["/wait-for-database.sh", "/run-redis-manager.sh"]
+  client:
+    image: registry.gitlab.eox.at/esa/prism/vs/pdas_client:latest
+    deploy:
+      replicas: 1
+configs:
+  mapcache-dev:
+    file: ./config/emg_mapcache-dev.xml
+  mapcache-ops:
+    file: ./config/emg_mapcache-ops.xml
+  client-dev:
+    file: ./config/emg_index-dev.html
+  client-ops:
+    file: ./config/emg_index-ops.html
+volumes:
+  db-data:
+  redis-data:
+  cache-db:
+  instance-data:
+networks:
+  intnet:
diff --git a/docker-compose.vhr18.dev.yml b/docker-compose.vhr18.dev.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c0cf7b5fe871f6016e0ea485e9238e1a5a229973
--- /dev/null
+++ b/docker-compose.vhr18.dev.yml
@@ -0,0 +1,41 @@
+version: "3.6"
+services:
+  client:
+    ports:
+      - "80:80"
+    configs:
+      - source: client-dev
+        target: /usr/share/nginx/html/index.html
+  renderer:
+    ports:
+      - "81:80"
+      - "82:8080"
+    volumes:
+      - type: bind
+        source: ./data/
+        target: /data/
+  registrar:
+    volumes:
+      - type: bind
+        source: ./data/
+        target: /data/
+      - type: bind
+        source: ./core/
+        target: /core/
+  cache:
+    ports:
+      - "83:80"
+    volumes:
+      - type: bind
+        source: ./data/
+        target: /data/
+    configs:
+      - source: mapcache-dev
+        target: /mapcache-template.xml
+  preprocessor:
+    volumes:
+      - type: tmpfs
+        target: /tmp
+      - type: bind
+        source: ./preprocessor/
+        target: /preprocessor/
diff --git a/docker-compose.vhr18.ops.yml b/docker-compose.vhr18.ops.yml
new file mode 100644
index 0000000000000000000000000000000000000000..248ef7df568430d524789bee6f725cfc9f797ccc
--- /dev/null
+++ b/docker-compose.vhr18.ops.yml
@@ -0,0 +1,118 @@
+version: "3.6"
+services:
+  database:
+    volumes:
+      - type: tmpfs
+        target: /dev/shm
+        tmpfs:
+          size: 536870912
+  renderer:
+    environment:
+      INSTALL_DIR: "/var/www/pdas/ops/"
+    deploy:
+      labels:
+        # router for basic auth based access (https)
+        - "traefik.http.routers.vhr18-renderer.rule=Host(`vhr18.pdas.prism.eox.at`, `a.vhr18.pdas.prism.eox.at`, `b.vhr18.pdas.prism.eox.at`, `c.vhr18.pdas.prism.eox.at`, `d.vhr18.pdas.prism.eox.at`, `e.vhr18.pdas.prism.eox.at`, `f.vhr18.pdas.prism.eox.at`, `g.vhr18.pdas.prism.eox.at`, `h.vhr18.pdas.prism.eox.at`) && PathPrefix(`/ows`, `/opensearch`, `/admin`)"
+        - "traefik.http.routers.vhr18-renderer.middlewares=auth@file,compress@file"
+        - "traefik.http.routers.vhr18-renderer.tls=true"
+        - "traefik.http.routers.vhr18-renderer.tls.certresolver=default"
+        - "traefik.http.routers.vhr18-renderer.entrypoints=https"
+        # router for basic auth based access (http)
+        - "traefik.http.routers.vhr18-renderer-redirect.rule=Host(`vhr18.pdas.prism.eox.at`, `a.vhr18.pdas.prism.eox.at`, `b.vhr18.pdas.prism.eox.at`, `c.vhr18.pdas.prism.eox.at`, `d.vhr18.pdas.prism.eox.at`, `e.vhr18.pdas.prism.eox.at`, `f.vhr18.pdas.prism.eox.at`, `g.vhr18.pdas.prism.eox.at`, `h.vhr18.pdas.prism.eox.at`) && PathPrefix(`/ows`, `/opensearch`, `/admin`)"
+        - "traefik.http.routers.vhr18-renderer-redirect.middlewares=redirect@file"
+        - "traefik.http.routers.vhr18-renderer-redirect.entrypoints=http"
+        # router for referrer based access (https)
+        - "traefik.http.routers.vhr18-renderer_referer.rule=Host(`vhr18.pdas.prism.eox.at`, `a.vhr18.pdas.prism.eox.at`, `b.vhr18.pdas.prism.eox.at`, `c.vhr18.pdas.prism.eox.at`, `d.vhr18.pdas.prism.eox.at`, `e.vhr18.pdas.prism.eox.at`, `f.vhr18.pdas.prism.eox.at`, `g.vhr18.pdas.prism.eox.at`, `h.vhr18.pdas.prism.eox.at`) && PathPrefix(`/ows`, `/opensearch`, `/admin`) && HeadersRegexp(`Referer`, `(https?://)?(panda.copernicus.eu|panda.cdsv3.eu|panda-demo.ondaprism.eu|vhr18.pdas.prism.eox.at)/?`)"
+        - "traefik.http.routers.vhr18-renderer_referer.middlewares=compress@file"
+        - "traefik.http.routers.vhr18-renderer_referer.tls=true"
+        - "traefik.http.routers.vhr18-renderer_referer.tls.certresolver=default"
+        - "traefik.http.routers.vhr18-renderer_referer.entrypoints=https"
+        # router for referrer based access (http)
+        - "traefik.http.routers.vhr18-renderer_referer-redirect.rule=Host(`vhr18.pdas.prism.eox.at`, `a.vhr18.pdas.prism.eox.at`, `b.vhr18.pdas.prism.eox.at`, `c.vhr18.pdas.prism.eox.at`, `d.vhr18.pdas.prism.eox.at`, `e.vhr18.pdas.prism.eox.at`, `f.vhr18.pdas.prism.eox.at`, `g.vhr18.pdas.prism.eox.at`, `h.vhr18.pdas.prism.eox.at`) && PathPrefix(`/ows`, `/opensearch`, `/admin`) && HeadersRegexp(`Referer`, `(https?://)?(panda.copernicus.eu|panda.cdsv3.eu|panda-demo.ondaprism.eu|vhr18.pdas.prism.eox.at)/?`)"
+        - "traefik.http.routers.vhr18-renderer_referer-redirect.middlewares=redirect@file"
+        - "traefik.http.routers.vhr18-renderer_referer-redirect.entrypoints=http"
+        # general
+        - "traefik.http.services.vhr18-renderer.loadbalancer.sticky=false"
+        - "traefik.http.services.vhr18-renderer.loadbalancer.server.port=80"
+        - "traefik.docker.network=pdas_extnet"
+        - "traefik.docker.lbswarm=true"
+        - "traefik.enable=true"
+      resources:
+        limits:
+          memory: 12G  #TODO 4G ended up with many processes in D state, supposedly because of swapping
+    networks:
+      - extnet
+  cache:
+    configs:
+      - source: mapcache-ops
+        target: /mapcache-template.xml
+    deploy:
+      labels:
+        - "traefik.http.middlewares.cache-stripprefix.stripprefix.prefixes=/cache"
+        # router for basic auth based access (https)
+        - "traefik.http.routers.vhr18-cache.rule=Host(`vhr18.pdas.prism.eox.at`, `a.vhr18.pdas.prism.eox.at`, `b.vhr18.pdas.prism.eox.at`, `c.vhr18.pdas.prism.eox.at`, `d.vhr18.pdas.prism.eox.at`, `e.vhr18.pdas.prism.eox.at`, `f.vhr18.pdas.prism.eox.at`, `g.vhr18.pdas.prism.eox.at`, `h.vhr18.pdas.prism.eox.at`) && PathPrefix(`/cache`)"
+        - "traefik.http.routers.vhr18-cache.middlewares=auth@file,cache-stripprefix,compress@file"
+        - "traefik.http.routers.vhr18-cache.tls=true"
+        - "traefik.http.routers.vhr18-cache.tls.certresolver=default"
+        - "traefik.http.routers.vhr18-cache.entrypoints=https"
+        # router for basic auth based access (http)
+        - "traefik.http.routers.vhr18-cache-redirect.rule=Host(`vhr18.pdas.prism.eox.at`, `a.vhr18.pdas.prism.eox.at`, `b.vhr18.pdas.prism.eox.at`, `c.vhr18.pdas.prism.eox.at`, `d.vhr18.pdas.prism.eox.at`, `e.vhr18.pdas.prism.eox.at`, `f.vhr18.pdas.prism.eox.at`, `g.vhr18.pdas.prism.eox.at`, `h.vhr18.pdas.prism.eox.at`) && PathPrefix(`/cache`)"
+        - "traefik.http.routers.vhr18-cache-redirect.middlewares=redirect@file"
+        - "traefik.http.routers.vhr18-cache-redirect.entrypoints=http"
+        # router for referrer based access (https)
+        - "traefik.http.routers.vhr18-cache_referer.rule=Host(`vhr18.pdas.prism.eox.at`, `a.vhr18.pdas.prism.eox.at`, `b.vhr18.pdas.prism.eox.at`, `c.vhr18.pdas.prism.eox.at`, `d.vhr18.pdas.prism.eox.at`, `e.vhr18.pdas.prism.eox.at`, `f.vhr18.pdas.prism.eox.at`, `g.vhr18.pdas.prism.eox.at`, `h.vhr18.pdas.prism.eox.at`) && PathPrefix(`/cache`) && HeadersRegexp(`Referer`, `(https?://)?(panda.copernicus.eu|panda.cdsv3.eu|panda-demo.ondaprism.eu|vhr18.pdas.prism.eox.at)/?`)"
+        - "traefik.http.routers.vhr18-cache_referer.middlewares=cache-stripprefix,compress@file"
+        - "traefik.http.routers.vhr18-cache_referer.tls=true"
+        - "traefik.http.routers.vhr18-cache_referer.tls.certresolver=default"
+        - "traefik.http.routers.vhr18-cache_referer.entrypoints=https"
+        # router for referrer based access (http)
+        - "traefik.http.routers.vhr18-cache_referer-redirect.rule=Host(`vhr18.pdas.prism.eox.at`, `a.vhr18.pdas.prism.eox.at`, `b.vhr18.pdas.prism.eox.at`, `c.vhr18.pdas.prism.eox.at`, `d.vhr18.pdas.prism.eox.at`, `e.vhr18.pdas.prism.eox.at`, `f.vhr18.pdas.prism.eox.at`, `g.vhr18.pdas.prism.eox.at`, `h.vhr18.pdas.prism.eox.at`) && PathPrefix(`/cache`) && HeadersRegexp(`Referer`, `(https?://)?(panda.copernicus.eu|panda.cdsv3.eu|panda-demo.ondaprism.eu|vhr18.pdas.prism.eox.at)/?`)"
+        - "traefik.http.routers.vhr18-cache_referer-redirect.middlewares=redirect@file"
+        - "traefik.http.routers.vhr18-cache_referer-redirect.entrypoints=http"
+        # general
+        - "traefik.http.services.vhr18-cache.loadbalancer.sticky=false"
+        - "traefik.http.services.vhr18-cache.loadbalancer.server.port=80"
+        - "traefik.docker.network=pdas_extnet"
+        - "traefik.docker.lbswarm=true"
+        - "traefik.enable=true"
+    networks:
+      - extnet
+  registrar:
+    environment:
+      INSTALL_DIR: "/var/www/pdas/ops/"
+  # redis-manager:
+  #   environment:
+  #     INSTALL_DIR: "/var/www/pdas/ops/"
+  client:
+    configs:
+      - source: client-ops
+        target: /usr/share/nginx/html/index.html
+    deploy:
+      labels:
+        # router for basic auth based access (https)
+        - "traefik.http.routers.vhr18-client.rule=Host(`vhr18.pdas.prism.eox.at`)"
+        - "traefik.http.routers.vhr18-client.middlewares=auth@file,compress@file"
+        - "traefik.http.routers.vhr18-client.tls=true"
+        - "traefik.http.routers.vhr18-client.tls.certresolver=default"
+        - "traefik.http.routers.vhr18-client.entrypoints=https"
+        # router for basic auth based access (http)
+        - "traefik.http.routers.vhr18-client-redirect.rule=Host(`vhr18.pdas.prism.eox.at`)"
+        - "traefik.http.routers.vhr18-client-redirect.middlewares=redirect@file"
+        - "traefik.http.routers.vhr18-client-redirect.entrypoints=http"
+        # general
+        - "traefik.http.services.vhr18-client.loadbalancer.sticky=false"
+        - "traefik.http.services.vhr18-client.loadbalancer.server.port=80"
+        - "traefik.docker.network=pdas_extnet"
+        - "traefik.docker.lbswarm=true"
+        - "traefik.enable=true"
+    networks:
+      - extnet
+  preprocessor:
+    volumes:
+      - type: bind
+        source: /var/vhr
+        target: /tmp
+networks:
+  extnet:
+    name: vhr18-extnet
+    external: true
diff --git a/docker-compose.vhr18.yml b/docker-compose.vhr18.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9a4f3388edd820ea383490c106e08cf99b22130d
--- /dev/null
+++ b/docker-compose.vhr18.yml
@@ -0,0 +1,171 @@
+version: "3.6"
+services:
+  database:
+    image: mdillon/postgis:10
+    volumes:
+      - db-data:/var/lib/postgresql/data
+    env_file:
+      - env/vhr18.env
+      - env/vhr18_db.env
+    environment:
+      INSTANCE_ID: "prism-data-access-server_database"
+    deploy:
+      placement:
+        constraints: [node.role == manager]
+    networks:
+      - intnet
+  redis:
+    image: redis
+    volumes:
+      - redis-data:/data
+    deploy:
+      placement:
+        constraints: [node.role == manager]
+    networks:
+      - intnet
+  renderer:
+    image: registry.gitlab.eox.at/esa/prism/vs/pdas_core:latest
+    volumes:
+      - type: tmpfs
+        target: /tmp
+      - type: volume
+        source: cache-db
+        target: /cache-db
+      - type: volume
+        source: instance-data
+        target: /var/www/pdas
+    env_file:
+      - env/vhr18.env
+      - env/vhr18_db.env
+      - env/vhr18_django.env
+      - env/vhr18_obs.env
+    environment:
+      INSTANCE_ID: "prism-data-access-server_renderer"
+      INSTALL_DIR: "/var/www/pdas/dev/"
+    deploy:
+      replicas: 1
+    networks:
+      - intnet
+    command:
+      ["/wait-for-database.sh", "/run-httpd.sh"]
+  cache:
+    image: registry.gitlab.eox.at/esa/prism/vs/pdas_cache:latest
+    volumes:
+      - type: tmpfs
+        target: /tmp
+      - type: volume
+        source: cache-db
+        target: /cache-db
+    env_file:
+      - env/vhr18.env
+      - env/vhr18_obs.env
+    environment:
+      INSTANCE_ID: "prism-data-access-server_cache"
+      RENDERER_HOST: renderer
+    deploy:
+      replicas: 1
+    networks:
+      - intnet
+    command:
+      ["/run-httpd.sh"]
+  seeder:
+    image: registry.gitlab.eox.at/esa/prism/vs/pdas_cache:latest
+    volumes:
+      - type: tmpfs
+        target: /tmp
+      - type: volume
+        source: cache-db
+        target: /cache-db
+    env_file:
+      - env/vhr18.env
+      - env/vhr18_obs.env
+      - env/vhr18_redis.env
+    environment:
+      INSTANCE_ID: "prism-data-access-server_seeder"
+      RENDERER_HOST: renderer
+    deploy:
+      replicas: 0
+    networks:
+      - intnet
+    command:
+      ["/run-seeder.sh"]
+  preprocessor:
+    image: registry.gitlab.eox.at/esa/prism/vs/pdas_preprocessor:latest
+    env_file:
+      - env/vhr18.env
+      - env/vhr18_obs.env
+      - env/vhr18_redis.env
+    environment:
+      INSTANCE_ID: "prism-data-access-server_preprocessor"
+    deploy:
+      replicas: 1
+    networks:
+      - intnet
+    command:
+      ["/run-preprocessor.sh"]
+  registrar:
+    image: registry.gitlab.eox.at/esa/prism/vs/pdas_core:latest
+    volumes:
+      - type: tmpfs
+        target: /tmp
+      - type: volume
+        source: instance-data
+        target: /var/www/pdas
+    env_file:
+      - env/vhr18.env
+      - env/vhr18_db.env
+      - env/vhr18_obs.env
+      - env/vhr18_redis.env
+    environment:
+      INSTANCE_ID: "prism-data-access-server_registrar"
+      INSTALL_DIR: "/var/www/pdas/dev/"
+      SCALEFACTOR: "1"
+      IN_MEMORY: "false"
+    deploy:
+      replicas: 1
+    networks:
+      - intnet
+    command:
+      ["/wait-for-database.sh", "/run-registrar.sh"]
+  # redis-manager:
+  #   image: registry.gitlab.eox.at/esa/prism/vs/pdas_core:latest
+  #   volumes:
+  #     - type: tmpfs
+  #       target: /tmp
+  #     - type: volume
+  #       source: cache-db
+  #       target: /cache-db
+  #   env_file:
+  #     - env/vhr18.env
+  #     - env/vhr18_db.env
+  #     - env/vhr18_redis.env
+  #   environment:
+  #     INSTANCE_ID: "prism-data-access-server_redis-manager"
+  #     INSTALL_DIR: "/var/www/pdas/dev/"
+  #     CACHE_DB_PATH: "/cache-db/vhr18_mapcache_cache.sqlite"
+  #   deploy:
+  #     replicas: 0
+  #   networks:
+  #     - intnet
+  #   command:
+  #     ["/wait-for-database.sh", "/run-redis-manager.sh"]
+  client:
+    image: registry.gitlab.eox.at/esa/prism/vs/pdas_client:latest
+    deploy:
+      replicas: 1
+configs:
+  mapcache-dev:
+    file: ./config/vhr18_mapcache-dev.xml
+  mapcache-ops:
+    file: ./config/vhr18_mapcache-ops.xml
+  client-dev:
+    file: ./config/vhr18_index-dev.html
+  client-ops:
+    file: ./config/vhr18_index-ops.html
+volumes:
+  db-data:
+  redis-data:
+  cache-db:
+  instance-data:
+networks:
+  intnet:
diff --git a/env/emg.env b/env/emg.env
new file mode 100644
index 0000000000000000000000000000000000000000..75b1cd21157bbc350b10c8586afe561b1a939936
--- /dev/null
+++ b/env/emg.env
@@ -0,0 +1,4 @@
+COLLECTION=Emergency
+
+GDAL_DISABLE_READDIR_ON_OPEN=TRUE
+CPL_VSIL_CURL_ALLOWED_EXTENSIONS=.TIF,.tif,.xml
diff --git a/env/emg_redis.env b/env/emg_redis.env
new file mode 100644
index 0000000000000000000000000000000000000000..45dcfdf80c5dbf4b1dcdfccaba2671ee2b57d7ef
--- /dev/null
+++ b/env/emg_redis.env
@@ -0,0 +1,10 @@
+REDIS_HOST=redis
+REDIS_PORT=6379
+
+REDIS_QUEUE_KEY=seed_queue
+
+REDIS_PREPROCESS_QUEUE_KEY=preprocess_queue
+REDIS_REGISTER_QUEUE_KEY=register_queue
+REDIS_REGISTERED_SET_KEY=registered_set
+REDIS_SET_KEY=registered_set
+REDIS_SEED_QUEUE_KEY=seed_queue
diff --git a/env/vhr18.env b/env/vhr18.env
new file mode 100644
index 0000000000000000000000000000000000000000..8c04b00bf71965ffbbdfcbebfe83df770577fdcb
--- /dev/null
+++ b/env/vhr18.env
@@ -0,0 +1,4 @@
+COLLECTION=VHR_IMAGE_2018
+
+GDAL_DISABLE_READDIR_ON_OPEN=TRUE
+CPL_VSIL_CURL_ALLOWED_EXTENSIONS=.TIF,.tif,.xml
diff --git a/env/vhr18_redis.env b/env/vhr18_redis.env
new file mode 100644
index 0000000000000000000000000000000000000000..45dcfdf80c5dbf4b1dcdfccaba2671ee2b57d7ef
--- /dev/null
+++ b/env/vhr18_redis.env
@@ -0,0 +1,10 @@
+REDIS_HOST=redis
+REDIS_PORT=6379
+
+REDIS_QUEUE_KEY=seed_queue
+
+REDIS_PREPROCESS_QUEUE_KEY=preprocess_queue
+REDIS_REGISTER_QUEUE_KEY=register_queue
+REDIS_REGISTERED_SET_KEY=registered_set
+REDIS_SET_KEY=registered_set
+REDIS_SEED_QUEUE_KEY=seed_queue
diff --git a/traefik-dynamic.yml b/traefik-dynamic.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ba98c73d32af893942e58a2fb8432848dde2fc80
--- /dev/null
+++ b/traefik-dynamic.yml
@@ -0,0 +1,27 @@
+http:
+  routers:
+    api:
+      rule: Host(`traefik.pvs.prism.eox.at`)
+      entrypoints:
+        - https
+      service: api@internal
+      middlewares:
+        - apiauth
+      tls:
+        certResolver: default
+  middlewares:
+    apiauth:
+      basicAuth:
+        realm: "PRISM View Service (PVS)"
+        users:
+          - "admin:$apr1$yMS.cUYq$OPndZ1FdVJOcMPJWMUyH31"
+    auth:
+      basicAuth:
+        realm: "PRISM View Service (PVS)"
+        users:
+          - "pvs:$apr1$9rZwIkiK$DefOrsMTP70vKagihFsyO1"
+    compress:
+      compress: {}
+    redirect:
+      redirectScheme:
+        scheme: https
diff --git a/traefik.yml b/traefik.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e0c90fffffa7ab724ec5ed02ec3025fba758100c
--- /dev/null
+++ b/traefik.yml
@@ -0,0 +1,31 @@
+global:
+  checkNewVersion: false
+  sendAnonymousUsage: false
+entryPoints:
+  http:
+    address: :80
+  https:
+    address: :443
+providers:
+  providersThrottleDuration: 5s
+  file:
+    filename: /etc/traefik/traefik-dynamic.yml
+  docker:
+    watch: true
+    endpoint: unix:///var/run/docker.sock
+    swarmMode: true
+    swarmModeRefreshSeconds: 15s
+    exposedByDefault: false
+    network: pdas_extnet
+api:
+  dashboard: true
+log:
+  level: WARN
+accessLog: {}
+certificatesResolvers:
+  default:
+    acme:
+      email: office@eox.at
+      storage: /etc/traefik/acme/acme.json
+      httpChallenge:
+        entryPoint: http