diff --git a/docker-compose/archiver-timescale.yml b/docker-compose/archiver-timescale.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8b7c78263f658ee2bd3d2a25ee9ad681550d6d84
--- /dev/null
+++ b/docker-compose/archiver-timescale.yml
@@ -0,0 +1,77 @@
+version: '2'
+
+services:
+  archiver-timescale:
+    image: timescaledb
+    build:
+        context: timescaledb
+    container_name: ${CONTAINER_NAME_PREFIX}archiver-timescale
+    networks:
+      - control
+    ports:
+      - "5432:5432/tcp"
+    depends_on:
+      - databaseds
+    environment:
+      - POSTGRES_PASSWORD=password
+      - TANGO_HOST=${TANGO_HOST}
+    logging:
+      driver: syslog
+      options:
+        syslog-address: udp://${LOG_HOSTNAME}:1514
+        syslog-format: rfc3164
+        tag: "{{.Name}}"
+    restart: unless-stopped
+  
+  hdbppts-cm:
+    image: hdbppts-cm
+    build:
+        context: ../docker/tango/tango-archiver-ts
+    networks:
+      - control
+    container_name: ${CONTAINER_NAME_PREFIX}hdbppts-cm
+    depends_on:
+      - databaseds
+      - dsconfig
+      - archiver-timescale
+    environment:
+      - TANGO_HOST=${TANGO_HOST}
+      - HdbManager=archiving/hdbppts/confmanager01
+    command: >
+      /bin/bash -c "
+      wait-for-it.sh archiver-timescale:5432 --timeout=30 --strict --
+      wait-for-it.sh ${TANGO_HOST} --timeout=30 --strict --
+            hdbppcm-srv 02"
+    logging:
+        driver: syslog
+        options:
+          syslog-address: udp://${LOG_HOSTNAME}:1514
+          syslog-format: rfc3164
+          tag: "{{.Name}}"
+  
+  hdbppts-es:
+    image: hdbppts-es
+    build:
+        context: ../docker/tango/tango-archiver-ts
+    networks:
+      - control
+    container_name: ${CONTAINER_NAME_PREFIX}hdbppts-es
+    depends_on:
+      - databaseds
+      - dsconfig
+      - archiver-timescale
+    environment:
+      - TANGO_HOST=${TANGO_HOST}
+      - HdbManager=archiving/hdbppts/confmanager01
+    command: >
+      /bin/bash -c "
+      wait-for-it.sh archiver-timescale:5432 --timeout=30 --strict --
+      wait-for-it.sh ${TANGO_HOST} --timeout=30 --strict --
+            hdbppes-srv 02"
+    logging:
+        driver: syslog
+        options:
+          syslog-address: udp://${LOG_HOSTNAME}:1514
+          syslog-format: rfc3164
+          tag: "{{.Name}}"
+    restart: unless-stopped
diff --git a/docker-compose/archiver.yml b/docker-compose/archiver.yml
index 1a56516c707ba965486432e753e45e24c14cbdc0..e7d2b531779a47ee57abc9bc66e2308468382098 100644
--- a/docker-compose/archiver.yml
+++ b/docker-compose/archiver.yml
@@ -24,7 +24,7 @@ services:
         syslog-format: rfc3164
         tag: "{{.Name}}"
     restart: unless-stopped
-
+  
   hdbpp-es:
       image: ${LOCAL_DOCKER_REGISTRY_HOST}/${LOCAL_DOCKER_REGISTRY_USER}/tango-archiver:2021-05-28
       networks:
