diff --git a/jupyter-notebooks/RECV_archive_all_attributes.ipynb b/jupyter-notebooks/RECV_archive_all_attributes.ipynb
index 9e3e2192d4931ad5894707d6286240626e56f09a..f2bd62944105978593e6a7a7a829328882cdccca 100644
--- a/jupyter-notebooks/RECV_archive_all_attributes.ipynb
+++ b/jupyter-notebooks/RECV_archive_all_attributes.ipynb
@@ -446,7 +446,7 @@
    "source": [
     "# Plot of array values\n",
     "\n",
-    "heatmap = np.array(array_values,dtype=np.float64)\n",
+    "heatmap = np.array(array_values,dtype=np.float)\n",
     "fig = plt.figure()\n",
     "plt.rcParams['figure.figsize'] = [128, 64]\n",
     "plt.rcParams['figure.dpi'] = 128\n",
diff --git a/jupyter-notebooks/ini_device.ipynb b/jupyter-notebooks/ini_device.ipynb
index 940906d96add0c4a3954e62d1e2a5815c9c5a222..a5b5e950e9cdf5dbffa58624523df2a7cca6b17f 100644
--- a/jupyter-notebooks/ini_device.ipynb
+++ b/jupyter-notebooks/ini_device.ipynb
@@ -174,7 +174,7 @@
     }
    ],
    "source": [
-    "str([\"a\", \"b\", \"c\", \"d\", \"e\", \"f\"])"
+    "numpy.str_([\"a\", \"b\", \"c\", \"d\", \"e\", \"f\"])"
    ]
   },
   {
@@ -199,7 +199,7 @@
     "string = '\"a\", \"b\", \"c\", \"d\", \"e\", \"f\"'\n",
     "\n",
     "for i in string.split(\",\"):\n",
-    "    value = str(i)\n",
+    "    value = numpy.str_(i)\n",
     "    array.append(value)\n",
     "\n",
     "len(array)"
@@ -235,4 +235,4 @@
  },
  "nbformat": 4,
  "nbformat_minor": 5
-}
+}
\ No newline at end of file
diff --git a/tangostationcontrol/tangostationcontrol/clients/README.md b/tangostationcontrol/tangostationcontrol/clients/README.md
index c7085de860b20ade0e8d759f3bbd72d211e452df..3aa6a653df55601fe776c6acbde1f68c4350afee 100644
--- a/tangostationcontrol/tangostationcontrol/clients/README.md
+++ b/tangostationcontrol/tangostationcontrol/clients/README.md
@@ -52,7 +52,7 @@ class RECV(opcua_device):
     # ----------
     
     # Scalar attribute
-    RECVTR_translator_busy_R = attribute_wrapper(comms_annotation=["RECVTR_translator_busy_R"],datatype=bool)
+    RECVTR_translator_busy_R = attribute_wrapper(comms_annotation=["RECVTR_translator_busy_R"],datatype=numpy.bool_  )
     
     # Array attribute 
     RCU_TEMP_R  = attribute_wrapper(comms_annotation=["RCU_TEMP_R"], datatype=numpy.float64, dims=(32,))
diff --git a/tangostationcontrol/tangostationcontrol/clients/attribute_wrapper.py b/tangostationcontrol/tangostationcontrol/clients/attribute_wrapper.py
index 5d9f5bdc8cd123e0ffd28c962548fc94bdf82572..3a0b659ddaf70f9e96e76e9d1c2728f902bede28 100644
--- a/tangostationcontrol/tangostationcontrol/clients/attribute_wrapper.py
+++ b/tangostationcontrol/tangostationcontrol/clients/attribute_wrapper.py
@@ -28,8 +28,15 @@ class attribute_wrapper(attribute):
         # ensure the type is a numpy array.
         # see also https://pytango.readthedocs.io/en/stable/server_api/server.html?highlight=devlong#module-tango.server for
         # more details about type conversion Python/numpy -> PyTango
-        if "numpy" not in str(datatype) and datatype != str and datatype != bool:
-            raise ValueError(f"Attribute needs to be a Tango-supported numpy, str or bool type, but has type {datatype}")
+        if "numpy" not in str(datatype) and datatype != str:
+            raise ValueError(f"Attribute needs to be a Tango-supported numpy or str type, but has type {datatype}")
+
+        """
+        Numpy has a depracated string type called numpy.str_.
+        this behaves differently from numpy.str (which is literally just an str.
+        """
+        if datatype == numpy.str_:
+            raise Exception("numpy.str_ type not supported, please use numpy.str instead")
 
         self.comms_id = comms_id # store data that can be used to identify the comms interface to use. not used by the wrapper itself
         self.comms_annotation = comms_annotation  # store data that can be used by the comms interface. not used by the wrapper itself
@@ -37,6 +44,8 @@ class attribute_wrapper(attribute):
         self.init_value = init_value
         is_scalar = dims == (1,)
 
+
+
         self.numpy_type = datatype  # tango changes our attribute to their representation (E.g numpy.int64 becomes "DevLong64")
 
         # check if not scalar
