diff --git a/hardware_components/mux_2024_22_23_4_roles_addressing_table.json b/hardware_components/mux_2024_22_23_4_roles_addressing_table.json
new file mode 100644
index 0000000000000000000000000000000000000000..5e4554fd666063f24ac3e8c78e3f748b03f47ec6
--- /dev/null
+++ b/hardware_components/mux_2024_22_23_4_roles_addressing_table.json
@@ -0,0 +1 @@
+{"(1, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 0}, "(2, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 1}, "(3, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 2}, "(4, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 3}, "(5, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 4}, "(6, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 5}, "(7, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 6}, "(8, A)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 7}, "(1, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 8}, "(2, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 9}, "(3, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 10}, "(4, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 11}, "(5, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 12}, "(6, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 13}, "(7, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 14}, "(8, B)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x22", "MCP_GPIO": 15}, "(8, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 0}, "(7, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 1}, "(6, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 2}, "(5, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 3}, "(4, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 4}, "(3, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 5}, "(2, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 6}, "(1, M)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 7}, "(8, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 8}, "(7, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 9}, "(6, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 10}, "(5, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 11}, "(4, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 12}, "(3, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 13}, "(2, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 14}, "(1, N)": {"TCA_address": null, "TCA_channel": 0, "MCP_address": "0x23", "MCP_GPIO": 15}}
diff --git a/hardware_components/mux_2024_rev_0_0.py b/hardware_components/mux_2024_rev_0_0.py
new file mode 100644
index 0000000000000000000000000000000000000000..817410d0ce25785a550f36914ffea3b9632d7dc9
--- /dev/null
+++ b/hardware_components/mux_2024_rev_0_0.py
@@ -0,0 +1,67 @@
+from OhmPi.config import HARDWARE_CONFIG
+import os
+from OhmPi.hardware_components import MuxAbstract
+import adafruit_tca9548a  # noqa
+from adafruit_mcp230xx.mcp23017 import MCP23017  # noqa
+from digitalio import Direction  # noqa
+
+MUX_CONFIG = HARDWARE_CONFIG['mux']
+
+class Mux(MuxAbstract):
+    def __init__(self, **kwargs):
+        kwargs.update({'board_name': os.path.basename(__file__).rstrip('.py')})
+        super().__init__(**kwargs)
+        self.max_elec = MUX_CONFIG['max_elec']
+        print(os.path.curdir)
+        if self._addresses is None and 'addresses' in MUX_CONFIG.keys():
+            self._get_addresses(MUX_CONFIG['addresses'])
+
+    def reset(self):
+        pass
+
+    def switch_one(self, elec=None, role=None, state=None):
+        MuxAbstract.switch_one(self, elec=elec, role=role, state=state)
+
+        def set_relay_state(mcp, mcp_pin, state=True):
+            pin_enable = mcp.get_pin(mcp_pin)
+            pin_enable.direction = Direction.OUTPUT
+            pin_enable.value = state
+
+        d = self._addresses[elec, role]
+        if d['TCA_address'] is None:
+            tca = self.controller.bus
+        else:
+            tca = adafruit_tca9548a.TCA9548A(self.controller.bus, d['TCA_address'])[d['TCA_channel']]
+        mcp = MCP23017(tca, address=d['MCP_address'])
+        if state == 'on':
+            print('opening gpio nr', d['MCP_GPIO'])
+            print('opening electrode nr', elec)
+            print('opening role', role)
+            print('opening MCP', d['MCP_address'])
+            set_relay_state(mcp, d['MCP_GPIO'], True)
+        if state == 'off':
+            set_relay_state(mcp, d['MCP_GPIO'], False)
+
+        # self.tca = adafruit_tca9548a.TCA9548A(i2c, self.addresses[role])
+        # # find I2C address of the electrode and corresponding relay
+        # # considering that one MCP23017 can cover 16 electrodes
+        # i2c_address = 7 - (elec - 1) // 16  # quotient without rest of the division
+        # relay = (elec - 1) - ((elec - 1) // 16) * 16
+        #
+        # if i2c_address is not None:
+        #     # select the MCP23017 of the selected MUX board
+        #     mcp = MCP23017(self.tca[i2c_address])
+        #     mcp.get_pin(relay - 1).direction = digitalio.Direction.OUTPUT
+        #     if state == 'on':
+        #         mcp.get_pin(relay - 1).value = True
+        #     else:
+        #         mcp.get_pin(relay - 1).value = False
+        #     # exec_logger.debug(f'Switching relay {relay} '
+        #     #                        f'({str(hex(self.addresses[role]))}) on:{on} for electrode {elec}')
+        # else:
+        #     raise ValueError('No I2C address found for the electrode'
+        #                      ' {:d} on board {:s}'.format(elec, self.addresses[role]))
+        #     # exec_logger.warning(f'Unable to address electrode nr {elec}')
+
+    def test(self, *args):
+        MuxAbstract.test(self, *args)
\ No newline at end of file