diff --git a/tangostationcontrol/tangostationcontrol/beam/hba_tile.py b/tangostationcontrol/tangostationcontrol/beam/hba_tile.py
index 14475cf2ab561db97801758e471d032e0894ec42..9ab46e5bf544f652ef5790188016c1a7fcf3c487 100644
--- a/tangostationcontrol/tangostationcontrol/beam/hba_tile.py
+++ b/tangostationcontrol/tangostationcontrol/beam/hba_tile.py
@@ -1,9 +1,6 @@
 import numpy
 from math import sin, cos
 
-# Number of antenna dipoles in each HBA tile
-NUMBER_OF_ELEMENTS_PER_TILE = 16
-
 class HBATAntennaOffsets(object):
     """
         This class helps calculate the absolute offsets of the antennas within a tile,
diff --git a/tangostationcontrol/tangostationcontrol/common/constants.py b/tangostationcontrol/tangostationcontrol/common/constants.py
index 912ef63f3bad4b9b8344ccc73955da7ee71d54fc..4e1891c507bc9fd5cb183089d82ac803cea34672 100644
--- a/tangostationcontrol/tangostationcontrol/common/constants.py
+++ b/tangostationcontrol/tangostationcontrol/common/constants.py
@@ -1,17 +1,12 @@
 
-
-#TODO SDP           TR_tod_R = attribute_wrapper(comms_annotation=["TR_tod_R"], datatype=numpy.int64, dims=(2,))
-#TODO statistics    replicator_nof_bytes_sent_R = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "replicator", "parameter": "nof_bytes_sent"}, datatype=numpy.uint64)
-
-
 class constants:
     """
-    For now this class assumes a 'LB' configuration
     TODO: support configurations
 
     A good source for a good chunk of the constants can be found here: https://support.astron.nl/confluence/display/L2M/L2+STAT+Decision%3A+SC+-+SDP+OPC-UA+interface
     """
 
+    # TODO FIX
     # number of dual polarization antennas in the band.
     N_ant = 48
 
@@ -21,6 +16,7 @@ class constants:
     # number of polarisations per antenna (X and y polarisations)
     N_pol = 2
 
+    # TODO FIX
     # Single polarization signal inputs ( N_ant * N_pol)
     S_ant = 96
 
@@ -59,8 +55,8 @@ class constants:
 
     # Maximum number of subbands we support
     N_sub = 512
-    # Number of points of the FFT.
-    N_fft = N_sub * 2
+    # Number of points per subband
+    N_fft = 1024
 
     # Maximum array size to allocate for beam_device pointings,
     MAX_POINTINGS = 1024
@@ -69,7 +65,7 @@ class constants:
     PSOC_SOCKETS = 8
 
     # main clock frequency of the subrack is 200MHz NOTE: type is a float here
-    clock_frequency = 200e6
+    F_CLOCK = 200e6
 
     # default subband we use because of its low RFI
     DEFAULT_SUBBAND = 102
@@ -77,28 +73,27 @@ class constants:
     # Maximum number of antenna inputs we support (used to determine array sizes)
     MAX_INPUTS = 192
 
-    # max size for a statistic packet
-    MAX_PACKET_SIZE = 9000
-
-
     # UNB2 constants
     # number of uniboards in a subrack
-    N_UNB = 2
+    N_unb = 2
     # number of FPGA's in a uniboard
-    N_FPGA = 4
+    N_fpga = 4
     # number of DDR modules per FPGA
-    N_DDR = 2
+    N_ddr = 2
     # number of QSFP tranceivers per uniboard
-    N_QSFP = 24
+    N_qsfp = 24
+
+    # max size for a statistic packet
+    MAX_PACKET_SIZE = 9000
 
     # Maximum number of supported simultaneous replicator clients
-    statistics_max_clients = 128
+    MAX_STATISTICS_CLIENTS = 128
 
     # maximum number of devices boot.py supports
-    boot_max_clients = 128
+    MAX_BOOT_DEVICES = 128
 
     # The default polling period for polled attributes
-    default_polling_period = 1000
+    DEFAULT_POLLING_PERIOD = 1000
 
 """
 These classes for now exist for future use
diff --git a/tangostationcontrol/tangostationcontrol/devices/apsct.py b/tangostationcontrol/tangostationcontrol/devices/apsct.py
index 983db98bfaba9d9c864587380055955f6eff8978..72bd74350520ad022940da36d83b70dce3fd97b2 100644
--- a/tangostationcontrol/tangostationcontrol/devices/apsct.py
+++ b/tangostationcontrol/tangostationcontrol/devices/apsct.py
@@ -102,7 +102,7 @@ class APSCT(opcua_device):
                 self.read_attribute("APSCT_PLL_160MHz_locked_R") and self.read_attribute("APSCT_PLL_160MHz_error_R")]
         return any(errors)
 
