diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 35eb1ddfbbc029bcab630581847471d7f238ec53..ad6e05a2d19ec1157890da37188ca7444bcc37ac 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -2,5 +2,7 @@
 <project version="4">
   <component name="VcsDirectoryMappings">
     <mapping directory="" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/src/FlexSensor/resources/cmp" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/src/FlexSensor/resources/resources/cmp" vcs="Git" />
   </component>
 </project>
\ No newline at end of file
diff --git a/AppSettings.yaml b/AppSettings.yaml
deleted file mode 100644
index 557b455709db5e2b78e8218c47f70536a6b0ded2..0000000000000000000000000000000000000000
--- a/AppSettings.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-# - Configuration file stored 2023-11-24 11:46:57.988160 - 
-AppSettings: #!!python/object:controller.AppSettings
- ENABLE_CUSTOM_TITLE_BAR: True # ENABLE_CUSTOM_TITLE_BAR: None
- MENU_WIDTH: 240 # MENU_WIDTH: None
- LEFT_BOX_WIDTH: 240 # LEFT_BOX_WIDTH: None
- RIGHT_BOX_WIDTH: 240 # RIGHT_BOX_WIDTH: None
- TIME_ANIMATION: 500 # TIME_ANIMATION: None
- BTN_LEFT_BOX_COLOR: "background-color: rgb(44, 49, 58);" # BTN_LEFT_BOX_COLOR: None
- BTN_RIGHT_BOX_COLOR: "background-color: #ff79c6;" # BTN_RIGHT_BOX_COLOR: None
- MENU_SELECTED_STYLESHEET: "
-           border-left: 22px solid qlineargradient(spread:pad, x1:0.034, y1:0, x2:0.216, y2:0, stop:0.499 rgba(255, 121, 198, 255), stop:0.5 rgba(85, 170, 255, 0));
-           background-color: rgb(40, 44, 52);
-           " # MENU_SELECTED_STYLESHEET: None
diff --git a/CaptDeviceConfig.yaml b/CaptDeviceConfig.yaml
deleted file mode 100644
index a484f38a70ec7e09d1871b8543d0e689735a4872..0000000000000000000000000000000000000000
--- a/CaptDeviceConfig.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-# - Configuration file stored 2023-11-24 11:46:57.990884 - 
-CaptDeviceConfig: #!!python/object:controller.CaptDeviceConfig
- sample_rate: 50000 # Sample rate: Sample rate of the device
- streaming_rate: 500 # Streaming rate: Streaming rate in Hz (should be below 1kHz)
- ain_channel: 0 # Analog In Channel: Analog in channel. Defines which channel is used for capturing.
- show_simulator: True # Show Simulators: Show available simulators in the device list provided by the DreamWaves API.
- streaming_history: 2000 # Streaming history (ms): Defines the range of the stream in ms
- total_samples: 200000 # total_samples: None
- sample_time: 45 # sample_time: None
- ad2_raw_out_file: "{output_directory}/measurement/ad2_raw/ad2_out_{wafer_nr}_{date}.csv" # ad2_raw_out_file: None
diff --git a/FlexSensorConfig.yaml b/FlexSensorConfig.yaml
deleted file mode 100644
index d910b23f859637e3b1f3ff4d985b54deaf16fcd2..0000000000000000000000000000000000000000
--- a/FlexSensorConfig.yaml
+++ /dev/null
@@ -1,49 +0,0 @@
-# - Configuration file stored 2023-11-24 11:47:09.019578 - 
-FlexSensorConfig: #!!python/object:controller.FlexSensorConfig
- wafer_version: "MaskARY1_Jakob_full" # Wafer Version: Wafer Version to be measured
- wafer_number: "T40741W177G0" # Wafer Number: Wafer Number to be measured
- output_directory: "@Path:<.>" # Output Directory: Measurement output directory
-
-# Sub-Configurations
- wafer_config: #!!python/object:controller.WaferConfig
-   dies: "MaskARY1_Jakob_full" # dies: None
-   structure_file: "@Path:<H:/ET PhD - Dokumente/Silicon Photonics/FlexSensor 6/flexsensor-public/flexsensor/jakob.vas>" # structure_file: None
-   wafermap_file: "@Path:<H:/ET PhD - Dokumente/Silicon Photonics/FlexSensor 6/flexsensor-public/flexsensor/Wafermapary1_48dies.map>" # wafermap_file: None
-   log_file: "@Path:<{output_directory}/log_{date_time}.log>" # log_file: None
-   measurement_output: "@Path:<{output_directory}/measurement/measurement_{date_time}.csv>" # measurement_output: None
-   measurement_mat_file: "@Path:<{output_directory}/measurement/measurement_die_{die}_struct_{structure}_{date_time}_{it}.mat>" # measurement_mat_file: None
-   scope_image_file: "@Path:<{output_directory}/scope_shots/scope_{wafer_nr}_die_{die}_struct_{structure}_{time}.png>" # scope_image_file: None
-   bookmark_file: "@Path:<{output_directory}/klayout_bookmarks/bookmarks_{wafer_version}.lyb>" # bookmark_file: None
-
- app_config: #!!python/object:controller.AppSettings
-   ENABLE_CUSTOM_TITLE_BAR: True # ENABLE_CUSTOM_TITLE_BAR: None
-   MENU_WIDTH: 240 # MENU_WIDTH: None
-   LEFT_BOX_WIDTH: 240 # LEFT_BOX_WIDTH: None
-   RIGHT_BOX_WIDTH: 240 # RIGHT_BOX_WIDTH: None
-   TIME_ANIMATION: 500 # TIME_ANIMATION: None
-   BTN_LEFT_BOX_COLOR: "background-color: rgb(44, 49, 58);" # BTN_LEFT_BOX_COLOR: None
-   BTN_RIGHT_BOX_COLOR: "background-color: #ff79c6;" # BTN_RIGHT_BOX_COLOR: None
-   MENU_SELECTED_STYLESHEET: "
-           border-left: 22px solid qlineargradient(spread:pad, x1:0.034, y1:0, x2:0.216, y2:0, stop:0.499 rgba(255, 121, 198, 255), stop:0.5 rgba(85, 170, 255, 0));
-           background-color: rgb(40, 44, 52);
-           " # MENU_SELECTED_STYLESHEET: None
-
- laser_config: #!!python/object:controller.LaserConfig
-   wl_sweep_start: 850 # wl_sweep_start: None
-   wl_sweep_stop: 850 # wl_sweep_stop: None
-   velocity: 1.0 # velocity: None
-   acceleration: 2.0 # acceleration: None
-   deceleration: 1.0 # deceleration: None
-   available_ports: ['USB0', 'USB1', 'USB2', 'USB3', 'USB4', 'USB5', 'USB6', 'USB7', 'USB8', 'USB9'] # available_ports: None
-   port: "USB0" # port: None
-
- captdev_config: #!!python/object:controller.CaptDeviceConfig
-   sample_rate: 50000 # Sample rate: Sample rate of the device
-   streaming_rate: 500 # Streaming rate: Streaming rate in Hz (should be below 1kHz)
-   ain_channel: 0 # Analog In Channel: Analog in channel. Defines which channel is used for capturing.
-   show_simulator: True # Show Simulators: Show available simulators in the device list provided by the DreamWaves API.
-   streaming_history: 2000 # Streaming history (ms): Defines the range of the stream in ms
-   total_samples: 200000 # total_samples: None
-   sample_time: 45 # sample_time: None
-   ad2_raw_out_file: "{output_directory}/measurement/ad2_raw/ad2_out_{wafer_nr}_{date}.csv" # ad2_raw_out_file: None
-
diff --git a/LaserConfig.yaml b/LaserConfig.yaml
deleted file mode 100644
index ccc8b9899ade4f6c374944bd21f91583b664384f..0000000000000000000000000000000000000000
--- a/LaserConfig.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-# - Configuration file stored 2023-11-24 11:46:57.989159 - 
-LaserConfig: #!!python/object:controller.LaserConfig
- wl_sweep_start: 840 # wl_sweep_start: None
- wl_sweep_stop: 850 # wl_sweep_stop: None
- velocity: 2.0 # velocity: None
- acceleration: 1.0 # acceleration: None
- deceleration: 1.0 # deceleration: None
- available_ports: ['USB0', 'USB1', 'USB2', 'USB3', 'USB4', 'USB5', 'USB6', 'USB7', 'USB8', 'USB9'] # available_ports: None
- port: "USB0" # port: None
diff --git a/WaferConfig.yaml b/WaferConfig.yaml
deleted file mode 100644
index eb6f68d85f7f5b6bbdc1f1d11a1ad2e3aec267b4..0000000000000000000000000000000000000000
--- a/WaferConfig.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-# - Configuration file stored 2023-11-24 11:46:57.988160 - 
-WaferConfig: #!!python/object:controller.WaferConfig
- dies: "MaskARY1_Jakob_full" # dies: None
- structure_file: "@Path:<../vas-files/list_of_structures_picasso.vas>" # structure_file: None
- wafermap_file: "@Path:<../Wafermapary1_48dies.map>" # wafermap_file: None
- log_file: "@Path:<{output_directory}/log_{date_time}.log>" # log_file: None
- measurement_output: "@Path:<{output_directory}/measurement/measurement_{date_time}.csv>" # measurement_output: None
- measurement_mat_file: "@Path:<{output_directory}/measurement/measurement_die_{die}_struct_{structure}_{date_time}_{it}.mat>" # measurement_mat_file: None
- scope_image_file: "@Path:<{output_directory}/scope_shots/scope_{wafer_nr}_die_{die}_struct_{structure}_{time}.png>" # scope_image_file: None
- bookmark_file: "@Path:<{output_directory}/klayout_bookmarks/bookmarks_{wafer_version}.lyb>" # bookmark_file: None
diff --git a/examples/main.py b/examples/main.py
index 40281bc3c8baeb0fce959e80ef56151478defa82..d93dd730418bc4d0d9e0aa6c85b2f55d8783f84e 100644
--- a/examples/main.py
+++ b/examples/main.py
@@ -6,6 +6,7 @@ Package Version:
 """
 import logging
 import sys
+import time
 
 from PySide6.QtWidgets import QApplication
 
@@ -13,32 +14,37 @@ sys.path.append('./src')
 import FlexSensor
 
 def main(argv):
+    FlexSensor.ApplicationInit.setup_logging()
+    logging.info(f"Starting Velox GUI Version {FlexSensor.__version__}")
     app = QApplication(sys.argv)
     splash_screen = FlexSensor.SplashScreen._display_splash_screen()
-
+    splash_screen.show()
     app.processEvents()
 
     # Disable loggers that are not needed (e. g. numpy, etc)
     cw = FlexSensor.ConsoleWindow(app)
     #cw.show()
 
-    FlexSensor.ApplicationInit.setup_logging(cw)
+    #FlexSensor.ApplicationInit.setup_logging(cw)
     FlexSensor.ApplicationInit.set_icon(app)
 
     # Read the inital config file
+
     config = FlexSensor.ApplicationInit.load_config_file(f"{FlexSensor.configs_root}/init_config.yaml")
+    config.autosave(enable=True, path="autosave_configs/init_config.yaml")
+
 
-    logging.info(f"Starting Velox GUI Version {FlexSensor.__version__}")
     main_model = FlexSensor.MainThreadModel(config=config)
-    wdg = config.view.widget()
-    wdg.show()
+    #wdg = config.view.widget()
+    #wdg.show()
     main_controller = FlexSensor.MainThreadController(main_model)
     main_window = FlexSensor.MainWindow(main_model, main_controller)
 
     # test_win = StructureSelector()
-
+    #config.save(f"{FlexSensor.configs_root}/init_config.yaml")
     main_window.show()
     splash_screen.finish(main_window)
+
     sys.exit(app.exec())
 
 if __name__ == "__main__":
diff --git a/requirements.txt b/requirements.txt
index 8d69cc2ed181a49776947c7fdb96144d658218d5..e3fa87a58047382e56f85d700e0de12b23840249 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,17 +6,14 @@ pyqtgraph
 pandas
 
 # Custom added packages
-#git+https://gitlab.tugraz.at/flexsensor-public/confighandler.git@develop
-../confighandler
-
-#git+https://gitlab.tugraz.at/flexsensor-public/captdevicecontrol.git@develop
-../captdevicecontrol
-
-#git+https://gitlab.tugraz.at/flexsensor-public/lasercontrol.git@develop
-../lasercontrol
-
+git+https://gitlab.tugraz.at/flexsensor-public/modules/confighandler.git@develop
+git+https://gitlab.tugraz.at/flexsensor-public/modules/fswidgets.git@develop
+git+https://gitlab.tugraz.at/flexsensor-public/captdevicecontrol.git@develop
+git+https://gitlab.tugraz.at/flexsensor-public/lasercontrol.git@develop
 #git+https://gitlab.tugraz.at/flexsensor-public/mcpy.git@develop
-../mcpy
 
-#git+https://gitlab.tugraz.at/flexsensor-public/fswidgets.git@develop
-../fswidgets
\ No newline at end of file
+#../tools/confighandler
+#../captdevicecontrol
+#../lasercontrol
+../mcpy
+#../tools/fswidgets
\ No newline at end of file
diff --git a/src/FlexSensor/AppSettings.py b/src/FlexSensor/AppSettings.py
index d93fb95048a4d1fe47899f335f368c36773b9034..5c6bde698280b498685c4ac4ae257550d2829822 100644
--- a/src/FlexSensor/AppSettings.py
+++ b/src/FlexSensor/AppSettings.py
@@ -4,6 +4,8 @@ Author(s): Christoph Schmidt <christoph.schmidt@tugraz.at>
 Created: 2023-10-19 12:35
 Package Version:
 """
