diff --git a/pyrelacs/app.py b/pyrelacs/app.py
index d346741..fa2f849 100644
--- a/pyrelacs/app.py
+++ b/pyrelacs/app.py
@@ -93,6 +93,21 @@ class PyRelacs(QMainWindow):
 
     def run_repro(self, n, fn):
         self.text.appendPlainText(f"started Repro {n}, {fn}")
+        worker = Worker(self.repros.run_repro, n, fn)
+        worker.signals.result.connect(self.print_output)
+        worker.signals.finished.connect(self.thread_complete)
+        worker.signals.progress.connect(self.progress_fn)
+
+        self.threadpool.start(worker)
+
+    def print_output(self, s):
+        print(s)
+
+    def thread_complete(self):
+        print("THREAD COMPLETE!")
+
+    def progress_fn(self, n):
+        print("%d%% done" % n)
 
 
 def main():
@@ -114,7 +129,7 @@ def main():
     window.resize(width, height)
     window.move(x, y)
     window.show()
-    app.exec()
+    exit_code = app.exec()
 
     # store window position and size
     pos = window.pos()
@@ -126,4 +141,5 @@ def main():
 
 
 if __name__ == "__main__":
-    main()
\ No newline at end of file
+    main()
+
diff --git a/pyrelacs/repros/calbi.py b/pyrelacs/repros/calbi.py
index 9b36a0a..114472d 100644
--- a/pyrelacs/repros/calbi.py
+++ b/pyrelacs/repros/calbi.py
@@ -25,12 +25,10 @@ class Calibration(MccDac):
         self.AMPLITUDE = 1
         self.SINFREQ = 750
 
-    def run(self):
-
-    def segfault_handler(self, signum, frame):
-        print(f"Segmentation fault caught! Signal number: {signum}")
-        self.disconnect_dac()
-        sys.exit(1)  # Gracefully exit the program
+    @staticmethod
+    def run():
+        calb = Calibration()
+        calb.check_beat()
 
     def check_amplitude(self):
         db_values = [0.0, -5.0, -10.0, -20.0, -50.0]
@@ -53,7 +51,10 @@ class Calibration(MccDac):
             )
 
             data_channel_one = self.read_analog(
-                [0, 0], self.DURATION, self.SAMPLERATE, ScanOption=uldaq.ScanOption.EXTTRIGGER
+                [0, 0],
+                self.DURATION,
+                self.SAMPLERATE,
+                ScanOption=uldaq.ScanOption.EXTTRIGGER,
             )
             time.sleep(1)
 
@@ -107,7 +108,6 @@ class Calibration(MccDac):
                 ScanOption=uldaq.ScanOption.EXTTRIGGER,
             )
             self.diggital_trigger()
-            signal.signal(signal.SIGSEGV, self.segfault_handler)
             log.info(self.ao_device)
             ai_status = uldaq.ScanStatus.RUNNING
             ao_status = uldaq.ScanStatus.RUNNING
diff --git a/pyrelacs/repros/repros.py b/pyrelacs/repros/repros.py
index eb96578..f1bd258 100644
--- a/pyrelacs/repros/repros.py
+++ b/pyrelacs/repros/repros.py
@@ -1,15 +1,34 @@
+import sys
+import importlib.util
 import ast
 import pathlib
 
 from IPython import embed
+from pyrelacs.util.logging import config_logging
+
+log = config_logging()
 
 
 class Repro:
     def __init__(self) -> None:
         pass
 
-    def run_repro(self, name: str, *args, **kwargs) -> None:
-        pass
+    def run_repro(self, name: str, file: pathlib.Path, *args, **kwargs) -> None:
+        spec = importlib.util.spec_from_file_location("rep", file)
+        if not spec:
+            log.error("Could not load the repro")
+        else:
+            module = importlib.util.module_from_spec(spec)
+            if not module:
+                log.error("Could not load Class of the repro")
+            else:
+                sys.modules[name] = module
+                spec.loader.exec_module(module)
+                if hasattr(module, name):
+                    rep_class = getattr(module, name)
+                    rep_class.run()
+                else:
+                    raise AttributeError(f"{name} has no run function")
 
     def names_of_repros(self):
         file_path_cur = pathlib.Path(__file__).parent