-    APSCT_TEMP_error_R            = attribute(dtype=bool, fisallowed="is_attribute_access_allowed", polling_period=constants.default_polling_period)
+    APSCT_TEMP_error_R            = attribute(dtype=bool, fisallowed="is_attribute_access_allowed", polling_period=constants.DEFAULT_POLLING_PERIOD)
     APSCT_VOUT_error_R            = attribute(dtype=bool, fisallowed="is_attribute_access_allowed")
 
     def read_APSCT_TEMP_error_R(self):
diff --git a/tangostationcontrol/tangostationcontrol/devices/apspu.py b/tangostationcontrol/tangostationcontrol/devices/apspu.py
index 142a689b5a1a33f737eefc340846affb333c286d..8c18ce5c42707ac9aec0e03335366fe3f097e98e 100644
--- a/tangostationcontrol/tangostationcontrol/devices/apspu.py
+++ b/tangostationcontrol/tangostationcontrol/devices/apspu.py
@@ -78,7 +78,7 @@ class APSPU(opcua_device):
                or self.alarm_val("APSPU_FAN3_RPM_R"))
 
     APSPU_IOUT_error_R          = attribute(dtype=bool, fisallowed="is_attribute_access_allowed")
-    APSPU_TEMP_error_R          = attribute(dtype=bool, fisallowed="is_attribute_access_allowed", polling_period=constants.default_polling_period)
+    APSPU_TEMP_error_R          = attribute(dtype=bool, fisallowed="is_attribute_access_allowed", polling_period=constants.DEFAULT_POLLING_PERIOD)
     APSPU_VOUT_error_R          = attribute(dtype=bool, fisallowed="is_attribute_access_allowed")
 
     def read_APSPU_IOUT_error_R(self):
diff --git a/tangostationcontrol/tangostationcontrol/devices/boot.py b/tangostationcontrol/tangostationcontrol/devices/boot.py
index e620fc7ce06b1bcba51098e4d76883568658e0a9..338d88cd2e8bca397c6fdfba9c258dc85f668a2f 100644
--- a/tangostationcontrol/tangostationcontrol/devices/boot.py
+++ b/tangostationcontrol/tangostationcontrol/devices/boot.py
@@ -261,8 +261,8 @@ class Boot(lofar_device):
     booting_R = attribute(dtype=bool, access=AttrWriteType.READ, fget=lambda self: self.initialiser.is_running(), doc="Whether booting is in progress.")
     progress_R = attribute(dtype=numpy.int32, access=AttrWriteType.READ, fget=lambda self: numpy.int32(self.initialiser.progress), doc="Percentage of devices that was initialised")
     status_R = attribute(dtype=str, access=AttrWriteType.READ, fget=lambda self: self.initialiser.status, doc="Description of current boot activity")
-    initialised_devices_R = attribute(dtype=(str,), max_dim_x=constants.boot_max_clients, access=AttrWriteType.READ, fget=lambda self: [name for name,initialised in self.initialiser.device_initialised.items() if initialised], doc="Which devices were initialised succesfully")
-    uninitialised_devices_R = attribute(dtype=(str,), max_dim_x=constants.boot_max_clients, access=AttrWriteType.READ, fget=lambda self: [name for name,initialised in self.initialiser.device_initialised.items() if not initialised], doc="Which devices have not been initialised or failed to initialise")
+    initialised_devices_R = attribute(dtype=(str,), max_dim_x=constants.MAX_BOOT_DEVICES, access=AttrWriteType.READ, fget=lambda self: [name for name, initialised in self.initialiser.device_initialised.items() if initialised], doc="Which devices were initialised succesfully")
+    uninitialised_devices_R = attribute(dtype=(str,), max_dim_x=constants.MAX_BOOT_DEVICES, access=AttrWriteType.READ, fget=lambda self: [name for name, initialised in self.initialiser.device_initialised.items() if not initialised], doc="Which devices have not been initialised or failed to initialise")
 
     # --------
     # overloaded functions
diff --git a/tangostationcontrol/tangostationcontrol/devices/ccd.py b/tangostationcontrol/tangostationcontrol/devices/ccd.py
index 2650fd721b36b9a764b3d007d5e64fac6091d6b7..4d0c12c1b5dd4e247a93c929bf074c7f2b14f117 100644
--- a/tangostationcontrol/tangostationcontrol/devices/ccd.py
+++ b/tangostationcontrol/tangostationcontrol/devices/ccd.py
@@ -92,7 +92,7 @@ class CCD(opcua_device):
                 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=constants.default_polling_period)
