diff --git a/jupyter-notebooks/test_template.ipynb b/jupyter-notebooks/test_template.ipynb
index 9d3553517b38f2a6ebdd1f54dc8cb5a461de4909..136e4965faa8023230e44ed5a6f602812e51e740 100644
--- a/jupyter-notebooks/test_template.ipynb
+++ b/jupyter-notebooks/test_template.ipynb
@@ -119,24 +119,11 @@
    "id": "7532d05e",
    "metadata": {},
    "source": [
-    "### Hot reboot\n",
+    "### Reboot\n",
     "\n",
     "Makes sure the software and hardware are all in a known state."
    ]
   },
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "id": "c7a3effa",
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "# Restart boot device\n",
-    "boot.off()\n",
-    "boot.initialise()\n",
-    "boot.on()"
-   ]
-  },
   {
    "cell_type": "code",
    "execution_count": 2,
@@ -145,7 +132,7 @@
    "outputs": [],
    "source": [
     "# Reboot the station\n",
-    "boot.boot()"
+    "boot.reboot()"
    ]
   },
   {
diff --git a/tangostationcontrol/tangostationcontrol/devices/apsct.py b/tangostationcontrol/tangostationcontrol/devices/apsct.py
index f75707676a19bbea21eef4352b3e53852cdc3968..20b161e97b16f99d352340246770d5db9f99f3e3 100644
--- a/tangostationcontrol/tangostationcontrol/devices/apsct.py
+++ b/tangostationcontrol/tangostationcontrol/devices/apsct.py
@@ -79,7 +79,30 @@ class APSCT(opcua_device):
 
     def read_APSCT_error_R(self):
         return ((self.proxy.APSCTTR_I2C_error_R > 0)
-               | self.alarm_val("APSCT_PCB_ID_R"))
+               | self.alarm_val("APSCT_PCB_ID_R")
+               | ~self.proxy.APSCT_INPUT_10MHz_good_R
+               | (~self.proxy.APSCT_INPUT_PPS_good_R & ~self.proxy.ASPCT_PPS_ignore_R)
+               | (~self.proxy.APSCT_PLL_160MHz_locked_R & ~self.proxy.APSCT_PLL_200MHz_locked_R)
+               | (self.proxy.APSCT_PLL_200MHz_locked_R & self.proxy.APSCT_PLL_200MHz_error_R)
+               | (self.proxy.APSCT_PLL_160MHz_locked_R & self.proxy.APSCT_PLL_160MHz_error_R)
+               )
+
+    APSCT_TEMP_error_R            = attribute(dtype=bool)
+    APSCT_VOUT_error_R            = attribute(dtype=bool)
+
+    def read_APSCT_TEMP_error_R(self):
+        return (self.alarm_val("APSCT_TEMP_R"))
+
+    def read_APSCT_VOUT_error_R(self):
+        return ( self.alarm_val("APSCT_PWR_PPSDIST_3V3_R")
+               | self.alarm_val("APSCT_PWR_CLKDIST1_3V3_R")
+               | self.alarm_val("APSCT_PWR_CLKDIST2_3V3_R")
+               | self.alarm_val("APSCT_PWR_CTRL_3V3_R")
+               | self.alarm_val("APSCT_PWR_INPUT_3V3_R")
+               | (self.proxy.APSCT_PWR_PLL_160MHz_on_R & self.alarm_val("APSCT_PWR_PLL_160MHz_3V3_R"))
+               | (self.proxy.APSCT_PWR_PLL_200MHz_on_R & self.alarm_val("APSCT_PWR_PLL_200MHz_3V3_R"))
+               | ~self.proxy.APSCT_PWR_on_R
+               )
 
     # --------
     # overloaded functions
diff --git a/tangostationcontrol/tangostationcontrol/devices/apspu.py b/tangostationcontrol/tangostationcontrol/devices/apspu.py
index 44b58c25ed3aca314fb93ae2f26f8cea90b663ee..d014a0eae151d89e77c71a9f0048dfb5e01bcd6b 100644
--- a/tangostationcontrol/tangostationcontrol/devices/apspu.py
+++ b/tangostationcontrol/tangostationcontrol/devices/apspu.py
@@ -72,6 +72,28 @@ class APSPU(opcua_device):
                | self.alarm_val("APSPU_FAN2_RPM_R") 
                | self.alarm_val("APSPU_FAN3_RPM_R"))
 
