diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5c222a48dcd223050f203a69d7b4f4b4d99ccdb7..fcecc7c684ba15b7c8437b5c38b92276d70aaf6f 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:
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..4aecaea4862f8a9911c2832aa2ac6939f730ab7f 100644
--- a/CDB/integrations/recvcluster_ConfigDb.json
+++ b/CDB/integrations/recvcluster_ConfigDb.json
@@ -19,7 +19,7 @@
                                 "461022.948",
                                 "5064892.786"
                             ],
-                            "HBAT_reference_itrf": [
+                            "Antenna_Reference_itrf": [
                                 "3826577.066",
                                 "461022.948",
                                 "5064892.786",
@@ -368,7 +368,7 @@
                                 "461022.948",
                                 "5064892.786"
                             ],
-                            "HBAT_reference_itrf": [
+                            "Antenna_Reference_itrf": [
                                 "3826577.066",
                                 "461022.948",
                                 "5064892.786",
@@ -717,7 +717,7 @@
                                 "461022.948",
                                 "5064892.786"
                             ],
-                            "HBAT_reference_itrf": [
+                            "Antenna_Reference_itrf": [
                                 "3826577.066",
                                 "461022.948",
                                 "5064892.786",
@@ -1066,7 +1066,7 @@
                                 "461022.948",
                                 "5064892.786"
                             ],
-                            "HBAT_reference_itrf": [
+                            "Antenna_Reference_itrf": [
                                 "3826577.066",
                                 "461022.948",
                                 "5064892.786",
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 96b58936feb2ca06b0f84a6c099603a968f84496..cbfa8255c171cb2c47c81de6dd372105d7413cb0 100644
--- a/CDB/stations/DTS_Outside_ConfigDb.json
+++ b/CDB/stations/DTS_Outside_ConfigDb.json
@@ -24,6 +24,7 @@
                                 "STAT/PCON/1",
                                 "STAT/APSPU/1",
                                 "STAT/APSCT/1",
+                                "STAT/CCD/1",
                                 "STAT/RECV/1",
                                 "STAT/UNB2/1",
                                 "STAT/SDP/1",
@@ -60,6 +61,25 @@
                 }
             }
         },
+        "CCD": {
+            "STAT": {
+                "CCD": {
+                    "STAT/CCD/1": {
+                        "properties": {
+                            "OPC_Server_Name": [
+                                "10.87.6.67 "
+                            ],
+                            "OPC_Server_Port": [
+                                "4843"
+                            ],
+                            "OPC_Time_Out": [
+                                "5.0"
+                            ]
+                        }
+                    }
+                }
+            }
+        },
         "APSPU": {
             "STAT": {
                 "APSPU": {
@@ -162,14 +182,14 @@
                                 "C3",
                                 "C4"
                             ],
-                            "HBAT_Control_to_RECV_mapping": [
+                            "Control_to_RECV_mapping": [
                                 "1","27",
                                 "0","-1",
                                 "0","-1",
                                 "1","28",
                                 "1","29"
                             ],
-                            "HBAT_Power_to_RECV_mapping": [
+                            "Power_to_RECV_mapping": [
                                 "1","24",
                                 "0","-1",
                                 "0","-1",
@@ -179,7 +199,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",
@@ -216,7 +236,7 @@
                                 "LBA8",
                                 "LBA9"
                             ],
-                            "HBAT_Control_to_RECV_mapping": [
+                            "Control_to_RECV_mapping": [
                                 "1","1",
                                 "1","3",
                                 "1","5",
@@ -227,7 +247,7 @@
                                 "1","15",
                                 "1","17"
                             ],
-                            "HBAT_Power_to_RECV_mapping": [
+                            "Power_to_RECV_mapping": [
                                 "1","1",
                                 "1","3",
                                 "1","5",
@@ -243,7 +263,7 @@
                                 "430354.482",
                                 "5057967.804"
                             ],
-                            "HBAT_reference_ETRS": [
+                            "Antenna_Reference_ETRS": [
                                 "3839358.189","430354.482","5057967.804",
                                 "3839359.127","430348.074","5057967.607",
                                 "3839360.084","430341.872","5057967.379",
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/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-ccd.yml b/docker-compose/device-ccd.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ffbfafcf31c9cfaea3ead633787b5bb0b9f69c47
--- /dev/null
+++ b/docker-compose/device-ccd.yml
@@ -0,0 +1,47 @@
+#
+# 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
+    extra_hosts:
+      - "host.docker.internal:host-gateway"
+    volumes:
+        - ..:/opt/lofar/tango:rw
+    environment:
+      - TANGO_HOST=${TANGO_HOST}
+    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/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 65beb8bc65ef32c79d29794281e5f3da2023456a..3047557a3678940748746acc6f7e7e3a59ea6090 100755
--- a/sbin/run_integration_test.sh
+++ b/sbin/run_integration_test.sh
@@ -73,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 eb6b46d11e517ce439560818c791f9c5e3161636..299dfdda86cd985cec7a4bcd3604373e7cea1c85 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/devices/antennafield.rst b/tangostationcontrol/docs/source/devices/antennafield.rst
index d9c36a0148fab3b74b8cf1311b0d8c4369686da9..bcf93f62e9d40aa4d48e24c68eb357433216542d 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,19 @@ The antennas represented by the antenna field are selected by the following prop
 
   :type: ``str[]``
 
-: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.
+:Power_to_RECV_mapping: Pairs of numbers ``(recv_idx, ant_idx)`` describing the inputs on which the Antenna *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/index.rst b/tangostationcontrol/docs/source/index.rst
index 07c5fb4ac45444e941b31b3869198b2504284389..6bd156c2b7f9d3cda99ad3af8a7e01bbc33c45c8 100644
--- a/tangostationcontrol/docs/source/index.rst
+++ b/tangostationcontrol/docs/source/index.rst
@@ -29,6 +29,7 @@ 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
diff --git a/tangostationcontrol/setup.cfg b/tangostationcontrol/setup.cfg
index 127f89141b4fc26fd283816923d9b1708bfa8a26..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
diff --git a/tangostationcontrol/tangostationcontrol/devices/README.md b/tangostationcontrol/tangostationcontrol/devices/README.md
index cb4efc08e5345657f96db0cc9afbf74e6a0c7d0f..4d5bc3a070be1340c26db626ef7dde9235df87c4 100644
--- a/tangostationcontrol/tangostationcontrol/devices/README.md
+++ b/tangostationcontrol/tangostationcontrol/devices/README.md
@@ -18,4 +18,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 c7d43b9226de469e877cf6bfdc4c728a8afcfd0e..25b58719c287c4a6fe6e4b690f0228187ac17989 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.
@@ -90,7 +90,8 @@ class AntennaField(lofar_device):
     Antenna_Names = device_property(
         doc="Name of each antenna",
         dtype='DevVarStringArray',
-        mandatory=False
+        mandatory=False,
+        default_value = [f'Antenna{n+1}' for n in range(MAX_NUMBER_OF_HBAT)]
     )
 
     # ----- Antenna states
@@ -123,14 +124,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
     )
@@ -175,23 +176,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
     )
@@ -212,7 +213,7 @@ class AntennaField(lofar_device):
     Antenna_Usage_Mask_R = attribute(access=AttrWriteType.READ,
         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)
     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)
@@ -241,20 +242,20 @@ 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):
@@ -273,14 +274,14 @@ class AntennaField(lofar_device):
                 or (self.read_attribute('Antenna_Use_R')[n] == AntennaUse.AUTO and self.read_attribute('Antenna_Quality_R')[n] <= AntennaQuality.SUSPICIOUS))
         return antenna_usage
     
-    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.
         #
         # 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
@@ -327,20 +328,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 = []
@@ -354,9 +355,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 = []
@@ -410,19 +411,19 @@ class AntennaField(lofar_device):
     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'))
 
     # --------
     # 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
@@ -442,12 +443,12 @@ 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),
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/observation.py b/tangostationcontrol/tangostationcontrol/devices/observation.py
index 555000fca0ca13b2ca49efed0784a45be2f5287c..05d225a4b9d62f7f7190615f4d71f5e34639ab4c 100644
--- a/tangostationcontrol/tangostationcontrol/devices/observation.py
+++ b/tangostationcontrol/tangostationcontrol/devices/observation.py
@@ -131,8 +131,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 +141,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 +241,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"""
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py b/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py
index f950e1f600169fdd1671d4d0d679c837e8d0c909..8c190ddfbb48388dcc6ac10fb4dcccb97ed1ec26 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py
@@ -127,7 +127,7 @@ class DigitalBeam(beam_device):
 
         # 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
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/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..b06b60ce82f76b493450f1828bf5a31d8e8a928a 100644
--- a/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_digitalbeam.py
+++ b/tangostationcontrol/tangostationcontrol/integration_test/default/devices/test_device_digitalbeam.py
@@ -56,7 +56,7 @@ class TestDeviceDigitalBeam(AbstractTestBases.TestDeviceBase):
         antennafield_proxy = TestDeviceProxy("STAT/AntennaField/1")
         control_mapping = [[1,i] for i in range(NR_TILES)]
         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()
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/test/devices/test_antennafield_device.py b/tangostationcontrol/tangostationcontrol/test/devices/test_antennafield_device.py
index c567f476b21f05aa1806b454092c5a1660849ade..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):