+    CCD_TEMP_error_R            = attribute(dtype=bool, fisallowed="is_attribute_access_allowed", polling_period=constants.DEFAULT_POLLING_PERIOD)
     CCD_VOUT_error_R            = attribute(dtype=bool, fisallowed="is_attribute_access_allowed")
 
     def read_CCD_TEMP_error_R(self):
diff --git a/tangostationcontrol/tangostationcontrol/devices/observation.py b/tangostationcontrol/tangostationcontrol/devices/observation.py
index 843b5d0447e6ea32a0485131003c1d7584729d91..1d506f92f4fcffb472d57cf809ca602dffa6ec96 100644
--- a/tangostationcontrol/tangostationcontrol/devices/observation.py
+++ b/tangostationcontrol/tangostationcontrol/devices/observation.py
@@ -43,7 +43,7 @@ class Observation(lofar_device):
 
 
     # Attributes
-    observation_running_R = attribute(dtype=numpy.float64, access=AttrWriteType.READ, polling_period=constants.default_polling_period, period=constants.default_polling_period,
+    observation_running_R = attribute(dtype=numpy.float64, access=AttrWriteType.READ, polling_period=constants.DEFAULT_POLLING_PERIOD, period=constants.DEFAULT_POLLING_PERIOD,
                                       rel_change="1.0")
     observation_id_R = attribute(dtype=numpy.int64, access=AttrWriteType.READ)
     stop_time_R = attribute(dtype=numpy.float64, access=AttrWriteType.READ)
diff --git a/tangostationcontrol/tangostationcontrol/devices/recv.py b/tangostationcontrol/tangostationcontrol/devices/recv.py
index d6eded6d1af51e97e5a955aee0133e67d7e68c28..e2af04031106819c05fd6d6009c4d2061ea0b1b9 100644
--- a/tangostationcontrol/tangostationcontrol/devices/recv.py
+++ b/tangostationcontrol/tangostationcontrol/devices/recv.py
@@ -208,7 +208,7 @@ class RECV(opcua_device):
                )
 
     RECV_IOUT_error_R          = attribute(dtype=(bool,), max_dim_x=S_ant, fisallowed="is_attribute_access_allowed")
-    RECV_TEMP_error_R          = attribute(dtype=(bool,), max_dim_x=N_rcu, fisallowed="is_attribute_access_allowed", polling_period=constants.default_polling_period)
+    RECV_TEMP_error_R          = attribute(dtype=(bool,), max_dim_x=N_rcu, fisallowed="is_attribute_access_allowed", polling_period=constants.DEFAULT_POLLING_PERIOD)
     RECV_VOUT_error_R          = attribute(dtype=(bool,), max_dim_x=N_rcu, fisallowed="is_attribute_access_allowed")
 
     def read_RECV_IOUT_error_R(self):
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py b/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py
index 635438b6252a3baa1e369e741ac98affed07eb21..ac8401d400d25ada81a2a0e161aee6a8e24eaef7 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py
@@ -77,10 +77,10 @@ class DigitalBeam(beam_device):
         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. Allows selecting broken antennas.',
