diff --git a/cpdctrl/cpdctrl_interactive.py b/cpdctrl/cpdctrl_interactive.py
index 07e3034..ad7563d 100644
--- a/cpdctrl/cpdctrl_interactive.py
+++ b/cpdctrl/cpdctrl_interactive.py
@@ -33,17 +33,10 @@ if __name__ == "__main__":
         from os import path
         filepath = path.realpath(path.abspath(__file__))
         sys.path.insert(0, path.dirname(path.dirname(filepath)))
-    parser = argparse.ArgumentParser(
-        prog="cpdctrl",
-        description="measure voltage using a Keithley SMU",
-    )
-    backend_group = parser.add_mutually_exclusive_group(required=False)
-    backend_group.add_argument("-k", "--keithley", action="store_true")
-    # backend_group.add_argument("-t", "--testing", action='store_true')
-    parser.add_argument("-c", "--config", action="store", help="alternate path to config file")
-    args = vars(parser.parse_args())
 
 
+from . import led_control_device
+from . import voltage_measurement_device
 from .voltage_measurement_device.base import VoltageMeasurementDevice
 from .voltage_measurement_device.impl import keithley2700 as _volt
 from .led_control_device.base import LedControlDevice
@@ -55,8 +48,12 @@ from .utility.data import DataCollector
 from .utility.data import plot_cpd_data as data_plot
 from .utility.config_file import ConfigFile
 from .utility import file_io
+from .utility.device_select import select_device_interactive
 from .update_funcs import _Monitor, _update_print
 
+import logging
+log = logging.getLogger(__name__)
+
 # CONFIGURATION
 _runtime_vars = {
     "last-measurement": ""
@@ -279,6 +276,13 @@ _/ ___\\____ \ / __ |/ ___\   __\_  __ \  |
 Interactive Shell for CPD measurements with Keithley 2700B
 ---
 Enter 'help()' for a list of commands""")
+    parser = argparse.ArgumentParser(
+        prog="cpdctrl",
+        description="measure voltage using a Keithley SMU",
+    )
+    backend_group = parser.add_mutually_exclusive_group(required=False)
+    parser.add_argument("-c", "--config", action="store", help="alternate path to config file")
+    args = vars(parser.parse_args())
     from os import environ
 
     if path.isfile(cfilename):
@@ -297,13 +301,44 @@ Enter 'help()' for a list of commands""")
     if not path.isdir(settings["datadir"]):
         makedirs(settings["datadir"])
 
-    try:
-        pass
-        dev = _volt.init("GPIB0::22::INSTR")
-        led = _led.LEDD1B()
-    except Exception as e:
-        print(e)
-        exit(1)
+    # init the devices
+    last_vm_type = config_file.get_or("last_dev_vm_type", None)
+    last_vm_name = config_file.get_or("last_dev_vm_name", None)
+    if last_vm_name and last_vm_type:
+        try:
+            dev = voltage_measurement_device.connect_device(last_vm_type, last_vm_name)
+        except:
+            log.error(f"Failed to connect to last used device {last_vm_type}::{last_vm_name}")
+    while dev is None:
+        devs = voltage_measurement_device.list_devices()
+        print("-" * 50)
+        vm_dev_type, vm_dev_name = select_device_interactive(devs, "Select voltage measurement device: ")
+        try:
+            dev = voltage_measurement_device.connect_device(vm_dev_type, vm_dev_name)
+        except:
+            log.error(f"Failed to connect to device {vm_dev_type}::{vm_dev_name}")
+        config_file.set("last_dev_vm_type", vm_dev_type)
+        config_file.set("last_dev_vm_name", vm_dev_name)
+
+    # init the devices
+    last_led_type = config_file.get_or("last_dev_led_type", None)
+    last_led_name = config_file.get_or("last_dev_led_name", None)
+    if last_led_name and last_led_type:
+        try:
+            led = led_control_device.connect_device(last_led_type, last_led_name)
+        except:
+            log.error(f"Failed to connect to last used device {last_led_type}::{last_led_name}")
+    while led is None:
+        devs = led_control_device.list_devices()
+        print("-" * 50)
+        led_dev_type, led_dev_name = select_device_interactive(devs, "Select LED control device: ")
+        try:
+            led = led_control_device.connect_device(led_dev_type, led_dev_name)
+        except:
+            log.error(f"Failed to connect to device {led_dev_type}::{led_dev_name}")
+        config_file.set("last_dev_led_type", led_dev_type)
+        config_file.set("last_dev_led_name", led_dev_name)
+
     # atexit.register(_backend.exit, dev)
 
 