+import logging
+
 import confighandler as cfg
 
 
diff --git a/src/FlexSensor/FSBase.py b/src/FlexSensor/FSBase.py
new file mode 100644
index 0000000000000000000000000000000000000000..0ce4962e2b591fff98bae3114fa999ae72c18898
--- /dev/null
+++ b/src/FlexSensor/FSBase.py
@@ -0,0 +1,79 @@
+import logging
+import time
+
+from rich.logging import RichHandler
+
+
+class FSBase:
+
+    # ==================================================================================================================
+    # Public methods
+    # ==================================================================================================================
+    def __init__(self):
+        self._internal_logger = None
+        self._internal_log_handler = None
+        self.name = self.__class__.__name__
+
+    def create_new_logger(self, logger_name: str, logger_handler: logging.Handler = logging.NullHandler(),
+                          enabled=True, level=logging.DEBUG, propagate=True) -> logging.Logger:
+        # logger_handler.setLevel(level)
+        _internal_logger = logging.getLogger(logger_name)
+        _internal_logger.handlers = [logger_handler]
+        _internal_logger.propagate = propagate
+        _internal_logger.setLevel(level)
+
+        if enabled:
+            _internal_logger.disabled = False
+            _internal_logger.info(f"Logger {logger_name} created with ({len(_internal_logger.handlers)}) "
+                                  f"handlers and has been enabled (Level {_internal_logger.level}).")
+        else:
+            _internal_logger.info(f"Logger {logger_name} created and has been disabled.")
+            _internal_logger.disabled = True
+
+        return _internal_logger
+
+    def set_log_enabled(self, logger: logging.log, enable: bool) -> None:
+        """
+        Enables or disables internal logging. If disabled, the internal logger will be disabled and no messages will be
+        emitted to the state queue.
+        :param enable: True to enable, False to disable
+
+        Args:
+            logger:
+        """
+        if logger is not None:
+            if enable:
+                logger.disabled = False
+                logger.info(f"Internal logger of {self.name} has been enabled.")
+
+            else:
+                logger.warning(f"Internal logger of {self.name} has been disabled.")
+                logger.disabled = True
+        else:
+            raise Exception(f"Can't enable or disable {logger}.")  #
+
+    def set_log_level(self, logger: logging.log, level: int) -> None:
+        """
+        Sets the internal logging level.
+        :param level:
+        :return:
+
+        Args:
+            logger:
+        """
+        if logger is not None:
+            if level == logging.DEBUG:
+                logger.info(f"Internal log level of {self.__class__.__name__} has been set to DEBUG.")
+            elif level == logging.INFO:
+                logger.info(f"Internal log level of {self.__class__.__name__} has been set to INFO.")
+            elif level == logging.WARNING:
+                logger.info(f"Internal log level of {self.__class__.__name__} has been set to WARNING.")
+            elif level == logging.ERROR:
+                logger.info(f"Internal log level of {self.__class__.__name__} has been set to ERROR.")
+            elif level == logging.CRITICAL:
+                logger.info(f"Internal log level of {self.__class__.__name__} has been set to CRITICAL.")
+            else:
+                logger.info(f"Internal log level of {self.__class__.__name__} has been set to level {level}.")
+            logger.handlers[0].setLevel(level)
+        else:
+            raise Exception("Can't set internal log level. Internal logger not initialized")
diff --git a/src/FlexSensor/FlexSensorConfig.py b/src/FlexSensor/FlexSensorConfig.py
index baada5e511d438a1bdc71710a5b48d53ab765d30..f54603f9b0691a1b017df33a81e8ee5843b893d3 100644
--- a/src/FlexSensor/FlexSensorConfig.py
+++ b/src/FlexSensor/FlexSensorConfig.py
@@ -4,6 +4,7 @@ Author(s): Christoph Schmidt <christoph.schmidt@tugraz.at>
 Created: 2023-10-19 12:35
 Package Version:
 """
+import logging
 from pathlib import Path
 
 import confighandler as cfg
@@ -26,6 +27,9 @@ class FlexSensorConfig(cfg.ConfigNode):
         self.output_directory = cfg.Field(Path("./"), friendly_name="Output Directory",
                                      description="Measurement output directory")
 
+        self.log_file = cfg.Field("fs.log", friendly_name="Log File",
+                                          description="")
+
         self.wafer_config = WaferConfig()
         self.app_config = AppSettings()
         self.laser_config = Laser.Config()
diff --git a/src/FlexSensor/MainWindow/controller/MainThreadController.py b/src/FlexSensor/MainWindow/controller/MainThreadController.py
index 8d08d08bc2aa55d2ae519027a501dba8458ff39e..e73b03633fd98b6e081582daaffd2b5ac053e9da 100644
--- a/src/FlexSensor/MainWindow/controller/MainThreadController.py
+++ b/src/FlexSensor/MainWindow/controller/MainThreadController.py
@@ -1,6 +1,6 @@
 import logging
 
-from PySide6.QtCore import QThread
+from PySide6.QtCore import QThread, Signal
 
 import confighandler
 import LaserControl as Laser
@@ -13,12 +13,43 @@ from ..model.MainThreadModel import MainThreadModel
 from FlexSensor.MeasurementRoutines.MeasurementRoutine import MeasurementRoutine
 from Prober.controller.ProberController import ProberController
 
+from ...FSBase import FSBase
+
+
+class MainThreadController(FSBase, object):
+
+    on_start_laser_sweep = Signal(name='on_start_laser_sweep')
+
+    def __init__(self, model: MainThreadModel,
+                 enable_log: bool = True, log_level: int = logging.DEBUG, log_file: str = "flexsensor.log"):
+        super().__init__()
 
-class MainThreadController(object):
-    def __init__(self, model: MainThreadModel):
-        self.logger = logging.getLogger("MainThread")
         self._model = model
 
+        self._enable_log = enable_log
+        self._log_file = log_file
+        self._log_level = log_level
+
+        self.logger = self.create_new_logger(self.name,
+                                             enabled=self.enable_log, level=self.log_level)
+
+        self.model.ad2_model = AD2Dev.Model(self.model.config.captdev_config)
+        self.model.ad2_controller = AD2Dev.Controller(self.model.ad2_model, self.model.start_capture_flag)
+        self.model.ad2_window = AD2Dev.View(self.model.ad2_model, self.model.ad2_controller)
+
+        # Devices
+        self.model.laser_model = Laser.Model(self.model.config.laser_config)
+        self.model.laser_controller = Laser.Controller(self.model.laser_model, self.model.start_capture_flag,
+                                                       module_log_level=logging.DEBUG)
+
+        self.model.laser_window = Laser.View(self.model.laser_model, self.model.laser_controller)
+        self.model.laser_controller.connect_capture_device(self.model.ad2_controller)
+
+
+        self.model.prober_model = Prober.Model(self.model.config)
+        self.model.prober_controller = Prober.Controller(self.model.prober_model)
+        self.model.prober_window = Prober.ControlWindow(self.model.prober_model, self.model.prober_controller)
+
         # self.model._laser_controller.connect_device(self._vaut_config.laser_config.get_port())
 
         mypath = (
@@ -40,6 +71,18 @@ class MainThreadController(object):
     def model(self) -> MainThreadModel:
         return self._model
 
+    @property
+    def enable_log(self) -> bool:
+        return self._enable_log
+
+    @property
+    def log_file(self) -> str:
+        return self._log_file
+
+    @property
+    def log_level(self) -> int:
+        return self._log_level
+
     def start_measurement_routine(self):
         # 1. Create all working folders
         self._create_working_folders()
@@ -50,18 +93,20 @@ class MainThreadController(object):
         if self.measurement_thread.isRunning():
             self.logger.debug("Thread is running.")
 
+    def _on_start_laser_sweep_emitted(self):
+        self.logger.debug("Start laser sweep emitted.")
+
     def _create_working_folders(self):
         """Creates all working folders to store the measurement data.
         """
         pass
-        #self.model.config.setup_folders()
+        # self.model.config.setup_folders()
 
     def _move_measurement_routine_thread(self, measurement_routine):
         measurement_routine.moveToThread(self.measurement_thread)
         self.measurement_thread.started.connect(measurement_routine.run)
         self.logger.debug("Moved worker/measurement routine to thread and connected the signals.")
 
-
     def _load_measurement_routine(self) -> MeasurementRoutine:
         """
             Loads the measurement routine and initializes it.