-                                  dtype=((bool,),), max_dim_x=constants.N_beamlets_ctrl, max_dim_y=constants.S_ant, access=AttrWriteType.READ_WRITE, fisallowed="is_attribute_access_allowed")
+                                  dtype=((bool,),), max_dim_x=constants.N_beamlets_ctrl, max_dim_y=constants.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=constants.N_beamlets_ctrl, max_dim_y=constants.S_ant, access=AttrWriteType.READ_WRITE, fisallowed="is_attribute_access_allowed")
+                                  dtype=((bool,),), max_dim_x=constants.N_beamlets_ctrl, max_dim_y=constants.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")
@@ -175,7 +175,7 @@ class DigitalBeam(beam_device):
         Returns delays[antenna][beamlet]
         """
 
-        delays = numpy.zeros((self.MAX_INPUTS, constants.N_beamlets_ctrl), dtype=numpy.float64)
+        delays = numpy.zeros((constants.MAX_INPUTS, constants.N_beamlets_ctrl), dtype=numpy.float64)
 
         d = self.delay_calculator
         d.set_measure_time(timestamp)
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py b/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py
index d8fa0298077bbded02ef19a4ee50723a3ebbeb62..def422eb51f67c9ce052356afc48ed4c1fd9644d 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py
@@ -76,7 +76,7 @@ class SDP(opcua_device):
         dtype='DevVarDoubleArray',
         mandatory=False,
         # Emit a signal on subband 102
-        default_value=[[constants.DEFAULT_SUBBAND * constants.clock_frequency/1024] * S_pn] * N_pn
+        default_value=[[constants.DEFAULT_SUBBAND * constants.F_CLOCK / 1024] * S_pn] * N_pn
     )
 
     FPGA_wg_phase_RW_default = device_property(
@@ -106,7 +106,7 @@ class SDP(opcua_device):
     clock_RW_default = device_property(
         dtype='DevULong',
         mandatory=False,
-        default_value = int(constants.clock_frequency)
+        default_value = int(constants.F_CLOCK)
     )
 
     TRANSLATOR_DEFAULT_SETTINGS = [
@@ -192,10 +192,10 @@ class SDP(opcua_device):
                                dtype=str, fget=lambda self: self.AntennaType)
     nyquist_zone_R = attribute(doc='Nyquist zone of the input frequencies',
                                dtype=numpy.uint32, fisallowed="is_attribute_access_allowed",
-                               polling_period=constants.default_polling_period, abs_change=1)
+                               polling_period=constants.DEFAULT_POLLING_PERIOD, abs_change=1)
     clock_RW = attribute(doc='Configured sampling clock (Hz)',
                          dtype=numpy.uint32, access=AttrWriteType.READ_WRITE, fisallowed="is_attribute_access_allowed",
-                         polling_period=constants.default_polling_period, abs_change=1)
+                         polling_period=constants.DEFAULT_POLLING_PERIOD, abs_change=1)
 
     def _nyquist_zone(self, clock):
         """ Return the Nyquist zone for the given clock (in Hz).
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py b/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py
index 315a52ded2fcc3942486e5ce257c050a46480ea0..89da1c4f4362a605185f9b47558696e3f7d74a24 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py
@@ -72,7 +72,7 @@ class Statistics(opcua_device):
     queue_collector_fill_percentage_R = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "queue", "parameter": "collector_fill_percentage"}, datatype=numpy.uint64)
     queue_replicator_fill_percentage_R = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "queue", "parameter": "replicator_fill_percentage"}, datatype=numpy.uint64)
 
-    replicator_clients_R = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "replicator", "parameter": "clients"}, dims=(constants.statistics_max_clients,), datatype=str)
+    replicator_clients_R = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "replicator", "parameter": "clients"}, dims=(constants.MAX_STATISTICS_CLIENTS,), datatype=str)
     replicator_nof_bytes_sent_R = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "replicator", "parameter": "nof_bytes_sent"}, datatype=numpy.uint64)
 
     replicator_nof_packets_sent_R = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "replicator", "parameter": "nof_packets_sent"}, datatype=numpy.uint64)
diff --git a/tangostationcontrol/tangostationcontrol/devices/temperature_manager.py b/tangostationcontrol/tangostationcontrol/devices/temperature_manager.py
index 4c0c631d2a707250f61a463d4e8376262e716716..0a8d067d233cbb55d20f33a4e19da461a9a79b16 100644
--- a/tangostationcontrol/tangostationcontrol/devices/temperature_manager.py
+++ b/tangostationcontrol/tangostationcontrol/devices/temperature_manager.py
@@ -122,7 +122,7 @@ class TemperatureManager(lofar_device):
             dev_attr.proxy.unsubscribe_event(dev_attr.subscription_id)
             del dev_attr
 
-    is_alarming_R = attribute(dtype=bool, polling_period=constants.default_polling_period, fisallowed="is_attribute_access_allowed")
+    is_alarming_R = attribute(dtype=bool, polling_period=constants.DEFAULT_POLLING_PERIOD, fisallowed="is_attribute_access_allowed")
 
     def read_is_alarming_R(self):
         # return whether any of the devices are alarming
diff --git a/tangostationcontrol/tangostationcontrol/devices/unb2.py b/tangostationcontrol/tangostationcontrol/devices/unb2.py
index 61136b62103a77ee2e83fb4b92ef042ba9df054a..66ae6cc3775a70d16a0df3242a75d01f0a1a3f48 100644
--- a/tangostationcontrol/tangostationcontrol/devices/unb2.py
+++ b/tangostationcontrol/tangostationcontrol/devices/unb2.py
@@ -32,10 +32,10 @@ __all__ = ["UNB2", "main"]
 class UNB2(opcua_device):
 
     # redeclared commonly used constants for convenience
-    N_UNB = constants.N_UNB
-    N_FPGA = constants.N_FPGA
-    N_DDR = constants.N_DDR
-    N_QSFP = constants.N_QSFP
+    N_unb = constants.N_unb
+    N_fpga = constants.N_fpga
+    N_ddr = constants.N_ddr
+    N_qsfp = constants.N_qsfp
 
     # -----------------
     # Device Properties