diff --git a/cpdctrl/led_control_device/impl/thorlabs_dc2200.py b/cpdctrl/led_control_device/impl/thorlabs_dc2200.py
index 93c8054..7b78678 100644
--- a/cpdctrl/led_control_device/impl/thorlabs_dc2200.py
+++ b/cpdctrl/led_control_device/impl/thorlabs_dc2200.py
@@ -1,4 +1,5 @@
 from ..base import LedControlDevice
+from ...utility.visa import enumerate_devices
 
 import logging
 log = logging.getLogger(__name__)
@@ -36,28 +37,11 @@ class DC2200(LedControlDevice):
         self.instr.write(f'SOURCE1:CBRightness:BRIGhtness {level}')
 
     @staticmethod
-    def enumerate_devices(query="(GPIB)|(USB)?*::INSTR"):
-        rm = pyvisa.ResourceManager()
-        res = []
-        for r in rm.list_resources(query):
-            try:
-                instr = rm.open_resource(r)
-                name = instr.query('*IDN?')
-                if 'DC2200' in name:
-                    res.append(r)
-                instr.close()
-            except:
-                log.debug(f"Could not open Visa resources {r}")
-        return res
+    def enumerate_devices(query="(GPIB)|(USB)?*:INSTR"):
+        return enumerate_devices("DC2200", query)
 
     @staticmethod
     def connect_device(name):
         rm = pyvisa.ResourceManager()
         instr = rm.open_resource(name)
-        return DC2200(instr)
-
-
-
-
-
-
+        return DC2200(instr)
\ No newline at end of file
diff --git a/cpdctrl/led_control_device/impl/thorlabs_ledd1b.py b/cpdctrl/led_control_device/impl/thorlabs_ledd1b.py
index 5292011..aec358b 100644
--- a/cpdctrl/led_control_device/impl/thorlabs_ledd1b.py
+++ b/cpdctrl/led_control_device/impl/thorlabs_ledd1b.py
@@ -3,6 +3,13 @@ import serial
 from ..base import LedControlDevice
 
 class LEDD1B(LedControlDevice):
+    """
+    Control a Thorlabs LEDD1B LED driver using an Arduino Nano.
+    The arduino must have the correct software loaded on it.
+    (See `arduino-thorlabs-ledd1b`project directory.)
+
+    Note: This currently has COM4 hardcoded
+    """
     def __init__(self, port="COM4"):    
         self.arduino = serial.Serial(port=port, baudrate=9600, timeout=.1)
         # self._check_arduino_software()
@@ -25,8 +32,8 @@ class LEDD1B(LedControlDevice):
         self.arduino.write(bytes(val, 'utf-8')) 
         
     def read(self):
-	    data = self.arduino.readlines() 
-	    return data  
+        data = self.arduino.readlines()
+        return data
        
     def on(self):
         self._write("1")
@@ -37,6 +44,7 @@ class LEDD1B(LedControlDevice):
         elif level == 100: self.on()
         else:
             raise ValueError(f"LEDD1B Led controller can only set 0% or 100%")
+
    
 if __name__ == '__main__':
     led = LEDD1B()
