diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8037f7db6aa3c201247f4268a35df4c16985d521..badf33f0d073c001e0e1616b21296912954af4be 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -86,11 +86,13 @@ docker_build_image_all:
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh grafana latest
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh jupyter latest
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh apsct-sim latest
+    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh ccd-sim latest
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh apspu-sim latest
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh recv-sim latest
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh sdptr-sim latest
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh unb2-sim latest
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-apsct latest
+    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-ccd latest
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-apspu latest
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-tilebeam latest
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-beamlet latest
@@ -191,6 +193,17 @@ docker_build_image_apsct_sim:
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh apsct-sim $tag
+docker_build_image_ccd_sim:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
+      - docker-compose/ccd-sim.yml
+      - docker-compose/pypcc-sim-base/*
+  script:
+#    Do not remove 'bash' or statement will be ignored by primitive docker shell
+    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh ccd-sim $tag
 docker_build_image_apspu_sim:
   extends: .base_docker_images_except
   only:
@@ -246,6 +259,17 @@ docker_build_image_device_apsct:
   script:
 #    Do not remove 'bash' or statement will be ignored by primitive docker shell
     - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-aspct $tag
+docker_build_image_device_ccd:
+  extends: .base_docker_images_except
+  only:
+    refs:
+      - merge_requests
+    changes:
+      - docker-compose/device-ccd.yml
+      - docker-compose/lofar-device-base/*
+  script:
+#    Do not remove 'bash' or statement will be ignored by primitive docker shell
+    - bash $CI_PROJECT_DIR/sbin/tag_and_push_docker_image.sh device-ccd $tag
 docker_build_image_device_apspu:
   extends: .base_docker_images_except
   only:
@@ -551,6 +575,7 @@ integration_test_docker:
         tag="$CI_COMMIT_REF_SLUG"
         echo "Running on branch '$CI_COMMIT_BRANCH': tag = $tag"
       fi
+    - apk update
     - apk add --update make bash docker-compose
     - apk add --update bind-tools
     - apk add --update postgresql14-client gzip
diff --git a/CDB/LOFAR_ConfigDb.json b/CDB/LOFAR_ConfigDb.json
index 2ba1ebe751f6397710f82e8d246c74fe9eaae8dd..e7af81cae189b00800053ea1c24ed43faf243ba9 100644
--- a/CDB/LOFAR_ConfigDb.json
+++ b/CDB/LOFAR_ConfigDb.json
@@ -169,6 +169,16 @@
                 }
             }
         },
+        "CCD": {
+            "STAT": {
+                "CCD": {
+                    "STAT/CCD/1": {
+                        "properties": {
+                        }
+                    }
+                }
+            }
+        },
         "APSPU": {
             "STAT": {
                 "APSPU": {
diff --git a/CDB/integrations/recvcluster_ConfigDb.json b/CDB/integrations/recvcluster_ConfigDb.json
index 79d94788c881c5a309ad48841aa51c84c3a3a0f7..23659cb18c4dea5badc2c5c4ff5201aba94cde36 100644
--- a/CDB/integrations/recvcluster_ConfigDb.json
+++ b/CDB/integrations/recvcluster_ConfigDb.json
@@ -14,1397 +14,449 @@
                 "AntennaField": {
                     "STAT/AntennaField/1": {
                         "properties": {
-                            "Antenna_Field_Reference_ITRF": [
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786"
+                            "Antenna_Field_Reference_ETRS": [
+                                "3826896.631", "460979.131", "5064657.943"
                             ],
-                            "HBAT_reference_itrf": [
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786"
+                            "Antenna_Reference_ETRS": [
+                                "3826886.142", "460980.772", "5064665.668",
+                                "3826887.237", "460985.643", "5064664.406",
+                                "3826889.022", "460974.271", "5064664.094",
+                                "3826890.118", "460979.142", "5064662.831",
+                                "3826891.214", "460984.012", "5064661.568",
+                                "3826892.311", "460988.883", "5064660.305",
+                                "3826891.902", "460967.768", "5064662.520",
+                                "3826892.999", "460972.640", "5064661.256",
+                                "3826894.094", "460977.511", "5064659.994",
+                                "3826895.191", "460982.382", "5064658.730",
+                                "3826896.287", "460987.252", "5064657.467",
+                                "3826897.383", "460992.123", "5064656.204",
+                                "3826895.879", "460966.138", "5064659.682",
+                                "3826896.974", "460971.009", "5064658.419",
+                                "3826898.071", "460975.880", "5064657.156",
+                                "3826899.167", "460980.751", "5064655.893",
+                                "3826900.263", "460985.622", "5064654.630",
+                                "3826901.359", "460990.493", "5064653.367",
+                                "3826900.951", "460969.378", "5064655.582",
+                                "3826902.048", "460974.250", "5064654.319",
+                                "3826903.143", "460979.120", "5064653.056",
+                                "3826904.240", "460983.991", "5064651.793",
+                                "3826906.024", "460972.619", "5064651.481",
+                                "3826907.120", "460977.490", "5064650.218",
+                                "3826969.290", "460898.914", "5064610.654",
+                                "3826970.386", "460903.785", "5064609.392",
+                                "3826972.171", "460892.413", "5064609.080",
+                                "3826973.267", "460897.284", "5064607.817",
+                                "3826974.363", "460902.154", "5064606.554",
+                                "3826975.459", "460907.025", "5064605.291",
+                                "3826975.051", "460885.911", "5064607.506",
+                                "3826976.147", "460890.782", "5064606.242",
+                                "3826977.243", "460895.653", "5064604.980",
+                                "3826978.339", "460900.524", "5064603.716",
+                                "3826979.436", "460905.394", "5064602.453",
+                                "3826980.532", "460910.265", "5064601.190",
+                                "3826979.027", "460884.281", "5064604.668",
+                                "3826980.123", "460889.152", "5064603.405",
+                                "3826981.220", "460894.022", "5064602.142",
+                                "3826982.316", "460898.893", "5064600.879",
+                                "3826983.412", "460903.764", "5064599.616",
+                                "3826984.508", "460908.635", "5064598.353",
+                                "3826984.100", "460887.521", "5064600.568",
+                                "3826985.196", "460892.392", "5064599.305",
+                                "3826986.292", "460897.262", "5064598.042",
+                                "3826987.388", "460902.133", "5064596.779",
+                                "3826989.173", "460890.761", "5064596.467",
+                                "3826990.269", "460895.632", "5064595.204"
                             ],
-                            "HBAT_antenna_itrf_offsets": [
-                                "-1.847",
-                                "-1.180",
-                                " 1.493",
-                                "-1.581",
-                                " 0.003",
-                                " 1.186",
-                                "-1.315",
-                                " 1.185",
-                                " 0.880",
-                                "-1.049",
-                                " 2.367",
-                                " 0.573",
-                                "-0.882",
-                                "-1.575",
-                                " 0.804",
-                                "-0.616",
-                                "-0.393",
-                                " 0.498",
-                                "-0.350",
-                                " 0.789",
-                                " 0.191",
-                                "-0.083",
-                                " 1.971",
-                                "-0.116",
-                                " 0.083",
-                                "-1.971",
-                                " 0.116",
-                                " 0.350",
-                                "-0.789",
-                                "-0.191",
-                                " 0.616",
-                                " 0.393",
-                                "-0.498",
-                                " 0.882",
-                                " 1.575",
-                                "-0.804",
-                                " 1.049",
-                                "-2.367",
-                                "-0.573",
-                                " 1.315",
-                                "-1.185",
-                                "-0.880",
-                                " 1.581",
-                                "-0.003",
-                                "-1.186",
-                                " 1.847",
-                                " 1.180",
-                                "-1.493"
+                            "HBAT_PQR_rotation_angles_deg": [
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24"
+                            ],
+                            "HBAT_PQR_to_ETRS_rotation_matrix": [
+                               "-0.1195951054", "-0.7919544517", "0.5987530018",
+                               " 0.9928227484", "-0.0954186800", "0.0720990002",
+                               " 0.0000330969", " 0.6030782884", "0.7976820024"
                             ]
                         }
                     },
                     "STAT/AntennaField/2": {
                         "properties": {
-                            "Antenna_Field_Reference_ITRF": [
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786"
+                            "Antenna_Field_Reference_ETRS": [
+                                "3826896.631", "460979.131", "5064657.943"
+                            ],
+                            "Antenna_Reference_ETRS": [
+                                "3826886.142", "460980.772", "5064665.668",
+                                "3826887.237", "460985.643", "5064664.406",
+                                "3826889.022", "460974.271", "5064664.094",
+                                "3826890.118", "460979.142", "5064662.831",
+                                "3826891.214", "460984.012", "5064661.568",
+                                "3826892.311", "460988.883", "5064660.305",
+                                "3826891.902", "460967.768", "5064662.520",
+                                "3826892.999", "460972.640", "5064661.256",
+                                "3826894.094", "460977.511", "5064659.994",
+                                "3826895.191", "460982.382", "5064658.730",
+                                "3826896.287", "460987.252", "5064657.467",
+                                "3826897.383", "460992.123", "5064656.204",
+                                "3826895.879", "460966.138", "5064659.682",
+                                "3826896.974", "460971.009", "5064658.419",
+                                "3826898.071", "460975.880", "5064657.156",
+                                "3826899.167", "460980.751", "5064655.893",
+                                "3826900.263", "460985.622", "5064654.630",
+                                "3826901.359", "460990.493", "5064653.367",
+                                "3826900.951", "460969.378", "5064655.582",
+                                "3826902.048", "460974.250", "5064654.319",
+                                "3826903.143", "460979.120", "5064653.056",
+                                "3826904.240", "460983.991", "5064651.793",
+                                "3826906.024", "460972.619", "5064651.481",
+                                "3826907.120", "460977.490", "5064650.218",
+                                "3826969.290", "460898.914", "5064610.654",
+                                "3826970.386", "460903.785", "5064609.392",
+                                "3826972.171", "460892.413", "5064609.080",
+                                "3826973.267", "460897.284", "5064607.817",
+                                "3826974.363", "460902.154", "5064606.554",
+                                "3826975.459", "460907.025", "5064605.291",
+                                "3826975.051", "460885.911", "5064607.506",
+                                "3826976.147", "460890.782", "5064606.242",
+                                "3826977.243", "460895.653", "5064604.980",
+                                "3826978.339", "460900.524", "5064603.716",
+                                "3826979.436", "460905.394", "5064602.453",
+                                "3826980.532", "460910.265", "5064601.190",
+                                "3826979.027", "460884.281", "5064604.668",
+                                "3826980.123", "460889.152", "5064603.405",
+                                "3826981.220", "460894.022", "5064602.142",
+                                "3826982.316", "460898.893", "5064600.879",
+                                "3826983.412", "460903.764", "5064599.616",
+                                "3826984.508", "460908.635", "5064598.353",
+                                "3826984.100", "460887.521", "5064600.568",
+                                "3826985.196", "460892.392", "5064599.305",
+                                "3826986.292", "460897.262", "5064598.042",
+                                "3826987.388", "460902.133", "5064596.779",
+                                "3826989.173", "460890.761", "5064596.467",
+                                "3826990.269", "460895.632", "5064595.204"
                             ],
-                            "HBAT_reference_itrf": [
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786"
+                            "HBAT_PQR_rotation_angles_deg": [
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24"
                             ],
-                            "HBAT_antenna_itrf_offsets": [
-                                "-1.847",
-                                "-1.180",
-                                " 1.493",
-                                "-1.581",
-                                " 0.003",
-                                " 1.186",
-                                "-1.315",
-                                " 1.185",
-                                " 0.880",
-                                "-1.049",
-                                " 2.367",
-                                " 0.573",
-                                "-0.882",
-                                "-1.575",
-                                " 0.804",
-                                "-0.616",
-                                "-0.393",
-                                " 0.498",
-                                "-0.350",
-                                " 0.789",
-                                " 0.191",
-                                "-0.083",
-                                " 1.971",
-                                "-0.116",
-                                " 0.083",
-                                "-1.971",
-                                " 0.116",
-                                " 0.350",
-                                "-0.789",
-                                "-0.191",
-                                " 0.616",
-                                " 0.393",
-                                "-0.498",
-                                " 0.882",
-                                " 1.575",
-                                "-0.804",
-                                " 1.049",
-                                "-2.367",
-                                "-0.573",
-                                " 1.315",
-                                "-1.185",
-                                "-0.880",
-                                " 1.581",
-                                "-0.003",
-                                "-1.186",
-                                " 1.847",
-                                " 1.180",
-                                "-1.493"
+                            "HBAT_PQR_to_ETRS_rotation_matrix": [
+                               "-0.1195951054", "-0.7919544517", "0.5987530018",
+                               " 0.9928227484", "-0.0954186800", "0.0720990002",
+                               " 0.0000330969", " 0.6030782884", "0.7976820024"
                             ]
                         }
                     },
                     "STAT/AntennaField/3": {
                         "properties": {
-                            "Antenna_Field_Reference_ITRF": [
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786"
+                            "Antenna_Field_Reference_ETRS": [
+                                "3826896.631", "460979.131", "5064657.943"
                             ],
-                            "HBAT_reference_itrf": [
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786"
+                            "Antenna_Reference_ETRS": [
+                                "3826886.142", "460980.772", "5064665.668",
+                                "3826887.237", "460985.643", "5064664.406",
+                                "3826889.022", "460974.271", "5064664.094",
+                                "3826890.118", "460979.142", "5064662.831",
+                                "3826891.214", "460984.012", "5064661.568",
+                                "3826892.311", "460988.883", "5064660.305",
+                                "3826891.902", "460967.768", "5064662.520",
+                                "3826892.999", "460972.640", "5064661.256",
+                                "3826894.094", "460977.511", "5064659.994",
+                                "3826895.191", "460982.382", "5064658.730",
+                                "3826896.287", "460987.252", "5064657.467",
+                                "3826897.383", "460992.123", "5064656.204",
+                                "3826895.879", "460966.138", "5064659.682",
+                                "3826896.974", "460971.009", "5064658.419",
+                                "3826898.071", "460975.880", "5064657.156",
+                                "3826899.167", "460980.751", "5064655.893",
+                                "3826900.263", "460985.622", "5064654.630",
+                                "3826901.359", "460990.493", "5064653.367",
+                                "3826900.951", "460969.378", "5064655.582",
+                                "3826902.048", "460974.250", "5064654.319",
+                                "3826903.143", "460979.120", "5064653.056",
+                                "3826904.240", "460983.991", "5064651.793",
+                                "3826906.024", "460972.619", "5064651.481",
+                                "3826907.120", "460977.490", "5064650.218",
+                                "3826969.290", "460898.914", "5064610.654",
+                                "3826970.386", "460903.785", "5064609.392",
+                                "3826972.171", "460892.413", "5064609.080",
+                                "3826973.267", "460897.284", "5064607.817",
+                                "3826974.363", "460902.154", "5064606.554",
+                                "3826975.459", "460907.025", "5064605.291",
+                                "3826975.051", "460885.911", "5064607.506",
+                                "3826976.147", "460890.782", "5064606.242",
+                                "3826977.243", "460895.653", "5064604.980",
+                                "3826978.339", "460900.524", "5064603.716",
+                                "3826979.436", "460905.394", "5064602.453",
+                                "3826980.532", "460910.265", "5064601.190",
+                                "3826979.027", "460884.281", "5064604.668",
+                                "3826980.123", "460889.152", "5064603.405",
+                                "3826981.220", "460894.022", "5064602.142",
+                                "3826982.316", "460898.893", "5064600.879",
+                                "3826983.412", "460903.764", "5064599.616",
+                                "3826984.508", "460908.635", "5064598.353",
+                                "3826984.100", "460887.521", "5064600.568",
+                                "3826985.196", "460892.392", "5064599.305",
+                                "3826986.292", "460897.262", "5064598.042",
+                                "3826987.388", "460902.133", "5064596.779",
+                                "3826989.173", "460890.761", "5064596.467",
+                                "3826990.269", "460895.632", "5064595.204"
                             ],
-                            "HBAT_antenna_itrf_offsets": [
-                                "-1.847",
-                                "-1.180",
-                                " 1.493",
-                                "-1.581",
-                                " 0.003",
-                                " 1.186",
-                                "-1.315",
-                                " 1.185",
-                                " 0.880",
-                                "-1.049",
-                                " 2.367",
-                                " 0.573",
-                                "-0.882",
-                                "-1.575",
-                                " 0.804",
-                                "-0.616",
-                                "-0.393",
-                                " 0.498",
-                                "-0.350",
-                                " 0.789",
-                                " 0.191",
-                                "-0.083",
-                                " 1.971",
-                                "-0.116",
-                                " 0.083",
-                                "-1.971",
-                                " 0.116",
-                                " 0.350",
-                                "-0.789",
-                                "-0.191",
-                                " 0.616",
-                                " 0.393",
-                                "-0.498",
-                                " 0.882",
-                                " 1.575",
-                                "-0.804",
-                                " 1.049",
-                                "-2.367",
-                                "-0.573",
-                                " 1.315",
-                                "-1.185",
-                                "-0.880",
-                                " 1.581",
-                                "-0.003",
-                                "-1.186",
-                                " 1.847",
-                                " 1.180",
-                                "-1.493"
+                            "HBAT_PQR_rotation_angles_deg": [
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24"
+                            ],
+                            "HBAT_PQR_to_ETRS_rotation_matrix": [
+                               "-0.1195951054", "-0.7919544517", "0.5987530018",
+                               " 0.9928227484", "-0.0954186800", "0.0720990002",
+                               " 0.0000330969", " 0.6030782884", "0.7976820024"
                             ]
                         }
                     },
                     "STAT/AntennaField/4": {
                         "properties": {
-                            "Antenna_Field_Reference_ITRF": [
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786"
+                            "Antenna_Field_Reference_ETRS": [
+                                "3826896.631", "460979.131", "5064657.943"
+                            ],
+                            "Antenna_Reference_ETRS": [
+                                "3826886.142", "460980.772", "5064665.668",
+                                "3826887.237", "460985.643", "5064664.406",
+                                "3826889.022", "460974.271", "5064664.094",
+                                "3826890.118", "460979.142", "5064662.831",
+                                "3826891.214", "460984.012", "5064661.568",
+                                "3826892.311", "460988.883", "5064660.305",
+                                "3826891.902", "460967.768", "5064662.520",
+                                "3826892.999", "460972.640", "5064661.256",
+                                "3826894.094", "460977.511", "5064659.994",
+                                "3826895.191", "460982.382", "5064658.730",
+                                "3826896.287", "460987.252", "5064657.467",
+                                "3826897.383", "460992.123", "5064656.204",
+                                "3826895.879", "460966.138", "5064659.682",
+                                "3826896.974", "460971.009", "5064658.419",
+                                "3826898.071", "460975.880", "5064657.156",
+                                "3826899.167", "460980.751", "5064655.893",
+                                "3826900.263", "460985.622", "5064654.630",
+                                "3826901.359", "460990.493", "5064653.367",
+                                "3826900.951", "460969.378", "5064655.582",
+                                "3826902.048", "460974.250", "5064654.319",
+                                "3826903.143", "460979.120", "5064653.056",
+                                "3826904.240", "460983.991", "5064651.793",
+                                "3826906.024", "460972.619", "5064651.481",
+                                "3826907.120", "460977.490", "5064650.218",
+                                "3826969.290", "460898.914", "5064610.654",
+                                "3826970.386", "460903.785", "5064609.392",
+                                "3826972.171", "460892.413", "5064609.080",
+                                "3826973.267", "460897.284", "5064607.817",
+                                "3826974.363", "460902.154", "5064606.554",
+                                "3826975.459", "460907.025", "5064605.291",
+                                "3826975.051", "460885.911", "5064607.506",
+                                "3826976.147", "460890.782", "5064606.242",
+                                "3826977.243", "460895.653", "5064604.980",
+                                "3826978.339", "460900.524", "5064603.716",
+                                "3826979.436", "460905.394", "5064602.453",
+                                "3826980.532", "460910.265", "5064601.190",
+                                "3826979.027", "460884.281", "5064604.668",
+                                "3826980.123", "460889.152", "5064603.405",
+                                "3826981.220", "460894.022", "5064602.142",
+                                "3826982.316", "460898.893", "5064600.879",
+                                "3826983.412", "460903.764", "5064599.616",
+                                "3826984.508", "460908.635", "5064598.353",
+                                "3826984.100", "460887.521", "5064600.568",
+                                "3826985.196", "460892.392", "5064599.305",
+                                "3826986.292", "460897.262", "5064598.042",
+                                "3826987.388", "460902.133", "5064596.779",
+                                "3826989.173", "460890.761", "5064596.467",
+                                "3826990.269", "460895.632", "5064595.204"
                             ],
-                            "HBAT_reference_itrf": [
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786",
-                                "3826577.066",
-                                "461022.948",
-                                "5064892.786"
+                            "HBAT_PQR_rotation_angles_deg": [
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24",
+                               "24"
                             ],
-                            "HBAT_antenna_itrf_offsets": [
-                                "-1.847",
-                                "-1.180",
-                                " 1.493",
-                                "-1.581",
-                                " 0.003",
-                                " 1.186",
-                                "-1.315",
-                                " 1.185",
-                                " 0.880",
-                                "-1.049",
-                                " 2.367",
-                                " 0.573",
-                                "-0.882",
-                                "-1.575",
-                                " 0.804",
-                                "-0.616",
-                                "-0.393",
-                                " 0.498",
-                                "-0.350",
-                                " 0.789",
-                                " 0.191",
-                                "-0.083",
-                                " 1.971",
-                                "-0.116",
-                                " 0.083",
-                                "-1.971",
-                                " 0.116",
-                                " 0.350",
-                                "-0.789",
-                                "-0.191",
-                                " 0.616",
-                                " 0.393",
-                                "-0.498",
-                                " 0.882",
-                                " 1.575",
-                                "-0.804",
-                                " 1.049",
-                                "-2.367",
-                                "-0.573",
-                                " 1.315",
-                                "-1.185",
-                                "-0.880",
-                                " 1.581",
-                                "-0.003",
-                                "-1.186",
-                                " 1.847",
-                                " 1.180",
-                                "-1.493"
+                            "HBAT_PQR_to_ETRS_rotation_matrix": [
+                               "-0.1195951054", "-0.7919544517", "0.5987530018",
+                               " 0.9928227484", "-0.0954186800", "0.0720990002",
+                               " 0.0000330969", " 0.6030782884", "0.7976820024"
                             ]
                         }
                     }
diff --git a/CDB/stations/DTS_ConfigDb.json b/CDB/stations/DTS_ConfigDb.json
index 436c3bbfbd77ef4da6b67b22c4ded88945e27a92..84836d8e1c33e9619ff0b6a89ffa07a28f3b5bd3 100644
--- a/CDB/stations/DTS_ConfigDb.json
+++ b/CDB/stations/DTS_ConfigDb.json
@@ -150,14 +150,14 @@
                             "RECV_devices": [
                                 "STAT/RECV/1"
                             ],
-                             "HBAT_Control_to_RECV_mapping": [
+                             "Control_to_RECV_mapping": [
                                 "1", "24",
                                 "0", "-1",
                                 "0", "-1",
                                 "1", "25",
                                 "1", "26"
                             ],
-                             "HBAT_Power_to_RECV_mapping": [
+                             "Power_to_RECV_mapping": [
                                 "1", "27",
                                 "0", "-1",
                                 "0", "-1",
@@ -167,7 +167,7 @@
                             "Antenna_Field_Reference_ETRS": [
                                 "3839371.416", "430339.901", "5057958.886"
                             ],
-                            "HBAT_reference_ETRS": [
+                            "Antenna_Reference_ETRS": [
                                 "3839371.416", "430339.901", "5057958.886",
                                 "3839368.919", "430335.979", "5057961.1",
                                 "3839365.645", "430339.299", "5057963.288",
diff --git a/CDB/stations/DTS_Outside_ConfigDb.json b/CDB/stations/DTS_Outside_ConfigDb.json
index 6f051755943d69ee16de650a16d86cdad6e2ebbc..cbfa8255c171cb2c47c81de6dd372105d7413cb0 100644
--- a/CDB/stations/DTS_Outside_ConfigDb.json
+++ b/CDB/stations/DTS_Outside_ConfigDb.json
@@ -18,24 +18,25 @@
                             "Initialise_Hardware": [
                                 "True"
                             ],
-			    "Device_Names" : [
+                            "Device_Names": [
                                 "STAT/Docker/1",
-                       		"STAT/PSOC/1",
-                       		"STAT/PCON/1",
-                       		"STAT/APSPU/1",
-                       		"STAT/APSCT/1",
-                       		"STAT/RECV/1",
-                       		"STAT/UNB2/1",
-                       		"STAT/SDP/1",
-                       		"STAT/BST/1",
-                       		"STAT/SST/1",
-                       		"STAT/XST/1",
-                       		"STAT/Beamlet/1",
-                       		"STAT/AntennaField/1",
-                       		"STAT/TileBeam/2",
-                       		"STAT/DigitalBeam/1",
-                       		"STAT/TemperatureManager/1"
-				]
+                                "STAT/PSOC/1",
+                                "STAT/PCON/1",
+                                "STAT/APSPU/1",
+                                "STAT/APSCT/1",
+                                "STAT/CCD/1",
+                                "STAT/RECV/1",
+                                "STAT/UNB2/1",
+                                "STAT/SDP/1",
+                                "STAT/BST/1",
+                                "STAT/SST/1",
+                                "STAT/XST/1",
+                                "STAT/Beamlet/1",
+                                "STAT/AntennaField/1",
+                                "STAT/TileBeam/2",
+                                "STAT/DigitalBeam/1",
+                                "STAT/TemperatureManager/1"
+                            ]
                         }
                     }
                 }
@@ -60,16 +61,16 @@
                 }
             }
         },
-        "APSPU": {
+        "CCD": {
             "STAT": {
-                "APSPU": {
-                    "STAT/APSPU/1": {
+                "CCD": {
+                    "STAT/CCD/1": {
                         "properties": {
                             "OPC_Server_Name": [
-                                "10.99.0.100"
+                                "10.87.6.67 "
                             ],
                             "OPC_Server_Port": [
-                                "4842"
+                                "4843"
                             ],
                             "OPC_Time_Out": [
                                 "5.0"
@@ -79,23 +80,29 @@
                 }
             }
         },
-        "TileBeam": {
+        "APSPU": {
             "STAT": {
-                "TileBeam": {
-                    "STAT/TileBeam/2": {
+                "APSPU": {
+                    "STAT/APSPU/1": {
                         "properties": {
-                            "Tracking_enabled_RW_default": [
-                                "False"
+                            "OPC_Server_Name": [
+                                "10.99.0.100"
+                            ],
+                            "OPC_Server_Port": [
+                                "4842"
+                            ],
+                            "OPC_Time_Out": [
+                                "5.0"
                             ]
                         }
                     }
                 }
             }
         },
-        "DigitalBeam": {
+        "TileBeam": {
             "STAT": {
-                "DigitalBeam": {
-                    "STAT/DigitalBeam/1": {
+                "TileBeam": {
+                    "STAT/TileBeam/2": {
                         "properties": {
                             "Tracking_enabled_RW_default": [
                                 "False"
@@ -165,32 +172,39 @@
                 "AntennaField": {
                     "STAT/AntennaField/2": {
                         "properties": {
-			    "RECV_devices": [
-				"STAT/RECV/1"
-			    ],
-                            "HBAT_Control_to_RECV_mapping": [
-				"1", "27",
-				"0", "-1",
-				"0", "-1",
-				"1", "28",
-				"1", "29"
-			    ],
-                            "HBAT_Power_to_RECV_mapping": [
-				"1", "24",
-				"0", "-1",
-				"0", "-1",
-				"1", "25",
-				"1", "26"
-			    ],
+                            "RECV_devices": [
+                                "STAT/RECV/1"
+                            ],
+                            "Antenna_Names": [
+                                "C0",
+                                "C1",
+                                "C2",
+                                "C3",
+                                "C4"
+                            ],
+                            "Control_to_RECV_mapping": [
+                                "1","27",
+                                "0","-1",
+                                "0","-1",
+                                "1","28",
+                                "1","29"
+                            ],
+                            "Power_to_RECV_mapping": [
+                                "1","24",
+                                "0","-1",
+                                "0","-1",
+                                "1","25",
+                                "1","26"
+                            ],
                             "Antenna_Field_Reference_ETRS": [
-                                "3839371.416", "430339.901", "5057958.886"
+                                "3839371.416","430339.901","5057958.886"
                             ],
-                            "HBAT_reference_ETRS": [
-                                "3839371.416", "430339.901", "5057958.886",
-                                "3839368.919", "430335.979", "5057961.1",
-                                "3839365.645", "430339.299", "5057963.288",
-                                "3839368.142", "430343.221", "5057961.074",
-                                "3839374.094", "430299.513", "5057960.017"
+                            "Antenna_Reference_ETRS": [
+                                "3839371.416","430339.901","5057958.886",
+                                "3839368.919","430335.979","5057961.1",
+                                "3839365.645","430339.299","5057963.288",
+                                "3839368.142","430343.221","5057961.074",
+                                "3839374.094","430299.513","5057960.017"
                             ],
                             "HBAT_PQR_rotation_angles_deg": [
                                 "45.73",
@@ -200,52 +214,65 @@
                                 "54.40"
                             ],
                             "HBAT_PQR_to_ETRS_rotation_matrix": [
-                               "-0.11660087", "-0.79095632", "0.60065992",
-                               " 0.99317077", "-0.09529842", "0.06730545",
-                               " 0.00400627", " 0.60440575", "0.79666658"
+                                "-0.11660087","-0.79095632","0.60065992",
+                                " 0.99317077","-0.09529842","0.06730545",
+                                " 0.00400627"," 0.60440575","0.79666658"
                             ]
                         }
                     },
                     "STAT/AntennaField/1": {
                         "properties": {
-			    "RECV_devices": [
-				"STAT/RECV/1"
-			    ],
-                            "HBAT_Control_to_RECV_mapping": [
-				"1", "1",
-				"1", "3",
-				"1", "5",
-				"1", "7",
-				"1", "9",
-				"1", "11",
-				"1", "13",
-				"1", "15",
-				"1", "17"
-			    ],
-                            "HBAT_Power_to_RECV_mapping": [
-				"1", "1",
-				"1", "3",
-				"1", "5",
-				"1", "7",
-				"1", "9",
-				"1", "11",
-				"1", "13",
-				"1", "15",
-				"1", "17"
-			    ],
+                            "RECV_devices": [
+                                "STAT/RECV/1"
+                            ],
+                            "Antenna_Names": [
+                                "LBA1",
+                                "LBA2",
+                                "LBA3",
+                                "LBA4",
+                                "LBA5",
+                                "LBA6",
+                                "LBA7",
+                                "LBA8",
+                                "LBA9"
+                            ],
+                            "Control_to_RECV_mapping": [
+                                "1","1",
+                                "1","3",
+                                "1","5",
+                                "1","7",
+                                "1","9",
+                                "1","11",
+                                "1","13",
+                                "1","15",
+                                "1","17"
+                            ],
+                            "Power_to_RECV_mapping": [
+                                "1","1",
+                                "1","3",
+                                "1","5",
+                                "1","7",
+                                "1","9",
+                                "1","11",
+                                "1","13",
+                                "1","15",
+                                "1","17"
+                            ],
                             "Antenna_Field_Reference_ETRS": [
-				"3839358.189", "430354.482", "5057967.804"
-                            ],
-                            "HBAT_reference_ETRS": [
-				"3839358.189", "430354.482", "5057967.804",
-                                "3839359.127", "430348.074", "5057967.607",
-                                "3839360.084", "430341.872", "5057967.379",
-                                "3839361.024", "430335.466", "5057967.180",
-                                "3839361.721", "430329.482", "5057967.130",
-                                "3839362.786", "430323.311", "5057966.818",
-                                "3839363.705", "430317.204", "5057966.611",
-				"3839364.563", "430311.056", "5057966.454",
-                                "3839365.497", "430304.996", "5057966.232"
+                                "3839358.189",
+                                "430354.482",
+                                "5057967.804"
+                            ],
+                            "Antenna_Reference_ETRS": [
+                                "3839358.189","430354.482","5057967.804",
+                                "3839359.127","430348.074","5057967.607",
+                                "3839360.084","430341.872","5057967.379",
+                                "3839361.024","430335.466","5057967.180",
+                                "3839361.721","430329.482","5057967.130",
+                                "3839362.786","430323.311","5057966.818",
+                                "3839363.705","430317.204","5057966.611",
+                                "3839364.563","430311.056","5057966.454",
+                                "3839365.497","430304.996","5057966.232"
                             ]
                         }
                     }
@@ -263,7 +290,7 @@
                             "Input_to_Antenna_Mapping": [
                                 "-1", "-1", "-1", "-1", "-1", "-1",
                                 "-1", "-1", "-1", "-1", "-1", "-1",
-                                 "0",  "3",  "4", "-1", "-1", "-1",
+                                "0",  "3",  "4", "-1", "-1", "-1",
                                 "-1", "-1", "-1", "-1", "-1", "-1",
                                 "-1", "-1", "-1", "-1", "-1", "-1",
                                 "-1", "-1", "-1", "-1", "-1", "-1",
@@ -286,8 +313,8 @@
                                 "STAT/AntennaField/1"
                             ],
                             "Input_to_Antenna_Mapping": [
-                                 "0",  "1",  "2",  "3",  "4",  "5",
-                                 "6",  "7",  "8", "-1", "-1", "-1",
+                                "0",  "1",  "2",  "3",  "4",  "5",
+                                "6",  "7",  "8", "-1", "-1", "-1",
                                 "-1", "-1", "-1", "-1", "-1", "-1",
                                 "-1", "-1", "-1", "-1", "-1", "-1",
                                 "-1", "-1", "-1", "-1", "-1", "-1",
@@ -302,6 +329,9 @@
                                 "-1", "-1", "-1", "-1", "-1", "-1",
                                 "-1", "-1", "-1", "-1", "-1", "-1",
                                 "-1", "-1", "-1", "-1", "-1", "-1"
+                            ],
+                            "Tracking_enabled_RW_default": [
+                                "False"
                             ]
                         }
                     }
@@ -332,9 +362,9 @@
                 "SDP": {
                     "STAT/SDP/1": {
                         "properties": {
-                            "AntennaType" : [
-				"LBA"
-			    ],
+                            "AntennaType": [
+                                "LBA"
+                            ],
                             "OPC_Server_Name": [
                                 "10.99.0.250"
                             ],
@@ -555,7 +585,9 @@
                 "PSOC": {
                     "STAT/PSOC/1": {
                         "properties": {
-                            "SNMP_host": ["10.87.2.145"],
+                            "SNMP_host": [
+                                "10.87.2.145"
+                            ],
                             "PSOC_sockets": [
                                 "ccd_socket",
                                 "sdptr0_socket",
@@ -576,7 +608,9 @@
                 "PCON": {
                     "STAT/PCON/1": {
                         "properties": {
-                            "SNMP_host": ["10.151.225.5"]
+                            "SNMP_host": [
+                                "10.151.225.5"
+                            ]
                         }
                     }
                 }
diff --git a/CDB/stations/dummy_positions_ConfigDb.json b/CDB/stations/dummy_positions_ConfigDb.json
index afd6b401263026bca0edfb7d48eeade64f4873b2..44f80657f8bd28a5dd9a885a7808c262d31b0d1c 100644
--- a/CDB/stations/dummy_positions_ConfigDb.json
+++ b/CDB/stations/dummy_positions_ConfigDb.json
@@ -5,7 +5,7 @@
                 "AntennaField": {
                     "STAT/AntennaField/1": {
                         "properties": {
-                            "HBAT_Control_to_RECV_mapping": [
+                            "Control_to_RECV_mapping": [
                                 "1",  "0",
                                 "1",  "1",
                                 "1",  "2",
@@ -55,7 +55,7 @@
                                 "1", "46",
                                 "1", "47"
                             ],
-                            "HBAT_Power_to_RECV_mapping": [
+                            "Power_to_RECV_mapping": [
                                 "1", "48",
                                 "1", "49",
                                 "1", "50",
@@ -108,7 +108,7 @@
                             "Antenna_Field_Reference_ETRS": [
                                 "3826896.631", "460979.131", "5064657.943"
                             ],
-                            "HBAT_reference_ETRS": [
+                            "Antenna_Reference_ETRS": [
                                 "3826886.142", "460980.772", "5064665.668",
                                 "3826887.237", "460985.643", "5064664.406",
                                 "3826889.022", "460974.271", "5064664.094",
@@ -212,16 +212,6 @@
                                "-0.1195951054", "-0.7919544517", "0.5987530018",
                                " 0.9928227484", "-0.0954186800", "0.0720990002",
                                " 0.0000330969", " 0.6030782884", "0.7976820024"
-                            ],
-                            "HBAT_Control_to_RECV_mapping": [
-                                "1", "0", "1", "1", "1", "2", "1", "3", "1", "4", "1", "5", 
-                                "1", "6", "1", "7", "1", "8", "1", "9", "1", "10", "1", "11", 
-                                "1", "12", "1", "13", "1", "14", "1", "15", "1", "16", "1", "17", 
-                                "1", "18", "1", "19", "1", "20", "1", "21", "1", "22", "1", "23", 
-                                "1", "24", "1", "25", "1", "26", "1", "27", "1", "28", "1", "29", 
-                                "1", "30", "1", "31", "1", "32", "1", "33", "1", "34", "1", "35", 
-                                "1", "36", "1", "37", "1", "38", "1", "39", "1", "40", "1", "41", 
-                                "1", "42", "1", "43", "1", "44", "1", "45", "1", "46", "1", "47"
                             ]
                         }
                     }
diff --git a/CDB/stations/simulators_ConfigDb.json b/CDB/stations/simulators_ConfigDb.json
index 7cd92391917029be134fdc9fd4846b5540153663..bb686ecf733a7925bafa3883bb86ed132fe89d90 100644
--- a/CDB/stations/simulators_ConfigDb.json
+++ b/CDB/stations/simulators_ConfigDb.json
@@ -32,6 +32,25 @@
                 }
             }
         },
+        "CCD": {
+            "STAT": {
+                "CCD": {
+                    "STAT/CCD/1": {
+                        "properties": {
+                            "OPC_Server_Name": [
+                                "ccd-sim"
+                            ],
+                            "OPC_Server_Port": [
+                                "4843"
+                            ],
+                            "OPC_Time_Out": [
+                                "5.0"
+                            ]
+                        }
+                    }
+                }
+            }
+        },
         "APSPU": {
             "STAT": {
                 "APSPU": {
@@ -125,7 +144,7 @@
                                 "RECV, HBAT_LED_on_RW"
                             ],
                             "Shutdown_Device_List":[
-                                "STAT/SDP/1", "STAT/UNB2/1", "STAT/RECV/1", "STAT/APSCT/1", "STAT/APSPU/1"
+                                "STAT/SDP/1", "STAT/UNB2/1", "STAT/RECV/1", "STAT/APSCT/1", "STAT/CCD/1","STAT/APSPU/1"
                             ]
                         }
                     }
diff --git a/bin/start-ds.sh b/bin/start-ds.sh
index 66389714f17770339ee645129adc9dcb26fa21d7..71cb29a29bfa977fbf6033c8479c9e59435485b5 100755
--- a/bin/start-ds.sh
+++ b/bin/start-ds.sh
@@ -37,6 +37,8 @@ else
   rm -rf /tmp/tangostationcontrol
   cp -R /opt/lofar/tango/tangostationcontrol /tmp/
   cd /tmp/tangostationcontrol || exit 1
+  # Remove the build directory if copied from the source
+  rm -rf build
   pip -vvv install --upgrade --force-reinstall ./
 fi
 
diff --git a/docker-compose/.env b/docker-compose/.env
index eb952e41424380f649d797ec6f2fa6c8879f961c..50751ff6a5ed2a57225e747b56a30b97c28beba6 100644
--- a/docker-compose/.env
+++ b/docker-compose/.env
@@ -9,7 +9,7 @@ TANGO_CPP_VERSION=9.3.9
 TANGO_DB_VERSION=10.4.14
 TANGO_DSCONFIG_VERSION=1.5.3
 TANGO_HDBPP_VIEWER_VERSION=2021-05-28
-TANGO_ITANGO_VERSION=9.3.7
+TANGO_ITANGO_VERSION=9.3.9
 TANGO_JAVA_VERSION=9.3.6
 TANGO_POGO_VERSION=9.6.34
 TANGO_REST_VERSION=1.14.6
diff --git a/docker-compose/Makefile b/docker-compose/Makefile
index b3b736fc57a644ce05f4a8c11973be7042a7079f..5cdb54531b472901dbda22902937e62a0ab2902b 100644
--- a/docker-compose/Makefile
+++ b/docker-compose/Makefile
@@ -150,7 +150,8 @@ DOCKER_COMPOSE_ARGS := DISPLAY=$(DISPLAY) \
     CONTAINER_NAME_PREFIX=$(CONTAINER_NAME_PREFIX) \
     COMPOSE_IGNORE_ORPHANS=true \
     CONTAINER_EXECUTION_UID=$(shell id -u) \
-    DOCKER_GID=$(DOCKER_GID)
+    DOCKER_GID=$(DOCKER_GID) \
+    TEST_MODULE=$(INTEGRATION_MODULE)
 
 
 .PHONY: up down minimal context run integration start stop restart build build-nocache status clean pull help
@@ -171,10 +172,10 @@ up: minimal  ## start the base TANGO system and prepare requested services
 	$(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) up --no-start --no-recreate $(SERVICE)
 
 run: minimal  ## run a service using arguments and delete it afterwards
-	$(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) run --no-deps --rm $(SERVICE) $(SERVICE_ARGS)
+	$(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) run -T --no-deps --rm $(SERVICE) $(SERVICE_ARGS)
 
 integration: minimal  ## run a service using arguments and delete it afterwards
-	TEST_MODULE=$(INTEGRATION_MODULE) $(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) run --no-deps --rm integration-test $(INTEGRATION_ARGS)
+	$(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) run -T --no-deps --rm integration-test $(INTEGRATION_ARGS)
 
 down:  ## stop all services and tear down the system
 	$(DOCKER_COMPOSE_ARGS) docker-compose $(COMPOSE_FILE_ARGS) down
diff --git a/docker-compose/ccd-sim.yml b/docker-compose/ccd-sim.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b02d3693abc28ad95fde8b57515613c8cae09204
--- /dev/null
+++ b/docker-compose/ccd-sim.yml
@@ -0,0 +1,25 @@
+#
+# Docker compose file that launches an APSCT simulator
+#
+# Defines:
+#   - apsct-sim 
+#
+version: '2.1' 
+
+services:
+  ccd-sim:
+    build:
+        context: pypcc-sim-base
+        args:
+         - LOCAL_DOCKER_REGISTRY_HOST=${LOCAL_DOCKER_REGISTRY_HOST}
+         - LOCAL_DOCKER_REGISTRY_LOFAR=${LOCAL_DOCKER_REGISTRY_LOFAR}
+    container_name: ${CONTAINER_NAME_PREFIX}ccd-sim
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "100m"
+        max-file: "10"
+    networks:
+      - control
+    entrypoint: hwtr --simulator --port 4843 --config CCDTR
+    restart: on-failure
diff --git a/docker-compose/device-antennafield.yml b/docker-compose/device-antennafield.yml
index 0e16043f1170a937d0fe16e3e2853801c3b1339b..ec08ce0f28fd0817d663f122983fcbcfef8ed060 100644
--- a/docker-compose/device-antennafield.yml
+++ b/docker-compose/device-antennafield.yml
@@ -33,12 +33,16 @@ services:
       - control
     ports:
       - "5715:5715" # unique port for this DS
+      - "5815:5815" # ZeroMQ event port
+      - "5915:5915" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
         - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5815
+      - TANGO_ZMQ_HEARTBEAT_PORT=5915
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-apsct.yml b/docker-compose/device-apsct.yml
index 8addefff2bc1ead3510e835fad51187b40e4a996..024ca94227ef4149c4a42a5b83b08f61ea85e2c9 100644
--- a/docker-compose/device-apsct.yml
+++ b/docker-compose/device-apsct.yml
@@ -32,12 +32,16 @@ services:
       - control
     ports:
       - "5709:5709" # unique port for this DS
+      - "5809:5809" # ZeroMQ event port
+      - "5909:5909" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
         - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5809
+      - TANGO_ZMQ_HEARTBEAT_PORT=5909
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-apspu.yml b/docker-compose/device-apspu.yml
index 55a2d5a9a5d95a9c0e1617bb4732a1d96ab26a20..e70df9a1be75ea2c83c2d6049bedd0fd88d8dcab 100644
--- a/docker-compose/device-apspu.yml
+++ b/docker-compose/device-apspu.yml
@@ -32,12 +32,16 @@ services:
       - control
     ports:
       - "5710:5710" # unique port for this DS
+      - "5810:5810" # ZeroMQ event port
+      - "5910:5910" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
         - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5810
+      - TANGO_ZMQ_HEARTBEAT_PORT=5910
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-beamlet.yml b/docker-compose/device-beamlet.yml
index 4e80eba8f4033efe31749c51c95002204a0136f4..27dcc8020b333f687fdc389c71ccbe4276a80061 100644
--- a/docker-compose/device-beamlet.yml
+++ b/docker-compose/device-beamlet.yml
@@ -32,12 +32,16 @@ services:
       - control
     ports:
       - "5712:5712" # unique port for this DS
+      - "5812:5812" # ZeroMQ event port
+      - "5912:5912" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
         - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5812
+      - TANGO_ZMQ_HEARTBEAT_PORT=5912
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-boot.yml b/docker-compose/device-boot.yml
index 4d4108d9ffb189e05b8696039d68b2f1be20de2a..ae17797e75303adc66eaf83e0ae8f659b178980b 100644
--- a/docker-compose/device-boot.yml
+++ b/docker-compose/device-boot.yml
@@ -31,12 +31,16 @@ services:
       - control
     ports:
       - "5708:5708" # unique port for this DS
+      - "5808:5808" # ZeroMQ event port
+      - "5908:5908" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
       - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5808
+      - TANGO_ZMQ_HEARTBEAT_PORT=5908
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-bst.yml b/docker-compose/device-bst.yml
index 92522527c2071e9e94b9561ab010717c37c63c07..9655beb47a01f8a159206b8488f63cd4c59d6bed 100644
--- a/docker-compose/device-bst.yml
+++ b/docker-compose/device-bst.yml
@@ -35,12 +35,16 @@ services:
         - "5003:5003/udp" # port to receive SST UDP packets on
         - "5103:5103/tcp" # port to emit SST TCP packets on
         - "5717:5717" # unique port for this DS
+        - "5817:5817" # ZeroMQ event port
+        - "5917:5917" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
         - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5817
+      - TANGO_ZMQ_HEARTBEAT_PORT=5917
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-ccd.yml b/docker-compose/device-ccd.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7531012fd4983fadecbf51cdee70e6735135cbcc
--- /dev/null
+++ b/docker-compose/device-ccd.yml
@@ -0,0 +1,51 @@
+#
+# Docker compose file that launches an interactive iTango session.
+#
+# Connect to the interactive session with 'docker attach itango'.
+# Disconnect with the Docker deattach sequence: <CTRL>+<P> <CTRL>+<Q>
+#
+# Defines:
+#   - itango: iTango interactive session
+#
+# Requires:
+#   - lofar-device-base.yml
+#
+version: '2.1'
+
+services:
+  device-ccd:
+    image: device-ccd
+    # build explicitly, as docker-compose does not understand a local image
+    # being shared among services.
+    build:
+        context: .
+        dockerfile: lofar-device-base/Dockerfile
+        args:
+            SOURCE_IMAGE: ${LOCAL_DOCKER_REGISTRY_HOST}/${LOCAL_DOCKER_REGISTRY_USER}/tango-itango:${TANGO_ITANGO_VERSION}
+    container_name: ${CONTAINER_NAME_PREFIX}device-ccd
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "100m"
+        max-file: "10"
+    networks:
+      - control
+    ports:
+      - "5721:5721" # unique port for this DS
+      - "5821:5821" # ZeroMQ event port
+      - "5921:5921" # ZeroMQ heartbeat port
+    extra_hosts:
+      - "host.docker.internal:host-gateway"
+    volumes:
+        - ..:/opt/lofar/tango:rw
+    environment:
+      - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5821
+      - TANGO_ZMQ_HEARTBEAT_PORT=5921
+    working_dir: /opt/lofar/tango
+    entrypoint:
+      - bin/start-ds.sh
+      # configure CORBA to _listen_ on 0:port, but tell others we're _reachable_ through ${HOSTNAME}:port, since CORBA
+      # can't know about our Docker port forwarding
+      - l2ss-ccd Ccd STAT -v -ORBendPoint giop:tcp:device-ccd:5721 -ORBendPointPublish giop:tcp:${HOSTNAME}:5721
+    restart: on-failure
diff --git a/docker-compose/device-digitalbeam.yml b/docker-compose/device-digitalbeam.yml
index c5b45e9baaef63e15f44b4a539cf93a73244bde3..36801cd02e8fc97811910b0abb762315ca70b209 100644
--- a/docker-compose/device-digitalbeam.yml
+++ b/docker-compose/device-digitalbeam.yml
@@ -32,12 +32,16 @@ services:
       - control
     ports:
       - "5713:5713" # unique port for this DS
+      - "5813:5813" # ZeroMQ event port
+      - "5913:5913" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
         - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5813
+      - TANGO_ZMQ_HEARTBEAT_PORT=5913
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-docker.yml b/docker-compose/device-docker.yml
index db33c9aed034fa02fbafe2bc7ab4b66535fe0f33..c531ac63b1272a828cd619a43f3487d26a64e997 100644
--- a/docker-compose/device-docker.yml
+++ b/docker-compose/device-docker.yml
@@ -32,6 +32,8 @@ services:
       - control
     ports:
       - "5705:5705" # unique port for this DS
+      - "5805:5805" # ZeroMQ event port
+      - "5905:5905" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
@@ -40,6 +42,8 @@ services:
     user: 1000:${DOCKER_GID} # uid 1000 is the default "tango" user
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5805
+      - TANGO_ZMQ_HEARTBEAT_PORT=5905
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-observation-control.yml b/docker-compose/device-observation-control.yml
index 7025b8b3ab38cbb1290971c1907729b8aa09ca0f..42b9e48a96e113eaaf1988512ea6727bf1ee4fb4 100644
--- a/docker-compose/device-observation-control.yml
+++ b/docker-compose/device-observation-control.yml
@@ -31,12 +31,16 @@ services:
       - control
     ports:
       - "5703:5703" # unique port for this DS
+      - "5803:5803" # ZeroMQ event port
+      - "5903:5903" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
         - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5803
+      - TANGO_ZMQ_HEARTBEAT_PORT=5903
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-observation.yml b/docker-compose/device-observation.yml
index 3379e41e1887d670b734a1f75f8b942ca51d17df..48bb753937d758cf0db40001a7eaf5d61ce542e1 100644
--- a/docker-compose/device-observation.yml
+++ b/docker-compose/device-observation.yml
@@ -30,12 +30,16 @@ services:
       - control
     ports:
       - "5718:5718" # unique port for this DS
+      - "5818:5818" # ZeroMQ event port
+      - "5918:5918" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
         - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5818
+      - TANGO_ZMQ_HEARTBEAT_PORT=5918
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-pcon.yml b/docker-compose/device-pcon.yml
index 17fad681d96fbe9cb1b84168144b3668ce4f96f7..cb6b2c3cdde164405d8dfb18015fd77cc9a5851b 100644
--- a/docker-compose/device-pcon.yml
+++ b/docker-compose/device-pcon.yml
@@ -27,12 +27,16 @@ services:
       - control
     ports:
       - "5720:5720" # unique port for this DS
+      - "5820:5820" # ZeroMQ event port
+      - "5920:5920" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
       - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5820
+      - TANGO_ZMQ_HEARTBEAT_PORT=5920
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-psoc.yml b/docker-compose/device-psoc.yml
index 6d6578e6aa6aa3b44b34f16d6cd1f3373f45217b..a32d2374b28ae5f7649cea742ab6c606ce06391f 100644
--- a/docker-compose/device-psoc.yml
+++ b/docker-compose/device-psoc.yml
@@ -27,12 +27,16 @@ services:
       - control
     ports:
       - "5719:5719" # unique port for this DS
+      - "5819:5819" # ZeroMQ event port
+      - "5919:5919" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
       - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5819
+      - TANGO_ZMQ_HEARTBEAT_PORT=5919
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-recv.yml b/docker-compose/device-recv.yml
index 3c79a0a149528557a0d3ca3aa087773538942207..134c2ccb41647fb12abd49bb1353df5797d6d35a 100644
--- a/docker-compose/device-recv.yml
+++ b/docker-compose/device-recv.yml
@@ -32,12 +32,16 @@ services:
       - control
     ports:
       - "5707:5707" # unique port for this DS
+      - "5807:5807" # ZeroMQ event port
+      - "5907:5907" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
         - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5807
+      - TANGO_ZMQ_HEARTBEAT_PORT=5907
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-sdp.yml b/docker-compose/device-sdp.yml
index 144630c883d741c166c6f1a1c48f9e8eda5ab096..61f8eb34102cc0645ce66921650a478fd2f72fcb 100644
--- a/docker-compose/device-sdp.yml
+++ b/docker-compose/device-sdp.yml
@@ -32,12 +32,16 @@ services:
       - control
     ports:
       - "5701:5701" # unique port for this DS
+      - "5801:5801" # ZeroMQ event port
+      - "5901:5901" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
         - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5801
+      - TANGO_ZMQ_HEARTBEAT_PORT=5901
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-sst.yml b/docker-compose/device-sst.yml
index e6b0edb75008791f365d4ec8281c35a314935ca3..5db68a00c1430d6e1cc0c04b17e3d9554ce0c20d 100644
--- a/docker-compose/device-sst.yml
+++ b/docker-compose/device-sst.yml
@@ -35,12 +35,16 @@ services:
         - "5001:5001/udp" # port to receive SST UDP packets on
         - "5101:5101/tcp" # port to emit SST TCP packets on
         - "5702:5702" # unique port for this DS
+        - "5802:5802" # ZeroMQ event port
+        - "5902:5902" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
         - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5802
+      - TANGO_ZMQ_HEARTBEAT_PORT=5902
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-temperature-manager.yml b/docker-compose/device-temperature-manager.yml
index d1b20359bf0f827b99450edd93cf4687ac263532..eb87e6e599557b52219bf4d4f99b3b829d97d0b1 100644
--- a/docker-compose/device-temperature-manager.yml
+++ b/docker-compose/device-temperature-manager.yml
@@ -27,12 +27,16 @@ services:
       - control
     ports:
       - "5716:5716" # unique port for this DS
+      - "5816:5816" # ZeroMQ event port
+      - "5916:5916" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
       - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5816
+      - TANGO_ZMQ_HEARTBEAT_PORT=5916
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-tilebeam.yml b/docker-compose/device-tilebeam.yml
index 7919beded3237fecc98cddc64b734747e3187304..c8665d568982663acb6859f23686ade25e3b33fc 100644
--- a/docker-compose/device-tilebeam.yml
+++ b/docker-compose/device-tilebeam.yml
@@ -27,6 +27,8 @@ services:
       - control
     ports:
       - "5711:5711" # unique port for this DS
+      - "5811:5811" # ZeroMQ event port
+      - "5911:5911" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
@@ -34,6 +36,8 @@ services:
       - iers-data:/opt/IERS
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5811
+      - TANGO_ZMQ_HEARTBEAT_PORT=5911
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-unb2.yml b/docker-compose/device-unb2.yml
index 2c05d6e66b887b903d17278e3252cd8f9ea70493..cbb31b0ef2585812808b3f17d8b4270c25fa4947 100644
--- a/docker-compose/device-unb2.yml
+++ b/docker-compose/device-unb2.yml
@@ -32,12 +32,16 @@ services:
       - control
     ports:
       - "5704:5704" # unique port for this DS
+      - "5804:5804" # ZeroMQ event port
+      - "5904:5904" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
         - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5804
+      - TANGO_ZMQ_HEARTBEAT_PORT=5904
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/device-xst.yml b/docker-compose/device-xst.yml
index 6f49e17f6389ff510736543d7cb42aed4ea104b9..cdceac715982f7609764c6cb0092070111a6e3a0 100644
--- a/docker-compose/device-xst.yml
+++ b/docker-compose/device-xst.yml
@@ -35,12 +35,16 @@ services:
         - "5002:5002/udp" # port to receive XST UDP packets on
         - "5102:5102/tcp" # port to emit XST TCP packets on
         - "5706:5706" # unique port for this DS
+        - "5806:5806" # ZeroMQ event port
+        - "5906:5906" # ZeroMQ heartbeat port
     extra_hosts:
       - "host.docker.internal:host-gateway"
     volumes:
         - ..:/opt/lofar/tango:rw
     environment:
       - TANGO_HOST=${TANGO_HOST}
+      - TANGO_ZMQ_EVENT_PORT=5806
+      - TANGO_ZMQ_HEARTBEAT_PORT=5906
     working_dir: /opt/lofar/tango
     entrypoint:
       - bin/start-ds.sh
diff --git a/docker-compose/jupyter/ipython-profiles/stationcontrol-jupyter/startup/01-devices.py b/docker-compose/jupyter/ipython-profiles/stationcontrol-jupyter/startup/01-devices.py
index af329f05b03ae4bdc3b10542e96949c2f5e2b604..350ecb1e87f4829ddd60698831bbf75d941782a9 100644
--- a/docker-compose/jupyter/ipython-profiles/stationcontrol-jupyter/startup/01-devices.py
+++ b/docker-compose/jupyter/ipython-profiles/stationcontrol-jupyter/startup/01-devices.py
@@ -1,5 +1,6 @@
 # Create shortcuts for our devices
 apsct = DeviceProxy("STAT/APSCT/1")
+ccd = DeviceProxy("STAT/CCD/1")
 apspu = DeviceProxy("STAT/APSPU/1")
 recv = DeviceProxy("STAT/RECV/1")
 sdp = DeviceProxy("STAT/SDP/1")
@@ -17,4 +18,4 @@ docker = DeviceProxy("STAT/Docker/1")
 temperaturemanager = DeviceProxy("STAT/TemperatureManager/1")
 
 # Put them in a list in case one wants to iterate
-devices = [apsct, apspu, recv, sdp, bst, sst, xst, unb2, boot, tilebeam, beamlet, digitalbeam, antennafield, temperaturemanager, docker]
+devices = [apsct, ccd, apspu, recv, sdp, bst, sst, xst, unb2, boot, tilebeam, beamlet, digitalbeam, antennafield, temperaturemanager, docker]
diff --git a/docker-compose/tango-prometheus-exporter/lofar2-policy.json b/docker-compose/tango-prometheus-exporter/lofar2-policy.json
index e7da467993c3fed8f4fef44c107bbc8f0608d072..606f06499472aa11324b7566739efd6de37fdcab 100644
--- a/docker-compose/tango-prometheus-exporter/lofar2-policy.json
+++ b/docker-compose/tango-prometheus-exporter/lofar2-policy.json
@@ -7,7 +7,7 @@
     "devices": {
         "stat/antennafield/1": {
             "include": [
-                "HBAT_ANT_mask_RW"
+                "ANT_mask_RW"
             ],
             "exclude": [
                 "HBAT_BF_delay_steps_*"
@@ -15,6 +15,8 @@
         },
         "stat/apsct/1": {
         },
+        "stat/ccd/1": {
+        },
         "stat/apspu/1": {
         },
         "stat/beamlet/1": {
diff --git a/sbin/run_integration_test.sh b/sbin/run_integration_test.sh
index 30df5c7cf02be8a26b86c506299d64e0acfa45ef..3047557a3678940748746acc6f7e7e3a59ea6090 100755
--- a/sbin/run_integration_test.sh
+++ b/sbin/run_integration_test.sh
@@ -24,12 +24,16 @@ function integration_test {
   IFS=" " read -r -a restarts <<< "${2}"
   IFS=" " read -r -a configs <<< "${3}"
   for config in "${configs[@]}"; do
+    echo "Updating config ${config} ..."
     bash "${LOFAR20_DIR}"/sbin/update_ConfigDb.sh "${config}"
   done
   if [ ! -z "${2+x}" ]; then
+    # shellcheck disable=SC2145
+    echo "make restart ${restarts[@]} ..."
     make restart "${restarts[@]}"
   fi
   sleep 5
+  echo "make integration ${1} ..."
   make integration "${1}"
 }
 
@@ -69,9 +73,9 @@ sleep 1 # dsconfig container must be up and running...
 # shellcheck disable=SC2016
 echo '/usr/local/bin/wait-for-it.sh ${TANGO_HOST} --strict --timeout=300 -- true' | make run dsconfig bash -
 
-DEVICES="device-boot device-apsct device-apspu device-sdp device-recv device-bst device-sst device-unb2 device-xst device-beamlet device-digitalbeam device-tilebeam device-psoc device-pcon device-antennafield device-temperature-manager device-observation device-observation-control"
+DEVICES="device-boot device-apsct device-ccd device-apspu device-sdp device-recv device-bst device-sst device-unb2 device-xst device-beamlet device-digitalbeam device-tilebeam device-psoc device-pcon device-antennafield device-temperature-manager device-observation device-observation-control"
 
-SIMULATORS="sdptr-sim recv-sim unb2-sim apsct-sim apspu-sim"
+SIMULATORS="sdptr-sim recv-sim unb2-sim apsct-sim apspu-sim ccd-sim"
 
 # Build only the required images, please do not build everything that makes CI
 # take really long to finish, especially grafana / jupyter / prometheus.
diff --git a/sbin/tag_and_push_docker_image.sh b/sbin/tag_and_push_docker_image.sh
index d12bee575e594e0264e39c8eca6013704eb4a805..44605c52c7eed433cf89d0fab66d51946ce305cd 100755
--- a/sbin/tag_and_push_docker_image.sh
+++ b/sbin/tag_and_push_docker_image.sh
@@ -64,11 +64,13 @@ LOCAL_IMAGES=(
   "lofar-device-base lofar-device-base y"
 
   "apsct-sim docker-compose_apsct-sim y" "apspu-sim docker-compose_apspu-sim y"
+  "ccd-sim docker-compose_ccd-sim y"
   "recv-sim docker-compose_recv-sim y" "sdptr-sim docker-compose_sdptr-sim y"
-  "unb2-sim docker-compose_unb2-sim y"
+  "unb2-sim docker-compose_unb2-sim y" 
 
   "device-antennafield device-antennafield y"
   "device-apsct device-apsct y" "device-apspu device-apspu y"
+  "device-ccd device-ccd y"
   "device-boot device-boot y" "device-docker device-docker y"
   "device-observation device-observation y"
   "device-observation-control device-observation-control y"
@@ -159,13 +161,13 @@ if [ ! -z "${1+x}" ] && [ "${1}" != "pull" ]; then
       local_url="${LOCAL_DOCKER_REGISTRY_HOST}/${LOCAL_DOCKER_REGISTRY_USER}/${2}"
 
       # If tag is not latest, than it is not a tagged master build and we can
-      # pull the latest image as cache.
+      # pull the latest image as cache (if it already exists).
       if [ "${tag}" != "latest" ]; then
-        docker pull "${local_url}:latest"
+        docker pull "${local_url}:latest" || true
       fi
 
       make build "${1}"
-      docker tag "${2}" "${local_url}:${tag}"
+      docker tag "${2}" "${local_url}:${tag}" || docker tag "${2/_/-}" "${local_url}:${tag}"
       docker push "${local_url}:${tag}"
     fi
   done
diff --git a/tangostationcontrol/docs/source/broken_hardware.rst b/tangostationcontrol/docs/source/broken_hardware.rst
new file mode 100644
index 0000000000000000000000000000000000000000..7047d324ed7085122225a6e07ca67e830835b876
--- /dev/null
+++ b/tangostationcontrol/docs/source/broken_hardware.rst
@@ -0,0 +1,47 @@
+Broken Hardware
+--------------------
+
+Not all hardware is always functional. Broken hardware must be excluded from the signal chain, and in some cases prevented from powering up.
+
+Disabling antennas
+``````````````````````````
+
+Not all antennas present in the field are to be used. The AntennaField device exposes the following properties for each of its antennas:
+
+:Antenna_Quality: The condition of the antenna: 0=OK, 1=SUSPICIOUS, 2=BROKEN, 3=BEYOND_REPAIR.
+
+  :type: ``int32[]``
+
+:Antenna_Use: Whether each antenna should be used: 0=AUTO, 1=ON, 2=OFF. In AUTO mode, an antenna is used if its quality is OK or SUSPICIOUS. In ON mode, it is always used. In OFF mode, never.
+
+  :type: ``int32[]``
+
+which can also be queried as ``Antenna_Quality_R`` and ``Antenna_Use_R``.
+
+.. note:: If these properties are updated, you should restart both the AntennaField and DigitalBeam device to propagate their effects.
+
+The above settings result in a subset of the antennas in the AntennaField to be marked as usable. The following property exposes this conclusion:
+
+:Antenna_Usage_Mask_R: Whether antennas will be used, according to their configured state and quality. Antennas which are configured to be BROKEN, BEYOND_REPAIR, or OFF, are not used.
+
+  :type: ``bool[N_tiles]``
+
+Effect on signal chain
+""""""""""""""""""""""""""
+
+The DigitalBeam device will only beamform inputs that are enabled in the ``AntennaField.Antenna_Usage_Mask_R`` attribute.
+
+
+Power distribution
+--------------------------
+
+At boot, during hardware initialisation, the following devices toggle power:
+
+* The RECV device turns all RCUs enabled in ``RCU_mask_RW`` OFF and ON,
+* The RECV device powers its antennas according to its ``RCU_PWR_ANT_on_RW_default`` property,
+* The AntennaField device powers its antennas, if they are:
+  * Enabled in ``Antenna_Usage_Mask_R`` attribute, that is, not marked as BROKEN, BEYOND_REPAIR, or OFF,
+  * Enabled in the ``Antenna_Needs_Power`` property.
+
+.. note:: Exotic inputs like a noise source must not receive power, even when used. Use the ``Antenna_Needs_Power`` property to configure which antennas should be powered on.
+
diff --git a/tangostationcontrol/docs/source/devices/antennafield.rst b/tangostationcontrol/docs/source/devices/antennafield.rst
index d9c36a0148fab3b74b8cf1311b0d8c4369686da9..faede195aec38828f2c1d1d6b71d2bdb928ef6eb 100644
--- a/tangostationcontrol/docs/source/devices/antennafield.rst
+++ b/tangostationcontrol/docs/source/devices/antennafield.rst
@@ -3,13 +3,13 @@ AntennaField
 
 The ``antennafield == DeviceProxy("STAT/AntennaField/1")`` device represents a set of *antennas* or *tiles* that collectively form an antenna field. It represents a selection of inputs from one or more ``RECV`` devices, annotated with metadata such as positional information.
 
-:nr_tiles_R: The number of antennas or tiles in the antenna field.
+:nr_antennas_R: The number of antennas or tiles in the antenna field.
 
   :type: ``uint32``
 
 It provides many settings that map onto the ``RECV`` device directly, serving as a funnel:
 
-:HBAT_ANT_mask_RW: Which antennas are configured when writing settings.
+:ANT_mask_RW: Which antennas are configured when writing settings.
 
   :type: ``bool[N_tiles]``
 
@@ -20,7 +20,7 @@ Positions
 
 The following attributes expose positional information about the individual antennas in the field, in different formats:
 
-:HBAT_reference_GEO_R: Reference position of each HBA tile, in latitude/longitude (degrees).
+:Antenna_Reference_GEO_R: Reference position of each HBA tile, in latitude/longitude (degrees).
 
   :type: ``float64[N_tiles][2]``
 
@@ -46,19 +46,25 @@ The antennas represented by the antenna field are selected by the following prop
 
   :type: ``str[]``
 
+Antenna mapping
+""""""""""""""""""""
+
+These properties configure which inputs in RECV represent the power and control for each antenna:
+
 :HBAT_Power_to_RECV_mapping: Pairs of numbers ``(recv_idx, ant_idx)`` describing the inputs on which the HBAT *power* is connected. The ``recv_idx`` is the index in ``RECV_devices``, starting at 1. The ``ant_idx`` is the absolute index of the antenna in the ``RECV`` device. A value of ``-1`` means the antenna is not connected at all.
 
   :type: ``int32[]``
   :shape: ``int32[][2]``
 
-:HBAT_Control_to_RECV_mapping: Pairs of numbers ``(recv_idx, ant_idx)`` describing the inputs on which the HBAT *control* is connected. The ``recv_idx`` is the index in ``RECV_devices``, starting at 1. The ``ant_idx`` is the absolute index of the antenna in the ``RECV`` device. A value of ``-1`` means the antenna is not connected at all.
+:Control_to_RECV_mapping: Pairs of numbers ``(recv_idx, ant_idx)`` describing the inputs on which the Antenna *control* is connected. The ``recv_idx`` is the index in ``RECV_devices``, starting at 1. The ``ant_idx`` is the absolute index of the antenna in the ``RECV`` device. A value of ``-1`` means the antenna is not connected at all.
+
 
 Positions
 """"""""""""""""""""
 
 The positions are given in ETRS, using the following properties:
 
-:HBAT_reference_ETRS: Reference position of each HBA tile, in ETRS (x/y/z, metres).
+:Antenna_Reference_ETRS: Reference position of each HBA tile, in ETRS (x/y/z, metres).
 
   :type: ``float64[N_tiles][3]``
 
diff --git a/tangostationcontrol/docs/source/devices/ccd.rst b/tangostationcontrol/docs/source/devices/ccd.rst
new file mode 100644
index 0000000000000000000000000000000000000000..a419254829f659ddf09cedf99a7e76cd9382b61e
--- /dev/null
+++ b/tangostationcontrol/docs/source/devices/ccd.rst
@@ -0,0 +1,6 @@
+.. _ccd:
+
+CCD
+--------------------
+
+The ``ccd == DeviceProxy("STAT/CCD/1")`` Clock Control Device controls the clock
diff --git a/tangostationcontrol/docs/source/devices/tilebeam-digitalbeam.rst b/tangostationcontrol/docs/source/devices/tilebeam-digitalbeam.rst
index eeccd01ea74f10ab6f1d34fbf2b64cf9e79f4059..c6701097b7976b55ce2d8fae9813bb842199b134 100644
--- a/tangostationcontrol/docs/source/devices/tilebeam-digitalbeam.rst
+++ b/tangostationcontrol/docs/source/devices/tilebeam-digitalbeam.rst
@@ -22,9 +22,9 @@ Both devices beamform the antennas configured in its associated ``AntennaField``
 - TileBeam:
 
     - Beamforms HBA elements in the HBA tiles of its AntennaField device,
-    - Uses ``antennafield.HBAT_Reference_ITRF_R`` as the reference position for each tile,
+    - Uses ``antennafield.Antenna_Reference_ITRF_R`` as the reference position for each tile,
     - Allows a different pointing per HBA tile,
-    - ``N_output := antennafield.nr_tiles_R``,
+    - ``N_output := antennafield.nr_antennas_R``,
     - Uploads the computed weights to ``antennafield.HBAT_bf_delay_steps_RW``,
     - These weights are actually *delay steps* to be applied in the tile for each element.
 
@@ -141,7 +141,7 @@ The following timers allow you to track the durations of each stage:
 DigitalBeam
 `````````````````````
 
-The DigitalBeam device applies the following configuration to compute each beamlet. Here, ``N_ant := antennafield.nr_tiles_R`` and ``N_beamlet := NUM_BEAMLETS == N_output``.
+The DigitalBeam device applies the following configuration to compute each beamlet. Here, ``N_ant := antennafield.nr_antennas_R`` and ``N_beamlet := NUM_BEAMLETS == N_output``.
 
 :antenna_select_RW: Which beamlets to form with which antenna. ``True`` by default, except for antennas which are not mapped on any FPGA input (see "Configuration" below).
 
diff --git a/tangostationcontrol/docs/source/devices/using.rst b/tangostationcontrol/docs/source/devices/using.rst
index 053d73bda33703c187f6bd9de9d7d84194647254..57d2f255ed2fdd673e8996492a8b2ff434960387 100644
--- a/tangostationcontrol/docs/source/devices/using.rst
+++ b/tangostationcontrol/docs/source/devices/using.rst
@@ -109,12 +109,10 @@ Most devices provide the following commands, in order to configure the hardware
 
 :set_translator_defaults(): Select the hardware to configure and monitor.
 
-:prepare_hardware(): For devices that control hardware, this command prepares the hardware to accept commands (f.e. load firmware).
+:prepare_hardware(): For devices that control hardware, this command prepares the hardware to accept commands (f.e. power cycle, load firmware).
 
 :set_defaults(): Upload default attribute settings from the TangoDB to the hardware.
 
-:initialise_hardware(): For devices that control hardware, this command runs the hardware initialisation procedure.
-
 :on(): Mark the device as operational. Moves from ``STANDBY`` to ``ON``.
 
 See also :ref:`boot`, which provides functionality to initialise all the devices.
diff --git a/tangostationcontrol/docs/source/index.rst b/tangostationcontrol/docs/source/index.rst
index 07c5fb4ac45444e941b31b3869198b2504284389..4c56206dfce3ab37b07f103a963d06846ccd8f12 100644
--- a/tangostationcontrol/docs/source/index.rst
+++ b/tangostationcontrol/docs/source/index.rst
@@ -29,10 +29,12 @@ Even without having access to any LOFAR2.0 hardware, you can install the full st
    devices/boot
    devices/docker
    devices/psoc
+   devices/ccd
    devices/temperature-manager
    devices/configure
    configure_station
    signal_chain
+   broken_hardware
    developer
    faq
 
diff --git a/tangostationcontrol/requirements.txt b/tangostationcontrol/requirements.txt
index b058e7aa521056c9f74db04f22bf8a601ef7e539..b252910091df6eaca22673b2931b1ab73405c2f0 100644
--- a/tangostationcontrol/requirements.txt
+++ b/tangostationcontrol/requirements.txt
@@ -9,6 +9,7 @@ psycopg2-binary >= 2.9.2 # LGPL
 sqlalchemy >= 1.4.26 # MIT
 pysnmp >= 0.1.7 # BSD
 h5py >= 3.1.0 # BSD
+jsonschema >= 3.2.0 # MIT
 psutil >= 5.8.0 # BSD
 docker >= 5.0.3 # Apache 2
 python-logstash-async >= 2.3.0 # MIT
diff --git a/tangostationcontrol/setup.cfg b/tangostationcontrol/setup.cfg
index bdb3dbae7df1071b616c769342155349fde7ca65..510034a343b89b2bc2a24bd212bafe77a4565a67 100644
--- a/tangostationcontrol/setup.cfg
+++ b/tangostationcontrol/setup.cfg
@@ -35,6 +35,7 @@ where=.
 [options.entry_points]
 console_scripts =
     l2ss-apsct = tangostationcontrol.devices.apsct:main
+	l2ss-ccd = tangostationcontrol.devices.ccd:main
     l2ss-apspu = tangostationcontrol.devices.apspu:main
     l2ss-psoc = tangostationcontrol.devices.psoc:main
     l2ss-pcon = tangostationcontrol.devices.pcon:main
@@ -57,13 +58,11 @@ console_scripts =
     l2ss-temperature-manager = tangostationcontrol.devices.temperature_manager:main
 
 # The following entry points should eventually be removed / replaced
-    l2ss-cold-start = tangostationcontrol.toolkit.lts_cold_start:main
     l2ss-hardware-device-template = tangostationcontrol.examples.HW_device_template:main
     l2ss-ini-device = tangostationcontrol.examples.load_from_disk.ini_device:main
-    l2ss-parse-sdp-packet = tangostationcontrol.devices.sdp.packet:main
+    l2ss-parse-statistics-packet = tangostationcontrol.statistics.packet:main
     l2ss-random-data = tangostationcontrol.test.devices.random_data:main
-    l2ss-snmp = tangostationcontrol.examples.snmp.snmp:main
-    l2ss-version = tangostationcontrol.common.lofar_version:main
+    l2ss-version = tangostationcontrol:print_version
 
 [options.package_data]
 * = *.json, *.mib
diff --git a/tangostationcontrol/tangostationcontrol/devices/README.md b/tangostationcontrol/tangostationcontrol/devices/README.md
index cb4efc08e5345657f96db0cc9afbf74e6a0c7d0f..d7c5a64a95fa9f43c7a2524a71cf1379e6527341 100644
--- a/tangostationcontrol/tangostationcontrol/devices/README.md
+++ b/tangostationcontrol/tangostationcontrol/devices/README.md
@@ -9,8 +9,7 @@ If a new device is added, it will (likely) need to be referenced in several plac
 - Adjust `CDB/LOFAR_ConfigDb.json` to create the device in the Tango device database,
 - Adjust `docker-compose/jupyter/ipython-profiles/stationcontrol-jupyter/startup/01-devices.py` to make an alias for it available in Jupyter,
 - Adjust `tangostationcontrol/tangostationcontrol/devices/boot.py` to add the device to the station initialisation sequence,
-- Add to `docker-compose/` to create a YaML file to start the device in a docker container. NOTE: it needs a unique 57xx port assigned,
-                            current _unused_ port value: 5718
+- Add to `docker-compose/` to create a YaML file to start the device in a docker container. NOTE: it needs a unique 57xx port assigned (current _unused_ port value: 5722), a unique 58xx port for ZMQ events, and a unique 59xx port for ZMQ heartbeat
 - Adjust `tangostationcontrol/setup.cfg` to add an entry point for the device in the package installation,
 - Add to `tangostationcontrol/tangostationcontrol/integration_test/default/devices/` to add an integration test,
 - Adjust `sbin/run_integration_test.sh` to have the device started when running the integration tests,
@@ -18,4 +17,4 @@ If a new device is added, it will (likely) need to be referenced in several plac
 - Add to `sbin/tag_and_push_docker_image.sh` the LOCAL_IMAGES device name, imagine name and build for integration boolean triple,
 - Add to `tangostationcontrol/docs/source/devices/` to mention the device in the end-user documentation.
 - Adjust `tangostationcontrol/docs/source/index.rst` to include the newly created file in `docs/source/devices/`.
-
+- Adjust `docker-compose/tango-prometheus-exporter/lofar2-policy.json` to include this device in the prometheus exporter
diff --git a/tangostationcontrol/tangostationcontrol/devices/antennafield.py b/tangostationcontrol/tangostationcontrol/devices/antennafield.py
index 4c39a6bdea1db44f52c87f2fd3a4e6add71e3d99..565f979539a3a70f538f39f880cd7efeae0102e4 100644
--- a/tangostationcontrol/tangostationcontrol/devices/antennafield.py
+++ b/tangostationcontrol/tangostationcontrol/devices/antennafield.py
@@ -25,7 +25,7 @@ from tangostationcontrol.beam.hba_tile import HBATAntennaOffsets, NUMBER_OF_ELEM
 import logging
 logger = logging.getLogger()
 
-__all__ = ["AntennaField", "HBATToRecvMapper", "main"]
+__all__ = ["AntennaField", "AntennaToRecvMapper", "main"]
 
 # Highest number of HBA tiles we support per AntennaField
 MAX_NUMBER_OF_HBAT = 96
@@ -68,9 +68,9 @@ class AntennaField(lofar_device):
 
         The antenna field models a number of antennas, each of which
         carries:
-          * a position in HBAT_reference_ETRS/ITRF,
-          * a control mapping onto an RCU in HBAT_Control_to_RECV_mapping,
-          * a power mapping onto an RCU in HBAT_Power_to_RECV_mapping.
+          * a position in Antenna_Reference_ETRS/ITRF,
+          * a control mapping onto an RCU in Control_to_RECV_mapping,
+          * a power mapping onto an RCU in Power_to_RECV_mapping.
 
         Furthermore, a central field reference position for the
         antenna field is maintained in Antenna_Field_Reference_ETRS/ITRF.
@@ -85,6 +85,15 @@ class AntennaField(lofar_device):
         calculated, as well as the geohash.
     """
 
+    # ----- Antenna names
+
+    Antenna_Names = device_property(
+        doc="Name of each antenna",
+        dtype='DevVarStringArray',
+        mandatory=False,
+        default_value = [f'Antenna{n+1}' for n in range(MAX_NUMBER_OF_HBAT)]
+    )
+
     # ----- Antenna states
 
     Antenna_Quality = device_property(
@@ -101,6 +110,15 @@ class AntennaField(lofar_device):
         default_value = numpy.array([AntennaUse.AUTO] * MAX_NUMBER_OF_HBAT)
     )
 
+    # ----- Antenna properties
+
+    Antenna_Needs_Power = device_property(
+        doc="Whether to provide power to each antenna (False for noise sources)",
+        dtype='DevVarBooleanArray',
+        mandatory=False,
+        default_value = numpy.array([False] * MAX_NUMBER_OF_HBAT)
+    )
+
     # ----- Position information
 
     Antenna_Field_Reference_ITRF = device_property(
@@ -115,14 +133,14 @@ class AntennaField(lofar_device):
         mandatory=False
     )
 
-    HBAT_reference_ITRF = device_property(
-        doc="ITRF position (XYZ) of each HBAT (leave empty to auto-derive from ETRS)",
+    Antenna_Reference_ITRF = device_property(
+        doc="ITRF position (XYZ) of each Antenna (leave empty to auto-derive from ETRS)",
         dtype='DevVarFloatArray',
         mandatory=False
     )
  
-    HBAT_reference_ETRS = device_property(
-        doc="ETRS position (XYZ) of each HBAT",
+    Antenna_Reference_ETRS = device_property(
+        doc="ETRS position (XYZ) of each Antenna",
         dtype='DevVarFloatArray',
         mandatory=False
     )
@@ -140,7 +158,6 @@ class AntennaField(lofar_device):
         mandatory=False,
         default_value = 2015.5
     )
-
     HBAT_PQR_rotation_angles_deg = device_property(
         doc='Rotation of each tile in the PQ plane ("horizontal") in degrees.',
         dtype='DevVarFloatArray',
@@ -167,23 +184,23 @@ class AntennaField(lofar_device):
 
     # ----- RECV mapping
     
-    HBAT_Power_to_RECV_mapping = device_property(
+    Power_to_RECV_mapping = device_property(
         dtype=(numpy.int32,),
-        doc='The mapping of HBAT power lines to RECV mapping. Each RECV can handle 96 inputs. The HBAT number is the index and the value shows to which receiver device it is connected and on which input. The first integer is the input. The second integer is the RECV id. Example: [0, 3] = first receiver of property RECV_devices with input 3. -1 means that the HBAT is not connected. The property is stored in a one dimensional structure. It needs to be reshaped to a list of lists of two items.',
+        doc='The mapping of Antenna power lines to RECV mapping. Each RECV can handle 96 inputs. The Antenna number is the index and the value shows to which receiver device it is connected and on which input. The first integer is the input. The second integer is the RECV id. Example: [0, 3] = first receiver of property RECV_devices with input 3. -1 means that the Antenna is not connected. The property is stored in a one dimensional structure. It needs to be reshaped to a list of lists of two items.',
         mandatory=False,
         default_value = [-1] * MAX_NUMBER_OF_HBAT * 2
     )
 
-    HBAT_Control_to_RECV_mapping = device_property(
+    Control_to_RECV_mapping = device_property(
         dtype=(numpy.int32,),
-        doc='The mapping of HBAT control lines to RECV mapping. Each RECV can handle 96 inputs. The HBAT number is the index and the value shows to which receiver device it is connected and on which input. The first integer is the input. The second interger is the RECV id. Example: [1, 3] = STAT/RECV/1 with input 3. -1 means that the HBAT is not connected. The property is stored in a one dimensional structure. It needs to be reshaped to a list of lists of two items.',
+        doc='The mapping of Antenna control lines to RECV mapping. Each RECV can handle 96 inputs. The Antenna number is the index and the value shows to which receiver device it is connected and on which input. The first integer is the input. The second interger is the RECV id. Example: [1, 3] = STAT/RECV/1 with input 3. -1 means that the Antenna is not connected. The property is stored in a one dimensional structure. It needs to be reshaped to a list of lists of two items.',
         mandatory=False,
         default_value = [-1] * MAX_NUMBER_OF_HBAT * 2
     )
 
-    HBAT_to_FPGA_mapping = device_property(
+    Antenna_to_FPGA_mapping = device_property(
         dtype=(numpy.int32,),
-        doc='The mapping of HBAT control lines to FPGA inputs. Each array element describes which antenna of the AntennaField is connected there (-1 = no antenna connected)',
+        doc='The mapping of Antenna control lines to FPGA inputs. Each array element describes which antenna of the AntennaField is connected there (-1 = no antenna connected)',
         mandatory=False,
         default_value = [-1] * MAX_NUMBER_OF_HBAT
     )
@@ -195,14 +212,23 @@ class AntennaField(lofar_device):
         default_value = []
     )
 
-    Antenna_Quality_R = attribute(access=AttrWriteType.READ,
-        dtype=(numpy.uint16,), max_dim_x=MAX_NUMBER_OF_HBAT)
-    Antenna_Use_R = attribute(access=AttrWriteType.READ,
-        dtype=(numpy.uint16,), max_dim_x=MAX_NUMBER_OF_HBAT)
-    Antenna_Usage_Mask_R = attribute(access=AttrWriteType.READ,
+    Antenna_Names_R = attribute(access=AttrWriteType.READ,
+        dtype=(str,), max_dim_x=MAX_NUMBER_OF_HBAT)
+    Antenna_Quality_R = attribute(doc='The quality of each antenna. 0=OK, 1=SUSPICIOUS, 2=BROKEN, 3=BEYOND_REPAIR.',
+        dtype=(numpy.uint32,), max_dim_x=MAX_NUMBER_OF_HBAT)
+    Antenna_Use_R = attribute(doc='Whether each antenna should be used. 0=AUTO, 1=ON, 2=OFF. In AUTO mode, the antenna is used if it is not BROKEN or BEYOND_REPAIR.',
+        dtype=(numpy.uint32,), max_dim_x=MAX_NUMBER_OF_HBAT)
+    Antenna_Quality_str_R = attribute(doc='The quality of each antenna, as a string.',
+        dtype=(str,), max_dim_x=MAX_NUMBER_OF_HBAT)
+    Antenna_Use_str_R = attribute(doc='Whether each antenna should be used, as a string.',
+        dtype=(str,), max_dim_x=MAX_NUMBER_OF_HBAT)
+
+    Antenna_Usage_Mask_R = attribute(doc='Whether each antenna will be used.',
         dtype=(bool,), max_dim_x=MAX_NUMBER_OF_HBAT)
 
-    HBAT_ANT_mask_RW             = mapped_attribute("ANT_mask_RW", dtype=(bool,), max_dim_x=MAX_NUMBER_OF_HBAT, access=AttrWriteType.READ_WRITE)
+    ANT_mask_RW                  = mapped_attribute("ANT_mask_RW", dtype=(bool,), max_dim_x=MAX_NUMBER_OF_HBAT, access=AttrWriteType.READ_WRITE)
+    RCU_PWR_ANT_on_R             = mapped_attribute("RCU_PWR_ANT_on_R", dtype=(bool,), max_dim_x=MAX_NUMBER_OF_HBAT)
+    RCU_PWR_ANT_on_RW            = mapped_attribute("RCU_PWR_ANT_on_RW", dtype=(bool,), max_dim_x=MAX_NUMBER_OF_HBAT, access=AttrWriteType.READ_WRITE)
     HBAT_BF_delay_steps_R        = mapped_attribute("HBAT_BF_delay_steps_R", dtype=((numpy.int64,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT)
     HBAT_BF_delay_steps_RW       = mapped_attribute("HBAT_BF_delay_steps_RW", dtype=((numpy.int64,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT, access=AttrWriteType.READ_WRITE)
     HBAT_LED_on_R                = mapped_attribute("HBAT_LED_on_R", dtype=((bool,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT)
@@ -231,43 +257,56 @@ class AntennaField(lofar_device):
         doc='For each tile, the offsets of the antennas within that, in ITRF ("iHBADeltas"). True shape: nrtiles x 16 x 3.',
         dtype=((numpy.float64,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 3, max_dim_y=96)
 
-    HBAT_reference_ITRF_R = attribute(access=AttrWriteType.READ,
+    Antenna_Reference_ITRF_R = attribute(access=AttrWriteType.READ,
         doc='Absolute reference position of each tile, in ITRF (XYZ)',
         dtype=((numpy.float64,),), max_dim_x=3, max_dim_y=MAX_NUMBER_OF_HBAT)
 
-    HBAT_reference_GEO_R = attribute(access=AttrWriteType.READ,
+    Antenna_Reference_GEO_R = attribute(access=AttrWriteType.READ,
         doc='Absolute reference position of each tile, in latitude/longitude (degrees)',
         dtype=((numpy.float64,),), max_dim_x=2, max_dim_y=MAX_NUMBER_OF_HBAT)
 
-    HBAT_reference_GEOHASH_R = attribute(access=AttrWriteType.READ,
+    Antenna_Reference_GEOHASH_R = attribute(access=AttrWriteType.READ,
         doc='Absolute reference position of each tile, as geohash strings',
         dtype=(str,), max_dim_x=MAX_NUMBER_OF_HBAT,)
 
-    nr_tiles_R = attribute(
-        doc='Number of HBAT in this field',
+    nr_antennas_R = attribute(
+        doc='Number of Antennas in this field',
         dtype=numpy.int32)
 
+    def read_Antenna_Names_R(self):
+        return self.Antenna_Names
+    
     def read_Antenna_Use_R(self):
         return self.Antenna_Use
     
     def read_Antenna_Quality_R(self):
         return self.Antenna_Quality
+
+    def read_Antenna_Use_str_R(self):
+        return [AntennaUse(x).name for x in self.Antenna_Use]
     
+    def read_Antenna_Quality_str_R(self):
+        return [AntennaQuality(x).name for x in self.Antenna_Quality]
+
     def read_Antenna_Usage_Mask_R(self):
-        antenna_usage = numpy.zeros(MAX_NUMBER_OF_HBAT, dtype=bool)
-        for n in range(0, MAX_NUMBER_OF_HBAT):
-            antenna_usage[n] = (self.read_attribute('Antenna_Use_R')[n] == AntennaUse.ON
-                or (self.read_attribute('Antenna_Use_R')[n] == AntennaUse.AUTO and self.read_attribute('Antenna_Quality_R')[n] <= AntennaQuality.SUSPICIOUS))
-        return antenna_usage
+        use     = numpy.array(self.Antenna_Use)
+        quality = numpy.array(self.Antenna_Quality)
+
+        antennas_forced_on = use == AntennaUse.ON
+        antennas_auto_on   = numpy.logical_and(use == AntennaUse.AUTO, quality <= AntennaQuality.SUSPICIOUS)
+
+        return numpy.logical_or(antennas_forced_on, antennas_auto_on)
     
-    def read_nr_tiles_R(self):
-        # The number of tiles should be equal to:
-        # * the number of elements in the HBAT_Control_to_RECV_mapping (after reshaping),
-        # * the number of elements in the HBAT_Power_to_RECV_mapping (after reshaping),
-        # * the number of antennas exposed through HBAT_reference_ITRF_R.
+    def read_nr_antennas_R(self):
+        # The number of antennas should be equal to:
+        # * the number of elements in the Control_to_RECV_mapping (after reshaping),
+        # * the number of elements in the Power_to_RECV_mapping (after reshaping),
+        # * the number of antennas exposed through Antenna_Reference_ITRF_R.
+        # * the number of elements in Antenna_Use
+        # * the number of elements in Antenna_Quality
         #
         # Parsing a property here is quickest, so we chose that.
-        return len(self.HBAT_Control_to_RECV_mapping) // 2
+        return len(self.Control_to_RECV_mapping) // 2
     
     def read_Antenna_Field_Reference_ITRF_R(self):
         # provide ITRF field coordinates if they were configured
@@ -314,20 +353,20 @@ class AntennaField(lofar_device):
 
         return all_offsets.reshape(-1, NUMBER_OF_ELEMENTS_PER_TILE * 3)
     
-    def read_HBAT_reference_ITRF_R(self):
+    def read_Antenna_Reference_ITRF_R(self):
         # provide ITRF coordinates if they were configured
-        if self.HBAT_reference_ITRF:
-            return numpy.array(self.HBAT_reference_ITRF).reshape(-1,3)
+        if self.Antenna_Reference_ITRF:
+            return numpy.array(self.Antenna_Reference_ITRF).reshape(-1,3)
 
         # calculate them from ETRS coordinates if not, using the configured ITRF reference
-        ETRS_coordinates = numpy.array(self.HBAT_reference_ETRS).reshape(-1,3)
+        ETRS_coordinates = numpy.array(self.Antenna_Reference_ETRS).reshape(-1,3)
         return ETRS_to_ITRF(ETRS_coordinates, self.ITRF_Reference_Frame, self.ITRF_Reference_Epoch)
 
-    def read_HBAT_reference_GEO_R(self):
-        return ITRF_to_GEO(self.read_HBAT_reference_ITRF_R())
+    def read_Antenna_Reference_GEO_R(self):
+        return ITRF_to_GEO(self.read_Antenna_Reference_ITRF_R())
 
-    def read_HBAT_reference_GEOHASH_R(self):
-        return GEO_to_GEOHASH(self.read_HBAT_reference_GEO_R())
+    def read_Antenna_Reference_GEOHASH_R(self):
+        return GEO_to_GEOHASH(self.read_Antenna_Reference_GEO_R())
 
     def __setup_all_receiver_proxies(self):
         self.recv_proxies = []
@@ -341,9 +380,9 @@ class AntennaField(lofar_device):
     def __setup_mapper(self):
         number_of_receivers = len(self.RECV_devices)
         # Reshape of mapping is needed because properties are stored in 1d arrays
-        control_mapping = numpy.reshape(self.HBAT_Control_to_RECV_mapping, (-1, 2))
-        power_mapping = numpy.reshape(self.HBAT_Power_to_RECV_mapping, (-1, 2))
-        self.__mapper = HBATToRecvMapper(control_mapping, power_mapping, number_of_receivers)
+        control_mapping = numpy.reshape(self.Control_to_RECV_mapping, (-1, 2))
+        power_mapping = numpy.reshape(self.Power_to_RECV_mapping, (-1, 2))
+        self.__mapper = AntennaToRecvMapper(control_mapping, power_mapping, number_of_receivers)
 
     def get_mapped_attribute(self, mapped_point):
         recv_results = []
@@ -374,42 +413,26 @@ class AntennaField(lofar_device):
     
     @log_exceptions()
     def _prepare_hardware(self):
-        # Initialise the RCU hardware.
-        for recv_proxy in self.recv_proxies:
-            RCU_mask = recv_proxy.RCU_mask_RW
-            # Set the mask to all Trues
-            recv_proxy.RCU_mask_RW = [True] * 32
-            # Turn off the RCUs
-            recv_proxy.RCU_off()
-
-            # TODO(Stefano): restore wait attribute
-            #recv_proxy.wait_attribute("RECVTR_translator_busy_R", False, recv_proxy.RCU_On_Off_timeout)
-            
-            # Restore the mask
-            recv_proxy.RCU_mask_RW = RCU_mask
-            # Turn on the RCUs
-            recv_proxy.RCU_on()
+        usage_mask = self.read_attribute('Antenna_Usage_Mask_R')
 
-            # TODO(Stefano): restore wait attribute
-            #recv_proxy.wait_attribute("RECVTR_translator_busy_R", False, recv_proxy.RCU_On_Off_timeout)
-    
-    @log_exceptions()
-    def _initialise_hardware(self):
         # Disable controlling the tiles that fall outside the mask
         # WARN: Needed in configure_for_initialise but Tango does not allow to write attributes in INIT state
-        self.proxy.write_attribute('HBAT_ANT_mask_RW', self.read_attribute('Antenna_Usage_Mask_R'))
+        self.proxy.write_attribute('ANT_mask_RW', self.read_attribute('Antenna_Usage_Mask_R'))
+
+        # Turn on power to antennas that need it (and due to the ANT_mask, that we're using)
+        self.proxy.write_attribute('RCU_PWR_ANT_on_RW', self.Antenna_Needs_Power)
 
     # --------
     # Commands
     # --------
     @command(dtype_in=DevVarFloatArray, dtype_out=DevVarLongArray)
     def calculate_HBAT_bf_delay_steps(self, delays: numpy.ndarray):   
-        num_tiles = self.read_nr_tiles_R()
+        num_tiles = self.read_nr_antennas_R()
 
         delays = delays.reshape(num_tiles, NUMBER_OF_ELEMENTS_PER_TILE)
 
         result_values = numpy.zeros((num_tiles, NUMBER_OF_ELEMENTS_PER_TILE * 2), dtype=numpy.int64)
-        control_mapping = numpy.reshape(self.HBAT_Control_to_RECV_mapping, (-1, 2))
+        control_mapping = numpy.reshape(self.Control_to_RECV_mapping, (-1, 2))
 
         for recv_idx, recv_proxy in enumerate(self.recv_proxies):
             # collect all delays for this recv_proxy
@@ -429,15 +452,17 @@ class AntennaField(lofar_device):
 
         return result_values.flatten()
 
-class HBATToRecvMapper(object):
-    def __init__(self, hbat_control_to_recv_mapping, hbat_power_to_recv_mapping, number_of_receivers):
-        number_of_antennas = len(hbat_control_to_recv_mapping)
+class AntennaToRecvMapper(object):
+    def __init__(self, control_to_recv_mapping, power_to_recv_mapping, number_of_receivers):
+        number_of_antennas = len(control_to_recv_mapping)
 
-        self.__control_mapping = hbat_control_to_recv_mapping
-        self.__power_mapping = hbat_power_to_recv_mapping
+        self.__control_mapping = control_to_recv_mapping
+        self.__power_mapping = power_to_recv_mapping
         self.__number_of_receivers = number_of_receivers
         self.__default_value_mapping_read = {
             "ANT_mask_RW":              numpy.full(number_of_antennas, False),
+            "RCU_PWR_ANT_on_R":         numpy.full(number_of_antennas, False),
+            "RCU_PWR_ANT_on_RW":        numpy.full(number_of_antennas, False),
             "HBAT_BF_delay_steps_R":    numpy.zeros([number_of_antennas,32], dtype=numpy.int64),
             "HBAT_BF_delay_steps_RW":   numpy.zeros([number_of_antennas,32], dtype=numpy.int64),
             "HBAT_LED_on_R":            numpy.full((number_of_antennas,32), False),
@@ -450,6 +475,7 @@ class HBATToRecvMapper(object):
         }
         self.__default_value_mapping_write = {
             "ANT_mask_RW":              numpy.full(96, False),
+            "RCU_PWR_ANT_on_RW":        numpy.full(96, False),
             "HBAT_BF_delay_steps_RW":   numpy.zeros([96,32], dtype=numpy.int64),
             "HBAT_LED_on_RW":           numpy.full((96,32), False),
             "HBAT_PWR_LNA_on_RW":       numpy.full((96,32), False),
diff --git a/tangostationcontrol/tangostationcontrol/devices/apsct.py b/tangostationcontrol/tangostationcontrol/devices/apsct.py
index 60563f1138c125c79274b1c2f5342b7df68c02e8..f2bf1fa4d7af436807fd74c9649627ffa4593bb3 100644
--- a/tangostationcontrol/tangostationcontrol/devices/apsct.py
+++ b/tangostationcontrol/tangostationcontrol/devices/apsct.py
@@ -52,6 +52,10 @@ class APSCT(opcua_device):
         default_value=10.0
     )
 
+    TRANSLATOR_DEFAULT_SETTINGS = [
+        'APSCTTR_monitor_rate_RW'
+    ]
+
     # ----------
     # Attributes
     # ----------
@@ -118,7 +122,7 @@ class APSCT(opcua_device):
     # overloaded functions
     # --------
 
-    def _initialise_hardware(self):
+    def _prepare_hardware(self):
         """ Initialise the APSCT hardware. """
 
         # Cycle clock
diff --git a/tangostationcontrol/tangostationcontrol/devices/apspu.py b/tangostationcontrol/tangostationcontrol/devices/apspu.py
index 08c43f5a4362b22bd15ab0065e243f741add98ae..70536471bf6238e009c258444956b440b2d6cf23 100644
--- a/tangostationcontrol/tangostationcontrol/devices/apspu.py
+++ b/tangostationcontrol/tangostationcontrol/devices/apspu.py
@@ -37,6 +37,10 @@ class APSPU(opcua_device):
         default_value=1
     )
 
+    TRANSLATOR_DEFAULT_SETTINGS = [
+        'APSPUTR_monitor_rate_RW'
+    ]
+
     # ----------
     # Attributes
     # ----------
diff --git a/tangostationcontrol/tangostationcontrol/devices/boot.py b/tangostationcontrol/tangostationcontrol/devices/boot.py
index cb172c34d3b4249691518609f18bd5a7ceced613..8d51d269f3e83eb2eb0a45442cec4209e00ecf13 100644
--- a/tangostationcontrol/tangostationcontrol/devices/boot.py
+++ b/tangostationcontrol/tangostationcontrol/devices/boot.py
@@ -238,6 +238,7 @@ class Boot(lofar_device):
                        "STAT/PCON/1",  # PCON boot early because it is responsible for power delivery.
                        "STAT/APSPU/1",  # APS Power Units control other hardware we want to initialise
                        "STAT/APSCT/1",
+                       "STAT/CCD/1",
                        "STAT/RECV/1",   # RCUs are input for SDP, so initialise them first
                        "STAT/UNB2/1",   # Uniboards host SDP, so initialise them first
                        "STAT/SDP/1",    # SDP controls the mask for SST/XST/BST/Beamlet, so initialise it first
diff --git a/tangostationcontrol/tangostationcontrol/devices/ccd.py b/tangostationcontrol/tangostationcontrol/devices/ccd.py
new file mode 100644
index 0000000000000000000000000000000000000000..e053d26c4e879fca236a4277742c96c0f119d350
--- /dev/null
+++ b/tangostationcontrol/tangostationcontrol/devices/ccd.py
@@ -0,0 +1,171 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of the RECV project
+#
+#
+#
+# Distributed under the terms of the APACHE license.
+# See LICENSE.txt for more info.
+
+""" CCD Device Server for LOFAR2.0
+
+"""
+
+# PyTango imports
+from tango import DebugIt
+from tango.server import command, attribute, device_property
+from tango import AttrWriteType
+import numpy
+# Additional import
+
+from tangostationcontrol.clients.attribute_wrapper import attribute_wrapper
+from tangostationcontrol.common.entrypoint import entry
+from tangostationcontrol.common.lofar_logging import device_logging_to_python
+from tangostationcontrol.common.states import DEFAULT_COMMAND_STATES
+from tangostationcontrol.devices.device_decorators import only_in_states
+from tangostationcontrol.devices.opcua_device import opcua_device
+
+import logging
+logger = logging.getLogger()
+
+__all__ = ["CCD", "main"]
+
+
+@device_logging_to_python()
+class CCD(opcua_device):
+    # -----------------
+    # Device Properties
+    # -----------------
+
+    CCDTR_monitor_rate_RW_default = device_property(
+        dtype='DevLong64',
+        mandatory=False,
+        default_value=1
+    )
+
+    # ----- Timing values
+
+    CCD_On_Off_timeout = device_property(
+        doc='Maximum amount of time to wait after turning CCD on or off',
+        dtype='DevFloat',
+        mandatory=False,
+        default_value=10.0
+    )
+
+    # ----------
+    # Attributes
+    # ----------
+    CCDTR_I2C_error_R =         attribute_wrapper(comms_annotation=["CCDTR_I2C_error_R"         ], datatype=numpy.int64)
+    CCDTR_monitor_rate_RW =     attribute_wrapper(comms_annotation=["CCDTR_monitor_rate_RW"     ], datatype=numpy.int64, access=AttrWriteType.READ_WRITE)
+    CCDTR_translator_busy_R =   attribute_wrapper(comms_annotation=["CCDTR_translator_busy_R"   ], datatype=bool)
+    CCD_clear_lock_R =          attribute_wrapper(comms_annotation=["CCD_clear_lock_R"          ], datatype=bool)
+    CCD_clear_lock_RW =         attribute_wrapper(comms_annotation=["CCD_clear_lock_RW"         ], datatype=bool, access=AttrWriteType.READ_WRITE)
+    CCD_FAN_RPM_R =             attribute_wrapper(comms_annotation=["CCD_FAN_RPM_R"             ], datatype=numpy.float64)
+    CCD_INPUT_10MHz_good_R =    attribute_wrapper(comms_annotation=["CCD_INPUT_10MHz_good_R"    ], datatype=bool)
+    CCD_INPUT_PPS_good_R =      attribute_wrapper(comms_annotation=["CCD_INPUT_PPS_good_R"      ], datatype=bool)
+    CCD_loss_lock_R =           attribute_wrapper(comms_annotation=["CCD_loss_lock_R"           ], datatype=bool)
+    CCD_PCB_ID_R =              attribute_wrapper(comms_annotation=["CCD_PCB_ID_R"              ], datatype=numpy.int64)
+    CCD_PCB_number_R =          attribute_wrapper(comms_annotation=["CCD_PCB_number_R"          ], datatype=str)
+    CCD_PCB_version_R =         attribute_wrapper(comms_annotation=["CCD_PCB_version_R"         ], datatype=str)
+    CCD_PLL_locked_R =          attribute_wrapper(comms_annotation=["CCD_PLL_locked_R"          ], datatype=bool)
+    CCD_PWR_CLK_DIST_3V3_R =    attribute_wrapper(comms_annotation=["CCD_PWR_CLK_DIST_3V3_R"    ], datatype=numpy.float64)
+    CCD_PWR_CLK_INPUT_3V3_R =   attribute_wrapper(comms_annotation=["CCD_PWR_CLK_INPUT_3V3_R"   ], datatype=numpy.float64)
+    CCD_PWR_CTRL_3V3_R =        attribute_wrapper(comms_annotation=["CCD_PWR_CTRL_3V3_R"        ], datatype=numpy.float64)
+    CCD_PWR_OCXO_INPUT_3V3_R =  attribute_wrapper(comms_annotation=["CCD_PWR_OCXO_INPUT_3V3_R"  ], datatype=numpy.float64)
+    CCD_PWR_on_R =              attribute_wrapper(comms_annotation=["CCD_PWR_on_R"              ], datatype=bool)
+    CCD_PWR_PLL_INPUT_3V3_R =   attribute_wrapper(comms_annotation=["CCD_PWR_PLL_INPUT_3V3_R"   ], datatype=numpy.float64)
+    CCD_PWR_PPS_INPUT_3V3_R =   attribute_wrapper(comms_annotation=["CCD_PWR_PPS_INPUT_3V3_R"   ], datatype=numpy.float64)
+    CCD_PWR_PPS_OUTPUT_3V3_R =  attribute_wrapper(comms_annotation=["CCD_PWR_PPS_OUTPUT_3V3_R"  ], datatype=numpy.float64)
+    CCD_TEMP_R =                attribute_wrapper(comms_annotation=["CCD_TEMP_R"                ], datatype=numpy.float64)
+    # ----------
+    # Summarising Attributes
+    # ----------
+    CCD_error_R                 = attribute(dtype=bool, fisallowed="is_attribute_access_allowed")
+
+    def read_CCD_error_R(self):
+        errors = [self.read_attribute("CCDTR_I2C_error_R") > 0,
+                self.alarm_val("CCD_loss_lock_R"),
+                self.read_attribute("CCD_INPUT_10MHz_good_R"),
+                not self.read_attribute("CCD_INPUT_10MHz_good_R"),
+                not self.read_attribute("CCD_INPUT_PPS_good_R") and not self.read_attribute("CCD_clear_lock_R"),
+                not self.read_attribute("CCD_PLL_locked_R")]
+        return any(errors)
+
+    CCD_TEMP_error_R            = attribute(dtype=bool, fisallowed="is_attribute_access_allowed", polling_period=1000)
+    CCD_VOUT_error_R            = attribute(dtype=bool, fisallowed="is_attribute_access_allowed")
+
+    def read_CCD_TEMP_error_R(self):
+        return (self.alarm_val("CCD_TEMP_R"))
+
+    def read_CCD_VOUT_error_R(self):
+        return ( self.alarm_val("CCD_PWR_CLK_DIST_3V3_R")
+               or self.alarm_val("CCD_PWR_CLK_INPUT_3V3_R")
+               or self.alarm_val("CCD_PWR_CTRL_3V3_R")
+               or self.alarm_val("CCD_PWR_OCXO_INPUT_3V3_R")
+               or self.alarm_val("CCD_PWR_PLL_INPUT_3V3_R")
+               or self.alarm_val("CCD_PWR_PPS_INPUT_3V3_R")
+               or self.alarm_val("CCD_PWR_PPS_OUTPUT_3V3_R")
+               or (not self.read_attribute("CCD_PWR_on_R"))
+               )
+
+    # --------
+    # overloaded functions
+    # --------
+
+    @command()
+    @DebugIt()
+    @only_in_states(DEFAULT_COMMAND_STATES)
+    def reset_hardware(self):
+        """ Initialise the CCD hardware. """
+
+        # Cycle clock
+        self.CCD_off()
+        self.wait_attribute("CCDTR_translator_busy_R", False, self.CCD_On_Off_timeout)
+        self.CCD_on()
+        self.wait_attribute("CCDTR_translator_busy_R", False, self.CCD_On_Off_timeout)
+
+        if not self.read_attribute("CCD_PLL_locked_R"):
+            if self.read_attribute("CCDTR_I2C_error_R"):
+                raise Exception("I2C is not working. Maybe power cycle subrack to restart CLK board and translator?")
+            else:
+                raise Exception("CCD clock is not locked")
+
+    def _disable_hardware(self):
+        """ Disable the CCD hardware. """
+
+        # Turn off the CCD
+        self.CCD_off()
+        self.wait_attribute("CCDTR_translator_busy_R", False, self.CCD_On_Off_timeout)
+
+    # --------
+    # Commands
+    # --------
+
+    @command()
+    @DebugIt()
+    @only_in_states(DEFAULT_COMMAND_STATES)
+    def CCD_off(self):
+        """
+
+        :return:None
+        """
+        self.opcua_connection.call_method(["CCD_off"])
+
+    @command()
+    @DebugIt()
+    @only_in_states(DEFAULT_COMMAND_STATES)
+    def CCD_on(self):
+        """
+
+        :return:None
+        """
+        self.opcua_connection.call_method(["CCD_on"])
+
+
+
+# ----------
+# Run server
+# ----------
+def main(**kwargs):
+    """Main function of the ObservationControl module."""
+    return entry(CCD, **kwargs)
diff --git a/tangostationcontrol/tangostationcontrol/devices/lofar_device.py b/tangostationcontrol/tangostationcontrol/devices/lofar_device.py
index 665caca7a4d0439e0a2195d9939210229b71cdb0..068c9cee675f57f8a503fe8f4036bc2e98b80433 100644
--- a/tangostationcontrol/tangostationcontrol/devices/lofar_device.py
+++ b/tangostationcontrol/tangostationcontrol/devices/lofar_device.py
@@ -11,14 +11,18 @@
 
 """
 
-# PyTango imports
-from tango.server import attribute, command, Device, DeviceMeta
-from tango import AttrWriteType, DevState, DebugIt, Attribute, DeviceProxy, AttrDataFormat, DevSource, DevDouble
+from collections.abc import Sequence
 import time
 import math
+from typing import List
+
 import numpy
 import textwrap
 
+# PyTango imports
+from tango.server import attribute, command, Device, DeviceMeta
+from tango import AttrWriteType, DevState, DebugIt, Attribute, DeviceProxy, AttrDataFormat, DevSource, DevDouble
+
 # Additional import
 from tangostationcontrol import __version__ as version
 from tangostationcontrol.clients.attribute_wrapper import attribute_wrapper
@@ -34,6 +38,14 @@ import logging
 logger = logging.getLogger()
 
 
+# TODO(Corne): Remove this in L2SS-940
+def sequence_not_str(obj):
+    """Separate sequences / collections from str, byte or bytearray"""
+
+    return (isinstance(obj, Sequence) or isinstance(obj, numpy.ndarray)) and not \
+        isinstance(obj, (str, bytes, bytearray))
+
+
 class lofar_device(Device, metaclass=DeviceMeta):
     """
 
@@ -92,6 +104,59 @@ class lofar_device(Device, metaclass=DeviceMeta):
 
         return self.get_state() in INITIALISED_STATES
 
+    # TODO(Corne): Actually implement locking in L2SS-940
+    def atomic_read_modify_write_attribute(
+        self, values: numpy.ndarray, proxy: DeviceProxy, attribute: str, sparse=None
+    ):
+        """Atomatically read-modify-write the attribute on the given proxy"""
+
+        current_values = proxy.read_attribute(attribute).value
+        self.merge_write(values, current_values, sparse)
+        proxy.write_attribute(attribute, values)
+
+    # TODO(Corne): Update docstring in L2SS-940
+    def merge_write(
+        self, merge_values: List[any], current_values: List[any], mask_or_sparse=None
+    ):
+        """Merge values as retrieved from :py:func:`~map_write` with current_values
+
+        This method will modify the contents of merge_values.
+
+        To be used by the :py:class:`~AntennaField` device to remove sparse fields
+        from mapped_values with recently retrieved current_values from RECV device.
+
+        :param merge_values: values as retrieved from :py:func:`~map_write`
+        :param current_values: values retrieved from RECV device on specific attribute
+        :param sparse: The value to identify sparse entries
+        """
+
+        if mask_or_sparse is not None and sequence_not_str(mask_or_sparse):
+            self._merge_write_mask(
+                merge_values, current_values, mask_or_sparse
+            )
+        else:
+            self._merge_write_delimiter(
+                merge_values, current_values, mask_or_sparse
+            )
+
+    def _merge_write_delimiter(
+        self, merge_values: List[any], current_values: List[any], sparse=None
+    ):
+        for idx, value in enumerate(merge_values):
+            if sequence_not_str(value):
+                self._merge_write_delimiter(merge_values[idx], current_values[idx], sparse)
+            elif value == sparse:
+                merge_values[idx] = current_values[idx]
+
+    def _merge_write_mask(
+        self, merge_values: List[any], current_values: List[any], mask: List[any]
+    ):
+        for idx, value in enumerate(merge_values):
+            if sequence_not_str(value):
+                self._merge_write_mask(merge_values[idx], current_values[idx], mask[idx])
+            elif not mask[idx]:
+                merge_values[idx] = current_values[idx]
+
     @log_exceptions()
     def init_device(self):
         """ Instantiates the device in the OFF state. """
@@ -342,16 +407,6 @@ class lofar_device(Device, metaclass=DeviceMeta):
 
         # This is just the command version of _prepare_hardware().
         self._prepare_hardware()
-
-    @only_in_states(DEFAULT_COMMAND_STATES)
-    @fault_on_error()
-    @command()
-    @DebugIt()
-    def initialise_hardware(self):
-        """ Initialise the hardware after configuring it. """
-
-        # This is just the command version of _initialise_hardware().
-        self._initialise_hardware()
     
     @only_in_states(INITIALISED_STATES)
     @fault_on_error()
@@ -391,9 +446,6 @@ class lofar_device(Device, metaclass=DeviceMeta):
             # initialise settings
             self.set_defaults()
 
-            # powercycle backing hardware
-            self.initialise_hardware()
-
         # make device available
         self.On()
 
@@ -413,11 +465,7 @@ class lofar_device(Device, metaclass=DeviceMeta):
         self._set_defaults(self.TRANSLATOR_DEFAULT_SETTINGS)
 
     def _prepare_hardware(self):
-        """ Override this method to load any firmware before configuring the hardware. """
-        pass
-
-    def _initialise_hardware(self):
-        """ Override this method to initialise any hardware after configuring it. """
+        """ Override this method to load any firmware or power cycle components before configuring the hardware. """
         pass
 
     def _disable_hardware(self):
diff --git a/tangostationcontrol/tangostationcontrol/devices/observation.py b/tangostationcontrol/tangostationcontrol/devices/observation.py
index 555000fca0ca13b2ca49efed0784a45be2f5287c..d2b22f4a91b211792b1bc9a08f32c590db6292ef 100644
--- a/tangostationcontrol/tangostationcontrol/devices/observation.py
+++ b/tangostationcontrol/tangostationcontrol/devices/observation.py
@@ -42,7 +42,7 @@ class Observation(lofar_device):
     """
 
     NUM_MAX_HBAT = MAX_NUMBER_OF_HBAT
-    NUM_INPUTS = DigitalBeam.NUM_INPUTS
+    MAX_INPUTS = DigitalBeam.MAX_INPUTS
     NUM_BEAMLETS = DigitalBeam.NUM_BEAMLETS
 
     # Attributes
@@ -52,7 +52,7 @@ class Observation(lofar_device):
     stop_time_R = attribute(dtype=numpy.float64, access=AttrWriteType.READ)
     antenna_mask_R = attribute(dtype=(numpy.int64,), max_dim_x=NUM_MAX_HBAT, access=AttrWriteType.READ)
     filter_R = attribute(dtype=numpy.str, access=AttrWriteType.READ)
-    saps_subband_R = attribute(dtype=((numpy.uint32,),), max_dim_x=NUM_INPUTS, max_dim_y=NUM_BEAMLETS, access=AttrWriteType.READ)
+    saps_subband_R = attribute(dtype=((numpy.uint32,),), max_dim_x=MAX_INPUTS, max_dim_y=NUM_BEAMLETS, access=AttrWriteType.READ)
     saps_pointing_R = attribute(dtype=((numpy.str,),), max_dim_x=3, max_dim_y=NUM_BEAMLETS, access=AttrWriteType.READ)
     tile_beam_R = attribute(dtype=(numpy.str,), max_dim_x=3, access=AttrWriteType.READ)
     first_beamlet_R = attribute(dtype=numpy.int64, access=AttrWriteType.READ)
@@ -67,6 +67,8 @@ class Observation(lofar_device):
         self._observation_id = -1
         self._stop_time = datetime.now()
 
+        self._num_inputs = 0
+
     def configure_for_initialise(self):
         """Load the JSON from the attribute and configure member variables"""
 
@@ -113,6 +115,9 @@ class Observation(lofar_device):
         self.tilebeam_proxy = DeviceProxy(f"{util.get_ds_inst_name()}/Tilebeam/1")
         self.tilebeam_proxy.set_source(DevSource.DEV)
 
+        # Collect static information
+        self._num_inputs = self.digitalbeam_proxy.antenna_select_RW.shape[0]
+
         logger.info(
             f"The observation with ID={self._observation_id} is "
             "configured. It will begin as soon as On() is called and it is"
@@ -131,8 +136,8 @@ class Observation(lofar_device):
         super().configure_for_on()
 
         # Apply Antenna Mask and Filter
-        HBAT_ANT_mask, RCU_band_select = self._apply_antennafield_settings(self.read_antenna_mask_R(), self.read_filter_R())
-        self.antennafield_proxy.HBAT_ANT_mask_RW = HBAT_ANT_mask
+        ANT_mask, RCU_band_select = self._apply_antennafield_settings(self.read_antenna_mask_R(), self.read_filter_R())
+        self.antennafield_proxy.ANT_mask_RW = ANT_mask
         self.antennafield_proxy.RCU_band_select_RW = RCU_band_select
 
         # Apply Beamlet configuration
@@ -141,7 +146,7 @@ class Observation(lofar_device):
         self.digitalbeam_proxy.antenna_select_RW = self._apply_saps_antenna_select(self.read_antenna_mask_R())
 
         # Apply Tile Beam pointing direction
-        self.tilebeam_proxy.Pointing_direction_RW = [tuple(self.read_tile_beam_R())] * self.antennafield_proxy.nr_tiles_R
+        self.tilebeam_proxy.Pointing_direction_RW = [tuple(self.read_tile_beam_R())] * self.antennafield_proxy.nr_antennas_R
 
         logger.info(f"Started the observation with ID={self._observation_id}.")
 
@@ -241,13 +246,13 @@ class Observation(lofar_device):
             retrieve the RCU band from filter name, returning the correct format for 
             AntennaField device
         """
-        HBAT_ANT_mask_RW = [False] * self.NUM_MAX_HBAT
+        ANT_mask_RW = [False] * self.NUM_MAX_HBAT
         RCU_band_select_RW = [0] * self.NUM_MAX_HBAT
         rcu_band = self.recv_proxy.get_rcu_band_from_filter(filter_name)
         for a in antenna_mask:
-            HBAT_ANT_mask_RW[a] = True
+            ANT_mask_RW[a] = True
             RCU_band_select_RW[a] = rcu_band
-        return numpy.array(HBAT_ANT_mask_RW), numpy.array(RCU_band_select_RW)
+        return numpy.array(ANT_mask_RW), numpy.array(RCU_band_select_RW)
     
     def _apply_saps_subbands(self, sap_subbands:list):
         """ Convert an array of subbands into the correct format for Beamlet device"""
@@ -268,7 +273,7 @@ class Observation(lofar_device):
     
     def _apply_saps_antenna_select(self, antenna_mask:list):
         """ Convert an array of antenna indexes into a boolean select array"""
-        antenna_select = numpy.array([[False] * self.NUM_BEAMLETS] * self.NUM_INPUTS)
+        antenna_select = numpy.array([[False] * self.NUM_BEAMLETS] * self._num_inputs)
         first_beamlet = numpy.array(self.read_first_beamlet_R(), dtype=numpy.int64)
         for a in antenna_mask:
             for i in range(first_beamlet, self.NUM_BEAMLETS):
diff --git a/tangostationcontrol/tangostationcontrol/devices/recv.py b/tangostationcontrol/tangostationcontrol/devices/recv.py
index 037b8adb69fa2515f5a3e2dbaa4ed00c8a2ab43b..aeaa506c3d0cca422426db7316dd095bc34e7de6 100644
--- a/tangostationcontrol/tangostationcontrol/devices/recv.py
+++ b/tangostationcontrol/tangostationcontrol/devices/recv.py
@@ -70,7 +70,7 @@ class RECV(opcua_device):
     )
 
     RCU_PWR_ANT_on_RW = device_property(
-        dtype='DevVarLong64Array',
+        dtype='DevVarBooleanArray',
         mandatory=False,
         default_value=[False] * 96 # turn power off by default in test setups, f.e. to prevent blowing up the noise sources
     )
@@ -83,7 +83,8 @@ class RECV(opcua_device):
 
     TRANSLATOR_DEFAULT_SETTINGS = [
         'ANT_mask_RW',
-        'RCU_mask_RW'
+        'RCU_mask_RW',
+        'RECVTR_monitor_rate_RW'
     ]
 
     # ----- Timing values
@@ -236,7 +237,7 @@ class RECV(opcua_device):
         # in positive delays regardless of the pointing direction.
         self.HBAT_bf_delay_offset = numpy.mean(self.HBAT_bf_delay_step_delays)
     
-    def _initialise_hardware(self):
+    def _prepare_hardware(self):
         """ Initialise the RCU hardware. """
 
         # Cycle RCUs
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/beamlet.py b/tangostationcontrol/tangostationcontrol/devices/sdp/beamlet.py
index 79afeacfe41c314d63a59396ceae2b4f7d523c15..e77459a88e69b285c95ad2ac22948f359fe60afb 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/beamlet.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/beamlet.py
@@ -35,7 +35,7 @@ class Beamlet(opcua_device):
     A_PN = 6
     N_POL = 2
     N_BEAMLETS_CTRL = 488
-    N_BEAMSETS_CTRL = 2
+    N_BEAMSETS_CTRL = SDP.N_beamsets_ctrl
     N_POL_BF = 2
     P_SUM = 2   # number of hops that the data of the stream has traveled to reach the BSN aligner on this node
 
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py b/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py
index f950e1f600169fdd1671d4d0d679c837e8d0c909..a310eb5e44b10ac5b4f08048bd0a0850896fb3a2 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py
@@ -37,9 +37,13 @@ class DigitalBeam(beam_device):
           * antennas:         the elements in the AntennaField that feeds the FPGA,
           * inputs:           the antenna slots of the FPGAs (covering both X and Y as one),
           * polarised_inputs: all the input slots of the FPGAs (separating X and Y).
+
+        The antennas are drawn from an AntennaField device. Only the antennas enabled
+        in the AntennaField's Antenna_Usage_Mask will be used in beamforming. Those
+        disabled in the mask will get a weight of 0.
     """
 
-    NUM_INPUTS = 96
+    MAX_INPUTS = 96
     NUM_BEAMLETS = 488
 
     # -----------------
@@ -64,7 +68,7 @@ class DigitalBeam(beam_device):
         dtype=(numpy.int32,),
         doc='Which antenna of the antennafield is connected to each input. -1 if no antenna is present.',
         mandatory=False,
-        default_value = [-1] * NUM_INPUTS
+        default_value = [-1] * MAX_INPUTS
     )
 
     # ----------
@@ -74,12 +78,19 @@ class DigitalBeam(beam_device):
     Duration_delays_R = attribute(access=AttrWriteType.READ,
         dtype=numpy.float64, fget=lambda self: self._delays.statistics["last"] or 0)
 
-    input_select_RW = attribute(doc='Selection of inputs to use for forming each beamlet',
-                                  dtype=((bool,),), max_dim_x=NUM_BEAMLETS, max_dim_y=NUM_INPUTS, access=AttrWriteType.READ_WRITE, fisallowed="is_attribute_access_allowed")
+    input_select_RW = attribute(doc='Selection of inputs to use for forming each beamlet. Allows selecting broken antennas.',
+                                  dtype=((bool,),), max_dim_x=NUM_BEAMLETS, max_dim_y=MAX_INPUTS, access=AttrWriteType.READ_WRITE, fisallowed="is_attribute_access_allowed")
+
+    antenna_select_RW = attribute(doc='Selection of antennas desired to use for forming each beamlet (= a subset of input_select of the configured antennas). Unselects broken antennas.',
+                                  dtype=((bool,),), max_dim_x=NUM_BEAMLETS, max_dim_y=MAX_INPUTS, access=AttrWriteType.READ_WRITE, fisallowed="is_attribute_access_allowed")
+
+    nr_inputs_R = attribute(doc='Number of configured inputs from the associated antenna field.',
+                                  dtype=numpy.uint32, fget="nr_inputs")
 
-    antenna_select_RW = attribute(doc='Selection of antennas to use for forming each beamlet (= a subset of input_select of the configured antennas)',
-                                  dtype=((bool,),), max_dim_x=NUM_BEAMLETS, max_dim_y=NUM_INPUTS, access=AttrWriteType.READ_WRITE, fisallowed="is_attribute_access_allowed")
+    def nr_inputs(self):
+        """ Return the number of configured inputs. """
 
+        return max(self.Input_to_Antenna_Mapping) + 1
 
     def read_input_select_RW(self):
         return self._input_select
@@ -89,7 +100,7 @@ class DigitalBeam(beam_device):
 
     def read_antenna_select_RW(self):
         # select only the rows from self.__input_select for which a mapping onto antennas is defined.
-        antenna_select = [[False] * self.NUM_BEAMLETS] * (max(self.Input_to_Antenna_Mapping) + 1)
+        antenna_select = [[False] * self.NUM_BEAMLETS] * self.nr_inputs()
 
         for input_nr, antenna_nr in enumerate(self.Input_to_Antenna_Mapping):
             if antenna_nr >= 0:
@@ -98,9 +109,18 @@ class DigitalBeam(beam_device):
         return antenna_select
 
     def write_antenna_select_RW(self, antennas):
+        # Do not use any broken antennas, even if the user requests it. This allows the user
+        # to select the antennas they would like to use.
+        antenna_usage_mask = self.antennafield_proxy.Antenna_Usage_Mask_R
+
         for input_nr, antenna_nr in enumerate(self.Input_to_Antenna_Mapping):
-            if self.antennafield_proxy.Antenna_Usage_Mask_R[input_nr] and antenna_nr >= 0:
-                self._input_select[input_nr] = antennas[antenna_nr]
+            if antenna_nr >= 0:
+                if antenna_usage_mask[antenna_nr]:
+                    # use antenna for the beamlets as supplied by the client
+                    self._input_select[input_nr] = antennas[antenna_nr]
+                else:
+                    # do not use antenna for any beamlet
+                    self._input_select[input_nr] = False
 
     # ----------
     # Summarising Attributes
@@ -120,20 +140,19 @@ class DigitalBeam(beam_device):
 
         self.antennafield_proxy = DeviceProxy(self.AntennaField_Device)
         self.antennafield_proxy.set_source(DevSource.DEV)
-        antenna_usage_mask = self.antennafield_proxy.Antenna_Usage_Mask_R
 
         self.beamlet_proxy = DeviceProxy(self.Beamlet_Device)
         self.beamlet_proxy.set_source(DevSource.DEV)
 
         # Retrieve positions from RECV device
         reference_itrf = self.antennafield_proxy.Antenna_Field_Reference_ITRF_R
-        antenna_itrf   = self.antennafield_proxy.HBAT_reference_ITRF_R.reshape(-1, 3)
+        antenna_itrf   = self.antennafield_proxy.Antenna_Reference_ITRF_R.reshape(-1, 3)
 
         # Generate positions for all FPGA inputs.
         # Use reference position for any missing antennas so they always get a delay of 0
-        input_itrf = numpy.array([reference_itrf] * self.NUM_INPUTS)
+        input_itrf = numpy.array([reference_itrf] * self.MAX_INPUTS)
         for input_nr, antenna_nr in enumerate(self.Input_to_Antenna_Mapping):
-            if antenna_usage_mask[input_nr] and antenna_nr >= 0:
+            if antenna_nr >= 0:
                 input_itrf[input_nr] = antenna_itrf[antenna_nr]
 
         # a delay calculator
@@ -143,9 +162,8 @@ class DigitalBeam(beam_device):
         self.relative_input_positions = input_itrf - reference_itrf
 
         # use all antennas in the mapping for all beamlets, unless specified otherwise
-        input_select_mask = numpy.logical_and(numpy.array(self.Input_to_Antenna_Mapping) >= 0, antenna_usage_mask)
-        input_select = numpy.repeat(input_select_mask, self.NUM_BEAMLETS).reshape(self.NUM_INPUTS, self.NUM_BEAMLETS)
-        self.write_input_select_RW(input_select)
+        self.write_input_select_RW(numpy.zeros((self.MAX_INPUTS, self.NUM_BEAMLETS), dtype=bool))
+        self.write_antenna_select_RW(numpy.ones((self.nr_inputs(), self.NUM_BEAMLETS), dtype=bool))
 
     # --------
     # internal functions
@@ -159,7 +177,7 @@ class DigitalBeam(beam_device):
         Returns delays[antenna][beamlet]
         """
 
-        delays = numpy.zeros((self.NUM_INPUTS, self.NUM_BEAMLETS), dtype=numpy.float64)
+        delays = numpy.zeros((self.MAX_INPUTS, self.NUM_BEAMLETS), dtype=numpy.float64)
 
         d = self.delay_calculator
         d.set_measure_time(timestamp)
@@ -173,7 +191,7 @@ class DigitalBeam(beam_device):
         """ Converts an array with dimensions [antenna][beamlet] -> [fpga_nr][input_nr][pol_nr][beamlet]
             by repeating the values for both polarisations. """
 
-        assert arr.shape == (self.NUM_INPUTS, self.NUM_BEAMLETS)
+        assert arr.shape == (self.MAX_INPUTS, self.NUM_BEAMLETS)
 
         # Each antenna maps on [fpga_nr][input_nr][0] and [fpga_nr][input_nr][1], and we work
         # with [antenna][beamlet], so we have to interleave copies of the input array per beamlet
@@ -206,9 +224,6 @@ class DigitalBeam(beam_device):
         beam_weights = self.beamlet_proxy.calculate_bf_weights(fpga_delays.flatten())
         beam_weights = beam_weights.reshape((Beamlet.N_PN, Beamlet.A_PN * Beamlet.N_POL * Beamlet.N_BEAMLETS_CTRL))
 
-        # Filter out unwanted antennas
-        beam_weights *= self._map_inputs_on_polarised_inputs(self._input_select)
-
         return beam_weights
 
     @TimeIt()
@@ -216,8 +231,13 @@ class DigitalBeam(beam_device):
         """
         Uploads beam weights based on a given pointing direction 2D array (96 tiles x 3 parameters)
         """
-        # Write weights to SDP
-        self.beamlet_proxy.FPGA_bf_weights_xx_yy_RW = beam_weights
+
+        self.atomic_read_modify_write_attribute(
+            beam_weights,
+            self.beamlet_proxy,
+            "FPGA_bf_weights_xx_yy_RW",
+            self._map_inputs_on_polarised_inputs(self._input_select)
+        )
 
         # Record where we now point to, now that we've updated the weights.
         # Only record pointings per beamlet, not which antennas took part
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py b/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py
index 2a7ca8991f168f6bf5ba673207da6dc9dbb09817..d35701ee4821919631a3c4b791c631ca142ae4f0 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py
@@ -113,7 +113,7 @@ class SDP(opcua_device):
     # TODO(needs to not be statically declared as this can change depending on the station and configuration)
     S_pn = 12 # Number of ADC signal inputs per Processing Node (PN) FPGA.
     N_pn = 16 # Number of FPGAs per antenna band that is controlled via the SC - SDP interface.
-    N_beamsets_ctrl = 2
+    N_beamsets_ctrl = 1
 
     FPGA_firmware_version_R = attribute_wrapper(comms_annotation=["FPGA_firmware_version_R"], datatype=str, dims=(N_pn,))
     FPGA_boot_image_R = attribute_wrapper(comms_annotation=["FPGA_boot_image_R"], datatype=numpy.int32, dims=(N_pn,), doc="Active FPGA image (0=factory, 1=user)")
diff --git a/tangostationcontrol/tangostationcontrol/devices/tilebeam.py b/tangostationcontrol/tangostationcontrol/devices/tilebeam.py
index a98e88a764461b1b1b7cd1b90a0feed8975e175d..75339492ab82353cbc3b2d3a14b7ef262f8b46d4 100644
--- a/tangostationcontrol/tangostationcontrol/devices/tilebeam.py
+++ b/tangostationcontrol/tangostationcontrol/devices/tilebeam.py
@@ -53,18 +53,18 @@ class TileBeam(beam_device):
         self.antennafield_proxy.set_source(DevSource.DEV)
 
         # We maintain the same number of tiles as the AntennaField
-        self._nr_tiles = self.antennafield_proxy.nr_tiles_R
+        self._nr_tiles = self.antennafield_proxy.nr_antennas_R
         super().configure_for_initialise(self._nr_tiles)
 
         # Retrieve positions from AntennaField device
-        HBAT_reference_itrf = self.antennafield_proxy.HBAT_reference_itrf_R
+        Antenna_Reference_itrf = self.antennafield_proxy.Antenna_Reference_itrf_R
         HBAT_antenna_itrf_offsets = self.antennafield_proxy.HBAT_antenna_itrf_offsets_R.reshape(self._nr_tiles, NUMBER_OF_ELEMENTS_PER_TILE, 3)
 
         # a delay calculator for each tile
-        self.HBAT_delay_calculators = [Delays(reference_itrf) for reference_itrf in HBAT_reference_itrf]
+        self.HBAT_delay_calculators = [Delays(reference_itrf) for reference_itrf in Antenna_Reference_itrf]
 
         # absolute positions of each antenna element
-        self.HBAT_antenna_positions = [HBAT_reference_itrf[tile] + HBAT_antenna_itrf_offsets[tile] for tile in range(self._nr_tiles)]
+        self.HBAT_antenna_positions = [Antenna_Reference_itrf[tile] + HBAT_antenna_itrf_offsets[tile] for tile in range(self._nr_tiles)]
 
     # --------
     # internal functions
@@ -106,12 +106,12 @@ class TileBeam(beam_device):
     
     @TimeIt()
     def _apply_weights(self, pointing_direction: numpy.array, timestamp: datetime.datetime, bf_delay_steps: numpy.array):
-        # Write weights to RECV through the HBATToRecvMapper
+        # Write weights to RECV through the AntennaToRecvMapper
         self.antennafield_proxy.HBAT_bf_delay_steps_RW = bf_delay_steps.reshape(self._nr_tiles, NUMBER_OF_ELEMENTS_PER_TILE * 2)
 
         # Record where we now point to, now that we've updated the weights.
         # Only the entries within the mask have been updated
-        mask = self.antennafield_proxy.HBAT_ANT_mask_RW
+        mask = self.antennafield_proxy.ANT_mask_RW
         for rcu in range(self._nr_tiles):
             if mask[rcu]:
                 self._pointing_direction_r[rcu]    = pointing_direction[rcu]
diff --git a/tangostationcontrol/tangostationcontrol/devices/unb2.py b/tangostationcontrol/tangostationcontrol/devices/unb2.py
index 8ec767588ae0e9fe333411b763d47c765da20649..ba0c1364efe3af800ca0a3cf3ae7be313d1a38ac 100644
--- a/tangostationcontrol/tangostationcontrol/devices/unb2.py
+++ b/tangostationcontrol/tangostationcontrol/devices/unb2.py
@@ -70,7 +70,8 @@ class UNB2(opcua_device):
     )
 
     TRANSLATOR_DEFAULT_SETTINGS = [
-        'UNB2_mask_RW'
+        'UNB2_mask_RW',
+        'UNB2TR_monitor_rate_RW'
     ]
 
     UNB2TR_I2C_bus_DDR4_error_R  = attribute_wrapper(comms_annotation=["UNB2TR_I2C_bus_DDR4_error_R"],datatype=numpy.int64  , dims=(2,4))
@@ -198,7 +199,7 @@ class UNB2(opcua_device):
     # overloaded functions
     # --------
 
-    def _initialise_hardware(self):
+    def _prepare_hardware(self):
         """ Initialise the UNB2 hardware. """
 
         # Cycle UNB2s
diff --git a/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_antennafield.py b/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_antennafield.py
index f14a2838d489b3f40a03186d565b56d75190f950..2a9038950c072c3cdc4742ed8e6c8f0beb902bda 100644
--- a/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_antennafield.py
+++ b/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_antennafield.py
@@ -18,7 +18,7 @@ class TestAntennaFieldDevice(AbstractTestBases.TestDeviceBase):
     def setUp(self):
         super().setUp("STAT/AntennaField/1")
         self.proxy.put_property({"RECV_devices": ["STAT/RECV/1"],
-                                 "HBAT_Power_to_RECV_mapping": [1, 1, 1, 0] + [-1] * 92})
+                                 "Power_to_RECV_mapping": [1, 1, 1, 0] + [-1] * 92})
         self.recv_proxy = self.setup_recv_proxy()
 
     def setup_recv_proxy(self):
@@ -33,8 +33,8 @@ class TestAntennaFieldDevice(AbstractTestBases.TestDeviceBase):
         result = self.proxy.get_property("RECV_devices")
         self.assertSequenceEqual(result["RECV_devices"], ["STAT/RECV/1"])
     
-    def test_HBAT_ANT_mask_RW_configured_after_Antenna_Usage_Mask(self):
-        """ Verify if HBAT_ANT_mask_RW values are correctly configured from Antenna_Usage_Mask values """
+    def test_ANT_mask_RW_configured_after_Antenna_Usage_Mask(self):
+        """ Verify if ANT_mask_RW values are correctly configured from Antenna_Usage_Mask values """
         recv_proxy = self.setup_recv_proxy()
         antennafield_proxy = self.proxy
         numpy.testing.assert_equal(numpy.array([True] * 96), recv_proxy.ANT_mask_RW)
@@ -43,30 +43,30 @@ class TestAntennaFieldDevice(AbstractTestBases.TestDeviceBase):
         antenna_use = numpy.array([AntennaUse.ON] + [AntennaUse.AUTO] * 95)
         antenna_properties = {'Antenna_Quality': antenna_qualities, 'Antenna_Use': antenna_use}
         mapping_properties = {"RECV_devices": ["STAT/RECV/1"],
-                                 "HBAT_Power_to_RECV_mapping": [-1, -1] * 48,
-                                 "HBAT_Control_to_RECV_mapping":  [1, 0 , 1, 1] + [-1, -1] * 46}      
+                                 "Power_to_RECV_mapping": [-1, -1] * 48,
+                                 "Control_to_RECV_mapping":  [1, 0 , 1, 1] + [-1, -1] * 46}      
         antennafield_proxy.off()
         antennafield_proxy.put_property(antenna_properties)
         antennafield_proxy.put_property(mapping_properties)
         antennafield_proxy.boot()   # initialise hardware values as well
         numpy.testing.assert_equal(numpy.array([True] * 96), antennafield_proxy.Antenna_Usage_Mask_R)
-        numpy.testing.assert_equal(numpy.array([True] * 2 + [False] * 46), antennafield_proxy.HBAT_ANT_mask_RW)
+        numpy.testing.assert_equal(numpy.array([True] * 2 + [False] * 46), antennafield_proxy.ANT_mask_RW)
         numpy.testing.assert_equal(numpy.array([True] * 2 + [False] * 46 + [False] * 48), recv_proxy.ANT_mask_RW)
 
-    def test_HBAT_ANT_mask_RW_configured_after_Antenna_Usage_Mask_only_one_functioning_antenna(self):
-        """ Verify if HBAT_ANT_mask_RW values are correctly configured from Antenna_Usage_Mask values (only second antenna is OK)"""
+    def test_ANT_mask_RW_configured_after_Antenna_Usage_Mask_only_one_functioning_antenna(self):
+        """ Verify if ANT_mask_RW values are correctly configured from Antenna_Usage_Mask values (only second antenna is OK)"""
         recv_proxy = self.setup_recv_proxy()
         antennafield_proxy = self.proxy
         antenna_qualities = numpy.array([AntennaQuality.BROKEN] + [AntennaQuality.OK] + [AntennaQuality.BROKEN] * 94)
         antenna_use = numpy.array([AntennaUse.AUTO] * 96)
         antenna_properties = {'Antenna_Quality': antenna_qualities, 'Antenna_Use': antenna_use}
         mapping_properties = {"RECV_devices": ["STAT/RECV/1"],
-                                 "HBAT_Power_to_RECV_mapping": [-1, -1] * 48,
-                                 "HBAT_Control_to_RECV_mapping": [1, 0 , 1, 1] + [-1, -1] * 46}
+                                 "Power_to_RECV_mapping": [-1, -1] * 48,
+                                 "Control_to_RECV_mapping": [1, 0 , 1, 1] + [-1, -1] * 46}
         antennafield_proxy.off()
         antennafield_proxy.put_property(antenna_properties)
         antennafield_proxy.put_property(mapping_properties)
         antennafield_proxy.boot()   # initialise hardware values as well
         numpy.testing.assert_equal(numpy.array([False] + [True] + [False] * 94), antennafield_proxy.Antenna_Usage_Mask_R)
-        numpy.testing.assert_equal(numpy.array([False] + [True] + [False] * 46), antennafield_proxy.HBAT_ANT_mask_RW)
+        numpy.testing.assert_equal(numpy.array([False] + [True] + [False] * 46), antennafield_proxy.ANT_mask_RW)
         numpy.testing.assert_equal(numpy.array([False] + [True] + [False] * 46 + [False] * 48), recv_proxy.ANT_mask_RW)
diff --git a/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_ccd.py b/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_ccd.py
new file mode 100644
index 0000000000000000000000000000000000000000..3f259be1c3d11269fc387fe85e42b5f05b9e8764
--- /dev/null
+++ b/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_ccd.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of the LOFAR 2.0 Station Software
+#
+#
+#
+# Distributed under the terms of the APACHE license.
+# See LICENSE.txt for more info.
+
+from .base import AbstractTestBases
+
+
+class TestDeviceCCD(AbstractTestBases.TestDeviceBase):
+
+    def setUp(self):
+        super().setUp("STAT/CCD/1")
diff --git a/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_digitalbeam.py b/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_digitalbeam.py
index f8857a0f52cb9c9e84394863b52c41e0cbf461b3..d4ba9f993a56dd3e6f20c03ef43e06e6ebfb02c4 100644
--- a/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_digitalbeam.py
+++ b/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_digitalbeam.py
@@ -21,22 +21,30 @@ class TestDeviceDigitalBeam(AbstractTestBases.TestDeviceBase):
     antenna_qualities_only_second = numpy.array([AntennaQuality.BROKEN] + [AntennaQuality.OK] + [AntennaQuality.BROKEN] * 94)
     antenna_use_ok = numpy.array([AntennaUse.AUTO] * 96)
 
+    antennafield_iden = "STAT/AntennaField/1"
+    beamlet_iden = "STAT/Beamlet/1"
+    recv_iden = "STAT/RECV/1"
+    sdp_iden = "STAT/SDP/1"
+
     def setUp(self):
         """Intentionally recreate the device object in each test"""
         super().setUp("STAT/DigitalBeam/1")
 
+        self.addCleanup(TestDeviceProxy.test_device_turn_off, self.beamlet_iden)
+        self.addCleanup(TestDeviceProxy.test_device_turn_off, self.recv_iden)
+
         self.recv_proxy = self.setup_recv_proxy()
         self.beamlet_proxy = self.setup_beamlet_proxy()
 
     def setup_recv_proxy(self):
-        recv_proxy = TestDeviceProxy("STAT/RECV/1")
+        recv_proxy = TestDeviceProxy(self.recv_iden)
         recv_proxy.off()
         recv_proxy.warm_boot()
         recv_proxy.set_defaults()
         return recv_proxy
 
     def setup_beamlet_proxy(self):
-        beamlet_proxy = TestDeviceProxy("STAT/Beamlet/1")
+        beamlet_proxy = TestDeviceProxy(self.beamlet_iden)
         beamlet_proxy.off()
         beamlet_proxy.warm_boot()
         beamlet_proxy.set_defaults()
@@ -44,7 +52,7 @@ class TestDeviceDigitalBeam(AbstractTestBases.TestDeviceBase):
     
     def setup_sdp_proxy(self):
         # setup SDP, on which this device depends
-        sdp_proxy = TestDeviceProxy("STAT/SDP/1")
+        sdp_proxy = TestDeviceProxy(self.sdp_iden)
         sdp_proxy.off()
         sdp_proxy.warm_boot()
         sdp_proxy.set_defaults()
@@ -53,9 +61,9 @@ class TestDeviceDigitalBeam(AbstractTestBases.TestDeviceBase):
     def setup_antennafield_proxy(self, antenna_qualities, antenna_use):
         # setup AntennaField
         NR_TILES = 48
-        antennafield_proxy = TestDeviceProxy("STAT/AntennaField/1")
+        antennafield_proxy = TestDeviceProxy(self.antennafield_iden)
         control_mapping = [[1,i] for i in range(NR_TILES)]
-        antennafield_proxy.put_property({"RECV_devices": ["STAT/RECV/1"],
+        antennafield_proxy.put_property({"RECV_devices": [self.recv_iden],
                                  "HBAT_Control_to_RECV_mapping": numpy.array(control_mapping).flatten(),
                                  'Antenna_Quality': antenna_qualities, 'Antenna_Use': antenna_use})
         antennafield_proxy.off()
@@ -63,9 +71,14 @@ class TestDeviceDigitalBeam(AbstractTestBases.TestDeviceBase):
         return antennafield_proxy
 
     def test_pointing_to_zenith(self):
+        self.addCleanup(TestDeviceProxy.test_device_turn_off, self.sdp_iden)
+        self.addCleanup(
+            TestDeviceProxy.test_device_turn_off, self.antennafield_iden
+        )
+
         self.setup_antennafield_proxy(self.antenna_qualities_ok, self.antenna_use_ok)
         self.setup_sdp_proxy()
-        self.setup_recv_proxy()
+
         # Setup beamlet configuration
         self.beamlet_proxy.clock_RW = 200 * 1000000
         self.beamlet_proxy.subband_select = list(range(488))
@@ -75,13 +88,86 @@ class TestDeviceDigitalBeam(AbstractTestBases.TestDeviceBase):
         self.proxy.on()
 
         # Point to Zenith
-        self.proxy.set_pointing(numpy.array([["AZELGEO","0deg","90deg"]] * 488).flatten())
+        self.proxy.set_pointing(numpy.array([["AZELGEO", "0deg", "90deg"]] * 488).flatten())
 
         # beam weights should now be non-zero, we don't actually check their values for correctness
         self.assertNotEqual(0, sum(self.beamlet_proxy.FPGA_bf_weights_xx_yy_RW.flatten()))
+
+    def test_set_pointing_masked_enable(self):
+        """Verify that only selected inputs are written"""
+
+        self.addCleanup(TestDeviceProxy.test_device_turn_off, self.sdp_iden)
+        self.addCleanup(
+            TestDeviceProxy.test_device_turn_off, self.antennafield_iden
+        )
+
+        self.setup_antennafield_proxy(self.antenna_qualities_ok, self.antenna_use_ok)
+        self.setup_sdp_proxy()
+
+        # Setup beamlet configuration
+        self.beamlet_proxy.clock_RW = 200 * 1000000
+        self.beamlet_proxy.subband_select = list(range(488))
+
+        self.proxy.initialise()
+        self.proxy.Tracking_enabled_RW = False
+        self.proxy.on()
+
+        all_zeros = numpy.array([[0] * 5856] * 16)
+        self.beamlet_proxy.FPGA_bf_weights_xx_yy_RW = all_zeros
+
+        # Enable all inputs
+        self.proxy.input_select_RW = numpy.array([[True] * 488] * 96)
+
+        self.proxy.set_pointing(
+            numpy.array([["AZELGEO", "0deg", "90deg"]] * 488).flatten()
+        )
+
+        # Verify all zeros are replaced with other values for all inputs
+        self.assertTrue(numpy.any(numpy.not_equal(
+            all_zeros, self.beamlet_proxy.FPGA_bf_weights_xx_yy_RW
+        )))
+
+    def test_set_pointing_masked_disable(self):
+        """Verify that only diabled inputs are unchanged"""
+
+        self.addCleanup(TestDeviceProxy.test_device_turn_off, self.sdp_iden)
+        self.addCleanup(
+            TestDeviceProxy.test_device_turn_off, self.antennafield_iden
+        )
+
+        self.setup_antennafield_proxy(self.antenna_qualities_ok, self.antenna_use_ok)
+        self.setup_sdp_proxy()
+
+        # Setup beamlet configuration
+        self.beamlet_proxy.clock_RW = 200 * 1000000
+        self.beamlet_proxy.subband_select = list(range(488))
+
+        self.proxy.initialise()
+        self.proxy.Tracking_enabled_RW = False
+        self.proxy.on()
+
+        non_zeros = numpy.array([[16] * 5856] * 16)
+        self.beamlet_proxy.FPGA_bf_weights_xx_yy_RW = non_zeros
+
+        # Disable all inputs
+        self.proxy.input_select_RW = numpy.array([[False] * 488] * 96)
+
+        self.proxy.set_pointing(
+            numpy.array([["AZELGEO", "0deg", "90deg"]] * 488).flatten()
+        )
+
+        # Verify all zeros are replaced with other values for all inputs
+        numpy.testing.assert_equal(
+            non_zeros, self.beamlet_proxy.FPGA_bf_weights_xx_yy_RW
+        )
     
     def test_input_select_with_all_antennas_ok(self):
-        """ Verify if input and antenna select are correctly calculated following Antennafield.Antenna_Usage_Mask """
+        """Verify if input and antenna select are correctly calculated following Antennafield.Antenna_Usage_Mask"""
+
+        self.addCleanup(
+            TestDeviceProxy.test_device_turn_off, self.antennafield_iden
+        )
+
         antennafield_proxy = self.setup_antennafield_proxy(self.antenna_qualities_ok, self.antenna_use_ok)
         numpy.testing.assert_equal(numpy.array([True] * 96), antennafield_proxy.Antenna_Usage_Mask_R)
         self.setUp()
@@ -92,7 +178,12 @@ class TestDeviceDigitalBeam(AbstractTestBases.TestDeviceBase):
         numpy.testing.assert_equal(expected_antenna_select, self.proxy.antenna_select_RW)
     
     def test_input_select_with_only_second_antenna_ok(self):
-        """ Verify if input and antenna select are correctly calculated following Antennafield.Antenna_Usage_Mask """
+        """Verify if input and antenna select are correctly calculated following Antennafield.Antenna_Usage_Mask"""
+
+        self.addCleanup(
+            TestDeviceProxy.test_device_turn_off, self.antennafield_iden
+        )
+
         antennafield_proxy = self.setup_antennafield_proxy(self.antenna_qualities_only_second, self.antenna_use_ok)
         numpy.testing.assert_equal(numpy.array([False] + [True] + [False] * 94), antennafield_proxy.Antenna_Usage_Mask_R)
         self.setUp()
diff --git a/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_observation.py b/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_observation.py
index d3f70dd07cf441be3f6deb75ce8358c861987194..4376781d4644ea8b07b07d21d3717c928a89a432 100644
--- a/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_observation.py
+++ b/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_observation.py
@@ -73,7 +73,7 @@ class TestDeviceObservation(AbstractTestBases.TestDeviceBase):
         antenna_qualities = numpy.array([AntennaQuality.OK] * 96)
         antenna_use = numpy.array([AntennaUse.AUTO] * 96)
         antennafield_proxy.put_property({"RECV_devices": ["STAT/RECV/1"],
-                                 "HBAT_Control_to_RECV_mapping": numpy.array(control_mapping).flatten(),
+                                 "Control_to_RECV_mapping": numpy.array(control_mapping).flatten(),
                                  'Antenna_Quality': antenna_qualities, 'Antenna_Use': antenna_use})
         antennafield_proxy.off()
         antennafield_proxy.boot()
@@ -166,8 +166,8 @@ class TestDeviceObservation(AbstractTestBases.TestDeviceBase):
         """Test that attributes antenna_mask and filter are correctly applied"""
         self.setup_recv_proxy()
         antennafield_proxy = self.setup_antennafield_proxy()
-        antennafield_proxy.HBAT_ANT_mask_RW = [True] * 48 # set all masks to True
-        self.assertListEqual(antennafield_proxy.HBAT_ANT_mask_RW.tolist(), [True] * 48)
+        antennafield_proxy.ANT_mask_RW = [True] * 48 # set all masks to True
+        self.assertListEqual(antennafield_proxy.ANT_mask_RW.tolist(), [True] * 48)
         antennafield_proxy.RCU_band_select_RW = [0] * 48
         self.assertListEqual(antennafield_proxy.RCU_band_select_RW.tolist(), [0] * 48)
         self.proxy.off()
@@ -175,7 +175,7 @@ class TestDeviceObservation(AbstractTestBases.TestDeviceBase):
         self.proxy.Initialise()
         self.proxy.On()
         expected_masks = [True, True, True] + [False] * 6 + [True] + [False] * 38
-        self.assertListEqual(antennafield_proxy.HBAT_ANT_mask_RW.tolist(), expected_masks)
+        self.assertListEqual(antennafield_proxy.ANT_mask_RW.tolist(), expected_masks)
         expected_bands = [2, 2, 2] + [0] * 6 + [2] + [0] * 38
         self.assertListEqual(antennafield_proxy.RCU_band_select_RW.tolist(), expected_bands)
     
diff --git a/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_observation_control.py b/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_observation_control.py
index 055c86470de831df946b7994bfdc6d760624b83c..0787b10da277311bdc7b53f08d9169c78c24268f 100644
--- a/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_observation_control.py
+++ b/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_observation_control.py
@@ -73,7 +73,7 @@ class TestObservationControlDevice(AbstractTestBases.TestDeviceBase):
         antennafield_proxy = TestDeviceProxy("STAT/AntennaField/1")
         control_mapping = [[1,i] for i in range(self.NUM_TILES)]
         antennafield_proxy.put_property({"RECV_devices": ["STAT/RECV/1"],
-                                 "HBAT_Power_to_RECV_mapping": numpy.array(control_mapping).flatten()})
+                                 "Power_to_RECV_mapping": numpy.array(control_mapping).flatten()})
         antennafield_proxy.off()
         antennafield_proxy.warm_boot()
         antennafield_proxy.set_defaults()
diff --git a/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_tilebeam.py b/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_tilebeam.py
index 991e03543e70c8b308319e45766f797e530a71c6..cfe5f42231e96bd16899734662af00078d78573d 100644
--- a/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_tilebeam.py
+++ b/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_tilebeam.py
@@ -49,13 +49,13 @@ class TestDeviceTileBeam(AbstractTestBases.TestDeviceBase):
         antenna_qualities = numpy.array([AntennaQuality.OK] * 96)
         antenna_use = numpy.array([AntennaUse.AUTO] * 96)
         antennafield_proxy.put_property({"RECV_devices": ["STAT/RECV/1"],
-                                 "HBAT_Control_to_RECV_mapping": numpy.array(control_mapping).flatten(),
+                                 "Control_to_RECV_mapping": numpy.array(control_mapping).flatten(),
                                  'Antenna_Quality': antenna_qualities, 'Antenna_Use': antenna_use})
         antennafield_proxy.off()
         antennafield_proxy.boot()
 
         # check if AntennaField really exposes the expected number of tiles
-        self.assertEqual(self.NR_TILES, antennafield_proxy.nr_tiles_R)
+        self.assertEqual(self.NR_TILES, antennafield_proxy.nr_antennas_R)
         return antennafield_proxy
     
     def test_delays_dims(self):
diff --git a/tangostationcontrol/tangostationcontrol/integration_test/default/statistics/test_writer_sst.py b/tangostationcontrol/tangostationcontrol/integration_test/default/statistics/test_writer_sst.py
index c52ac447223c079359aae4655346031862ac175a..dfb548d3ed0b8d51edab43d2c74b280cf40c0162 100644
--- a/tangostationcontrol/tangostationcontrol/integration_test/default/statistics/test_writer_sst.py
+++ b/tangostationcontrol/tangostationcontrol/integration_test/default/statistics/test_writer_sst.py
@@ -46,6 +46,45 @@ class TestStatisticsWriterSST(BaseIntegrationTestCase):
         self.assertIsNotNone(self.recv_proxy.RCU_Band_Select_R)
         self.assertIsNotNone(self.recv_proxy.RCU_DTH_on_R)
     
+    def test_header_info(self):
+        """ Test whether the header info are inserted and collected in the proper way"""
+        with TemporaryDirectory() as tmpdir:
+            new_sys_argv = [
+                sys.argv[0],
+                "--mode", "SST",
+                "--no-tango",
+                "--file", join(
+                    dirname(dirname(dirname(dirname(__file__)))),
+                    "test/statistics", "SDP_SST_statistics_packets.bin"
+                ),
+                "--output_dir", tmpdir
+            ]
+
+            with mock.patch.object(entry.sys, 'argv', new_sys_argv):
+                with self.assertRaises(SystemExit):
+                    entry.main()
+            
+            # check if file was written
+            self.assertTrue(isfile(f"{tmpdir}/SST_2021-09-20-12-17-40.h5"))
+
+            # test statistics reader
+            new_sys_argv = [
+                sys.argv[0],
+                "--files", f"{tmpdir}/SST_2021-09-20-12-17-40.h5",
+                "--start_time", "2021-09-20#07:40:08.937+00:00",
+                "--end_time", "2021-10-04#07:50:08.937+00:00"
+            ]
+            with mock.patch.object(reader.sys, 'argv', new_sys_argv):
+                stat_parser = reader.setup_stat_parser()
+                SSTstatistics = stat_parser.list_statistics()
+                self.assertIsNotNone(SSTstatistics)
+                stat = stat_parser.get_statistic(
+                    '2021-09-20T12:17:40.000+00:00'
+                )
+                self.assertIsNotNone(stat)
+                self.assertEqual("0.1", stat.station_version_id)
+                self.assertEqual("0.1", stat.writer_version_id)
+    
     def test_insert_tango_SST_statistics(self):
         self.assertEqual(DevState.ON, self.recv_proxy.state())
         collector = StationSSTCollector(device=self.recv_proxy)
diff --git a/tangostationcontrol/tangostationcontrol/integration_test/device_proxy.py b/tangostationcontrol/tangostationcontrol/integration_test/device_proxy.py
index 93f84dc98a789c2e0fa5451529728dbed2e73f79..4c519a41184e933e6d9bc720df75f494f7b87051 100644
--- a/tangostationcontrol/tangostationcontrol/integration_test/device_proxy.py
+++ b/tangostationcontrol/tangostationcontrol/integration_test/device_proxy.py
@@ -22,6 +22,7 @@ class TestDeviceProxy(DeviceProxy):
         # See also https://www.tango-controls.org/community/forum/c/development/python/attribute-direct-reading-from-device-when-polling-is-turned-on/
         self.set_source(DevSource.DEV)
 
+
     @staticmethod
     def test_device_turn_off(endpoint):
         d = TestDeviceProxy(endpoint)
diff --git a/tangostationcontrol/tangostationcontrol/integration_test/recv_cluster/test_recv_cluster.py b/tangostationcontrol/tangostationcontrol/integration_test/recv_cluster/test_recv_cluster.py
index 0c1fdcafc848ff87d23c1ba8ddd0eb9b87b46bab..fea5e86b8b896cff43f6c38b8122b8ad2b08ac30 100644
--- a/tangostationcontrol/tangostationcontrol/integration_test/recv_cluster/test_recv_cluster.py
+++ b/tangostationcontrol/tangostationcontrol/integration_test/recv_cluster/test_recv_cluster.py
@@ -11,25 +11,25 @@ import time
 import numpy
 import logging
 import statistics
-import unittest
 
 from tango import DevState
 
 from tangostationcontrol.integration_test import base
 from tangostationcontrol.integration_test.device_proxy import TestDeviceProxy
+from tangostationcontrol.devices.antennafield import AntennaQuality, AntennaUse
 
 logger = logging.getLogger()
 
 
 class TestRecvCluster(base.IntegrationTestCase):
 
-    POINTING_DIRECTION = numpy.array([["J2000", "0deg", "0deg"]] * 96).flatten()
+    NR_TILES = 48
+    POINTING_DIRECTION = numpy.array([["J2000","0deg","0deg"]] * NR_TILES).flatten()
 
     def setUp(self):
 
         super(TestRecvCluster, self).setUp()
 
-    @unittest.skip("waiting for L2SS-799")
     def test_recv_cluster_performance(self):
         beam_proxies = []
         antenna_field_proxies = []
@@ -45,27 +45,31 @@ class TestRecvCluster(base.IntegrationTestCase):
         for proxy in recv_proxies:
             proxy.off()
             self.assertTrue(proxy.state() is DevState.OFF)
-            proxy.initialise()
-            self.assertTrue(proxy.state() is DevState.STANDBY)
+            proxy.warm_boot()
             proxy.set_defaults()
-            proxy.on()
             self.assertTrue(proxy.state() is DevState.ON)
         
-        for proxy in antenna_field_proxies:
+        for n in range(1, 5):
+            proxy = antenna_field_proxies[n-1]
+            # setup AntennaField
+            NR_TILES = 48
+            control_mapping = [[1,i] for i in range(NR_TILES)]
+            antenna_qualities = numpy.array([AntennaQuality.OK] * 96)
+            antenna_use = numpy.array([AntennaUse.AUTO] * 96)
+            proxy.put_property({"RECV_devices": [f"STAT/RECV/{n}"],
+                                    "Control_to_RECV_mapping": numpy.array(control_mapping).flatten(),
+                                    'Antenna_Quality': antenna_qualities, 'Antenna_Use': antenna_use})
             proxy.off()
-            self.assertTrue(proxy.state() is DevState.OFF)
-            proxy.initialise()
-            self.assertTrue(proxy.state() is DevState.STANDBY)
-            proxy.set_defaults()
-            proxy.on()
+            proxy.boot()
+            self.assertEqual(NR_TILES, proxy.nr_antennas_R)
             self.assertTrue(proxy.state() is DevState.ON)
 
         for proxy in beam_proxies:
             proxy.off()
             self.assertTrue(proxy.state() is DevState.OFF)
-            proxy.initialise()
-            self.assertTrue(proxy.state() is DevState.STANDBY)
-            proxy.on()
+            proxy.warm_boot()
+            proxy.set_defaults()
+            proxy.Tracking_enabled_RW = False
             self.assertTrue(proxy.state() is DevState.ON)
 
         results = []
diff --git a/tangostationcontrol/tangostationcontrol/statistics/reader.py b/tangostationcontrol/tangostationcontrol/statistics/reader.py
index f724e53e2ac5f22bec270fb2596975571a6531cb..bdc5d84b80c927c81574218250cdfb5597b22533 100644
--- a/tangostationcontrol/tangostationcontrol/statistics/reader.py
+++ b/tangostationcontrol/tangostationcontrol/statistics/reader.py
@@ -156,7 +156,7 @@ class statistics_data:
 
     # we will be creating potentially tens of thousands of these object. Using __slots__ makes them faster and uses less memory. At the cost of
     # having to list all self attributes here.
-    __slots__ = ("version_id", "timestamp", "station_id", "source_info_t_adc", "source_info_subband_calibrated_flag", "source_info_payload_error",
+    __slots__ = ("version_id", "station_version_id", "writer_version_id", "timestamp", "station_id", "source_info_t_adc", "source_info_subband_calibrated_flag", "source_info_payload_error",
                 "source_info_payload_error", "source_info_payload_error", "source_info_nyquist_zone_index", "source_info_gn_index",
                 "source_info_fsub_type", "source_info_beam_repositioning_flag", "source_info_antenna_band_index", "source_info__raw",
                 "observation_id", "nof_statistics_per_packet", "nof_signal_inputs", "nof_bytes_per_statistic", "marker", "integration_interval_raw",
@@ -169,6 +169,10 @@ class statistics_data:
         # get all the general header info
         self.version_id = file[group_key].attrs["version_id"]
         self.station_id = file[group_key].attrs["station_id"]
+        
+        # get software version info
+        self.station_version_id = file[group_key].attrs["station_version_id"]
+        self.writer_version_id = file[group_key].attrs["writer_version_id"]
 
         # convert string timestamp to datetime object
         self.timestamp = datetime.datetime.fromisoformat(file[group_key].attrs["timestamp"])
diff --git a/tangostationcontrol/tangostationcontrol/statistics/writer/VERSION b/tangostationcontrol/tangostationcontrol/statistics/writer/VERSION
new file mode 100644
index 0000000000000000000000000000000000000000..49d59571fbf6e077eece30f8c418b6aad15e20b0
--- /dev/null
+++ b/tangostationcontrol/tangostationcontrol/statistics/writer/VERSION
@@ -0,0 +1 @@
+0.1
diff --git a/tangostationcontrol/tangostationcontrol/statistics/writer/hdf5.py b/tangostationcontrol/tangostationcontrol/statistics/writer/hdf5.py
index 5f1d1b95ce59c8b7e9f069f27dfddc0d0236b55a..3906f436c1acce5beaad45b2f265c6f86fb7fbf8 100644
--- a/tangostationcontrol/tangostationcontrol/statistics/writer/hdf5.py
+++ b/tangostationcontrol/tangostationcontrol/statistics/writer/hdf5.py
@@ -10,6 +10,7 @@
 from abc import ABC, abstractmethod
 from datetime import datetime, timedelta
 import logging
+import os
 
 # python hdf5
 import h5py
@@ -33,6 +34,19 @@ __all__ = [
     "SstHdf5Writer", "BstHdf5Writer",
 ]
 
+def _get_lsc_version() -> str:
+    """ Retrieve the Lofar Station Control software version """
+    filepath = os.path.join(os.path.realpath('../'), 'tangostationcontrol/VERSION')
+    with open(filepath) as f:
+        version = f.readline().strip()
+    return version or ""
+
+def _get_writer_version() -> str:
+    """ Retrieve the Statistics Writer software version """
+    filepath = os.path.join(os.path.dirname(__file__), 'VERSION')
+    with open(filepath) as f:
+        version = f.readline().strip()
+    return version or ""
 
 class HDF5Writer(ABC):
     SST_MODE = "SST"
@@ -67,6 +81,10 @@ class HDF5Writer(ABC):
         # writer is in (SST,XST,BST)
         self.mode = statistics_mode.upper()
 
+        # software version
+        self.station_version_id = _get_lsc_version()
+        self.writer_version_id = _get_writer_version()
+
         # Set device if any, defaults to None
         self.device = device
 
@@ -207,6 +225,10 @@ class HDF5Writer(ABC):
             timespec="milliseconds"
         )
 
+        # store software version entries
+        header["station_version_id"] = self.station_version_id
+        header["writer_version_id"] = self.writer_version_id
+
         # Stores the header of the packet received for this matrix as a list of
         # attributes
         for k, v in header.items():
diff --git a/tangostationcontrol/tangostationcontrol/test/devices/test_antennafield_device.py b/tangostationcontrol/tangostationcontrol/test/devices/test_antennafield_device.py
index 96eb83300bec3352b1c0572653f38bf96a2e77d9..2e4b798e52545e6e0e66b176a27da6c90314f4df 100644
--- a/tangostationcontrol/tangostationcontrol/test/devices/test_antennafield_device.py
+++ b/tangostationcontrol/tangostationcontrol/test/devices/test_antennafield_device.py
@@ -12,23 +12,23 @@ import numpy
 from tango.test_context import DeviceTestContext
 
 from tangostationcontrol.devices import antennafield
-from tangostationcontrol.devices.antennafield import HBATToRecvMapper, AntennaQuality, AntennaUse
+from tangostationcontrol.devices.antennafield import AntennaToRecvMapper, AntennaQuality, AntennaUse
 from tangostationcontrol.test import base
 from tangostationcontrol.test.devices import device_base
 
 
-class TestHBATToRecvMapper(base.TestCase):
+class TestAntennaToRecvMapper(base.TestCase):
 
-    # A mapping where HBATs are all not mapped to power RCUs
+    # A mapping where Antennas are all not mapped to power RCUs
     POWER_NOT_CONNECTED = [[-1, -1]] * 48
-    # A mapping where HBATs are all not mapped to control RCUs
+    # A mapping where Antennas are all not mapped to control RCUs
     CONTROL_NOT_CONNECTED = [[-1, -1]] * 48
-    # A mapping where first two HBATs are mapped on the first Receiver.
-    # The first HBAT control line on RCU 1 and the second HBAT control line on RCU 0.
+    # A mapping where first two Antennas are mapped on the first Receiver.
+    # The first Antenna control line on RCU 1 and the second Antenna control line on RCU 0.
     CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1 = [[1, 1], [1, 0]] + [[-1, -1]] * 46
     
     def test_ant_read_mask_r_no_mapping(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[False] * 96, [False] * 96, [False] * 96]
         expected = [False] * 48
@@ -36,7 +36,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_ant_read_mask_r_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[False, True, False] + [False, False, False] * 31, [False] * 96, [False] * 96]
         expected = [True, False] + [False] * 46
@@ -45,14 +45,14 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
     
     def test_rcu_band_select_no_mapping(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
         receiver_values = [[0] * 96, [0] * 96, [0] * 96]
         expected = [0] * 48
         actual = mapper.map_read("RCU_band_select_RW", receiver_values)
         numpy.testing.assert_equal(expected, actual)
 
     def test_bf_read_delay_steps_r_no_mapping(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[0] * 32] * 96, [[0] * 32] * 96, [[0] * 32] * 96]
         expected = [[0] * 32] * 48
@@ -60,7 +60,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_bf_read_delay_steps_r_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[2] * 32, [1] * 32] + [[0] * 32] * 94, [[0] * 32] * 96, [[0] * 32] * 96]
         expected = [[1] * 32, [2] * 32] + [[0] * 32] * 46
@@ -69,7 +69,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_bf_read_delay_steps_rw_no_mapping(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[0] * 32] * 96, [[0] * 32] * 96, [[0] * 32] * 96]
         expected = [[0] * 32] * 48
@@ -77,7 +77,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_bf_read_delay_steps_rw_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[2] * 32, [1] * 32] + [[0] * 32] * 94, [[0] * 32] * 96, [[0] * 32] * 96]
         expected = [[1] * 32, [2] * 32] + [[0] * 32] * 46
@@ -86,7 +86,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_read_led_on_r_unmapped(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[False] * 32] * 96, [[False] * 32] * 96, [[False] * 32] * 96]
         expected = [[False] * 32] * 48
@@ -94,7 +94,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_read_led_on_r_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[False, True] * 16, [True, False] * 16] + [[False] * 32] * 94, [[False] * 32] * 96, [[False] * 32] * 96]
 
@@ -103,7 +103,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_read_led_on_rw_unmapped(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[False] * 32] * 96, [[False] * 32] * 96, [[False] * 32] * 96]
         expected = [[False] * 32] * 48
@@ -111,7 +111,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_read_led_on_rw_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[False, True] * 16, [True, False] * 16] + [[False] * 32] * 94, [[False] * 32] * 96, [[False] * 32] * 96]
 
@@ -120,7 +120,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_read_pwr_lna_on_r_unmapped(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[False] * 32] * 96, [[False] * 32] * 96, [[False] * 32] * 96]
         expected = [[False] * 32] * 48
@@ -128,7 +128,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_read_pwr_lna_on_r_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[False, True] * 16, [True, False] * 16] + [[False] * 32] * 94, [[False] * 32] * 96, [[False] * 32] * 96]
 
@@ -137,7 +137,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_read_pwr_lna_on_rw_unmapped(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[False] * 32] * 96, [[False] * 32] * 96, [[False] * 32] * 96]
         expected = [[False] * 32] * 48
@@ -145,7 +145,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_read_pwr_lna_on_rw_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[False, True] * 16, [True, False] * 16] + [[False] * 32] * 94, [[False] * 32] * 96, [[False] * 32] * 96]
 
@@ -154,7 +154,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_read_pwr_on_r_unmapped(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[False] * 32] * 96, [[False] * 32] * 96, [[False] * 32] * 96]
         expected = [[False] * 32] * 48
@@ -162,7 +162,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_read_pwr_on_r_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[False, True] * 16, [True, False] * 16] + [[False] * 32] * 94, [[False] * 32] * 96, [[False] * 32] * 96]
 
@@ -171,7 +171,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_read_pwr_on_rw_unmapped(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[False] * 32] * 96, [[False] * 32] * 96, [[False] * 32] * 96]
         expected = [[False] * 32] * 48
@@ -179,7 +179,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_read_pwr_on_rw_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 3)
 
         receiver_values = [[[False, True] * 16, [True, False] * 16] + [[False] * 32] * 94, [[False] * 32] * 96, [[False] * 32] * 96]
 
@@ -190,7 +190,7 @@ class TestHBATToRecvMapper(base.TestCase):
 # Rename to write
 
     def test_map_write_ant_mask_rw_no_mapping_and_one_receiver(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 1)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 1)
 
         set_values = [False] * 48
         expected = [[False] * 96]
@@ -198,7 +198,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_write_ant_mask_rw_no_mapping_and_two_receivers(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 2)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 2)
 
         set_values = [False] * 48
         expected = [[False] * 96] * 2
@@ -206,7 +206,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_write_ant_mask_rw_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 1)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 1)
 
         set_values = [True, False] + [False] * 46
         expected = [[False, True, False] + [False] * 93]
@@ -214,7 +214,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
     
     def test_map_write_rcu_band_select_no_mapping_and_one_receiver(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 1)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 1)
 
         set_values = [0] * 48
         expected = [[0] * 96]
@@ -222,7 +222,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
     
     def test_map_write_rcu_band_select_no_mapping_and_two_receivers(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 2)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 2)
 
         set_values = [0] * 48
         expected = [[0] * 96] * 2
@@ -230,7 +230,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
     
     def test_map_write_rcu_band_select_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 1)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 1)
 
         set_values = [1, 0] + [0] * 46
         expected = [[0, 1, 0] + [0] * 93]
@@ -238,7 +238,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_write_bf_delay_steps_rw_no_mapping_and_one_receiver(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 1)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 1)
 
         set_values = [[1] * 32] * 48
         expected = [[[0] * 32] * 96]
@@ -246,7 +246,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_write_bf_delay_steps_rw_no_mapping_and_two_receivers(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 2)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 2)
 
         set_values = [[1] * 32] * 48
         expected = [[[0] * 32] * 96, [[0] * 32] * 96]
@@ -254,7 +254,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_write_bf_delay_steps_rw_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 1)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 1)
 
         set_values = [[1] * 32, [2] * 32] + [[0] * 32] * 46
         expected = [[[2] * 32, [1] * 32] + [[0] * 32] * 94]
@@ -262,7 +262,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_write_led_on_rw_no_mapping_and_one_receiver(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 1)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 1)
 
         set_values = [[False] * 32] * 48
         expected = [[[False] * 32] * 96]
@@ -270,7 +270,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_write_led_on_rw_no_mapping_and_two_receivers(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 2)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 2)
 
         set_values = [[False] * 32] * 48
         expected = [[[False] * 32] * 96, [[False] * 32] * 96]
@@ -278,7 +278,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_write_led_on_rw_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 1)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 1)
 
         set_values = [[False, True] * 16, [True, False] * 16] + [[False] * 32]  * 46
         expected = [[[True, False] * 16, [False, True] * 16] + [[False] * 32] * 94]
@@ -286,7 +286,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_write_pwr_lna_on_rw_no_mapping_and_one_receiver(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 1)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 1)
 
         set_values = [[False] * 32] * 48
         expected = [[[False] * 32] * 96]
@@ -294,7 +294,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_write_pwr_lna_on_rw_no_mapping_and_two_receivers(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 2)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 2)
 
         set_values = [[False] * 32] * 48
         expected = [[[False] * 32] * 96, [[False] * 32] * 96]
@@ -302,7 +302,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_write_pwr_lna_on_rw_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 1)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 1)
 
         set_values = [[False, True] * 16, [True, False] * 16] + [[False] * 32]  * 46
         expected = [[[True, False] * 16, [False, True] * 16] + [[False] * 32] * 94]
@@ -310,7 +310,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_write_pwr_on_rw_no_mapping_and_one_receiver(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 1)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 1)
 
         set_values = [[False] * 32] * 48
         expected = [[[False] * 32] * 96]
@@ -318,7 +318,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_write_lna_on_rw_no_mapping_and_two_receivers(self):
-        mapper = HBATToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 2)
+        mapper = AntennaToRecvMapper(self.CONTROL_NOT_CONNECTED, self.POWER_NOT_CONNECTED, 2)
 
         set_values = [[False] * 32] * 48
         expected = [[[False] * 32] * 96, [[False] * 32] * 96]
@@ -326,7 +326,7 @@ class TestHBATToRecvMapper(base.TestCase):
         numpy.testing.assert_equal(expected, actual)
 
     def test_map_write_pwr_on_rw_hba_0_and_1_on_rcu_1_and_0_of_recv_1(self):
-        mapper = HBATToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 1)
+        mapper = AntennaToRecvMapper(self.CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1, self.POWER_NOT_CONNECTED, 1)
 
         set_values = [[False, True] * 16, [True, False] * 16] + [[False] * 32]  * 46
         expected = [[[True, False] * 16, [False, True] * 16] + [[False] * 32] * 94]
@@ -340,12 +340,12 @@ class TestAntennafieldDevice(device_base.DeviceTestCase):
     AT_PROPERTIES = {'OPC_Server_Name': 'example.com', 'OPC_Server_Port': 4840, 'OPC_Time_Out': 5.0, 
     'Antenna_Field_Reference_ITRF' : [3.0, 3.0, 3.0], 'Antenna_Field_Reference_ETRS' : [7.0, 7.0, 7.0]}
 
-    # A mapping where HBATs are all not mapped to power RCUs
+    # A mapping where Antennas are all not mapped to power RCUs
     POWER_NOT_CONNECTED = [[-1, -1]] * 48
-    # A mapping where HBATs are all not mapped to control RCUs
+    # A mapping where Antennas are all not mapped to control RCUs
     CONTROL_NOT_CONNECTED = [[-1, -1]] * 48
-    # A mapping where first two HBATs are mapped on the first Receiver.
-    # The first HBAT control line on RCU 1 and the second HBAT control line on RCU 0.
+    # A mapping where first two Antennas are mapped on the first Receiver.
+    # The first Antenna control line on RCU 1 and the second Antenna control line on RCU 0.
     CONTROL_HBA_0_AND_1_ON_RCU_1_AND_0_OF_RECV_1 = [[1, 1], [1, 0]] + [[-1, -1]] * 46
 
     def setUp(self):
@@ -389,3 +389,11 @@ class TestAntennafieldDevice(device_base.DeviceTestCase):
         antenna_properties = {'Antenna_Quality': antenna_qualities, 'Antenna_Use': antenna_use}
         with DeviceTestContext(antennafield.AntennaField, properties={**self.AT_PROPERTIES, **antenna_properties}, process=True) as proxy:
             numpy.testing.assert_equal(numpy.array([True] + [False] * 95), proxy.Antenna_Usage_Mask_R)
+    
+    def test_read_Antenna_Names(self):
+       """ Verify if Antenna_Names_R is correctly retrieved """
+       antenna_names = ["C0","C1","C2","C3","C4"]
+       antenna_properties = {'Antenna_Names' : antenna_names}
+       with DeviceTestContext(antennafield.AntennaField, properties={**self.AT_PROPERTIES, **antenna_properties}, process=True) as proxy:
+        for i in range(len(antenna_names)):
+            self.assertTrue(proxy.Antenna_Names_R[i]==f"C{i}")
diff --git a/tangostationcontrol/tangostationcontrol/test/devices/test_digitalbeam_device.py b/tangostationcontrol/tangostationcontrol/test/devices/test_digitalbeam_device.py
new file mode 100644
index 0000000000000000000000000000000000000000..0d19f7cab3b6284caed0e6a6e63f701957f5c582
--- /dev/null
+++ b/tangostationcontrol/tangostationcontrol/test/devices/test_digitalbeam_device.py
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of the LOFAR 2.0 Station Software
+#
+#
+#
+# Distributed under the terms of the APACHE license.
+# See LICENSE.txt for more info.
+
+# Builtin regular libraries
+import copy
+
+# External regular libraries
+import numpy
+
+# Internal regular imports
+from tangostationcontrol.devices.sdp import digitalbeam
+
+# Builtin test libraries
+from unittest import mock
+import unittest
+
+# External test libraries
+from tango.test_context import DeviceTestContext
+
+# Internal test imports
+from tangostationcontrol.test.devices import device_base
+
+
+class TestDigitalBeamDevice(device_base.DeviceTestCase):
+
+    def setUp(self):
+        # DeviceTestCase setUp patches lofar_device DeviceProxy
+        super(TestDigitalBeamDevice, self).setUp()
+
+    @unittest.skip("Test for manual use, enable at most one (process=false)")
+    @mock.patch.object(digitalbeam.DigitalBeam, "_wait_to_apply_weights")
+    @mock.patch.object(digitalbeam.DigitalBeam, "_compute_weights")
+    @mock.patch.object(digitalbeam, "DeviceProxy")
+    def test_apply_weights_disabled(self, m_proxy, m_compute, m_wait):
+        """Verify won't overwrite digitalbeam data if no input_selected"""
+
+        input_data = numpy.array([["AZELGEO", "0deg", "90deg"]] * 488).flatten()
+        current_data = numpy.array([[16384] * 5856] * 16)
+
+        m_proxy.return_value = mock.Mock(
+            read_attribute=mock.Mock(
+                return_value=mock.Mock(value=copy.copy(current_data))
+            ),
+            Antenna_Usage_Mask_R=numpy.array([0] * 96),
+            Antenna_Field_Reference_ITRF_R=mock.MagicMock(),
+            HBAT_reference_ITRF_R=numpy.array([[0] * 3] * 96)
+        )
+
+        new_data = numpy.array(
+            [[16384] * 2928 + [0] * 2928] * 16
+        )
+        m_compute.return_value = copy.copy(new_data)
+
+        with DeviceTestContext(
+            digitalbeam.DigitalBeam, process=False,
+        ) as proxy:
+            proxy.initialise()
+            proxy.Tracking_enabled_RW = False
+            proxy.input_select_RW = numpy.array([[False] * 488] * 96)
+
+            proxy.set_pointing(input_data)
+
+            numpy.testing.assert_equal(
+                m_proxy.return_value.write_attribute.call_args[0][0],
+                current_data
+            )
+
+    @unittest.skip("Test for manual use, enable at most one (process=false)")
+    @mock.patch.object(digitalbeam.DigitalBeam, "_wait_to_apply_weights")
+    @mock.patch.object(digitalbeam.DigitalBeam, "_compute_weights")
+    @mock.patch.object(digitalbeam, "DeviceProxy")
+    def test_apply_weights_enabled(self, m_proxy, m_compute, m_wait):
+        """Verify can overwrite digitalbeam data if input_selected"""
+
+        input_data = numpy.array([["AZELGEO", "0deg", "90deg"]] * 488).flatten()
+        current_data = numpy.array([[16384] * 5856] * 16)
+
+        m_proxy.return_value = mock.Mock(
+            read_attribute=mock.Mock(
+                return_value=mock.Mock(value=current_data)
+            ),
+            Antenna_Usage_Mask_R=numpy.array([0] * 96),
+            Antenna_Field_Reference_ITRF_R=mock.MagicMock(),
+            HBAT_reference_ITRF_R=numpy.array([[0] * 3] * 96)
+        )
+
+        new_data = numpy.array(
+            [[16384] * 2928 + [0] * 2928] * 16
+        )
+        m_compute.return_value = copy.copy(new_data)
+
+        with DeviceTestContext(
+            digitalbeam.DigitalBeam, process=False,
+        ) as proxy:
+            proxy.initialise()
+            proxy.Tracking_enabled_RW = False
+            proxy.input_select_RW = numpy.array([[True] * 488] * 96)
+
+            proxy.set_pointing(input_data)
+
+            numpy.testing.assert_equal(
+                m_proxy.return_value.write_attribute.call_args[0][0],
+                new_data
+            )
diff --git a/tangostationcontrol/tox.ini b/tangostationcontrol/tox.ini
index c87e4605816e3ea7ee22dfd9731d73c7912f85d8..1431b618acbd0dcb0b3dfbdb412bf874c811ac2d 100644
--- a/tangostationcontrol/tox.ini
+++ b/tangostationcontrol/tox.ini
@@ -29,12 +29,14 @@ commands = {envpython} -m stestr run {posargs}
 [testenv:integration]
 ; Warning running integration tests will make changes to your docker system!
 ; These tests should only be run by the integration-test docker container.
+allowlist_externals = echo
 passenv = TANGO_HOST
 setenv =
     VIRTUAL_ENV={envdir}
     TESTS_DIR=./tangostationcontrol/integration_test/{env:TEST_MODULE:default}
     PYTHON={envpython} -m coverage run --source tangostationcontrol --parallel-mode
 commands =
+    echo "Integration test directory configured for{env:TESTS_DIR} ({env:TEST_MODULE:default})"
     {envpython} -m stestr run --serial {posargs}
     {envpython} -m coverage combine
     {envpython} -m coverage html --omit='*test*' -d cover