diff --git a/tangostationcontrol/tangostationcontrol/clients/opcua_client.py b/tangostationcontrol/tangostationcontrol/clients/opcua_client.py
index 448b4fc5f1754cb54273140aa240256f4d6ff58d..9b8637f339858768e026da152975efa4af1cce88 100644
--- a/tangostationcontrol/tangostationcontrol/clients/opcua_client.py
+++ b/tangostationcontrol/tangostationcontrol/clients/opcua_client.py
@@ -12,6 +12,7 @@ logger = logging.getLogger()
 __all__ = ["OPCUAConnection", "ProtocolAttribute"]
 
 numpy_to_OPCua_dict = {
+    numpy.bool_: asyncua.ua.VariantType.Boolean,
     numpy.int8: asyncua.ua.VariantType.SByte,
     numpy.uint8: asyncua.ua.VariantType.Byte,
     numpy.int16: asyncua.ua.VariantType.Int16,
@@ -23,8 +24,7 @@ numpy_to_OPCua_dict = {
     numpy.float32: asyncua.ua.VariantType.Float,
     numpy.double: asyncua.ua.VariantType.Double,
     numpy.float64: asyncua.ua.VariantType.Double,
-    bool: asyncua.ua.VariantType.Boolean,
-    str: asyncua.ua.VariantType.String,
+    numpy.str: asyncua.ua.VariantType.String
 }
 
 def numpy_to_opcua(numpy_val):
diff --git a/tangostationcontrol/tangostationcontrol/clients/statistics_client.py b/tangostationcontrol/tangostationcontrol/clients/statistics_client.py
index 017ad5e70c34752a8ff815b42105d73c720d8dbf..6981c31a5437b96af04171981f5bf3d6562963d5 100644
--- a/tangostationcontrol/tangostationcontrol/clients/statistics_client.py
+++ b/tangostationcontrol/tangostationcontrol/clients/statistics_client.py
@@ -125,7 +125,7 @@ class StatisticsClient(AsyncCommClient):
                 return self.collector.parameters[parameter]
         
         def _process_replicator_annotation():
-            parameters_dict = {"clients":           numpy.array(self.tcp.clients(),dtype=str),
+            parameters_dict = {"clients":           numpy.array(self.tcp.clients(),dtype=numpy.str),
                             "nof_bytes_sent":       numpy.uint64(self.tcp.nof_bytes_sent),
                             "nof_packets_sent":     numpy.uint64(self.tcp.nof_packets_sent),
                             "nof_tasks_pending":    numpy.uint64(self.tcp.nof_tasks_pending)}
diff --git a/tangostationcontrol/tangostationcontrol/devices/antennafield.py b/tangostationcontrol/tangostationcontrol/devices/antennafield.py
index 86258de6f32b3bb5c0acc4123a2451467c2f5834..0c377d0f24b6f9aa7d9e6830dcacb65c8b91755a 100644
--- a/tangostationcontrol/tangostationcontrol/devices/antennafield.py
+++ b/tangostationcontrol/tangostationcontrol/devices/antennafield.py
@@ -164,45 +164,45 @@ class AntennaField(lofar_device):
         default_value = []
     )
 
-    HBAT_ANT_mask_RW             = mapped_attribute("ANT_mask_RW", dtype=(bool,), max_dim_x=MAX_NUMBER_OF_HBAT, access=AttrWriteType.READ_WRITE)
+    HBAT_ANT_mask_RW             = mapped_attribute("ANT_mask_RW", dtype=(numpy.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)
-    HBAT_LED_on_RW               = mapped_attribute("HBAT_LED_on_RW", dtype=((bool,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT, access=AttrWriteType.READ_WRITE)
-    HBAT_PWR_LNA_on_R            = mapped_attribute("HBAT_PWR_LNA_on_R", dtype=((bool,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT)
-    HBAT_PWR_LNA_on_RW           = mapped_attribute("HBAT_PWR_LNA_on_RW", dtype=((bool,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT, access=AttrWriteType.READ_WRITE)
-    HBAT_PWR_on_R                = mapped_attribute("HBAT_PWR_on_R", dtype=((bool,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT)
-    HBAT_PWR_on_RW               = mapped_attribute("HBAT_PWR_on_RW", dtype=((bool,),), 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=((numpy.bool_,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT)
+    HBAT_LED_on_RW               = mapped_attribute("HBAT_LED_on_RW", dtype=((numpy.bool_,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT, access=AttrWriteType.READ_WRITE)
+    HBAT_PWR_LNA_on_R            = mapped_attribute("HBAT_PWR_LNA_on_R", dtype=((numpy.bool_,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT)
+    HBAT_PWR_LNA_on_RW           = mapped_attribute("HBAT_PWR_LNA_on_RW", dtype=((numpy.bool_,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT, access=AttrWriteType.READ_WRITE)
+    HBAT_PWR_on_R                = mapped_attribute("HBAT_PWR_on_R", dtype=((numpy.bool_,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT)
+    HBAT_PWR_on_RW               = mapped_attribute("HBAT_PWR_on_RW", dtype=((numpy.bool_,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 2, max_dim_y=MAX_NUMBER_OF_HBAT, access=AttrWriteType.READ_WRITE)
 
     # ----- Position information
 
     Antenna_Field_Reference_ITRF_R = attribute(access=AttrWriteType.READ,
         doc='Absolute reference position of antenna field, in ITRF (XYZ)',
-        dtype=(numpy.float64,), max_dim_x=3)
+        dtype=(numpy.float,), max_dim_x=3)
 
     Antenna_Field_Reference_GEO_R = attribute(access=AttrWriteType.READ,
         doc='Absolute reference position of antenna field, in latitude/longitude (degrees)',
-        dtype=(numpy.float64,), max_dim_x=2)
+        dtype=(numpy.float,), max_dim_x=2)
 
     Antenna_Field_Reference_GEOHASH_R = attribute(access=AttrWriteType.READ,
         doc='Absolute reference position of antenna field, as a geohash string',
-        dtype=str)
+        dtype=numpy.str)
 
     HBAT_antenna_ITRF_offsets_R = attribute(access=AttrWriteType.READ,
         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)
+        dtype=((numpy.float,),), max_dim_x=NUMBER_OF_ELEMENTS_PER_TILE * 3, max_dim_y=96)
 
     HBAT_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)
+        dtype=((numpy.float,),), max_dim_x=3, max_dim_y=MAX_NUMBER_OF_HBAT)
 
     HBAT_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)
+        dtype=((numpy.float,),), max_dim_x=2, max_dim_y=MAX_NUMBER_OF_HBAT)
 
     HBAT_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,)
+        dtype=(numpy.str,), max_dim_x=MAX_NUMBER_OF_HBAT,)
 
     nr_tiles_R = attribute(
         doc='Number of HBAT in this field',
diff --git a/tangostationcontrol/tangostationcontrol/devices/apsct.py b/tangostationcontrol/tangostationcontrol/devices/apsct.py
index e4e411e115713931e20bceb7c290242710156c3e..a83d8bec6f4ebd64eb2b1c1c13cc4ae1c62cf4ff 100644
--- a/tangostationcontrol/tangostationcontrol/devices/apsct.py
+++ b/tangostationcontrol/tangostationcontrol/devices/apsct.py
@@ -58,27 +58,27 @@ class APSCT(opcua_device):
 
     APSCTTR_I2C_error_R          = attribute_wrapper(comms_annotation=["APSCTTR_I2C_error_R"       ],datatype=numpy.int64  )
     APSCTTR_monitor_rate_RW      = attribute_wrapper(comms_annotation=["APSCTTR_monitor_rate_RW"   ],datatype=numpy.int64  , access=AttrWriteType.READ_WRITE)
-    APSCTTR_translator_busy_R    = attribute_wrapper(comms_annotation=["APSCTTR_translator_busy_R" ],datatype=bool)
-    APSCT_INPUT_10MHz_good_R     = attribute_wrapper(comms_annotation=["APSCT_INPUT_10MHz_good_R"  ],datatype=bool)
-    APSCT_INPUT_PPS_good_R       = attribute_wrapper(comms_annotation=["APSCT_INPUT_PPS_good_R"    ],datatype=bool)
+    APSCTTR_translator_busy_R    = attribute_wrapper(comms_annotation=["APSCTTR_translator_busy_R" ],datatype=numpy.bool_  )
+    APSCT_INPUT_10MHz_good_R     = attribute_wrapper(comms_annotation=["APSCT_INPUT_10MHz_good_R"  ],datatype=numpy.bool_  )
+    APSCT_INPUT_PPS_good_R       = attribute_wrapper(comms_annotation=["APSCT_INPUT_PPS_good_R"    ],datatype=numpy.bool_  )
     APSCT_PCB_ID_R               = attribute_wrapper(comms_annotation=["APSCT_PCB_ID_R"            ],datatype=numpy.int64  )
-    APSCT_PCB_number_R           = attribute_wrapper(comms_annotation=["APSCT_PCB_number_R"        ],datatype=str          )
-    APSCT_PCB_version_R          = attribute_wrapper(comms_annotation=["APSCT_PCB_version_R"       ],datatype=str          )
-    APSCT_PLL_160MHz_error_R     = attribute_wrapper(comms_annotation=["APSCT_PLL_160MHz_error_R"  ],datatype=bool)
-    APSCT_PLL_160MHz_locked_R    = attribute_wrapper(comms_annotation=["APSCT_PLL_160MHz_locked_R" ],datatype=bool)
-    APSCT_PLL_200MHz_error_R     = attribute_wrapper(comms_annotation=["APSCT_PLL_200MHz_error_R"  ],datatype=bool)
-    APSCT_PLL_200MHz_locked_R    = attribute_wrapper(comms_annotation=["APSCT_PLL_200MHz_locked_R" ],datatype=bool)
-    APSCT_PPS_ignore_R           = attribute_wrapper(comms_annotation=["APSCT_PPS_ignore_R"        ],datatype=bool)
-    APSCT_PPS_ignore_RW          = attribute_wrapper(comms_annotation=["APSCT_PPS_ignore_RW"       ],datatype=bool, access=AttrWriteType.READ_WRITE)
+    APSCT_PCB_number_R           = attribute_wrapper(comms_annotation=["APSCT_PCB_number_R"        ],datatype=numpy.str    )
+    APSCT_PCB_version_R          = attribute_wrapper(comms_annotation=["APSCT_PCB_version_R"       ],datatype=numpy.str    )
+    APSCT_PLL_160MHz_error_R     = attribute_wrapper(comms_annotation=["APSCT_PLL_160MHz_error_R"  ],datatype=numpy.bool_  )
+    APSCT_PLL_160MHz_locked_R    = attribute_wrapper(comms_annotation=["APSCT_PLL_160MHz_locked_R" ],datatype=numpy.bool_  )
+    APSCT_PLL_200MHz_error_R     = attribute_wrapper(comms_annotation=["APSCT_PLL_200MHz_error_R"  ],datatype=numpy.bool_  )
+    APSCT_PLL_200MHz_locked_R    = attribute_wrapper(comms_annotation=["APSCT_PLL_200MHz_locked_R" ],datatype=numpy.bool_  )
+    APSCT_PPS_ignore_R           = attribute_wrapper(comms_annotation=["APSCT_PPS_ignore_R"        ],datatype=numpy.bool_  )
+    APSCT_PPS_ignore_RW          = attribute_wrapper(comms_annotation=["APSCT_PPS_ignore_RW"       ],datatype=numpy.bool_  , access=AttrWriteType.READ_WRITE)
     APSCT_PWR_CLKDIST1_3V3_R     = attribute_wrapper(comms_annotation=["APSCT_PWR_CLKDIST1_3V3_R"  ],datatype=numpy.float64)
     APSCT_PWR_CLKDIST2_3V3_R     = attribute_wrapper(comms_annotation=["APSCT_PWR_CLKDIST2_3V3_R"  ],datatype=numpy.float64)
     APSCT_PWR_CTRL_3V3_R         = attribute_wrapper(comms_annotation=["APSCT_PWR_CTRL_3V3_R"      ],datatype=numpy.float64)
     APSCT_PWR_INPUT_3V3_R        = attribute_wrapper(comms_annotation=["APSCT_PWR_INPUT_3V3_R"     ],datatype=numpy.float64)
-    APSCT_PWR_on_R               = attribute_wrapper(comms_annotation=["APSCT_PWR_on_R"            ],datatype=bool)
+    APSCT_PWR_on_R               = attribute_wrapper(comms_annotation=["APSCT_PWR_on_R"            ],datatype=numpy.bool_  )
     APSCT_PWR_PLL_160MHz_3V3_R   = attribute_wrapper(comms_annotation=["APSCT_PWR_PLL_160MHz_3V3_R"],datatype=numpy.float64)
-    APSCT_PWR_PLL_160MHz_on_R    = attribute_wrapper(comms_annotation=["APSCT_PWR_PLL_160MHz_on_R" ],datatype=bool)
+    APSCT_PWR_PLL_160MHz_on_R    = attribute_wrapper(comms_annotation=["APSCT_PWR_PLL_160MHz_on_R" ],datatype=numpy.bool_  )
     APSCT_PWR_PLL_200MHz_3V3_R   = attribute_wrapper(comms_annotation=["APSCT_PWR_PLL_200MHz_3V3_R"],datatype=numpy.float64)
-    APSCT_PWR_PLL_200MHz_on_R    = attribute_wrapper(comms_annotation=["APSCT_PWR_PLL_200MHz_on_R" ],datatype=bool)
+    APSCT_PWR_PLL_200MHz_on_R    = attribute_wrapper(comms_annotation=["APSCT_PWR_PLL_200MHz_on_R" ],datatype=numpy.bool_  )
     APSCT_PWR_PPSDIST_3V3_R      = attribute_wrapper(comms_annotation=["APSCT_PWR_PPSDIST_3V3_R"   ],datatype=numpy.float64)
     APSCT_TEMP_R                 = attribute_wrapper(comms_annotation=["APSCT_TEMP_R"              ],datatype=numpy.float64)
 
diff --git a/tangostationcontrol/tangostationcontrol/devices/apspu.py b/tangostationcontrol/tangostationcontrol/devices/apspu.py
index ff32c3c9d9befb2563be1999f7ab3616fcf51456..40042c5d1f8d569fbc2d07cf063a02a477a2a1d9 100644
--- a/tangostationcontrol/tangostationcontrol/devices/apspu.py
+++ b/tangostationcontrol/tangostationcontrol/devices/apspu.py
@@ -43,7 +43,7 @@ class APSPU(opcua_device):
 
     APSPUTR_I2C_error_R          = attribute_wrapper(comms_annotation=["APSPUTR_I2C_error_R"       ],datatype=numpy.int64  )
     APSPUTR_monitor_rate_RW      = attribute_wrapper(comms_annotation=["APSPUTR_monitor_rate_RW"   ],datatype=numpy.int64  , access=AttrWriteType.READ_WRITE)
-    APSPUTR_translator_busy_R    = attribute_wrapper(comms_annotation=["APSPUTR_translator_busy_R" ],datatype=bool         )
+    APSPUTR_translator_busy_R    = attribute_wrapper(comms_annotation=["APSPUTR_translator_busy_R" ],datatype=numpy.bool_  )
     APSPU_FAN1_RPM_R             = attribute_wrapper(comms_annotation=["APSPU_FAN1_RPM_R"          ],datatype=numpy.float64)
     APSPU_FAN2_RPM_R             = attribute_wrapper(comms_annotation=["APSPU_FAN2_RPM_R"          ],datatype=numpy.float64)
     APSPU_FAN3_RPM_R             = attribute_wrapper(comms_annotation=["APSPU_FAN3_RPM_R"          ],datatype=numpy.float64)
@@ -51,8 +51,8 @@ class APSPU(opcua_device):
     APSPU_LBA_TEMP_R             = attribute_wrapper(comms_annotation=["APSPU_LBA_TEMP_R"          ],datatype=numpy.float64)
     APSPU_LBA_VOUT_R             = attribute_wrapper(comms_annotation=["APSPU_LBA_VOUT_R"          ],datatype=numpy.float64)
     APSPU_PCB_ID_R               = attribute_wrapper(comms_annotation=["APSPU_PCB_ID_R"            ],datatype=numpy.int64  )
-    APSPU_PCB_number_R           = attribute_wrapper(comms_annotation=["APSPU_PCB_number_R"        ],datatype=str          )
-    APSPU_PCB_version_R          = attribute_wrapper(comms_annotation=["APSPU_PCB_version_R"       ],datatype=str          )
+    APSPU_PCB_number_R           = attribute_wrapper(comms_annotation=["APSPU_PCB_number_R"        ],datatype=numpy.str    )
+    APSPU_PCB_version_R          = attribute_wrapper(comms_annotation=["APSPU_PCB_version_R"       ],datatype=numpy.str    )
     APSPU_RCU2A_IOUT_R           = attribute_wrapper(comms_annotation=["APSPU_RCU2A_IOUT_R"        ],datatype=numpy.float64)
     APSPU_RCU2A_TEMP_R           = attribute_wrapper(comms_annotation=["APSPU_RCU2A_TEMP_R"        ],datatype=numpy.float64)
     APSPU_RCU2A_VOUT_R           = attribute_wrapper(comms_annotation=["APSPU_RCU2A_VOUT_R"        ],datatype=numpy.float64)
diff --git a/tangostationcontrol/tangostationcontrol/devices/beam_device.py b/tangostationcontrol/tangostationcontrol/devices/beam_device.py
index 3bf7d49932742dde3140d532b1b2c07aebcd991e..888976dcf83f049a4480d38c330a5c9a597a0ef0 100644
--- a/tangostationcontrol/tangostationcontrol/devices/beam_device.py
+++ b/tangostationcontrol/tangostationcontrol/devices/beam_device.py
@@ -67,16 +67,16 @@ class beam_device(lofar_device):
     MAX_POINTINGS = 1024
 
     Pointing_direction_R = attribute(access=AttrWriteType.READ,
-        dtype=((str,),), max_dim_x=3, max_dim_y=MAX_POINTINGS,
+        dtype=((numpy.str,),), max_dim_x=3, max_dim_y=MAX_POINTINGS,
         fget=lambda self: self._pointing_direction_r)
 
     Pointing_direction_RW = attribute(access=AttrWriteType.READ_WRITE,
-        dtype=((str,),), max_dim_x=3, max_dim_y=MAX_POINTINGS,
+        dtype=((numpy.str,),), max_dim_x=3, max_dim_y=MAX_POINTINGS,
         fget=lambda self: self._pointing_direction_rw)
 
     Pointing_direction_str_R = attribute(access=AttrWriteType.READ,
         doc='Pointing direction as a formatted string',
-        dtype=(str,), max_dim_x=MAX_POINTINGS,
+        dtype=(numpy.str,), max_dim_x=MAX_POINTINGS,
         fget=lambda self:  ["{0} ({1}, {2})".format(*x) for x in self._pointing_direction_r])
 
     Pointing_timestamp_R = attribute(access=AttrWriteType.READ,
@@ -85,16 +85,16 @@ class beam_device(lofar_device):
 
     Tracking_enabled_R = attribute(access=AttrWriteType.READ,
         doc="Whether the tile beam is updated periodically",
-        dtype=bool,
+        dtype=numpy.bool,
         fget=lambda self: bool(self.Beam_tracker and self.Beam_tracker.is_alive()))
 
     Tracking_enabled_RW = attribute(access=AttrWriteType.READ_WRITE,
         doc="Whether the tile beam should be updated periodically",
-        dtype=bool,
+        dtype=numpy.bool,
         fget=lambda self: self._tracking_enabled_rw)
 
     Duration_update_pointing_R = attribute(access=AttrWriteType.READ,
-        dtype=numpy.float64, fget=lambda self: self.update_pointing.statistics["last"] or 0)
+        dtype=numpy.float, fget=lambda self: self.update_pointing.statistics["last"] or 0)
 
     def write_Pointing_direction_RW(self, value):
         """ Setter method for attribute Pointing_direction_RW """
diff --git a/tangostationcontrol/tangostationcontrol/devices/boot.py b/tangostationcontrol/tangostationcontrol/devices/boot.py
index 3e1dbcb6f4746422e6b3b9502f32a0594c0e1b0d..3484a6ee47188b4dc47db0d0ece56145ff032d9f 100644
--- a/tangostationcontrol/tangostationcontrol/devices/boot.py
+++ b/tangostationcontrol/tangostationcontrol/devices/boot.py
@@ -253,8 +253,8 @@ class Boot(lofar_device):
     # ----------
     # Attributes
     # ----------
-    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")
+    booting_R = attribute(dtype=numpy.bool_, access=AttrWriteType.READ, fget=lambda self: self.initialiser.is_running(), doc="Whether booting is in progress.")
+    progress_R = attribute(dtype=numpy.int, access=AttrWriteType.READ, fget=lambda self: numpy.int(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=128, 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=128, 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")
diff --git a/tangostationcontrol/tangostationcontrol/devices/docker_device.py b/tangostationcontrol/tangostationcontrol/devices/docker_device.py
index 77d01e164219683eeb51f00c5a96fcecc2b1375c..1f7e7c72278a549c913af56eab706e48d978836d 100644
--- a/tangostationcontrol/tangostationcontrol/devices/docker_device.py
+++ b/tangostationcontrol/tangostationcontrol/devices/docker_device.py
@@ -44,52 +44,52 @@ class Docker(lofar_device):
     # ----------
     # Attributes
     # ----------
-    archiver_timescale_R = attribute_wrapper(comms_annotation={"container": "archiver-timescale"}, datatype=bool)
-    archiver_timescale_RW = attribute_wrapper(comms_annotation={"container": "archiver-timescale"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    databaseds_R = attribute_wrapper(comms_annotation={"container": "databaseds"}, datatype=bool)
-    databaseds_RW = attribute_wrapper(comms_annotation={"container": "databaseds"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    device_apsct_R = attribute_wrapper(comms_annotation={"container": "device-apsct"}, datatype=bool)
-    device_apsct_RW = attribute_wrapper(comms_annotation={"container": "device-apsct"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    device_apspu_R = attribute_wrapper(comms_annotation={"container": "device-apspu"}, datatype=bool)
-    device_apspu_RW = attribute_wrapper(comms_annotation={"container": "device-apspu"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    device_beam_R = attribute_wrapper(comms_annotation={"container": "device-beam"}, datatype=bool)
-    device_beam_RW = attribute_wrapper(comms_annotation={"container": "device-beam"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    device_boot_R = attribute_wrapper(comms_annotation={"container": "device-boot"}, datatype=bool)
-    device_boot_RW = attribute_wrapper(comms_annotation={"container": "device-boot"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    device_recv_R = attribute_wrapper(comms_annotation={"container": "device-recv"}, datatype=bool)
-    device_recv_RW = attribute_wrapper(comms_annotation={"container": "device-recv"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    device_sdp_R = attribute_wrapper(comms_annotation={"container": "device-sdp"}, datatype=bool)
-    device_sdp_RW = attribute_wrapper(comms_annotation={"container": "device-sdp"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    device_sst_R = attribute_wrapper(comms_annotation={"container": "device-sst"}, datatype=bool)
-    device_sst_RW = attribute_wrapper(comms_annotation={"container": "device-sst"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    device_xst_R = attribute_wrapper(comms_annotation={"container": "device-xst"}, datatype=bool)
-    device_xst_RW = attribute_wrapper(comms_annotation={"container": "device-xst"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    device_unb2_R = attribute_wrapper(comms_annotation={"container": "device-unb2"}, datatype=bool)
-    device_unb2_RW = attribute_wrapper(comms_annotation={"container": "device-unb2"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    device_docker_R = attribute_wrapper(comms_annotation={"container": "device-docker"}, datatype=bool)
+    archiver_timescale_R = attribute_wrapper(comms_annotation={"container": "archiver-timescale"}, datatype=numpy.bool_)
+    archiver_timescale_RW = attribute_wrapper(comms_annotation={"container": "archiver-timescale"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    databaseds_R = attribute_wrapper(comms_annotation={"container": "databaseds"}, datatype=numpy.bool_)
+    databaseds_RW = attribute_wrapper(comms_annotation={"container": "databaseds"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    device_apsct_R = attribute_wrapper(comms_annotation={"container": "device-apsct"}, datatype=numpy.bool_)
+    device_apsct_RW = attribute_wrapper(comms_annotation={"container": "device-apsct"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    device_apspu_R = attribute_wrapper(comms_annotation={"container": "device-apspu"}, datatype=numpy.bool_)
+    device_apspu_RW = attribute_wrapper(comms_annotation={"container": "device-apspu"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    device_beam_R = attribute_wrapper(comms_annotation={"container": "device-beam"}, datatype=numpy.bool_)
+    device_beam_RW = attribute_wrapper(comms_annotation={"container": "device-beam"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    device_boot_R = attribute_wrapper(comms_annotation={"container": "device-boot"}, datatype=numpy.bool_)
+    device_boot_RW = attribute_wrapper(comms_annotation={"container": "device-boot"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    device_recv_R = attribute_wrapper(comms_annotation={"container": "device-recv"}, datatype=numpy.bool_)
+    device_recv_RW = attribute_wrapper(comms_annotation={"container": "device-recv"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    device_sdp_R = attribute_wrapper(comms_annotation={"container": "device-sdp"}, datatype=numpy.bool_)
+    device_sdp_RW = attribute_wrapper(comms_annotation={"container": "device-sdp"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    device_sst_R = attribute_wrapper(comms_annotation={"container": "device-sst"}, datatype=numpy.bool_)
+    device_sst_RW = attribute_wrapper(comms_annotation={"container": "device-sst"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    device_xst_R = attribute_wrapper(comms_annotation={"container": "device-xst"}, datatype=numpy.bool_)
+    device_xst_RW = attribute_wrapper(comms_annotation={"container": "device-xst"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    device_unb2_R = attribute_wrapper(comms_annotation={"container": "device-unb2"}, datatype=numpy.bool_)
+    device_unb2_RW = attribute_wrapper(comms_annotation={"container": "device-unb2"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    device_docker_R = attribute_wrapper(comms_annotation={"container": "device-docker"}, datatype=numpy.bool_)
     # device_docker_RW is not available, as we cannot start our own container`
-    dsconfig_R = attribute_wrapper(comms_annotation={"container": "dsconfig"}, datatype=bool)
-    dsconfig_RW = attribute_wrapper(comms_annotation={"container": "dsconfig"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    elk_R = attribute_wrapper(comms_annotation={"container": "elk"}, datatype=bool)
-    elk_RW = attribute_wrapper(comms_annotation={"container": "elk"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    grafana_R = attribute_wrapper(comms_annotation={"container": "grafana"}, datatype=bool)
-    grafana_RW = attribute_wrapper(comms_annotation={"container": "grafana"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    hdbppts_cm_R = attribute_wrapper(comms_annotation={"container": "hdbppts-cm"}, datatype=bool)
-    hdbppts_cm_RW = attribute_wrapper(comms_annotation={"container": "hdbppts-cm"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    hdbppts_es_R = attribute_wrapper(comms_annotation={"container": "hdbppts-es"}, datatype=bool)
-    hdbppts_es_RW = attribute_wrapper(comms_annotation={"container": "hdbppts-es"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    itango_R = attribute_wrapper(comms_annotation={"container": "itango"}, datatype=bool)
-    itango_RW = attribute_wrapper(comms_annotation={"container": "itango"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    jupyter_R = attribute_wrapper(comms_annotation={"container": "jupyter"}, datatype=bool)
-    jupyter_RW = attribute_wrapper(comms_annotation={"container": "jupyter"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    prometheus_R = attribute_wrapper(comms_annotation={"container": "prometheus"}, datatype=bool)
-    prometheus_RW = attribute_wrapper(comms_annotation={"container": "prometheus"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    tangodb_R = attribute_wrapper(comms_annotation={"container": "tangodb"}, datatype=bool)
-    tangodb_RW = attribute_wrapper(comms_annotation={"container": "tangodb"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    tango_prometheus_exporter_R = attribute_wrapper(comms_annotation={"container": "tango-prometheus-exporter"}, datatype=bool)
-    tango_prometheus_exporter_RW = attribute_wrapper(comms_annotation={"container": "tango-prometheus-exporter"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    tango_rest_R = attribute_wrapper(comms_annotation={"container": "tango-rest"}, datatype=bool)
-    tango_rest_RW = attribute_wrapper(comms_annotation={"container": "tango-rest"}, datatype=bool, access=AttrWriteType.READ_WRITE)
+    dsconfig_R = attribute_wrapper(comms_annotation={"container": "dsconfig"}, datatype=numpy.bool_)
+    dsconfig_RW = attribute_wrapper(comms_annotation={"container": "dsconfig"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    elk_R = attribute_wrapper(comms_annotation={"container": "elk"}, datatype=numpy.bool_)
+    elk_RW = attribute_wrapper(comms_annotation={"container": "elk"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    grafana_R = attribute_wrapper(comms_annotation={"container": "grafana"}, datatype=numpy.bool_)
+    grafana_RW = attribute_wrapper(comms_annotation={"container": "grafana"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    hdbppts_cm_R = attribute_wrapper(comms_annotation={"container": "hdbppts-cm"}, datatype=numpy.bool_)
+    hdbppts_cm_RW = attribute_wrapper(comms_annotation={"container": "hdbppts-cm"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    hdbppts_es_R = attribute_wrapper(comms_annotation={"container": "hdbppts-es"}, datatype=numpy.bool_)
+    hdbppts_es_RW = attribute_wrapper(comms_annotation={"container": "hdbppts-es"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    itango_R = attribute_wrapper(comms_annotation={"container": "itango"}, datatype=numpy.bool_)
+    itango_RW = attribute_wrapper(comms_annotation={"container": "itango"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    jupyter_R = attribute_wrapper(comms_annotation={"container": "jupyter"}, datatype=numpy.bool_)
+    jupyter_RW = attribute_wrapper(comms_annotation={"container": "jupyter"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    prometheus_R = attribute_wrapper(comms_annotation={"container": "prometheus"}, datatype=numpy.bool_)
+    prometheus_RW = attribute_wrapper(comms_annotation={"container": "prometheus"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    tangodb_R = attribute_wrapper(comms_annotation={"container": "tangodb"}, datatype=numpy.bool_)
+    tangodb_RW = attribute_wrapper(comms_annotation={"container": "tangodb"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    tango_prometheus_exporter_R = attribute_wrapper(comms_annotation={"container": "tango-prometheus-exporter"}, datatype=numpy.bool_)
+    tango_prometheus_exporter_RW = attribute_wrapper(comms_annotation={"container": "tango-prometheus-exporter"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    tango_rest_R = attribute_wrapper(comms_annotation={"container": "tango-rest"}, datatype=numpy.bool_)
+    tango_rest_RW = attribute_wrapper(comms_annotation={"container": "tango-rest"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
 
     # --------
     # overloaded functions
diff --git a/tangostationcontrol/tangostationcontrol/devices/observation.py b/tangostationcontrol/tangostationcontrol/devices/observation.py
index f57e3ed992e22b77ed12cf50d495c30b405d90b5..07ca38de73d81269b30d4ace30a09341e0085793 100644
--- a/tangostationcontrol/tangostationcontrol/devices/observation.py
+++ b/tangostationcontrol/tangostationcontrol/devices/observation.py
@@ -41,10 +41,10 @@ class Observation(lofar_device):
     """
 
     # Attributes
-    observation_running_R = attribute(dtype=numpy.float64, access=AttrWriteType.READ, polling_period=1000, period=1000,
+    observation_running_R = attribute(dtype=numpy.float, access=AttrWriteType.READ, polling_period=1000, period=1000,
                                       rel_change="1.0")
     observation_id_R = attribute(dtype=numpy.int64, access=AttrWriteType.READ)
-    stop_time_R = attribute(dtype=numpy.float64, access=AttrWriteType.READ)
+    stop_time_R = attribute(dtype=numpy.float, access=AttrWriteType.READ)
 
     observation_settings_RW = attribute(dtype=str, access=AttrWriteType.READ_WRITE)
 
diff --git a/tangostationcontrol/tangostationcontrol/devices/recv.py b/tangostationcontrol/tangostationcontrol/devices/recv.py
index 916ec2b1932ab605a08f4161a73fd550a4574616..f810515338d585b4895b4d08698653f3fd2b981a 100644
--- a/tangostationcontrol/tangostationcontrol/devices/recv.py
+++ b/tangostationcontrol/tangostationcontrol/devices/recv.py
@@ -118,49 +118,49 @@ class RECV(opcua_device):
     # ----------
     # Attributes
     # ----------
-    ANT_mask_RW                  = attribute_wrapper(comms_annotation=["ANT_mask_RW"               ],datatype=bool         , dims=(3,32), access=AttrWriteType.READ_WRITE)
+    ANT_mask_RW                  = attribute_wrapper(comms_annotation=["ANT_mask_RW"               ],datatype=numpy.bool_  , dims=(3,32), access=AttrWriteType.READ_WRITE)
     
     # The HBAT beamformer delays represent 32 delays for each of the 96 inputs.
     # The 32 delays deconstruct as delays[polarisation][dipole], and each delay is the number of 'delay steps' to apply (0.5ns for HBAT1).
     HBAT_BF_delay_steps_R        = attribute_wrapper(comms_annotation=["HBAT_BF_delay_steps_R"     ],datatype=numpy.int64  , dims=(32,96))
     HBAT_BF_delay_steps_RW       = attribute_wrapper(comms_annotation=["HBAT_BF_delay_steps_RW"    ],datatype=numpy.int64  , dims=(32,96), access=AttrWriteType.READ_WRITE)
-    HBAT_LED_on_R                = attribute_wrapper(comms_annotation=["HBAT_LED_on_R"             ],datatype=bool         , dims=(32,96))
-    HBAT_LED_on_RW               = attribute_wrapper(comms_annotation=["HBAT_LED_on_RW"            ],datatype=bool         , dims=(32,96), access=AttrWriteType.READ_WRITE)
-    HBAT_PWR_LNA_on_R            = attribute_wrapper(comms_annotation=["HBAT_PWR_LNA_on_R"         ],datatype=bool         , dims=(32,96))
-    HBAT_PWR_LNA_on_RW           = attribute_wrapper(comms_annotation=["HBAT_PWR_LNA_on_RW"        ],datatype=bool         , dims=(32,96), access=AttrWriteType.READ_WRITE)
-    HBAT_PWR_on_R                = attribute_wrapper(comms_annotation=["HBAT_PWR_on_R"             ],datatype=bool         , dims=(32,96))
-    HBAT_PWR_on_RW               = attribute_wrapper(comms_annotation=["HBAT_PWR_on_RW"            ],datatype=bool         , dims=(32,96), access=AttrWriteType.READ_WRITE)
-    RCU_ADC_locked_R             = attribute_wrapper(comms_annotation=["RCU_ADC_locked_R"          ],datatype=bool         , dims=(3,32))
+    HBAT_LED_on_R                = attribute_wrapper(comms_annotation=["HBAT_LED_on_R"             ],datatype=numpy.bool_  , dims=(32,96))
+    HBAT_LED_on_RW               = attribute_wrapper(comms_annotation=["HBAT_LED_on_RW"            ],datatype=numpy.bool_  , dims=(32,96), access=AttrWriteType.READ_WRITE)
+    HBAT_PWR_LNA_on_R            = attribute_wrapper(comms_annotation=["HBAT_PWR_LNA_on_R"         ],datatype=numpy.bool_  , dims=(32,96))
+    HBAT_PWR_LNA_on_RW           = attribute_wrapper(comms_annotation=["HBAT_PWR_LNA_on_RW"        ],datatype=numpy.bool_  , dims=(32,96), access=AttrWriteType.READ_WRITE)
+    HBAT_PWR_on_R                = attribute_wrapper(comms_annotation=["HBAT_PWR_on_R"             ],datatype=numpy.bool_  , dims=(32,96))
+    HBAT_PWR_on_RW               = attribute_wrapper(comms_annotation=["HBAT_PWR_on_RW"            ],datatype=numpy.bool_  , dims=(32,96), access=AttrWriteType.READ_WRITE)
+    RCU_ADC_locked_R             = attribute_wrapper(comms_annotation=["RCU_ADC_locked_R"          ],datatype=numpy.bool_  , dims=(3,32))
     RCU_attenuator_dB_R          = attribute_wrapper(comms_annotation=["RCU_attenuator_dB_R"       ],datatype=numpy.int64  , dims=(3,32))
     RCU_attenuator_dB_RW         = attribute_wrapper(comms_annotation=["RCU_attenuator_dB_RW"      ],datatype=numpy.int64  , dims=(3,32), access=AttrWriteType.READ_WRITE)
     RCU_band_select_R            = attribute_wrapper(comms_annotation=["RCU_band_select_R"         ],datatype=numpy.int64  , dims=(3,32))
     RCU_band_select_RW           = attribute_wrapper(comms_annotation=["RCU_band_select_RW"        ],datatype=numpy.int64  , dims=(3,32), access=AttrWriteType.READ_WRITE)
     RCU_DTH_freq_R               = attribute_wrapper(comms_annotation=["RCU_DTH_freq_R"            ],datatype=numpy.int64  , dims=(3,32))
     RCU_DTH_freq_RW              = attribute_wrapper(comms_annotation=["RCU_DTH_freq_RW"           ],datatype=numpy.int64  , dims=(3,32), access=AttrWriteType.READ_WRITE)
-    RCU_DTH_on_R                 = attribute_wrapper(comms_annotation=["RCU_DTH_on_R"              ],datatype=bool         , dims=(3,32))
-    RCU_LED_green_on_R           = attribute_wrapper(comms_annotation=["RCU_LED_green_on_R"        ],datatype=bool         , dims=(32,))
-    RCU_LED_green_on_RW          = attribute_wrapper(comms_annotation=["RCU_LED_green_on_RW"       ],datatype=bool         , dims=(32,), access=AttrWriteType.READ_WRITE)
-    RCU_LED_red_on_R             = attribute_wrapper(comms_annotation=["RCU_LED_red_on_R"          ],datatype=bool         , dims=(32,))
-    RCU_LED_red_on_RW            = attribute_wrapper(comms_annotation=["RCU_LED_red_on_RW"         ],datatype=bool         , dims=(32,), access=AttrWriteType.READ_WRITE)
-    RCU_mask_RW                  = attribute_wrapper(comms_annotation=["RCU_mask_RW"               ],datatype=bool         , dims=(32,), access=AttrWriteType.READ_WRITE)
+    RCU_DTH_on_R                 = attribute_wrapper(comms_annotation=["RCU_DTH_on_R"              ],datatype=numpy.bool_  , dims=(3,32))
+    RCU_LED_green_on_R           = attribute_wrapper(comms_annotation=["RCU_LED_green_on_R"        ],datatype=numpy.bool_  , dims=(32,))
+    RCU_LED_green_on_RW          = attribute_wrapper(comms_annotation=["RCU_LED_green_on_RW"       ],datatype=numpy.bool_  , dims=(32,), access=AttrWriteType.READ_WRITE)
+    RCU_LED_red_on_R             = attribute_wrapper(comms_annotation=["RCU_LED_red_on_R"          ],datatype=numpy.bool_  , dims=(32,))
+    RCU_LED_red_on_RW            = attribute_wrapper(comms_annotation=["RCU_LED_red_on_RW"         ],datatype=numpy.bool_  , dims=(32,), access=AttrWriteType.READ_WRITE)
+    RCU_mask_RW                  = attribute_wrapper(comms_annotation=["RCU_mask_RW"               ],datatype=numpy.bool_  , dims=(32,), access=AttrWriteType.READ_WRITE)
     RCU_PCB_ID_R                 = attribute_wrapper(comms_annotation=["RCU_PCB_ID_R"              ],datatype=numpy.int64  , dims=(32,))
-    RCU_PCB_number_R             = attribute_wrapper(comms_annotation=["RCU_PCB_number_R"          ],datatype=str          , dims=(32,))
-    RCU_PCB_version_R            = attribute_wrapper(comms_annotation=["RCU_PCB_version_R"         ],datatype=str          , dims=(32,))
+    RCU_PCB_number_R             = attribute_wrapper(comms_annotation=["RCU_PCB_number_R"          ],datatype=numpy.str    , dims=(32,))
+    RCU_PCB_version_R            = attribute_wrapper(comms_annotation=["RCU_PCB_version_R"         ],datatype=numpy.str    , dims=(32,))
     RCU_PWR_1V8_R                = attribute_wrapper(comms_annotation=["RCU_PWR_1V8_R"             ],datatype=numpy.float64, dims=(32,))
     RCU_PWR_2V5_R                = attribute_wrapper(comms_annotation=["RCU_PWR_2V5_R"             ],datatype=numpy.float64, dims=(32,))
     RCU_PWR_3V3_R                = attribute_wrapper(comms_annotation=["RCU_PWR_3V3_R"             ],datatype=numpy.float64, dims=(32,))
-    RCU_PWR_ANALOG_on_R          = attribute_wrapper(comms_annotation=["RCU_PWR_ANALOG_on_R"       ],datatype=bool         , dims=(32,))
+    RCU_PWR_ANALOG_on_R          = attribute_wrapper(comms_annotation=["RCU_PWR_ANALOG_on_R"       ],datatype=numpy.bool_  , dims=(32,))
     RCU_PWR_ANT_IOUT_R           = attribute_wrapper(comms_annotation=["RCU_PWR_ANT_IOUT_R"        ],datatype=numpy.float64, dims=(3,32))
-    RCU_PWR_ANT_on_R             = attribute_wrapper(comms_annotation=["RCU_PWR_ANT_on_R"          ],datatype=bool         , dims=(3,32))
-    RCU_PWR_ANT_on_RW            = attribute_wrapper(comms_annotation=["RCU_PWR_ANT_on_RW"         ],datatype=bool         , dims=(3,32), access=AttrWriteType.READ_WRITE)
+    RCU_PWR_ANT_on_R             = attribute_wrapper(comms_annotation=["RCU_PWR_ANT_on_R"          ],datatype=numpy.bool_  , dims=(3,32))
+    RCU_PWR_ANT_on_RW            = attribute_wrapper(comms_annotation=["RCU_PWR_ANT_on_RW"         ],datatype=numpy.bool_  , dims=(3,32), access=AttrWriteType.READ_WRITE)
     RCU_PWR_ANT_VIN_R            = attribute_wrapper(comms_annotation=["RCU_PWR_ANT_VIN_R"         ],datatype=numpy.float64, dims=(3,32))
     RCU_PWR_ANT_VOUT_R           = attribute_wrapper(comms_annotation=["RCU_PWR_ANT_VOUT_R"        ],datatype=numpy.float64, dims=(3,32))
-    RCU_PWR_DIGITAL_on_R         = attribute_wrapper(comms_annotation=["RCU_PWR_DIGITAL_on_R"      ],datatype=bool         , dims=(32,))
-    RCU_PWR_good_R               = attribute_wrapper(comms_annotation=["RCU_PWR_good_R"            ],datatype=bool         , dims=(32,))
+    RCU_PWR_DIGITAL_on_R         = attribute_wrapper(comms_annotation=["RCU_PWR_DIGITAL_on_R"      ],datatype=numpy.bool_  , dims=(32,))
+    RCU_PWR_good_R               = attribute_wrapper(comms_annotation=["RCU_PWR_good_R"            ],datatype=numpy.bool_  , dims=(32,))
     RCU_TEMP_R                   = attribute_wrapper(comms_annotation=["RCU_TEMP_R"                ],datatype=numpy.float64, dims=(32,))
     RECVTR_I2C_error_R           = attribute_wrapper(comms_annotation=["RECVTR_I2C_error_R"        ],datatype=numpy.int64  , dims=(32,))
     RECVTR_monitor_rate_RW       = attribute_wrapper(comms_annotation=["RECVTR_monitor_rate_RW"    ],datatype=numpy.int64  , access=AttrWriteType.READ_WRITE)
-    RECVTR_translator_busy_R     = attribute_wrapper(comms_annotation=["RECVTR_translator_busy_R"  ],datatype=bool)
+    RECVTR_translator_busy_R     = attribute_wrapper(comms_annotation=["RECVTR_translator_busy_R"  ],datatype=numpy.bool_  )
 
     # ----------
     # Summarising Attributes
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/beamlet.py b/tangostationcontrol/tangostationcontrol/devices/sdp/beamlet.py
index 5d6e8412ba81f12f72db4a0d1edabf329e5c3fa8..50025e7cfb47a23fad806c0afdba043b05bd46ea 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/beamlet.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/beamlet.py
@@ -93,12 +93,12 @@ class Beamlet(opcua_device):
     # Attributes
     # ----------
 
-    FPGA_beamlet_output_enable_R = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_enable_R"], datatype=bool, dims=(16,))
-    FPGA_beamlet_output_enable_RW = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_enable_RW"], datatype=bool, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_beamlet_output_hdr_eth_destination_mac_R = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_hdr_eth_destination_mac_R"], datatype=str, dims=(16,))
-    FPGA_beamlet_output_hdr_eth_destination_mac_RW = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_hdr_eth_destination_mac_RW"], datatype=str, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_beamlet_output_hdr_ip_destination_address_R = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_hdr_ip_destination_address_R"], datatype=str, dims=(16,))
-    FPGA_beamlet_output_hdr_ip_destination_address_RW = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_hdr_ip_destination_address_RW"], datatype=str, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_beamlet_output_enable_R = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_enable_R"], datatype=numpy.bool_, dims=(16,))
+    FPGA_beamlet_output_enable_RW = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_enable_RW"], datatype=numpy.bool_, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_beamlet_output_hdr_eth_destination_mac_R = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_hdr_eth_destination_mac_R"], datatype=numpy.str, dims=(16,))
+    FPGA_beamlet_output_hdr_eth_destination_mac_RW = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_hdr_eth_destination_mac_RW"], datatype=numpy.str, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_beamlet_output_hdr_ip_destination_address_R = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_hdr_ip_destination_address_R"], datatype=numpy.str, dims=(16,))
+    FPGA_beamlet_output_hdr_ip_destination_address_RW = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_hdr_ip_destination_address_RW"], datatype=numpy.str, dims=(16,), access=AttrWriteType.READ_WRITE)
     FPGA_beamlet_output_hdr_udp_destination_port_R = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_hdr_udp_destination_port_R"], datatype=numpy.uint16, dims=(16,))
     FPGA_beamlet_output_hdr_udp_destination_port_RW = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_hdr_udp_destination_port_RW"], datatype=numpy.uint16, dims=(16,), access=AttrWriteType.READ_WRITE)
     FPGA_beamlet_output_scale_R = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_scale_R"], datatype=numpy.double, dims=(16,))
@@ -109,9 +109,9 @@ class Beamlet(opcua_device):
     FPGA_beamlet_output_nof_valid_R = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_nof_valid_R"], datatype=numpy.int32, dims=(N_beamsets_ctrl, N_pn))
 
     # boolean[N_pn][N_beamsets_ctrl]
-    FPGA_beamlet_output_ready_R = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_ready_R"], datatype=bool, dims=(N_beamsets_ctrl, N_pn))
+    FPGA_beamlet_output_ready_R = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_ready_R"], datatype=numpy.bool8, dims=(N_beamsets_ctrl, N_pn))
     # boolean[N_pn][N_beamsets_ctrl]
-    FPGA_beamlet_output_xon_R = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_xon_R"], datatype=bool, dims=(N_beamsets_ctrl, N_pn))
+    FPGA_beamlet_output_xon_R = attribute_wrapper(comms_annotation=["FPGA_beamlet_output_xon_R"], datatype=numpy.bool8, dims=(N_beamsets_ctrl, N_pn))
 
     # uint16[N_pn][A_pn][N_pol][N_beamlets_ctrl]
     # Select subband per dual-polarisation beamlet.
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/bst.py b/tangostationcontrol/tangostationcontrol/devices/sdp/bst.py
index 8cab71dc7a656ae13f5d7a2a3f68aacbb59c0b32..53c03071a8f51490882e0059d0efea8d8c4e5415 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/bst.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/bst.py
@@ -67,12 +67,12 @@ class BST(Statistics):
     # ----------
 
     # FPGA control points for BSTs
-    FPGA_bst_offload_enable_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_enable_RW"], datatype=bool, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_bst_offload_enable_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_enable_R"], datatype=bool, dims=(16,))
-    FPGA_bst_offload_hdr_eth_destination_mac_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_hdr_eth_destination_mac_RW"], datatype=str, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_bst_offload_hdr_eth_destination_mac_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_hdr_eth_destination_mac_R"], datatype=str, dims=(16,))
-    FPGA_bst_offload_hdr_ip_destination_address_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_hdr_ip_destination_address_RW"], datatype=str, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_bst_offload_hdr_ip_destination_address_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_hdr_ip_destination_address_R"], datatype=str, dims=(16,))
+    FPGA_bst_offload_enable_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_enable_RW"], datatype=numpy.bool_, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_bst_offload_enable_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_enable_R"], datatype=numpy.bool_, dims=(16,))
+    FPGA_bst_offload_hdr_eth_destination_mac_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_hdr_eth_destination_mac_RW"], datatype=numpy.str, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_bst_offload_hdr_eth_destination_mac_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_hdr_eth_destination_mac_R"], datatype=numpy.str, dims=(16,))
+    FPGA_bst_offload_hdr_ip_destination_address_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_hdr_ip_destination_address_RW"], datatype=numpy.str, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_bst_offload_hdr_ip_destination_address_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_hdr_ip_destination_address_R"], datatype=numpy.str, dims=(16,))
     FPGA_bst_offload_hdr_udp_destination_port_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_hdr_udp_destination_port_RW"], datatype=numpy.uint16, dims=(16,), access=AttrWriteType.READ_WRITE)
     FPGA_bst_offload_hdr_udp_destination_port_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_hdr_udp_destination_port_R"], datatype=numpy.uint16, dims=(16,))
     FPGA_bst_offload_bsn_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_bst_offload_bsn_R"], datatype=numpy.int64, dims=(16,))
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py b/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py
index c2e2fa4dfe3696a027b0a67a3842fccc7bc824fc..bc306a57b2cedf1a19cd8c9dfe969205fb73dcc9 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/digitalbeam.py
@@ -47,14 +47,14 @@ class DigitalBeam(beam_device):
     # -----------------
 
     AntennaField_Device = device_property(
-        dtype=str,
+        dtype=numpy.str,
         doc='Which AntennaField represents the FPGA inputs to beamform.',
         mandatory=False,
         default_value = "STAT/AntennaField/1"
     )
 
     Beamlet_Device = device_property(
-        dtype=str,
+        dtype=numpy.str,
         doc='Which Beamlet represents the FPGAs to steer.',
         mandatory=False,
         default_value = "STAT/Beamlet/1"
@@ -72,13 +72,13 @@ class DigitalBeam(beam_device):
     # ----------
 
     Duration_delays_R = attribute(access=AttrWriteType.READ,
-        dtype=numpy.float64, fget=lambda self: self._delays.statistics["last"] or 0)
+        dtype=numpy.float, fget=lambda self: self._delays.statistics["last"] or 0)
 
     input_select_RW = attribute(doc='Selection of inputs to use for forming each beamlet',
-                                  dtype=((bool,),), max_dim_x=NUM_BEAMLETS, max_dim_y=NUM_INPUTS, access=AttrWriteType.READ_WRITE, fisallowed="is_attribute_access_allowed")
+                                  dtype=((numpy.bool_,),), max_dim_x=NUM_BEAMLETS, max_dim_y=NUM_INPUTS, access=AttrWriteType.READ_WRITE, fisallowed="is_attribute_access_allowed")
 
     antenna_select_RW = attribute(doc='Selection of antennas to use for forming each beamlet (= a subset of input_select of the configured antennas)',
-                                  dtype=((bool,),), max_dim_x=NUM_BEAMLETS, max_dim_y=NUM_INPUTS, access=AttrWriteType.READ_WRITE, fisallowed="is_attribute_access_allowed")
+                                  dtype=((numpy.bool_,),), max_dim_x=NUM_BEAMLETS, max_dim_y=NUM_INPUTS, access=AttrWriteType.READ_WRITE, fisallowed="is_attribute_access_allowed")
 
 
     def read_input_select_RW(self):
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py b/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py
index d8254cabee83c3cafd72a9a3ecfc5f6963975d75..3329cd028124f226bc65f7f954e287d11ad70c10 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/sdp.py
@@ -110,25 +110,25 @@ class SDP(opcua_device):
     # Attributes
     # ----------
 
-    FPGA_firmware_version_R = attribute_wrapper(comms_annotation=["FPGA_firmware_version_R"], datatype=str, dims=(16,))
+    FPGA_firmware_version_R = attribute_wrapper(comms_annotation=["FPGA_firmware_version_R"], datatype=numpy.str, dims=(16,))
     FPGA_boot_image_R = attribute_wrapper(comms_annotation=["FPGA_boot_image_R"], datatype=numpy.int32, dims=(16,), doc="Active FPGA image (0=factory, 1=user)")
     FPGA_boot_image_RW = attribute_wrapper(comms_annotation=["FPGA_boot_image_RW"], datatype=numpy.int32, dims=(16,), access=AttrWriteType.READ_WRITE)
     FPGA_global_node_index_R = attribute_wrapper(comms_annotation=["FPGA_global_node_index_R"], datatype=numpy.uint32, dims=(16,))
-    FPGA_hardware_version_R = attribute_wrapper(comms_annotation=["FPGA_hardware_version_R"], datatype=str, dims=(16,))
-    FPGA_pps_present_R = attribute_wrapper(comms_annotation=["FPGA_pps_present_R"], datatype=bool, dims=(16,))
+    FPGA_hardware_version_R = attribute_wrapper(comms_annotation=["FPGA_hardware_version_R"], datatype=numpy.str, dims=(16,))
+    FPGA_pps_present_R = attribute_wrapper(comms_annotation=["FPGA_pps_present_R"], datatype=numpy.bool_, dims=(16,))
     FPGA_pps_capture_cnt_R = attribute_wrapper(comms_annotation=["FPGA_pps_capture_cnt_R"], datatype=numpy.uint32, dims=(16,))
     FPGA_pps_expected_cnt_R = attribute_wrapper(comms_annotation=["FPGA_pps_expected_cnt_R"], datatype=numpy.uint32, dims=(16,))
     FPGA_pps_expected_cnt_RW = attribute_wrapper(comms_annotation=["FPGA_pps_expected_cnt_RW"], datatype=numpy.uint32, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_processing_enable_R = attribute_wrapper(comms_annotation=["FPGA_processing_enable_R"], datatype=bool, dims=(16,))
-    FPGA_processing_enable_RW = attribute_wrapper(comms_annotation=["FPGA_processing_enable_RW"], datatype=bool, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_processing_enable_R = attribute_wrapper(comms_annotation=["FPGA_processing_enable_R"], datatype=numpy.bool_, dims=(16,))
+    FPGA_processing_enable_RW = attribute_wrapper(comms_annotation=["FPGA_processing_enable_RW"], datatype=numpy.bool_, dims=(16,), access=AttrWriteType.READ_WRITE)
     FPGA_ring_node_offset_R = attribute_wrapper(comms_annotation=["FPGA_ring_node_offset_R"], datatype=numpy.uint32, dims=(16,))
     FPGA_ring_node_offset_RW = attribute_wrapper(comms_annotation=["FPGA_ring_node_offset_RW"], datatype=numpy.uint32, dims=(16,), access=AttrWriteType.READ_WRITE)
     FPGA_ring_nof_nodes_R = attribute_wrapper(comms_annotation=["FPGA_ring_nof_nodes_R"], datatype=numpy.uint32, dims=(16,))
     FPGA_ring_nof_nodes_RW = attribute_wrapper(comms_annotation=["FPGA_ring_nof_nodes_RW"], datatype=numpy.uint32, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_ring_use_cable_to_next_rn_R = attribute_wrapper(comms_annotation=["FPGA_ring_use_cable_to_next_rn_R"], datatype=bool, dims=(16,))
-    FPGA_ring_use_cable_to_next_rn_RW = attribute_wrapper(comms_annotation=["FPGA_ring_use_cable_to_next_rn_RW"], datatype=bool, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_ring_use_cable_to_previous_rn_R = attribute_wrapper(comms_annotation=["FPGA_ring_use_cable_to_previous_rn_R"], datatype=bool, dims=(16,))
-    FPGA_ring_use_cable_to_previous_rn_RW = attribute_wrapper(comms_annotation=["FPGA_ring_use_cable_to_previous_rn_RW"], datatype=bool, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_ring_use_cable_to_next_rn_R = attribute_wrapper(comms_annotation=["FPGA_ring_use_cable_to_next_rn_R"], datatype=numpy.bool_, dims=(16,))
+    FPGA_ring_use_cable_to_next_rn_RW = attribute_wrapper(comms_annotation=["FPGA_ring_use_cable_to_next_rn_RW"], datatype=numpy.bool_, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_ring_use_cable_to_previous_rn_R = attribute_wrapper(comms_annotation=["FPGA_ring_use_cable_to_previous_rn_R"], datatype=numpy.bool_, dims=(16,))
+    FPGA_ring_use_cable_to_previous_rn_RW = attribute_wrapper(comms_annotation=["FPGA_ring_use_cable_to_previous_rn_RW"], datatype=numpy.bool_, dims=(16,), access=AttrWriteType.READ_WRITE)
     FPGA_scrap_R = attribute_wrapper(comms_annotation=["FPGA_scrap_R"], datatype=numpy.int32, dims=(8192,))
     FPGA_scrap_RW = attribute_wrapper(comms_annotation=["FPGA_scrap_RW"], datatype=numpy.int32, dims=(8192,), access=AttrWriteType.READ_WRITE)
     FPGA_sdp_info_antenna_band_index_R = attribute_wrapper(comms_annotation=["FPGA_sdp_info_antenna_band_index_R"], datatype=numpy.uint32, dims=(16,))
@@ -147,19 +147,19 @@ class SDP(opcua_device):
     FPGA_temp_R = attribute_wrapper(comms_annotation=["FPGA_temp_R"], datatype=numpy.float_, dims=(16,))
     FPGA_wg_amplitude_R = attribute_wrapper(comms_annotation=["FPGA_wg_amplitude_R"], datatype=numpy.float_, dims=(12, 16))
     FPGA_wg_amplitude_RW = attribute_wrapper(comms_annotation=["FPGA_wg_amplitude_RW"], datatype=numpy.float_, dims=(12, 16), access=AttrWriteType.READ_WRITE)
-    FPGA_wg_enable_R = attribute_wrapper(comms_annotation=["FPGA_wg_enable_R"], datatype=bool, dims=(12, 16))
-    FPGA_wg_enable_RW = attribute_wrapper(comms_annotation=["FPGA_wg_enable_RW"], datatype=bool, dims=(12, 16), access=AttrWriteType.READ_WRITE)
+    FPGA_wg_enable_R = attribute_wrapper(comms_annotation=["FPGA_wg_enable_R"], datatype=numpy.bool_, dims=(12, 16))
+    FPGA_wg_enable_RW = attribute_wrapper(comms_annotation=["FPGA_wg_enable_RW"], datatype=numpy.bool_, dims=(12, 16), access=AttrWriteType.READ_WRITE)
     FPGA_wg_frequency_R = attribute_wrapper(comms_annotation=["FPGA_wg_frequency_R"], datatype=numpy.float_, dims=(12, 16))
     FPGA_wg_frequency_RW = attribute_wrapper(comms_annotation=["FPGA_wg_frequency_RW"], datatype=numpy.float_, dims=(12, 16), access=AttrWriteType.READ_WRITE)
     FPGA_wg_phase_R = attribute_wrapper(comms_annotation=["FPGA_wg_phase_R"], datatype=numpy.float_, dims=(12, 16))
     FPGA_wg_phase_RW = attribute_wrapper(comms_annotation=["FPGA_wg_phase_RW"], datatype=numpy.float_, dims=(12, 16), access=AttrWriteType.READ_WRITE)
-    TR_fpga_mask_R = attribute_wrapper(comms_annotation=["TR_fpga_mask_R"], datatype=bool, dims=(16,))
-    TR_fpga_mask_RW = attribute_wrapper(comms_annotation=["TR_fpga_mask_RW"], datatype=bool, dims=(16,), access=AttrWriteType.READ_WRITE)
-    TR_fpga_communication_error_R = attribute_wrapper(comms_annotation=["TR_fpga_communication_error_R"], datatype=bool, dims=(16,))
+    TR_fpga_mask_R = attribute_wrapper(comms_annotation=["TR_fpga_mask_R"], datatype=numpy.bool_, dims=(16,))
+    TR_fpga_mask_RW = attribute_wrapper(comms_annotation=["TR_fpga_mask_RW"], datatype=numpy.bool_, dims=(16,), access=AttrWriteType.READ_WRITE)
+    TR_fpga_communication_error_R = attribute_wrapper(comms_annotation=["TR_fpga_communication_error_R"], datatype=numpy.bool_, dims=(16,))
     TR_sdp_config_first_fpga_nr_R = attribute_wrapper(comms_annotation=["TR_sdp_config_first_fpga_nr_R"], datatype=numpy.uint32)
     TR_sdp_config_nof_beamsets_R = attribute_wrapper(comms_annotation=["TR_sdp_config_nof_beamsets_R"], datatype=numpy.uint32)
     TR_sdp_config_nof_fpgas_R = attribute_wrapper(comms_annotation=["TR_sdp_config_nof_fpgas_R"], datatype=numpy.uint32)
-    TR_software_version_R = attribute_wrapper(comms_annotation=["TR_software_version_R"], datatype=str)
+    TR_software_version_R = attribute_wrapper(comms_annotation=["TR_software_version_R"], datatype=numpy.str)
     TR_start_time_R = attribute_wrapper(comms_annotation=["TR_start_time_R"], datatype=numpy.int64)
     TR_tod_R = attribute_wrapper(comms_annotation=["TR_tod_R"], datatype=numpy.int64, dims=(2,))
     TR_tod_pps_delta_R = attribute_wrapper(comms_annotation=["TR_tod_pps_delta_R"], datatype=numpy.double)
@@ -187,7 +187,7 @@ class SDP(opcua_device):
     FPGA_bst_offload_bsn_R = attribute_wrapper(comms_annotation=["FPGA_bst_offload_bsn_R"], datatype=numpy.int64, dims=(N_pn, N_beamsets_ctrl))
 
     antenna_type_R = attribute(doc='Type of antenna (LBA or HBA) attached to the FPGAs',
-                               dtype=str, fget=lambda self: self.AntennaType)
+                               dtype=numpy.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=1000, abs_change=1)
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/sst.py b/tangostationcontrol/tangostationcontrol/devices/sdp/sst.py
index b9d818345769098d7f5d42e90e5d2151d85e1d76..2ce9d18a718ec3ee61378299b6a45ce7d1acaf83 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/sst.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/sst.py
@@ -79,17 +79,17 @@ class SST(Statistics):
     # ----------
 
     # FPGA control points for SSTs
-    FPGA_sst_offload_enable_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_enable_RW"], datatype=bool, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_sst_offload_enable_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_enable_R"], datatype=bool, dims=(16,))
-    FPGA_sst_offload_hdr_eth_destination_mac_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_hdr_eth_destination_mac_RW"], datatype=str, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_sst_offload_hdr_eth_destination_mac_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_hdr_eth_destination_mac_R"], datatype=str, dims=(16,))
-    FPGA_sst_offload_hdr_ip_destination_address_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_hdr_ip_destination_address_RW"], datatype=str, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_sst_offload_hdr_ip_destination_address_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_hdr_ip_destination_address_R"], datatype=str, dims=(16,))
+    FPGA_sst_offload_enable_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_enable_RW"], datatype=numpy.bool_, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_sst_offload_enable_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_enable_R"], datatype=numpy.bool_, dims=(16,))
+    FPGA_sst_offload_hdr_eth_destination_mac_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_hdr_eth_destination_mac_RW"], datatype=numpy.str, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_sst_offload_hdr_eth_destination_mac_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_hdr_eth_destination_mac_R"], datatype=numpy.str, dims=(16,))
+    FPGA_sst_offload_hdr_ip_destination_address_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_hdr_ip_destination_address_RW"], datatype=numpy.str, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_sst_offload_hdr_ip_destination_address_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_hdr_ip_destination_address_R"], datatype=numpy.str, dims=(16,))
     FPGA_sst_offload_hdr_udp_destination_port_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_hdr_udp_destination_port_RW"], datatype=numpy.uint16, dims=(16,), access=AttrWriteType.READ_WRITE)
     FPGA_sst_offload_hdr_udp_destination_port_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_hdr_udp_destination_port_R"], datatype=numpy.uint16, dims=(16,))
     FPGA_sst_offload_bsn_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_bsn_R"], datatype=numpy.int64, dims=(16,))
-    FPGA_sst_offload_weighted_subbands_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_weighted_subbands_RW"], datatype=bool, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_sst_offload_weighted_subbands_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_weighted_subbands_R"], datatype=bool, dims=(16,))
+    FPGA_sst_offload_weighted_subbands_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_weighted_subbands_RW"], datatype=numpy.bool_, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_sst_offload_weighted_subbands_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_sst_offload_weighted_subbands_R"], datatype=numpy.bool_, dims=(16,))
 
     FPGA_sst_offload_nof_packets_R = attribute_wrapper(comms_annotation=["FPGA_sst_offload_nof_packets_R"], datatype=numpy.int32, dims=(16,))
     FPGA_sst_offload_nof_valid_R = attribute_wrapper(comms_annotation=["FPGA_sst_offload_nof_valid_R"], datatype=numpy.int32, dims=(16,))
@@ -106,7 +106,7 @@ class SST(Statistics):
     # integration interval for each row in the latest SSTs
     integration_interval_R  = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "statistics", "parameter": "integration_intervals"}, dims=(SSTCollector.MAX_INPUTS,), datatype=numpy.float32)
     # 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=bool)
+    subbands_calibrated_R   = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "statistics", "parameter": "subbands_calibrated"}, dims=(SSTCollector.MAX_INPUTS,), datatype=numpy.bool_)
 
     # ----------
     # Summarising Attributes
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py b/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py
index 92ac1518c3b3f4b7d104f31bde253a2e2005a2b3..338c5506458f0f63bf65fd33dd34f4d3e6c4122e 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/statistics.py
@@ -71,7 +71,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=(128,), datatype=str)
+    replicator_clients_R = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "replicator", "parameter": "clients"}, dims=(128,), datatype=numpy.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/sdp/statistics_collector.py b/tangostationcontrol/tangostationcontrol/devices/sdp/statistics_collector.py
index 5f19d895dfdbff975084578b76f2418d0e6cb0cf..61add915dedde3b5e268f7899bf5c4f343000074 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/statistics_collector.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/statistics_collector.py
@@ -69,7 +69,7 @@ class SSTCollector(StatisticsCollector):
             "sst_values":            numpy.zeros((self.MAX_INPUTS, self.MAX_SUBBANDS), dtype=numpy.uint64),
             "sst_timestamps":        numpy.zeros((self.MAX_INPUTS,), dtype=numpy.float64),
             "integration_intervals": numpy.zeros((self.MAX_INPUTS,), dtype=numpy.float32),
-            "subbands_calibrated":   numpy.zeros((self.MAX_INPUTS,), dtype=bool),
+            "subbands_calibrated":   numpy.zeros((self.MAX_INPUTS,), dtype=numpy.bool_),
         })
 
         return defaults
@@ -147,7 +147,7 @@ class XSTCollector(StatisticsCollector):
             # Last value array we've constructed out of the packets
             "xst_blocks":            numpy.zeros((self.MAX_PARALLEL_SUBBANDS, self.MAX_BLOCKS, self.BLOCK_LENGTH * self.BLOCK_LENGTH * self.VALUES_PER_COMPLEX), dtype=numpy.int64),
             # Whether the values are actually conjugated and transposed
-            "xst_conjugated":        numpy.zeros((self.MAX_PARALLEL_SUBBANDS, self.MAX_BLOCKS,), dtype=bool),
+            "xst_conjugated":        numpy.zeros((self.MAX_PARALLEL_SUBBANDS, self.MAX_BLOCKS,), dtype=numpy.bool_),
             # When the youngest data for each subband was received
             "xst_timestamps":        numpy.zeros((self.MAX_PARALLEL_SUBBANDS,), dtype=numpy.float64),
             "xst_subbands":          numpy.zeros((self.MAX_PARALLEL_SUBBANDS,), dtype=numpy.uint16),
diff --git a/tangostationcontrol/tangostationcontrol/devices/sdp/xst.py b/tangostationcontrol/tangostationcontrol/devices/sdp/xst.py
index 3adf539d5a5fe4de728c4a7273d14dab4f25cb69..443012ced8b29c6a34c4a4c57932554733ba022c 100644
--- a/tangostationcontrol/tangostationcontrol/devices/sdp/xst.py
+++ b/tangostationcontrol/tangostationcontrol/devices/sdp/xst.py
@@ -95,17 +95,17 @@ class XST(Statistics):
     # FPGA control points for XSTs
     FPGA_xst_integration_interval_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_integration_interval_RW"], datatype=numpy.double, dims=(16,), access=AttrWriteType.READ_WRITE)
     FPGA_xst_integration_interval_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_integration_interval_R"], datatype=numpy.double, dims=(16,))
-    FPGA_xst_offload_enable_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_enable_RW"], datatype=bool, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_xst_offload_enable_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_enable_R"], datatype=bool, dims=(16,))
-    FPGA_xst_offload_hdr_eth_destination_mac_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_hdr_eth_destination_mac_RW"], datatype=str, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_xst_offload_hdr_eth_destination_mac_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_hdr_eth_destination_mac_R"], datatype=str, dims=(16,))
-    FPGA_xst_offload_hdr_ip_destination_address_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_hdr_ip_destination_address_RW"], datatype=str, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_xst_offload_hdr_ip_destination_address_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_hdr_ip_destination_address_R"], datatype=str, dims=(16,))
+    FPGA_xst_offload_enable_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_enable_RW"], datatype=numpy.bool_, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_xst_offload_enable_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_enable_R"], datatype=numpy.bool_, dims=(16,))
+    FPGA_xst_offload_hdr_eth_destination_mac_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_hdr_eth_destination_mac_RW"], datatype=numpy.str, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_xst_offload_hdr_eth_destination_mac_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_hdr_eth_destination_mac_R"], datatype=numpy.str, dims=(16,))
+    FPGA_xst_offload_hdr_ip_destination_address_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_hdr_ip_destination_address_RW"], datatype=numpy.str, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_xst_offload_hdr_ip_destination_address_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_hdr_ip_destination_address_R"], datatype=numpy.str, dims=(16,))
     FPGA_xst_offload_hdr_udp_destination_port_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_hdr_udp_destination_port_RW"], datatype=numpy.uint16, dims=(16,), access=AttrWriteType.READ_WRITE)
     FPGA_xst_offload_hdr_udp_destination_port_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_hdr_udp_destination_port_R"], datatype=numpy.uint16, dims=(16,))
     FPGA_xst_offload_bsn_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_offload_bsn_R"], datatype=numpy.int64, dims=(16,))
-    FPGA_xst_processing_enable_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_processing_enable_RW"], datatype=bool, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_xst_processing_enable_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_processing_enable_R"], datatype=bool, dims=(16,))
+    FPGA_xst_processing_enable_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_processing_enable_RW"], datatype=numpy.bool_, dims=(16,), access=AttrWriteType.READ_WRITE)
+    FPGA_xst_processing_enable_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_processing_enable_R"], datatype=numpy.bool_, dims=(16,))
     FPGA_xst_subband_select_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_subband_select_RW"], datatype=numpy.uint32, dims=(8,16), access=AttrWriteType.READ_WRITE)
     FPGA_xst_subband_select_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_subband_select_R"], datatype=numpy.uint32, dims=(8,16))
 
@@ -120,8 +120,8 @@ class XST(Statistics):
     N_pn = 16   # Number of FPGAs per antenna band that is controlled via the SC - SDP interface.
     P_sq = 9
 
-    FPGA_xst_ring_rx_clear_total_counts_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_ring_rx_clear_total_counts_RW"], datatype=bool, dims=(N_pn,), access=AttrWriteType.READ_WRITE)
-    FPGA_xst_ring_rx_clear_total_counts_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_ring_rx_clear_total_counts_R"], datatype=bool, dims=(N_pn,))
+    FPGA_xst_ring_rx_clear_total_counts_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_ring_rx_clear_total_counts_RW"], datatype=numpy.bool_, dims=(N_pn,), access=AttrWriteType.READ_WRITE)
+    FPGA_xst_ring_rx_clear_total_counts_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_ring_rx_clear_total_counts_R"], datatype=numpy.bool_, dims=(N_pn,))
     FPGA_xst_rx_align_stream_enable_RW = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_rx_align_stream_enable_RW"], datatype=numpy.uint32, dims=(N_pn,), access=AttrWriteType.READ_WRITE)
     FPGA_xst_rx_align_stream_enable_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_rx_align_stream_enable_R"], datatype=numpy.uint32, dims=(N_pn,))
     FPGA_xst_ring_rx_total_nof_packets_received_R = attribute_wrapper(comms_id=OPCUAConnection, comms_annotation=["FPGA_xst_ring_rx_total_nof_packets_received_R"], datatype=numpy.uint32, dims=(N_pn,))
@@ -153,7 +153,7 @@ class XST(Statistics):
     # latest XSTs
     xst_blocks_R            = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "statistics", "parameter": "xst_blocks", "reshape": True}, dims=(XSTCollector.MAX_BLOCKS * XSTCollector.BLOCK_LENGTH * XSTCollector.BLOCK_LENGTH * XSTCollector.VALUES_PER_COMPLEX, XSTCollector.MAX_PARALLEL_SUBBANDS), datatype=numpy.int64)
     # whether the values in the block are conjugated and transposed
-    xst_conjugated_R        = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "statistics", "parameter": "xst_conjugated", "reshape": True}, dims=(XSTCollector.MAX_BLOCKS, XSTCollector.MAX_PARALLEL_SUBBANDS), datatype=bool)
+    xst_conjugated_R        = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "statistics", "parameter": "xst_conjugated", "reshape": True}, dims=(XSTCollector.MAX_BLOCKS, XSTCollector.MAX_PARALLEL_SUBBANDS), datatype=numpy.bool_)
     # reported timestamp for each subband in the latest XSTs
     xst_timestamp_R         = attribute_wrapper(comms_id=StatisticsClient, comms_annotation={"type": "statistics", "parameter": "xst_timestamps"}, dims=(XSTCollector.MAX_PARALLEL_SUBBANDS,), datatype=numpy.uint64)
     # which subband the XSTs describe
diff --git a/tangostationcontrol/tangostationcontrol/devices/snmp_device.py b/tangostationcontrol/tangostationcontrol/devices/snmp_device.py
index 18f266b64990ef93f01538b3ab0cdca7aced2cc7..b5bfd8395a75a9831bdaaf47fb17bbfdf947c36a 100644
--- a/tangostationcontrol/tangostationcontrol/devices/snmp_device.py
+++ b/tangostationcontrol/tangostationcontrol/devices/snmp_device.py
@@ -76,7 +76,7 @@ class SNMP(lofar_device):
     # example attributes. mib and name mandatory and index optional.
 
     # Reads from a table and returns an array of table entries 1 to 10 (note, tables require an index key and start at 1)
-    # test_attr1_R = attribute_wrapper(comms_annotation={"mib": "TEST-MIB", "name": "test_attr1", "index": 1}, dims=(10,), datatype=str)
+    # test_attr1_R = attribute_wrapper(comms_annotation={"mib": "TEST-MIB", "name": "test_attr1", "index": 1}, dims=(10,), datatype=numpy.str)
     # indices can also be IP addresses sometimes. Gets a single scalar value
     # test_attr2_R = attribute_wrapper(comms_annotation={"mib": "TEST-MIB", "name": "test_attr2", "index": (127,0,0,1)}, datatype=numpy.int64)
     # if the attribute doesn't get the value from a table, then no index is needed, or the default of 0 can be supplied.
diff --git a/tangostationcontrol/tangostationcontrol/devices/unb2.py b/tangostationcontrol/tangostationcontrol/devices/unb2.py
index cb7096a5d86144c591ae89add89e271f9fa0fa89..1b179da42132e85b9534127b2c73486464913e36 100644
--- a/tangostationcontrol/tangostationcontrol/devices/unb2.py
+++ b/tangostationcontrol/tangostationcontrol/devices/unb2.py
@@ -79,7 +79,7 @@ class UNB2(opcua_device):
     UNB2TR_I2C_bus_PS_error_R    = attribute_wrapper(comms_annotation=["UNB2TR_I2C_bus_PS_error_R" ],datatype=numpy.int64  , dims=(2,))
     UNB2TR_I2C_bus_QSFP_error_R  = attribute_wrapper(comms_annotation=["UNB2TR_I2C_bus_QSFP_error_R"],datatype=numpy.int64  , dims=(24,2))
     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)
+    UNB2TR_translator_busy_R     = attribute_wrapper(comms_annotation=["UNB2TR_translator_busy_R"  ],datatype=numpy.bool_  )
     UNB2_DC_DC_48V_12V_IOUT_R    = attribute_wrapper(comms_annotation=["UNB2_DC_DC_48V_12V_IOUT_R" ],datatype=numpy.float64, dims=(2,))
     UNB2_DC_DC_48V_12V_TEMP_R    = attribute_wrapper(comms_annotation=["UNB2_DC_DC_48V_12V_TEMP_R" ],datatype=numpy.float64, dims=(2,))
     UNB2_DC_DC_48V_12V_VIN_R     = attribute_wrapper(comms_annotation=["UNB2_DC_DC_48V_12V_VIN_R"  ],datatype=numpy.float64, dims=(2,))
@@ -107,10 +107,10 @@ class UNB2(opcua_device):
     UNB2_FPGA_QSFP_CAGE_TEMP_R   = attribute_wrapper(comms_annotation=["UNB2_FPGA_QSFP_CAGE_TEMP_R"],datatype=numpy.float64, dims=(24,2))
     UNB2_Front_Panel_LED_colour_R = attribute_wrapper(comms_annotation=["UNB2_Front_Panel_LED_colour_R"],datatype=numpy.int64  , dims=(2,))
     UNB2_Front_Panel_LED_colour_RW = attribute_wrapper(comms_annotation=["UNB2_Front_Panel_LED_colour_RW"],datatype=numpy.int64  , dims=(2,), access=AttrWriteType.READ_WRITE)
-    UNB2_mask_RW                 = attribute_wrapper(comms_annotation=["UNB2_mask_RW"              ],datatype=bool, dims=(2,), access=AttrWriteType.READ_WRITE)
+    UNB2_mask_RW                 = attribute_wrapper(comms_annotation=["UNB2_mask_RW"              ],datatype=numpy.bool_  , dims=(2,), access=AttrWriteType.READ_WRITE)
     UNB2_PCB_ID_R                = attribute_wrapper(comms_annotation=["UNB2_PCB_ID_R"             ],datatype=numpy.int64  , dims=(2,))
-    UNB2_PCB_number_R            = attribute_wrapper(comms_annotation=["UNB2_PCB_number_R"         ],datatype=str          , dims=(2,))
-    UNB2_PCB_version_R           = attribute_wrapper(comms_annotation=["UNB2_PCB_version_R"        ],datatype=str          , dims=(2,))
+    UNB2_PCB_number_R            = attribute_wrapper(comms_annotation=["UNB2_PCB_number_R"         ],datatype=numpy.str    , dims=(2,))
+    UNB2_PCB_version_R           = attribute_wrapper(comms_annotation=["UNB2_PCB_version_R"        ],datatype=numpy.str    , dims=(2,))
     UNB2_POL_CLOCK_IOUT_R        = attribute_wrapper(comms_annotation=["UNB2_POL_CLOCK_IOUT_R"     ],datatype=numpy.float64, dims=(2,))
     UNB2_POL_CLOCK_TEMP_R        = attribute_wrapper(comms_annotation=["UNB2_POL_CLOCK_TEMP_R"     ],datatype=numpy.float64, dims=(2,))
     UNB2_POL_CLOCK_VOUT_R        = attribute_wrapper(comms_annotation=["UNB2_POL_CLOCK_VOUT_R"     ],datatype=numpy.float64, dims=(2,))
@@ -126,7 +126,7 @@ class UNB2(opcua_device):
     UNB2_POL_SWITCH_PHY_IOUT_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_PHY_IOUT_R"],datatype=numpy.float64, dims=(2,))
     UNB2_POL_SWITCH_PHY_TEMP_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_PHY_TEMP_R"],datatype=numpy.float64, dims=(2,))
     UNB2_POL_SWITCH_PHY_VOUT_R   = attribute_wrapper(comms_annotation=["UNB2_POL_SWITCH_PHY_VOUT_R"],datatype=numpy.float64, dims=(2,))
-    UNB2_PWR_on_R                = attribute_wrapper(comms_annotation=["UNB2_PWR_on_R"             ],datatype=bool, dims=(2,))
+    UNB2_PWR_on_R                = attribute_wrapper(comms_annotation=["UNB2_PWR_on_R"             ],datatype=numpy.bool_  , dims=(2,))
 
     # ----------
     # Summarising Attributes
diff --git a/tangostationcontrol/tangostationcontrol/examples/load_from_disk/ini_client.py b/tangostationcontrol/tangostationcontrol/examples/load_from_disk/ini_client.py
index 17e4690467fadacf585345a93f9ed75b4eda0048..75fb9ae83bd73a85dba1cc0da6fd77aeb1d1d422 100644
--- a/tangostationcontrol/tangostationcontrol/examples/load_from_disk/ini_client.py
+++ b/tangostationcontrol/tangostationcontrol/examples/load_from_disk/ini_client.py
@@ -12,23 +12,23 @@ numpy_to_ini_dict = {
     numpy.int64: int,
     numpy.double: float,
     numpy.float64: float,
-    bool: bool,
-    str: str,
+    numpy.bool_: bool,
+    str: str
 }
 
 numpy_to_ini_get_dict = {
     numpy.int64: configparser.ConfigParser.getint,
     numpy.double: configparser.ConfigParser.getfloat,
     numpy.float64: configparser.ConfigParser.getfloat,
-    bool: configparser.ConfigParser.getboolean,
-    str: str,
+    numpy.bool_: configparser.ConfigParser.getboolean,
+    str: str
 }
 
 ini_to_numpy_dict = {
     int: numpy.int64,
     float: numpy.float64,
-    bool: bool,
-    str: str,
+    bool: numpy.bool_,
+    str: numpy.str
 }
 
 
@@ -160,7 +160,7 @@ class ini_client(CommClient):
 def data_handler(string, dtype):
     value = []
 
-    if dtype is bool:
+    if dtype is numpy.bool_:
         # Handle special case for Bools
         for i in string.split(","):
             i = i.strip(" ")
@@ -173,9 +173,9 @@ def data_handler(string, dtype):
 
         value = dtype(value)
 
-    elif dtype is str:
+    elif dtype is numpy.str:
         for i in string.split(","):
-            val = str(i)
+            val = numpy.str(i)
             value.append(val)
 
         value = numpy.array(value)
diff --git a/tangostationcontrol/tangostationcontrol/examples/load_from_disk/ini_device.py b/tangostationcontrol/tangostationcontrol/examples/load_from_disk/ini_device.py
index b49997f685d941e1a10c88bd2025f76396d693d4..430addb9be61ae29ead58a17b8c4096d18d3bcea 100644
--- a/tangostationcontrol/tangostationcontrol/examples/load_from_disk/ini_device.py
+++ b/tangostationcontrol/tangostationcontrol/examples/load_from_disk/ini_device.py
@@ -71,30 +71,30 @@ class ini_device(lofar_device):
     """
     double_scalar_RW = attribute_wrapper(comms_annotation={"section": "scalar", "name": "double_scalar_RW"}, datatype=numpy.double, access=AttrWriteType.READ_WRITE)
     double_scalar_R = attribute_wrapper(comms_annotation={"section": "scalar", "name": "double_scalar_R"}, datatype=numpy.double)
-    bool_scalar_RW = attribute_wrapper(comms_annotation={"section": "scalar", "name": "bool_scalar_RW"}, datatype=bool, access=AttrWriteType.READ_WRITE)
-    bool_scalar_R = attribute_wrapper(comms_annotation={"section": "scalar", "name": "bool_scalar_R"}, datatype=bool)
+    bool_scalar_RW = attribute_wrapper(comms_annotation={"section": "scalar", "name": "bool_scalar_RW"}, datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    bool_scalar_R = attribute_wrapper(comms_annotation={"section": "scalar", "name": "bool_scalar_R"}, datatype=numpy.bool_)
     int_scalar_RW = attribute_wrapper(comms_annotation={"section": "scalar", "name": "int_scalar_RW"}, datatype=numpy.int64, access=AttrWriteType.READ_WRITE)
     int_scalar_R = attribute_wrapper(comms_annotation={"section": "scalar", "name": "int_scalar_R"}, datatype=numpy.int64)
-    str_scalar_RW = attribute_wrapper(comms_annotation={"section": "scalar", "name": "str_scalar_RW"}, datatype=str, access=AttrWriteType.READ_WRITE)
-    str_scalar_R = attribute_wrapper(comms_annotation={"section": "scalar", "name": "str_scalar_R"}, datatype=str)
+    str_scalar_RW = attribute_wrapper(comms_annotation={"section": "scalar", "name": "str_scalar_RW"}, datatype=numpy.str, access=AttrWriteType.READ_WRITE)
+    str_scalar_R = attribute_wrapper(comms_annotation={"section": "scalar", "name": "str_scalar_R"}, datatype=numpy.str)
 
     double_spectrum_RW = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "double_spectrum_RW"}, datatype=numpy.double, dims=(4,), access=AttrWriteType.READ_WRITE)
     double_spectrum_R = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "double_spectrum_R"}, datatype=numpy.double, dims=(4,))
-    bool_spectrum_RW = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "bool_spectrum_RW"}, datatype=bool, dims=(4,), access=AttrWriteType.READ_WRITE)
-    bool_spectrum_R = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "bool_spectrum_R"}, datatype=bool, dims=(4,))
+    bool_spectrum_RW = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "bool_spectrum_RW"}, datatype=numpy.bool_, dims=(4,), access=AttrWriteType.READ_WRITE)
+    bool_spectrum_R = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "bool_spectrum_R"}, datatype=numpy.bool_, dims=(4,))
     int_spectrum_RW = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "int_spectrum_RW"}, datatype=numpy.int64, dims=(4,), access=AttrWriteType.READ_WRITE)
     int_spectrum_R = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "int_spectrum_R"}, datatype=numpy.int64, dims=(4,))
-    str_spectrum_RW = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "str_spectrum_RW"}, datatype=str, dims=(4,), access=AttrWriteType.READ_WRITE)
-    str_spectrum_R = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "str_spectrum_R"}, datatype=str, dims=(4,))
+    str_spectrum_RW = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "str_spectrum_RW"}, datatype=numpy.str, dims=(4,), access=AttrWriteType.READ_WRITE)
+    str_spectrum_R = attribute_wrapper(comms_annotation={"section": "spectrum", "name": "str_spectrum_R"}, datatype=numpy.str, dims=(4,))
 
     double_image_RW = attribute_wrapper(comms_annotation={"section": "image", "name": "double_image_RW"}, datatype=numpy.double, dims=(3, 2), access=AttrWriteType.READ_WRITE)
     double_image_R = attribute_wrapper(comms_annotation={"section": "image", "name": "double_image_R"}, datatype=numpy.double, dims=(3, 2))
-    bool_image_RW = attribute_wrapper(comms_annotation={"section": "image", "name": "bool_image_RW"}, datatype=bool, dims=(3, 2), access=AttrWriteType.READ_WRITE)
-    bool_image_R = attribute_wrapper(comms_annotation={"section": "image", "name": "bool_image_R"}, datatype=bool, dims=(3, 2))
+    bool_image_RW = attribute_wrapper(comms_annotation={"section": "image", "name": "bool_image_RW"}, datatype=numpy.bool_, dims=(3, 2), access=AttrWriteType.READ_WRITE)
+    bool_image_R = attribute_wrapper(comms_annotation={"section": "image", "name": "bool_image_R"}, datatype=numpy.bool_, dims=(3, 2))
     int_image_RW = attribute_wrapper(comms_annotation={"section": "image", "name": "int_image_RW"}, datatype=numpy.int64, dims=(3, 2), access=AttrWriteType.READ_WRITE)
     int_image_R = attribute_wrapper(comms_annotation={"section": "image", "name": "int_image_R"}, datatype=numpy.int64, dims=(3, 2))
-    str_image_RW = attribute_wrapper(comms_annotation={"section": "image", "name": "str_image_RW"}, datatype=str, dims=(3, 2), access=AttrWriteType.READ_WRITE)
-    str_image_R = attribute_wrapper(comms_annotation={"section": "image", "name": "str_image_R"}, datatype=str, dims=(3, 2))
+    str_image_RW = attribute_wrapper(comms_annotation={"section": "image", "name": "str_image_RW"}, datatype=numpy.str, dims=(3, 2), access=AttrWriteType.READ_WRITE)
+    str_image_R = attribute_wrapper(comms_annotation={"section": "image", "name": "str_image_R"}, datatype=numpy.str, dims=(3, 2))
 
     # --------
     # overloaded functions
diff --git a/tangostationcontrol/tangostationcontrol/test/clients/test_attr_wrapper.py b/tangostationcontrol/tangostationcontrol/test/clients/test_attr_wrapper.py
index 31a9873586f056a522d0e907dd78542854248532..13702c87caaac779f94c292e8dbe41ddf0e6e1bd 100644
--- a/tangostationcontrol/tangostationcontrol/test/clients/test_attr_wrapper.py
+++ b/tangostationcontrol/tangostationcontrol/test/clients/test_attr_wrapper.py
@@ -48,15 +48,15 @@ class TestAttributeTypes(base.TestCase):
         self.addCleanup(self.deviceproxy_patch.stop)
 
     class str_scalar_device(lofar_device):
-        scalar_R = attribute_wrapper(comms_annotation="str_scalar_R", datatype=str)
-        scalar_RW = attribute_wrapper(comms_annotation="str_scalar_RW", datatype=str, access=AttrWriteType.READ_WRITE)
+        scalar_R = attribute_wrapper(comms_annotation="str_scalar_R", datatype=numpy.str)
+        scalar_RW = attribute_wrapper(comms_annotation="str_scalar_RW", datatype=numpy.str, access=AttrWriteType.READ_WRITE)
 
         def configure_for_initialise(self):
             dev_init(self)
 
     class bool_scalar_device(lofar_device):
-        scalar_R = attribute_wrapper(comms_annotation="bool_scalar_R", datatype=bool)
-        scalar_RW = attribute_wrapper(comms_annotation="bool_scalar_RW", datatype=bool, access=AttrWriteType.READ_WRITE)
+        scalar_R = attribute_wrapper(comms_annotation="bool_scalar_R", datatype=numpy.bool_)
+        scalar_RW = attribute_wrapper(comms_annotation="bool_scalar_RW", datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
 
         def configure_for_initialise(self):
             dev_init(self)
@@ -132,15 +132,15 @@ class TestAttributeTypes(base.TestCase):
             dev_init(self)
 
     class str_spectrum_device(lofar_device):
-        spectrum_R = attribute_wrapper(comms_annotation="str_spectrum_R", datatype=str, dims=spectrum_dims)
-        spectrum_RW = attribute_wrapper(comms_annotation="str_spectrum_RW", datatype=str, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
+        spectrum_R = attribute_wrapper(comms_annotation="str_spectrum_R", datatype=numpy.str, dims=spectrum_dims)
+        spectrum_RW = attribute_wrapper(comms_annotation="str_spectrum_RW", datatype=numpy.str, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
 
         def configure_for_initialise(self):
             dev_init(self)
 
     class bool_spectrum_device(lofar_device):
-        spectrum_R = attribute_wrapper(comms_annotation="bool_spectrum_R", datatype=bool, dims=spectrum_dims)
-        spectrum_RW = attribute_wrapper(comms_annotation="bool_spectrum_RW", datatype=bool, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
+        spectrum_R = attribute_wrapper(comms_annotation="bool_spectrum_R", datatype=numpy.bool_, dims=spectrum_dims)
+        spectrum_RW = attribute_wrapper(comms_annotation="bool_spectrum_RW", datatype=numpy.bool_, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
 
         def configure_for_initialise(self):
             dev_init(self)
@@ -216,15 +216,15 @@ class TestAttributeTypes(base.TestCase):
             dev_init(self)
 
     class str_image_device(lofar_device):
-        image_R = attribute_wrapper(comms_annotation="str_image_R", datatype=str, dims=(2,3))
-        image_RW = attribute_wrapper(comms_annotation="str_image_RW", datatype=str, access=AttrWriteType.READ_WRITE, dims=(2,3))
+        image_R = attribute_wrapper(comms_annotation="str_image_R", datatype=numpy.str, dims=(2,3))
+        image_RW = attribute_wrapper(comms_annotation="str_image_RW", datatype=numpy.str, access=AttrWriteType.READ_WRITE, dims=(2,3))
 
         def configure_for_initialise(self):
             dev_init(self)
 
     class bool_image_device(lofar_device):
-        image_R = attribute_wrapper(comms_annotation="bool_image_R", datatype=bool, dims=(2,3))
-        image_RW = attribute_wrapper(comms_annotation="bool_image_RW", datatype=bool, access=AttrWriteType.READ_WRITE, dims=(2,3))
+        image_R = attribute_wrapper(comms_annotation="bool_image_R", datatype=numpy.bool_, dims=(2,3))
+        image_RW = attribute_wrapper(comms_annotation="bool_image_RW", datatype=numpy.bool_, access=AttrWriteType.READ_WRITE, dims=(2,3))
 
         def configure_for_initialise(self):
             dev_init(self)
@@ -343,20 +343,20 @@ class TestAttributeTypes(base.TestCase):
 
             if test_type == "scalar":
 
-                if dtype is str:
+                if dtype is numpy.str:
                     val = str_scalar_val
                 else:
                     val = dtype(1)
                 proxy.scalar_RW = val
             elif test_type == "spectrum":
-                if dtype is str:
+                if dtype is numpy.str:
                     val = str_spectrum_val
                 else:
                     val = numpy.full(spectrum_dims, dtype=dtype, fill_value=1)
                 print(val)
                 proxy.spectrum_RW = val
             elif test_type == "image":
-                if dtype is str:
+                if dtype is numpy.str:
                     val = str_image_val
                 else:
                     val = numpy.full(image_dims, dtype=dtype, fill_value=1)
@@ -413,7 +413,7 @@ class TestAttributeTypes(base.TestCase):
 
     def _get_result_type(self, dtype, test_type, proxy):
         if test_type == "scalar":
-            if dtype is str:
+            if dtype is numpy.str:
                 val = str_scalar_val
             else:
                 val = dtype(1)
@@ -421,7 +421,7 @@ class TestAttributeTypes(base.TestCase):
             result_R = proxy.scalar_R
             result_RW = proxy.scalar_RW
         elif test_type == "spectrum":
-            if dtype is str:
+            if dtype is numpy.str:
                 val = str_spectrum_val
             else:
                 val = numpy.full(spectrum_dims, dtype=dtype, fill_value=1)
@@ -429,7 +429,7 @@ class TestAttributeTypes(base.TestCase):
             result_R = proxy.spectrum_R
             result_RW = proxy.spectrum_RW
         elif test_type == "image":
-            if dtype is str:
+            if dtype is numpy.str:
                 val = str_image_val
             else:
                 val = numpy.full(image_dims, dtype=dtype, fill_value=1)
@@ -439,7 +439,7 @@ class TestAttributeTypes(base.TestCase):
             result_R = proxy.image_R
             result_RW = proxy.image_RW
 
-            if dtype != str:
+            if dtype != numpy.str:
                 self.assertEqual(result_R.shape, image_dims, "not the correct dimensions")
 
                 result_R = result_R.reshape(-1)
@@ -470,7 +470,7 @@ class TestAttributeTypes(base.TestCase):
                     self.assertTrue(comparison, " Value could not be handled by the atrribute_wrappers internal RW storer. attempted to write: {}".format(val))
                     comparison = result_R == val
                     self.assertTrue(comparison, " value in the clients R attribute not equal to what was written. read: {}, wrote {}".format(result_R, val))
-                elif dtype != str:
+                elif dtype != numpy.str:
                     comparison = result_RW == val
                     equal_arrays = comparison.all()
                     self.assertTrue(equal_arrays, " Value could not be handled by the atrribute_wrappers internal RW storer. attempted to write: {}".format(val))
@@ -503,7 +503,7 @@ class TestAttributeTypes(base.TestCase):
             'spectrum': str_spectrum_device, "image": str_image_device
         },
         {
-            'type': bool, 'scalar': bool_scalar_device,
+            'type': numpy.bool_, 'scalar': bool_scalar_device,
             'spectrum': bool_spectrum_device, "image":  bool_image_device
         },
         {
diff --git a/tangostationcontrol/tangostationcontrol/test/clients/test_opcua_client.py b/tangostationcontrol/tangostationcontrol/test/clients/test_opcua_client.py
index 2c253cd5b5d8f4834b7e9536841fd34f9e7dc5d2..4582c608888b2dbb2d0b26b5abd3f1a683c76c6c 100644
--- a/tangostationcontrol/tangostationcontrol/test/clients/test_opcua_client.py
+++ b/tangostationcontrol/tangostationcontrol/test/clients/test_opcua_client.py
@@ -18,8 +18,8 @@ class attr_props:
 
 
 attr_test_types = [
-    attr_props(numpy_type=bool),
     attr_props(numpy_type=str),
+    attr_props(numpy_type=numpy.bool_),
     attr_props(numpy_type=numpy.float32),
     attr_props(numpy_type=numpy.float64),
     attr_props(numpy_type=numpy.double),
@@ -210,9 +210,9 @@ class TestOPCua(base.AsyncTestCase):
     def test_type_map(self):
         for numpy_type, opcua_type in opcua_client.numpy_to_OPCua_dict.items():
             # derive a default value that can get lost in a type translation
-            if numpy_type is str:
+            if numpy_type in [str, numpy.str]:
               default_value = "foo"
-            elif numpy_type == bool:
+            elif numpy_type == numpy.bool_:
               default_value = True
             else:
               # integer or float type
@@ -237,7 +237,7 @@ class TestOPCua(base.AsyncTestCase):
             self.assertEqual(v.Value, reparsed_v.Value, msg=f"Conversion {numpy_type} -> {opcua_type} failed.")
 
             # does the OPC-UA type have the same datasize (and thus, precision?)
-            if numpy_type is not str:
+            if numpy_type not in [str, numpy.str]:
                 self.assertEqual(numpy_type().itemsize, getattr(asyncua.ua.ua_binary.Primitives, opcua_type.name).size, msg=f"Conversion {numpy_type} -> {opcua_type} failed: precision mismatch")