@@ -44,7 +44,7 @@ class UNB2(opcua_device):
     UNB2_mask_RW_default = device_property(
         dtype='DevVarBooleanArray',
         mandatory=False,
-        default_value=[True] * N_UNB
+        default_value=[True] * N_unb
     )
 
     UNB2TR_monitor_rate_RW_default = device_property(
@@ -71,65 +71,65 @@ class UNB2(opcua_device):
         'UNB2TR_monitor_rate_RW'
     ]
 
-    UNB2TR_I2C_bus_DDR4_error_R  = attribute_wrapper(comms_annotation=["UNB2TR_I2C_bus_DDR4_error_R"],datatype=numpy.int64  , dims=(N_UNB,N_FPGA))
-    UNB2TR_I2C_bus_error_R       = attribute_wrapper(comms_annotation=["UNB2TR_I2C_bus_error_R"    ],datatype=numpy.int64  , dims=(N_UNB,))
-    UNB2TR_I2C_bus_FPGA_PS_error_R = attribute_wrapper(comms_annotation=["UNB2TR_I2C_bus_FPGA_PS_error_R"],datatype=numpy.int64  , dims=(N_UNB,N_FPGA))
-    UNB2TR_I2C_bus_PS_error_R    = attribute_wrapper(comms_annotation=["UNB2TR_I2C_bus_PS_error_R" ],datatype=numpy.int64  , dims=(N_UNB,))
-    UNB2TR_I2C_bus_QSFP_error_R  = attribute_wrapper(comms_annotation=["UNB2TR_I2C_bus_QSFP_error_R"],datatype=numpy.int64  , dims=(N_UNB,N_QSFP))
+    UNB2TR_I2C_bus_DDR4_error_R  = attribute_wrapper(comms_annotation=["UNB2TR_I2C_bus_DDR4_error_R"], datatype=numpy.int64, dims=(N_unb, N_fpga))
+    UNB2TR_I2C_bus_error_R       = attribute_wrapper(comms_annotation=["UNB2TR_I2C_bus_error_R"    ], datatype=numpy.int64, dims=(N_unb,))
+    UNB2TR_I2C_bus_FPGA_PS_error_R = attribute_wrapper(comms_annotation=["UNB2TR_I2C_bus_FPGA_PS_error_R"], datatype=numpy.int64, dims=(N_unb, N_fpga))
+    UNB2TR_I2C_bus_PS_error_R    = attribute_wrapper(comms_annotation=["UNB2TR_I2C_bus_PS_error_R" ], datatype=numpy.int64, dims=(N_unb,))
+    UNB2TR_I2C_bus_QSFP_error_R  = attribute_wrapper(comms_annotation=["UNB2TR_I2C_bus_QSFP_error_R"], datatype=numpy.int64, dims=(N_unb, N_qsfp))
     UNB2TR_monitor_rate_RW       = attribute_wrapper(comms_annotation=["UNB2TR_monitor_rate_RW"    ],datatype=numpy.int64  , access=AttrWriteType.READ_WRITE)
     UNB2TR_translator_busy_R     = attribute_wrapper(comms_annotation=["UNB2TR_translator_busy_R"  ],datatype=bool)