@@ -72,8 +117,8 @@ class MainThreadController(object):
             Raises:
                 Exception: If some or all devices have not been initialized.
         """
-        if not self.device_are_init:
-            raise Exception("Some or all devices have not been initialized. First call `_device_initialization()`!")
+        # if not self.device_are_init:
+        #    raise Exception("Some or all devices have not been initialized. First call `_device_initialization()`!")
 
         measurement_routine = MeasurementRoutine(
             self.model.laser_controller,
@@ -87,7 +132,7 @@ class MainThreadController(object):
         """
             Initializes all devices and connects the signals and slots.
         """
-        self.model.ad2_controller.connect_device(0)
+        # self.model.ad2_controller.connect_device(0)
         # # Connect the required signals and slots
         # self.model.laser_model.signals.laser_ready_for_sweep_changed.connect(
         #     self.model.ad2_controller.start_capture_flag)
@@ -98,4 +143,4 @@ class MainThreadController(object):
         # self.model.laser_model.signals.wavelength_sweep_running_changed.connect(
         #     self.model.ad2_controller.set_ad2_acq_status)
 
-        self.device_are_init = True
+        self.device_are_init = False
diff --git a/src/FlexSensor/MainWindow/model/MainThreadModel.py b/src/FlexSensor/MainWindow/model/MainThreadModel.py
index 748f7cbe6d4107e10ae23aa68e73fcfd955f7b3d..c267f7f5920b5f170fcd65f9f91eb5d4bf6e7d7f 100644
--- a/src/FlexSensor/MainWindow/model/MainThreadModel.py
+++ b/src/FlexSensor/MainWindow/model/MainThreadModel.py
@@ -1,3 +1,5 @@
+from multiprocessing import Value
+
 from PySide6.QtCore import QObject, Signal
 
 import LaserControl as Laser
@@ -32,19 +34,20 @@ class MainThreadModel(QObject):
 
         self._measurement_routine: MeasurementRoutine = None
 
-        self._ad2_model: AD2Dev.Model = AD2Dev.Model(self.config.captdev_config)
-        self._ad2_controller: AD2Dev.Controller = AD2Dev.Controller(self._ad2_model)
-        self._ad2_window: AD2Dev.View = AD2Dev.View(self._ad2_model, self._ad2_controller)
+        self.start_capture_flag: Value = Value('i', 0)
+        self._ad2_model: AD2Dev.Model = None
+        self._ad2_controller: AD2Dev.Controller = None
+        self._ad2_window: AD2Dev.View = None
 
         # Devices
-        self._laser_model: Laser.Model = Laser.Model(self.config.laser_config)
-        self._laser_controller: Laser.Controller = Laser.Controller(self._laser_model)
+        self._laser_model: Laser.Model = None
+        self._laser_controller: Laser.Controller = None
+        self._laser_window: Laser.View =None
 
-        self._laser_window: Laser.View = Laser.View(self._laser_model, self._laser_controller)
 
-        self._prober_model: Prober.Model = Prober.Model(self.config)
-        self._prober_controller: Prober.Controller = Prober.Controller(self._prober_model)
-        self._prober_window: Prober.ControlWindow = Prober.ControlWindow(self._prober_model, self._prober_controller)
+        self._prober_model: Prober.Model = None
+        self._prober_controller: Prober.Controller =None
+        self._prober_window: Prober.ControlWindow = None
 
         # Widgets
         self.mea_eval_tool_model: met.Model = met.Model()
diff --git a/src/FlexSensor/MainWindow/view/MainThreadView.py b/src/FlexSensor/MainWindow/view/MainThreadView.py
index 5f0951a5bd57e53d2b56fc262aad10443b3155bb..a2c6c93371b86e78069238354026e4b496b6186e 100644
--- a/src/FlexSensor/MainWindow/view/MainThreadView.py
+++ b/src/FlexSensor/MainWindow/view/MainThreadView.py
@@ -13,6 +13,8 @@ from pyqtgraph.dockarea import *
 
 import FlexSensor.__version__ as fsversion
 import confighandler as Config
+
+from FlexSensor.FSBase import FSBase
 from FlexSensor.MainWindow.view.BaseWindow import BaseWindow
 from FlexSensor.MainWindow.view.widgets.HomeStatusWidget import HomeStatusWidget
 from FlexSensor.MainWindow.view.widgets.MenuBarDefinition import MenuBarDefinition
@@ -32,11 +34,13 @@ from FlexSensor.constants.qs_style_sheets import CSSPlayPushButton
 from FlexSensor.generics.VASInputFileParser import VASInputFileParser
 
 
-class MainWindow(BaseWindow):
+class MainWindow(BaseWindow, FSBase):
 
     def __init__(self, model: MainThreadModel, controller: MainThreadController):
         super().__init__(Ui_MainWindow(), model.config)
-        self.logger = logging.getLogger("MainThread (UI)")
+        self.logger = self.create_new_logger(
+            self.name
+        )
 
         self._model: MainThreadModel = model
         self._controller: MainThreadController = controller
@@ -129,7 +133,7 @@ class MainWindow(BaseWindow):
         self.configView = self.model.config.view
         tab_input = tabwidget.addTab(WidgetSettingsInFilesFolders(self.model.config), "Input")
         tab_folders = tabwidget.addTab(WidgetSettingsOutFilesFolders(self.model.config), "Folder Settings")
-        tab_ad2 = tabwidget.addTab(WidgetAD2Settings(self.model.config), "AD2 Settings")
+        tab_ad2 = tabwidget.addTab(WidgetAD2Settings(self.model.config.captdev_config), "AD2 Settings")
         tab_laser = tabwidget.addTab(WidgetLaserSettings(self.model.config.laser_config), "Laser Settings")
         #tab_yaml = tabwidget.addTab(self.configView, "YAML Config")
         #tabwidget.currentChanged.connect(
@@ -381,7 +385,7 @@ class MainWindow(BaseWindow):
 
     def closeEvent(self, event):
         # do stuff
-        self.model.ad2_controller.stop_process()
+        self.model.ad2_controller.exit()
         self.model.laser_controller.stop_process()
         event.accept() # let the window close
 
diff --git a/src/FlexSensor/MainWindow/view/widgets/WidgetSettingsFilesFolders.py b/src/FlexSensor/MainWindow/view/widgets/WidgetSettingsFilesFolders.py
index 903c0e26ce83531547e3cd739b9aaa1680c993cb..5dce441d8e979409ef92ccb92dcd4d4596118147 100644
--- a/src/FlexSensor/MainWindow/view/widgets/WidgetSettingsFilesFolders.py
+++ b/src/FlexSensor/MainWindow/view/widgets/WidgetSettingsFilesFolders.py
@@ -1,6 +1,7 @@
 import confighandler
 from LaserControl.LaserConfig import LaserConfig
-from PySide6.QtWidgets import QWidget, QGridLayout, QGroupBox, QLineEdit, QPushButton, QLabel, QDoubleSpinBox
+from PySide6.QtWidgets import QWidget, QGridLayout, QGroupBox, QLineEdit, QPushButton, QLabel, QDoubleSpinBox, \
+    QTreeWidget
 
 from FlexSensor.FlexSensorConfig import FlexSensorConfig
 
@@ -20,19 +21,10 @@ class WidgetSettingsInFilesFolders(QWidget):
         grid_group_box = QGroupBox("Input Files")
         layout = QGridLayout()
         # Working directory
-        self.tb_working_directory = QLineEdit(parent=self)
-        self.btn_select_working_directory.setMaximumWidth(self.btn_select_working_directory.sizeHint().height())
-        layout.addWidget(QLabel("Working directory"), 0, 0)
-        layout.addWidget(self.tb_working_directory, 0, 1)  # row, column, rowspan, colspan
-        layout.addWidget(self.btn_select_working_directory, 0, 3)  # row, column, rowspan, colspan
-        self.config.output_directory.view.add_new_view(self.tb_working_directory)
-        # List of structures
-        self.tb_list_of_structures = QLineEdit(parent=self)
-        self.btn_select_list_of_structures.setMaximumWidth(self.btn_select_list_of_structures.sizeHint().height())
-        layout.addWidget(QLabel("Input Structure File"), 1, 0)
-        layout.addWidget(self.tb_list_of_structures, 1, 1)  # row, column, rowspan, colspan
-        layout.addWidget(self.btn_select_list_of_structures, 1, 3)  # row, column, rowspan, colspan
-        self.config.wafer_config.structure_file.view.add_new_view(self.tb_list_of_structures)
+        layout.addWidget( self.config.output_directory.view.ui_field(), 0, 0)  # row, column, rowspan, colspan
+        layout.addWidget(self.config.wafer_config.wafermap_file.view.ui_field(), 1, 0)  # row, column, rowspan, colspan
+        layout.addWidget(self.config.wafer_config.structure_file.view.ui_field(), 2, 0)  # row, column, rowspan, colspan
+
 
         grid_group_box.setLayout(layout)
         self.layout.addWidget(grid_group_box)
@@ -60,48 +52,15 @@ class WidgetSettingsOutFilesFolders(QWidget):
 
     def init_UI(self):
         layout = QGridLayout()
-        grid_group_box = QGroupBox("Output Files")
+        grid_group_box = QGroupBox("Analog Discovery 2 Settings")
         grid_group_box.setLayout(layout)
+        layout.addWidget(self.config.view.widget(max_level=0), 0, 0)
+        tree = QTreeWidget()
 
-        self.lbl_log_file = QLabel(parent=self)
-        self.tb_log_file.textChanged.connect(self.on_tb_log_file_text_changed)
-        self.on_tb_log_file_text_changed(self.tb_log_file.text())
-        layout.addWidget(QLabel("Log File"), 0, 0)  # row, column, rowspan, colspan
-        layout.addWidget(self.tb_log_file, 0, 1)  # row, column, rowspan, colspan
-        layout.addWidget(self.lbl_log_file, 1, 0, 1, 2)  # row, column, rowspan, colspan
-
-        # measurement output
-        self.lbl_measurement_output = QLabel(parent=self)
-        self.tb_measurement_output.textChanged.connect(self.on_tb_measurement_output_text_changed)
-        self.on_tb_measurement_output_text_changed(self.tb_measurement_output.text())
-        layout.addWidget(QLabel("Measurement output"), 2, 0)  # row, column, rowspan, colspan
-        layout.addWidget(self.tb_measurement_output, 2, 1)  # row, column, rowspan, colspan
-        layout.addWidget(self.lbl_measurement_output, 3, 0, 1, 2)  # row, column, rowspan, colspan
-
-        # Mat files output
-        self.lbl_mat_files_output = QLabel(parent=self)
-        self.on_tb_mat_files_output_text_changed(self.tb_mat_files_output.text())
-
-        self.tb_mat_files_output.textChanged.connect(self.on_tb_mat_files_output_text_changed)
-        layout.addWidget(QLabel("Matlab Files"), 4, 0)  # row, column, rowspan, colspan
-        layout.addWidget(self.tb_mat_files_output, 4, 1)  # row, column, rowspan, colspan
-        layout.addWidget(self.lbl_mat_files_output, 5, 0, 1, 2)  # row, column, rowspan, colspan
-
-        # bookmark files
-        self.lbl_bookmark_file = QLabel(parent=self)
-        self.on_tb_bookmark_file_text_changed(self.tb_bookmark_file.text())
-        self.tb_bookmark_file.textChanged.connect(self.on_tb_bookmark_file_text_changed)
-        self.tb_scope_image_file.textChanged.connect(self.on_tb_scope_image_file_text_changed)
-        layout.addWidget(QLabel("Bookmark files"), 6, 0)  # row, column, rowspan, colspan
-        layout.addWidget(self.tb_bookmark_file, 6, 1)  # row, column, rowspan, colspan
-        layout.addWidget(self.lbl_bookmark_file, 7, 0, 1, 2)  # row, column, rowspan, colspan
-
-        # scope shots
-        self.lbl_scope_image_file = QLabel(parent=self)
-        self.on_tb_scope_image_file_text_changed(self.tb_scope_image_file.text())
-        layout.addWidget(QLabel("Scope Shots"), 8, 0)  # row, column, rowspan, colspan
-        layout.addWidget(self.tb_scope_image_file, 8, 1)  # row, column, rowspan, colspan
-        layout.addWidget(self.lbl_scope_image_file, 9, 0, 1, 2)
+        tree.setColumnCount(3)
+        tree.setHeaderLabels(["Name", "Type", "Description"])
+        tree.addTopLevelItem(self.config.view.ui_tree_widget_item(tree, max_level=0))
+        layout.addWidget(tree, 1, 0)
 
         self.layout.addWidget(grid_group_box)
         self.setLayout(self.layout)
@@ -183,48 +142,13 @@ class WidgetAD2Settings(QWidget):
         layout = QGridLayout()
         grid_group_box = QGroupBox("Analog Discovery 2 Settings")
         grid_group_box.setLayout(layout)
+        layout.addWidget(self.config.view.widget(), 0, 0)
+        tree = QTreeWidget()
 
-        lbl_sample_rate = QLabel("Sample Rate")
-        layout.addWidget(lbl_sample_rate, 1, 0)
-        #self.num_sample_rate.valueChanged.connect(lambda v: self.config.ad2_device_config.set_sample_rate(v))
-        self.num_sample_rate.setRange(0, 10 ** 8)
-        self.num_sample_rate.setSingleStep(1)
-        #self.num_sample_rate.setValue(self.config.ad2_device_config.get_sample_rate())
-        self.num_sample_rate.setSuffix(" Hz")
-        self.num_sample_rate.setDecimals(3)
-        self.num_sample_rate.setKeyboardTracking(False)
-        layout.addWidget(self.num_sample_rate, 1, 1, 1, 2)
-        self.config.captdev_config.sample_rate.view.add_new_view(self.num_sample_rate)
-
-        lbl_total_samples = QLabel("Total Samples")
-        layout.addWidget(lbl_total_samples, 2, 0)
-        self.num_total_samples.setRange(0, 10 ** 8)
-        self.num_total_samples.setSingleStep(1)
-        #self.num_total_samples.setValue(self.config.ad2_device_config.get_total_samples())
-        self.num_total_samples.setDecimals(3)
-        self.num_total_samples.setKeyboardTracking(False)
-        self.config.captdev_config.total_samples.view.add_new_view(self.num_total_samples)
-        layout.addWidget(self.num_total_samples, 2, 1, 1, 2)
-
-
-
-        lbl_sample_time = QLabel("Sample Time")
-        layout.addWidget(lbl_sample_time, 3, 0)
-        self.num_sample_time.setRange(0, 10 ** 8)
-        self.num_sample_time.setSingleStep(1)
-        #self.num_sample_time.setValue(self.config.ad2_device_config.get_sample_time())
-        self.num_sample_time.setSuffix(" s")
-        self.num_sample_time.setDecimals(3)
-        self.num_sample_time.setKeyboardTracking(False)
-        self.config.captdev_config.sample_time.view.add_new_view(self.num_sample_time)
-        layout.addWidget(self.num_sample_time, 3, 1, 1, 2)
-
-        lbl_ad2_raw_out_file = QLabel("Raw Out File")
-        layout.addWidget(lbl_ad2_raw_out_file, 4, 0)
-        #self.tb_ad2_raw_out_file = QLineEdit()
-        self.config.captdev_config.ad2_raw_out_file.view.add_new_view(self.tb_ad2_raw_out_file)
-        layout.addWidget(self.tb_ad2_raw_out_file, 4, 1)
-        layout.addWidget(self.btn_select_ad2_raw_out_file, 4, 2)
+        tree.setColumnCount(3)
+        tree.setHeaderLabels(["Name", "Type", "Description"])
+        tree.addTopLevelItem(self.config.view.ui_tree_widget_item(tree))
+        layout.addWidget(tree, 1, 0)
 
         self.layout.addWidget(grid_group_box)
         self.setLayout(self.layout)
@@ -257,72 +181,13 @@ class WidgetLaserSettings(QWidget):
         layout = QGridLayout()
         grid_group_box = QGroupBox("Laser Settings")
         grid_group_box.setLayout(layout)
+        layout.addWidget(self.config.view.widget(), 0, 0)
+        tree = QTreeWidget()
 
-        lbl_wavelength_sweep_start = QLabel("Wavelength Sweep")
-        layout.addWidget(lbl_wavelength_sweep_start, 1, 0)
-
-        self.num_wavelength_sweep_start.setRange(0, 10 ** 8)
-        self.num_wavelength_sweep_start.setSingleStep(1)
-        #self.num_wavelength_sweep_start.setValue(self.config.wa()[0])
-        self.num_wavelength_sweep_start.setSuffix(" nm")
-        self.num_wavelength_sweep_start.setDecimals(3)
-        self.num_wavelength_sweep_start.setKeyboardTracking(False)
-        self.config.wl_sweep_start.view.add_new_view(self.num_wavelength_sweep_start)
-        layout.addWidget(self.num_wavelength_sweep_start, 1, 1)
-        #self.num_wavelength_sweep_start.valueChanged.connect(
-        #    lambda v: self.config.laser_config.set_wavelength_range(
-        #        [float(v), float(self.num_wavelength_range_stop.value())])
-        #)
-
-        self.num_wavelength_range_stop.setRange(0, 10 ** 8)
-        self.num_wavelength_range_stop.setSingleStep(1)
-        #self.num_wavelength_range_stop.setValue(self.config.laser_config.get_wavelength_range()[1])
-        self.num_wavelength_range_stop.setSuffix(" nm")
-        self.num_wavelength_range_stop.setDecimals(3)
-        self.num_wavelength_range_stop.setKeyboardTracking(False)
-        self.config.wl_sweep_stop.view.add_new_view(self.num_wavelength_sweep_start)
-        layout.addWidget(self.num_wavelength_range_stop, 1, 2)
-
-        #self.num_wavelength_range_stop.valueChanged.connect(
-        #    lambda v: self.wavelength_range.get()(
-        #        [float(self.num_wavelength_sweep_start.value()), float(v)]
-        #    ))
-
-        lbl_velocity = QLabel("Velocity")
-        layout.addWidget(lbl_velocity, 2, 0)
-        #self.num_velocity.valueChanged.connect(lambda v: self.config.laser_config.set_velocity(v))
-        self.num_velocity.setRange(0, 10 ** 8)
-        self.num_velocity.setSingleStep(1)
-        #self.num_velocity.setValue(self.config.laser_config.get_velocity())
-        self.num_velocity.setSuffix(" m/s")
-        self.num_velocity.setDecimals(3)
-        self.num_velocity.setKeyboardTracking(False)
-        self.config.velocity.view.add_new_view(self.num_velocity)
-        layout.addWidget(self.num_velocity, 2, 1, 1, 2)
-
-        lbl_acceleration = QLabel("Acceleration")
-        layout.addWidget(lbl_acceleration, 3, 0)
-        #self.num_acceleration.valueChanged.connect(lambda v: self.config.laser_config.set_acceleration(v))
-        self.num_acceleration.setRange(0, 10 ** 8)
-        self.num_acceleration.setSingleStep(1)
-        #self.num_acceleration.setValue(self.config.laser_config.get_acceleration())
-        self.num_acceleration.setSuffix(" m/s^2")
-        self.num_acceleration.setDecimals(3)
-        self.num_acceleration.setKeyboardTracking(False)
-        self.config.acceleration.view.add_new_view(self.num_acceleration)
-        layout.addWidget(self.num_acceleration, 3, 1, 1, 2)
-
-        lbl_deceleration = QLabel("Deceleration")
-        layout.addWidget(lbl_deceleration, 4, 0)
-        #self.num_deceleration.valueChanged.connect(lambda v: self.config.laser_config.set_deceleration(v))
-        self.num_deceleration.setRange(0, 10 ** 8)
-        self.num_deceleration.setSingleStep(1)
-        #self.num_deceleration.setValue(self.config.laser_config.get_deceleration())
-        self.num_deceleration.setSuffix(" m/s^2")
-        self.num_deceleration.setDecimals(3)
-        self.num_deceleration.setKeyboardTracking(False)
-        self.config.deceleration.view.add_new_view(self.num_deceleration)
-        layout.addWidget(self.num_deceleration, 4, 1, 1, 2)
+        tree.setColumnCount(3)
+        tree.setHeaderLabels(["Name", "Type", "Description"])
+        tree.addTopLevelItem(self.config.view.ui_tree_widget_item(tree))
+        layout.addWidget(tree, 1, 0)
 
         self.layout.addWidget(grid_group_box)
         self.setLayout(self.layout)
diff --git a/src/FlexSensor/MeasurementData/MeasuredData/MeasuredData.py b/src/FlexSensor/MeasurementData/MeasuredData/MeasuredData.py
index 9f8c4d1a8ebce10b50d91808c4755d81e849635e..6c6fb5c447b1450d1415d5f78c329423ce0b6d66 100644
--- a/src/FlexSensor/MeasurementData/MeasuredData/MeasuredData.py
+++ b/src/FlexSensor/MeasurementData/MeasuredData/MeasuredData.py
@@ -49,7 +49,7 @@ class MeasuredData:
 
         # ==============================================================================================================
         # COnnect the signals
-        self._measurement_properties.find_peaks.properties_changed.connect(self.find_peaks)
+        self.measurement_properties.find_peaks.properties_changed.connect(self.find_peaks)
 
     # ==================================================================================================================
     #
diff --git a/src/FlexSensor/MeasurementData/MeasuredData/MultiMeasuredData.py b/src/FlexSensor/MeasurementData/MeasuredData/MultiMeasuredData.py
index 37c00a116e6c7f58140c5b7f795f41a5ae6e5b92..bdf48ef3936c1763a7e680ee80f67b97c86250ef 100644
--- a/src/FlexSensor/MeasurementData/MeasuredData/MultiMeasuredData.py
+++ b/src/FlexSensor/MeasurementData/MeasuredData/MultiMeasuredData.py
@@ -124,7 +124,7 @@ class MultiMeasuredData(MeasuredData):
 
 
 if __name__ == "__main__":
-    setup_logging()
+    #setup_logging()
 
     mypath = 'E:\measurements_06032022\measurements_06032022\mea_mzi2_2_2022_03_06\T40741W177G0\MaskARY1_Jakob\measurement_small'
     mm_data = MeasurementDataLoader.from_folder(mypath)
diff --git a/src/FlexSensor/MeasurementData/MeasuredData/SingleMeasuredData.py b/src/FlexSensor/MeasurementData/MeasuredData/SingleMeasuredData.py
index 97877e5b59973d17780965608e26b9d84ba91835..e4aa424473ccd078507ae6f69246d07d7f42ba4b 100644
--- a/src/FlexSensor/MeasurementData/MeasuredData/SingleMeasuredData.py
+++ b/src/FlexSensor/MeasurementData/MeasuredData/SingleMeasuredData.py
@@ -655,7 +655,7 @@ if __name__ == "__main__":
     app = QApplication()
 
     # Load a mat file from E:\03_Simulations\03_Simulations\measurements\Ary1 using scipy
-    setup_logging()
+    #setup_logging()
     # filename = r"E:\03_Simulations\03_Simulations\measurements\Ary1\Ary1_2021-03-10_15-00-00.mat"
     data1 = SingleMeasuredData.from_mat(
         r"support/measurement_die_22_struct_mzi2_2_20220306_1908_rep_11.mat"
diff --git a/src/FlexSensor/MeasurementRoutines/BasemeasurementRoutine.py b/src/FlexSensor/MeasurementRoutines/BasemeasurementRoutine.py
index a471bcfd9e41841181ee5f55c6c9ff8dabf833e0..5d74c2ac9f1ce727b2294a3027704d2628d29131 100644
--- a/src/FlexSensor/MeasurementRoutines/BasemeasurementRoutine.py
+++ b/src/FlexSensor/MeasurementRoutines/BasemeasurementRoutine.py
@@ -11,20 +11,21 @@ import CaptDeviceControl as CaptDevice
 import LaserControl as Laser
 import confighandler as Config
 
+from FlexSensor.FSBase import FSBase
 from FlexSensor.FlexSensorConfig import FlexSensorConfig
 from FlexSensor.Prober.controller.ProberController import ProberController
 from FlexSensor.MeasurementRoutines.WorkerSignals import WorkerSignals
 
 
-class BaseMeasurementRoutine(QObject):
+class BaseMeasurementRoutine(QObject, FSBase):
 
-    def __init__(self, laser: Laser, ad2device: CaptDevice, prober: ProberController, config: FlexSensorConfig):
+    def __init__(self, laser: Laser.Controller, ad2device: CaptDevice.Controller, prober: ProberController, config: FlexSensorConfig):
         super().__init__()
-        self.logger = logging.getLogger("Base Measurement Routine")
+        self.logger = self.create_new_logger(self.name)
         self.config = config
 
-        self.ad2device: CaptDevice = ad2device
-        self.laser: Laser = laser
+        self.ad2device: CaptDevice.Controller = ad2device
+        self.laser: Laser.Controller = laser
         self.prober: ProberController = prober
         self.logger.debug(f"{self.prober.report_kernel_version()}")
         print(self.prober)
diff --git a/src/FlexSensor/MeasurementRoutines/MeasurementRoutine.py b/src/FlexSensor/MeasurementRoutines/MeasurementRoutine.py
index 0bc9d5122a989edb872e4eb4846b8392448eb7de..b8e1fde3ab1edf8421cf73b7141e70072b6a8f31 100644
--- a/src/FlexSensor/MeasurementRoutines/MeasurementRoutine.py
+++ b/src/FlexSensor/MeasurementRoutines/MeasurementRoutine.py
@@ -1,4 +1,5 @@
 import logging
+import time
 import traceback
 from datetime import datetime
 
@@ -13,6 +14,8 @@ from generics.generics import pch
 import FlexSensor.Prober as Prober
 from FlexSensor.FlexSensorConfig import FlexSensorConfig
 from FlexSensor.MeasurementData.MeasuredData.SingleMeasuredData import SingleMeasuredData
+from FlexSensor.MeasurementData.Properties.AD2CaptDeviceProperties import AD2CaptDeviceProperties
+from FlexSensor.MeasurementData.Properties.LaserProperties import LaserProperties
 from FlexSensor.MeasurementData.Properties.MeasurementProperties import MPropertiesFindPeaks, \
     MeasurementProperties, WaveguidePropertiesMZI
 from FlexSensor.MeasurementData.Properties.WaferProperties import WaferProperties
@@ -56,19 +59,19 @@ class MeasurementRoutine(BaseMeasurementRoutine):
         self.probe_height = 80
 
         self.logger.info(
-            f"Init Prober Class. Number of runs per die: {self.number_of_runs}, dies {self.config.wafer_config.dies}\n"
+            f"Init Prober Class. Number of runs per die: {self.number_of_runs}, dies {self.config.wafer_config.dies.get()}\n"
             f"Measurement CVS File = {self.config.wafer_config.measurement_output}\n"
             f"Measurement Mat File = {self.config.wafer_config.measurement_mat_file}")
 
     @Slot()
     def run(self):
-        self.logger.info(f"<< Input file {self.config.wafer_config.get_structure_file().relative}")
-        self.logger.info(f">> Working directory {self.config.output_directory.get().relative}")
-        self.logger.info(f">> Log File {self.config.wafer_config.log_file.get().relative}")
-        self.logger.info(f">> Measurments CVS File {self.config.wafer_config.measurement_output().relative}")
-        self.logger.info(f">> Measurments Mat File {self.config.wafer_config.get_measurement_mat_file().relative}")
-        self.logger.info(f">> KLayout Bookmark file {self.config.wafer_config.get_bookmark_file().relative}")
-        self.logger.info(f">> Scope Image File {self.config.wafer_config.get_scope_image_file().relative}")
+        self.logger.info(f"<< Input file {self.config.wafer_config.structure_file.get()}")
+        self.logger.info(f">> Working directory {self.config.output_directory.get()}")
+        self.logger.info(f">> Log File {self.config.wafer_config.log_file.get()}")
+        self.logger.info(f">> Measurements CVS File {self.config.wafer_config.measurement_output.get()}")
+        self.logger.info(f">> Measurements Mat File {self.config.wafer_config.measurement_mat_file.get()}")
+        self.logger.info(f">> KLayout Bookmark file {self.config.wafer_config.bookmark_file.get()}")
+        self.logger.info(f">> Scope Image File {self.config.wafer_config.scope_image_file.get()}")
 
         # as long as the connection was successful, we can send some commands.
         # if it was not successful, an exception is thrown.
@@ -95,7 +98,7 @@ class MeasurementRoutine(BaseMeasurementRoutine):
             print(self.prober)
             contact, overtravel, align_dist, sep_dis, search_gap = self.prober.check_contact_height_set()
 
-            for die_idx, die_no in enumerate(self.config.wafer_config.dies):
+            for die_idx, die_no in enumerate(self.config.wafer_config.dies.get()):
                 # Move to die
                 self.write_log("info", f"Processing die {die_no} (#{die_idx})")
                 self.die_no, self.chuck_col, self.chuck_row = self.prober.move_to_die(die_no)
@@ -187,14 +190,14 @@ class MeasurementRoutine(BaseMeasurementRoutine):
     def _step_snap_image(self, scope_file, fmt):
         # Here we adapt filename of the scope by passing the correct keywords
         try:
-            self.write_log("info", f"{fmt} Saving scope image to {scope_file.relative}")
-            self.prober.snap_image("eVue2", scope_file.absolute, 2)
+            self.write_log("info", f"{fmt} Saving scope image to {scope_file}")
+            self.prober.snap_image("eVue2", scope_file, 2)
         except Exception as e:
-            self.logger.warning(f"{fmt} Cannot save scope image to {scope_file.relative}: {e}\n\n"
+            self.logger.warning(f"{fmt} Cannot save scope image to {scope_file}: {e}\n\n"
                                 f"{traceback.format_exc()}")
 
             self.signals.warning.emit(type(e),
-                                      f"Cannot save scope image to {scope_file.relative}. {e}",
+                                      f"Cannot save scope image to {scope_file}. {e}",
                                       traceback.format_exc())
 
     def _step_search_for_light(self, fmt):
@@ -232,7 +235,13 @@ class MeasurementRoutine(BaseMeasurementRoutine):
         #captured_values = self.ad2device.model.recorded_samples  # Just starts an endless loop
         #print(len(captured_values))
         #measure_time = self.ad2device.model.recording_time
-        captured_values, measure_time = self.laser.sweep_and_measure()
+        self.laser.start_wavelength_sweep.emit(self.laser.model.sweep_start_wavelength,
+                                          self.laser.model.sweep_stop_wavelength)
+        while self.laser.model.wavelength_sweep_running:
+            self.logger.info(f"{fmt} Wavelength sweep running. Waiting for sweep to finish.")
+            time.sleep(1)
+        measure_time = self.ad2device.model.capturing_information.recording_time
+        captured_values = self.ad2device.model.capturing_information.recorded_samples
 
         self.write_log("info", f"{self.formatter} Finished data acquisition: {len(captured_values)}. Took {round(measure_time, 5)} seconds.")
         return measure_time, captured_values
@@ -242,8 +251,12 @@ class MeasurementRoutine(BaseMeasurementRoutine):
       
         try:
             cur_measured_signal = SingleMeasuredData(
-                laser_properties=self.laser.model.laser_properties,
-                ad2_properties=self.ad2device.model.ad2_properties,
+                laser_properties=LaserProperties(
+                mcpy.Rectangular(2, 0.01, unit='nm/s'),
+                mcpy.Rectangular(2, 0.01, unit='nm/s'),
+                mcpy.Rectangular(0.5, 0.01, unit='nm/s^2'),
+                (mcpy.Rectangular(835, 0.01, unit='nm'), mcpy.Rectangular(870, 0.01, unit='nm'))),
+                ad2_properties=AD2CaptDeviceProperties( 0, 0, 0, 0, 0),
                 wafer_properties=wafer_properties,
                 waveguide_properties=WaveguidePropertiesMZI(
                     length1=mcpy.Rectangular(10e6, 20, unit='nm'),
@@ -321,8 +334,10 @@ class MeasurementRoutine(BaseMeasurementRoutine):
         # Create the correct file for the scope image
         # self.vaut_config.wafer_config.get_scope_image_file().set_obj(
         #    keywords={"{die}": self.die_no, "{structure}": self.structure.name, "{it}": 1})
-        self._step_snap_image(self.config.wafer_config.get_scope_image_file(
-            keywords={"{die}": self.die_no, "{structure}": self.structure.name}), self.formatter)
+        self._step_snap_image(
+            str(self.config.wafer_config.scope_image_file.get()).
+            replace("{die}", str(self.die_no)).
+            replace("{structure}", str(self.structure.name)), self.formatter)
 
         # Search for the light
         self._step_search_for_light(self.formatter)
@@ -337,7 +352,7 @@ class MeasurementRoutine(BaseMeasurementRoutine):
             # For displaying the data in the GUI
             measure_time, captured_values = self._step_capture_transmission(rep, self.formatter)
             data = [[
-                self.config.wafer_nr, self.die_no, self.chuck_col,
+                self.config.wafer_number.get(), self.die_no, self.chuck_col,
                 self.chuck_row, timestamp, str(self.structure), rep,
                 self.structure.x_in, self.structure.y_in,
                 self.structure.x_out, self.structure.y_out,
@@ -346,20 +361,20 @@ class MeasurementRoutine(BaseMeasurementRoutine):
             self.siph_data = pd.concat([self.siph_data, pd.DataFrame(data, columns=self.columns)])
 
             try:
-                self.siph_data.to_csv(str(self.config.wafer_config.get_measurement_output()))
+                self.siph_data.to_csv(str(self.config.wafer_config.measurement_output.get()))
                 self.siph_data.to_excel(
                     str(self.config.wafer_config.get_measurement_output()).replace('csv', 'xlsx'))
             except Exception as e:
                 self._write_error("Write SiPh", f"Could not write sphi data to file "
-                                                f"{self.config.wafer_config.get_measurement_output()}", e,
+                                                f"{self.config.wafer_config.measurement_output.get()}", e,
                                   traceback)
                 self.signals.error.emit((type(e),
                                          f"Could not write sphi data to file "
-                                         f"{self.config.wafer_config.get_measurement_output()}: {e}",
+                                         f"{self.config.wafer_config.measurement_output.get()}: {e}",
                                          traceback.format_exc()))
 
             wafer_properties = WaferProperties(
-                wafer_number=self.config.wafer_nr,
+                wafer_number=self.config.wafer_number.get(),
                 structure_name=self.structure.name,
                 die_nr=self.die_no,
                 chuck_col=self.chuck_col,
@@ -368,21 +383,21 @@ class MeasurementRoutine(BaseMeasurementRoutine):
                 structure_out=(self.structure.x_out, self.structure.y_out),
                 repetitions=rep)
            
-            cur_measured_signal = self._step_create_MeasuredSignal(
-                self.siph_data, 
-                captured_values,
-                wafer_properties)
-
-            cur_measured_signal._save_mat_file(
-                filename=self.config.wafer_config.get_measurement_mat_file(keywords={"{die}": self.die_no,
-                                                                                          "{structure}": self.structure.name,
-                                                                                          "{it}": f"rep_{rep + 1}"}).absolute
-            )
+            #cur_measured_signal = self._step_create_MeasuredSignal(
+            #    self.siph_data,
+            #    captured_values,
+            #    wafer_properties)
+
+            #cur_measured_signal._save_mat_file(
+            #    filename=self.config.wafer_config.get_measurement_mat_file(keywords={"{die}": self.die_no,
+            #                                                                              "{structure}": self.structure.name,
+            #                                                                              "{it}": f"rep_{rep + 1}"}).absolute
+            #)
 
 
             rep += 1
             self.logger.info(f"Repetition {rep}/{self.structure.repetitions} measured successfully!")
-            self.signals.routine_iteration_finished.emit(cur_measured_signal, rep)
+            #self.signals.routine_iteration_finished.emit(cur_measured_signal, rep)
             # Report the progress to the frontend
         self.write_log("info", "[OK] Continuing with next structure.")
         # idx_struct = idx_struct + 1
diff --git a/src/FlexSensor/Prober/controller/OpticalInterface.py b/src/FlexSensor/Prober/controller/OpticalInterface.py
index 4d1cb934953988128ad9365d85a7de13305083b2..d0bcc46b3441d8257a5937dd0041b554850a2c66 100644
--- a/src/FlexSensor/Prober/controller/OpticalInterface.py
+++ b/src/FlexSensor/Prober/controller/OpticalInterface.py
@@ -5,25 +5,18 @@ from Prober.model.OpticalInterfaceStoredData import OpticalInterfaceStoredData
 from constants.FlexsensorConstants import Probe
 from generics.generics import pch
 
+from FlexSensor.FSBase import FSBase
 
 
+class OpticalInterface(FSBase):
 
-
-
-
-
-
-
-
-
-
-class OpticalInterface(object):
-
-    def __init__(self, prober_signals, msg_server):
+    def __init__(self, prober_signals, msg_server,
+                 enable_log=True, log_level=logging.DEBUG, log_file=None):
+        super().__init__()
         self.stored = OpticalInterfaceStoredData()
         self.signals = prober_signals
         self.msg_server = msg_server
-        self.logger = logging.getLogger("Optical Interface")
+        self.logger = self.create_new_logger(self.name, enabled=enable_log, level=log_level)
         self.logger.info("Optical Interface initialized")
 
     # ==================================================================================================================
diff --git a/src/FlexSensor/Prober/controller/OpticalProbesPosition.py b/src/FlexSensor/Prober/controller/OpticalProbesPosition.py
index 19e061486ebbf6887f9f7ad90bfd226d4b8d5b34..bf2a8464ef08a7b6eaea036e035e4b989a1e6daf 100644
--- a/src/FlexSensor/Prober/controller/OpticalProbesPosition.py
+++ b/src/FlexSensor/Prober/controller/OpticalProbesPosition.py
@@ -1,13 +1,16 @@
 import sys
 import logging
 
+from FlexSensor.FSBase import FSBase
 
-class OpticalProbesPosition:
+
+class OpticalProbesPosition(FSBase):
 
     def __init__(self, input: tuple, output: tuple):
+        super().__init__()
         self.INPUT: ProbePosition = ProbePosition(input)
         self.OUT: ProbePosition = ProbePosition(output)
-        self.logger = logging.getLogger('OpticalProbesPosition')
+        self.logger = self.create_new_logger(self.name)
 
 
     def __str__(self):
diff --git a/src/FlexSensor/Prober/controller/ProberController.py b/src/FlexSensor/Prober/controller/ProberController.py
index 70a2f9c5c9a512ea8b7ae147b52cd0dbec638383..b115c694b152fa129ddec03e6cc52fb331dbb25b 100644
--- a/src/FlexSensor/Prober/controller/ProberController.py
+++ b/src/FlexSensor/Prober/controller/ProberController.py
@@ -3,17 +3,21 @@ import logging
 import confighandler as Config
 #from ConfigHandler.controller.VAutomatorConfig import VAutomatorConfig
 import FlexSensor.Prober as Prober
+from FlexSensor.FSBase import FSBase
 from FlexSensor.Prober.controller.OpticalInterface import OpticalInterface
 from FlexSensor.Prober.model.ProberModel import ProberModel
 from FlexSensor.constants.FlexsensorConstants import Probe
 from FlexSensor.generics.generics import pch
 
 
-class ProberController:
-    def __init__(self, model: ProberModel, *args, **kwargs):
-
+class ProberController(FSBase):
+    def __init__(self, model: ProberModel,
+                 enable_log=True, log_level=logging.DEBUG, log_file=None,
+                 *args, **kwargs):
+        super().__init__()
         self.model = model
-        self.logger = logging.getLogger("Prober")
+        self.logger = self.create_new_logger(self.name, enabled=enable_log, level=log_level)
+
         self.signals = Prober.Signals()
         self.msg_server = Prober.MessageServerInterface()
 
diff --git a/src/FlexSensor/Prober/velox_api/simulator/VeloxSimulator.py b/src/FlexSensor/Prober/velox_api/simulator/VeloxSimulator.py
index d847ac3a11b51549c03a6fb7fa4706c79a2f645a..9191dc7f9d082a8251743e9252298085ef69d05f 100644
--- a/src/FlexSensor/Prober/velox_api/simulator/VeloxSimulator.py
+++ b/src/FlexSensor/Prober/velox_api/simulator/VeloxSimulator.py
@@ -12066,7 +12066,8 @@ class MessageServerInterface(object):
         }
 
     def __init__(self):
-        print ("MessageServerInterface: initializing")
+        pass
+        #print("MessageServerInterface: initializing")
 
     def __enter__(self):
         #-uc-# print ("MessageServerInterface: entering")
diff --git a/src/FlexSensor/Prober/view/ProberControlWindow.py b/src/FlexSensor/Prober/view/ProberControlWindow.py
index 7d88c5b1269d1def5090bc43e019b3eaac7de926..a037aa69ddd1889ec1ad8e3086da61b5ca08f8c2 100644
--- a/src/FlexSensor/Prober/view/ProberControlWindow.py
+++ b/src/FlexSensor/Prober/view/ProberControlWindow.py
@@ -50,7 +50,7 @@ class ProberControlWindow(QMainWindow):
 
 
 if __name__ == "__main__":
-    setup_logging()
+    #setup_logging()
     logging.warning("ProberControlWindow.py is not meant to be run as a script.")
 
     app = QApplication()
diff --git a/src/FlexSensor/WaferConfig.py b/src/FlexSensor/WaferConfig.py
index 4791bdcc8ec9d57c722a4f92d637be9e986d0541..5d67d40066060615e2668774d75220db27ae9bb2 100644
--- a/src/FlexSensor/WaferConfig.py
+++ b/src/FlexSensor/WaferConfig.py
@@ -4,6 +4,7 @@ Author(s): Christoph Schmidt <christoph.schmidt@tugraz.at>
 Created: 2023-10-19 12:35
 Package Version:
 """
