diff --git a/configs/config_mb_2023_4_mux_2024.py b/configs/config_mb_2023_4_mux_2024.py
index 57aab864e27b487e7b30b6b2439686256598c439..afcdfa1e5d17160e4e06cf3210ae1197bb06a622 100644
--- a/configs/config_mb_2023_4_mux_2024.py
+++ b/configs/config_mb_2023_4_mux_2024.py
@@ -35,7 +35,7 @@ HARDWARE_CONFIG = {
             # overwritten by board properties defined at the board level within the board model file
             # both will be overwritten by properties specified in the board dict below. Use with caution...
             {'boards':
-                    {'mux_1':
+                    {'mux_02':
                          {'model': 'mux_2024_rev_0_0',  # 'ohmpi_i2c_mux64_v1.01',
                           'tca_address': 0x77,
                           'tca_channel': 0,
@@ -44,7 +44,7 @@ HARDWARE_CONFIG = {
                           'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                           'cabling': {(i, j): ('mux_1', i) for j in ['A', 'B', 'M', 'N'] for i in range(1, 9)},
                           'voltage_max': 12.},
-                     'mux_2':
+                     'mux_05':
                          {'model': 'mux_2024_rev_0_0',  # 'ohmpi_i2c_mux64_v1.01',
                           'tca_address': 0x77,
                           'tca_channel': 0,
@@ -53,7 +53,7 @@ HARDWARE_CONFIG = {
                           'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                           'cabling': {(i, j): ('mux_2', i) for j in ['A', 'B', 'M', 'N'] for i in range(9, 17)},
                           'voltage_max': 12.},
-                     'mux_3':
+                     'mux_04':
                          {'model': 'mux_2024_rev_0_0',  # 'ohmpi_i2c_mux64_v1.01',
                           'tca_address': 0x77,
                           'tca_channel': 0,
@@ -62,7 +62,7 @@ HARDWARE_CONFIG = {
                           'roles': {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                           'cabling': {(i, j): ('mux_2', i) for j in ['A', 'B', 'M', 'N'] for i in range(17, 25)},
                           'voltage_max': 12.},
-                     'mux_4':
+                     'mux_06':
                          {'model': 'mux_2024_rev_0_0',  # 'ohmpi_i2c_mux64_v1.01',
                           'tca_address': 0x77,
                           'tca_channel': 0,
diff --git a/configs/config_mb_2023_mux_2024.py b/configs/config_mb_2023_mux_2024.py
index 186729ad4e9221c6f0178b8526c2ea609433e192..5efb43ad5f0468f2d5a4b4d89af0dd0e2953e3be 100644
--- a/configs/config_mb_2023_mux_2024.py
+++ b/configs/config_mb_2023_mux_2024.py
@@ -44,7 +44,8 @@ HARDWARE_CONFIG = {
                       'mcp_1' : '0x23',  # TODO : Replace this with pos of jumper on MUX board (address doesn't mean anything for the average user...)
                       'roles' : {'A': 'X', 'B': 'Y', 'M': 'XX', 'N': 'YY'},
                       'voltage_max': 12.
-                }},
+                    }
+                },
             'default': {'voltage_max': 100., 'current_max': 3.}}
 }
 
diff --git a/dev/test_4_mux_2024.py b/dev/test_4_mux_2024.py
new file mode 100644
index 0000000000000000000000000000000000000000..eb433f2cdba407b9b625ffe435bc0d838e580914
--- /dev/null
+++ b/dev/test_4_mux_2024.py
@@ -0,0 +1,60 @@
+import time
+from ohmpi.utils import change_config
+from ohmpi.plots import plot_exec_log
+import logging
+change_config('../configs/config_mb_2023_4_mux_2024.py', verbose=False)
+from ohmpi.hardware_components.mux_2024_rev_0_0 import Mux, MUX_CONFIG
+from ohmpi.hardware_components import raspberry_pi_i2c as ctl_module
+# from ohmpi.config import HARDWARE_CONFIG
+
+stand_alone_mux = True
+part_of_hardware_system = False
+within_ohmpi = False
+# Stand alone mux
+if stand_alone_mux:
+    MUX_CONFIG['ctl'] = ctl_module.Ctl()
+    MUX_CONFIG['id'] = 'mux_02'
+    MUX_CONFIG['cabling'] = {(i, j): ('mux_1', i) for j in ['A', 'B', 'M', 'N'] for i in range(1,9)}
+    mux = Mux(**MUX_CONFIG)
+    mux.switch_one(elec=1, role='M', state='on')
+    time.sleep(2)
+    mux.switch_one(elec=1, role='M', state='off')
+    mux.switch({'A': [1], 'B': [2], 'M': [3], 'N': [4]}, state='on')
+    time.sleep(8)
+    # mux.switch({'A': [1], 'B': [4], 'M': [2], 'N': [3]}, state='off')
+    mux.reset()
+    mux.test({'A': [i for i in range(1, 9)], 'B': [i for i in range(1, 9)],
+              'M': [i for i in range(1, 9)], 'N': [i for i in range(1, 9)]}, activation_time=.1)
+
+# mux as part of a OhmPiHardware system
+if part_of_hardware_system:
+    from ohmpi.hardware_system import OhmPiHardware
+    print('Starting test of mux as part of a OhmPiHardware system.')
+
+    k = OhmPiHardware()
+    k.exec_logger.setLevel(logging.DEBUG)
+
+    # Test mux switching
+    k.reset_mux()
+    k.switch_mux(electrodes=[1, 4, 2, 3], roles=['A', 'B', 'M', 'N'], state='on')
+    time.sleep(1.)
+    k.switch_mux(electrodes=[1, 4, 2, 3], roles=['A', 'B', 'M', 'N'], state='off')
+
+if within_ohmpi:
+    from ohmpi.ohmpi import OhmPi
+    print('Starting test of mux within OhmPi.')
+    k = OhmPi()
+    k.reset_mux()
+    k._hw.switch_mux([1, 4, 2, 3], state='on')
+    k._hw.vab_square_wave(3.,1)
+    k._hw.switch_mux([1, 4, 2, 3], state='off')
+    k._hw.calibrate_rx_bias()  # electrodes 1 4 2 3 should be connected to a reference circuit
+    # print(f'Resistance: {k._hw.last_rho :.2f} ohm, dev. {k._hw.last_dev:.2f} %, rx bias: {k._hw.rx._bias:.2f} mV')
+    # k._hw._plot_readings()
+    k._hw.switch_mux([1, 4, 2, 3], state='on')
+    k._hw.vab_square_wave(3.,1)
+    k._hw.switch_mux([1, 4, 2, 3], state='off')
+    print(f'Resistance: {k._hw.last_rho :.2f} ohm, dev. {k._hw.last_dev:.2f} %, rx bias: {k._hw.rx._bias:.2f} mV')
+    k._hw._plot_readings()
+    plot_exec_log('ohmpi/logs/exec.log')
+change_config('../configs/config_default.py', verbose=False)
\ No newline at end of file
diff --git a/ohmpi/hardware_components/mb_2024_rev_0_0.py b/ohmpi/hardware_components/mb_2024_rev_0_0.py
index 241777f90927e8390814670538a55c64c870f6c1..3b2f9778323108ea9fb972601843d1403544aa9a 100644
--- a/ohmpi/hardware_components/mb_2024_rev_0_0.py
+++ b/ohmpi/hardware_components/mb_2024_rev_0_0.py
@@ -41,6 +41,7 @@ TX_CONFIG['default_voltage'] = np.min([TX_CONFIG.pop('default_voltage', dps_defa
 TX_CONFIG['dps_switch_on_warm_up'] = TX_CONFIG.pop('dps_switch_on_warmup', dps_switch_on_warmup)
 TX_CONFIG['low_battery'] = TX_CONFIG.pop('low_battery', tx_low_battery)
 
+
 def _gain_auto(channel):
     """Automatically sets the gain on a channel
 
diff --git a/ohmpi/hardware_components/mux_2024_rev_0_0.py b/ohmpi/hardware_components/mux_2024_rev_0_0.py
index 4a20dffde829608787b315fc714cd21d784a9b3a..68f08c942ab9693feedcd23090524d761a2bde27 100644
--- a/ohmpi/hardware_components/mux_2024_rev_0_0.py
+++ b/ohmpi/hardware_components/mux_2024_rev_0_0.py
@@ -1,5 +1,3 @@
-import time
-
 from ohmpi.config import HARDWARE_CONFIG
 import os
 import numpy as np
@@ -7,6 +5,7 @@ from ohmpi.hardware_components import MuxAbstract
 import adafruit_tca9548a  # noqa
 from adafruit_mcp230xx.mcp23017 import MCP23017  # noqa
 from digitalio import Direction  # noqa
+# import time
 
 MUX_CONFIG = HARDWARE_CONFIG['mux'].pop('default', {})
 MUX_CONFIG.update({'voltage_max': 50., 'current_max': 3.})  # board default values that overwrite system default values
diff --git a/uml_diagrams/classes_uml_ohmpi.dot b/uml_diagrams/classes_uml_ohmpi.dot
index c482b8c97b233760a25b84cbb14073b22cdbe399..b16d126edf33b1e5158d946400c1ac62d25a1a3c 100644
--- a/uml_diagrams/classes_uml_ohmpi.dot
+++ b/uml_diagrams/classes_uml_ohmpi.dot
@@ -2,36 +2,42 @@ digraph "classes_uml_ohmpi" {
 charset="utf-8"
 rankdir=BT
 "0" [label="{CompressedSizedTimedRotatingFileHandler|maxBytes : int\lstream\lzip_mode : int\l|doRollover()\lfind_last_rotated_file()\lshouldRollover(record)\l}", shape="record"];
-"1" [label="{Ctl|board_name : str\lbus : I2C\lmax_cpu_temp : float\l|}", shape="record"];
-"2" [label="{Ctl|bus : NoneType\l|}", shape="record"];
-"3" [label="{CtlAbstract|board_name\lbus : NoneType\lcpu_temperature\lexec_logger : NoneType, RootLogger\lmax_cpu_temp\lsoh_logger : RootLogger, NoneType\l|}", shape="record"];
-"4" [label="{MQTTHandler|auth : NoneType\lclient_id : str\lhostname\lkeepalive : int\lport : int\lprotocol\lqos : int\lretain : bool\ltls : NoneType\ltopic\ltransport : str\lwill : NoneType\l|emit(record)\l}", shape="record"];
-"5" [label="{Mux|\l|reset()\lswitch_one()\ltest()\l}", shape="record"];
+"1" [label="{Ctl|board_name : str\lbus\lmax_cpu_temp : float\l|}", shape="record"];
+"2" [label="{Ctl|board_name : str\lbus : I2C\lmax_cpu_temp : float\l|}", shape="record"];
+"3" [label="{Ctl|bus : NoneType\l|}", shape="record"];
+"4" [label="{CtlAbstract|board_name\lbus : NoneType\lcpu_temperature\lexec_logger : RootLogger, NoneType\lmax_cpu_temp\lsoh_logger : RootLogger, NoneType\l|}", shape="record"];
+"5" [label="{MQTTHandler|auth : NoneType\lclient_id : str\lhostname\lkeepalive : int\lport : int\lprotocol\lqos : int\lretain : bool\ltls : NoneType\ltopic\ltransport : str\lwill : NoneType\l|emit(record)\l}", shape="record"];
 "6" [label="{Mux|addresses : dict\l|reset()\lswitch_one(elec, role, state)\l}", shape="record"];
-"7" [label="{MuxAbstract|addresses\lbarrier\lboard_id\lboard_name\lcabling : dict\lctl\lexec_logger : RootLogger, NoneType\lsoh_logger : RootLogger, NoneType\l|reset()\lswitch(elec_dict, state)\lswitch_one(elec, role, state)\ltest(elec_dict, activation_time)\l}", shape="record"];
-"8" [label="{MyServer|\l|do_POST()\l}", shape="record"];
-"9" [label="{OhmPi|cmd_id : NoneType\lcontroller : NoneType\ldata_logger : RootLogger, NoneType\lexec_logger : RootLogger, NoneType\lid : str\lmqtt : bool\lnb_samples : int\lon_pi : bool, NoneType\lsequence\lsequence : ndarray, NoneType\lsettings : dict\lsoh_logger : RootLogger, NoneType\lstatus : str\lthread : NoneType, Thread\l|append_and_save(filename, last_measurement, cmd_id)\lget_data(survey_names, cmd_id)\lget_deprecated_methods(cls)\linterrupt(cmd_id)\lload_sequence(filename, cmd_id)\lquit(cmd_id)\lremove_data(cmd_id)\lreset_mux(cmd_id)\lrestart(cmd_id)\lrs_check(tx_volt, cmd_id)\lrun_measurement(quad, nb_stack, injection_duration, autogain, strategy, tx_volt, best_tx_injtime, cmd_id)\lrun_multiple_sequences(cmd_id, sequence_delay, nb_meas)\lrun_sequence(cmd_id)\lrun_sequence_async(cmd_id)\lset_sequence(sequence, cmd_id)\lswitch_mux_off(quadrupole, cmd_id)\lswitch_mux_on(quadrupole, cmd_id)\ltest_mux(activation_time, mux_id, cmd_id)\lupdate_settings(settings, cmd_id)\l}", shape="record"];
-"10" [label="{OhmPiHardware|ctl\ldata_logger : NoneType, RootLogger\lexec_logger : RootLogger, NoneType\lmux_barrier : Barrier\lmux_boards\lpulses\lpwr\lreadings : ndarray\lrx\lsoh_logger : RootLogger, NoneType\lsp\ltx\ltx_sync : Event\l|reset_mux()\lswitch_mux(electrodes, roles, state)\ltest_mux(channel, activation_time)\lvab_square_wave(vab, cycle_length, sampling_rate, cycles, polarity, append)\l}", shape="record"];
-"11" [label="{Pwr|current\lvoltage\lvoltage_adjustable : bool\l|turn_off()\lturn_on()\l}", shape="record"];
-"12" [label="{PwrAbstract|board_name\lcurrent\lexec_logger : RootLogger, NoneType\lsoh_logger : NoneType, RootLogger\lvoltage\lvoltage_adjustable\l|turn_off()\lturn_on()\l}", shape="record"];
-"13" [label="{Rx|adc_gain\ladc_gain : float\lvoltage\l|adc_gain_auto()\l}", shape="record"];
-"14" [label="{Rx|adc_gain\ladc_gain\lctl\lvoltage\l|adc_gain_auto()\l}", shape="record"];
-"15" [label="{Rx|adc_gain\ladc_gain\lctl\lvoltage\l|adc_gain_auto()\l}", shape="record"];
-"16" [label="{RxAbstract|adc_gain\lboard_name\lctl\lexec_logger : RootLogger, NoneType\lsampling_rate\lsoh_logger : NoneType, RootLogger\lvoltage\l|adc_gain_auto()\l}", shape="record"];
-"17" [label="{Tx|adc_gain\ladc_gain : int, float\lctl\lcurrent\lcurrent_adjustable : bool\lmcp_board : MCP23008\lpin0 : DigitalInOut\lpin1 : DigitalInOut\lpin4 : DigitalInOut\lpolarity\lpolarity : int\lpwr : NoneType\ltx_bat\lvoltage_adjustable : bool\l|adc_gain_auto()\lcurrent_pulse()\linject(polarity, inj_time)\lturn_off()\lturn_on()\lvoltage_pulse(voltage, length, polarity)\l}", shape="record"];
-"18" [label="{Tx|adc_gain\ladc_gain : float\lcurrent\lpolarity : int\ltx_bat\lvoltage\l|adc_gain_auto()\lcurrent_pulse()\linject(state)\lvoltage_pulse(voltage, length, polarity)\l}", shape="record"];
-"19" [label="{Tx|DPS\ladc_gain\ladc_gain : float, int\lctl\lcurrent\lmcp_board : MCP23008\lpin0 : DigitalInOut\lpin1 : DigitalInOut\lpin2 : DigitalInOut\lpin3 : DigitalInOut\lpin4 : DigitalInOut\lpolarity\lpolarity : NoneType, int\ltx_bat\lvoltage\lvoltage\l|adc_gain_auto()\lcurrent_pulse()\linject(polarity, inj_time)\lturn_off()\lturn_on()\lvoltage_pulse(voltage, length, polarity)\l}", shape="record"];
-"20" [label="{TxAbstract|adc_gain\lboard_name\lctl\lexec_logger : RootLogger, NoneType\linj_time\linj_time\lpolarity\lpwr\lsoh_logger : NoneType, RootLogger\ltx_bat\l|adc_gain_auto()\lcurrent_pulse()\linject(polarity, inj_time)\lvoltage_pulse(voltage, length, polarity)\l}", shape="record"];
-"1" -> "3" [arrowhead="empty", arrowtail="none"];
-"2" -> "3" [arrowhead="empty", arrowtail="none"];
-"5" -> "7" [arrowhead="empty", arrowtail="none"];
-"6" -> "7" [arrowhead="empty", arrowtail="none"];
-"11" -> "12" [arrowhead="empty", arrowtail="none"];
-"13" -> "16" [arrowhead="empty", arrowtail="none"];
-"14" -> "16" [arrowhead="empty", arrowtail="none"];
-"15" -> "16" [arrowhead="empty", arrowtail="none"];
-"17" -> "20" [arrowhead="empty", arrowtail="none"];
-"18" -> "20" [arrowhead="empty", arrowtail="none"];
-"19" -> "20" [arrowhead="empty", arrowtail="none"];
-"10" -> "9" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="_hw", style="solid"];
+"7" [label="{Mux|\l|reset()\lswitch_one()\ltest()\l}", shape="record"];
+"8" [label="{Mux|addresses : dict\l|reset()\lswitch_one(elec, role, state)\l}", shape="record"];
+"9" [label="{MuxAbstract|addresses\lbarrier\lboard_id\lboard_name\lcabling : dict\lctl\lexec_logger : RootLogger, NoneType\lsoh_logger : RootLogger, NoneType\l|reset()\lswitch(elec_dict, state, bypass_check)\lswitch_one(elec, role, state)\ltest(elec_dict, activation_time)\l}", shape="record"];
+"10" [label="{MyServer|\l|do_POST()\l}", shape="record"];
+"11" [label="{OhmPi|cmd_id : NoneType\lcontroller : NoneType\ldata_logger : RootLogger, NoneType\lexec_logger : RootLogger, NoneType\lid : str\lmqtt : bool\lnb_samples : int\lon_pi : NoneType, bool\lsequence\lsequence : NoneType, ndarray\lsettings : dict\lsoh_logger : RootLogger, NoneType\lstatus : str\lthread : Thread, NoneType\l|append_and_save(filename, last_measurement, cmd_id)\lget_data(survey_names, cmd_id)\lget_deprecated_methods(cls)\linterrupt(cmd_id)\lload_sequence(filename, cmd_id)\lquit(cmd_id)\lremove_data(cmd_id)\lreset_mux(cmd_id)\lrestart(cmd_id)\lrs_check(tx_volt, cmd_id)\lrun_measurement(quad, nb_stack, injection_duration, autogain, strategy, tx_volt, best_tx_injtime, cmd_id)\lrun_multiple_sequences(cmd_id, sequence_delay, nb_meas)\lrun_sequence(cmd_id)\lrun_sequence_async(cmd_id)\lset_sequence(sequence, cmd_id)\lswitch_mux_off(quadrupole, cmd_id)\lswitch_mux_on(quadrupole, bypass_check, cmd_id)\ltest_mux(activation_time, mux_id, cmd_id)\lupdate_settings(settings, cmd_id)\l}", shape="record"];
+"12" [label="{OhmPiHardware|ctl\ldata_logger : RootLogger, NoneType\lexec_logger : RootLogger, NoneType\llast_dev\llast_rho\lmux_barrier : Barrier\lmux_boards : dict\lpulses\lpwr\lreadings : ndarray\lrx\lsoh_logger : NoneType, RootLogger\lsp\ltx\ltx_sync : Event\l|calibrate_rx_bias()\lreset_mux()\lswitch_mux(electrodes, roles, state)\ltest_mux(channel, activation_time)\lvab_square_wave(vab, cycle_duration, sampling_rate, cycles, polarity, duty_cycle, append)\l}", shape="record"];
+"13" [label="{Pwr|ctl\lcurrent\lcurrent_max\lvoltage\lvoltage_adjustable : bool\l|battery_voltage()\lturn_off()\lturn_on()\l}", shape="record"];
+"14" [label="{Pwr|current\lvoltage\lvoltage_adjustable : bool\l|turn_off()\lturn_on()\l}", shape="record"];
+"15" [label="{PwrAbstract|board_name\lctl\lcurrent\lexec_logger : RootLogger, NoneType\lsoh_logger : RootLogger, NoneType\lvoltage\lvoltage_adjustable\l|turn_off()\lturn_on()\l}", shape="record"];
+"16" [label="{Rx|adc_gain\ladc_gain : float\lvoltage\l|adc_gain_auto()\l}", shape="record"];
+"17" [label="{Rx|adc_gain\ladc_gain\lctl\lvoltage\l|adc_gain_auto()\l}", shape="record"];
+"18" [label="{Rx|adc_gain\ladc_gain\lctl\lvoltage\l|adc_gain_auto()\l}", shape="record"];
+"19" [label="{RxAbstract|adc_gain\lboard_name\lctl\lexec_logger : RootLogger, NoneType\lsampling_rate\lsoh_logger : RootLogger, NoneType\lvoltage\l|adc_gain_auto()\l}", shape="record"];
+"20" [label="{Tx|adc_gain\ladc_gain : int, float\lctl\lcurrent\lcurrent_adjustable : bool\lmcp_board : MCP23008\lpin0 : DigitalInOut\lpin1 : DigitalInOut\lpin4 : DigitalInOut\lpolarity\lpolarity : int\lpwr : NoneType\ltx_bat\lvoltage_adjustable : bool\l|adc_gain_auto()\lcurrent_pulse()\linject(polarity, injection_duration)\lturn_off()\lturn_on()\lvoltage_pulse(voltage, length, polarity)\l}", shape="record"];
+"21" [label="{Tx|adc_gain\ladc_gain : float\lcurrent\lpolarity : int\ltx_bat\lvoltage\l|adc_gain_auto()\lcurrent_pulse()\linject(state)\lvoltage_pulse(voltage, length, polarity)\l}", shape="record"];
+"22" [label="{Tx|DPS\ladc_gain\ladc_gain : int, float\lctl\lcurrent\lmcp_board : MCP23008\lpin0 : DigitalInOut\lpin1 : DigitalInOut\lpin2 : DigitalInOut\lpin3 : DigitalInOut\lpin4 : DigitalInOut\lpolarity\lpolarity : NoneType, int\ltx_bat\lvoltage\lvoltage\l|adc_gain_auto()\lcurrent_pulse()\linject(polarity, injection_duration)\lturn_off()\lturn_on()\lvoltage_pulse(voltage, length, polarity)\l}", shape="record"];
+"23" [label="{TxAbstract|adc_gain\lboard_name\lctl\lexec_logger : RootLogger, NoneType\linjection_duration\linjection_duration\lpolarity\lpwr\lsoh_logger : RootLogger, NoneType\ltx_bat\ltx_sync\l|adc_gain_auto()\lcurrent_pulse()\linject(polarity, injection_duration)\lvoltage_pulse(voltage, length, polarity)\l}", shape="record"];
+"1" -> "4" [arrowhead="empty", arrowtail="none"];
+"2" -> "4" [arrowhead="empty", arrowtail="none"];
+"3" -> "4" [arrowhead="empty", arrowtail="none"];
+"6" -> "9" [arrowhead="empty", arrowtail="none"];
+"7" -> "9" [arrowhead="empty", arrowtail="none"];
+"8" -> "9" [arrowhead="empty", arrowtail="none"];
+"13" -> "15" [arrowhead="empty", arrowtail="none"];
+"14" -> "15" [arrowhead="empty", arrowtail="none"];
+"16" -> "19" [arrowhead="empty", arrowtail="none"];
+"17" -> "19" [arrowhead="empty", arrowtail="none"];
+"18" -> "19" [arrowhead="empty", arrowtail="none"];
+"20" -> "23" [arrowhead="empty", arrowtail="none"];
+"21" -> "23" [arrowhead="empty", arrowtail="none"];
+"22" -> "23" [arrowhead="empty", arrowtail="none"];
+"12" -> "11" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="_hw", style="solid"];
 }
diff --git a/uml_diagrams/classes_uml_ohmpi.dot.png b/uml_diagrams/classes_uml_ohmpi.dot.png
index 2b0acf4cd90e158c58858bea56a60c84bb1e17e9..00b93feb2a608839aa567e627eeb3588a2a23078 100644
Binary files a/uml_diagrams/classes_uml_ohmpi.dot.png and b/uml_diagrams/classes_uml_ohmpi.dot.png differ
diff --git a/uml_diagrams/classes_uml_ohmpi.dot.svg b/uml_diagrams/classes_uml_ohmpi.dot.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c7a229ae61d163551587f58cc68074c778e6da2d
--- /dev/null
+++ b/uml_diagrams/classes_uml_ohmpi.dot.svg
@@ -0,0 +1,506 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generated by graphviz version 2.43.0 (0)
+ -->
+
+<!-- Title: classes_uml_ohmpi Pages: 1 -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="4198pt"
+   height="964pt"
+   viewBox="0.00 0.00 4197.50 964.00"
+   version="1.1"
+   id="svg1693"
+   sodipodi:docname="classes_uml_ohmpi.dot.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+  <metadata
+     id="metadata1699">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs1697" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1868"
+     inkscape:window-height="1016"
+     id="namedview1695"
+     showgrid="false"
+     inkscape:snap-text-baseline="false"
+     inkscape:zoom="0.65135348"
+     inkscape:cx="4758.8494"
+     inkscape:cy="499.44138"
+     inkscape:window-x="52"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="graph0" />
+  <g
+     id="graph0"
+     class="graph"
+     transform="scale(1 1) rotate(0) translate(4 960)">
+    <title
+       id="title873">classes_uml_ohmpi</title>
+    <!-- 0 -->
+    <!-- 1 -->
+    <!-- 4 -->
+    <!-- 1&#45;&gt;4 -->
+    <!-- 2 -->
+    <!-- 2&#45;&gt;4 -->
+    <!-- 3 -->
+    <!-- 3&#45;&gt;4 -->
+    <!-- 5 -->
+    <!-- 6 -->
+    <!-- 9 -->
+    <!-- 6&#45;&gt;9 -->
+    <!-- 7 -->
+    <!-- 7&#45;&gt;9 -->
+    <!-- 8 -->
+    <!-- 8&#45;&gt;9 -->
+    <!-- 10 -->
+    <!-- 11 -->
+    <!-- 12 -->
+    <!-- 12&#45;&gt;11 -->
+    <!-- 13 -->
+    <!-- 15 -->
+    <!-- 13&#45;&gt;15 -->
+    <!-- 14 -->
+    <!-- 14&#45;&gt;15 -->
+    <!-- 16 -->
+    <!-- 19 -->
+    <!-- 16&#45;&gt;19 -->
+    <!-- 17 -->
+    <!-- 17&#45;&gt;19 -->
+    <!-- 18 -->
+    <!-- 18&#45;&gt;19 -->
+    <!-- 20 -->
+    <g
+       id="node21"
+       class="node"
+       transform="translate(115.5)"
+       style="stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">
+      <title
+         id="title1493">20</title>
+      <polygon
+         points="3561.5,-354.5 3561.5,-15.5 3265.5,-15.5 3265.5,-354.5 "
+         id="polygon1495"
+         style="fill:none;stroke:#000000;stroke-width:3.16884092;stroke-miterlimit:4;stroke-dasharray:none"
+         transform="matrix(1.0003563,0,0,0.79991151,-1.2162088,-70.9841)" />
+      <text
+         x="3413.5"
+         y="-339.29999"
+         font-size="14.00"
+         id="text1497"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14px;font-family:Times, serif;-inkscape-font-specification:'Times, serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:2.83464551;stroke-miterlimit:4;stroke-dasharray:none">Tx (mb_2023.0.0)</text>
+      <polyline
+         points="3265.5,-331.5 3561.5,-331.5 "
+         id="polyline1499"
+         style="fill:none;stroke:#000000;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none" />
+      <text
+         x="3273.5"
+         y="-316.29999"
+         font-size="14.00"
+         id="text1501"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">adc_gain</text>
+      <text
+         x="3273.5"
+         y="-301.29999"
+         font-size="14.00"
+         id="text1503"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">adc_gain : int, float</text>
+      <text
+         x="3273.5"
+         y="-286.29999"
+         font-size="14.00"
+         id="text1505"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">ctl</text>
+      <text
+         x="3273.5"
+         y="-271.29999"
+         font-size="14.00"
+         id="text1507"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">current</text>
+      <text
+         x="3273.5"
+         y="-256.29999"
+         font-size="14.00"
+         id="text1509"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">current_adjustable : bool</text>
+      <text
+         x="3273.5"
+         y="-241.3"
+         font-size="14.00"
+         id="text1511"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">mcp_board : MCP23008</text>
+      <text
+         x="3273.5"
+         y="-226.3"
+         font-size="14.00"
+         id="text1513"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">pin0 : DigitalInOut</text>
+      <text
+         x="3273.5"
+         y="-211.3"
+         font-size="14.00"
+         id="text1515"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">pin1 : DigitalInOut</text>
+      <text
+         x="3273.5"
+         y="-196.3"
+         font-size="14.00"
+         id="text1517"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">pin4 : DigitalInOut</text>
+      <polyline
+         points="3265.5,-113.5 3561.5,-113.5 "
+         id="polyline1529"
+         style="fill:none;stroke:#000000;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none"
+         transform="translate(0,-72)" />
+      <text
+         x="3273.5"
+         y="-170.3"
+         font-size="14.00"
+         id="text1531"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">adc_gain_auto()</text>
+      <text
+         x="3273.5"
+         y="-155.3"
+         font-size="14.00"
+         id="text1533"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">current_pulse()</text>
+      <text
+         x="3273.5"
+         y="-140.3"
+         font-size="14.00"
+         id="text1535"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">inject(polarity, injection_duration)</text>
+      <text
+         x="3273.5"
+         y="-125.3"
+         font-size="14.00"
+         id="text1537"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">turn_off()</text>
+      <text
+         x="3273.5"
+         y="-110.3"
+         font-size="14.00"
+         id="text1539"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">turn_on()</text>
+      <text
+         x="3273.5"
+         y="-95.299995"
+         font-size="14.00"
+         id="text1541"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">voltage_pulse(voltage, length, polarity)</text>
+    </g>
+    <!-- 23 -->
+    <g
+       id="node24"
+       class="node"
+       transform="translate(0,109.5)"
+       style="stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">
+      <title
+         id="title1544">23</title>
+      <polygon
+         points="3875.5,-820.5 3875.5,-556.5 3579.5,-556.5 3579.5,-820.5 "
+         id="polygon1546"
+         style="fill:none;stroke:#000000;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none" />
+      <text
+         x="3727.5"
+         y="-805.29999"
+         font-size="14.00"
+         id="text1548"
+         style="font-size:13.99999956px;font-family:Times, serif;text-anchor:middle;-inkscape-font-specification:'Times, serif, Bold';font-weight:bold;font-style:normal;font-stretch:normal;font-variant:normal;text-align:center;writing-mode:lr;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">TxAbstract</text>
+      <polyline
+         points="3579.5,-797.5 3875.5,-797.5 "
+         id="polyline1550"
+         style="fill:none;stroke:#000000;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none" />
+      <text
+         x="3587.5"
+         y="-782.29999"
+         font-size="14.00"
+         id="text1552"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">adc_gain</text>
+      <text
+         x="3587.5"
+         y="-767.29999"
+         font-size="14.00"
+         id="text1554"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">board_name</text>
+      <text
+         x="3587.5"
+         y="-752.29999"
+         font-size="14.00"
+         id="text1556"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">ctl</text>
+      <text
+         x="3587.5"
+         y="-737.29999"
+         font-size="14.00"
+         id="text1558"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">exec_logger : RootLogger, NoneType</text>
+      <text
+         x="3587.5"
+         y="-722.29999"
+         font-size="14.00"
+         id="text1560"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">injection_duration</text>
+      <text
+         x="3587.5"
+         y="-707.29999"
+         font-size="14.00"
+         id="text1562"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">injection_duration</text>
+      <text
+         x="3587.5"
+         y="-692.29999"
+         font-size="14.00"
+         id="text1564"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">polarity</text>
+      <text
+         x="3587.5"
+         y="-677.29999"
+         font-size="14.00"
+         id="text1566"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">pwr</text>
+      <text
+         x="3587.5"
+         y="-662.29999"
+         font-size="14.00"
+         id="text1568"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">soh_logger : RootLogger, NoneType</text>
+      <text
+         x="3587.5"
+         y="-647.29999"
+         font-size="14.00"
+         id="text1570"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">tx_bat</text>
+      <text
+         x="3587.5"
+         y="-632.29999"
+         font-size="14.00"
+         id="text1572"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">tx_sync</text>
+      <polyline
+         points="3579.5,-624.5 3875.5,-624.5 "
+         id="polyline1574"
+         style="fill:none;stroke:#000000;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none" />
+      <text
+         x="3587.5"
+         y="-609.29999"
+         font-size="14.00"
+         id="text1576"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">adc_gain_auto()</text>
+      <text
+         x="3587.5"
+         y="-594.29999"
+         font-size="14.00"
+         id="text1578"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">current_pulse()</text>
+      <text
+         x="3587.5"
+         y="-579.29999"
+         font-size="14.00"
+         id="text1580"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">inject(polarity, injection_duration)</text>
+      <text
+         x="3587.5"
+         y="-564.29999"
+         font-size="14.00"
+         id="text1582"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">voltage_pulse(voltage, length, polarity)</text>
+    </g>
+    <!-- 20&#45;&gt;23 -->
+    <g
+       id="edge12"
+       class="edge">
+      <title
+         id="title1585">20-&gt;23</title>
+      <path
+         d="m 3519.15,-354.74 c 39.21,-62.63 156.5312,-22.94704 193.9712,-82.73704"
+         id="path1587"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000"
+         sodipodi:nodetypes="cc" />
+      <polygon
+         points="3645.29,-556.2 3642.95,-545.87 3637.02,-549.58 "
+         id="polygon1589"
+         transform="translate(73.4042,110.06747)"
+         style="fill:none;stroke:#000000" />
+    </g>
+    <!-- 21 -->
+    <!-- 21&#45;&gt;23 -->
+    <!-- 22 -->
+    <g
+       id="node23"
+       class="node"
+       transform="translate(-111)"
+       style="stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">
+      <title
+         id="title1630">22</title>
+      <polygon
+         points="3893.5,-369.5 4189.5,-369.5 4189.5,-0.5 3893.5,-0.5 "
+         id="polygon1632"
+         style="fill:none;stroke:#000000;stroke-width:3.19778794;stroke-miterlimit:4;stroke-dasharray:none"
+         transform="matrix(1,0,0,0.78577501,0,-79.156135)" />
+      <text
+         x="4041.5"
+         y="-354.29999"
+         font-size="14.00"
+         id="text1634"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14px;font-family:Times, serif;-inkscape-font-specification:'Times, serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">Tx (mb_2024.0.0)</text>
+      <polyline
+         points="3893.5,-346.5 4189.5,-346.5 "
+         id="polyline1636"
+         style="fill:none;stroke:#000000;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none" />
+      <text
+         x="3901.5"
+         y="-331.29999"
+         font-size="14.00"
+         id="text1640"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">adc_gain</text>
+      <text
+         x="3901.5"
+         y="-316.29999"
+         font-size="14.00"
+         id="text1642"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">adc_gain : int, float</text>
+      <text
+         x="3901.5"
+         y="-301.29999"
+         font-size="14.00"
+         id="text1644"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">ctl</text>
+      <text
+         x="3901.5"
+         y="-286.29999"
+         font-size="14.00"
+         id="text1646"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">current</text>
+      <text
+         x="3901.5"
+         y="-271.29999"
+         font-size="14.00"
+         id="text1648"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">mcp_board : MCP23008</text>
+      <text
+         x="3901.5"
+         y="-256.29999"
+         font-size="14.00"
+         id="text1650"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">pin0 : DigitalInOut</text>
+      <text
+         x="3901.5"
+         y="-241.3"
+         font-size="14.00"
+         id="text1652"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">pin1 : DigitalInOut</text>
+      <text
+         x="3901.5"
+         y="-226.3"
+         font-size="14.00"
+         id="text1654"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">pin2 : DigitalInOut</text>
+      <text
+         x="3901.5"
+         y="-211.3"
+         font-size="14.00"
+         id="text1656"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">pin3 : DigitalInOut</text>
+      <text
+         x="3901.5"
+         y="-196.3"
+         font-size="14.00"
+         id="text1658"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">pin4 : DigitalInOut</text>
+      <polyline
+         points="3893.5,-98.5 4189.5,-98.5 "
+         id="polyline1670"
+         style="fill:none;stroke:#000000;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none"
+         transform="translate(0,-88.5)" />
+      <text
+         x="3901.5"
+         y="-168.8"
+         font-size="14.00"
+         id="text1672"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">adc_gain_auto()</text>
+      <text
+         x="3901.5"
+         y="-153.8"
+         font-size="14.00"
+         id="text1674"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">current_pulse()</text>
+      <text
+         x="3901.5"
+         y="-138.8"
+         font-size="14.00"
+         id="text1676"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">inject(polarity, injection_duration)</text>
+      <text
+         x="3901.5"
+         y="-123.8"
+         font-size="14.00"
+         id="text1678"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">turn_off()</text>
+      <text
+         x="3901.5"
+         y="-108.8"
+         font-size="14.00"
+         id="text1680"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">turn_on()</text>
+      <text
+         x="3901.5"
+         y="-93.799995"
+         font-size="14.00"
+         id="text1682"
+         style="font-size:14px;font-family:Times, serif;text-anchor:start;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none">voltage_pulse(voltage, length, polarity)</text>
+      <text
+         xml:space="preserve"
+         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:48px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none"
+         x="4051.5347"
+         y="-351.80414"
+         id="text1703"><tspan
+           sodipodi:role="line"
+           id="tspan1701"
+           x="4051.5347"
+           y="-309.33539"
+           style="stroke-width:2.83464558;stroke-miterlimit:4;stroke-dasharray:none"></tspan></text>
+    </g>
+    <!-- 22&#45;&gt;23 -->
+    <g
+       id="edge14"
+       class="edge">
+      <title
+         id="title1685">22-&gt;23</title>
+      <path
+         d="m 3926.58,-369.54 c -36.81,-58.8 -159.2615,-12.42398 -193.7915,-67.58398"
+         id="path1687"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#000000"
+         sodipodi:nodetypes="cc" />
+      <polygon
+         points="3809.58,-556.4 3817.86,-549.78 3811.92,-546.07 "
+         id="polygon1689"
+         transform="translate(-82.0101,110.67319)"
+         style="fill:none;stroke:#000000" />
+    </g>
+  </g>
+</svg>
diff --git a/uml_diagrams/packages_uml_ohmpi.dot b/uml_diagrams/packages_uml_ohmpi.dot
index 031e4133c5473d92e4fff7152f67e605a6ccc260..8bb7d66ea4dd84b71a8761a9bc5370e73eaaee6a 100644
--- a/uml_diagrams/packages_uml_ohmpi.dot
+++ b/uml_diagrams/packages_uml_ohmpi.dot
@@ -12,45 +12,58 @@ rankdir=BT
 "8" [label="ohmpi.hardware_components.dummy_rx", shape="box"];
 "9" [label="ohmpi.hardware_components.dummy_tx", shape="box"];
 "10" [label="ohmpi.hardware_components.mb_2024_rev_0_0", shape="box"];
-"11" [label="ohmpi.hardware_components.mux_2024_rev_0_0", shape="box"];
-"12" [label="ohmpi.hardware_components.ohmpi_card_3_15", shape="box"];
-"13" [label="ohmpi.hardware_components.pwr_batt", shape="box"];
-"14" [label="ohmpi.hardware_components.raspberry_pi_i2c", shape="box"];
-"15" [label="ohmpi.hardware_system", shape="box"];
-"16" [label="ohmpi.http_interface", shape="box"];
-"17" [label="ohmpi.logging_setup", shape="box"];
-"18" [label="ohmpi.mqtt_handler", shape="box"];
-"19" [label="ohmpi.ohmpi", shape="box"];
-"20" [label="ohmpi.utils", shape="box"];
-"2" -> "20" [arrowhead="open", arrowtail="none"];
+"11" [label="ohmpi.hardware_components.mux_2023_rev_0_0", shape="box"];
+"12" [label="ohmpi.hardware_components.mux_2024_rev_0_0", shape="box"];
+"13" [label="ohmpi.hardware_components.ohmpi_card_3_15", shape="box"];
+"14" [label="ohmpi.hardware_components.pwr_batt", shape="box"];
+"15" [label="ohmpi.hardware_components.pwr_dps5005", shape="box"];
+"16" [label="ohmpi.hardware_components.raspberry_pi_i2c", shape="box"];
+"17" [label="ohmpi.hardware_components.raspberry_pi_modbus", shape="box"];
+"18" [label="ohmpi.hardware_system", shape="box"];
+"19" [label="ohmpi.http_interface", shape="box"];
+"20" [label="ohmpi.logging_setup", shape="box"];
+"21" [label="ohmpi.mqtt_handler", shape="box"];
+"22" [label="ohmpi.ohmpi", shape="box"];
+"23" [label="ohmpi.plots", shape="box"];
+"24" [label="ohmpi.utils", shape="box"];
+"2" -> "24" [arrowhead="open", arrowtail="none"];
 "4" -> "5" [arrowhead="open", arrowtail="none"];
-"5" -> "17" [arrowhead="open", arrowtail="none"];
+"5" -> "20" [arrowhead="open", arrowtail="none"];
 "6" -> "4" [arrowhead="open", arrowtail="none"];
-"6" -> "19" [arrowhead="open", arrowtail="none"];
+"6" -> "22" [arrowhead="open", arrowtail="none"];
+"7" -> "2" [arrowhead="open", arrowtail="none"];
 "7" -> "4" [arrowhead="open", arrowtail="none"];
-"7" -> "19" [arrowhead="open", arrowtail="none"];
 "8" -> "4" [arrowhead="open", arrowtail="none"];
-"8" -> "19" [arrowhead="open", arrowtail="none"];
+"8" -> "22" [arrowhead="open", arrowtail="none"];
 "9" -> "4" [arrowhead="open", arrowtail="none"];
-"9" -> "19" [arrowhead="open", arrowtail="none"];
+"9" -> "22" [arrowhead="open", arrowtail="none"];
+"10" -> "2" [arrowhead="open", arrowtail="none"];
 "10" -> "4" [arrowhead="open", arrowtail="none"];
-"10" -> "19" [arrowhead="open", arrowtail="none"];
 "11" -> "2" [arrowhead="open", arrowtail="none"];
 "11" -> "4" [arrowhead="open", arrowtail="none"];
 "12" -> "2" [arrowhead="open", arrowtail="none"];
 "12" -> "4" [arrowhead="open", arrowtail="none"];
-"13" -> "5" [arrowhead="open", arrowtail="none"];
-"14" -> "4" [arrowhead="open", arrowtail="none"];
-"14" -> "20" [arrowhead="open", arrowtail="none"];
+"13" -> "2" [arrowhead="open", arrowtail="none"];
+"13" -> "4" [arrowhead="open", arrowtail="none"];
+"14" -> "5" [arrowhead="open", arrowtail="none"];
 "15" -> "2" [arrowhead="open", arrowtail="none"];
-"15" -> "17" [arrowhead="open", arrowtail="none"];
-"15" -> "20" [arrowhead="open", arrowtail="none"];
-"16" -> "2" [arrowhead="open", arrowtail="none"];
-"17" -> "1" [arrowhead="open", arrowtail="none"];
+"15" -> "5" [arrowhead="open", arrowtail="none"];
+"16" -> "4" [arrowhead="open", arrowtail="none"];
+"16" -> "24" [arrowhead="open", arrowtail="none"];
 "17" -> "2" [arrowhead="open", arrowtail="none"];
-"17" -> "18" [arrowhead="open", arrowtail="none"];
+"17" -> "4" [arrowhead="open", arrowtail="none"];
+"17" -> "24" [arrowhead="open", arrowtail="none"];
+"18" -> "2" [arrowhead="open", arrowtail="none"];
+"18" -> "5" [arrowhead="open", arrowtail="none"];
+"18" -> "20" [arrowhead="open", arrowtail="none"];
+"18" -> "24" [arrowhead="open", arrowtail="none"];
 "19" -> "2" [arrowhead="open", arrowtail="none"];
-"19" -> "15" [arrowhead="open", arrowtail="none"];
-"19" -> "17" [arrowhead="open", arrowtail="none"];
-"19" -> "20" [arrowhead="open", arrowtail="none"];
+"20" -> "1" [arrowhead="open", arrowtail="none"];
+"20" -> "2" [arrowhead="open", arrowtail="none"];
+"20" -> "21" [arrowhead="open", arrowtail="none"];
+"22" -> "2" [arrowhead="open", arrowtail="none"];
+"22" -> "18" [arrowhead="open", arrowtail="none"];
+"22" -> "20" [arrowhead="open", arrowtail="none"];
+"22" -> "24" [arrowhead="open", arrowtail="none"];
+"23" -> "24" [arrowhead="open", arrowtail="none"];
 }
diff --git a/uml_diagrams/packages_uml_ohmpi.dot.png b/uml_diagrams/packages_uml_ohmpi.dot.png
index 87a26ac6ac23724dd11d7da00dea46d25a34a22e..62de687bf022763495108e836b24be473d3481b8 100644
Binary files a/uml_diagrams/packages_uml_ohmpi.dot.png and b/uml_diagrams/packages_uml_ohmpi.dot.png differ
diff --git a/update_uml.sh b/update_uml.sh
index 29d13a3db445e5d2774174677a60e5bc2e6350f4..61fe264d7a6840939435da8490188ec5fce4b985 100755
--- a/update_uml.sh
+++ b/update_uml.sh
@@ -1,7 +1,9 @@
 pyreverse ohmpi -p uml_ohmpi
+dot -Tsvg classes_uml_ohmpi.dot -O
 dot -Tpng classes_uml_ohmpi.dot -O
 dot -Tpng packages_uml_ohmpi.dot -O
 mv classes_uml_ohmpi.dot uml_diagrams/
+mv classes_uml_ohmpi.dot.svg uml_diagrams/
 mv classes_uml_ohmpi.dot.png uml_diagrams/
 mv packages_uml_ohmpi.dot uml_diagrams/
 mv packages_uml_ohmpi.dot.png uml_diagrams/