+    APSPU_IOUT_error_R          = attribute(dtype=bool)
+    APSPU_TEMP_error_R          = attribute(dtype=bool)
+    APSPU_VOUT_error_R          = attribute(dtype=bool)
+
+    def read_APSPU_IOUT_error_R(self):
+        return ( self.alarm_val("APSPU_LBA_IOUT_R")
+               | self.alarm_val("APSPU_RCU2A_IOUT_R")
+               | self.alarm_val("APSPU_RCU2D_IOUT_R")
+               )
+
+    def read_APSPU_TEMP_error_R(self):
+        return ( self.alarm_val("APSPU_LBA_TEMP_R")
+               | self.alarm_val("APSPU_RCU2A_TEMP_R")
+               | self.alarm_val("APSPU_RCU2D_TEMP_R")
+               )
+
+    def read_APSPU_VOUT_error_R(self):
+        return ( self.alarm_val("APSPU_LBA_VOUT_R")
+               | self.alarm_val("APSPU_RCU2A_VOUT_R")
+               | self.alarm_val("APSPU_RCU2D_VOUT_R")
+               )
+
     # --------
     # overloaded functions
     # --------
diff --git a/tangostationcontrol/tangostationcontrol/devices/lofar_device.py b/tangostationcontrol/tangostationcontrol/devices/lofar_device.py
index 9d68a5decefe79e03211d6b587a3b299d88e954b..745fa641de5ba8af0352b1447e86973380968824 100644
--- a/tangostationcontrol/tangostationcontrol/devices/lofar_device.py
+++ b/tangostationcontrol/tangostationcontrol/devices/lofar_device.py
@@ -266,7 +266,7 @@ class lofar_device(Device, metaclass=DeviceMeta):
         # This is just the command version of _initialise_hardware().
         self._initialise_hardware()
 
-    def _boot_device(self, initialise_hardware=True):
+    def _boot(self, initialise_hardware=True):
         # setup connections
         self.Initialise()
 
diff --git a/tangostationcontrol/tangostationcontrol/devices/recv.py b/tangostationcontrol/tangostationcontrol/devices/recv.py
index 965f276482bb50b370cd8be33ca0039de779f09e..238764ae29bd27e884b63a0de68e0640c0429065 100644
--- a/tangostationcontrol/tangostationcontrol/devices/recv.py
+++ b/tangostationcontrol/tangostationcontrol/devices/recv.py
@@ -186,6 +186,32 @@ class RECV(opcua_device):
                  ~self.proxy.RCU_ADC_locked_R
                )
 
+    RECV_IOUT_error_R          = attribute(dtype=(bool,), max_dim_x=32)
+    RECV_TEMP_error_R          = attribute(dtype=(bool,), max_dim_x=32)
+    RECV_VOUT_error_R          = attribute(dtype=(bool,), max_dim_x=32)
+
+    def read_RECV_IOUT_error_R(self):
+        return self.proxy.ANT_mask_RW & (
+                 self.alarm_val("RCU_PWR_ANT_IOUT_R")
+               ).any(axis=1)
+
+    def read_RECV_TEMP_error_R(self):
+        return self.proxy.RCU_mask_RW & (
+                 self.alarm_val("RCU_TEMP_R")
+               )
+
+    def read_RECV_VOUT_error_R(self):
+        return (self.proxy.ANT_mask_RW & (
+                 self.alarm_val("RCU_PWR_ANT_VIN_R")
+               | self.alarm_val("RCU_PWR_ANT_VOUT_R")
+               ).any(axis=1) | (self.proxy.RCU_mask_RW & (
+                 self.alarm_val("RCU_PWR_1V8_R")
+               | self.alarm_val("RCU_PWR_2V5_R")
+               | self.alarm_val("RCU_PWR_3V3_R")
+               | ~self.proxy.RCU_PWR_DIGITAL_on_R
+               | ~self.proxy.RCU_PWR_good_R
+               )))
+
     # --------
     # overloaded functions
     # --------
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py b/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py
index 275d8fe8a44ad44e947ae573563cfd8f9454e304..2337b01429dfb9d03ddd27830d096cb53f3cc58e 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py
@@ -214,6 +214,7 @@ class SDP(opcua_device):
     def read_FPGA_error_R(self):
         return self.proxy.TR_fpga_mask_RW & (
                  self.proxy.TR_fpga_communication_error_R
+               | self.alarm_val(self.proxy.FPGA_jesd204b_csr_dev_syncn_R).any(axis=1)
                )
 
     def read_FPGA_processing_error_R(self):
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/sst.py b/tangostationcontrol/tangostationcontrol/devices/sdp/sst.py
index 889f38ba2a6bbbd3bbcf43852c95edc1843d9317..f541f81080688fff53154c37ae049d18bf33aec1 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/sst.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/sst.py
@@ -104,6 +104,16 @@ class SST(Statistics):
     # whether the subband data was calibrated by the SDP (that is, were subband weights applied)
     subbands_calibrated_R   = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "statistics", "parameter": "subbands_calibrated"}, dims=(SSTCollector.MAX_INPUTS,), datatype=numpy.bool_)
 