+import logging
 from pathlib import Path
 
 import confighandler as cfg
@@ -13,7 +14,7 @@ class WaferConfig(cfg.ConfigNode):
 
     def __init__(self) -> None:
         super().__init__()
-        self.dies = cfg.Field("MaskARY1_Jakob_full")
+        self.dies = cfg.Field([29, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46])
         self.structure_file = cfg.Field(Path("../vas-files/list_of_structures_picasso.vas"))
         self.wafermap_file = cfg.Field(Path("../Wafermapary1_48dies.map"))
         self.log_file = cfg.Field(Path("{output_directory}/log_{date_time}.log"))
diff --git a/src/FlexSensor/generics/ApplicationInit.py b/src/FlexSensor/generics/ApplicationInit.py
index dbbe4b2810311a8724cc57d9a8752fa8b15cdca9..31066eea59b7038f00dfab1cd4d98e0bc9233075 100644
--- a/src/FlexSensor/generics/ApplicationInit.py
+++ b/src/FlexSensor/generics/ApplicationInit.py
@@ -27,34 +27,31 @@ class ApplicationInit:
     def load_config_file(file_path):
         file_path = pathlib.PurePosixPath(pathlib.Path(file_path).absolute())
         if not os.path.isfile(file_path):
-            logging.info(f"Configuration file {file_path} not found")
+            #logging.info(f"Configuration file {file_path} not found")
             file_dialog = QFileDialog()