diff --git a/docker-compose/timescaledb/Dockerfile b/docker-compose/timescaledb/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..5a8ecde23c3d69b9b665ac28dea3d5d7d5714ffd
--- /dev/null
+++ b/docker-compose/timescaledb/Dockerfile
@@ -0,0 +1,9 @@
+FROM timescale/timescaledb:latest-pg12
+
+
+COPY resources/01_admin.sql docker-entrypoint-initdb.d/002_admin.sql
+COPY resources/02_hdb_schema.sql docker-entrypoint-initdb.d/003_hdb_schema.sql
+COPY resources/03_hdb_roles.sql docker-entrypoint-initdb.d/004_hdb_roles.sql
+COPY resources/04_hdb_ext_aggregates.sql docker-entrypoint-initdb.d/005_hdb_ext_aggregates.sql
+COPY resources/05_lofar_views.sql docker-entrypoint-initdb.d/006_lofar_views.sql
+COPY resources/06_cleanup.sql docker-entrypoint-initdb.d/007_cleanup.sql
diff --git a/docker-compose/timescaledb/README.md b/docker-compose/timescaledb/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..75f9446ef254658f8282bcf6255c87aa0f39a94b
--- /dev/null
+++ b/docker-compose/timescaledb/README.md
@@ -0,0 +1,18 @@
+# TimescaleDB Docker Image
+
+The Dockerfile in this directory allows to create a container with a PostrgreSQL-Timescale DBMS (https://www.timescale.com/), and then initialise it with the DB schema required by the Tango Archiving framework.
+
+The main image is pulled from the official PostgreSQL repository in the Docker Hub (https://hub.docker.com/_/postgres). This image offers several features to customize and extend itself.
+
+## Initialization scripts
+
+If you would like to do additional initialization in an image derived from the Postgres official one, add one or more *.sql, *.sql.gz, or *.sh scripts under /docker-entrypoint-initdb.d (creating the directory if necessary). After the entrypoint calls initdb to create the default postgres user and database, it will run any *.sql files, run any executable *.sh scripts, and source any non-executable *.sh scripts found in that directory to do further initialization before starting the service.
+
+The script files in the directory /docker-entrypoint-initdb.d are sequentially executed following their preempted number in the filename. Hence, the first ones (000_install_timescaledb.sh and 001_timescaledb_tune.sh) are provided by default. 
+The next ones have been pulled from the official Tango repository in order to create the desired DB schema. These files are in the 'resources' directory and they have been pulled from Tango-Hdbpp_Timescale_Project (https://github.com/tango-controls-hdbpp/hdbpp-timescale-project/tree/master/resources/schema):
+- admin.sql creates the admin user that will create the tables
+- hdb_schema.sql creates the standard Tango Archiving DB (This is the only MANDATORY script)
+- hdb_roles.sql creates additional roles
+- hdb_ext_aggregates.sql creates the continuous aggregate views (https://docs.timescale.com/timescaledb/latest/how-to-guides/continuous-aggregates/)
+- cleanup.sql strips the SUPERUSER trait from hdb_admin
+Last updates on these scripts are dated to August 2021 (more info can be found at https://github.com/tango-controls-hdbpp/hdbpp-timescale-project/blob/master/doc/db-schema-config.md)
diff --git a/docker-compose/timescaledb/resources/01_admin.sql b/docker-compose/timescaledb/resources/01_admin.sql
new file mode 100644
index 0000000000000000000000000000000000000000..51848f45f786225fe226bf21be024599b73534eb
--- /dev/null
+++ b/docker-compose/timescaledb/resources/01_admin.sql
@@ -0,0 +1,4 @@
+CREATE ROLE hdb_admin WITH LOGIN PASSWORD 'hdbpp';
+ALTER USER hdb_admin CREATEDB;
+ALTER USER hdb_admin CREATEROLE;
+ALTER USER hdb_admin SUPERUSER;
diff --git a/docker-compose/timescaledb/resources/02_hdb_schema.sql b/docker-compose/timescaledb/resources/02_hdb_schema.sql
new file mode 100644
index 0000000000000000000000000000000000000000..db73bf2a4c8888171dded345bf806a676e6fb6a3
--- /dev/null
+++ b/docker-compose/timescaledb/resources/02_hdb_schema.sql
@@ -0,0 +1,730 @@
+-- -----------------------------------------------------------------------------
+-- This file is part of the hdbpp-timescale-project
+--
+-- Copyright (C) : 2014-2019
+--   European Synchrotron Radiation Facility
+--   BP 220, Grenoble 38043, FRANCE
+--
+-- libhdb++timescale is free software: you can redistribute it and/or modify
+-- it under the terms of the Lesser GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- libhdb++timescale is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the Lesser
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the Lesser GNU General Public License
+-- along with libhdb++timescale.  If not, see <http://www.gnu.org/licenses/>.
+-- -----------------------------------------------------------------------------
+
+-- Create the hdb database and use it
+CREATE DATABASE hdb;
+\c hdb
+
+-- Add the timescaledb extension (Important)
+CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
+
+-------------------------------------------------------------------------------
+DO $$ BEGIN
+    CREATE DOMAIN uchar AS numeric(3) -- ALT smallint
+        CHECK(VALUE >= 0 AND VALUE <= 255);
+EXCEPTION
+    WHEN duplicate_object THEN null;
+END $$;
+
+DO $$ BEGIN
+    CREATE DOMAIN ushort AS numeric(5)  -- ALT integer
+        CHECK(VALUE >= 0 AND VALUE <= 65535);
+EXCEPTION
+    WHEN duplicate_object THEN null;
+END $$;
+
+DO $$ BEGIN
+    CREATE DOMAIN ulong AS numeric(10) -- ALT bigint
+        CHECK(VALUE >= 0 AND VALUE <= 4294967295);
+EXCEPTION
+    WHEN duplicate_object THEN null;
+END $$;
+
+DO $$ BEGIN
+    CREATE DOMAIN ulong64 AS numeric(20)
+        CHECK(VALUE >= 0 AND VALUE <= 18446744073709551615);
+EXCEPTION
+    WHEN duplicate_object THEN null;
+END $$;
+-------------------------------------------------------------------------------
+
+-- Mappings for ths Tango Data Type (used in att_conf)
+CREATE TABLE IF NOT EXISTS att_conf_type (
+    att_conf_type_id serial NOT NULL,
+    type text NOT NULL UNIQUE,
+    type_num smallint NOT NULL UNIQUE,
+    PRIMARY KEY (att_conf_type_id)
+);
+
+COMMENT ON TABLE att_conf_type is 'Attribute data type';
+
+INSERT INTO att_conf_type (type, type_num) VALUES
+('DEV_BOOLEAN', 1),('DEV_SHORT', 2),('DEV_LONG', 3),('DEV_FLOAT', 4),
+('DEV_DOUBLE', 5),('DEV_USHORT', 6),('DEV_ULONG', 7),('DEV_STRING', 8),
+('DEV_STATE', 19),('DEV_UCHAR',22),('DEV_LONG64', 23),('DEV_ULONG64', 24),
+('DEV_ENCODED', 28),('DEV_ENUM', 30);
+
+-- Mappings for ths Tango Data Format Type (used in att_conf)
+CREATE TABLE IF NOT EXISTS att_conf_format (
+    att_conf_format_id serial NOT NULL,
+    format text NOT NULL UNIQUE,
+    format_num smallint NOT NULL UNIQUE,
+    PRIMARY KEY (att_conf_format_id)
+);
+
+COMMENT ON TABLE att_conf_format is 'Attribute format type';
+
+INSERT INTO att_conf_format (format, format_num) VALUES
+('SCALAR', 0),('SPECTRUM', 1),('IMAGE', 2);
+
+-- Mappings for the Tango Data Write Type (used in att_conf)
+CREATE TABLE IF NOT EXISTS att_conf_write (
+    att_conf_write_id serial NOT NULL,
+    write text NOT NULL UNIQUE,
+    write_num smallint NOT NULL UNIQUE,
+    PRIMARY KEY (att_conf_write_id)
+);
+
+COMMENT ON TABLE att_conf_write is 'Attribute write type';
+
+INSERT INTO att_conf_write (write, write_num) VALUES
+('READ', 0),('READ_WITH_WRITE', 1),('WRITE', 2),('READ_WRITE', 3);
+
+-- The att_conf table contains the primary key for all data tables, the
+-- att_conf_id. Expanded on the normal hdb++ tables since we add information
+-- about the type.
+CREATE TABLE IF NOT EXISTS att_conf (
+    att_conf_id serial NOT NULL,
+    att_name text NOT NULL,
+    att_conf_type_id smallint NOT NULL,
+    att_conf_format_id smallint NOT NULL,
+    att_conf_write_id smallint NOT NULL,
+    table_name text NOT NULL,
+    cs_name text NOT NULL DEFAULT '',
+    domain text NOT NULL DEFAULT '',
+    family text NOT NULL DEFAULT '',
+    member text NOT NULL DEFAULT '',
+    name text NOT NULL DEFAULT '',
+    ttl int,
+    hide boolean DEFAULT false,
+    PRIMARY KEY (att_conf_id),
+    FOREIGN KEY (att_conf_type_id) REFERENCES att_conf_type (att_conf_type_id),
+    FOREIGN KEY (att_conf_format_id) REFERENCES att_conf_format (att_conf_format_id),
+    FOREIGN KEY (att_conf_write_id) REFERENCES att_conf_write (att_conf_write_id),
+    UNIQUE (att_name)
+);
+
+COMMENT ON TABLE att_conf is 'Attribute Configuration Table';
+
+-------------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS att_history_event (
+    att_history_event_id serial NOT NULL,
+    event text NOT NULL,
+    PRIMARY KEY (att_history_event_id)
+);
+
+COMMENT ON TABLE att_history_event IS 'Attribute history events description';
+CREATE INDEX IF NOT EXISTS att_history_att_history_event_id_idx ON att_history_event (att_history_event_id);
+
+CREATE TABLE IF NOT EXISTS att_history (
+    att_conf_id integer NOT NULL,
+    att_history_event_id integer NOT NULL,
+    event_time timestamp WITH TIME ZONE,
+    details json,
+    PRIMARY KEY (att_conf_id, event_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_history_event_id) REFERENCES att_history_event (att_history_event_id)
+);
+
+COMMENT ON TABLE att_history is 'Attribute Configuration Events History Table';
+
+-------------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS att_parameter (
+    att_conf_id integer NOT NULL,
+    recv_time timestamp WITH TIME ZONE NOT NULL,
+    label text NOT NULL DEFAULT '',
+    unit text NOT NULL DEFAULT '',
+    standard_unit text NOT NULL DEFAULT '',
+    display_unit text NOT NULL DEFAULT '',
+    format text NOT NULL DEFAULT '',
+    archive_rel_change text NOT NULL DEFAULT '',
+    archive_abs_change text NOT NULL DEFAULT '',
+    archive_period text NOT NULL DEFAULT '',
+    description text NOT NULL DEFAULT '',
+    details json,
+    enum_labels text[] NOT NULL DEFAULT ARRAY[]::text[],
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id)
+);
+
+-- ALTER statement if the table was already created
+-- ALTER TABLE att_parameter ADD COLUMN enum_labels text[] NOT NULL DEFAULT ARRAY[]::text[];
+
+COMMENT ON TABLE att_parameter IS 'Attribute configuration parameters';
+CREATE INDEX IF NOT EXISTS att_parameter_recv_time_idx ON att_parameter (recv_time);
+CREATE INDEX IF NOT EXISTS att_parameter_att_conf_id_idx ON  att_parameter (att_conf_id);
+SELECT create_hypertable('att_parameter', 'recv_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+-------------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS att_error_desc (
+    att_error_desc_id serial NOT NULL,
+    error_desc text NOT NULL,
+    PRIMARY KEY (att_error_desc_id),
+    UNIQUE (error_desc)
+);
+
+COMMENT ON TABLE att_error_desc IS 'Error Description Table';
+
+-------------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS att_scalar_devboolean (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r boolean,
+    value_w boolean,
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_scalar_devboolean IS 'Scalar Boolean Values Table';
+CREATE INDEX IF NOT EXISTS att_scalar_devboolean_att_conf_id_idx ON att_scalar_devboolean (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_scalar_devboolean_att_conf_id_data_time_idx ON att_scalar_devboolean (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_scalar_devboolean', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_array_devboolean (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r boolean[],
+    value_w boolean[],
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_array_devboolean IS 'Array Boolean Values Table';
+CREATE INDEX IF NOT EXISTS att_array_devboolean_att_conf_id_idx ON att_array_devboolean (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_array_devboolean_att_conf_id_data_time_idx ON att_array_devboolean (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_array_devboolean', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_scalar_devuchar (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r uchar,
+    value_w uchar,
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_scalar_devuchar IS 'Scalar UChar Values Table';
+CREATE INDEX IF NOT EXISTS att_scalar_devuchar_att_conf_id_idx ON att_scalar_devuchar (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_scalar_devuchar_att_conf_id_data_time_idx ON att_scalar_devuchar (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_scalar_devuchar', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_array_devuchar (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r uchar[],
+    value_w uchar[],
+    quality smallint,
+    details json,
+    att_error_desc_id integer,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_array_devuchar IS 'Array UChar Values Table';
+CREATE INDEX IF NOT EXISTS att_array_devuchar_att_conf_id_idx ON att_array_devuchar (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_array_devuchar_att_conf_id_data_time_idx ON att_array_devuchar (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_array_devuchar', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_scalar_devshort (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r smallint,
+    value_w smallint,
+    quality smallint,
+    details json,
+    att_error_desc_id integer,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_scalar_devshort IS 'Scalar Short Values Table';
+CREATE INDEX IF NOT EXISTS att_scalar_devshort_att_conf_id_idx ON att_scalar_devshort (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_scalar_devshort_att_conf_id_data_time_idx ON att_scalar_devshort (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_scalar_devshort', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_array_devshort (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r smallint[],
+    value_w smallint[],
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_array_devshort IS 'Array Short Values Table';
+CREATE INDEX IF NOT EXISTS att_array_devshort_att_conf_id_idx ON att_array_devshort (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_array_devshort_att_conf_id_data_time_idx ON att_array_devshort (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_array_devshort', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_scalar_devushort (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r ushort,
+    value_w ushort,
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_scalar_devushort IS 'Scalar UShort Values Table';
+CREATE INDEX IF NOT EXISTS att_scalar_devushort_att_conf_id_idx ON att_scalar_devushort (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_scalar_devushort_att_conf_id_data_time_idx ON att_scalar_devushort (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_scalar_devushort', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_array_devushort (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r ushort[],
+    value_w ushort[],
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_array_devushort IS 'Array UShort Values Table';
+CREATE INDEX IF NOT EXISTS att_array_devushort_att_conf_id_idx ON att_array_devushort (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_array_devushort_att_conf_id_data_time_idx ON att_array_devushort (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_array_devushort', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_scalar_devlong (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r integer,
+    value_w integer,
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_scalar_devlong IS 'Scalar Long Values Table';
+CREATE INDEX IF NOT EXISTS att_scalar_devlong_att_conf_id_idx ON att_scalar_devlong (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_scalar_devlong_att_conf_id_data_time_idx ON att_scalar_devlong (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_scalar_devlong', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_array_devlong (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r integer[],
+    value_w integer[],
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_array_devlong IS 'Array Long Values Table';
+CREATE INDEX IF NOT EXISTS att_array_devlong_att_conf_id_idx ON att_array_devlong (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_array_devlong_att_conf_id_data_time_idx ON att_array_devlong (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_array_devlong', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_scalar_devulong (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r ulong,
+    value_w ulong,
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_scalar_devulong IS 'Scalar ULong Values Table';
+CREATE INDEX IF NOT EXISTS att_scalar_devulong_att_conf_id_idx ON att_scalar_devulong (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_scalar_devulong_att_conf_id_data_time_idx ON att_scalar_devulong (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_scalar_devulong', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_array_devulong (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r ulong[],
+    value_w ulong[],
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_array_devulong IS 'Array ULong Values Table';
+CREATE INDEX IF NOT EXISTS att_array_devulong_att_conf_id_idx ON att_array_devulong (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_array_devulong_att_conf_id_data_time_idx ON att_array_devulong (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_array_devulong', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_scalar_devlong64 (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r bigint,
+    value_w bigint,
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_scalar_devlong64 IS 'Scalar Long64 Values Table';
+CREATE INDEX IF NOT EXISTS att_scalar_devlong64_att_conf_id_idx ON att_scalar_devlong64 (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_scalar_devlong64_att_conf_id_data_time_idx ON att_scalar_devlong64 (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_scalar_devlong64', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_array_devlong64 (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r bigint[],
+    value_w bigint[],
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_array_devlong64 IS 'Array Long64 Values Table';
+CREATE INDEX IF NOT EXISTS att_array_devlong64_att_conf_id_idx ON att_array_devlong64 (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_array_devlong64_att_conf_id_data_time_idx ON att_array_devlong64 (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_array_devlong64', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_scalar_devulong64 (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r ulong64,
+    value_w ulong64,
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_scalar_devulong64 IS 'Scalar ULong64 Values Table';
+CREATE INDEX IF NOT EXISTS att_scalar_devulong64_att_conf_id_idx ON att_scalar_devulong64 (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_scalar_devulong64_att_conf_id_data_time_idx ON att_scalar_devulong64 (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_scalar_devulong64', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_array_devulong64 (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r ulong64[],
+    value_w ulong64[],
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_array_devulong64 IS 'Array ULong64 Values Table';
+CREATE INDEX IF NOT EXISTS att_array_devulong64_att_conf_id_idx ON att_array_devulong64 (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_array_devulong64_att_conf_id_data_time_idx ON att_array_devulong64 (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_array_devulong64', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_scalar_devfloat (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r real,
+    value_w real,
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_scalar_devfloat IS 'Scalar Float Values Table';
+CREATE INDEX IF NOT EXISTS att_scalar_devfloat_att_conf_id_idx ON att_scalar_devfloat (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_scalar_devfloat_att_conf_id_data_time_idx ON att_scalar_devfloat (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_scalar_devfloat', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_array_devfloat (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r real[],
+    value_w real[],
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_array_devfloat IS 'Array Float Values Table';
+CREATE INDEX IF NOT EXISTS att_array_devfloat_att_conf_id_idx ON att_array_devfloat (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_array_devfloat_att_conf_id_data_time_idx ON att_array_devfloat (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_array_devfloat', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_scalar_devdouble (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r double precision,
+    value_w double precision,
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_scalar_devdouble IS 'Scalar Double Values Table';
+CREATE INDEX IF NOT EXISTS att_scalar_devdouble_att_conf_id_idx ON att_scalar_devdouble (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_scalar_devdouble_att_conf_id_data_time_idx ON att_scalar_devdouble (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_scalar_devdouble', 'data_time', chunk_time_interval => interval '14 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_array_devdouble (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r double precision[],
+    value_w double precision[],
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_array_devdouble IS 'Array Double Values Table';
+CREATE INDEX IF NOT EXISTS att_array_devdouble_att_conf_id_idx ON att_array_devdouble (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_array_devdouble_att_conf_id_data_time_idx ON att_array_devdouble (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_array_devdouble', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_scalar_devstring (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r text,
+    value_w text,
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_scalar_devstring IS 'Scalar String Values Table';
+CREATE INDEX IF NOT EXISTS att_scalar_devstring_att_conf_id_idx ON att_scalar_devstring (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_scalar_devstring_att_conf_id_data_time_idx ON att_scalar_devstring (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_scalar_devstring', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_array_devstring (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r text[],
+    value_w text[],
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_array_devstring IS 'Array String Values Table';
+CREATE INDEX IF NOT EXISTS att_array_devstring_att_conf_id_idx ON att_array_devstring (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_array_devstring_att_conf_id_data_time_idx ON att_array_devstring (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_array_devstring', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_scalar_devstate (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r integer,
+    value_w integer,
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_scalar_devstate IS 'Scalar State Values Table';
+CREATE INDEX IF NOT EXISTS att_scalar_devstate_att_conf_id_idx ON att_scalar_devstate (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_scalar_devstate_att_conf_id_data_time_idx ON att_scalar_devstate (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_scalar_devstate', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_array_devstate (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r integer[],
+    value_w integer[],
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_array_devstate IS 'Array State Values Table';
+CREATE INDEX IF NOT EXISTS att_array_devstate_att_conf_id_idx ON att_array_devstate (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_array_devstate_att_conf_id_data_time_idx ON att_array_devstate (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_array_devstate', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_scalar_devencoded (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r bytea,
+    value_w bytea,
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+COMMENT ON TABLE att_scalar_devencoded IS 'Scalar DevEncoded Values Table';
+CREATE INDEX IF NOT EXISTS att_scalar_devencoded_att_conf_id_idx ON att_scalar_devencoded (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_scalar_devencoded_att_conf_id_data_time_idx ON att_scalar_devencoded (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_scalar_devencoded', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+CREATE TABLE IF NOT EXISTS att_array_devencoded (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r bytea[],
+    value_w bytea[],
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+COMMENT ON TABLE att_array_devencoded IS 'Array DevEncoded Values Table';
+CREATE INDEX IF NOT EXISTS att_array_devencoded_att_conf_id_idx ON att_array_devencoded (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_array_devencoded_att_conf_id_data_time_idx ON att_array_devencoded (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_array_devencoded', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+-- The Enum tables are unique in that they store a value and text label for 
+-- each data point
+CREATE TABLE IF NOT EXISTS att_scalar_devenum (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r_label text,
+    value_r smallint,
+    value_w_label text,
+    value_w smallint,
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_scalar_devenum IS 'Scalar Enum Values Table';
+CREATE INDEX IF NOT EXISTS att_scalar_devenum_att_conf_id_idx ON att_scalar_devenum (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_scalar_devenum_att_conf_id_data_time_idx ON att_scalar_devenum (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_scalar_devenum', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+-- Trigger to set the enum_labels
+CREATE OR REPLACE FUNCTION set_enum_label() RETURNS TRIGGER AS $$
+DECLARE
+BEGIN
+    IF NEW.value_r IS NOT NULL THEN
+        NEW.value_r_label := (SELECT enum_labels[NEW.value_r + 1] FROM att_parameter WHERE att_conf_id=NEW.att_conf_id ORDER BY recv_time DESC LIMIT 1);
+    END IF;
+    IF NEW.value_w IS NOT NULL THEN
+        NEW.value_w_label := (SELECT enum_labels[NEW.value_w + 1] FROM att_parameter WHERE att_conf_id=NEW.att_conf_id ORDER BY recv_time DESC LIMIT 1);
+    END IF;
+    RETURN NEW;
+END
+$$ LANGUAGE plpgsql;
+
+CREATE TRIGGER enum_label_trigger BEFORE INSERT ON att_scalar_devenum FOR EACH ROW EXECUTE PROCEDURE set_enum_label();
+
+CREATE TABLE IF NOT EXISTS att_array_devenum (
+    att_conf_id integer NOT NULL,
+    data_time timestamp WITH TIME ZONE NOT NULL,
+    value_r_label text[],
+    value_r smallint[],
+    value_w_label text[],
+    value_w smallint[],
+    quality smallint,
+    att_error_desc_id integer,
+    details json,
+    PRIMARY KEY (att_conf_id, data_time),
+    FOREIGN KEY (att_conf_id) REFERENCES att_conf (att_conf_id),
+    FOREIGN KEY (att_error_desc_id) REFERENCES att_error_desc (att_error_desc_id)
+);
+
+COMMENT ON TABLE att_array_devenum IS 'Array Enum Values Table';
+CREATE INDEX IF NOT EXISTS att_array_devenum_att_conf_id_idx ON att_array_devenum (att_conf_id);
+CREATE INDEX IF NOT EXISTS att_array_devenum_att_conf_id_data_time_idx ON att_array_devenum (att_conf_id,data_time DESC);
+SELECT create_hypertable('att_array_devenum', 'data_time', chunk_time_interval => interval '28 day', create_default_indexes => FALSE);
+
+-- Trigger to set the enum_labels
+CREATE OR REPLACE FUNCTION set_enum_label_array() RETURNS TRIGGER AS $$
+DECLARE
+BEGIN
+    IF NEW.value_r IS NOT NULL THEN
+	WITH enum_labels AS (
+		SELECT enum_labels FROM att_parameter WHERE att_conf_id=NEW.att_conf_id ORDER BY recv_time DESC limit 1
+	)
+        SELECT array_agg(res) FROM (SELECT enum_labels[UNNEST(NEW.value_r)+ 1] FROM enum_labels) as res INTO NEW.value_r_label;
+    END IF;
+    IF NEW.value_w IS NOT NULL THEN
+	WITH enum_labels AS (
+		SELECT enum_labels FROM att_parameter WHERE att_conf_id=NEW.att_conf_id ORDER BY recv_time DESC limit 1
+	)
+        SELECT array_agg(res) FROM (SELECT enum_labels[UNNEST(NEW.value_w)+ 1] FROM enum_labels) as res INTO NEW.value_w_label;
+    END IF;
+    RETURN NEW;
+END
+$$ LANGUAGE plpgsql;
+
+CREATE TRIGGER enum_label_trigger BEFORE INSERT ON att_array_devenum FOR EACH ROW EXECUTE PROCEDURE set_enum_label_array();
diff --git a/docker-compose/timescaledb/resources/03_hdb_roles.sql b/docker-compose/timescaledb/resources/03_hdb_roles.sql
new file mode 100644
index 0000000000000000000000000000000000000000..0faa15175600b5411a9095e434ae87f743e095c9
--- /dev/null
+++ b/docker-compose/timescaledb/resources/03_hdb_roles.sql
@@ -0,0 +1,41 @@
+-- -----------------------------------------------------------------------------
+-- This file is part of the hdbpp-timescale-project
+--
+-- Copyright (C) : 2014-2019
+--   European Synchrotron Radiation Facility
+--   BP 220, Grenoble 38043, FRANCE
+--
+-- libhdb++timescale is free software: you can redistribute it and/or modify
+-- it under the terms of the Lesser GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- libhdb++timescale is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the Lesser
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the Lesser GNU General Public License
+-- along with libhdb++timescale.  If not, see <http://www.gnu.org/licenses/>.
+-- -----------------------------------------------------------------------------
+
+-- Setup roles to access the hdb database
+CREATE ROLE readonly;
+CREATE ROLE readwrite;
+
+-- Permissions - readonly
+GRANT CONNECT ON DATABASE hdb TO readonly;
+GRANT USAGE ON SCHEMA public TO readonly;
+GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
+ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
+
+-- Permissions - readwrite
+GRANT CONNECT ON DATABASE hdb TO readwrite;
+GRANT USAGE ON SCHEMA public TO readwrite;
+GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO readwrite;
+ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO readwrite;
+GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO readwrite;
+ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE ON SEQUENCES TO readwrite;
+GRANT ALL ON SCHEMA public TO readwrite;
+GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO readwrite;
+GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO readwrite;
diff --git a/docker-compose/timescaledb/resources/04_hdb_ext_aggregates.sql b/docker-compose/timescaledb/resources/04_hdb_ext_aggregates.sql
new file mode 100644
index 0000000000000000000000000000000000000000..7c3484299f5ab982be7021bd5d48491f08ec67e2
--- /dev/null
+++ b/docker-compose/timescaledb/resources/04_hdb_ext_aggregates.sql
@@ -0,0 +1,1292 @@
+-- -----------------------------------------------------------------------------
+-- This file is part of the hdbpp-timescale-project
+--
+-- Copyright (C) : 2014-2019
+--   European Synchrotron Radiation Facility
+--   BP 220, Grenoble 38043, FRANCE
+--
+-- libhdb++timescale is free software: you can redistribute it and/or modify
+-- it under the terms of the Lesser GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- libhdb++timescale is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the Lesser
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the Lesser GNU General Public License
+-- along with libhdb++timescale.  If not, see <http://www.gnu.org/licenses/>.
+-- -----------------------------------------------------------------------------
+
+-- Continuous aggregates views for the attributes.
+\c hdb
+-- Double attributes
+CREATE MATERIALIZED VIEW cagg_scalar_devdouble_1min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, count_nan_r, mean_r, min_r, max_r, stddev_r
+		, count_w, count_nan_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 min', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), sum(
+                    CASE 
+                        WHEN value_r='NaN' THEN 1 
+                        WHEN value_r='infinity' THEN 1 
+                        WHEN value_r='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+		, count(value_w), sum(
+                    CASE 
+                        WHEN value_w='NaN' THEN 1 
+                        WHEN value_w='infinity' THEN 1 
+                        WHEN value_w='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+       	FROM att_scalar_devdouble
+        GROUP BY time_bucket('1 min', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devdouble_10min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, count_nan_r, mean_r, min_r, max_r, stddev_r
+		, count_w, count_nan_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('10 mins', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), sum(
+                    CASE 
+                        WHEN value_r='NaN' THEN 1 
+                        WHEN value_r='infinity' THEN 1 
+                        WHEN value_r='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+		, count(value_w), sum(
+                    CASE 
+                        WHEN value_w='NaN' THEN 1 
+                        WHEN value_w='infinity' THEN 1 
+                        WHEN value_w='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+       	FROM att_scalar_devdouble
+        GROUP BY time_bucket('10 mins', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devdouble_1hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, count_nan_r, mean_r, min_r, max_r, stddev_r
+		, count_w, count_nan_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 hour', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), sum(
+                    CASE 
+                        WHEN value_r='NaN' THEN 1 
+                        WHEN value_r='infinity' THEN 1 
+                        WHEN value_r='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+		, count(value_w), sum(
+                    CASE 
+                        WHEN value_w='NaN' THEN 1 
+                        WHEN value_w='infinity' THEN 1 
+                        WHEN value_w='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+       	FROM att_scalar_devdouble 
+        GROUP BY time_bucket('1 hour', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devdouble_8hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, count_nan_r, mean_r, min_r, max_r, stddev_r
+		, count_w, count_nan_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('8 hours', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), sum(
+                    CASE 
+                        WHEN value_r='NaN' THEN 1 
+                        WHEN value_r='infinity' THEN 1 
+                        WHEN value_r='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+		, count(value_w), sum(
+                    CASE 
+                        WHEN value_w='NaN' THEN 1 
+                        WHEN value_w='infinity' THEN 1 
+                        WHEN value_w='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+       	FROM att_scalar_devdouble 
+        GROUP BY time_bucket('8 hours', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devdouble_1day(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, count_nan_r, mean_r, min_r, max_r, stddev_r
+		, count_w, count_nan_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 day', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), sum(
+                    CASE 
+                        WHEN value_r='NaN' THEN 1 
+                        WHEN value_r='infinity' THEN 1 
+                        WHEN value_r='-infinity' THEN 1
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+		, count(value_w), sum(
+                    CASE 
+                        WHEN value_w='NaN' THEN 1 
+                        WHEN value_w='infinity' THEN 1 
+                        WHEN value_w='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+       	FROM att_scalar_devdouble 
+        GROUP BY time_bucket('1 day', data_time), att_conf_id;
+
+-- Float attributes
+CREATE MATERIALIZED VIEW cagg_scalar_devfloat_1min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 min', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), sum(
+                    CASE 
+                        WHEN value_r='NaN' THEN 1 
+                        WHEN value_r='infinity' THEN 1 
+                        WHEN value_r='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+		, count(value_w), sum(
+                    CASE 
+                        WHEN value_w='NaN' THEN 1 
+                        WHEN value_w='infinity' THEN 1 
+                        WHEN value_w='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+       	FROM att_scalar_devfloat 
+        GROUP BY time_bucket('1 min', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devfloat_10min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('10 mins', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), sum(
+                    CASE 
+                        WHEN value_r='NaN' THEN 1 
+                        WHEN value_r='infinity' THEN 1 
+                        WHEN value_r='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+		, count(value_w), sum(
+                    CASE 
+                        WHEN value_w='NaN' THEN 1 
+                        WHEN value_w='infinity' THEN 1 
+                        WHEN value_w='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+       	FROM att_scalar_devfloat 
+        GROUP BY time_bucket('10 mins', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devfloat_1hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 hour', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), sum(
+                    CASE 
+                        WHEN value_r='NaN' THEN 1 
+                        WHEN value_r='infinity' THEN 1 
+                        WHEN value_r='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+		, count(value_w), sum(
+                    CASE 
+                        WHEN value_w='NaN' THEN 1 
+                        WHEN value_w='infinity' THEN 1 
+                        WHEN value_w='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+       	FROM att_scalar_devfloat 
+        GROUP BY time_bucket('1 hour', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devfloat_8hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('8 hours', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), sum(
+                    CASE 
+                        WHEN value_r='NaN' THEN 1 
+                        WHEN value_r='infinity' THEN 1 
+                        WHEN value_r='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+		, count(value_w), sum(
+                    CASE 
+                        WHEN value_w='NaN' THEN 1 
+                        WHEN value_w='infinity' THEN 1 
+                        WHEN value_w='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+       	FROM att_scalar_devfloat 
+        GROUP BY time_bucket('8 hours', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devfloat_1day(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 day', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), sum(
+                    CASE 
+                        WHEN value_r='NaN' THEN 1 
+                        WHEN value_r='infinity' THEN 1 
+                        WHEN value_r='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_r='NaN' THEN null 
+                        WHEN value_r='infinity' THEN null 
+                        WHEN value_r='-infinity' THEN null 
+                        ELSE value_r 
+                    END)::numeric)::float8
+		, count(value_w), sum(
+                    CASE 
+                        WHEN value_w='NaN' THEN 1 
+                        WHEN value_w='infinity' THEN 1 
+                        WHEN value_w='-infinity' THEN 1 
+                        ELSE 0 
+                    END)
+                , avg(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+                , min(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , max(
+                    CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)
+                , stddev(
+                    (CASE 
+                        WHEN value_w='NaN' THEN null 
+                        WHEN value_w='infinity' THEN null 
+                        WHEN value_w='-infinity' THEN null 
+                        ELSE value_w 
+                    END)::numeric)::float8
+       	FROM att_scalar_devfloat 
+        GROUP BY time_bucket('1 day', data_time), att_conf_id;
+
+-- Long Attributes
+CREATE MATERIALIZED VIEW cagg_scalar_devlong_1min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 min', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devlong         
+        GROUP BY time_bucket('1 min', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devlong_10min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('10 mins', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devlong 
+        GROUP BY time_bucket('10 mins', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devlong_1hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 hour', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devlong 
+        GROUP BY time_bucket('1 hour', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devlong_8hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('8 hours', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devlong 
+        GROUP BY time_bucket('8 hours', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devlong_1day(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 day', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devlong 
+        GROUP BY time_bucket('1 day', data_time), att_conf_id;
+
+-- Long 64 attributes
+CREATE MATERIALIZED VIEW cagg_scalar_devlong64_1min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 min', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devlong64 
+        GROUP BY time_bucket('1 min', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devlong64_10min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('10 mins', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devlong64 
+        GROUP BY time_bucket('10 mins', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devlong64_1hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 hour', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devlong64 
+        GROUP BY time_bucket('1 hour', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devlong64_8hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('8 hours', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devlong64 
+        GROUP BY time_bucket('8 hours', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devlong64_1day(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 day', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devlong64 
+        GROUP BY time_bucket('1 day', data_time), att_conf_id;
+
+-- Short attributes
+CREATE MATERIALIZED VIEW cagg_scalar_devshort_1min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 min', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devshort 
+        GROUP BY time_bucket('1 min', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devshort_10min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('10 mins', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devshort 
+        GROUP BY time_bucket('10 mins', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devshort_1hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 hour', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devshort 
+        GROUP BY time_bucket('1 hour', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devshort_8hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('8 hours', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devshort 
+        GROUP BY time_bucket('8 hours', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devshort_1day(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 day', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devshort 
+        GROUP BY time_bucket('1 day', data_time), att_conf_id;
+
+-- Unsigned long attributes
+CREATE MATERIALIZED VIEW cagg_scalar_devulong_1min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 min', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devulong 
+        GROUP BY time_bucket('1 min', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devulong_10min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('10 mins', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devulong 
+        GROUP BY time_bucket('10 mins', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devulong_1hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 hour', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devulong 
+        GROUP BY time_bucket('1 hour', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devulong_8hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('8 hours', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devulong 
+        GROUP BY time_bucket('8 hours', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devulong_1day(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 day', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devulong 
+        GROUP BY time_bucket('1 day', data_time), att_conf_id;
+
+-- Unsigned long 64 attributes
+CREATE MATERIALIZED VIEW cagg_scalar_devulong64_1min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 min', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devulong64 
+        GROUP BY time_bucket('1 min', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devulong64_10min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('10 mins', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devulong64 
+        GROUP BY time_bucket('10 mins', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devulong64_1hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 hour', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devulong64 
+        GROUP BY time_bucket('1 hour', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devulong64_8hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('8 hours', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devulong64 
+        GROUP BY time_bucket('8 hours', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devulong64_1day(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 day', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devulong64 
+        GROUP BY time_bucket('1 day', data_time), att_conf_id;
+
+-- Unsigned short attributes
+CREATE MATERIALIZED VIEW cagg_scalar_devushort_1min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 min', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devushort 
+        GROUP BY time_bucket('1 min', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devushort_10min(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('10 mins', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devushort 
+        GROUP BY time_bucket('10 mins', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devushort_1hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 hour', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devushort 
+        GROUP BY time_bucket('1 hour', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devushort_8hour(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('8 hours', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devushort 
+        GROUP BY time_bucket('8 hours', data_time), att_conf_id;
+
+CREATE MATERIALIZED VIEW cagg_scalar_devushort_1day(
+		att_conf_id, data_time, count_rows, count_errors
+		, count_r, mean_r, min_r, max_r, stddev_r
+		, count_w, mean_w, min_w, max_w, stddev_w
+	) WITH (timescaledb.continuous)
+       	AS SELECT att_conf_id, time_bucket('1 day', data_time), count(*), count(att_error_desc_id)
+		, count(value_r), avg(value_r), min(value_r), max(value_r), stddev(value_r)
+		, count(value_w), avg(value_w), min(value_w), max(value_w), stddev(value_w)
+       	FROM att_scalar_devushort 
+        GROUP BY time_bucket('1 day', data_time), att_conf_id;
+
+
+--Set access
+
+GRANT ALL ON cagg_scalar_devdouble_1min TO readwrite;
+GRANT SELECT ON cagg_scalar_devdouble_1min TO readonly;
+GRANT ALL ON cagg_scalar_devdouble_10min TO readwrite;
+GRANT SELECT ON cagg_scalar_devdouble_10min TO readonly;
+GRANT ALL ON cagg_scalar_devdouble_1hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devdouble_1hour TO readonly;
+GRANT ALL ON cagg_scalar_devdouble_8hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devdouble_8hour TO readonly;
+GRANT ALL ON cagg_scalar_devdouble_1day TO readwrite;
+GRANT SELECT ON cagg_scalar_devdouble_1day TO readonly;
+
+GRANT ALL ON cagg_scalar_devfloat_1min TO readwrite;
+GRANT SELECT ON cagg_scalar_devfloat_1min TO readonly;
+GRANT ALL ON cagg_scalar_devfloat_10min TO readwrite;
+GRANT SELECT ON cagg_scalar_devfloat_10min TO readonly;
+GRANT ALL ON cagg_scalar_devfloat_1hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devfloat_1hour TO readonly;
+GRANT ALL ON cagg_scalar_devfloat_8hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devfloat_8hour TO readonly;
+GRANT ALL ON cagg_scalar_devfloat_1day TO readwrite;
+GRANT SELECT ON cagg_scalar_devfloat_1day TO readonly;
+
+GRANT ALL ON cagg_scalar_devlong_1min TO readwrite;
+GRANT SELECT ON cagg_scalar_devlong_1min TO readonly;
+GRANT ALL ON cagg_scalar_devlong_10min TO readwrite;
+GRANT SELECT ON cagg_scalar_devlong_10min TO readonly;
+GRANT ALL ON cagg_scalar_devlong_1hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devlong_1hour TO readonly;
+GRANT ALL ON cagg_scalar_devlong_8hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devlong_8hour TO readonly;
+GRANT ALL ON cagg_scalar_devlong_1day TO readwrite;
+GRANT SELECT ON cagg_scalar_devlong_1day TO readonly;
+
+GRANT ALL ON cagg_scalar_devulong_1min TO readwrite;
+GRANT SELECT ON cagg_scalar_devulong_1min TO readonly;
+GRANT ALL ON cagg_scalar_devulong_10min TO readwrite;
+GRANT SELECT ON cagg_scalar_devulong_10min TO readonly;
+GRANT ALL ON cagg_scalar_devulong_1hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devulong_1hour TO readonly;
+GRANT ALL ON cagg_scalar_devulong_8hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devulong_8hour TO readonly;
+GRANT ALL ON cagg_scalar_devulong_1day TO readwrite;
+GRANT SELECT ON cagg_scalar_devulong_1day TO readonly;
+
+GRANT ALL ON cagg_scalar_devulong64_1min TO readwrite;
+GRANT SELECT ON cagg_scalar_devulong64_1min TO readonly;
+GRANT ALL ON cagg_scalar_devulong64_10min TO readwrite;
+GRANT SELECT ON cagg_scalar_devulong64_10min TO readonly;
+GRANT ALL ON cagg_scalar_devulong64_1hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devulong64_1hour TO readonly;
+GRANT ALL ON cagg_scalar_devulong64_8hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devulong64_8hour TO readonly;
+GRANT ALL ON cagg_scalar_devulong64_1day TO readwrite;
+GRANT SELECT ON cagg_scalar_devulong64_1day TO readonly;
+
+GRANT ALL ON cagg_scalar_devlong64_1min TO readwrite;
+GRANT SELECT ON cagg_scalar_devlong64_1min TO readonly;
+GRANT ALL ON cagg_scalar_devlong64_10min TO readwrite;
+GRANT SELECT ON cagg_scalar_devlong64_10min TO readonly;
+GRANT ALL ON cagg_scalar_devlong64_1hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devlong64_1hour TO readonly;
+GRANT ALL ON cagg_scalar_devlong64_8hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devlong64_8hour TO readonly;
+GRANT ALL ON cagg_scalar_devlong64_1day TO readwrite;
+GRANT SELECT ON cagg_scalar_devlong64_1day TO readonly;
+
+GRANT ALL ON cagg_scalar_devshort_1min TO readwrite;
+GRANT SELECT ON cagg_scalar_devshort_1min TO readonly;
+GRANT ALL ON cagg_scalar_devshort_10min TO readwrite;
+GRANT SELECT ON cagg_scalar_devshort_10min TO readonly;
+GRANT ALL ON cagg_scalar_devshort_1hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devshort_1hour TO readonly;
+GRANT ALL ON cagg_scalar_devshort_8hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devshort_8hour TO readonly;
+GRANT ALL ON cagg_scalar_devshort_1day TO readwrite;
+GRANT SELECT ON cagg_scalar_devshort_1day TO readonly;
+
+GRANT ALL ON cagg_scalar_devushort_1min TO readwrite;
+GRANT SELECT ON cagg_scalar_devushort_1min TO readonly;
+GRANT ALL ON cagg_scalar_devushort_10min TO readwrite;
+GRANT SELECT ON cagg_scalar_devushort_10min TO readonly;
+GRANT ALL ON cagg_scalar_devushort_1hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devushort_1hour TO readonly;
+GRANT ALL ON cagg_scalar_devushort_8hour TO readwrite;
+GRANT SELECT ON cagg_scalar_devushort_8hour TO readonly;
+GRANT ALL ON cagg_scalar_devushort_1day TO readwrite;
+GRANT SELECT ON cagg_scalar_devushort_1day TO readonly;
+
+
+
+-- Drop all the views
+-- DROP VIEW cagg_scalar_devdouble_1min CASCADE;
+-- DROP VIEW cagg_scalar_devdouble_10min CASCADE;
+-- DROP VIEW cagg_scalar_devdouble_1hour CASCADE;
+-- DROP VIEW cagg_scalar_devdouble_8hour CASCADE;
+-- DROP VIEW cagg_scalar_devdouble_1day CASCADE;
+
+-- DROP VIEW cagg_scalar_devfloat_1min CASCADE;
+-- DROP VIEW cagg_scalar_devfloat_10min CASCADE;
+-- DROP VIEW cagg_scalar_devfloat_1hour CASCADE;
+-- DROP VIEW cagg_scalar_devfloat_8hour CASCADE;
+-- DROP VIEW cagg_scalar_devfloat_1day CASCADE;
+
+-- DROP VIEW cagg_scalar_devlong_1min CASCADE;
+-- DROP VIEW cagg_scalar_devlong_10min CASCADE;
+-- DROP VIEW cagg_scalar_devlong_1hour CASCADE;
+-- DROP VIEW cagg_scalar_devlong_8hour CASCADE;
+-- DROP VIEW cagg_scalar_devlong_1day CASCADE;
+
+-- DROP VIEW cagg_scalar_devlong64_1min CASCADE;
+-- DROP VIEW cagg_scalar_devlong64_10min CASCADE;
+-- DROP VIEW cagg_scalar_devlong64_1hour CASCADE;
+-- DROP VIEW cagg_scalar_devlong64_8hour CASCADE;
+-- DROP VIEW cagg_scalar_devlong64_1day CASCADE;
+
+-- DROP VIEW cagg_scalar_devshort_1min CASCADE;
+-- DROP VIEW cagg_scalar_devshort_10min CASCADE;
+-- DROP VIEW cagg_scalar_devshort_1hour CASCADE;
+-- DROP VIEW cagg_scalar_devshort_8hour CASCADE;
+-- DROP VIEW cagg_scalar_devshort_1day CASCADE;
+
+-- DROP VIEW cagg_scalar_devulong_1min CASCADE;
+-- DROP VIEW cagg_scalar_devulong_10min CASCADE;
+-- DROP VIEW cagg_scalar_devulong_1hour CASCADE;
+-- DROP VIEW cagg_scalar_devulong_8hour CASCADE;
+-- DROP VIEW cagg_scalar_devulong_1day CASCADE;
+
+-- DROP VIEW cagg_scalar_devulong64_1min CASCADE;
+-- DROP VIEW cagg_scalar_devulong64_10min CASCADE;
+-- DROP VIEW cagg_scalar_devulong64_1hour CASCADE;
+-- DROP VIEW cagg_scalar_devulong64_8hour CASCADE;
+-- DROP VIEW cagg_scalar_devulong64_1day CASCADE;
+
+-- DROP VIEW cagg_scalar_devushort_1min CASCADE;
+-- DROP VIEW cagg_scalar_devushort_10min CASCADE;
+-- DROP VIEW cagg_scalar_devushort_1hour CASCADE;
+-- DROP VIEW cagg_scalar_devushort_8hour CASCADE;
+-- DROP VIEW cagg_scalar_devushort_1day CASCADE;
diff --git a/docker-compose/timescaledb/resources/05_lofar_views.sql b/docker-compose/timescaledb/resources/05_lofar_views.sql
new file mode 100644
index 0000000000000000000000000000000000000000..82aa8e5de360b434ecf081d1b02c000dff5d50f7
--- /dev/null
+++ b/docker-compose/timescaledb/resources/05_lofar_views.sql
@@ -0,0 +1,54 @@
+-- LOFAR 2.0 CUSTOMIZED VIEWS
+
+\c hdb
+-- SDP FPGA Temperature
+create or replace view "sdp_fpga_temp" as
+select
+  ac.att_name as "attribute",
+  aad.data_time AS "time",
+  aad.value_r
+FROM att_array_devdouble aad join att_conf ac 
+on aad.att_conf_id = ac.att_conf_id 
+where aad.value_R is not null
+and ac."domain" ='stat' and ac."family" ='sdp' and ac."member" ='1'
+ORDER BY aad.data_time; 
+
+-- SDP FPGA Mask 
+create or replace view "sdp_tr_fpga_mask" as
+select
+  ac.att_name as "attribute",
+  aab.data_time AS "time",
+  aab.value_r
+FROM att_array_devboolean aab join att_conf ac 
+on aab.att_conf_id = ac.att_conf_id 
+where aab.value_R is not null
+and ac."domain" ='stat' and ac."family" ='sdp' and ac."member" ='1'
+ORDER BY aab.data_time;
+
+-- SDP Masked values (rounded to 1 second)
+create or replace view "sdp_masked_temp_values" as 
+select time_bucket('1 second',t.time) as "temp_time",
+time_bucket('1 second',m.time) as "mask_time",
+t.value_r as "temperature",
+m.value_r as "mask"
+from sdp_fpga_temp as t
+inner join sdp_tr_fpga_mask as m
+on time_bucket('1 second',t.time) = time_bucket('1 second',m.time) 
+/* Replace if possible with SQL loop */
+where m.value_r[1]=true and
+m.value_r[2]=true and
+m.value_r[3]=true and
+m.value_r[4]=true and
+m.value_r[5]=true and
+m.value_r[6]=true and
+m.value_r[7]=true and
+m.value_r[8]=true and
+m.value_r[9]=true and
+m.value_r[10]=true and
+m.value_r[11]=true and
+m.value_r[12]=true and
+m.value_r[13]=true and
+m.value_r[14]=true and
+m.value_r[15]=true and
+m.value_r[16]=true
+order by t."time" ;
diff --git a/docker-compose/timescaledb/resources/06_cleanup.sql b/docker-compose/timescaledb/resources/06_cleanup.sql
new file mode 100644
index 0000000000000000000000000000000000000000..b18b24a7afa73d22e9e987576fa2495d591e8e24
--- /dev/null
+++ b/docker-compose/timescaledb/resources/06_cleanup.sql
@@ -0,0 +1 @@
+ALTER USER hdb_admin NOSUPERUSER;
diff --git a/docker/tango/tango-archiver-ts/Dockerfile b/docker/tango/tango-archiver-ts/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..98c3190c0ade4fb0b7457e6a983fc675e5eb8c3c
--- /dev/null
+++ b/docker/tango/tango-archiver-ts/Dockerfile
@@ -0,0 +1,164 @@
+#ARG DOCKER_REGISTRY_USER
+#ARG DOCKER_REGISTRY_HOST
+#FROM ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}/tango-cpp:latest
+FROM artefact.skao.int/ska-tango-images-tango-cpp:9.3.9
+
+USER root
+
+RUN apt-get update && \
+    apt-get install -y ca-certificates
+
+RUN echo "deb http://deb.debian.org/debian buster-backports main contrib non-free" >> /etc/apt/sources.list && \
+    more /etc/apt/sources.list && \
+    apt-get update && \
+    apt-get install -y \
+        checkinstall \
+        git \
+        cmake \
+        make \
+        g++ \
+        libomniorb4-dev \
+        libzmq3-dev \
+        libcos4-dev \
+        mariadb-server \
+        libmariadb-dev-compat libmariadb-dev \
+        libmariadbclient-dev \
+        postgresql \
+        postgresql-contrib \
+        libpq5 \
+        libpqxx-6.2 \
+        libpq-dev \
+        libpqxx-dev       
+        
+RUN git clone -b v2.0.0 https://github.com/Diego91RA/libhdbpp.git
+
+RUN cd libhdbpp \
+ && mkdir build \
+ && cd build \
+ && cmake .. -DCMAKE_INCLUDE_PATH=/usr/local/include/tango \
+ && make -j4
+
+RUN cd libhdbpp/build \
+ && checkinstall \
+    --install=yes \
+    --fstrans=no \
+    --showinstall=no \
+    --backup=no \
+    --type=debian \
+    --pkgsource="https://github.com/tango-controls-hdbpp/libhdbpp" \
+    --pkglicense="LGPLv3" \
+    --deldesc=no \
+    --nodoc \
+    --strip \
+    --stripso \
+    --maintainer="tango" \
+    --pkgarch=$(dpkg --print-architecture) \
+    --pkgversion="2.0.0" \
+    --pkgrelease="SNAPSHOT" \
+    --pkgname="libhdbpp" \
+    --requires="libzmq5,libomniorb4-2,libcos4-2,libomnithread4" \
+    make install
+
+RUN git clone -b master --recurse-submodules https://github.com/Diego91RA/libhdbpp-timescale.git
+RUN cd libhdbpp-timescale && git checkout 85c03657d4518e876869b322d6a50c46875a1300
+
+RUN cd libhdbpp-timescale \
+ && mkdir -p build \
+ && cd build \
+ && cmake .. -DCMAKE_PREFIX_PATH=/usr/local/include/tango -DPostgreSQL_TYPE_INCLUDE_DIR=/usr/local/include/postgresql \
+ && make -j4
+ 
+RUN cd libhdbpp-timescale/build \
+ && checkinstall \
+    --install=yes \
+    --fstrans=no \
+    --showinstall=no \
+    --backup=no \
+    --type=debian \
+    --pkgsource="https://github.com/tango-controls-hdbpp/libhdbpp-timescale" \
+    --pkglicense="LGPLv3" \
+    --deldesc=no \
+    --nodoc \
+    --strip \
+    --stripso \
+    --maintainer="tango" \
+    --pkgarch=$(dpkg --print-architecture) \
+    --pkgversion="2.0.0" \
+    --pkgrelease="SNAPSHOT" \
+    --pkgname="libhdbpp-timescale" \
+    --requires="libpq5" \
+    make install  
+
+RUN git clone -b v2.0.0 https://github.com/Diego91RA/hdbpp-cm.git
+
+RUN cd hdbpp-cm \
+ && mkdir -p build \
+ && cd build \
+ && cmake .. -DCMAKE_PREFIX_PATH=/usr/local/include/tango \
+ && make -j4
+
+RUN cd hdbpp-cm/build \
+ && checkinstall \
+    --install=yes \
+    --fstrans=no \
+    --showinstall=no \
+    --backup=no \
+    --type=debian \
+    --pkgsource="https://github.com/tango-controls-hdbpp/hdbpp-cm" \
+    --pkglicense="GPLv3" \
+    --deldesc=no \
+    --nodoc \
+    --strip \
+    --stripso \
+    --maintainer="tango" \
+    --pkgarch=$(dpkg --print-architecture) \
+    --pkgversion="2.0.0" \
+    --pkgrelease="SNAPSHOT" \
+    --pkgname="hdbpp-cm" \
+    --requires="libzmq5,libomniorb4-2,libcos4-2,libomnithread4" \
+    make install
+
+RUN git clone -b master https://github.com/Diego91RA/hdbpp-es.git
+RUN cd hdbpp-es && git checkout 473cbfbd7af76851bbf6ca2fcf5e4880e9f8e437
+
+RUN cd hdbpp-es \
+ && mkdir -p build \
+ && cd build \
+ && cmake .. -DCMAKE_PREFIX_PATH=/usr/local/include/tango -DFETCH_LIBHDBPP=OFF -DLIBHDBPP_BACKEND=timescale -DPostgreSQL_TYPE_INCLUDE_DIR=/usr/local/include/postgresql \
+ && make -j4 
+ 
+RUN cd hdbpp-es/build \
+ && checkinstall \
+    --install=yes \
+    --fstrans=no \
+    --showinstall=no \
+    --backup=no \
+    --type=debian \
+    --pkgsource="https://github.com/tango-controls-hdbpp/hdbpp-es" \
+    --pkglicense="GPLv3" \
+    --deldesc=no \
+    --nodoc \
+    --strip \
+    --stripso \
+    --maintainer="tango" \
+    --pkgarch=$(dpkg --print-architecture) \
+    --pkgversion="2.0.0" \
+    --pkgrelease="SNAPSHOT" \
+    --pkgname="hdbpp-es" \
+    --requires="libzmq5,libomniorb4-2,libcos4-2,libomnithread4" \
+    make install
+
+RUN apt-get update && \
+    apt-get install -y \
+    build-essential && \
+    apt-get clean
+
+RUN dpkg -i /libhdbpp/build/libhdbpp_2.0.0-SNAPSHOT_amd64.deb
+RUN dpkg -i /libhdbpp-timescale/build/libhdbpp-timescale_2.0.0-SNAPSHOT_amd64.deb
+RUN dpkg -i /hdbpp-cm/build/hdbpp-cm_2.0.0-SNAPSHOT_amd64.deb
+RUN dpkg -i /hdbpp-es/build/hdbpp-es_2.0.0-SNAPSHOT_amd64.deb
+
+RUN ldconfig
+
+RUN mv /usr/local/bin/hdb++cm-srv /usr/local/bin/hdbppcm-srv
+RUN mv /usr/local/bin/hdb++es-srv /usr/local/bin/hdbppes-srv
diff --git a/docker/tango/tango-archiver/data/archiver-devices.json b/docker/tango/tango-archiver/data/archiver-devices.json
index 22311da6620f2b725b133f85344c3d38a615db8f..6cce12c21c403d58ce7d126199faf9d1736cfd60 100644
--- a/docker/tango/tango-archiver/data/archiver-devices.json
+++ b/docker/tango/tango-archiver/data/archiver-devices.json
@@ -13,6 +13,19 @@
                         }
                     }
                 }
+            },
+            "02": {
+                "HdbEventSubscriber": {
+                    "archiving/hdbppts/eventsubscriber01": {
+                        "attribute_properties": {},
+                        "properties": {
+                            "CheckPeriodicTimeoutDelay": ["5"],
+                            "PollingThreadPeriod": ["3"],
+                            "LibConfiguration": ["connect_string= user=postgres password=password host=archiver-timescale port=5432 dbname=hdb","host=archiver-timescale","libname=libhdb++timescale.so","dbname=hdb","port=5432", "user=postgres", "password=password"],
+                            "polled_attr": []
+                        }
+                    }
+                }
             }
         },
         "hdbppcm-srv": {
@@ -28,6 +41,19 @@
                         }
                     }
                 }
+            },
+            "02": {
+                "HdbConfigurationManager": {
+                    "archiving/hdbppts/confmanager01": {
+                        "attribute_properties": {},
+                        "properties": {
+                            "ArchiverList": ["archiving/hdbppts/eventsubscriber01"],
+                            "MaxSearchSize": ["1000"],
+                            "LibConfiguration": ["connect_string= user=postgres password=password host=archiver-timescale port=5432 dbname=hdb","host=archiver-timescale","libname=libhdb++timescale.so","dbname=hdb","port=5432", "user=postgres", "password=password"],
+                            "polled_attr": []
+                        }
+                    }
+                }
             }
         }
     }
diff --git a/tangostationcontrol/tangostationcontrol/toolkit/archiver_config/lofar2.json b/tangostationcontrol/tangostationcontrol/toolkit/archiver_config/lofar2.json
index f46dae36f4630fa151cf49ce50a4f9b34694be66..a853b33be232116a798fc4c9d192a9b67ca23d7a 100644
--- a/tangostationcontrol/tangostationcontrol/toolkit/archiver_config/lofar2.json
+++ b/tangostationcontrol/tangostationcontrol/toolkit/archiver_config/lofar2.json
@@ -6,7 +6,7 @@
     "devices":{
         "STAT/RECV/1": {
             "environment": "development",
-            "include": ["rcu_temperature_r"],
+            "include": [],
             "exclude": ["CLK_Enable_PWR_R","CLK_I2C_STATUS_R","CLK_PLL_error_R","CLK_PLL_locked_R","CLK_translator_busy_R"]      
         },
         "STAT/SDP/1": {