diff --git a/ohmpi/hardware_components/abstract_hardware_components.py b/ohmpi/hardware_components/abstract_hardware_components.py
index 149322c6f0ee4ee7ae14a05ecf4d67bcb01ca9d6..146cdfc8e5fff227eb4ab7a64b907c03cb9b7465 100644
--- a/ohmpi/hardware_components/abstract_hardware_components.py
+++ b/ohmpi/hardware_components/abstract_hardware_components.py
@@ -280,6 +280,7 @@ class TxAbstract(ABC):
             self.soh_logger = create_stdout_logger('soh_tx')
         self.connection = kwargs.pop('connection', None)
         self.pwr = kwargs.pop('pwr', None)
+        self._voltage = 0.
         self._polarity = 0
         self._injection_duration = None
         self._gain = 1.
@@ -383,6 +384,18 @@ class TxAbstract(ABC):
     def tx_bat(self):
         pass
 
+    @property
+    def voltage(self):
+        """ Gets the voltage VAB in Volts
+        """
+        return self._voltage
+
+    @voltage.setter
+    def voltage(self, value):
+        assert value >= 0.
+        self._voltage = value
+        self.pwr.voltage = value
+
     def voltage_pulse(self, voltage=0., length=None, polarity=1):
         """ Generates a square voltage pulse
 
diff --git a/ohmpi/hardware_components/mb_2023_0_X.py b/ohmpi/hardware_components/mb_2023_0_X.py
index 80fb8617e1d0025fae6b0928277615f87de5f1d2..f9ae9368f2ec997d3fdf598b97a4644993e061de 100644
--- a/ohmpi/hardware_components/mb_2023_0_X.py
+++ b/ohmpi/hardware_components/mb_2023_0_X.py
@@ -78,7 +78,7 @@ class Tx(TxAbstract):
             self.exec_logger.event(f'{self.model}\ttx_init\tbegin\t{datetime.datetime.utcnow()}')
         assert isinstance(self.connection, I2C)
         kwargs.update({'pwr': kwargs.pop('pwr', SPECS['tx']['compatible_power_sources']['default'][0])})
-        if (kwargs['pwr'] not in SPECS['tx']['compatible_power_sources']['default']):
+        if kwargs['pwr'] not in SPECS['tx']['compatible_power_sources']['default']:
             self.exec_logger.warning(f'Incompatible power source specified check config')
             assert kwargs['pwr'] in SPECS['tx']
         self._activation_delay = kwargs['activation_delay']
@@ -139,7 +139,7 @@ class Tx(TxAbstract):
         """ Gets the current IAB in Amps
         """
         iab = AnalogIn(self._ads_current, ads.P0).voltage * 1000. / (50 * self._r_shunt)  # measure current
-        self.exec_logger.debug(f'Reading TX current:  {iab} mA')
+        self.exec_logger.debug(f'Reading TX current: {iab} mA')
         return iab
 
     @ current.setter
@@ -190,18 +190,6 @@ class Tx(TxAbstract):
         else:
             return self.pwr.battery_voltage
 
-    @property
-    def voltage(self):
-        """ Gets the voltage VAB in Volts
-        """
-        vab = self.current * self._r_shunt
-        self.exec_logger.debug(f'Reading TX current:  {vab} mv')
-        return vab
-
-    @voltage.setter
-    def voltage(self, value):
-        self.pwr.voltage = value
-
     def voltage_pulse(self, voltage=None, length=None, polarity=1):
         """ Generates a square voltage pulse
 
diff --git a/ohmpi/hardware_components/pwr_dps5005.py b/ohmpi/hardware_components/pwr_dps5005.py
index 009bca71bde2d62f6d7fd6f6e1307aa76dc88d3f..f018ab7a3335e49d38e50d7bc09300640ade18aa 100644
--- a/ohmpi/hardware_components/pwr_dps5005.py
+++ b/ohmpi/hardware_components/pwr_dps5005.py
@@ -54,15 +54,6 @@ class Pwr(PwrAbstract):
     def current(self, value, **kwargs):
         self.exec_logger.debug(f'Current cannot be set on {self.model}')
 
-    # def turn_off(self):
-    #     self.connection.write_register(0x09, 0)
-    #     self.exec_logger.debug(f'{self.model} is off')
-    #
-    # def turn_on(self):
-    #     self.connection.write_register(0x09, 1)
-    #     self.exec_logger.debug(f'{self.model} is on')
-    #     time.sleep(.3)
-
     def _retrieve_voltage(self):
         self._voltage = self.connection.read_register(0x0002, 2)
 
diff --git a/ohmpi/hardware_system.py b/ohmpi/hardware_system.py
index 3e8d6d3d2c5e8916ab69b9705401652a7e32319f..d789576de562d113d362eb01d45620b88cf10c42 100644
--- a/ohmpi/hardware_system.py
+++ b/ohmpi/hardware_system.py
@@ -265,8 +265,7 @@ class OhmPiHardware:
 
         while self.tx_sync.is_set():
             lap = datetime.datetime.utcnow()
-            r = [elapsed_seconds(self._start_time), self._pulse, self.tx.polarity, self.tx.current, self.rx.voltage,
-                 self.tx.voltage]
+            r = [elapsed_seconds(self._start_time), self._pulse, self.tx.polarity, self.tx.current, self.rx.voltage]
             if self.tx_sync.is_set():
                 sample += 1
                 _readings.append(r)