+            #file_dialog.setFilter("FlexSensor YAML Config File  (*.yaml)")
             file_dialog.setFileMode(QFileDialog.ExistingFile)
-            file_path, _ = file_dialog.getOpenFileName(None, "Select a Configuration File")
+            # Set the type of files that can be selected
+            file_path, _ = file_dialog.getOpenFileName(None, "Select a Configuration File", filter="FlexSensor Config (*.yaml)")
         # check if file dialog cancle was clicked
         vaut_config = FlexSensorConfig()
+        vaut_config.module_log_level = logging.DEBUG
+        vaut_config.module_log_enabled = True
         if file_path != "":
-            vaut_config = FlexSensorConfig.load(file_path)
-            logging.info(f"Loading configuration file {file_path}")
-        logging.info(vaut_config)
+             vaut_config.load(file=file_path, as_auto_save=True)
+            #logging.info(f"Loading configuration file {file_path}")
+        #logging.info(vaut_config)
         return vaut_config
 
     @staticmethod
-    def setup_logging(window: ConsoleWindow = None):
-        for log_name, log_obj in logging.Logger.manager.loggerDict.items():
-            if log_name != '<module name>':
-                log_obj.disabled = True
-        # Format the Rich logger
-        FORMAT = "%(message)s"
-        if window is not None:
-            logging.basicConfig(
-                level="DEBUG", format=FORMAT, datefmt="[%X]", handlers=[
-                    RichHandler(rich_tracebacks=True), window.handler
-                ]
-            )
-        else:
-            logging.basicConfig(
-                level="DEBUG", format=FORMAT, datefmt="[%X]", handlers=[
-                    RichHandler(rich_tracebacks=True)
-                ]
-            )
\ No newline at end of file
+    def setup_logging(console_window=None):
+        # disable matplotlib logging
+        logging.getLogger('matplotlib').setLevel(logging.WARNING)
+        FORMAT = "%(name)s %(message)s"
+        logging.basicConfig(
+            level="INFO", format=FORMAT, datefmt="[%X]", handlers=[
+                RichHandler(rich_tracebacks=True)
+            ]
+        )
+        if console_window is not None:
+            logging.getLogger().addHandler(console_window)
diff --git a/src/FlexSensor/generics/VASInputFileParser.py b/src/FlexSensor/generics/VASInputFileParser.py
index 73eda1a89860792aaf51f328a613745cd341c5cf..2c1c0e84c39e5e6c586ec2f8f46b182455b603e8 100644
--- a/src/FlexSensor/generics/VASInputFileParser.py
+++ b/src/FlexSensor/generics/VASInputFileParser.py
@@ -1,4 +1,3 @@
-
 import ast
 import logging
 import os