\ No newline at end of file
diff --git a/cpdctrl/measurement.py b/cpdctrl/measurement.py
index 3b371e6..416ef64 100644
--- a/cpdctrl/measurement.py
+++ b/cpdctrl/measurement.py
@@ -5,9 +5,7 @@ Created on Fri Jan 24 15:18:31 2025
 @author: Matthias Quintern
 """
 from cpdctrl.voltage_measurement_device.base import VoltageMeasurementDevice
-from cpdctrl.voltage_measurement_device.impl.keithley2700 import init
 from cpdctrl.led_control_device.base import LedControlDevice
-from cpdctrl.led_control_device.impl.thorlabs_ledd1b import LEDD1B # TODO: remove!
 from cpdctrl.led_script import LedScript
 from cpdctrl.utility.data import DataCollector
 
diff --git a/cpdctrl/utility/device_select.py b/cpdctrl/utility/device_select.py
new file mode 100644
index 0000000..41646b3
--- /dev/null
+++ b/cpdctrl/utility/device_select.py
@@ -0,0 +1,26 @@
+def select_device_interactive(type_devices_dict: dict[str, list[str]], prompt="Select an instrument: ") -> tuple[str, str]:
+    """
+    Select a device interactively from the command line
+
+    Parameters
+    ----------
+    type_devices_dict
+        A dictionary of device types and their corresponding device names
+    -------
+    The type and name of the selected device.
+    These can be passed to the connect_device method of the led_control_device or voltage_measurement_device libraries
+    """
+    res = type_devices_dict
+    flat_res = [ (t, v) for t, l in res.items() for v in l ]
+    for i, (t,v) in enumerate(flat_res):
+        print(f"{i+1:02}: {t} - {v}")
+    while len(flat_res) > 0:
+        try:
+            instr = int(input(prompt)) - 1
+            if instr < 0 or instr >= len(flat_res):
+                raise ValueError
+            return flat_res[instr]
+        except ValueError:
+            print(f"Enter a number between 1 and {len(flat_res)}")
+            continue
+    raise Exception("No devices found")
\ No newline at end of file
diff --git a/cpdctrl/utility/visa.py b/cpdctrl/utility/visa.py
new file mode 100644
index 0000000..e8cb2f2
--- /dev/null
+++ b/cpdctrl/utility/visa.py
@@ -0,0 +1,34 @@
+import pyvisa
+
+import logging
+log = logging.getLogger(__name__)
+
+def enumerate_devices(device_name, query="(GPIB)|(USB)?*:INSTR", visa_backend=""):
+    """
+    Return all available visa resources that match the query and the device name
+    Parameters
+    ----------
+    device_name
+        A part of the name that the device is supposed upon the '*IDN?' query
+    query
+        A query to the visa resource manager, to filter the resources
+    visa_backend
+        The visa backend to use, if not the default one
+
+    Returns
+    -------
+    List of visa resource names
+
+    """
+    rm = pyvisa.ResourceManager(visa_backend)
+    res = []
+    for r in rm.list_resources(query):
+        try:
+            instr = rm.open_resource(r)
+            name = instr.query('*IDN?')
+            if device_name in name:
+                res.append(r)
+            instr.close()
+        except:
+            log.debug(f"Could not open Visa resources {r}")
+    return res
\ No newline at end of file
diff --git a/cpdctrl/voltage_measurement_device/__init__.py b/cpdctrl/voltage_measurement_device/__init__.py
index 1cb25f8..611a7dd 100644
--- a/cpdctrl/voltage_measurement_device/__init__.py
+++ b/cpdctrl/voltage_measurement_device/__init__.py
@@ -1,6 +1,9 @@
 
 from .base import VoltageMeasurementDevice
 
+TYPENAME_TEST = "Test"
+TYPENAME_KEITHLEY2700 = "Keithley 2700"
+
 try:
     from .impl.keithley2700 import Keithley2700
 except ImportError:
@@ -10,22 +13,22 @@ from .impl.test import TestVoltageMeasurementDevice
 
 def list_devices() -> dict[str,list[str]]:
     devices = {
-        "TEST": ["Voltage Measurement Dummy Device"],
+        TYPENAME_TEST: ["Voltage Measurement Dummy Device"],
     }
     try:
-        from .impl import keithley2700
-        devices["VISA"] = keithley2700.enumerate_devices()
+        from .impl.keithley2700 import Keithley2700
+        devices[TYPENAME_KEITHLEY2700] = Keithley2700.enumerate_devices()
     except ImportError:
         pass
     return devices
 
-def connect_device(typename: str, devicename: str) -> VoltageMeasurementDevice:
-    if typename == "TEST":
+def connect_device(type_name: str, device_name: str) -> VoltageMeasurementDevice:
+    if type_name == TYPENAME_TEST:
         return TestVoltageMeasurementDevice()
-    elif typename == "VISA":
+    elif type_name == TYPENAME_KEITHLEY2700:
         try:
-            from .impl import keithley2700
-            return keithley2700.init(devicename)
+            from .impl.keithley2700 import Keithley2700
+            return Keithley2700.connect_device(device_name)
         except ImportError as e:
-            raise ValueError(f"VISA devices not available: {e}")
-    raise ValueError(f"Unknown device type {typename}")
\ No newline at end of file
+            raise ValueError(f"Keithley 2700 devices not available: {e}")
+    raise ValueError(f"Unknown device type {type_name}")
\ No newline at end of file
diff --git a/cpdctrl/voltage_measurement_device/impl/keithley2700.py b/cpdctrl/voltage_measurement_device/impl/keithley2700.py
index 93cad77..51ddbe7 100644
--- a/cpdctrl/voltage_measurement_device/impl/keithley2700.py
+++ b/cpdctrl/voltage_measurement_device/impl/keithley2700.py
@@ -5,78 +5,7 @@ import os
 from typing import Callable
 
 from ..base import VoltageMeasurementDevice
-
-"""
-Utility
-"""
-
-# scripts = {
-#     "buffer_reset": pkg_resources.resource_filename("cpdctrl", "keithley_scripts/buffer_reset.lua"),
-#     "instrument_reset":   pkg_resources.resource_filename("cpdctrl", "keithley_scripts/smua_reset.lua"),
-# }
-scripts = {
-
-    "instrument_reset": "~/cpd-dev/cpdctrl/cpdctrl/keithley_scripts/reset.scpi",
-}
-
-
-def enumerate_devices(visa_backend="", query="GPIB?*::INSTR") -> list[str]:
-    """
-    Enumerate all devices matching the query.
-    Parameters
-    ----------
-    visa_backend
-        The Visa backend to use (eg. "@py" for pyvisa-py, "@sim" for pyvisa-sim).
-       If not specified, the default backend is used.
-    query
-       The query to use to find devices. To list all, use "?*::INSTR".
-
-    Returns
-    -------
-
-    """
-    rm = pyvisa.ResourceManager(visa_backend)
-    resources = rm.list_resources(query=query)
-    return resources
-
-
-def select_visa_device(visa_backend="", query="GPIB?*::INSTR") -> pyvisa.resources.Resource:
-    """
-    Select a Visa device interactively from the command line
-    Parameters
-    ----------
-    visa_backend
-       The Visa backend to use (eg. "@py" for pyvisa-py, "@sim" for pyvisa-sim).
-       If not specified, the default backend is used.
-    query
-      The query to use to find devices. To list all, use "?*::INSTR".
-
-    Returns
-    -------
-    pyvisa.resources.Resource : The selected Visa device
-    """
-    rm = pyvisa.ResourceManager(visa_backend)
-    resources = rm.list_resources(query=query)
-    if len(resources) < 1:
-        raise Exception("No resources found.")
-    elif len(resources) == 1:
-        print(f"Opening the only resource found: {resources[0]}")
-        return rm.open_resource(resources[0])
-    else:  # len(resources) > 1:
-        print("Resources:")
-        for i, r in enumerate(resources):
-            print(f"{i+1:02}: {r}")
-        while True:
-            try:
-                instr = int(input("Select an instrument: ")) - 1
-                if instr < 0 or instr >= len(resources):
-                    raise ValueError
-                return rm.open_resource(resources[instr])
-            except ValueError:
-                print(f"Enter a number between 1 and {len(resources)}")
-                continue
-    raise Exception("This should never happen")
-
+from ...utility.visa import enumerate_devices
 
 class Keithley2700(VoltageMeasurementDevice):
     """
@@ -317,11 +246,13 @@ class Keithley2700(VoltageMeasurementDevice):
             pass
         print("Measurement stopped" + " "*50)
 
-def init(name=None, visa_backend=""):
-    if name:
-        rm = pyvisa.ResourceManager(visa_backend)
-        instr = rm.open_resource(name)
-    else:
-        instr = select_visa_device(name=name)
-    return Keithley2700(instr)
+    @staticmethod
+    def enumerate_devices(query="(GPIB)|(USB)?*:INSTR"):
+        return enumerate_devices("MODEL 2700", query)
+
+    @staticmethod
+    def connect_device(name):
+        rm = pyvisa.ResourceManager()
+        instr = rm.open_resource(name)
+        return Keithley2700(instr)