@@ -318,94 +317,8 @@ class OhmPiHardware:
             sp = np.mean(mean_vmn[np.ix_(polarity == 1)] + mean_vmn[np.ix_(polarity == -1)]) / 2
             return sp
 
-    # def _compute_tx_volt(self, pulse_duration=0.1, strategy='vmax', tx_volt=5.,
-    #                      vab_max=voltage_max, vmn_min=voltage_min):
-    #     """Estimates best Tx voltage based on different strategies.
-    #     At first a half-cycle is made for a short duration with a fixed
-    #     known voltage. This gives us Iab and Rab. We also measure Vmn.
-    #     A constant c = vmn/iab is computed (only depends on geometric
-    #     factor and ground resistivity, that doesn't change during a
-    #     quadrupole). Then depending on the strategy, we compute which
-    #     vab to inject to reach the minimum/maximum Iab current or
-    #     min/max Vmn.
-    #     This function also compute the polarity on Vmn (on which pin
-    #     of the ADS1115 we need to measure Vmn to get the positive value).
-    #
-    #     Parameters
-    #     ----------
-    #     pulse_duration : float, optional
-    #         Time in seconds for the pulse used to compute Rab.
-    #     strategy : str, optional
-    #         Either:
-    #         - vmax : compute Vab to reach a maximum Iab without exceeding vab_max
-    #         - vmin : compute Vab to reach at least vmn_min
-    #         - constant : apply given Vab
-    #     tx_volt : float, optional
-    #         Voltage to apply for guessing the best voltage. 5 V applied
-    #         by default. If strategy "constant" is chosen, constant voltage
-    #         to applied is "tx_volt".
-    #     vab_max : float, optional
-    #         Maximum injection voltage to apply to tx (used by all strategies)
-    #     vmn_min : float, optional
-    #         Minimum voltage target for rx (used by vmin strategy)
-    #
-    #     Returns
-    #     -------
-    #     vab : float
-    #         Proposed Vab according to the given strategy.
-    #     polarity:
-    #         Polarity of VMN relative to polarity of VAB
-    #     rab : float
-    #         Resistance between injection electrodes
-    #     """
-    #
-    #     vab_max = np.abs(vab_max)
-    #     vmn_min = np.abs(vmn_min)
-    #     vab = np.min([np.abs(tx_volt), vab_max])
-    #     # self.tx.turn_on()
-    #     switch_pwr_off, switch_tx_pwr_off = False, False #TODO: check if these should be moved in kwargs
-    #     if self.tx.pwr_state == 'off':
-    #         self.tx.pwr_state = 'on'
-    #         switch_tx_pwr_off = True
-    #     if self.tx.pwr.pwr_state == 'off':
-    #         self.tx.pwr.pwr_state = 'on'
-    #         switch_pwr_off = True
-    #     if 1. / self.rx.sampling_rate > pulse_duration:
-    #         sampling_rate = 1. / pulse_duration  # TODO: check this...
-    #     else:
-    #         sampling_rate = self.tx.sampling_rate
-    #     self._vab_pulse(vab=vab, duration=pulse_duration, sampling_rate=sampling_rate)  # TODO: use a square wave pulse?
-    #     vmn = np.mean(self.readings[:, 4])
-    #     iab = np.mean(self.readings[:, 3])
-    #     # if np.abs(vmn) is too small (smaller than voltage_min), strategy is not constant and vab < vab_max ,
-    #     # then we could call _compute_tx_volt with a tx_volt increased to np.min([vab_max, tx_volt*2.]) for example
-    #     if strategy == 'vmax':
-    #         # implement different strategies
-    #         if vab < vab_max and iab < current_max:
-    #             vab = vab * np.min([0.9 * vab_max / vab, 0.9 * current_max / iab])  # TODO: check if setting at 90% of max as a safety margin is OK
-    #         self.tx.exec_logger.debug(f'vmax strategy: setting VAB to {vab} V.')
-    #     elif strategy == 'vmin':
-    #         if vab <= vab_max and iab < current_max:
-    #             vab = vab * np.min([0.9 * vab_max / vab, vmn_min / np.abs(vmn), 0.9 * current_max / iab])  # TODO: check if setting at 90% of max as a safety margin is OK
-    #     elif strategy != 'constant':
-    #         self.tx.exec_logger.warning(f'Unknown strategy {strategy} for setting VAB! Using {vab} V')
-    #     else:
-    #         self.tx.exec_logger.debug(f'Constant strategy for setting VAB, using {vab} V')
-    #     # self.tx.turn_off()
-    #     if switch_pwr_off:
-    #         self.tx.pwr.pwr_state = 'off'
-    #     if switch_tx_pwr_off:
-    #         self.tx.pwr_state = 'off'
-    #     rab = (np.abs(vab) * 1000.) / iab
-    #     self.exec_logger.debug(f'RAB = {rab:.2f} Ohms')
-    #     if vmn < 0:
-    #         polarity = -1  # TODO: check if we really need to return polarity
-    #     else:
-    #         polarity = 1
-    #     return vab, polarity, rab
-
     def _compute_tx_volt(self, pulse_duration=0.1, strategy='vmax', tx_volt=5., vab_max=voltage_max,
-                         iab_max=current_max, vmn_max = 5., vmn_min=voltage_min, polarities=(1, -1), delay=0.050):
+                         iab_max=current_max, vmn_max=5., vmn_min=voltage_min, polarities=(1, -1), delay=0.050):
         # TODO: Optimise how to pass iab_max, vab_max, vmn_min
         """Estimates best Tx voltage based on different strategies.
         At first a half-cycle is made for a short duration with a fixed