@@ -7,20 +6,22 @@ import pathlib
 import confighandler
 from PySide6.QtWidgets import QFileDialog
 
+from FlexSensor.FSBase import FSBase
+
 
-#import velox.controller.velox_config as velox_config
+# import velox.controller.velox_config as velox_config
 
 class Structure:
 
     def __init__(self, name: str, x_in: int, y_in: int, x_out: int, y_out: int, enabled: bool, repetitions: int):
         self.name = name
-        self.x_in = x_in                # x coordinate of the input point
-        self.y_in = y_in                # y coordinate of the input point
-        self.x_out = x_out              # x coordinate of the output point
-        self.y_out = y_out              # y coordinate of the output point
-        self.enabled = bool(enabled)    # True if the structure is enabled
-        self.repetitions = repetitions    # Number of repeated measurements of the structure
-        
+        self.x_in = x_in  # x coordinate of the input point
+        self.y_in = y_in  # y coordinate of the input point
+        self.x_out = x_out  # x coordinate of the output point
+        self.y_out = y_out  # y coordinate of the output point
+        self.enabled = bool(enabled)  # True if the structure is enabled
+        self.repetitions = repetitions  # Number of repeated measurements of the structure
+
         self.is_reference(False)
         self.in_out_diff_x = self.x_in - self.x_out
         self.in_out_diff_y = self.y_in - self.y_out