+    # ----------
+    # Summarising Attributes
+    # ----------
+    FPGA_processing_error_R      = attribute(dtype=(bool,), max_dim_x=16)
+
+    def read_FPGA_processing_error_R(self):
+        return self.sdp_proxy.TR_fpga_mask_RW & (
+                 ~self.proxy.FPGA_sst_offload_enable_R
+               )
+
     # --------
     # Overloaded functions
     # --------
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py b/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py
index 21286acd44b5a83a8ac3fb904f55b2024bbf03fe..0e96366bcaa2758921ef4431a82e01ac653d19ad 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py
@@ -13,6 +13,7 @@
 
 # PyTango imports
 from tango.server import device_property
+from tango import DeviceProxy
 
 # Additional import
 import asyncio
@@ -123,6 +124,9 @@ class Statistics(opcua_device):
         future = asyncio.run_coroutine_threadsafe(self._connect_statistics(), self.statistics_client.event_loop)
         _ = future.result()
 
+        # proxy the SDP device in case we need the FPGA mask
+        self.sdp_proxy = DeviceProxy("STAT/SDP/1")
+
     async def _connect_statistics(self):
         # map an access helper class
         for i in self.attr_list():
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/xst.py b/tangostationcontrol/tangostationcontrol/devices/sdp/xst.py
index 3b0f59d242c7d29ac707b7e7361d2e9dce706424..89da8dddcf19dc9195db6bc6c88c61475c61c2f6 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/xst.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/xst.py
@@ -144,6 +144,16 @@ class XST(Statistics):
     def read_xst_phase_R(self):
         return numpy.angle(self.statistics_client.collector.xst_values())
 
+    # ----------
+    # Summarising Attributes
+    # ----------
+    FPGA_processing_error_R      = attribute(dtype=(bool,), max_dim_x=16)
+
+    def read_FPGA_processing_error_R(self):
+        return self.sdp_proxy.TR_fpga_mask_RW & (
+                 ~self.proxy.FPGA_xst_offload_enable_R
+               )
+
     # --------
     # Overloaded functions
     # --------
diff --git a/tangostationcontrol/tangostationcontrol/devices/unb2.py b/tangostationcontrol/tangostationcontrol/devices/unb2.py
index de7f736588b6c9cf303ff44b0a5fea9f8f9c9b30..d172c8ddc35a5111024929217d382477e385061c 100644
--- a/tangostationcontrol/tangostationcontrol/devices/unb2.py
+++ b/tangostationcontrol/tangostationcontrol/devices/unb2.py
@@ -123,24 +123,66 @@ class UNB2(opcua_device):
     # Summarising Attributes
     # ----------
     UNB2_error_R                  = attribute(dtype=(bool,), max_dim_x=2)