-    UNB2_DC_DC_48V_12V_IOUT_R    = attribute_wrapper(comms_annotation=["UNB2_DC_DC_48V_12V_IOUT_R" ],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_DC_DC_48V_12V_TEMP_R    = attribute_wrapper(comms_annotation=["UNB2_DC_DC_48V_12V_TEMP_R" ],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_DC_DC_48V_12V_VIN_R     = attribute_wrapper(comms_annotation=["UNB2_DC_DC_48V_12V_VIN_R"  ],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_DC_DC_48V_12V_VOUT_R    = attribute_wrapper(comms_annotation=["UNB2_DC_DC_48V_12V_VOUT_R" ],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_FPGA_DDR4_SLOT_TEMP_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_DDR4_SLOT_TEMP_R"],datatype=numpy.float64, dims=(N_UNB,N_FPGA * N_DDR))
-    UNB2_FPGA_POL_CORE_IOUT_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_CORE_IOUT_R" ],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_CORE_TEMP_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_CORE_TEMP_R" ],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_CORE_VOUT_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_CORE_VOUT_R" ],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_ERAM_IOUT_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_ERAM_IOUT_R" ],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_ERAM_TEMP_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_ERAM_TEMP_R" ],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_ERAM_VOUT_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_ERAM_VOUT_R" ],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_HGXB_IOUT_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_HGXB_IOUT_R" ],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_HGXB_TEMP_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_HGXB_TEMP_R" ],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_HGXB_VOUT_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_HGXB_VOUT_R" ],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_PGM_IOUT_R     = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_PGM_IOUT_R"  ],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_PGM_TEMP_R     = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_PGM_TEMP_R"  ],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_PGM_VOUT_R     = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_PGM_VOUT_R"  ],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_RXGXB_IOUT_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_RXGXB_IOUT_R"],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_RXGXB_TEMP_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_RXGXB_TEMP_R"],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_RXGXB_VOUT_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_RXGXB_VOUT_R"],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_TXGXB_IOUT_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_TXGXB_IOUT_R"],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_TXGXB_TEMP_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_TXGXB_TEMP_R"],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_POL_TXGXB_VOUT_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_TXGXB_VOUT_R"],datatype=numpy.float64, dims=(N_UNB,N_FPGA))
-    UNB2_FPGA_QSFP_CAGE_LOS_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_QSFP_CAGE_LOS_R" ],datatype=numpy.int64  , dims=(N_UNB,N_QSFP))
-    UNB2_FPGA_QSFP_CAGE_TEMP_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_QSFP_CAGE_TEMP_R"],datatype=numpy.float64, dims=(N_UNB,N_QSFP))
-    UNB2_Front_Panel_LED_colour_R = attribute_wrapper(comms_annotation=["UNB2_Front_Panel_LED_colour_R"],datatype=numpy.int64  , dims=(N_UNB,))
-    UNB2_Front_Panel_LED_colour_RW = attribute_wrapper(comms_annotation=["UNB2_Front_Panel_LED_colour_RW"],datatype=numpy.int64  , dims=(N_UNB,), access=AttrWriteType.READ_WRITE)
-    UNB2_mask_RW                 = attribute_wrapper(comms_annotation=["UNB2_mask_RW"              ],datatype=bool, dims=(N_UNB,), access=AttrWriteType.READ_WRITE)
-    UNB2_PCB_ID_R                = attribute_wrapper(comms_annotation=["UNB2_PCB_ID_R"             ],datatype=numpy.int64  , dims=(N_UNB,))
-    UNB2_PCB_number_R            = attribute_wrapper(comms_annotation=["UNB2_PCB_number_R"         ],datatype=str          , dims=(N_UNB,))
-    UNB2_PCB_version_R           = attribute_wrapper(comms_annotation=["UNB2_PCB_version_R"        ],datatype=str          , dims=(N_UNB,))
-    UNB2_POL_CLOCK_IOUT_R        = attribute_wrapper(comms_annotation=["UNB2_POL_CLOCK_IOUT_R"     ],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_POL_CLOCK_TEMP_R        = attribute_wrapper(comms_annotation=["UNB2_POL_CLOCK_TEMP_R"     ],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_POL_CLOCK_VOUT_R        = attribute_wrapper(comms_annotation=["UNB2_POL_CLOCK_VOUT_R"     ],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_POL_QSFP_N01_IOUT_R     = attribute_wrapper(comms_annotation=["UNB2_POL_QSFP_N01_IOUT_R"  ],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_POL_QSFP_N01_TEMP_R     = attribute_wrapper(comms_annotation=["UNB2_POL_QSFP_N01_TEMP_R"  ],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_POL_QSFP_N01_VOUT_R     = attribute_wrapper(comms_annotation=["UNB2_POL_QSFP_N01_VOUT_R"  ],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_POL_QSFP_N23_IOUT_R     = attribute_wrapper(comms_annotation=["UNB2_POL_QSFP_N23_IOUT_R"  ],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_POL_QSFP_N23_TEMP_R     = attribute_wrapper(comms_annotation=["UNB2_POL_QSFP_N23_TEMP_R"  ],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_POL_QSFP_N23_VOUT_R     = attribute_wrapper(comms_annotation=["UNB2_POL_QSFP_N23_VOUT_R"  ],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_POL_SWITCH_1V2_IOUT_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_1V2_IOUT_R"],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_POL_SWITCH_1V2_TEMP_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_1V2_TEMP_R"],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_POL_SWITCH_1V2_VOUT_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_1V2_VOUT_R"],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_POL_SWITCH_PHY_IOUT_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_PHY_IOUT_R"],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_POL_SWITCH_PHY_TEMP_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_PHY_TEMP_R"],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_POL_SWITCH_PHY_VOUT_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_PHY_VOUT_R"],datatype=numpy.float64, dims=(N_UNB,))
-    UNB2_PWR_on_R                = attribute_wrapper(comms_annotation=["UNB2_PWR_on_R"             ],datatype=bool, dims=(N_UNB,))
+    UNB2_DC_DC_48V_12V_IOUT_R    = attribute_wrapper(comms_annotation=["UNB2_DC_DC_48V_12V_IOUT_R" ], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_DC_DC_48V_12V_TEMP_R    = attribute_wrapper(comms_annotation=["UNB2_DC_DC_48V_12V_TEMP_R" ], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_DC_DC_48V_12V_VIN_R     = attribute_wrapper(comms_annotation=["UNB2_DC_DC_48V_12V_VIN_R"  ], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_DC_DC_48V_12V_VOUT_R    = attribute_wrapper(comms_annotation=["UNB2_DC_DC_48V_12V_VOUT_R" ], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_FPGA_DDR4_SLOT_TEMP_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_DDR4_SLOT_TEMP_R"], datatype=numpy.float64, dims=(N_unb, N_fpga * N_ddr))
+    UNB2_FPGA_POL_CORE_IOUT_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_CORE_IOUT_R" ], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_CORE_TEMP_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_CORE_TEMP_R" ], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_CORE_VOUT_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_CORE_VOUT_R" ], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_ERAM_IOUT_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_ERAM_IOUT_R" ], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_ERAM_TEMP_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_ERAM_TEMP_R" ], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_ERAM_VOUT_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_ERAM_VOUT_R" ], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_HGXB_IOUT_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_HGXB_IOUT_R" ], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_HGXB_TEMP_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_HGXB_TEMP_R" ], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_HGXB_VOUT_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_HGXB_VOUT_R" ], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_PGM_IOUT_R     = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_PGM_IOUT_R"  ], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_PGM_TEMP_R     = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_PGM_TEMP_R"  ], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_PGM_VOUT_R     = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_PGM_VOUT_R"  ], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_RXGXB_IOUT_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_RXGXB_IOUT_R"], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_RXGXB_TEMP_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_RXGXB_TEMP_R"], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_RXGXB_VOUT_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_RXGXB_VOUT_R"], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_TXGXB_IOUT_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_TXGXB_IOUT_R"], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_TXGXB_TEMP_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_TXGXB_TEMP_R"], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_POL_TXGXB_VOUT_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_POL_TXGXB_VOUT_R"], datatype=numpy.float64, dims=(N_unb, N_fpga))
+    UNB2_FPGA_QSFP_CAGE_LOS_R    = attribute_wrapper(comms_annotation=["UNB2_FPGA_QSFP_CAGE_LOS_R" ], datatype=numpy.int64, dims=(N_unb, N_qsfp))
+    UNB2_FPGA_QSFP_CAGE_TEMP_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_QSFP_CAGE_TEMP_R"], datatype=numpy.float64, dims=(N_unb, N_qsfp))
+    UNB2_Front_Panel_LED_colour_R = attribute_wrapper(comms_annotation=["UNB2_Front_Panel_LED_colour_R"], datatype=numpy.int64, dims=(N_unb,))
+    UNB2_Front_Panel_LED_colour_RW = attribute_wrapper(comms_annotation=["UNB2_Front_Panel_LED_colour_RW"], datatype=numpy.int64, dims=(N_unb,), access=AttrWriteType.READ_WRITE)
+    UNB2_mask_RW                 = attribute_wrapper(comms_annotation=["UNB2_mask_RW"              ], datatype=bool, dims=(N_unb,), access=AttrWriteType.READ_WRITE)
+    UNB2_PCB_ID_R                = attribute_wrapper(comms_annotation=["UNB2_PCB_ID_R"             ], datatype=numpy.int64, dims=(N_unb,))
+    UNB2_PCB_number_R            = attribute_wrapper(comms_annotation=["UNB2_PCB_number_R"         ], datatype=str, dims=(N_unb,))
+    UNB2_PCB_version_R           = attribute_wrapper(comms_annotation=["UNB2_PCB_version_R"        ], datatype=str, dims=(N_unb,))
+    UNB2_POL_CLOCK_IOUT_R        = attribute_wrapper(comms_annotation=["UNB2_POL_CLOCK_IOUT_R"     ], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_POL_CLOCK_TEMP_R        = attribute_wrapper(comms_annotation=["UNB2_POL_CLOCK_TEMP_R"     ], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_POL_CLOCK_VOUT_R        = attribute_wrapper(comms_annotation=["UNB2_POL_CLOCK_VOUT_R"     ], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_POL_QSFP_N01_IOUT_R     = attribute_wrapper(comms_annotation=["UNB2_POL_QSFP_N01_IOUT_R"  ], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_POL_QSFP_N01_TEMP_R     = attribute_wrapper(comms_annotation=["UNB2_POL_QSFP_N01_TEMP_R"  ], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_POL_QSFP_N01_VOUT_R     = attribute_wrapper(comms_annotation=["UNB2_POL_QSFP_N01_VOUT_R"  ], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_POL_QSFP_N23_IOUT_R     = attribute_wrapper(comms_annotation=["UNB2_POL_QSFP_N23_IOUT_R"  ], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_POL_QSFP_N23_TEMP_R     = attribute_wrapper(comms_annotation=["UNB2_POL_QSFP_N23_TEMP_R"  ], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_POL_QSFP_N23_VOUT_R     = attribute_wrapper(comms_annotation=["UNB2_POL_QSFP_N23_VOUT_R"  ], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_POL_SWITCH_1V2_IOUT_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_1V2_IOUT_R"], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_POL_SWITCH_1V2_TEMP_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_1V2_TEMP_R"], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_POL_SWITCH_1V2_VOUT_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_1V2_VOUT_R"], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_POL_SWITCH_PHY_IOUT_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_PHY_IOUT_R"], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_POL_SWITCH_PHY_TEMP_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_PHY_TEMP_R"], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_POL_SWITCH_PHY_VOUT_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_PHY_VOUT_R"], datatype=numpy.float64, dims=(N_unb,))
+    UNB2_PWR_on_R                = attribute_wrapper(comms_annotation=["UNB2_PWR_on_R"             ], datatype=bool, dims=(N_unb,))
 
     # ----------
     # Summarising Attributes
     # ----------
-    UNB2_error_R                  = attribute(dtype=(bool,), max_dim_x=N_UNB, fisallowed="is_attribute_access_allowed")
+    UNB2_error_R                  = attribute(dtype=(bool,), max_dim_x=N_unb, fisallowed="is_attribute_access_allowed")
 
     def read_UNB2_error_R(self):
         return self.read_attribute("UNB2_mask_RW") & (
@@ -140,9 +140,9 @@ class UNB2(opcua_device):
                | (self.read_attribute("UNB2TR_I2C_bus_QSFP_error_R") > 0).any(axis=1)
                )
 
-    UNB2_IOUT_error_R          = attribute(dtype=(bool,), max_dim_x=N_UNB, fisallowed="is_attribute_access_allowed")
-    UNB2_TEMP_error_R          = attribute(dtype=(bool,), max_dim_x=N_UNB, fisallowed="is_attribute_access_allowed", polling_period=constants.default_polling_period)
-    UNB2_VOUT_error_R          = attribute(dtype=(bool,), max_dim_x=N_UNB, fisallowed="is_attribute_access_allowed")
+    UNB2_IOUT_error_R          = attribute(dtype=(bool,), max_dim_x=N_unb, fisallowed="is_attribute_access_allowed")
+    UNB2_TEMP_error_R          = attribute(dtype=(bool,), max_dim_x=N_unb, fisallowed="is_attribute_access_allowed", polling_period=constants.DEFAULT_POLLING_PERIOD)
+    UNB2_VOUT_error_R          = attribute(dtype=(bool,), max_dim_x=N_unb, fisallowed="is_attribute_access_allowed")
 
     def read_UNB2_IOUT_error_R(self):
         return self.read_attribute("UNB2_mask_RW") & (
@@ -211,7 +211,7 @@ class UNB2(opcua_device):
         # Save actual mask values
         UNB2_mask = self.proxy.UNB2_mask_RW
         # Set the mask to all Trues
-        self.UNB2_mask_RW = [True] * constants.N_UNB
+        self.UNB2_mask_RW = [True] * constants.N_unb
         # Turn off the uniboards
         self.UNB2_off()
         self.wait_attribute("UNB2TR_translator_busy_R", False, self.UNB2_On_Off_timeout)
diff --git a/tangostationcontrol/tangostationcontrol/test/clients/test_client.py b/tangostationcontrol/tangostationcontrol/test/clients/test_client.py
index 4f3a0c5d2eda256bc089ebd58c4dbc587beb08cd..8bf63cd8dfe4f77938d5cdca5c037cb0b69d3791 100644
--- a/tangostationcontrol/tangostationcontrol/test/clients/test_client.py
+++ b/tangostationcontrol/tangostationcontrol/test/clients/test_client.py
@@ -11,7 +11,7 @@ logger = logging.getLogger()
 class test_client(CommClient):
     """
     this class provides an example implementation of a comms_client.
-    Durirng initialisation it creates a correctly shaped zero filled value. on read that value is returned and on write its modified.
+    During initialisation it creates a correctly shaped zero filled value. on read that value is returned and on write its modified.
     """
 
     def start(self):