@@ -29,20 +30,21 @@ class Structure:
 
     def __str__(self) -> str:
         return (f"{self.repetitions} x Structure ({self.name}, {self.enabled}): "
-            f"IN ({self.x_in}, {self.y_in}), "
-            f"OUT ({self.x_out} {self.y_out})")
-    
+                f"IN ({self.x_in}, {self.y_in}), "
+                f"OUT ({self.x_out} {self.y_out})")
+
     def __repr__(self) -> str:
         return (f"{self.repetitions} x Structure ({self.name}, {self.enabled}): "
-            f"IN ({self.x_in}, {self.y_in}), "
-            f"OUT ({self.x_out} {self.y_out})")
-        
+                f"IN ({self.x_in}, {self.y_in}), "
+                f"OUT ({self.x_out} {self.y_out})")
+
     def is_reference(self, is_reference: bool = False):
         if isinstance(is_reference, bool):
             self.is_reference = is_reference
-        return  self.is_reference
+        return self.is_reference
+
 
-class VASInputFileParser():
+class VASInputFileParser(FSBase):
 
     def __init__(self) -> None:
         self.logger = logging.getLogger("ParseInputFile")
@@ -53,12 +55,10 @@ class VASInputFileParser():
         self.num_of_structs = 0
         self.num_of_runs = 0
 
-       
-
     def convert(self, key, value):
         value = ast.literal_eval(f"{value}")
         return key, value
-    
+
     def parse_line(self, line):
         line = line.strip()
         # check if line is empty
@@ -67,10 +67,10 @@ class VASInputFileParser():
             key = line_split[0].strip().replace(' ', '')
             value = line_split[1].strip().replace(' ', '')
         else:
-            raise Exception(f"More than 2 parameters extracted. Expected 2 in line {line}")       
-    
+            raise Exception(f"More than 2 parameters extracted. Expected 2 in line {line}")
+
         return key, value
-    
+
     def as_bookmark(self, key, value):
         self.list_of_bookmarks[key] = value
 
@@ -84,28 +84,27 @@ class VASInputFileParser():
 
         structure = Structure(
             key,
-            int(value['x_in']), int(value['y_in']), 
-            int(value['x_out']), int(value['y_out']), 
-            int(value['enabled']), 
+            int(value['x_in']), int(value['y_in']),
+            int(value['x_out']), int(value['y_out']),
+            int(value['enabled']),
             int(value['repetitions']))
 
         self.list_of_structures[key] = structure
         self.num_of_runs += structure.repetitions
         return [(key, structure)]
-        
-    
+
     def as_sequential_structs(self, key, value):
         cur_list_of_structures = []
-        num = value['num'] 
+        num = value['num']
         spacing = 0
 
         for idx in range(num):
             if idx > 0:
-                spacing = value['spacing'] 
-                
+                spacing = value['spacing']
+
             value['y_in'] = value['y_in'] + spacing
             value['y_out'] = value['y_out'] + spacing
-            key_seq = f"{key}_{idx+1}"
+            key_seq = f"{key}_{idx + 1}"
             structs = self.as_single_struct(key_seq, value)[0]
             cur_list_of_structures.append((structs[0], structs[1]))
 
@@ -117,7 +116,7 @@ class VASInputFileParser():
             logging.info(f"VAS file {file_path} not found")
             file_dialog = QFileDialog()
             file_dialog.setFileMode(QFileDialog.ExistingFile)
-            file_path, _ = file_dialog.getOpenFileName(None, "Select a VAS File", filter ="*.vas")
+            file_path, _ = file_dialog.getOpenFileName(None, "Select a VAS File", filter="*.vas")
         if file_path != "":
             pass
         return file_path
@@ -126,7 +125,7 @@ class VASInputFileParser():
         current_group = None
         cur_list_of_structures = {}
         structs = []
-        #list_of_structures = {}
+        # list_of_structures = {}
         self.logger.info(f"Reading input file: {input_file} of type type {type(input_file)}")
         if isinstance(input_file, pathlib.Path):
             input_file = str(input_file.absolute())
@@ -137,7 +136,7 @@ class VASInputFileParser():
                 # check if line is empty
                 if line.startswith('#') or len(line.strip().replace(' ', '')) == 0:
                     continue
-                
+
                 key, value = self.parse_line(line)
                 if key == "group":
                     if len(cur_list_of_structures) > 0:
@@ -147,29 +146,29 @@ class VASInputFileParser():
                     current_group = value
                     continue
                 else:
-                    key, value = self.convert(key, value)    
-                    
-                #list_of_structures[key] = value
-                if "bookmark" in key: 
+                    key, value = self.convert(key, value)
+
+                    # list_of_structures[key] = value
+                if "bookmark" in key:
                     self.as_bookmark(key, value)
                 elif ("num" in value) and ("spacing" in value):
                     structs = self.as_sequential_structs(key, value)
                 else:
                     structs = self.as_single_struct(key, value)
-                
+
                 # convert to dictionary
                 for struct in structs:
                     cur_list_of_structures[struct[0]] = struct[1]
-        
+
         if len(cur_list_of_structures) > 0:
             self.grouped_structures[current_group] = cur_list_of_structures
             cur_list_of_structures = {}
 
-        self.num_of_structs = len( 
+        self.num_of_structs = len(
             [
-            key for key in self.list_of_structures if self.list_of_structures[key].enabled == True
-            ] 
-        ) 
+                key for key in self.list_of_structures if self.list_of_structures[key].enabled == True
+            ]
+        )
         return pathlib.Path(input_file), self.grouped_structures, self.list_of_bookmarks
 
     # @staticmethod
@@ -177,7 +176,6 @@ class VASInputFileParser():
     #     filename_rel = vaut_config.automator_config.structure_file.rel
     #     filename = vaut_config.automator_config.structure_file.abs
     #     ParseInputFile.logger.info("Reading input file: %s" % filename_rel)