-    UNB2_FPGA_error_R             = attribute(dtype=((bool,),), max_dim_x=4, max_dim_y=2)
-    UNB2_QSFP_error_R             = attribute(dtype=((bool,),), max_dim_x=24, max_dim_y=2)
 
     def read_UNB2_error_R(self):
         return self.proxy.UNB2_mask_RW & (
                  (self.proxy.UNB2TR_I2C_bus_error_R > 0)
                | self.alarm_val("UNB2_PCB_ID_R")
+               | (self.proxy.UNB2TR_I2C_bus_DDR4_error_R > 0).any(axis=1)
+               | (self.proxy.UNB2TR_I2C_bus_FPGA_PS_error_R > 0).any(axis=1)
+               | (self.proxy.UNB2TR_I2C_bus_QSFP_error_R > 0).any(axis=1)
                )
 
-    def read_UNB2_FPGA_error_R(self):
+    UNB2_IOUT_error_R          = attribute(dtype=(bool,), max_dim_x=2)
+    UNB2_TEMP_error_R          = attribute(dtype=(bool,), max_dim_x=2)
+    UNB2_VOUT_error_R          = attribute(dtype=(bool,), max_dim_x=2)
+
+    def read_UNB2_IOUT_error_R(self):
+        return self.proxy.UNB2_mask_RW & (
+                 self.alarm_val("UNB2_DC_DC_48V_12V_IOUT_R")
+               | self.alarm_val("UNB2_FPGA_POL_CORE_IOUT_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_ERAM_IOUT_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_HGXB_IOUT_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_PGM_IOUT_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_RXGXB_IOUT_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_TXGXB_IOUT_R").any(axis=1)
+               | self.alarm_val("UNB2_POL_CLOCK_IOUT_R")
+               | self.alarm_val("UNB2_POL_QSFP_N01_IOUT_R")
+               | self.alarm_val("UNB2_POL_QSFP_N23_IOUT_R")
+               | self.alarm_val("UNB2_POL_SWITCH_1V2_IOUT_R")
+               | self.alarm_val("UNB2_POL_SWITCH_PHY_IOUT_R")
+               )
+
+    def read_UNB2_TEMP_error_R(self):
         return self.proxy.UNB2_mask_RW & (
-                 (self.proxy.UNB2TR_I2C_bus_DDR4_error_R > 0)
-               | (self.proxy.UNB2TR_I2C_bus_FPGA_PS_error_R > 0)
+                 self.alarm_val("UNB2_DC_DC_48V_12V_TEMP_R")
+               | self.alarm_val("UNB2_FPGA_POL_CORE_TEMP_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_ERAM_TEMP_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_HGXB_TEMP_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_PGM_TEMP_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_RXGXB_TEMP_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_TXGXB_TEMP_R").any(axis=1)
+               | self.alarm_val("UNB2_POL_CLOCK_TEMP_R")
+               | self.alarm_val("UNB2_POL_QSFP_N01_TEMP_R")
+               | self.alarm_val("UNB2_POL_QSFP_N23_TEMP_R")
+               | self.alarm_val("UNB2_POL_SWITCH_1V2_TEMP_R")
+               | self.alarm_val("UNB2_POL_SWITCH_PHY_TEMP_R")
                )
 
-    def read_UNB2_QSFP_error_R(self):
+    def read_UNB2_VOUT_error_R(self):
         return self.proxy.UNB2_mask_RW & (
-                 (self.proxy.UNB2TR_I2C_bus_QSFP_error_R > 0)
+                 self.alarm_val("UNB2_DC_DC_48V_12V_VOUT_R")
+               | self.alarm_val("UNB2_FPGA_POL_CORE_VOUT_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_ERAM_VOUT_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_HGXB_VOUT_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_PGM_VOUT_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_RXGXB_VOUT_R").any(axis=1)
+               | self.alarm_val("UNB2_FPGA_POL_TXGXB_VOUT_R").any(axis=1)
+               | self.alarm_val("UNB2_POL_CLOCK_VOUT_R")
+               | self.alarm_val("UNB2_POL_QSFP_N01_VOUT_R")
+               | self.alarm_val("UNB2_POL_QSFP_N23_VOUT_R")
+               | self.alarm_val("UNB2_POL_SWITCH_1V2_VOUT_R")
+               | self.alarm_val("UNB2_POL_SWITCH_PHY_VOUT_R")
                )
 
     # --------