-       
 
     #     number_of_structures = 0
 
@@ -186,7 +184,7 @@ class VASInputFileParser():
     #     list_of_structs_sub = []
 
     #     with open(filename, 'r') as f:
-            
+
     #         for idx, line in enumerate(f):
     #             line = line.strip()
 
@@ -199,13 +197,13 @@ class VASInputFileParser():
     #                     varcontent = line_split[1].strip().replace(' ', '')
     #                 else:
     #                     raise Exception("Error in line %d: %s" % (idx, line))
-                    
+
     #                 if cmd != line.replace(' ', ''):
     #                         raise ValueError(
     #                             "Error parsing command, could not correctly seperate the string."
     #                             "\nPlease check your input line %d:\nin >>  '%s'\nout << '%s'" 
     #                             % (idx, line.replace(' ', ''), cmd))
-                            
+
     #                 # Parse the lines
     #                 if "bookmark" in line:
     #                     cmd = ("%s=%s" % (varname, varcontent)).strip()
@@ -226,7 +224,7 @@ class VASInputFileParser():
     #                         #-uc-# print("Bookmark %s" % list_of_bookmarks[-1])
     #                 # Only if we have the keyword "spacing" and "num" in line, then proceed
     #                 elif ("num" in line) and ("spacing" in line):
-                      
+
     #                     cmd = ("%s=%s" % (varname, varcontent)).strip()
     #                     # Check if command is the same
     #                     if cmd != line.replace(' ', ''):
@@ -246,28 +244,26 @@ class VASInputFileParser():
     #                                 raise ValueError("'num': Number of structur list can not be zero or below. Error in line %d: %s" % (idx, line))
     #                         except:
     #                             raise ValueError("'num' keyword not found in dictionry. Error in line %d: %s" % (idx, line))
-                            
+
     #                         try:
     #                             if var_content['spacing'] == 0:
     #                                 raise ValueError("'spacing': Spacing can not be zero. Error in line %d: %s" % (idx, line))
     #                         except:
     #                             raise ValueError("'spacing' keyword not found in dictionry. Error in line %d: %s" % (idx, line))
 
-                               
-                            
     #                         for idx in range(0, var_content['num']):
     #                             try:
     #                                 num_start = var_content['start'] + 1
     #                             except:
     #                                 num_start = 1
-                                    
+
     #                             y_in_temp = var_content['y_in'] + idx * var_content['spacing']
     #                             y_out_temp = var_content['y_out'] + idx * var_content['spacing']
     #                             x_in_temp = var_content['x_in']
     #                             x_out_temp = var_content['x_out']
     #                             if 'rep' not in var_content:
     #                                 var_content['rep'] = 1
-                                
+
     #                             var_content_tmp ={
     #                                 'x_in':         x_in_temp,
     #                                 'y_in':         y_in_temp,       # Convert y-axis to negative values
@@ -282,12 +278,12 @@ class VASInputFileParser():
     #                         number_of_structures += var_content['num']                        
     #                 elif "group" in line:
     #                         groupname = line_split[1].strip().replace(' ', '')
-                            
+
     #                         if list_of_structs_sub == []:
     #                             #-uc-# print ("Init group %s" % groupname)
     #                             list_of_structs_sub = []
     #                         else:
-                                
+
     #                             if list_of_structs_sub != []:
     #                                 #-uc-# print ("Adding data %s to list" % (list_of_structs_sub))
     #                                 list_of_structure_groups.append(list_of_structs_sub)
@@ -326,7 +322,6 @@ class VASInputFileParser():
     #                             raise ValueError("Error in line %d: %s" % (idx, line))
     #                         list_of_structs_sub.append( {varname:var_content_tmp} )
     #                         number_of_structures += 1
-        
 
     #         # Append the last group
     #         if list_of_structs_sub != []:
@@ -334,7 +329,7 @@ class VASInputFileParser():
     #             list_of_structure_groups.append(list_of_structs_sub)
     #         #-uc-# print ("Last group %s" % groupname)
     #         list_of_structs_sub = []
-        
+
     #     #print(len(list_of_structure_groups))
     #     # for gr in list_of_structure_groups:
     #     #     print("Group: %s\n\n" % gr)
@@ -342,37 +337,36 @@ class VASInputFileParser():
     #     return list_of_structure_groups, list_of_bookmarks, number_of_structures
 
     def write_bookmarks(
-        self, cell_name="MaskARY1_final_2020_Feb_14", 
-        bookmark_file="bookmarks.lyb"
+            self, cell_name="MaskARY1_final_2020_Feb_14",
+            bookmark_file="bookmarks.lyb"
     ):
-        print(f"Writing bookmarks to file {bookmark_file}") 
-        
+        print(f"Writing bookmarks to file {bookmark_file}")
+
         with open(bookmark_file, 'w+') as f:
             f.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<bookmarks>\n")
             for bookmark in self.list_of_bookmarks:
                 print(f"{bookmark}: {bookmarks[bookmark]}")
                 for key in bookmark:
-                    bookmar_string =  (
-                          "<bookmark>\n"
-                        + " <name>" + str(bookmark) + "</name>\n"
-                        + " <x-left>" + str(bookmarks[bookmark]['x_left']) + "</x-left>\n"
-                        + " <x-right>" + str(bookmarks[bookmark]['x_right']) + "</x-right>\n"
-                        + " <y-bottom>" + str(bookmarks[bookmark]['y_bottom']) + "</y-bottom>\n"
-                        + " <y-top>" + str(bookmarks[bookmark]['y_top']) + "</y-top>\n"
-                        + " <min-hier>0</min-hier>\n"
-                        + " <max-hier>9</max-hier>\n"
-                        + " <cellpaths>\n"
-                        + "  <cellpath>\n"
-                        + "   <cellname>" + str(cell_name) + "</cellname>\n"
-                        + "  </cellpath>\n"
-                        + " </cellpaths>\n"
-                        + "</bookmark>" 
+                    bookmar_string = (
+                            "<bookmark>\n"
+                            + " <name>" + str(bookmark) + "</name>\n"
+                            + " <x-left>" + str(bookmarks[bookmark]['x_left']) + "</x-left>\n"
+                            + " <x-right>" + str(bookmarks[bookmark]['x_right']) + "</x-right>\n"
+                            + " <y-bottom>" + str(bookmarks[bookmark]['y_bottom']) + "</y-bottom>\n"
+                            + " <y-top>" + str(bookmarks[bookmark]['y_top']) + "</y-top>\n"
+                            + " <min-hier>0</min-hier>\n"
+                            + " <max-hier>9</max-hier>\n"
+                            + " <cellpaths>\n"
+                            + "  <cellpath>\n"
+                            + "   <cellname>" + str(cell_name) + "</cellname>\n"
+                            + "  </cellpath>\n"
+                            + " </cellpaths>\n"
+                            + "</bookmark>"
                     )
 
                 f.write(bookmar_string + "\n")
             f.write("</bookmarks>")
 
-
 # pi = ParseInputFile()
 # grouped_structures, bookmarks = pi.read_file(input_file="./list_of_structures.vas")
 
@@ -385,4 +379,4 @@ class VASInputFileParser():
 # #for bookmark in bookmarks:
 # #    print(f"{bookmark}: {bookmarks[bookmark]}")
 
-# print(pi.num_of_runs)
\ No newline at end of file
+# print(pi.num_of_runs)
diff --git a/src/FlexSensor/pathes.py b/src/FlexSensor/pathes.py
index c0b004bf495a66c22a932eac274a39f53dd022e3..012c6cdc66d3788322be7e2747cd737fa332a516 100644
--- a/src/FlexSensor/pathes.py
+++ b/src/FlexSensor/pathes.py
@@ -6,9 +6,9 @@
 import os
 import pathlib
 
-content_root = "."
+content_root = "./src/FlexSensor"
 
 # DO not change this unless you know what you are doing!
-image_root = str(pathlib.Path(f"{content_root}/../images").resolve().absolute())
+image_root = str(pathlib.Path(f"{content_root}/resources").resolve().absolute())
 libs_root = str(pathlib.Path(f"{content_root}/libs").resolve().absolute())
 configs_root = str(pathlib.Path(f"{content_root}/../configs").resolve().absolute())
diff --git a/tests/testing_loggers.py b/tests/testing_loggers.py
new file mode 100644
index 0000000000000000000000000000000000000000..eae28fe2648d1594822d81fb82e8d96b8a3452e4
--- /dev/null
+++ b/tests/testing_loggers.py
@@ -0,0 +1,57 @@
+import logging
+
+from rich.logging import RichHandler
+
+
+class MyClass:
+
+    # ==================================================================================================================
+    # Public methods
+    # ==================================================================================================================
+    def __init__(self):
+        self.name = self.__class__.__name__
+        self.logger = self.create_new_logger(self.name)
+
+    def create_new_logger(self, logger_name: str,
+                          logger_format: str = "%(asctime)s - %(name)s %(message)s",
+                          to_file='mylog.log',
+                          level=logging.DEBUG) -> logging.Logger:
+
+        # Set the formatter
+        _std_handler_formatter = logging.Formatter(logger_format)
+        _file_handler_formatter = logging.Formatter(f"%(levelname)s {logger_format})")
+
+        _std_handler: logging.Handler = RichHandler(rich_tracebacks=True)
+        _std_handler.setLevel(level)
+        _std_handler.setFormatter(_std_handler_formatter)
+
+        # Add a file handler as well
+        _file_handler = logging.FileHandler(to_file)
+        _file_handler.setLevel(logging.DEBUG)  # Always set the file handler to debug
+        _file_handler.setFormatter(_file_handler_formatter)
+
+        # Assign the handler to the logger
+        _logger = logging.getLogger(logger_name)
+        _logger.handlers = [_std_handler, _file_handler]
+        _logger.setLevel(logging.DEBUG)  # Set the logger to debug, so every message is printed using the file handler
+
+        return _logger
+
+    def test_logging(self, msg):
+        self.logger.warning(msg)
+
+
+if __name__ == "__main__":
+    #logging.basicConfig(level=logging.INFO)
+    myclass = MyClass()
+    myclass.test_logging("MSG 1 Hello from MyClass") # The message is printed twice
+
+    logger = logging.getLogger("mylogger")   # create a new logger
+    logger.setLevel(logging.DEBUG)
+    # (Not expected) This does not print anything, despite the level is set to DEBUG
+    logger.debug("MSG 2 Hello from a new logger myLogger")
+    # (Expected) This does not print, since the default level is WARNING
+    logging.info("MSG 3 Hello from the default logger")
+    # This now prints, since the level is WARNING
+    logger.warning("MSG 4 Hello from a new logger myLogger")
+    logging.warning("MSG 5: Hello from the default logger")