diff --git a/.gitignore b/.gitignore
index e85afafaa4d4fd462dbcb2170954ae5b9f1b94f7..9f164fb8989da35f962830904a11fc11479de4fa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -134,4 +134,5 @@ dmypy.json
 # Custom paths
 results/
 tmp*.txt
-src/Configs/tests/
\ No newline at end of file
+src/Configs/tests/
+.vscode/
\ No newline at end of file
diff --git a/Help Client/help_server.py b/Help Client/help_server.py
index 5fb25bb1735151e090cd878d7e27e8036ba424a0..fbf927118c1bb304114793b8bc7565e7a1be512f 100644
--- a/Help Client/help_server.py	
+++ b/Help Client/help_server.py	
@@ -15,7 +15,7 @@ WAIT_TIME_SECONDS = 60
 TIMEOUT = 0.75
 
 tl = Timeloop()
-server = None
+SERVER = None
 
 
 def request(unused_addr, opt_args):
@@ -28,7 +28,7 @@ def request(unused_addr, opt_args):
     opt_args : str or list[str]
         optional arguments
     """
-    print(Back.YELLOW+"Help requested.")
+    print(Back.YELLOW + "Help requested.")
 
 
 def page(unused_addr, opt_args):
@@ -41,7 +41,7 @@ def page(unused_addr, opt_args):
     opt_args : str or list[str]
         optional arguments, here page number
     """
-    print("Page {}".format(opt_args))
+    print(f'Page {opt_args}')
 
 
 def connection(unused_addr, opt_args):
@@ -54,7 +54,7 @@ def connection(unused_addr, opt_args):
     opt_args : str or list[str]
         optional arguments
     """
-    print(Back.RED+"Connection to pupil capture lost.")
+    print(Back.RED + "Connection to pupil capture lost.")
 
 
 def finished(unused_addr, opt_args):
@@ -67,7 +67,7 @@ def finished(unused_addr, opt_args):
         opt_args : str or list[str]
             optional arguments
         """
-    print(Back.GREEN+"Questionnaire finished.")
+    print(Back.GREEN + "Questionnaire finished.")
     tl.stop()
     # server.server_close()  # close the window manually, as this statement will throw exceptions
 
@@ -76,10 +76,10 @@ def finished(unused_addr, opt_args):
 def send_ping():
     """Send a ping to the GUI's machine."""
     # noinspection PyTypeChecker
-    print("Pinging {} every {} seconds with timeout {}.".format(HOST, WAIT_TIME_SECONDS, TIMEOUT))
+    print(f'Pinging {HOST} every {WAIT_TIME_SECONDS} seconds with timeout {TIMEOUT}.')
     response = ping(HOST, timeout=TIMEOUT)
     if response is None:
-        print(Back.RED+"Connection to GUI lost.")
+        print(Back.RED + "Connection to GUI lost.")
     else:
         print("Everything is fine :)")
 
@@ -89,16 +89,14 @@ if __name__ == "__main__":
     own_ip = socket.gethostbyname(socket.gethostname())
     parser = argparse.ArgumentParser()
     parser.add_argument("--port", type=int, default=5005, help="The port to listen on.")
-    parser.add_argument("--ping_ip", type=str, default=HOST,
-                        help="IP of the GUI to ping to.")  # TODO testen
-    parser.add_argument("--ping_timeout", type=float, default=TIMEOUT,
-                        help="Timeout for ping back of GUI.")  # TODO testen
+    parser.add_argument("--ping_ip", type=str, default=HOST, help="IP of the GUI to ping to.")  # TODO testen
+    parser.add_argument("--ping_timeout", type=float, default=TIMEOUT, help="Timeout for ping back of GUI.")  # TODO testen
     args = parser.parse_args()
     if args.ping_ip is not None:
         HOST = args.ping_ip
     if args.ping_timeout is not None:
         TIMEOUT = args.ping_timeout
-    print("Pinging {} every {} seconds with timeout {}.".format(HOST, WAIT_TIME_SECONDS, TIMEOUT))
+    print(f'Pinging {HOST} every {WAIT_TIME_SECONDS} seconds with timeout {TIMEOUT}.')
     tl.start(block=False)
 
     dispatcher = dispatcher.Dispatcher()
@@ -111,6 +109,6 @@ if __name__ == "__main__":
     # noinspection PyTypeChecker
     dispatcher.map("/questionnaire_finished", finished)
 
-    server = osc_server.ThreadingOSCUDPServer((own_ip, args.port), dispatcher)
-    print("Serving on {}".format(server.server_address))
-    server.serve_forever()
+    SERVER = osc_server.ThreadingOSCUDPServer((own_ip, args.port), dispatcher)
+    print(f'Serving on {SERVER.server_address}')
+    SERVER.serve_forever()
diff --git a/README.md b/README.md
index d35f00e93c54c4f2db602708ad6b4f479005e8ca..450dbec2d0d2ffb3a1988acd583d3dd03942a915 100644
--- a/README.md
+++ b/README.md
@@ -106,7 +106,7 @@ The necessary python libraries are given in ```requirements.txt```.
 * [fpdf](https://pyfpdf.readthedocs.io/en/latest/) - Generate pdf file
 * [msgpack_python](https://pypi.org/project/msgpack/) - Communication
 * [ping3](https://github.com/kyan001/ping3) - Connection check
-* [PyQt5](https://pypi.org/project/PyQt5/) - GUI
+* [PySide6](https://pypi.org/project/PySide6/) - GUI
 * [python_osc](https://github.com/attwad/python-osc) - OSC communication
 * [pyzmq](https://docs.pupil-labs.com/developer/core/network-api/#pupil-remote) - Communication
 * [timeloop](https://github.com/sankalpjonn/timeloop) - Repeating jobs
diff --git a/Tools/SignalGenerator.py b/Tools/SignalGenerator.py
index dc67d530627b81c79f5e9f097822d1e4077d24e7..8e468420be4f5f2c5cf050f8d94401ada7a3edd9 100644
--- a/Tools/SignalGenerator.py
+++ b/Tools/SignalGenerator.py
@@ -6,7 +6,7 @@ import soundfile as sf
 import numpy as np
 
 
-def write_audio_with_pattern(filepath, pattern, break_duration=10, subtype="PCM_16", amplitude=0.5, fs=44100, sine_duration=500, f=0, channels=1):
+def write_audio_with_pattern(filepath, pattern, break_duration, subtype, amplitude, sine_duration, f, channels, fs=44100):
     """Write a sine pattern to use with the NTI."""
     # Set values to NeXus Trigger Interface bounds, if necessary
     if f < 100:
@@ -15,11 +15,11 @@ def write_audio_with_pattern(filepath, pattern, break_duration=10, subtype="PCM_
         f = 20000
     if break_duration < 10:
         break_duration = 10
-    filename = ''.join(str(bit) for bit in pattern)+"_{}Hz_{}ms_sine_{}ms_break.wav".format(f, sine_duration, break_duration)
+    filename = ''.join(str(bit) for bit in pattern) + f'_{f}Hz_{sine_duration}ms_sine_{break_duration}ms_break.wav'
 
-    sine = (amplitude * np.sin(2 * np.pi * np.arange(fs * (sine_duration/1000)) * f / fs)).astype(np.float32)
-    silent_break = 0 * np.arange(fs * (break_duration/1000))
-    silent_sine = 0 * np.arange(fs * (sine_duration/1000))
+    sine = (amplitude * np.sin(2 * np.pi * np.arange(fs * (sine_duration / 1000)) * f / fs)).astype(np.float32)
+    silent_break = 0 * np.arange(fs * (break_duration / 1000))
+    silent_sine = 0 * np.arange(fs * (sine_duration / 1000))
 
     final_signal = []
     final_signal.extend(silent_break)
@@ -37,18 +37,18 @@ def write_audio_with_pattern(filepath, pattern, break_duration=10, subtype="PCM_
             multichannel[:, ch] = final_signal
         final_signal = multichannel
 
-    sf.write(filepath+filename, final_signal, fs, subtype=subtype)
+    sf.write(f'{filepath}{filename}', final_signal, fs, subtype=subtype)
 
 
 if __name__ == '__main__':
-    pattern = [0]
-    destination = "./"
-    frequency = 440
-    sine_duration = 50
-    break_duration = 50
-    amplitude = 0.5
-    channels = 1
-    subtype = "PCM_16"
+    PATTERN = [0]
+    DESTINATION = "./"
+    FREQUENCY = 440
+    SINE_DURATION = 50
+    BREAK_DURATION = 50
+    AMPLITUDE = 0.5
+    CHANNELS = 1
+    SUBTYPE = "PCM_16"
     argv = sys.argv[1:]
     try:
         opts, args = getopt.getopt(argv, "hp:d:f:s:b:a:c:", ["pattern=", "destination=", "frequency=", "sine_duration=", "break_duration=", "amplitude=", "channels="])
@@ -60,20 +60,20 @@ if __name__ == '__main__':
             print()
             sys.exit('SignalGenerator.py -p <pattern> [-d <path_to_save_destination> -f <frequency> -s <sine_duration> -b <break_duration> -a <amplitude> -c <number_of_channels>]')
         elif opt in ("-p", "--pattern"):
-            pattern = list(arg)
-            for p in range(len(pattern)):
-                pattern[p] = int(pattern[p])
-            print(pattern, type(pattern[0]))
+            PATTERN = list(arg)
+            for _, p in enumerate(PATTERN):
+                p = int(p)
+            print(PATTERN, type(PATTERN[0]))
         elif opt in ("-d", "--destination"):
-            destination = arg
+            DESTINATION = arg
         elif opt in ("-f", "--frequency"):
-            destination = arg
+            FREQUENCY = arg
         elif opt in ("-s", "--sine_duration"):
-            destination = arg
+            SINE_DURATION = arg
         elif opt in ("-b", "--break_duration"):
-            destination = arg
+            BREAK_DURATION = arg
         elif opt in ("-a", "--amplitude"):
-            destination = arg
+            AMPLITUDE = arg
         elif opt in ("-c", "--channels"):
-            destination = arg
-    write_audio_with_pattern(destination, pattern, break_duration=break_duration, amplitude=amplitude, sine_duration=sine_duration, f=frequency, channels=channels)
+            CHANNELS = arg
+    write_audio_with_pattern(DESTINATION, PATTERN, break_duration=BREAK_DURATION, amplitude=AMPLITUDE, sine_duration=SINE_DURATION, f=FREQUENCY, channels=CHANNELS, subtype=SUBTYPE)
diff --git a/Tools/vlc_server.py b/Tools/vlc_server.py
index 7e1c95ede8c5bfbd56bcc343cb0efe30cd326741..23b88d2b887106cbd2355b39cebbe4a3c288863d 100644
--- a/Tools/vlc_server.py
+++ b/Tools/vlc_server.py
@@ -20,7 +20,7 @@ def vlc_start(unused_addr, args):
     args : str or any
         if str: path of file to play
     """
-    if args == '{}':
+    if args == "{}":
         pl.resume()
         print("status: resume")
     else:
@@ -28,34 +28,34 @@ def vlc_start(unused_addr, args):
     print("status: play")
 
 
-def vlc_stop(unused_addr, args):
+def vlc_stop(unused_addr, unused_args):
     """
     Stop the video in the current player (by pausing it).
 
     Parameters
     ----------
     unused_addr : any
-    args : any
+    unused_args : any
     """
     pl.pause()
     print("status: pause")
 
 
-def vlc_finish(unused_addr, args):
+def vlc_finish(unused_addr, unused_args):
     """
         Set an all black still image, e.g. when currently no video needs to be played.
 
         Parameters
         ----------
         unused_addr : any
-        args : any
+        unused_args : any
     """
     video_thread = Thread(target=pl.play, args=("./Examples/black_3screens.mp4",))
     video_thread.run()
     print("status: finish")
 
 
-def vlc_still(unused_addr, args):
+def vlc_still(unused_addr, unused_args):
     """
         Set an all blue still image.
         Example use: Signal that the questionnaire is done.
@@ -63,7 +63,7 @@ def vlc_still(unused_addr, args):
         Parameters
         ----------
         unused_addr : any
-        args : any
+        unused_args : any
     """
     video_thread = Thread(target=pl.play, args=("./Examples/blue_3screens.mp4",))
     video_thread.run()
@@ -76,9 +76,9 @@ if __name__ == "__main__":
     parser.add_argument("--reaper", type=bool, default=True, help="Flag to use Reaper (default: True).")
     parser.add_argument("--reaper_ip", default="127.0.0.1", help="IPv4 the computer hosting Reaper.")
     parser.add_argument("--reaper_port", type=int, default=8000, help="The port of Reaper.")
-    args = parser.parse_args()
+    arguments = parser.parse_args()
 
-    pl = Player(reaper=args.reaper, reaper_ip=args.reaper_ip, reaper_port=args.reaper_port)
+    pl = Player(reaper=arguments.reaper, reaper_ip=arguments.reaper_ip, reaper_port=arguments.reaper_port)
     vlc_still("", None)
 
     dispatcher = dispatcher.Dispatcher()
@@ -89,6 +89,6 @@ if __name__ == "__main__":
     dispatcher.map("/vlc_still", vlc_still)  # show a still image
 
     ip = socket.gethostbyname(socket.gethostname())
-    server = osc_server.ThreadingOSCUDPServer((ip, args.port), dispatcher)
-    print("Serving on {}".format(server.server_address))
+    server = osc_server.ThreadingOSCUDPServer((ip, arguments.port), dispatcher)
+    print(f'Serving on {server.server_address}')
     server.serve_forever()
diff --git a/requirements.txt b/requirements.txt
index 0a2e2f33c49b01c8ee66a65e42c55d8c6a49baef..d312c73e18c99625d059748650156afda07ac82d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,7 +5,7 @@ python_osc==1.7.7
 configobj==5.0.6
 fpdf==1.7.2
 msgpack_python==0.5.6
-PyQt5~=5.15.4
+PySide6~=5.15.4
 pyzmq~=22.3.0
 timeloop~=1.0.2
 python-osc~=1.7.7
@@ -15,4 +15,5 @@ keyboard~=0.13.5
 portalocker~=2.5.1
 psutil~=5.9.0
 setuptools~=59.1.1
-colorama~=0.4.4
\ No newline at end of file
+colorama~=0.4.4
+shiboken6
\ No newline at end of file
diff --git a/setup.cfg b/setup.cfg
index 24e03f70d6eed201bc10341cd76fae2816ec75ec..6344dc640bf171e5fade639424988994d940a44b 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -5,4 +5,10 @@ omit = ReaperScripts/*, src/Configs/*, src/Images/*, src/results/*, src/styleshe
 [coverage:report]
 show_missing = True
 skip_covered = True
-exclude_lines = @pytest.mark.pupil
\ No newline at end of file
+exclude_lines = @pytest.mark.pupil
+
+[flake8]
+ignore = E501, E128
+
+[pylint]
+disable = C0301, C0103, E0611
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 7f411293d28b779c2a483998f7369fab5e8273a9..ccbfb8ab5f290d3fd04ad4ebf1b86bf59faf5023 100644
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@ with open("README.md", 'r') as f:
 
 setup(
     name='QUEST',
-    version='1.0.0',
+    version='1.1.0',
     description='An easy solution to create graphical user interfaces for offline questionnaires without programming knowledge.',
     license="GNU GPLv3",
     long_description=long_description,
@@ -35,7 +35,7 @@ setup(
     #   'configobj',
     #   'fpdf',
     #   'msgpack_python',
-    #   'PyQt5',
+    #   'PySide6',
     #   'pyzmq',
     #   'timeloop',
     # ],
diff --git a/src/ABX.py b/src/ABX.py
index 48997bfede4d6561b29232d0966dfc4ba307b4ab..24d06dec44fd998854646166da60929cd6bf1ca8 100644
--- a/src/ABX.py
+++ b/src/ABX.py
@@ -2,7 +2,7 @@
 
 from random import shuffle
 
-from PyQt5.QtWidgets import QWidget, QHBoxLayout, QVBoxLayout, QFormLayout, QLabel
+from PySide6.QtWidgets import QWidget, QHBoxLayout, QVBoxLayout, QFormLayout, QLabel
 
 from src.AnswerRadioButton import make_answers as radio
 from src.Player import Player
@@ -50,19 +50,19 @@ class ABX(QWidget):
         else:
             self.name = None
         stimuli = []
-        for cue_no in range(len(start_cues)):
-            stimuli.append((int(start_cues[cue_no]), tracks[cue_no]))
+        for cue_no, cue in enumerate(start_cues):
+            stimuli.append((int(cue), tracks[cue_no]))
         shuffle(stimuli)
         self.page = parent
 
-        self.a_button = Player(stimuli[0][0], [stimuli[0][1]], parent=self.page, qid=qid + "_A", displayed_buttons=["Play"],
+        self.a_button = Player(stimuli[0][0], [stimuli[0][1]], parent=self.page, qid=f'{qid}_A', displayed_buttons=["Play"],
                                objectname=objectname, play_button_text=button_texts[0])
         player_layout.addWidget(self.a_button)
-        self.b_button = Player(stimuli[1][0], [stimuli[1][1]], parent=self.page, qid=qid + "_B", displayed_buttons=["Play"],
+        self.b_button = Player(stimuli[1][0], [stimuli[1][1]], parent=self.page, qid=f'{qid}_B', displayed_buttons=["Play"],
                                objectname=objectname, play_button_text=button_texts[1])
         player_layout.addWidget(self.b_button)
         if x:
-            self.x_button = Player(int(start_cues[0]), [tracks[0]], parent=self.page, qid=qid + "_X", displayed_buttons=["Play"],
+            self.x_button = Player(int(start_cues[0]), [tracks[0]], parent=self.page, qid=f'{qid}_X', displayed_buttons=["Play"],
                                    objectname=objectname, play_button_text=button_texts[2])
             player_layout.addWidget(self.x_button)
         else:
diff --git a/src/AnswerCheckBox.py b/src/AnswerCheckBox.py
index 695067e58e86c83ee8dfa6ba527b9f52a8cd1760..3d1bff33f215ec86eab872c1cdecd8b898219b8c 100644
--- a/src/AnswerCheckBox.py
+++ b/src/AnswerCheckBox.py
@@ -1,10 +1,11 @@
 """
 This class creates a set of checkboxes.
 """
-from PyQt5.QtWidgets import QHBoxLayout, QCheckBox
+import datetime
+from PySide6.QtWidgets import QHBoxLayout, QCheckBox
 
 
-def make_answers(answer, objectname=None):
+def make_answers(answer, qid, objectname=None, parent=None):
     """
     Create a set of checkboxes based on the given array of answers.
 
@@ -12,8 +13,12 @@ def make_answers(answer, objectname=None):
     ----------
     answer : str or list[str]
         answer possibilities
+    qid : str
+        id of the question
     objectname : str, optional
-                name of the object, if it is supposed to be styled individually
+        name of the object, if it is supposed to be styled individually
+    parent : QObject
+        the page the question is on
 
     Returns
     -------
@@ -24,13 +29,36 @@ def make_answers(answer, objectname=None):
     """
     hbox = QHBoxLayout()
     list_of_cb = []
-    if type(answer) is str:
+    if isinstance(answer, str):
         answer = [answer]  # to support questions with just one answer
-    for a in range(0, len(answer)):
-        cb = QCheckBox()
+    for a, answ in enumerate(answer):
+        cb = CheckBox(f'{qid}_{a}', parent)
         if objectname is not None:
             cb.setObjectName(objectname)
-        cb.setText(answer[a] + " ")
+        cb.setText(f'{answ} ')
         list_of_cb.append(cb)
         hbox.addWidget(cb)
     return hbox, list_of_cb
+
+
+class CheckBox(QCheckBox):
+    """Create a CheckBox with own ID"""
+    def __init__(self, cid, parent=None):
+        """Create a CheckBox with own ID
+
+        Parameters
+        ----------
+        cid : str
+            unique id of the CheckBox
+        parent : QObject
+            the page the question is on
+        """
+        QCheckBox.__init__(self, parent=parent)
+        self.id = cid
+        self.page = parent
+        self.toggled.connect(self.log)
+
+    def log(self):
+        """Create a log entry."""
+        # print(f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Toggled {self.id} to {self.isChecked()}')
+        self.page.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Toggled {self.id} to {self.isChecked()}'
diff --git a/src/AnswerRadioButton.py b/src/AnswerRadioButton.py
index f99af704a41423eb9d9a01a77e9eda48538c2a2e..cff85f60032fbeb74abbd3de40d0722bcee946a3 100644
--- a/src/AnswerRadioButton.py
+++ b/src/AnswerRadioButton.py
@@ -1,7 +1,7 @@
 """
 This class creates a set of radiobuttons.
 """
-from PyQt5.QtWidgets import QHBoxLayout, QRadioButton, QButtonGroup
+from PySide6.QtWidgets import QHBoxLayout, QRadioButton, QButtonGroup
 
 
 def make_answers(answer, parent, qid, objectname=None, start_answer_id=0, log=True):
@@ -33,10 +33,10 @@ def make_answers(answer, parent, qid, objectname=None, start_answer_id=0, log=Tr
     hbox = QHBoxLayout()
     bg = QButtonGroup(hbox)
     cnt = start_answer_id
-    if type(answer) is str:
+    if isinstance(answer, str):
         answer = [answer]  # to support questions with just one answer
-    for a in range(0, len(answer)):
-        rb = QRadioButton(answer[a])
+    for a, answ in enumerate(answer):
+        rb = QRadioButton(answ)
         if objectname is not None:
             rb.setObjectName(objectname)
         if not log and a == 0:
@@ -47,7 +47,7 @@ def make_answers(answer, parent, qid, objectname=None, start_answer_id=0, log=Tr
         bg.addButton(rb, cnt)
         cnt += 1
     if log:
-        bg.buttonClicked.connect(lambda: parent.log(qid))
+        bg.buttonClicked.connect(lambda: parent.log(qid, bg))
     else:  # for RadioMatrix
-        bg.buttonClicked.connect(lambda: parent.parent().log(qid))
+        bg.buttonClicked.connect(lambda: parent.parent().log(qid, bg))
     return hbox, bg
diff --git a/src/AnswerSlider.py b/src/AnswerSlider.py
index 60db94be9c3f1d25abbbbe645b2d4f44e095ecd7..f533ddccd7301442c8c1f4b53e1d33330708d252 100644
--- a/src/AnswerSlider.py
+++ b/src/AnswerSlider.py
@@ -1,31 +1,33 @@
 """
 This class creates a Slider.
 """
-from PyQt5.QtCore import Qt
-from PyQt5.QtWidgets import QVBoxLayout, QHBoxLayout, QLabel, QWidget
+from PySide6.QtCore import Qt
+from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout, QLabel, QWidget
 
 from src.LabeledSlider import LabeledSlider
 from src.Slider import Slider
 
 
-def make_answers(labelled, qid, smin, smax, sstart=0, sstep=1, header=None, label=None, parent=None, objectname=""):
+def make_answers(labelled, qid, smin, smax, sstart=0, sstep=1, tiv=1, header=None, label=None, parent=None, objectname=""):
     """
         Create a slider based on the given parameters.
 
         Parameters
-        ----------
+        ----------<
         labelled : bool
             if True each tick gets a numerical label; if False no tick labels are used.
         qid : str
             id of the question
         smin : int
-            lowest tick value
+            the lowest tick value
         smax : int
-            highest tick value
+            the highest tick value
         sstart : int, default=0
             starting position of handle (if <smin, smin is chosen, if >smax, smax is chosen)
         sstep : int, default=1
             difference between two successive values
+        tiv : int, default=1
+            difference between two successive tick labels
         header : list[str], optional
             array of strings to put above the slider
         label : list[str]
@@ -43,27 +45,28 @@ def make_answers(labelled, qid, smin, smax, sstart=0, sstep=1, header=None, labe
             the slider object itself
     """
     if labelled:
-        slider = LabeledSlider(minimum=smin, maximum=smax, start=sstart, step=sstep, labels=label, parent=parent, objectname=objectname)
-        slider.sl.valueChanged.connect(lambda: parent.log(qid))
+        tiv = sstep  # TODO integrieren
+        slider = LabeledSlider(minimum=smin, maximum=smax, start=sstart, step=sstep, tick_interval=tiv, labels=label, parent=parent, objectname=objectname)
+        slider.sl.valueChanged.connect(lambda: parent.log(qid, slider))
     else:
-        slider = Slider(Qt.Horizontal, parent=parent)
+        slider = Slider(Qt.Orientation.Horizontal, parent=parent)
         if objectname != "":
             slider.setObjectName(objectname)
-        slider.prepare_slider(min_val=smin, max_val=smax, start=sstart, step=sstep)
-        slider.valueChanged.connect(lambda: parent.log(qid))
+        slider.prepare_slider(min_val=smin, max_val=smax, start=sstart, step=sstep, sid=qid)
+        slider.valueChanged.connect(lambda: parent.log(qid, slider))
     if header is not None:
         layout = QVBoxLayout()
         header_layout = QHBoxLayout()
-        for h in range(0, len(header)-1):
+        for h in range(0, len(header) - 1):
             lbl = QLabel()
             lbl.setText(header[h])
-            lbl.setAlignment(Qt.AlignHCenter)
+            lbl.setAlignment(Qt.AlignmentFlag.AlignHCenter)
             lbl.setObjectName("SliderHeader")
             header_layout.addWidget(lbl)
             header_layout.addStretch()
         lbl = QLabel()
         lbl.setText(header[-1])
-        lbl.setAlignment(Qt.AlignHCenter)
+        lbl.setAlignment(Qt.AlignmentFlag.AlignHCenter)
         lbl.setObjectName("SliderHeader")
         header_layout.addWidget(lbl)
         header_widget = QWidget()
diff --git a/src/AnswerTextField.py b/src/AnswerTextField.py
index 037d3fbd21ff9fedc7253fae2ad0f72af5c54dd6..8d281a55621f43c93e6a9aa4fc71d2d871f58f61 100644
--- a/src/AnswerTextField.py
+++ b/src/AnswerTextField.py
@@ -1,9 +1,9 @@
 """
 This class creates a Textfield.
 """
-from PyQt5.QtCore import QRegExp, QLocale
-from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator
-from PyQt5.QtWidgets import QPlainTextEdit, QLineEdit
+from PySide6.QtCore import QRegularExpression, QLocale
+from PySide6.QtGui import QIntValidator, QDoubleValidator, QRegularExpressionValidator
+from PySide6.QtWidgets import QPlainTextEdit, QLineEdit
 
 
 def make_answers(size, qid, policy=None, parent=None, objectname=None):
@@ -42,15 +42,15 @@ def make_answers(size, qid, policy=None, parent=None, objectname=None):
                 text.setValidator(QIntValidator(bottom=int(policy[1]), top=int(policy[2])))
             elif policy[0].lower() == "double":
                 validator = QDoubleValidator(bottom=float(policy[1]), top=float(policy[2]), decimals=int(policy[3]))
-                validator.setNotation(QDoubleValidator.StandardNotation)
+                validator.setNotation(QDoubleValidator.Notation.StandardNotation)
                 # another parameter would be: notation (scientific 1.5E-2 or standard 0.015=default)
                 text.setValidator(validator)
                 if QLocale().decimalPoint() == ",":  # workaround: QDoubleValidator only registers "," but not "." (depending on locale)
                     text.textChanged.connect(lambda: text.setText(text.text().replace(".", ",")))
             elif policy[0].lower() == "regex":
-                text.setValidator(QRegExpValidator(QRegExp(policy[1])))
+                text.setValidator(QRegularExpressionValidator(QRegularExpression(policy[1])))
             else:
-                raise ValueError("Unknown validator found {}.".format(policy[0]))
+                raise ValueError(f"Unknown validator found {policy[0]}.")
     elif size > 1:
         # big text fields do not use validators
         text = QPlainTextEdit()
@@ -60,6 +60,6 @@ def make_answers(size, qid, policy=None, parent=None, objectname=None):
         # print(size, text.font().pointSize(), size * QFontMetrics(text.font()).lineSpacing())
         # text.setFixedHeight(size * QFontMetrics(text.font()).lineSpacing()*2)
     else:
-        raise ValueError("Size of text answer needs to be >= 1. Found {}.".format(size))
-    text.textChanged.connect(lambda: parent.log(qid))
+        raise ValueError(f"Size of text answer needs to be >= 1. Found {size}.")
+    text.textChanged.connect(lambda: parent.log(qid, text))
     return text
diff --git a/src/Configs/all_question_types.txt b/src/Configs/all_question_types.txt
index e4cabc5efc4cd32936a1e954a8bc7102ad45bbe9..36f200e5c97f945324423bf7cb01d06e2189346c 100644
--- a/src/Configs/all_question_types.txt
+++ b/src/Configs/all_question_types.txt
@@ -28,6 +28,11 @@ video_player = None
         type = Check
         answers = yes, no
         id = CB1
+    [[Check2]]
+        text = CheckBox example (0..n answers)
+        type = Check
+        answers = no, no
+        id = CB2
     [[HLine]]
         type = HLine
     [[Password]]
diff --git a/src/Configs/gosctest.txt b/src/Configs/gosctest.txt
deleted file mode 100644
index 6e67ff9653c0d822b5855b6472422a41872fed4d..0000000000000000000000000000000000000000
--- a/src/Configs/gosctest.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-# Created with QUEST version 1.0.6
-video_player = None
-global_osc_ip = 127.0.0.1
-global_osc_send_port = 9000
-global_osc_recv_port = 8000
-go_back = True
-back_text = Zurück
-forward_text = Weiter
-send_text = Absenden
-answer_pos = Ja
-answer_neg = Nein
-save_message = Sind Sie bereit den Fragebogen zu beenden und somit Ihre Angaben zu speichern?
-pagecount_text = Seite {} von {}
-filepath_results = ./results/resultsosc.csv
-delimiter = ;
-stylesheet = ./stylesheets/minimal.qss
-button_fade = 100
-randomization = None
-save_after = 2
-[1]
-title = ""
-[[1]]
-type = OSCButton
-id = oscb
-inscription = Press
-receiver = 127.0.0.1, 9000
-required = True
-address = /sth
-value = hello
-[2]
-title = ""
-[[2]]
-type = Check
-id = cb
-text = Did it receive?
-answers = yes, no
diff --git a/src/Configs/test.txt b/src/Configs/test.txt
deleted file mode 100644
index 54571af17ab6f7e15a83315d3f71ff9a256c44a8..0000000000000000000000000000000000000000
--- a/src/Configs/test.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-# Created with QUEST version 1.0.6
-video_player = None
-pupil_ip = 127.0.0.1
-pupil_port = 9001
-go_back = False
-back_text = Zurück
-forward_text = Weiter
-send_text = Absenden
-answer_pos = Ja
-answer_neg = Nein
-save_message = Sind Sie bereit den Fragebogen zu beenden und somit Ihre Angaben zu speichern?
-pagecount_text = Seite {} von {}
-filepath_results = ./results/results.csv
-delimiter = ;
-stylesheet = ./stylesheets/minimal.qss
-button_fade = 100
-randomization = None
-save_after = 2
-[1]
-title = ""
-pupil_on_next = test
-[2]
-title = ""
-[[test]]
-type = Text
-id = t1
-text = dies ist ein Test
-size = 1
-policy = None,
-[[OSC]]
-type = OSCButton
-id = osc
-inscription = Bitte Drücken
-receiver = 127.0.0.1, 9001
-address = /reply
-required = True
-value = page complete
diff --git a/src/GUI.py b/src/GUI.py
index 058d43d75bc43568308c50d43fa50cee89a8e513..1dc0ab447336d301d215be112051a2a4ce7daeb3 100644
--- a/src/GUI.py
+++ b/src/GUI.py
@@ -13,15 +13,16 @@ import threading
 import time
 
 import zmq
-from PyQt5.QtCore import Qt, QTimer
-from PyQt5.QtGui import QDoubleValidator
-from PyQt5.QtWidgets import QWidget, QPushButton, QLabel, QHBoxLayout, QVBoxLayout, QStackedWidget, QApplication, \
-    QMessageBox, QScrollArea, QButtonGroup, QCheckBox, QLineEdit, QPlainTextEdit, QSlider, QDesktopWidget, QSizePolicy
+from PySide6.QtCore import Qt, QTimer, Signal
+from PySide6.QtGui import QDoubleValidator, QGuiApplication
+from PySide6.QtWidgets import QWidget, QPushButton, QLabel, QHBoxLayout, QVBoxLayout, QStackedWidget, QApplication, \
+    QMessageBox, QScrollArea, QButtonGroup, QCheckBox, QLineEdit, QPlainTextEdit, QSlider, QSizePolicy
 from configobj import ConfigObj
 from ping3 import ping
 from pythonosc import udp_client, osc_server
 from pythonosc.dispatcher import Dispatcher
 
+from src.AnswerCheckBox import CheckBox
 from src.LabeledSlider import LabeledSlider
 from src.MUSHRA import MUSHRA
 from src.MessageBox import ResizeMessageBox
@@ -32,13 +33,13 @@ from src.PupilCoreButton import Button
 from src.RadioMatrix import RadioMatrix
 from src.Slider import Slider
 from src.Validator import listify, validate_questionnaire
-from src.Video import *
+from src.Video import madmapper, vlc
 from src.ABX import ABX
 from src.OSCButton import OSCButton
-from src.randomization import *
+from src.randomization import balanced_latin_squares, order_from_file
 
-TIMEOUT = 0.5  # TODO change this to your liking
-VERSION = "1.0.7"
+TIMEOUT = 1  # TODO timeout in seconds, change this to your liking (has to be int)
+VERSION = "1.1.0"
 
 
 class StackedWindowGui(QWidget):
@@ -75,7 +76,7 @@ class StackedWindowGui(QWidget):
         self.save_message = "Sind Sie bereit den Fragebogen zu beenden und somit Ihre Angaben zu speichern?"
         self.pagecount_text = "Seite {} von {}"
         self.filepath_results = './results/results.csv'
-        self.filepath_log = './results/log_{}_{}.txt'.format(self.get_participant_number(), datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S"))
+        self.filepath_log = f'./results/log_{self.get_participant_number()}_{datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")}.txt'
         self.log = ''
         self.delimiter = ';'
         self.audio_ip = None
@@ -107,29 +108,29 @@ class StackedWindowGui(QWidget):
         self.osc_server = None
 
         if not os.path.isfile(file):
-            raise FileNotFoundError("File {} does not exist.".format(file))
+            raise FileNotFoundError(f"File {file} does not exist.")
         else:
-            print("Loading {}".format(file))
+            print(f"Loading {file}")
 
         structure = ConfigObj(file)  # reads the config file into a nested dict, this is all the magic
         error_found, warning_found, warning_det = validate_questionnaire(listify(structure), True)
         if not error_found:
-            ans_continue = QMessageBox.Yes
+            ans_continue = QMessageBox.StandardButton.Yes
             if warning_found and popup:
                 msg = ResizeMessageBox()
                 msg.setWindowTitle("Validation Result")
                 msg.setSizeGripEnabled(True)
-                msg.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
-                msg.setIcon(QMessageBox.Warning)
+                msg.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
+                msg.setIcon(QMessageBox.Icon.Warning)
                 msg.setText("The validation detected incomplete info. Do you want to continue?")
                 warning_string = ""
                 for warn in warning_det:
                     warning_string += warn + "\n"
                 msg.setDetailedText(warning_string)
-                msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
-                msg.setDefaultButton(QMessageBox.No)
-                ans_continue = msg.exec_()
-            if ans_continue == QMessageBox.Yes or not popup:
+                msg.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
+                msg.setDefaultButton(QMessageBox.StandardButton.No)
+                ans_continue = msg.exec()
+            if ans_continue == QMessageBox.StandardButton.Yes or not popup:
                 for key in structure:
                     #  Style properties
                     if key == "stylesheet":
@@ -215,10 +216,10 @@ class StackedWindowGui(QWidget):
                         msg = QMessageBox()
                         msg.setWindowTitle(self.connection_lost_title)
                         msg.setSizeGripEnabled(True)
-                        msg.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
-                        msg.setIcon(QMessageBox.Information)
-                        msg.setText("No connection to {}.".format(self.help_ip))
-                        msg.exec_()
+                        msg.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
+                        msg.setIcon(QMessageBox.Icon.Information)
+                        msg.setText(f"No connection to {self.help_ip}.")
+                        msg.exec()
                 else:
                     self.help_client = None
                 if self.popup and not self.preview and self.global_osc_ip is not None and self.global_osc_send_port is not None:
@@ -226,12 +227,10 @@ class StackedWindowGui(QWidget):
                 else:
                     self.global_osc_client = None
                 if self.popup and not self.preview and self.global_osc_ip is not None and self.global_osc_recv_port is not None:
-                    #self.global_osc_client = udp_client.SimpleUDPClient(self.global_osc_ip, self.global_osc_send_port)
                     self.global_osc_server_thread = threading.Thread(target=self.osc_listener_default, args=[self.global_osc_recv_port])
                     self.global_osc_server_thread.daemon = True
                     self.global_osc_server_thread.start()
                 else:
-                    #self.global_osc_client = None
                     self.global_osc_server_thread = None
                 no_zmq_connection = False
                 if popup and not self.preview and self.pupil_ip is not None and self.pupil_port is not None:
@@ -239,7 +238,7 @@ class StackedWindowGui(QWidget):
                     self.pupil_remote = zmq.Socket(self.ctx, zmq.REQ)
                     self.pupil_remote.setsockopt(zmq.RCVTIMEO, 2000)
                     self.pupil_remote.connect('tcp://' + self.pupil_ip + ':' + self.pupil_port)
-                    print("Connect to pupil "+'tcp://' + self.pupil_ip + ':' + self.pupil_port)
+                    print("Connect to pupil " + 'tcp://' + self.pupil_ip + ':' + self.pupil_port)
                     self.pupil_remote.send_string("v")
                     retries_left = 3
                     success = False
@@ -255,9 +254,9 @@ class StackedWindowGui(QWidget):
                             if retries_left == 0 and self.popup:
                                 msg = QMessageBox()
                                 msg.setWindowTitle("Error")
-                                msg.setIcon(QMessageBox.Critical)
+                                msg.setIcon(QMessageBox.Icon.Critical)
                                 msg.setText("No connection with Pupil Capture possible!")
-                                msg.exec_()
+                                msg.exec()
                                 no_zmq_connection = True
                             if not no_zmq_connection:
                                 self.pupil_remote = zmq.Socket(self.ctx, zmq.REQ)
@@ -279,12 +278,12 @@ class StackedWindowGui(QWidget):
                     else:
                         self.audio_client = None
                         self.audio_server_thread = None
-                    self.filepath_log = '{}/log_{}_{}.txt'.format(self.filepath_results.rsplit("/", 1)[0], self.get_participant_number(), datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S"))
+                    self.filepath_log = f'{self.filepath_results.rsplit("/", 1)[0]}/log_{self.get_participant_number()}_{datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")}.txt'
                     if popup and not self.preview:
                         print(self.filepath_log)
 
                     if not os.path.isfile(stylesheet):
-                        raise FileNotFoundError("File {} does not exist.".format(stylesheet))
+                        raise FileNotFoundError(f"File {stylesheet} does not exist.")
                     else:
                         with open(stylesheet, 'r') as css_file:
                             self.css_data = css_file.read().replace('\n', '')
@@ -294,7 +293,7 @@ class StackedWindowGui(QWidget):
                     self.saved = False
 
                     self.start = datetime.datetime.now()
-                    self.log = "{} - Started GUI".format(self.start.replace(microsecond=0).__str__())
+                    self.log = f"{str(self.start.replace(microsecond=0))} - Started GUI"
 
                     self.Stack = QStackedWidget(self)
                     self.random_groups = []
@@ -358,8 +357,8 @@ class StackedWindowGui(QWidget):
                             for o in order:
                                 self.Stack.addWidget(random_pages[o - 1])
                     elif len(random_pages) > 0 and not popup:
-                        for page in range(len(random_pages)):
-                            self.Stack.addWidget(random_pages[page])
+                        for _, page in enumerate(random_pages):
+                            self.Stack.addWidget(page)
 
                     self.Stack.currentChanged[int].connect(self.on_current_changed)
 
@@ -383,7 +382,7 @@ class StackedWindowGui(QWidget):
                     if self.help_client is not None and self.help_text is not None:
                         self.help_button = QPushButton(self.help_text)
                         self.help_button.clicked.connect(lambda: self.help_client.send_message("/help_request", ""))
-                        self.help_button.clicked.connect(self.__click_animation)
+                        self.help_button.clicked.connect(lambda: self.__click_animation(self.help_button))
                         self.navigation.addWidget(self.help_button)
                         self.navigation.addStretch()
                     elif (self.preview or not self.popup) and self.help_ip is not None and self.help_port is not None and self.help_text is not None:
@@ -412,10 +411,10 @@ class StackedWindowGui(QWidget):
                     self.setLayout(outerlayout)
                     if self.popup and not self.preview:
                         self.showFullScreen()
-                        if self.width() <= QDesktopWidget().availableGeometry().width():
-                            scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
-                        if self.height() <= QDesktopWidget().availableGeometry().height():
-                            scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
+                        if self.width() <= QGuiApplication.primaryScreen().availableGeometry().width():
+                            scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
+                        if self.height() <= QGuiApplication.primaryScreen().availableGeometry().height():
+                            scroll.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
                         self.show()
                         self.on_current_changed(0)
                     else:
@@ -426,10 +425,10 @@ class StackedWindowGui(QWidget):
                                 self.disconnect_all(p.layout())
                         if self.preview and self.popup:
                             self.showFullScreen()
-                            if self.width() <= QDesktopWidget().availableGeometry().width():
-                                scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
-                            if self.height() <= QDesktopWidget().availableGeometry().height():
-                                scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
+                            if self.width() <= QGuiApplication.primaryScreen().availableGeometry().width():
+                                scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
+                            if self.height() <= QGuiApplication.primaryScreen().availableGeometry().height():
+                                scroll.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
                             self.show()
 
     def osc_listener_reaper(self, port):
@@ -441,7 +440,7 @@ class StackedWindowGui(QWidget):
                 the port to listen on
         """
         ip = socket.gethostbyname(socket.gethostname())
-        print("Listening on {}:{}".format(ip, port))
+        print(f"Listening on {ip}:{port}")
         dispatcher = Dispatcher()
         dispatcher.set_default_handler(self.play_state)
         self.reaper_server = osc_server.OSCUDPServer((ip, port), dispatcher)
@@ -456,27 +455,27 @@ class StackedWindowGui(QWidget):
                 the port to listen on
         """
         ip = socket.gethostbyname(socket.gethostname())
-        print("Listening on {}:{}".format(ip, port))
+        print(f"Listening on {ip}:{port}")
         dispatcher = Dispatcher()
         dispatcher.set_default_handler(self.osc_reply)  # Funktion, die ausgeführt wird
         self.osc_server = osc_server.OSCUDPServer((ip, port), dispatcher)
         self.osc_server.serve_forever()
 
-    def osc_reply(self, address, args):
+    def osc_reply(self, address, osc_args):
         """Monitor the incoming OSC messages from the default OSC listener.
 
             Parameters
             ----------
             address : string
                 OSC address of the message
-            args : tuple
+            osc_args : tuple
                 value(s) of the message
         """
-        print("Received", args)
-        self.global_osc_message = args
-        self.log += "\n{} - Received {} from global OSC".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.global_osc_message)
+        print("Received", osc_args, " from ", address)
+        self.global_osc_message = osc_args
+        self.log += f"\n{str(datetime.datetime.now().replace(microsecond=0))} - Received {self.global_osc_message} from global OSC"
 
-    def play_state(self, address, args):
+    def play_state(self, address, reap_args):
         """ Monitor the play state given by Reaper.
             Reaper will ping back any of the commands with either 0.0 or 1.0.
 
@@ -484,26 +483,25 @@ class StackedWindowGui(QWidget):
             ----------
             address : string
                 OSC address of the message
-            args : tuple
+            reap_args : tuple
                 value(s) of the message
         """
         if address in ["/play", "/pause", "/stop"]:
-            if address == "/play" and args[0] == 1.0:
+            if address == "/play" and reap_args[0] == 1.0:
                 self.global_play_state = "PLAY"
-            elif address == "/pause" and args[0] == 1.0:
+            elif address == "/pause" and reap_args[0] == 1.0:
                 self.global_play_state = "PAUSE"
-            elif address == "/stop" and args[0] == 1.0:
+            elif address == "/stop" and reap_args[0] == 1.0:
                 self.global_play_state = "STOP"
                 if not self.stop_initiated:
                     for player in self.Stack.currentWidget().players:
-                        if player.playing and ((type(player) is Player and (player.timer is None or player.timer.remainingTime() == 0)) or type(player) is MUSHRA):
+                        if player.playing and ((isinstance(player, Player) and (player.timer is None or player.timer.remainingTime() == 0)) or isinstance(player, MUSHRA)):
                             player.stop_button.setEnabled(False)
                             player.playing = False
                 else:
                     self.stop_initiated = False
         elif address.find("/track/") > -1 and int(address.split("/")[2]) > self.audio_tracks:
             self.audio_tracks = address.split("/")[2]
-            print("Changed audio_tracks to", self.audio_tracks)
 
     def disconnect_all(self, layout):
         """ Disconnect all widgets from their function for preview.
@@ -517,11 +515,17 @@ class StackedWindowGui(QWidget):
             child = layout.itemAt(i)
             if child.widget():
                 try:
-                    if type(child.widget()) == LabeledSlider:
-                        child.widget().sl.disconnect()
-                    if type(child.widget()) == Button:
-                        child.widget().button.disconnect()
-                    child.widget().disconnect()
+                    if isinstance(child.widget(), LabeledSlider):
+                        child.widget().sl.valueChanged.disconnect()
+                    if isinstance(child.widget(), Slider):
+                        child.widget().valueChanged.disconnect()
+                        if child.widget().receivers(Signal("mushra_stopped(str)")) > 0:
+                            child.widget().mushra_stopped.disconnect()
+                    if isinstance(child.widget(), Button):
+                        child.widget().button.clicked.disconnect()
+                    if isinstance(child.widget(), CheckBox):
+                        child.widget().toggled.disconnect()
+                    # child.widget().clicked.disconnect()
                 except TypeError:
                     pass
             if child.layout() is not None:
@@ -529,14 +533,14 @@ class StackedWindowGui(QWidget):
 
     def disconnect_nav(self):
         """Disconnect the navigation."""
-        self.forwardbutton.disconnect()
+        self.forwardbutton.clicked.disconnect()
         if self.go_back:
-            self.backbutton.disconnect()
+            self.backbutton.clicked.disconnect()
         if self.help_client is not None:
-            self.help_button.disconnect()
+            self.help_button.clicked.disconnect()
 
-    def __click_animation(self):
-        __btn = self.sender()
+    def __click_animation(self, btn):
+        __btn = btn
         __btn.setDown(True)
         QTimer.singleShot(self.button_fade, lambda: __btn.setDown(False))
 
@@ -550,34 +554,31 @@ class StackedWindowGui(QWidget):
         - When a player has a timer and didn't finish running, don't go to the next page
         """
         for player in self.Stack.currentWidget().players:  # stop current player
-            if player.playing and ((type(player) is Player and (player.timer is None or player.timer.remainingTime() == 0)) or type(player) is MUSHRA):
+            if player.playing and ((isinstance(player, Player) and (player.timer is None or player.timer.remainingTime() == 0)) or isinstance(player, MUSHRA)):
                 player.stop()
-                if type(player) is MUSHRA:
+                if isinstance(player, MUSHRA):
                     self.audio_client.send_message("/action", MUSHRA.unsolo_all)
         # check for required questions
         not_all_answered = False
         for quest in self.Stack.currentWidget().required.keys():
             if self.Stack.currentWidget().required[quest][0]:
                 ans = self.Stack.currentWidget().evaluationvars[quest]
-                if ((type(ans) is QButtonGroup) and (ans.checkedId() == -1)) or \
-                        ((type(ans) is QCheckBox) and not ans.isChecked()) or \
-                        ((type(ans) is QLineEdit or type(ans) is PasswordEntry) and (len(ans.text()) == 0)) or \
-                        ((type(ans) is QPlainTextEdit) and (len(ans.toPlainText()) == 0)) or \
-                        (((type(ans) is Slider) or (type(ans) is LabeledSlider)) and (ans.value() == ans.start) and not ans.get_moved()) or \
-                        ((type(ans) is list) and (len(ans) == 0)
-                         and not self.Stack.currentWidget().required[quest][3]) or \
-                        ((type(ans) is list) and (type(ans[0]) is list) and (0 in (len(x) for x in ans))
-                         and not self.Stack.currentWidget().required[quest][3]) or \
-                        ((type(ans) is bool) and not ans) or \
-                        (type(ans) is ABX and ([] in self.Stack.currentWidget().required[quest][3] or ans.answer.checkedId() == -1) or \
-                         (type(ans) is RadioMatrix) and (-1 in [bg.checkedId() for bg in ans.buttongroups])) or \
-                        ((type(ans) is OSCButton or type(ans) is Button) and not ans.used):
+                if (isinstance(ans, QButtonGroup) and (ans.checkedId() == -1)) or \
+                    (isinstance(ans, QCheckBox) and not ans.isChecked()) or \
+                    (isinstance(ans, (QLineEdit, PasswordEntry)) and (len(ans.text()) == 0)) or \
+                    (isinstance(ans, QPlainTextEdit) and (len(ans.toPlainText()) == 0)) or \
+                    (isinstance(ans, (Slider, LabeledSlider)) and (ans.value() == ans.start) and not ans.get_moved()) or \
+                    (isinstance(ans, list) and (len(ans) == 0) and not self.Stack.currentWidget().required[quest][3]) or \
+                    (isinstance(ans, list) and (isinstance(ans[0], list)) and (0 in (len(x) for x in ans)) and not self.Stack.currentWidget().required[quest][3]) or \
+                    (isinstance(ans, bool) and not ans) or \
+                    (isinstance(ans, ABX) and ([] in self.Stack.currentWidget().required[quest][3] or ans.answer.checkedId() == -1)) or \
+                    (isinstance(ans, RadioMatrix) and (-1 in [bg.checkedId() for bg in ans.buttongroups])) or \
+                    (isinstance(ans, (OSCButton, Button)) and not ans.used):
                     not_all_answered = True
-                    if (type(self.Stack.currentWidget().required[quest][1]) is QLabel) or \
-                            (type(self.Stack.currentWidget().required[quest][1]) is QPushButton):
+                    if isinstance(self.Stack.currentWidget().required[quest][1], (QLabel, QPushButton)):
                         self.Stack.currentWidget().required[quest][1].setObjectName("required")
                         self.Stack.currentWidget().required[quest][1].setStyleSheet(self.css_data)
-                    elif type(ans) is ABX:
+                    elif isinstance(ans, ABX):
                         if ans.answer.checkedId() == -1:
                             ans.label.setObjectName("required")
                         else:
@@ -606,36 +607,33 @@ class StackedWindowGui(QWidget):
                         ans.label.setStyleSheet(self.css_data)
                         self.Stack.currentWidget().required[quest][1][0].play_button.setStyleSheet(self.css_data)
                         self.Stack.currentWidget().required[quest][1][1].play_button.setStyleSheet(self.css_data)
-                    elif type(ans) is RadioMatrix:
+                    elif isinstance(ans, RadioMatrix):
                         for q in range(0, len(ans.questions)):
-                            not_answered = False
                             if ans.buttongroups[q].checkedId() == -1:
                                 self.Stack.currentWidget().required[quest][1][q].setObjectName("required")
-                                self.Stack.currentWidget().required[quest][1][q].setStyleSheet(self.css_data)
                             else:
                                 self.Stack.currentWidget().required[quest][1][q].setObjectName(
                                     str() if self.Stack.currentWidget().required[quest][2] is None else
                                     self.Stack.currentWidget().required[quest][2])
-                                self.Stack.currentWidget().required[quest][1][q].setStyleSheet(self.css_data)
+                            self.Stack.currentWidget().required[quest][1][q].setStyleSheet(self.css_data)
                     else:  # MUSHRA
                         for b in range(0, len(self.Stack.currentWidget().required[quest][1])):
                             if len(ans[b]) < 1:
                                 self.Stack.currentWidget().required[quest][1][b].setObjectName("required")
-                                self.Stack.currentWidget().required[quest][1][b].setStyleSheet(self.css_data)
                             else:
                                 self.Stack.currentWidget().required[quest][1][b].setObjectName(str() if self.Stack.currentWidget().required[quest][2] is None else self.Stack.currentWidget().required[quest][2])
-                                self.Stack.currentWidget().required[quest][1][b].setStyleSheet(self.css_data)
+                            self.Stack.currentWidget().required[quest][1][b].setStyleSheet(self.css_data)
                 else:
-                    if type(self.Stack.currentWidget().required[quest][1]) is QLabel:
+                    if isinstance(self.Stack.currentWidget().required[quest][1], QLabel):
                         if len(self.Stack.currentWidget().required[quest]) <= 2:
                             self.Stack.currentWidget().required[quest][1].setObjectName(str())
                         else:
                             self.Stack.currentWidget().required[quest][1].setObjectName(str() if self.Stack.currentWidget().required[quest][2] is None else self.Stack.currentWidget().required[quest][2])
                         self.Stack.currentWidget().required[quest][1].setStyleSheet(self.css_data)
-                    elif type(self.Stack.currentWidget().required[quest][1]) is QPushButton:
+                    elif isinstance(self.Stack.currentWidget().required[quest][1], QPushButton):
                         self.Stack.currentWidget().required[quest][1].setObjectName(str() if self.Stack.currentWidget().required[quest][2] is None else self.Stack.currentWidget().required[quest][2])
                         self.Stack.currentWidget().required[quest][1].setStyleSheet(self.css_data)
-                    elif type(ans) is ABX:
+                    elif isinstance(ans, ABX):
                         if ans.answer.checkedId() != -1:
                             ans.label.setObjectName(str() if self.Stack.currentWidget().required[quest][2] is None else self.Stack.currentWidget().required[quest][2])
                             ans.label.setStyleSheet(self.css_data)
@@ -648,7 +646,7 @@ class StackedWindowGui(QWidget):
                         if ans.x_button is not None and len(ans.x_button.duration) >= 1:
                             self.Stack.currentWidget().required[quest][1][2].play_button.setObjectName(str() if self.Stack.currentWidget().required[quest][2] is None else self.Stack.currentWidget().required[quest][2])
                             self.Stack.currentWidget().required[quest][1][2].play_button.setStyleSheet(self.css_data)
-                    elif type(ans) is RadioMatrix:
+                    elif isinstance(ans, RadioMatrix):
                         for q in range(0, len(ans.questions)):
                             if ans.buttongroups[q].checkedId() != -1:
                                 self.Stack.currentWidget().required[quest][1][q].setObjectName(
@@ -663,10 +661,10 @@ class StackedWindowGui(QWidget):
         timer_running = False
         pw_valid = True
         for child in self.Stack.currentWidget().children():
-            if type(child) is PasswordEntry:
+            if isinstance(child, PasswordEntry):
                 pw_valid = child.validate()
                 child.setStyleSheet(self.css_data)
-            elif type(child) is Player:
+            elif isinstance(child, Player):
                 if child.timer is not None and child.countdown > 0:
                     timer_running = True
         if not not_all_answered and pw_valid and not timer_running:
@@ -677,20 +675,20 @@ class StackedWindowGui(QWidget):
                 self.Stack.currentWidget().set_osc_message(self.global_osc_message)
             i = self.Stack.currentIndex() + 1
             if i + 1 <= self.Stack.count():
-                self.log += "\n{} - Changed to Page {}".format(datetime.datetime.now().replace(microsecond=0).__str__(), i + 1)
+                self.log += f'\n{str(datetime.datetime.now().replace(microsecond=0))} - Changed to Page {i + 1}'
             if self.go_back and (i == 1) and (self.Stack.count() > 1) and not self.saved:  # enable going back at page 2
                 self.backbutton.setEnabled(True)
-            if i == self.sections.index(self.save_after)+1:
+            if i == self.sections.index(self.save_after) + 1:
                 answer = self.continue_message()
-                if answer == QMessageBox.AcceptRole:
+                if answer in [QMessageBox.ButtonRole.YesRole, QMessageBox.ButtonRole.AcceptRole]:
                     if self.video_client is not None:
-                        self.video_client.send_message(self.video_player_commands['blue_screen'][0] if 'blue_screen' in self.video_player_commands.keys() else self.video_player_commands["stop"][0],
-                                                       self.video_player_commands['blue_screen'][1] if 'blue_screen' in self.video_player_commands.keys() else self.video_player_commands["stop"][1])
+                        self.video_client.send_message(self.video_player_commands['blue_screen'][0] if 'blue_screen' in self.video_player_commands else self.video_player_commands["stop"][0],
+                                                       self.video_player_commands['blue_screen'][1] if 'blue_screen' in self.video_player_commands else self.video_player_commands["stop"][1])
                     if not self.preview:
                         self.collect_and_save_data()
                     self.saved = True
                     self.Stack.setCurrentIndex(i)
-                    if self.Stack.currentIndex() == self.Stack.count()-1:
+                    if self.Stack.currentIndex() == self.Stack.count() - 1:
                         self.forwardbutton.setEnabled(False)
                     else:
                         self.forwardbutton.setText(self.forward_text)
@@ -717,11 +715,11 @@ class StackedWindowGui(QWidget):
         Handling of the back button linking.
         """
         for player in self.Stack.currentWidget().players:
-            if player.playing and ((type(player) is Player and (player.timer is None or player.timer.remainingTime() == 0)) or type(player) is MUSHRA):
+            if player.playing and ((isinstance(player, Player) and (player.timer is None or player.timer.remainingTime() == 0)) or isinstance(player, MUSHRA)):
                 player.stop()
         self.forwardbutton.setText(self.forward_text)
         i = self.Stack.currentIndex() - 1
-        self.log += "\n{} - Changed to Page {}".format(datetime.datetime.now().replace(microsecond=0).__str__(), i + 1)
+        self.log += f'\n{str(datetime.datetime.now().replace(microsecond=0))} - Changed to Page {i + 1}'
         if i > 0:
             self.Stack.setCurrentIndex(i)
             self.forwardbutton.setEnabled(True)
@@ -746,19 +744,19 @@ class StackedWindowGui(QWidget):
             self.page_label = QLabel(self.pagecount_text, None)
         if not self.preview and (len(self.Stack.widget(self.prev_index).players) > 0) and (len(self.Stack.widget(index).players) == 0):
             if self.video_client is not None:
-                self.video_client.send_message(self.video_player_commands['black_screen'][0] if 'black_screen' in self.video_player_commands.keys() else self.video_player_commands["stop"][0],
-                                               self.video_player_commands['black_screen'][1] if 'black_screen' in self.video_player_commands.keys() else self.video_player_commands["stop"][1])
+                self.video_client.send_message(self.video_player_commands['black_screen'][0] if 'black_screen' in self.video_player_commands else self.video_player_commands["stop"][0],
+                                               self.video_player_commands['black_screen'][1] if 'black_screen' in self.video_player_commands else self.video_player_commands["stop"][1])
         self.prev_index = index
 
         for player in self.Stack.currentWidget().players:
-            if type(player) == Player and (player.buttons == [] or "Play" not in player.buttons) and not self.preview and self.popup:
+            if isinstance(player, Player) and (player.buttons == [] or "Play" not in player.buttons) and not self.preview and self.popup:
                 player.play()
 
         if self.help_client is not None:
             help_str = str(index + 1)
             if len(self.Stack.currentWidget().players) > 0:
                 for player in self.Stack.currentWidget().players:
-                    help_str += '\tmarker:'+str(player.start_cue if type(player) != MUSHRA else player.start_cues)+' track:'+str(player.track if type(player) != MUSHRA else player.tracks)
+                    help_str += f'\tmarker:{player.start_cue if not isinstance(player, MUSHRA) else player.start_cues} track:{player.track if not isinstance(player, MUSHRA) else player.tracks}'
             self.help_client.send_message("/page", help_str)
 
     def closeEvent(self, event):
@@ -787,13 +785,14 @@ class StackedWindowGui(QWidget):
             value of the button clicked (True if it is supposed to be saved)
         """
         msg = QMessageBox()
-        msg.setIcon(QMessageBox.Question)
+        msg.setIcon(QMessageBox.Icon.Question)
         msg.setText(self.save_message)
         msg.setWindowFlags(Qt.CustomizeWindowHint)  # removes title bar
-        msg.addButton(self.answer_pos, QMessageBox.AcceptRole)
-        msg.addButton(self.answer_neg, QMessageBox.RejectRole)
+        msg.addButton(self.answer_pos, QMessageBox.ButtonRole.AcceptRole)
+        msg.addButton(self.answer_neg, QMessageBox.ButtonRole.RejectRole)
         msg.setStyleSheet(self.css_data)
-        retval = msg.exec_()
+        msg.exec()
+        retval = msg.buttonRole(msg.clickedButton())
         return retval
 
     def collect_and_save_data(self):
@@ -812,12 +811,12 @@ class StackedWindowGui(QWidget):
                 self.pupil_remote.recv_string()
             except zmq.ZMQError:
                 print("Couldn't connect with Pupil Capture!")
-                
+
         emoji_pattern = re.compile("["
-                                u"\U0001F600-\U0001F64F" # emoticons
-                                u"\U0001F300-\U0001F5FF" # symbols & pictographs
-                                u"\U0001F680-\U0001F6FF" # transport & map symbols
-                                u"\U0001F1E0-\U0001F1FF" # flags (iOS)
+                                u"\U0001F600-\U0001F64F"  # emoticons
+                                u"\U0001F300-\U0001F5FF"  # symbols & pictographs
+                                u"\U0001F680-\U0001F6FF"  # transport & map symbols
+                                u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
                                 u"\U00002500-\U000027B0"
                                 u"\U000024C2-\U0001F251"
                                 u"\U0001f926-\U0001f937"
@@ -839,38 +838,38 @@ class StackedWindowGui(QWidget):
         for s in range(0, self.Stack.count()):
             if self.Stack.widget(s).evaluationvars is not None:
                 for qid, ans in self.Stack.widget(s).evaluationvars.items():
-                    if type(ans) is ABX:
+                    if isinstance(ans, ABX):
                         fields[qid + "_order"] = ans.order
                         fields[qid + "_answer"] = ans.answer.checkedId()
                         fields[qid + "_duration_A"] = ans.a_button.duration
                         fields[qid + "_duration_B"] = ans.b_button.duration
                         if ans.x_button is not None:
                             fields[qid + "_duration_X"] = ans.x_button.duration
-                    elif type(ans) is RadioMatrix:
-                        for pqid in range(len(ans.id_order)):
+                    elif isinstance(ans, RadioMatrix):
+                        for pqid, rmans in enumerate(ans.id_order):
                             if len(ans.questions) >= 10:
-                                fields[qid + "_{0:02d}".format(ans.id_order[pqid])] = ans.buttongroups[pqid].checkedId()
+                                fields[f'{qid}_{rmans:02d}'] = ans.buttongroups[pqid].checkedId()
                             else:
-                                fields[qid + "_{}".format(ans.id_order[pqid])] = ans.buttongroups[pqid].checkedId()
+                                fields[f'{qid}_{rmans}'] = ans.buttongroups[pqid].checkedId()
                         fields[qid + "_order"] = ans.id_order
                     else:
-                        if type(ans) is QButtonGroup:
+                        if isinstance(ans, QButtonGroup):
                             fields[qid] = ans.checkedId()
-                        elif type(ans) is QCheckBox:
+                        elif isinstance(ans, QCheckBox):
                             fields[qid] = ans.isChecked()
-                        elif type(ans) is QLineEdit or type(ans) is PasswordEntry:
-                            if type(ans.validator()) == QDoubleValidator:
+                        elif isinstance(ans, (QLineEdit, PasswordEntry)):
+                            if isinstance(ans.validator(), QDoubleValidator):
                                 ans.setText(ans.text().replace(",", "."))
                             fields[qid] = ans.text()
                             # remove any emojis
-                            fields[qid] = re.sub(emoji_pattern, '', fields[qid]) 
-                        elif type(ans) is QPlainTextEdit:
+                            fields[qid] = re.sub(emoji_pattern, '', fields[qid])
+                        elif isinstance(ans, QPlainTextEdit):
                             fields[qid] = ans.toPlainText().replace("\n", " ")
                             # remove any emojis
-                            fields[qid] = re.sub(emoji_pattern, '', fields[qid])  
-                        elif (type(ans) is Slider) or (type(ans) is LabeledSlider) or (type(ans) is QSlider):
+                            fields[qid] = re.sub(emoji_pattern, '', fields[qid])
+                        elif isinstance(ans, (Slider, LabeledSlider, QSlider)):
                             fields[qid] = ans.value()
-                        elif (type(ans) is Button) or type(ans) is OSCButton:
+                        elif isinstance(ans, (Button, OSCButton)):
                             fields[qid] = ans.used
                         else:
                             fields[qid] = ans
@@ -878,24 +877,24 @@ class StackedWindowGui(QWidget):
             fields["Order"] = []
             for rg in self.random_groups:
                 if not fields["data_row_number"] == -1:
-                    fields["Order"].append(balanced_latin_squares(rg)[(self.get_participant_number()-1) % len(balanced_latin_squares(rg))])
+                    fields["Order"].append(balanced_latin_squares(rg)[(self.get_participant_number() - 1) % len(balanced_latin_squares(rg))])
                 else:
                     fields["Order"] = "unknown"
         elif self.rand == "from file":
-            fields["Order"] = order_from_file(self.rand_file)[self.get_participant_number()-1]
+            fields["Order"] = order_from_file(self.rand_file)[self.get_participant_number() - 1]
 
         end = datetime.datetime.now()
-        self.log += "\n{} - Finished Questionnaire".format(end.replace(microsecond=0).__str__())
-        fields["Start"] = self.start.__str__()
-        fields["End"] = end.__str__()
+        self.log += f'\n{str(end.replace(microsecond=0))} - Finished Questionnaire'
+        fields["Start"] = str(self.start)
+        fields["End"] = str(end)
 
         path = self.filepath_log.rsplit("/", 1)
         if not os.path.exists(self.filepath_log):
             if path[0] != "." and path[0] != [".."]:
                 os.makedirs(path[0] + "/", exist_ok=True)
         # remove any emojis
-        self.log = re.sub(emoji_pattern, '', self.log)   
-        
+        self.log = re.sub(emoji_pattern, '', self.log)
+
         log_file = open(self.filepath_log, 'w')
         log_file.write(self.log)
         log_file.close()
@@ -908,20 +907,22 @@ class StackedWindowGui(QWidget):
                 writer = csv.writer(csvfile, delimiter=self.delimiter)
                 header = fields.keys()
                 writer.writerow(header)
-
+                print("wrote header")
+        print("resultsfile exists", os.path.exists(self.filepath_results))
+        time.sleep(5)
         try:
             headers = []
             with open(self.filepath_results, 'r', newline='', encoding='utf_8') as f:
                 d_reader = csv.DictReader(f, delimiter=self.delimiter)
                 headers = d_reader.fieldnames
-                print(headers)
+                # print("Header",headers)
             time.sleep(2)
             with open(self.filepath_results, "a", newline='', encoding='utf_8') as csvfile:
                 writer = csv.writer(csvfile, delimiter=self.delimiter)
                 row = []
-                print(headers)
-                for field in range(0, len(headers)):
-                    row.append(fields[headers[field]])
+                # print(headers)
+                for _, hfield in enumerate(headers):
+                    row.append(fields[hfield])
                 writer.writerow(row)
         except (PermissionError, KeyError):
             print("Can not access results file, saving backup!")
@@ -929,15 +930,15 @@ class StackedWindowGui(QWidget):
                 participant_number = self.get_participant_number()
             except PermissionError:  # file can't be read
                 participant_number = "unknown"
-            self.filepath_results = path[0]+"/"+str(participant_number)+"_backup_"+datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")+".csv"
-            print("Backup file: {}".format(self.filepath_results))
+            self.filepath_results = f'{path[0]}/{participant_number}_backup_{datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")}.csv'
+            print(f'Backup file: {self.filepath_results}')
             with open(self.filepath_results, "w+", newline='', encoding='utf_8') as csvfile:
                 writer = csv.writer(csvfile, delimiter=self.delimiter)
                 header = list(fields.keys())
                 writer.writerow(header)
                 row = []
-                for field in range(0, len(header)):
-                    row.append(fields[header[field]])
+                for _, hfield in enumerate(header):
+                    row.append(fields[hfield])
                 writer.writerow(row)
 
         print("DONE")
@@ -973,10 +974,10 @@ class StackedWindowGui(QWidget):
                 msg = QMessageBox()
                 msg.setWindowTitle(self.connection_lost_title)
                 msg.setSizeGripEnabled(True)
-                msg.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
-                msg.setIcon(QMessageBox.Information)
+                msg.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
+                msg.setIcon(QMessageBox.Icon.Information)
                 msg.setText(self.connection_lost_text)
-                msg.exec_()
+                msg.exec()
         if self.video_ip is not None:
             host = self.video_ip
             response = ping(host, timeout=TIMEOUT)
@@ -986,10 +987,10 @@ class StackedWindowGui(QWidget):
                 msg = QMessageBox()
                 msg.setWindowTitle(self.connection_lost_title)
                 msg.setSizeGripEnabled(True)
-                msg.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
-                msg.setIcon(QMessageBox.Information)
+                msg.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
+                msg.setIcon(QMessageBox.Icon.Information)
                 msg.setText(self.connection_lost_text)
-                msg.exec_()
+                msg.exec()
         if self.pupil_ip is not None:
             host = self.pupil_ip
             response = ping(host, timeout=TIMEOUT)
@@ -999,10 +1000,10 @@ class StackedWindowGui(QWidget):
                 msg = QMessageBox()
                 msg.setWindowTitle(self.connection_lost_title)
                 msg.setSizeGripEnabled(True)
-                msg.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
-                msg.setIcon(QMessageBox.Information)
+                msg.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
+                msg.setIcon(QMessageBox.Icon.Information)
                 msg.setText(self.connection_lost_text)
-                msg.exec_()
+                msg.exec()
 
 
 if __name__ == '__main__':
@@ -1012,4 +1013,4 @@ if __name__ == '__main__':
 
     app = QApplication(sys.argv)
     ex = StackedWindowGui(args.file)
-    sys.exit(app.exec_())
+    sys.exit(app.exec())
diff --git a/src/Image.py b/src/Image.py
index 6596a78c7bb756d151eb6cc4d6f9d86b6fcb10a0..dd9709e829112d98134074037f308a4afb5926a1 100644
--- a/src/Image.py
+++ b/src/Image.py
@@ -1,7 +1,7 @@
 """A question type to display an image in the questionnaire."""
 
-from PyQt5.QtGui import QPixmap
-from PyQt5.QtWidgets import QLabel
+from PySide6.QtGui import QPixmap
+from PySide6.QtWidgets import QLabel
 
 
 class Image(QLabel):
@@ -15,9 +15,9 @@ class Image(QLabel):
         ----------
         file : str
             image file to display
-        x : int, opt
+        x : Union(int, None), opt
             x coordinate of top left corner (to the right)
-        y : int, opt
+        y : Union(int, None), opt
             y coordinate of top left corner (down)
         width : int, optional
             width in display
diff --git a/src/LabeledSlider.py b/src/LabeledSlider.py
index e39622d1b5625886e6aca5528df8323d737c0029..360367eef5c6cda859f04a7821f41f7cf2eb7a5b 100644
--- a/src/LabeledSlider.py
+++ b/src/LabeledSlider.py
@@ -3,10 +3,10 @@
 This functionality is from: https://stackoverflow.com/questions/47494305/python-pyqt4-slider-with-tick-labels
 """
 
-from PyQt5 import QtWidgets
-from PyQt5.QtCore import QRect, QPoint, Qt, QObject
-from PyQt5.QtGui import QPainter
-from PyQt5.QtWidgets import QStyle, QStyleOptionSlider
+from PySide6 import QtWidgets
+from PySide6.QtCore import QRect, QPoint, Qt
+from PySide6.QtGui import QPainter
+from PySide6.QtWidgets import QStyle, QStyleOptionSlider
 
 from src.Slider import Slider
 
@@ -18,7 +18,7 @@ class LabeledSlider(QtWidgets.QWidget):
     This functionality is from: https://stackoverflow.com/questions/47494305/python-pyqt4-slider-with-tick-labels
     """
 
-    def __init__(self, minimum, maximum, start, step=1, orientation=Qt.Horizontal, labels=None, parent=None, objectname=None):
+    def __init__(self, minimum, maximum, start, step=1, tick_interval=1, orientation=Qt.Orientation.Horizontal, labels=None, parent=None, objectname=None):
         """
 
         Parameters
@@ -30,7 +30,9 @@ class LabeledSlider(QtWidgets.QWidget):
         start : int
             default position of the slider's handle, if outside minimum/maximum, it is set to the nearest value
         step : int, default=1
-            numerical distance between tick values
+            numerical distance between valid values
+        tick_interval : int, default=1
+            numerical distance between displayed ticks values
         orientation : Qt.Orientation, default=Qt.Horizontal
             orientation of the slider
         labels : list[str] or tuple[str], default=None
@@ -50,8 +52,8 @@ class LabeledSlider(QtWidgets.QWidget):
         """
         super(LabeledSlider, self).__init__(parent=parent)
 
-        levels = range(int((maximum-minimum)/step)+1) if minimum < maximum \
-            else range((int((maximum-minimum)/step)*-1+1))
+        levels = range(int((maximum - minimum) / tick_interval) + 1) if minimum < maximum \
+            else range((int((maximum - minimum) / tick_interval) * -1 + 1))
         if labels is not None:
             if not isinstance(labels, (tuple, list)):
                 raise TypeError("<labels> is a list or tuple.")
@@ -62,17 +64,15 @@ class LabeledSlider(QtWidgets.QWidget):
             else:
                 new_labels = [""] * len(levels)
                 for pair in labels:
-                    new_labels[int(abs(pair[0]-minimum)/step)] = pair[1]
+                    new_labels[int(abs(pair[0] - minimum) / tick_interval)] = pair[1]
                 self.levels = list(zip(levels, new_labels))
         else:
-            labels = self.create_range(minimum, maximum, step)
-            # levels = range(minimum, maximum + step, step) if minimum < maximum \
-            #    else range(minimum, maximum + step * -1, step * -1)
+            labels = self.create_range(minimum, maximum, tick_interval)
             self.levels = list(zip(levels, map(str, labels)))
 
-        if orientation == Qt.Horizontal:
+        if orientation == Qt.Orientation.Horizontal:
             self.layout = QtWidgets.QVBoxLayout(self)
-        elif orientation == Qt.Vertical:
+        elif orientation == Qt.Orientation.Vertical:
             self.layout = QtWidgets.QHBoxLayout(self)
         else:
             raise ValueError("<orientation> wrong.")
@@ -89,7 +89,7 @@ class LabeledSlider(QtWidgets.QWidget):
         self.sl = Slider(orientation, parent=parent)
         if objectname is not None:
             self.sl.setObjectName(objectname)
-        self.sl.prepare_slider(minimum, maximum, start, step, tickpos=QtWidgets.QSlider.TicksBelow if orientation == Qt.Horizontal else QtWidgets.QSlider.TicksLeft)
+        self.sl.prepare_slider(minimum, maximum, start, step=step, tickpos=QtWidgets.QSlider.TickPosition.TicksBelow if orientation == Qt.Orientation.Horizontal else QtWidgets.QSlider.TickPosition.TicksLeft)
 
         self.layout.addWidget(self.sl)
 
@@ -128,53 +128,44 @@ class LabeledSlider(QtWidgets.QWidget):
         st_slider.initFrom(self.sl)
         st_slider.orientation = self.sl.orientation()
 
-        length = style.pixelMetric(QStyle.PM_SliderLength, st_slider, self.sl)
-        available = style.pixelMetric(QStyle.PM_SliderSpaceAvailable, st_slider, self.sl)
+        available = style.pixelMetric(QStyle.PixelMetric.PM_SliderSpaceAvailable, st_slider, self.sl)
 
         for v, v_str in self.levels:
 
             # get the size of the label
-            if type(v_str) != str:
+            if not isinstance(v_str, str):
                 v_str = str(v_str)
-            rect = painter.drawText(QRect(), Qt.TextDontPrint | Qt.TextDontClip, v_str)
-            rect.setHeight(int(rect.height()*1.5))
+            rect = painter.drawText(QRect(), Qt.TextFlag.TextDontPrint | Qt.TextFlag.TextDontClip, v_str)
+            rect.setHeight(int(rect.height() * 1.5))
 
-            if self.sl.orientation() == Qt.Horizontal:
+            if self.sl.orientation() == Qt.Orientation.Horizontal:
                 # I assume the offset is half the length of slider, therefore + length//2
-                x_loc = QStyle.sliderPositionFromValue(self.sl.minimum(), self.sl.maximum(), v, available, self.sl.invertedAppearance()) + length // 2
-
-                # left bound of the text = center - half of text width + L_margin
-                left = x_loc - int(rect.width() / 2) + self.left_margin
-                bottom = self.rect().bottom() - int(self.rect().height()/6)
+                x_loc = v * available / (len(self.levels) - 1)  # Because SOMEHOW sliderPositionFromValue does no like inverted sliders
 
+                left = int(x_loc - rect.width() / 2)
+                bottom = self.rect().bottom() - int(self.rect().height() / 7)
+                if v == 0 and left < 0:
+                    left = 0
+                
                 # enlarge margins if clipping
-                if v == self.sl.minimum():
-                    if left <= 0:
-                        self.left_margin = rect.width() // 2 - x_loc
-                    if self.bottom_margin <= rect.height():
-                        self.bottom_margin = rect.height()
-
-                    self.layout.setContentsMargins(self.left_margin, self.top_margin, self.right_margin, self.bottom_margin)
+                if self.bottom_margin < rect.height():
+                    self.bottom_margin = rect.height()
 
-                if v == self.sl.maximum() and rect.width() // 2 >= self.right_margin:
+                if v == len(self.levels) - 1 and rect.width() // 2 > self.right_margin and left + rect.width() > available:
                     self.right_margin = rect.width() // 2
-                    self.layout.setContentsMargins(self.left_margin, self.top_margin, self.right_margin, self.bottom_margin)
+                
+                self.layout.setContentsMargins(self.left_margin, self.top_margin, self.right_margin, self.bottom_margin)
 
             else:
-                y_loc = QStyle.sliderPositionFromValue(self.sl.minimum(), self.sl.maximum(), v, available, upsideDown=True)  # , self.sl.invertedAppearance() todo
-
-                bottom = y_loc + length // 2 + rect.height() // 2 + self.top_margin - 3
-                # there is a 3 px offset that I can't attribute to any metric
+                y_loc = QStyle.sliderPositionFromValue(self.sl.minimum(), self.sl.maximum(), v, available, upsideDown=True)
 
+                bottom = y_loc + rect.height()
                 left = self.left_margin - rect.width()
-                if left <= 0:
-                    self.left_margin = rect.width() + 2
-                    self.layout.setContentsMargins(self.left_margin, self.top_margin, self.right_margin, self.bottom_margin)
 
             pos = QPoint(left, bottom)
             painter.drawText(pos, str(v_str))
 
-    def create_range(self, minimum, maximum, step):
+    def create_range(self, minimum, maximum, tick_step):
         """
         Create a range with floats.
 
@@ -184,7 +175,7 @@ class LabeledSlider(QtWidgets.QWidget):
             minimum value
         maximum : int
             maximum value
-        step : float
+        tick_step : float
             stepwidth
 
         Returns
@@ -193,24 +184,23 @@ class LabeledSlider(QtWidgets.QWidget):
             created range
         """
         vals = []
-        if int(step) == float(step) and int(minimum) == float(minimum) and int(maximum) == float(maximum):
-            step = int(step)
+        if int(tick_step) == float(tick_step) and int(minimum) == float(minimum) and int(maximum) == float(maximum):
+            tick_step = int(tick_step)
             minimum = int(minimum)
             maximum = int(maximum)
-            vals = range(minimum, maximum + step, step) if minimum < maximum else range(minimum, maximum - step, -1 * step)
+            vals = range(minimum, maximum + tick_step, tick_step) if minimum < maximum else range(minimum, maximum - tick_step, -1 * tick_step)
         else:
             tmp = None
             minimum = float(minimum)
             if minimum > maximum:
-                tmp = minimum
-                minimum = maximum
-                maximum = tmp
+                minimum, maximum = maximum, minimum
+                tmp = True
             while minimum <= maximum:
                 if int(minimum) == float(minimum):
                     vals.append(int(minimum))
                 else:
-                    vals.append(round(minimum, str(step)[::-1].find('.')) if round(minimum, str(step)[::-1].find('.')) != -0.0 else 0.0)
-                minimum += step
+                    vals.append(round(minimum, str(tick_step)[::-1].find('.')) if round(minimum, str(tick_step)[::-1].find('.')) != -0.0 else 0.0)
+                minimum += tick_step
             if tmp is not None:
                 vals.reverse()
         return vals
diff --git a/src/Launcher.py b/src/Launcher.py
index 9ab169759c1bd8c7d049d6f616ff6a4ca8161d13..8a0052c1fd726bd885a2a922bd0f4fa7be7462c6 100644
--- a/src/Launcher.py
+++ b/src/Launcher.py
@@ -3,7 +3,7 @@ Main entry point for the project.
 """
 import sys
 
-from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QFileDialog, QMessageBox
+from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QFileDialog, QMessageBox
 
 from src.GUI import StackedWindowGui, VERSION
 from src.QEditGui import QEditGuiMain
@@ -30,23 +30,23 @@ class Launcher(QWidget):
         self.questionnaire_window = None
         self.setStyleSheet("QPushButton {padding: 7px; margin: 3px; }")
         self.setLayout(layout)
-        self.setWindowTitle("QUEST {}".format(VERSION))
+        self.setWindowTitle(f'QUEST {VERSION}')
         self.show()
 
     def run_questionnaire(self):
         """Get questionnaire file and run the GUI."""
         dlg = QFileDialog(self)
-        dlg.setFileMode(QFileDialog.ExistingFile)
+        dlg.setFileMode(QFileDialog.FileMode.ExistingFile)
         dlg.setNameFilter("Text files (*.txt)")
         dlg.setStyle(self.style())
 
-        if dlg.exec_():
+        if dlg.exec():
             file = dlg.selectedFiles()[0]
             self.questionnaire_window = StackedWindowGui(file)
 
     def run_questionnaire_editor(self):
         """Run the questionnaire editor GUI."""
-        editgui = QEditGuiMain(self)
+        editgui = QEditGuiMain()
         editgui.show()
 
     @staticmethod
@@ -54,15 +54,15 @@ class Launcher(QWidget):
         """Display basic information about the software and a link to the wiki."""
         msg = QMessageBox()
         msg.setWindowTitle("Help / About")
-        msg.setIcon(QMessageBox.Information)
+        msg.setIcon(QMessageBox.Icon.Information)
         msg.setText("This software was created by Daphne Schössow.")
         msg.setInformativeText("For detailed instructions on how to use this software, "
                                "have a look at the <a href=https://gitlab.uni-hannover.de/da.schoessow/quest/-/wikis/overview>wiki</a> of this project at gitlab. "
-                               "For further problems, feature request, or feedback create an issue at gitlab or contact <a href=mailto:daphne.schoessow@ikt.uni-hannover.de> via mail</a>.")
-        msg.exec_()
+                               "For further problems, feature request, or feedback create an issue at gitlab or contact <a href=mailto:schoessow@ikt.uni-hannover.de> via mail</a>.")
+        msg.exec()
 
 
 if __name__ == '__main__':
     app = QApplication([])
     ex = Launcher()
-    sys.exit(app.exec_())
+    sys.exit(app.exec())
diff --git a/src/Lines.py b/src/Lines.py
index c4655becfde267648a6431e10dcd0b2e4e1aab46..3f3d26d867bf44ca595ac03a529fb0b9eb034bc3 100644
--- a/src/Lines.py
+++ b/src/Lines.py
@@ -1,11 +1,11 @@
 """ Helper to create lines.
 
-These classes are used to create neat lines in PyQt5, which can be used e.g. as separators.
+These classes are used to create neat lines in PySide6, which can be used e.g. as separators.
 The idea is adapted from:
 https://stackoverflow.com/questions/5671354/how-to-programmatically-make-a-horizontal-line-in-qt
 """
 
-from PyQt5.QtWidgets import QFrame
+from PySide6.QtWidgets import QFrame
 
 
 class QHLine(QFrame):
@@ -21,8 +21,8 @@ class QHLine(QFrame):
                 name of the object, if it is supposed to be styled individually
         """
         super(QHLine, self).__init__()
-        self.setFrameShape(QFrame.HLine)
-        self.setFrameShadow(QFrame.Sunken)
+        self.setFrameShape(QFrame.Shape.HLine)
+        self.setFrameShadow(QFrame.Shadow.Sunken)
         if objectname is not None:
             self.setObjectName(objectname)
 
@@ -40,7 +40,7 @@ class QVLine(QFrame):
                 name of the object, if it is supposed to be styled individually
         """
         super(QVLine, self).__init__()
-        self.setFrameShape(QFrame.VLine)
-        self.setFrameShadow(QFrame.Sunken)
+        self.setFrameShape(QFrame.Shape.VLine)
+        self.setFrameShadow(QFrame.Shadow.Sunken)
         if objectname is not None:
             self.setObjectName(objectname)
diff --git a/src/MUSHRA.py b/src/MUSHRA.py
index ac996b8888165203fbc78e3c420270053d5c49b5..b0f64cb8150f68084c274b9dbd641f377c8f371b 100644
--- a/src/MUSHRA.py
+++ b/src/MUSHRA.py
@@ -2,8 +2,8 @@
 import datetime
 from time import time
 
-from PyQt5.QtCore import Qt, QSignalMapper, QObject, QTimer
-from PyQt5.QtWidgets import QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QLabel, QSlider, QSizePolicy
+from PySide6.QtCore import Qt, QSignalMapper, QTimer
+from PySide6.QtWidgets import QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QLabel, QSlider, QSizePolicy
 
 from src.Slider import Slider
 
@@ -75,7 +75,7 @@ class MUSHRA(QWidget):
         self.id = qid
         self.start_cues = start_cues
         self.end_cues = end_cues
-        if type(tracks) is str and ("[" not in tracks and "]" not in tracks and "," not in tracks):
+        if isinstance(tracks, str) and ("[" not in tracks and "]" not in tracks and "," not in tracks):
             tracks = [int(tracks)]
         self.tracks = tracks
         self.start = 0
@@ -114,67 +114,65 @@ class MUSHRA(QWidget):
                 labels.addStretch(int(height / 10))
                 l90 = QLabel("excellent")
                 l90.setObjectName(self.objectName())
-                l90.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
+                l90.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
                 labels.addWidget(l90)
                 labels.addStretch(int(height / 5))
                 l70 = QLabel("good")
                 l70.setObjectName(self.objectName())
-                l70.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
+                l70.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
                 labels.addWidget(l70)
                 labels.addStretch(int(height / 5))
                 l50 = QLabel("fair")
                 l50.setObjectName(self.objectName())
-                l50.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
+                l50.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
                 labels.addWidget(l50)
                 labels.addStretch(int(height / 5))
                 l30 = QLabel("poor")
                 l30.setObjectName(self.objectName())
-                l30.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
+                l30.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
                 labels.addWidget(l30)
                 labels.addStretch(int(height / 5))
                 l10 = QLabel("bad")
                 l10.setObjectName(self.objectName())
-                l10.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
+                l10.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
                 labels.addWidget(l10)
                 labels.addStretch(int(height / 10))
                 self.refbutton = QPushButton("Reference")
                 self.refbutton.setObjectName(self.objectName())
-                self.refbutton.clicked.connect(lambda: self.play(0))
-                self.refbutton.clicked.connect(self.__click_animation)
+                self.refbutton.clicked.connect(lambda: self.play(0, self.refbutton))
+                self.refbutton.clicked.connect(lambda: self.__click_animation(self.refbutton))
                 labels.addWidget(self.refbutton)
                 h.addItem(labels)
                 h.addSpacing(5)
             else:
-                slider = Slider(Qt.Vertical, parent=parent)
+                slider = Slider(Qt.Orientation.Vertical, parent=parent)
                 slider.setObjectName(self.objectName())
                 slider.setMinimumHeight(self.slider_height)
-                slider.prepare_slider(min_val=0, max_val=100, start=100, step=20, tickpos=QSlider.TicksLeft)
+                slider.prepare_slider(min_val=0, max_val=100, start=100, step=1, tick_interval=20, tickpos=QSlider.TickPosition.TicksLeft, sid=f'{self.id}_{len(self.sliders) + 1}')
                 slider.setEnabled(False)
-                slider.valueChanged.connect(mapper.map)
-                mapper.setMapping(slider, self.id + "_{}".format(m))
                 self.sliders.append(slider)
-                slider.mushra_stopped.connect(lambda: self.parent().log(self.id + "_{}".format(self.sliders.index(mapper.sender())+1)))
-                lbl = QLabel("{}".format(slider.value()))
+                slider.mushra_stopped.connect(self.raise_log)
+                lbl = QLabel(f'{slider.value()}')
                 lbl.setObjectName(self.objectName())
-                lbl.setAlignment(Qt.AlignHCenter)
+                lbl.setAlignment(Qt.AlignmentFlag.AlignHCenter)
                 self.labels.append(lbl)
                 slider.valueChanged.connect(self.update_label)
-                start_button = QPushButton("{}".format(m))
+                start_button = QPushButton(f'{m}')
                 start_button.setObjectName(self.objectName())
                 self.buttons.append(start_button)
                 start_button.clicked.connect(mapper.map)
-                start_button.clicked.connect(self.__click_animation)
+                start_button.clicked.connect(lambda: self.__click_animation(start_button))
                 mapper.setMapping(start_button, m)
                 sliderlayout = QVBoxLayout()
                 sliderlayout.addWidget(slider)
-                sliderlayout.setAlignment(Qt.AlignHCenter)
+                sliderlayout.setAlignment(Qt.AlignmentFlag.AlignHCenter)
                 vbox.addWidget(lbl)
                 vbox.addItem(sliderlayout)
                 vbox.addWidget(start_button)
-                vbox.setAlignment(Qt.AlignHCenter)
+                vbox.setAlignment(Qt.AlignmentFlag.AlignHCenter)
             h.addItem(vbox)
             self.duration.append([])
-        mapper.mapped[int].connect(self.play)
+        mapper.mappedInt.connect(self.play)
         player = QHBoxLayout()
         self.loop_button = QPushButton("Loop")
         self.loop_button.setObjectName(self.objectName())
@@ -202,15 +200,15 @@ class MUSHRA(QWidget):
             player.addWidget(self.xfade)
         player.addWidget(self.pause_button)
         player.addWidget(self.stop_button)
-        player.setAlignment(Qt.AlignCenter)
+        player.setAlignment(Qt.AlignmentFlag.AlignCenter)
         layout = QVBoxLayout()
         layout.addItem(h)
         layout.addItem(player)
-        self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding)
+        self.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Expanding)
         self.setLayout(layout)
 
-    def __click_animation(self):
-        __btn = self.sender()
+    def __click_animation(self, btn):
+        __btn = btn
         __btn.setDown(True)
         QTimer.singleShot(self.button_fade, lambda: __btn.setDown(False))
 
@@ -230,41 +228,49 @@ class MUSHRA(QWidget):
                 for i in range(1, self.audio_tracks + 1):
                     if len(self.tracks) < len(self.buttons) + 1:  # only one track
                         if i in self.tracks:  # single track
-                            self.audio_client.send_message("/track/{}/mute".format(i), 0)
+                            self.audio_client.send_message(f'/track/{i}/mute', 0)
                         else:
-                            self.audio_client.send_message("/track/{}/mute".format(i), 1)
+                            self.audio_client.send_message(f'/track/{i}/mute', 1)
                     elif (len(self.tracks) == len(self.buttons) + 1) and (
-                            type(self.tracks[self.last_sender]) is not list):  # 1 track per button
+                            not isinstance(self.tracks[self.last_sender], list)):  # 1 track per button
                         if i == self.tracks[self.last_sender]:
-                            self.audio_client.send_message("/track/{}/mute".format(i), 0)
+                            self.audio_client.send_message(f'/track/{i}/mute', 0)
                         else:
-                            self.audio_client.send_message("/track/{}/mute".format(i), 1)
+                            self.audio_client.send_message(f'/track/{i}/mute', 1)
                     elif (len(self.tracks) == len(self.buttons) + 1) and (
-                            type(self.tracks[self.last_sender]) is list):  # more than one track per stimulus
+                            not isinstance(self.tracks[self.last_sender], list)):  # more than one track per stimulus
                         if i in self.tracks[self.last_sender]:
-                            self.audio_client.send_message("/track/{}/mute".format(i), 0)
+                            self.audio_client.send_message(f'/track/{i}/mute', 0)
                         else:
-                            self.audio_client.send_message("/track/{}/mute".format(i), 1)
+                            self.audio_client.send_message(f'/track/{i}/mute', 1)
 
     def update_label(self):
         """Update the label above the slider that indicates the handle position, when the handle was moved."""
-        for s in range(0, len(self.sliders)):
-            if self.sliders[s].value() == 100:
-                self.labels[s].setText("{}".format(self.sliders[s].value()))
-            else:
-                self.labels[s].setText("{}".format(self.sliders[s].value()))
-            self.labels[s].setFixedWidth(QLabel("100").maximumWidth())
+        for s, sli in enumerate(self.sliders):
+            if self.labels[s].text() != str(sli.value()):
+                self.labels[s].setText(f'{sli.value()}')
+                self.labels[s].setFixedWidth(QLabel("100").maximumWidth())
+
+    def raise_log(self, who):
+        '''Make a log entry.
+
+        Parameters
+        ----------
+        who : Slider
+            The Slider whose signal that trigged a change in value.
+        '''
+        self.parent().log(who, self.sliders[int(who.split('_')[1]) - 1])
 
     def loop(self):
         """Toggle looping."""
         self.looped = not self.looped
         if self.looped:
             self.loop_button.setChecked(True)
-            self.parent().page_log += "\n\t{} - Loop on {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+            self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Loop on {self.id}'
             self.audio_client.send_message("/action", self.loop_on_command)
         else:
             self.loop_button.setChecked(False)
-            self.parent().page_log += "\n\t{} - Loop off {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+            self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Loop off {self.id}'
             self.audio_client.send_message("/action", self.loop_off_command)
 
     def pause(self):
@@ -274,7 +280,7 @@ class MUSHRA(QWidget):
             self.paused = True
             self.audio_client.send_message("/pause", 1)
             self.pause_button.setChecked(True)
-            self.parent().page_log += "\n\t{} - Paused MUSHRA-player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+            self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Paused MUSHRA-player {self.id}'
             self.end = time()
             self.duration[self.current].append(self.end - self.start)
         else:
@@ -282,55 +288,58 @@ class MUSHRA(QWidget):
             self.paused = False
             self.audio_client.send_message("/pause", 1)
             self.pause_button.setChecked(False)
-            self.parent().page_log += "\n\t{} - Unpaused MUSHRA-player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+            self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Unpaused MUSHRA-player {self.id}'
             self.start = time()
             self.end = 0
 
-    def play(self, cue=None):
+    def play(self, cue=None, btn=None):
         """
-           Start the playback of audio of the according stimulus.
+            Start the playback of audio of the according stimulus.
 
-           Parameters
-           ----------
-           cue : int, default=None
-            index of the stimulus in the start/end cues array
+            Parameters
+            ----------
+            cue : int, default=None
+                index of the stimulus in the start/end cues array
+            btn: QPushButton, default=None
+                button which initiated play
         """
         for player in self.parent().players:
-            if player.playing and (not player == self and not self.conditionsUseSameMarker or
-                                   (self.conditionsUseSameMarker and not self.xfade.isChecked())):
+            if player.playing and (not player == self and not self.conditionsUseSameMarker or (self.conditionsUseSameMarker and not self.xfade.isChecked())):
                 player.stop()
         self.pause_button.setEnabled(True)
         self.pause_button.setChecked(False)
         self.stop_button.setEnabled(True)
-        
+
         if self.paused and self.current == cue:
-            print("pause")
+            # print("pause")
             self.audio_client.send_message("/pause", 1)
-            self.parent().page_log += "\n\t{} - Unpaused Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(),
-                                                                            self.id)
+            self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Unpaused Player {self.id}'
         else:
-            if self.sender().sender() in self.buttons:
-                for s in range(0, len(self.sliders)):
-                    if s != self.buttons.index(self.sender().sender()):
-                        self.sliders[s].setEnabled(False)
-                    else:
-                        self.sliders[s].setEnabled(True)
+            if btn != self.refbutton:
+                if self.sender().sender() in self.buttons:
+                    for s, sli in enumerate(self.sliders):
+                        if s != self.buttons.index(self.sender().sender()):
+                            sli.setEnabled(False)
+                        else:
+                            sli.setEnabled(True)
+
+                sender = 0 if self.sender().sender() not in self.buttons else self.buttons.index(self.sender().sender()) + 1
+            else:
+                sender = 0
 
-            sender = 0 if self.sender().sender() not in self.buttons else self.buttons.index(self.sender().sender())+1
-            
             self.audio_client.send_message("/action", 40297)  # unselect all
-            if type(self.tracks) == list and len(self.tracks) == len(self.buttons) + 1 and type(self.tracks[sender]) == list:
+            if isinstance(self.tracks, list) and len(self.tracks) == len(self.buttons) + 1 and isinstance(self.tracks[sender], list):
                 for t in self.tracks[sender]:
-                    self.audio_client.send_message("/track/{}/select".format(t), 1)  # add t to selection
+                    self.audio_client.send_message(f'/track/{t}/select', 1)  # add t to selection
             self.audio_client.send_message("/action", 40341)  # mute all
-            if type(self.tracks) == int:
-                self.audio_client.send_message("/track/{}/mute".format(self.tracks), 0)
-            elif type(self.tracks) == list and len(self.tracks) < len(self.buttons) + 1:
+            if isinstance(self.tracks, int):
+                self.audio_client.send_message(f'/track/{self.tracks}/mute', 0)
+            elif isinstance(self.tracks, list) and len(self.tracks) < len(self.buttons) + 1:
                 for t in self.tracks:
-                    self.audio_client.send_message("/track/{}/select".format(t), 1)  # add t to selection
+                    self.audio_client.send_message(f'/track/{t}/select', 1)  # add t to selection
                 self.audio_client.send_message("/action", 40280)  # toggle mute for selected tracks
-            elif type(self.tracks[sender]) == int:
-                self.audio_client.send_message("/track/{}/mute".format(self.tracks[sender]), 0)
+            elif isinstance(self.tracks[sender], int):
+                self.audio_client.send_message(f'/track/{self.tracks[sender]}/mute', 0)
             else:
                 self.audio_client.send_message("/action", 40280)  # toggle mute for selected tracks
 
@@ -410,8 +419,7 @@ class MUSHRA(QWidget):
         self.playing = True
         self.paused = False
         self.loop_button.setDisabled(True)
-        self.parent().page_log += "\n\t{} - (Re-)Started MUSHRA-player for cue {} {} ".format(
-            datetime.datetime.now().replace(microsecond=0).__str__(), self.start_cues[cue], self.id + "_" + str(cue))
+        self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - (Re-)Started MUSHRA-player for cue {self.start_cues[cue]} {self.id}_{str(cue)}'
 
     def stop(self):
         """
@@ -429,4 +437,4 @@ class MUSHRA(QWidget):
         self.stop_button.setEnabled(False)
         self.pause_button.setEnabled(False)
         self.pause_button.setChecked(False)
-        self.parent().page_log += "\n\t{} - Stopped MUSHRA playback {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+        self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Stopped MUSHRA playback {self.id}'
diff --git a/src/MessageBox.py b/src/MessageBox.py
index ca5b3e48fd00b48b9d503a5a1b51e8311c34db03..1ce8e7e1bb101733aa77e77def56189c99bfa454 100644
--- a/src/MessageBox.py
+++ b/src/MessageBox.py
@@ -1,7 +1,6 @@
 """Customized MessageBox such that the errors and warnings are more easily readable."""
 
-from PyQt5.QtGui import QResizeEvent
-from PyQt5.QtWidgets import QMessageBox, QTextEdit
+from PySide6.QtWidgets import QMessageBox, QTextEdit
 
 
 class ResizeMessageBox(QMessageBox):
@@ -21,4 +20,4 @@ class ResizeMessageBox(QMessageBox):
         super(ResizeMessageBox, self).resizeEvent(event)
         details_box = self.findChild(QTextEdit)
         if details_box is not None:
-            details_box.setFixedSize(details_box.sizeHint().width()*2, details_box.sizeHint().height())
+            details_box.setFixedSize(details_box.sizeHint().width() * 2, details_box.sizeHint().height())
diff --git a/src/OSCButton.py b/src/OSCButton.py
index cba45342042ffe4f1df2a99aaaf54627878ec350..4b8a3c5d2851c65eb2e022af21e7c72de4c00808 100644
--- a/src/OSCButton.py
+++ b/src/OSCButton.py
@@ -5,34 +5,16 @@ import datetime
 from ping3 import ping
 from pythonosc import udp_client
 
-from PyQt5.QtCore import QTimer, QObject
-from PyQt5.QtGui import QDoubleValidator
-from PyQt5.QtWidgets import QPushButton, QWidget, QHBoxLayout, QMessageBox, QSizePolicy, QLineEdit, QPlainTextEdit
+from PySide6.QtCore import QTimer
+from PySide6.QtGui import QDoubleValidator
+from PySide6.QtWidgets import QPushButton, QWidget, QHBoxLayout, QMessageBox, QSizePolicy, QLineEdit, QPlainTextEdit
 
 from src.PasswordEntry import PasswordEntry
-TIMEOUT = 0.5
+TIMEOUT = 1
 
 
 class OSCButton(QWidget):
-    """Button with custom functionality for interacting by sending an OSC command.
-
-    Attributes
-    ----------
-    inscription : str
-        the text displayed on the button
-    address : str
-        address for the OSC command
-    value: str or int
-        value to send over OSC
-    parent : QObject
-        the page the button is on
-    qid : str
-        id of the question
-    receiver : (str, int),
-        IP + Port of the receiver
-    objectname : str, optional
-        name of the object, if it is supposed to be styled individually
-    """
+    """Button with custom functionality for interacting by sending an OSC command."""
 
     def __init__(self, inscription, address, value, parent, qid, receiver, objectname=None):
         """
@@ -67,11 +49,11 @@ class OSCButton(QWidget):
                 if not skip and self.parent().parent().widget(s).evaluationvars is not None and \
                         var in self.parent().parent().widget(s).evaluationvars:
                     self.value = self.parent().parent().widget(s).evaluationvars[var]
-                    if type(self.value) is QLineEdit or type(self.value) is PasswordEntry:
-                        if type(self.value.validator()) == QDoubleValidator:
+                    if isinstance(self.value, (QLineEdit, PasswordEntry)):
+                        if isinstance(self.value.validator(), QDoubleValidator):
                             self.value.setText(self.value.text().replace(",", "."))
                         self.value = self.value.text()
-                    elif type(self.value) is QPlainTextEdit:
+                    elif isinstance(self.value, QPlainTextEdit):
                         self.value = self.value.toPlainText().replace("\n", " ")
                 if not skip and self.parent().parent().widget(s) == self.parent():
                     skip = True
@@ -100,9 +82,9 @@ class OSCButton(QWidget):
             msg = QMessageBox()
             msg.setWindowTitle(self.parent().parent().connection_lost_title)
             msg.setSizeGripEnabled(True)
-            msg.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
-            msg.setIcon(QMessageBox.Information)
-            msg.setText("No connection to {}.".format(receiver[0]))
+            msg.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
+            msg.setIcon(QMessageBox.Icon.Information)
+            msg.setText(f'No connection to {receiver[0]}.')
             msg.exec_()
 
         if inscription is not None:
@@ -114,7 +96,7 @@ class OSCButton(QWidget):
             self.button.clicked.connect(lambda: self.osc_client.send_message(address, self.value))
             self.button.clicked.connect(self.set_used)
             self.button.clicked.connect(self.log)
-            self.button.clicked.connect(self.__click_animation)
+            self.button.clicked.connect(lambda: self.__click_animation(self.button))
             self.setLayout(layout)
 
     def set_used(self):
@@ -130,11 +112,11 @@ class OSCButton(QWidget):
         """
         return self.used
 
-    def __click_animation(self):
-        __btn = self.sender()
+    def __click_animation(self, btn):
+        __btn = btn
         __btn.setDown(True)
         QTimer.singleShot(self.button_fade, lambda: __btn.setDown(False))
 
     def log(self):
         """Log Action"""
-        self.parent().page_log += "\n\t{} - Pressed OSC-Button {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+        self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Pressed OSC-Button {self.id}'
diff --git a/src/Page.py b/src/Page.py
index 432c1bc06565e27ccc61426baee2a84046f20208..8fcb8ea518bea222bad31da73ff1aabf9aaec319 100644
--- a/src/Page.py
+++ b/src/Page.py
@@ -3,8 +3,8 @@ Creates a structured page.
 """
 import datetime
 
-from PyQt5.QtCore import QSignalMapper, Qt
-from PyQt5.QtWidgets import QWidget, QLabel, QFormLayout, QButtonGroup, QCheckBox, QLineEdit, QPlainTextEdit, \
+from PySide6.QtCore import QSignalMapper, Qt
+from PySide6.QtWidgets import QWidget, QLabel, QFormLayout, QButtonGroup, QCheckBox, QLineEdit, QPlainTextEdit, \
     QHBoxLayout
 
 from src.ABX import ABX
@@ -23,25 +23,16 @@ from src.RadioMatrix import RadioMatrix
 
 
 class Page(QWidget):
-    """
-    Structure for a basic page layout.
+    """ Structure for a basic page layout."""
 
-    Attributes
-    ----------
-    structure : ConfigObj
-        questionnaire structure
-    parent : QObject, optional
-         widget/layout this widget is embedded in
-    """
-
-    def __init__(self, structure, id, parent=None):
+    def __init__(self, structure, pid, parent=None):
         """
 
         Parameters
         ----------
         structure : ConfigObj
             questionnaire structure
-        id : str
+        pid : str
             name of the page
         parent : QObject, optional
              widget/layout this widget is embedded in
@@ -60,7 +51,7 @@ class Page(QWidget):
         self.image_position = None
         self.image = None
         self.outer_layout = None
-        self.id = id
+        self.id = pid
 
         if "pupil_on_next" in structure.keys() and structure["pupil_on_next"] is not None and \
                 structure["pupil_on_next"] != "" and not self.parent().preview:
@@ -154,11 +145,10 @@ class Page(QWidget):
                                 objectname=structure[quest]["objectName"] if "objectName" in structure[quest].keys() else None)
                 layout.addRow(mr)
                 self.evaluationvars[structure[quest]["id"]] = mr.duration
-                for sl in range(0, len(mr.sliders)):
-                    self.evaluationvars[structure[quest]["id"] + "_{}".format(sl + 1)] = mr.sliders[sl]
+                for sl, msli in enumerate(mr.sliders):
+                    self.evaluationvars[f'{structure[quest]["id"]}_{sl + 1}'] = msli
                 self.players.append(mr)
-                self.required[structure[quest]["id"]] = [True if ("required" in structure[quest].keys()) and (
-                    structure[quest].as_bool("required")) else False, [mr.refbutton] + mr.buttons, mr.name, mr.playing]
+                self.required[structure[quest]["id"]] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), [mr.refbutton] + mr.buttons, mr.name, mr.playing]
             elif structure[quest]["type"] == "Radio":
                 ans_layout, bg = mar(structure[quest]["answers"], self, structure[quest]["id"],
                                      objectname=structure[quest]["objectName"] if "objectName" in structure[quest].keys() else None,
@@ -166,22 +156,15 @@ class Page(QWidget):
                 lbl = QLabel(structure[quest]["text"])
                 layout.addRow(lbl, ans_layout)
                 self.evaluationvars[structure[quest]["id"]] = bg
-                self.required[structure[quest]["id"]] = [True if ("required" in structure[quest].keys()) and (
-                    structure[quest].as_bool("required")) else False, lbl]
+                self.required[structure[quest]["id"]] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), lbl]
             elif structure[quest]["type"] == "Check":
-                ans_layout, cvars = mac(structure[quest]["answers"],
+                ans_layout, cvars = mac(structure[quest]["answers"], structure[quest]["id"], parent=self,
                                         objectname=structure[quest]["objectName"] if "objectName" in structure[quest].keys() else None)
                 lbl = QLabel(structure[quest]["text"])
                 layout.addRow(lbl, ans_layout)
-                cbmapper = QSignalMapper(self)
-                for c in range(0, len(cvars)):
-                    self.evaluationvars[structure[quest]["id"] + "_{}".format(c)] = cvars[c]
-                    self.required[structure[quest]["id"] + "_{}".format(c)] = [
-                        True if ("required" in structure[quest].keys()) and (
-                            structure[quest].as_bool("required")) else False, lbl]
-                    cvars[c].toggled.connect(cbmapper.map)
-                    cbmapper.setMapping(cvars[c], structure[quest]["id"] + "_{}".format(c))
-                cbmapper.mapped[str].connect(self.log)
+                for c, chck in enumerate(cvars):
+                    self.evaluationvars[f'{structure[quest]["id"]}_{c}'] = chck
+                    self.required[f'{structure[quest]["id"]}_{c}'] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), lbl]
             elif structure[quest]["type"] == "Text":
                 txt = matf(structure[quest].as_int("size"), structure[quest]["id"],
                            structure[quest]["policy"] if "policy" in structure[quest].keys() else None, self,
@@ -189,8 +172,7 @@ class Page(QWidget):
                 lbl = QLabel(structure[quest]["text"])
                 layout.addRow(lbl, txt)
                 self.evaluationvars[structure[quest]["id"]] = txt
-                self.required[structure[quest]["id"]] = [True if ("required" in structure[quest].keys()) and (
-                    structure[quest].as_bool("required")) else False, lbl]
+                self.required[structure[quest]["id"]] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), lbl]
             elif structure[quest]["type"] == "Password":
                 pw = PasswordEntry(structure[quest]["password_file"], structure[quest]["id"],
                                    structure[quest]["policy"] if "policy" in structure[quest].keys() else None, self,
@@ -198,15 +180,14 @@ class Page(QWidget):
                 lbl = QLabel(structure[quest]["text"])
                 layout.addRow(lbl, pw)
                 self.evaluationvars[structure[quest]["id"]] = pw
-                self.required[structure[quest]["id"]] = [True if ("required" in structure[quest].keys()) and (
-                    structure[quest].as_bool("required")) else False, lbl]
+                self.required[structure[quest]["id"]] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), lbl]
             elif structure[quest]["type"] == "Slider":
                 ans_layout, slider = mas(structure[quest].as_bool("labelled"), structure[quest]["id"],
                                          structure[quest].as_float("min"), structure[quest].as_float("max"),
-                                         structure[quest].as_float("start"), structure[quest].as_float("step"),
-                                         structure[quest]["header"] if "header" in structure[quest].keys() else None,
-                                         structure[quest]["label"] if "label" in structure[quest].keys() else None,
-                                         self,
+                                         sstart=structure[quest].as_float("start"), sstep=structure[quest].as_float("step"),
+                                         header=structure[quest]["header"] if "header" in structure[quest].keys() else None,
+                                         label=structure[quest]["label"] if "label" in structure[quest].keys() else None,
+                                         parent=self,
                                          objectname=structure[quest]["objectName"] if "objectName" in structure[quest].keys() else None)
                 lbl = QLabel(structure[quest]["text"])
                 if ("question_above" in structure[quest].keys()) and structure[quest].as_bool("question_above"):
@@ -221,8 +202,7 @@ class Page(QWidget):
                     else:
                         layout.addRow(lbl, ans_layout)
                 self.evaluationvars[structure[quest]["id"]] = slider
-                self.required[structure[quest]["id"]] = [True if ("required" in structure[quest].keys()) and (
-                    structure[quest].as_bool("required")) else False, lbl]
+                self.required[structure[quest]["id"]] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), lbl]
             elif structure[quest]["type"] == "ABX":
                 abx = ABX(structure[quest]["start_cues"], structure[quest]["track"], structure[quest]["text"],
                           structure[quest]["id"],
@@ -230,15 +210,17 @@ class Page(QWidget):
                           button_texts=structure[quest]["button_texts"] if "button_texts" in structure[quest].keys() else None,
                           parent=self,
                           objectname=structure[quest]["objectName"] if "objectName" in structure[quest].keys() else None,
-                          x=True if ("x" in structure[quest].keys()) and (structure[quest].as_bool("x")) else False)
+                          x=(("x" in structure[quest].keys()) and (structure[quest].as_bool("x"))))
                 layout.addRow(abx)
                 self.evaluationvars[structure[quest]["id"]] = abx
                 self.players.append(abx.a_button)
                 self.players.append(abx.b_button)
                 if abx.x_button is not None:
                     self.players.append(abx.x_button)
-                self.required[structure[quest]["id"]] = [True if ("required" in structure[quest].keys()) and (
-                    structure[quest].as_bool("required")) else False, [abx.a_button, abx.b_button] if abx.x_button is None else [abx.a_button, abx.b_button, abx.x_button], abx.name, [abx.a_button.playing, abx.b_button.playing] if abx.x_button is None else [abx.a_button.playing, abx.b_button.playing, abx.x_button.playing]]
+                self.required[structure[quest]["id"]] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")),
+                                                         [abx.a_button, abx.b_button] if abx.x_button is None else [abx.a_button, abx.b_button, abx.x_button],
+                                                         abx.name,
+                                                         [abx.a_button.playing, abx.b_button.playing] if abx.x_button is None else [abx.a_button.playing, abx.b_button.playing, abx.x_button.playing]]
             elif structure[quest]["type"] == "Matrix":
                 matrix = RadioMatrix(structure[quest]["questions"], structure[quest]["answers"], structure[quest]["id"],
                                      structure[quest].as_int("start_answer_id"), parent=self,
@@ -246,11 +228,9 @@ class Page(QWidget):
                                      randomize=structure[quest].as_bool("randomize") if "randomize" in structure[quest].keys() else False)
                 layout.addRow(matrix)
                 self.evaluationvars[structure[quest]["id"]] = matrix
-                self.required[structure[quest]["id"]] = [True if ("required" in structure[quest].keys()) and (
-                    structure[quest].as_bool("required")) else False, matrix.questions, matrix.name]
+                self.required[structure[quest]["id"]] = [("required" in structure[quest].keys()) and (structure[quest].as_bool("required")), matrix.questions, matrix.name]
             else:
-                raise ValueError("Unknown type for question {}. Found {}. Supported types are: HLine, Player, MUSHRA, "
-                                 "Radio, Check, Text, Slider, Button".format(structure[quest]["id"], structure[quest]["type"]))
+                raise ValueError(f'Unknown type for question {structure[quest]["id"]}. Found {structure[quest]["type"]}. Supported types are: HLine, Player, MUSHRA, Radio, Check, Text, Slider, Button')
 
         if self.image_position == "free":
             if len(self.findChildren(Image)) > 0:
@@ -280,63 +260,57 @@ class Page(QWidget):
 
         if len(self.players) > 0 and self.parent().popup and not self.parent().preview:
             for p in self.players:
-                if type(p) == Player and p.timer is not None:
+                if isinstance(p, Player) and p.timer is not None:
                     player_found = False
                     for item in range(self.layout().rowCount()):
-                        if player_found and self.layout().itemAt(item, 1).widget() is None:
-                            if type(self.layout().itemAt(item, 1)) is QHBoxLayout:
-                                for box in range(self.layout().itemAt(item, 1).count()):
-                                    sp = self.layout().itemAt(item, 1).itemAt(box).widget().sizePolicy()
+                        if player_found and self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget() is None:
+                            if isinstance(self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole), QHBoxLayout):
+                                for box in range(self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).count()):
+                                    sp = self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).itemAt(box).widget().sizePolicy()
                                     sp.setRetainSizeWhenHidden(True)
-                                    self.layout().itemAt(item, 1).itemAt(box).widget().setSizePolicy(sp)
-                                    self.layout().itemAt(item, 1).itemAt(box).widget().hide()
-                            if self.layout().itemAt(item, 0) is not None:
-                                sp = self.layout().itemAt(item, 0).widget().sizePolicy()
+                                    self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).itemAt(box).widget().setSizePolicy(sp)
+                                    self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).itemAt(box).widget().hide()
+                            if self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole) is not None:
+                                sp = self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().sizePolicy()
                                 sp.setRetainSizeWhenHidden(True)
-                                self.layout().itemAt(item, 0).widget().setSizePolicy(sp)
-                                self.layout().itemAt(item, 0).widget().hide()
-                        if player_found and self.layout().itemAt(item, 1).widget() is not None:
-                            if self.layout().itemAt(item, 0) is not None:
-                                sp = self.layout().itemAt(item, 0).widget().sizePolicy()
+                                self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().setSizePolicy(sp)
+                                self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().hide()
+                        if player_found and self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget() is not None:
+                            if self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole) is not None:
+                                sp = self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().sizePolicy()
                                 sp.setRetainSizeWhenHidden(True)
-                                self.layout().itemAt(item, 0).widget().setSizePolicy(sp)
-                                self.layout().itemAt(item, 0).widget().hide()
-                            sp = self.layout().itemAt(item, 1).widget().sizePolicy()
+                                self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().setSizePolicy(sp)
+                                self.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().hide()
+                            sp = self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget().sizePolicy()
                             sp.setRetainSizeWhenHidden(True)
-                            self.layout().itemAt(item, 1).widget().setSizePolicy(sp)
-                            self.layout().itemAt(item, 1).widget().hide()
-                        if self.layout().itemAt(item, 1).widget() == p:
+                            self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget().setSizePolicy(sp)
+                            self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget().hide()
+                        if self.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget() == p:
                             player_found = True
-        layout.setLabelAlignment(Qt.AlignVCenter)
-        layout.setRowWrapPolicy(QFormLayout.WrapLongRows)  # automatic line breaks in text
+        layout.setLabelAlignment(Qt.AlignmentFlag.AlignVCenter)
+        layout.setRowWrapPolicy(QFormLayout.RowWrapPolicy.WrapLongRows)  # automatic line breaks in text
 
-    def log(self, qid):
+    def log(self, qid, sender):
         """Log changes
 
         Parameters
         ----------
         qid : str
             id of the element that raised a log
+        sender : QObject
+            the sender of the log
         """
-        print("Log raised", qid, type(self.sender()))
-        if type(self.sender()) is QLineEdit or type(self.sender()) is PasswordEntry:
-            self.page_log += "\n\t{} - Changed {} to {}".format(datetime.datetime.now().replace(microsecond=0).__str__(),
-                                                                qid, self.sender().text())
-        elif type(self.sender()) is QPlainTextEdit:
-            self.page_log += "\n\t{} - Changed {} to {}".format(datetime.datetime.now().replace(microsecond=0).__str__(),
-                                                                qid, self.sender().toPlainText())
-        elif type(self.sender()) is QButtonGroup:
-            self.page_log += "\n\t{} - Changed {} to {}".format(datetime.datetime.now().replace(microsecond=0).__str__(),
-                                                                qid, self.sender().checkedId())
-        elif type(self.sender()) is QCheckBox:
-            self.page_log += "\n\t{} - Changed {} to {}".format(datetime.datetime.now().replace(microsecond=0).__str__(),
-                                                                qid, self.sender().isChecked())
-        elif (type(self.sender()) is QSignalMapper) and (type(self.sender().sender()) is QCheckBox):  # QCheckBox
-            self.page_log += "\n\t{} - Changed {} to {}".format(datetime.datetime.now().replace(microsecond=0).__str__(),
-                                                                qid, self.sender().sender().isChecked())
+        # print("Log raised", qid, type(sender))
+        if isinstance(sender, QLineEdit) or isinstance(sender, PasswordEntry):
+            self.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Changed {qid} to {sender.text()}'
+        elif isinstance(sender, QPlainTextEdit):
+            self.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Changed {qid} to {sender.toPlainText()}'
+        elif isinstance(sender, QButtonGroup):
+            self.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Changed {qid} to {sender.checkedId()}'
+        elif isinstance(sender, QSignalMapper) and isinstance(sender, QCheckBox):  # QCheckBox
+            self.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Changed {qid} to {sender.isChecked()}'
         else:  # Slider
-            self.page_log += "\n\t{} - Changed {} to {}".format(datetime.datetime.now().replace(microsecond=0).__str__(),
-                                                                qid, self.sender().value())
+            self.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Changed {qid} to {sender.value()}'
 
     def get_key(self, val):
         """ function to return key for any value
@@ -365,5 +339,4 @@ class Page(QWidget):
         val : str
             message to set
         """
-        #self.osc_message = val
-        self.evaluationvars["OSCMessage_{}".format(self.id)] = val
+        self.evaluationvars[f'OSCMessage_{self.id}'] = val
diff --git a/src/PasswordEntry.py b/src/PasswordEntry.py
index e7b27955604248eeb3cfcf5ae250f216fe10ca07..292b2b66e5c57bcc7d96e74062a36c7e46bf13da 100644
--- a/src/PasswordEntry.py
+++ b/src/PasswordEntry.py
@@ -1,28 +1,13 @@
 """A textfield of which the entry gets validated before the next page is loaded."""
 
-from PyQt5.QtCore import QRegExp, QLocale, QObject
-from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator
-from PyQt5.QtWidgets import QLineEdit
+from PySide6.QtCore import QRegularExpression, QLocale
+from PySide6.QtGui import QIntValidator, QDoubleValidator, QRegularExpressionValidator
+from PySide6.QtWidgets import QLineEdit
 
 
 class PasswordEntry(QLineEdit):
     """A textfield of which the entry gets validated against a list of possible entries
-    when the user wants to go to the next page.
-
-    Attributes
-    ----------
-    file_passwords : str
-        file/path of valid entries for this field (line separated)
-    qid : str
-        id of the question
-    policy : list of str, optional
-        restricts the entry possibilities of this field; choose between "int", "double" and "regex" for the first entry,
-        for details see `AnswerTextField.py`
-    parent : QObject, optional
-        widget/layout this widget is embedded in
-    objectname : str, optional
-        name of the object, if it is supposed to be styled individually
-    """
+    when the user wants to go to the next page."""
     def __init__(self, file_passwords, qid, policy=None, parent=None, objectname=None):
         """
         Parameters
@@ -61,15 +46,15 @@ class PasswordEntry(QLineEdit):
                 self.setValidator(QIntValidator(bottom=int(policy[1]), top=int(policy[2])))
             elif policy[0].lower() == "double":
                 validator = QDoubleValidator(bottom=float(policy[1]), top=float(policy[2]), decimals=int(policy[3]))
-                validator.setNotation(QDoubleValidator.StandardNotation)
+                validator.setNotation(QDoubleValidator.Notation.StandardNotation)
                 self.setValidator(validator)
                 if QLocale().decimalPoint() == ",":  # workaround: QDoubleValidator only registers "," but not "." (depending on locale)
                     self.textChanged.connect(lambda: self.setText(self.text().replace(".", ",")))
             elif policy[0].lower() == "regex":
-                self.setValidator(QRegExpValidator(QRegExp(policy[1])))
+                self.setValidator(QRegularExpressionValidator(QRegularExpression(policy[1])))
             else:
-                raise ValueError("Unknown validator found {}.".format(policy[0]))
-        self.textChanged.connect(lambda: parent.log(qid))
+                raise ValueError(f'Unknown validator found {policy[0]}.')
+        self.textChanged.connect(lambda: parent.log(qid, self))
 
     def validate(self):
         """Check if the user-given string is in the list of valid passwords."""
diff --git a/src/Player.py b/src/Player.py
index 2a12b99e45d7237be757b71d1af182abb3aa290b..763fd21a26557448c7b688dbd18d6f2108960c05 100644
--- a/src/Player.py
+++ b/src/Player.py
@@ -4,46 +4,19 @@ Audio/Video Player Control
 import datetime
 from time import time
 
-from PyQt5.QtCore import QTimer, QObject
-from PyQt5.QtWidgets import QWidget, QPushButton, QHBoxLayout, QStyle
+from PySide6.QtCore import QTimer
+from PySide6.QtWidgets import QWidget, QPushButton, QHBoxLayout, QStyle, QFormLayout
 
 from src.PupilCoreButton import Button
+from src.tools import player_buttons
 from src.Video import madmapper, vlc
 
 
 class Player(QWidget):
-    """Multi-Media player unit.
-
-    Attributes
-    ----------
-    start_cue : int
-        cue/marker number on which to start playing (e.g. in REAPER)
-    track : int or list<int>
-        active tracks (e.g. in REAPER)
-    video : str, optional
-        filename+path to the video which should be played.
-    qid : str
-        id of the question
-    parent : QObject, optional
-        widget/layout this widget is embedded in
-    end_cue : int, optional
-        cue/marker on which to stop playing (e.g. in REAPER); might be removed in future versions
-    displayed_buttons : list<str>, default=["Play", "Pause", "Stop"]
-        list of buttons which should be displayed
-    icons : bool, optional, default=False
-        if True, icons according to the functionality are displayed on the buttons
-    pupil : str, optional
-        annotation text to send to Pupil Core when the play button is clicked
-    objectname : str, optional
-        name of the object, if it is supposed to be styled individually
-    timer : int, optional
-        time in msec after which succeeding questions on the page are displayed
-    play_button_text : str, optional
-        alternate text for the play button
-    """
+    """Multi-Media player unit."""
 
     def __init__(self, start_cue, track, qid, video=None, parent=None, end_cue=None,
-                 displayed_buttons=["Play", "Pause", "Stop"], icons=False, pupil=None, objectname=None, timer=None,
+                 displayed_buttons=player_buttons, icons=False, pupil=None, objectname=None, timer=None,
                  play_button_text=None, play_once=False, crossfade=False):
         """Create the layout of the player.
 
@@ -51,7 +24,7 @@ class Player(QWidget):
         ----------
         start_cue : int
             cue/marker number on which to start playing (e.g. in REAPER)
-        track : int or list of int
+        track : Union(int, list of int)
             active tracks (e.g. in REAPER)
         video : str, optional
             filename+path / scene name to the video which should be played.
@@ -115,15 +88,15 @@ class Player(QWidget):
             self.timer.timeout.connect(self.timer_done)
         else:
             self.timer = None
-        if type(displayed_buttons) is str:
+        if isinstance(displayed_buttons, str):
             self.buttons = [displayed_buttons]  # to support just one button
         else:
             self.buttons = displayed_buttons
-        if type(track) is str:
+        if isinstance(track, str):
             track = [int(track)]
         else:
-            for t in range(0, len(track)):
-                track[t] = int(track[t])
+            for _, tra in enumerate(track):
+                tra = int(tra)
         self.track = track
         self.video = video
         self.start = 0
@@ -135,16 +108,16 @@ class Player(QWidget):
         if "Play" in self.buttons:
             self.play_button = QPushButton("Play" if play_button_text is None else play_button_text, None)
             if icons:
-                self.play_button.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
+                self.play_button.setIcon(self.style().standardIcon(QStyle.StandardPixmap.SP_MediaPlay))
             self.play_button.setEnabled(True)
             self.play_button.clicked.connect(self.play)
-            self.play_button.clicked.connect(self.__click_animation)
+            self.play_button.clicked.connect(lambda: self.__click_animation(self.play_button))
             self.play_button.setObjectName(self.objectName())
             layout.addWidget(self.play_button)
         if "Pause" in self.buttons:
             self.pause_button = QPushButton("Pause", None)
             if icons:
-                self.pause_button.setIcon(self.style().standardIcon(QStyle.SP_MediaPause))
+                self.pause_button.setIcon(self.style().standardIcon(QStyle.StandardPixmap.SP_MediaPause))
             self.pause_button.setEnabled(False)
             self.pause_button.setCheckable(True)
             self.pause_button.clicked.connect(self.pause)
@@ -153,15 +126,15 @@ class Player(QWidget):
         if "Stop" in self.buttons:
             self.stop_button = QPushButton("Stop", None)
             if icons:
-                self.stop_button.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))
+                self.stop_button.setIcon(self.style().standardIcon(QStyle.StandardPixmap.SP_MediaStop))
             self.stop_button.setEnabled(False)
             self.stop_button.clicked.connect(self.stop)
             self.stop_button.setObjectName(self.objectName())
             layout.addWidget(self.stop_button)
         self.setLayout(layout)
 
-    def __click_animation(self):
-        __btn = self.sender()
+    def __click_animation(self, btn):
+        __btn = btn
         if not self.play_once and self.button_fade > 0:
             __btn.setDown(True)
             QTimer.singleShot(self.button_fade, lambda: __btn.setDown(False))
@@ -196,15 +169,15 @@ class Player(QWidget):
                 self.video_client.send_message(self.video_player["unpause"][0], self.video_player["unpause"][1])
             self.pause_button.setChecked(False)
             if str(type(self.page)) == "<class 'src.Page.Page'>":
-                self.page.page_log += "\n\t{} - Unpaused Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+                self.page.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Unpaused Player {self.id}'
             else:
-                self.gui.page_log += "\n\t{} - Unpaused Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+                self.gui.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Unpaused Player {self.id}'
         else:
             for i in range(1, self.audio_tracks + 1):
                 if i in self.track:
-                    self.audio_client.send_message("/track/{}/mute".format(i), 0)
+                    self.audio_client.send_message(f'/track/{i}/mute', 0)
                 else:
-                    self.audio_client.send_message("/track/{}/mute".format(i), 1)
+                    self.audio_client.send_message(f'/track/{i}/mute', 1)
             if not self.crossfade or (self.crossfade and self.start_cue != previous_start):
                 if int(self.start_cue) < 10:
                     self.audio_client.send_message("/action", 40160 + int(self.start_cue))  # goto cue
@@ -218,7 +191,7 @@ class Player(QWidget):
             elif self.crossfade and self.start_cue == previous_start and self.gui.global_play_state == "STOP":
                 self.audio_client.send_message("/play", 1)
             if (self.video is not None) and (self.video_client is not None):
-                if "select" in self.video_player.keys():
+                if "select" in self.video_player:
                     self.video_client.send_message(self.video_player["reset"][0], self.video_player["reset"][1])
                     self.video_client.send_message(self.video_player["select"][0].format(self.video), self.video_player["select"][1])
                     self.video_client.send_message(self.video_player["play"][0], self.video_player["play"][1])
@@ -226,10 +199,9 @@ class Player(QWidget):
                     self.video_client.send_message(self.video_player["play"][0], self.video_player["play"][1].format(self.video))
 
             if str(type(self.page)) == "<class 'src.Page.Page'>":
-                self.page.page_log += "\n\t{} - (Re-)Started Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+                self.page.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - (Re-)Started Player {self.id}'
             else:
-                self.gui.page_log += "\n\t{} - (Re-)Started Player {} ".format(
-                    datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+                self.gui.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - (Re-)Started Player {self.id}'
         if (self.start != 0) and self.playing:
             self.end = time()
             self.duration.append(self.end - self.start)
@@ -253,19 +225,19 @@ class Player(QWidget):
         self.countdown = 0
         player_found = False
         for item in range(self.page.layout().rowCount()):
-            if player_found and self.page.layout().itemAt(item, 1).widget() is None:
-                if type(self.page.layout().itemAt(item, 1)) is QHBoxLayout:
-                    for box in range(self.page.layout().itemAt(item, 1).count()):
-                        self.page.layout().itemAt(item, 1).itemAt(box).widget().show()
-                if self.page.layout().itemAt(item, 0) is not None:
-                    self.page.layout().itemAt(item, 0).widget().show()
-            if player_found and self.page.layout().itemAt(item, 1).widget() is not None:
-                if self.page.layout().itemAt(item, 0) is not None:
-                    self.page.layout().itemAt(item, 0).widget().show()
-                self.page.layout().itemAt(item, 1).widget().show()
-                if type(self.page.layout().itemAt(item, 1).widget()) == Player and self.page.layout().itemAt(item, 1).widget() != self:
+            if player_found and self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget() is None:
+                if isinstance(self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole), QHBoxLayout):
+                    for box in range(self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).count()):
+                        self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).itemAt(box).widget().show()
+                if self.page.layout().itemAt(item, QFormLayout.ItemRole.LabelRole) is not None:
+                    self.page.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().show()
+            if player_found and self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget() is not None:
+                if self.page.layout().itemAt(item, QFormLayout.ItemRole.LabelRole) is not None:
+                    self.page.layout().itemAt(item, QFormLayout.ItemRole.LabelRole).widget().show()
+                self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget().show()
+                if isinstance(self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget(), Player) and self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget() != self:
                     player_found = False
-            if self.page.layout().itemAt(item, 1).widget() == self:
+            if self.page.layout().itemAt(item, QFormLayout.ItemRole.FieldRole).widget() == self:
                 player_found = True
         # self.stop() # not needed anymore
 
@@ -278,9 +250,9 @@ class Player(QWidget):
                 self.video_client.send_message(self.video_player["pause"][0], self.video_player["pause"][1])
             self.pause_button.setChecked(True)
             if str(type(self.page)) == "<class 'src.Page.Page'>":
-                self.page.page_log += "\n\t{} - Paused Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+                self.page.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Paused Player {self.id}'
             else:
-                self.gui.page_log += "\n\t{} - Paused Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+                self.gui.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Paused Player {self.id}'
             self.end = time()
             self.duration.append(self.end - self.start)
             self.paused = True
@@ -294,9 +266,9 @@ class Player(QWidget):
                 self.video_client.send_message(self.video_player["unpause"][0], self.video_player["unpause"][1])
             self.pause_button.setChecked(False)
             if str(type(self.page)) == "<class 'src.Page.Page'>":
-                self.page.page_log += "\n\t{} - Unpaused Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+                self.page.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Unpaused Player {self.id}'
             else:
-                self.gui.page_log += "\n\t{} - Unpaused Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+                self.gui.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Unpaused Player {self.id}'
             self.start = time()
             self.end = 0
             self.paused = False
@@ -323,9 +295,8 @@ class Player(QWidget):
             self.pause_button.setEnabled(False)
             self.pause_button.setChecked(False)
         if str(type(self.page)) == "<class 'src.Page.Page'>":
-            self.page.page_log += "\n\t{} - Stopped Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
-        else:
-            self.gui.page_log += "\n\t{} - Stopped Player {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(), self.id)
+            self.page.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Stopped Player {self.id}'
+            # self.gui.page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Stopped Player {self.id}'
         if self.timer is not None and self.timer.remainingTime() > 0 and self.countdown > 0:
             self.timer.stop()
         self.playing = False
diff --git a/src/PupilCoreButton.py b/src/PupilCoreButton.py
index 0f1a8663f58adf93571ea0ae10f3390ce564d07d..db0e771391cb6b5e560c35731c1b5d98b6816c2c 100644
--- a/src/PupilCoreButton.py
+++ b/src/PupilCoreButton.py
@@ -6,30 +6,14 @@ from time import time
 
 import msgpack as serializer
 import zmq
-from PyQt5.QtCore import Qt, QTimer, QObject
-from PyQt5.QtGui import QPixmap, QDoubleValidator
-from PyQt5.QtWidgets import QPushButton, QWidget, QHBoxLayout, QLabel, QDesktopWidget, QLineEdit, QPlainTextEdit
+from PySide6.QtCore import QTimer
+from PySide6.QtGui import QDoubleValidator
+from PySide6.QtWidgets import QPushButton, QWidget, QHBoxLayout, QLineEdit, QPlainTextEdit
 from src.PasswordEntry import PasswordEntry
 
 
 class Button(QWidget):
-    """Button with custom functionality for interacting with Pupil Core.
-
-    Attributes
-    ----------
-    inscription : str
-        the text displayed on the button
-    function : str
-        shorthand hint for functionality
-    parent : QObject
-        the page the button is on
-    qid : str
-        id of the question
-    recording_name : str, optional
-        name for the recording folder(?)
-    objectname : str, optional
-        name of the object, if it is supposed to be styled individually
-    """
+    """Button with custom functionality for interacting with Pupil Core."""
 
     def __init__(self, inscription, function, parent, qid, recording_name=None, objectname=None, annotation=None):
         """
@@ -37,14 +21,14 @@ class Button(QWidget):
 
             Parameters
             ----------
-            inscription : str
-                the text displayed on the button
+            inscription : Union(str, None)
+                the text displayed on the button, if None the Button will be invisible
             function : str
                 shorthand hint for functionality
             parent : QObject
                 the page the button is on
-            qid : str
-                id of the question
+            qid : Union(str, None)
+                id of the question, if None invisible Button that just triggers the function
             recording_name : str, optional
                 name for the recording folder(?)
             objectname : str, optional
@@ -80,8 +64,8 @@ class Button(QWidget):
             layout.addWidget(self.button)
             self.used = False
             if function == "Calibration":
-                self.button.clicked.connect(self.start_calibration)
-            elif function == "Recording":
+                raise NotImplementedError
+            if function == "Recording":
                 self.button.clicked.connect(self.start_recording)
             elif function == "Stop":
                 self.button.clicked.connect(self.stop_recording)
@@ -90,7 +74,7 @@ class Button(QWidget):
                     self.setup_annotate()
                 self.button.clicked.connect(lambda: self.send_trigger(self.new_trigger("test" if annotation is None else str(annotation))))
             self.button.clicked.connect(self.log)
-            self.button.clicked.connect(self.__click_animation)
+            self.button.clicked.connect(lambda: self.__click_animation(self.button))
             self.setLayout(layout)
         elif function == "Annotate":  # the only function that needs setup
             self.setup_annotate()
@@ -105,31 +89,11 @@ class Button(QWidget):
         'v'  # get the Pupil Core software version string
         '''
 
-    def __click_animation(self):
-        __btn = self.sender()
+    def __click_animation(self, btn):
+        __btn = btn
         __btn.setDown(True)
         QTimer.singleShot(self.button_fade, lambda: __btn.setDown(False))
 
-    def start_calibration(self):
-        """
-        Start the calibration process of the Pupil Core tracking.
-
-        Raises
-        ------
-        zmq.ZMQError, AttributeError
-            If there are connection problems
-        """
-        self.used = True
-        self.parent().evaluationvars[self.id] = True
-        try:
-            self.pupil_remote.send_string('C')
-            print("Calibrate...", self.pupil_remote.recv_string())
-            if self.config_win is None:
-                self.config_win = Calib()
-                self.config_win.show()
-        except (zmq.ZMQError, AttributeError):
-            print("Couldn't connect with Pupil Capture!")
-
     def start_recording(self):
         """
         Start the recording process of the pupil core tracking.
@@ -142,25 +106,27 @@ class Button(QWidget):
         self.used = True
         try:
             if self.recording_name is None:
+                # print("just record...")
                 self.pupil_remote.send_string('R')
             else:
                 if self.recording_name.startswith("id:"):
+                    # print("recording name starts with id")
                     var = self.recording_name[2:].strip(' :')
                     skip = False
                     for s in range(0, self.parent().parent().count()):
                         if not skip and self.parent().parent().widget(s).evaluationvars is not None and \
                                 var in self.parent().parent().widget(s).evaluationvars:
                             self.recording_name = self.parent().parent().widget(s).evaluationvars[var]
-                            if type(self.recording_name) is QLineEdit or type(self.recording_name) is PasswordEntry:
-                                if type(self.recording_name.validator()) == QDoubleValidator:
+                            if isinstance(self.recording_name, (QLineEdit, PasswordEntry)):
+                                if isinstance(self.recording_name.validator(), QDoubleValidator):
                                     self.recording_name.setText(self.recording_name.text().replace(",", "."))
                                 self.recording_name = self.recording_name.text()
-                            elif type(self.recording_name) is QPlainTextEdit:
+                            elif isinstance(self.recording_name, QPlainTextEdit):
                                 self.recording_name = self.recording_name.toPlainText().replace("\n", " ")
                         if not skip and self.parent().parent().widget(s) == self.parent():
                             skip = True
-                print(self.recording_name)
-                self.pupil_remote.send_string('R {}'.format(self.recording_name))
+                print("Recording name:",self.recording_name)
+                self.pupil_remote.send_string(f'R {self.recording_name}')
             print("Start recording...", self.pupil_remote.recv_string())
         except (zmq.ZMQError, AttributeError):
             print("Couldn't connect with Pupil Capture!")
@@ -200,7 +166,7 @@ class Button(QWidget):
             self.pub_socket = zmq.Socket(self.ctx, zmq.PUB)
             # self.pub_socket.setsockopt(zmq.LINGER, 0)  # ____POLICY: set upon instantiations
             # self.pub_socket.setsockopt(zmq.RCVTIMEO, 2000)
-            self.pub_socket.connect("tcp://{}:{}".format(self.ip, pub_port))
+            self.pub_socket.connect(f'tcp://{self.ip}:{pub_port}')
             # In order for the annotations to be correlated correctly with the rest of
             # the data it is required to change Pupil Capture's time base to this scripts
             # clock. We only set the time base once. Consider using Pupil Time Sync for
@@ -209,7 +175,7 @@ class Button(QWidget):
             # Set Pupil Capture's time base to this scripts time. (Should be done before
             # starting the recording)
 
-            self.pupil_remote.send_string("T {}".format(time()))
+            self.pupil_remote.send_string(f'T {time()}')
             print("Annotate...", self.pupil_remote.recv_string())
 
             # Start the annotations plugin
@@ -279,81 +245,10 @@ class Button(QWidget):
         return {
             "topic": "annotation",
             "label": label,
-            "timestamp": time(),  # time.asctime(time.localtime()); for Pupil Core > v3.4.0 NEEDS to be float
+            "timestamp": time(),  # time.asctime(time.localtime()); for Pupil Core > v3.4.0 NEEDS to be of type float
             "duration": duration,
         }
 
     def log(self):
         """Log Action"""
-        self.parent().page_log += "\n\t{} - Pressed Button {} ".format(datetime.datetime.now().replace(microsecond=0).__str__(),
-                                                                       self.id)
-
-
-class Calib(QWidget):
-    """ Mocking of the calibration display of Pupil Capture
-
-    This "window" is a QWidget. If it has no parent, it will appear as a free-floating window.
-
-    .. deprecated:: 0.1.0
-          `Calib` will be removed in version 1.0.0
-
-    """
-
-    def __init__(self):
-        super().__init__()
-        self.setStyleSheet("QWidget {background-color: white;}")
-        self.setWindowFlags(Qt.CustomizeWindowHint | Qt.FramelessWindowHint)
-        sg = QDesktopWidget().screenGeometry()
-        self.setFixedWidth(sg.width())
-        self.setFixedHeight(sg.height())
-
-        calibmarker = QPixmap('./Images/v0.4_calib_marker_02.jpg')
-        calibmarker = calibmarker.scaledToHeight(int(0.2 * sg.height()))
-        self.middle = QLabel(self)
-        self.middle.setPixmap(calibmarker)
-        self.middle.move(int(0.5 * sg.width() - 0.5 * calibmarker.width()),
-                         int(0.5 * sg.height() - 0.5 * calibmarker.height()))
-        self.topleft = QLabel(self)
-        self.topleft.setPixmap(calibmarker)
-        self.topleft.move(0, 0)
-        self.topright = QLabel(self)
-        self.topright.setPixmap(calibmarker)
-        self.topright.move(int(sg.width() - calibmarker.width()), 0)
-        self.bottomright = QLabel(self)
-        self.bottomright.setPixmap(calibmarker)
-        self.bottomright.move(int(sg.width() - calibmarker.width()), int(sg.height() - calibmarker.height()))
-        self.bottomleft = QLabel(self)
-        self.bottomleft.setPixmap(calibmarker)
-        self.bottomleft.move(0, int(sg.height() - calibmarker.height()))
-
-        stopmarker = QPixmap('./Images/v0.4_calib_marker_01.jpg')
-        stopmarker = stopmarker.scaledToHeight(int(0.2 * sg.height()))
-        self.stop = QLabel(self)
-        self.stop.setPixmap(stopmarker)
-        self.stop.move(int(0.5 * sg.width() - 0.5 * stopmarker.width()),
-                       int(0.5 * sg.height() - 0.5 * stopmarker.height()))
-        self.move(0, 0)
-
-        self.markers = [self.middle, self.topleft, self.topright, self.bottomright, self.bottomleft, self.stop]
-        self.show_marker(0)
-
-    def show_marker(self, marker_no):
-        """Display the marker `marker_no` of `self.markers` and hide the others.
-        Do this for all markers and then close the window.
-
-        Parameters
-        ----------
-        marker_no : int
-            number of the marker to be displayed [0..5]
-        """
-        # TODO display length?
-        for marker in range(len(self.markers)):
-            if self.markers[marker] != self.markers[marker_no]:
-                self.markers[marker].hide()
-            else:
-                self.markers[marker].show()
-        if marker_no + 1 < len(self.markers):
-            marker_no += 1
-            QTimer.singleShot(1000, lambda: self.show_marker(marker_no))
-        else:
-            QTimer.singleShot(1000, self.close)
+        self.parent().page_log += f'\n\t{str(datetime.datetime.now().replace(microsecond=0))} - Pressed Button {self.id}'
diff --git a/src/QEditGui.py b/src/QEditGui.py
index 1595efe269f059ede292e8743538d43f49b3e5f7..848647efde607fba08f3537192f66f7aba6bb0fa 100644
--- a/src/QEditGui.py
+++ b/src/QEditGui.py
@@ -6,12 +6,12 @@ from collections import deque
 from os.path import basename
 
 import configobj
-from PyQt5 import sip
-from PyQt5.QtCore import Qt, QModelIndex, QPoint
-from PyQt5.QtGui import QCloseEvent, QKeySequence, QPixmap
-from PyQt5.QtWidgets import QApplication, QTreeWidgetItem, QWidget, QHBoxLayout, QGroupBox, QSplitter, QFileDialog, \
-    QMainWindow, QAction, QLabel, QVBoxLayout, QFormLayout, QLineEdit, QPushButton, QGridLayout, QComboBox, QCheckBox, \
-    QRadioButton, QButtonGroup, QMenu, QInputDialog, QMessageBox, QLayout, QScrollArea, QDesktopWidget
+import shiboken6
+from PySide6.QtCore import Qt
+from PySide6.QtGui import QKeySequence, QAction, QCloseEvent
+from PySide6.QtWidgets import QApplication, QTreeWidgetItem, QWidget, QHBoxLayout, QGroupBox, QSplitter, QFileDialog, \
+    QMainWindow, QLabel, QVBoxLayout, QFormLayout, QLineEdit, QPushButton, QGridLayout, QComboBox, QCheckBox, \
+    QRadioButton, QButtonGroup, QMenu, QInputDialog, QMessageBox, QScrollArea
 from configobj import ConfigObj, ConfigObjError
 from fpdf import FPDF
 
@@ -19,28 +19,15 @@ from src.GUI import StackedWindowGui, VERSION
 from src.TextEdit import TextEdit
 from src.Tree import Tree
 from src.Validator import validate_questionnaire, listify
-from src.tools import *
+from src.tools import general_fields, default_values, tooltips, types, fields_per_type, video_player, randomize_options, page_fields, image_positions, policy_possibilities, player_buttons, function_possibilites
 
 
 class QEditGuiMain(QMainWindow):
-    """ Main Window, adds menu bar and status bar
-
-    Attributes
-    ----------
-    parent : QObject, optional
-        widget/layout this widget is embedded in
-    """
+    """ Main Window, adds menu bar and status bar."""
 
     # noinspection PyTypeChecker
-    def __init__(self, parent=None):
-        """
-
-        Parameters
-        ----------
-        parent : QObject, optional
-            widget/layout this widget is embedded in
-        """
-        QWidget.__init__(self, parent)
+    def __init__(self):
+        super().__init__()
         menu = self.menuBar()
         file = menu.addMenu("File")
         new = QAction("New", self)
@@ -106,12 +93,12 @@ class QEditGuiMain(QMainWindow):
         self.setCentralWidget(self.gui)
         self.setWindowTitle("Questionnaire Editor")
         self.move(0, 0)
-        # self.showMaximized()
+        self.showMaximized()
         self.show()
 
     def run_validation(self):
         """Make sure that the current variable is saved and then run validation."""
-        if (type(QApplication.focusWidget()) == QLineEdit) or (type(QApplication.focusWidget()) == TextEdit):
+        if isinstance(QApplication.focusWidget(), (QLineEdit, TextEdit)):
             QApplication.focusWidget().clearFocus()
         validate_questionnaire(listify(self.structure, self.status, self.status_duration))
 
@@ -126,50 +113,53 @@ class QEditGuiMain(QMainWindow):
             value of the button clicked (True if it is supposed to be saved)
         """
         msg = QMessageBox()
-        msg.setIcon(QMessageBox.Question)
+        msg.setIcon(QMessageBox.Icon.Question)
         msg.setText("The questionnaire file has changed. Do you want to save it?")
         msg.setWindowFlags(Qt.CustomizeWindowHint)  # removes title bar
-        msg.addButton("Yes", QMessageBox.AcceptRole)
-        msg.addButton("No", QMessageBox.RejectRole)
-        retval = msg.exec_()
+        msg.addButton("Yes", QMessageBox.ButtonRole.AcceptRole)
+        msg.addButton("No", QMessageBox.ButtonRole.RejectRole)
+        msg.exec()
+        retval = msg.buttonRole(msg.clickedButton())
         return retval
 
-    def closeEvent(self, a0):
+    def closeEvent(self, event):
         """Check for unsaved changes before quitting. (When the red x is pressed.)
 
         Parameters
         ----------
-        a0 : QCloseEvent
+        event : QCloseEvent
         """
-        self.quit_editor()
+        if isinstance(event, QCloseEvent):
+            self.quit_editor()
 
     def quit_editor(self):
         """Check for unsaved changes before quitting."""
-        QApplication.focusWidget().clearFocus()
+        if QApplication.focusWidget() is not None:
+            QApplication.focusWidget().clearFocus()
         if self.initial_structure is not None and self.initial_structure != copy.deepcopy(
                 dict(listify(self.structure))) and len(self.undo_stack) > 0 \
                 and not (
                 self.initial_structure == copy.deepcopy(dict(listify(self.structure))) and len(self.undo_stack) == 0):
-            if self.unsaved_message() == QMessageBox.AcceptRole:
+            if self.unsaved_message() == QMessageBox.ButtonRole.AcceptRole:
                 self.save()
         self.close()
 
     def export(self):
         """Export GUI to pdf by taking screenshots of every page and combining them."""
-        if (type(QApplication.focusWidget()) == QLineEdit) or (type(QApplication.focusWidget()) == TextEdit):
+        if isinstance(QApplication.focusWidget(), (QLineEdit, TextEdit)):
             QApplication.focusWidget().clearFocus()
         if self.filename is None:
             self.structure.filename = "./tmp.txt"
             self.structure.encoding = "utf-8"
-            self.structure.initial_comment = ["Created with QUEST version {}".format(VERSION)]
+            self.structure.initial_comment = [f'Created with QUEST version {VERSION}.']
             self.structure.write()
         self.status.showMessage("Exporting to pdf...", self.status_duration)
         exgui = StackedWindowGui(self.structure.filename, preview=True)
-        exgui.children()[1].setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)  # this is the ScrollArea
-        exgui.children()[1].setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)  # this is the ScrollArea
+        exgui.children()[1].setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)  # this is the ScrollArea
+        exgui.children()[1].setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)  # this is the ScrollArea
         rec_size = exgui.children()[1].children()[0].children()[0].children()[0].sizeHint()  # this is the Page object
         exgui.resize(max(exgui.width(), rec_size.width()), max(exgui.height(), rec_size.height()))
-        pdf = None#FPDF()
+        pdf = None
         for page in range(exgui.Stack.count()):
             exgui.Stack.setCurrentIndex(page)
             if page + 1 == exgui.Stack.count():  # last page
@@ -177,9 +167,9 @@ class QEditGuiMain(QMainWindow):
             p = exgui.grab()
             w = p.width()
             h = p.height()
-            p.save("./Page_{}.png".format(page))
+            p.save(f'./Page_{page}.png')
             if pdf is None:
-                pdf = FPDF(format=(w,h))
+                pdf = FPDF(format=(w, h))
             '''if w > h:
                 pdf.add_page(orientation='L')
                 pdf.image("./Page_{}.png".format(page), x=0, y=0)#, w=297)
@@ -188,7 +178,7 @@ class QEditGuiMain(QMainWindow):
                 pdf.image("./Page_{}.png".format(page), x=0, y=0)#, h=297)
             '''
             pdf.add_page()
-            pdf.image("./Page_{}.png".format(page), x=0, y=0, w=w, h=h)
+            pdf.image(f'./Page_{page}.png', x=0, y=0, w=w, h=h)
         exgui.close()
         file = QFileDialog().getSaveFileName(self, caption="Save PDF-File", filter="pdf files (*.pdf)")[0]
         if file is not None and file != "":
@@ -197,7 +187,7 @@ class QEditGuiMain(QMainWindow):
         else:
             self.status.showMessage("Export aborted.", self.status_duration)
         for page in range(exgui.Stack.count()):
-            os.remove("./Page_{}.png".format(page))
+            os.remove(f'./Page_{page}.png')
         if self.structure.filename == "./tmp.txt":
             os.remove("./tmp.txt")
 
@@ -205,9 +195,8 @@ class QEditGuiMain(QMainWindow):
         """Create a new file structure."""
         if self.initial_structure is not None and self.initial_structure != copy.deepcopy(
                 dict(listify(self.structure))) and len(self.undo_stack) > 0 \
-                and not (
-                self.initial_structure == copy.deepcopy(dict(listify(self.structure))) and len(self.undo_stack) == 0):
-            if self.unsaved_message() == QMessageBox.AcceptRole:
+                and not (self.initial_structure == copy.deepcopy(dict(listify(self.structure))) and len(self.undo_stack) == 0):
+            if self.unsaved_message() == QMessageBox.ButtonRole.AcceptRole:
                 self.save()
         self.undo_stack.clear()
         self.redo_stack.clear()
@@ -232,28 +221,27 @@ class QEditGuiMain(QMainWindow):
         """
         if self.initial_structure is not None and (
                 self.initial_structure != copy.deepcopy(dict(listify(self.structure))) and len(self.undo_stack) > 0) \
-                and not (
-                self.initial_structure == copy.deepcopy(dict(listify(self.structure))) and len(self.undo_stack) == 0):
-            if self.unsaved_message() == QMessageBox.AcceptRole:
+                and not (self.initial_structure == copy.deepcopy(dict(listify(self.structure))) and len(self.undo_stack) == 0):
+            if self.unsaved_message() == QMessageBox.ButtonRole.AcceptRole:
                 self.save()
         dlg = QFileDialog(self)
-        dlg.setFileMode(QFileDialog.ExistingFile)
+        dlg.setFileMode(QFileDialog.FileMode.ExistingFile)
         dlg.setNameFilter("Text files (*.txt)")
         dlg.setStyle(self.style())
-        if dlg.exec_():
+        if dlg.exec():
             file = dlg.selectedFiles()[0]
             self.filename = file
             try:
                 self.status.clearMessage()
+                self.status.showMessage(f'Loading {self.filename}.', self.status_duration)
                 self.structure = ConfigObj(file)
-                if len(self.structure.initial_comment) > 0:
-                    print(self.structure.initial_comment[0].rsplit(' ', 1)[1])
                 self.initial_structure = copy.deepcopy(dict(self.structure))
                 self.gui.create_tree(self.structure)
                 self.undoaction.setEnabled(False)
                 self.redoaction.setEnabled(False)
                 self.undo_stack.clear()
                 self.redo_stack.clear()
+                self.status.clearMessage()
             except ConfigObjError:
                 self.status.showMessage("Tried to load a file with an invalid structure.", self.status_duration)
             if self.load_preview.isChecked():
@@ -267,7 +255,7 @@ class QEditGuiMain(QMainWindow):
 
     def save(self):
         """Save current structure with current name."""
-        if (type(QApplication.focusWidget()) == QLineEdit) or (type(QApplication.focusWidget()) == TextEdit):
+        if isinstance(QApplication.focusWidget(), (QLineEdit, TextEdit)):
             QApplication.focusWidget().clearFocus()
         self.structure = listify(self.structure, self.status, self.status_duration)
         if self.structure.filename is None or self.structure.filename == "./tmp.txt":
@@ -275,18 +263,17 @@ class QEditGuiMain(QMainWindow):
         else:
             self.structure.filename = self.filename
             self.structure.encoding = "utf-8"
-            self.structure.initial_comment = ["Created with QUEST version {}".format(VERSION)]
+            self.structure.initial_comment = [f'Created with QUEST version {VERSION}.']
             self.structure.write()
             self.initial_structure = copy.deepcopy(dict(self.structure))
             self.status.clearMessage()
-            self.undo_stack.clear()
-            self.redo_stack.clear()
+            #self.undo_stack.clear()
+            #self.redo_stack.clear()
             self.status.showMessage("Saved structure.", self.status_duration)
 
     def saveas(self):
         """Save current structure as .txt file."""
-        if (type(QApplication.focusWidget()) == QLineEdit) or (type(QApplication.focusWidget()) == TextEdit):
-            # QLineEdit().editingFinished()
+        if isinstance(QApplication.focusWidget(), (QLineEdit, TextEdit)):
             QApplication.focusWidget().clearFocus()
         self.structure = listify(self.structure, self.status, self.status_duration)
         file = QFileDialog().getSaveFileName(self, caption="Save File", filter="Text files (*.txt)")[0]
@@ -294,13 +281,13 @@ class QEditGuiMain(QMainWindow):
             self.filename = file
             self.structure.filename = file
             self.structure.encoding = "utf-8"
-            self.structure.initial_comment = ["Created with QUEST version {}".format(VERSION)]
+            self.structure.initial_comment = [f'Created with QUEST version {VERSION}.']
             self.structure.write()
             self.initial_structure = copy.deepcopy(dict(self.structure))
             self.status.clearMessage()
-            self.undo_stack.clear()
-            self.redo_stack.clear()
-            self.status.showMessage("Saved structure as {}".format(file), self.status_duration)
+            #self.undo_stack.clear()
+            #self.redo_stack.clear()
+            self.status.showMessage(f'Saved structure as {file}.', self.status_duration)
             self.gui.treeview.topLevelItem(0).setText(0, os.path.basename(file))
         else:
             self.status.clearMessage()
@@ -350,7 +337,7 @@ class EditGui(QWidget):
         self.treeview = Tree(self)
         self.treeview.clicked.connect(self.show_details)
         self.treeview.itemSelectionChanged.connect(self.change_active_buttons)
-        self.treeview.setContextMenuPolicy(Qt.CustomContextMenu)
+        self.treeview.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.treeview.customContextMenuRequested.connect(self.open_tree_menu)
         self.treeview.tree_changed.connect(self.update_structure)
         self.treeview.error_message.connect(self.set_status_message)
@@ -363,6 +350,7 @@ class EditGui(QWidget):
         self.questiontype = QComboBox()
         self.questiontype.addItems(types)
         self.questiontype.setToolTip(tooltips["type"])
+        self.questiontype.setObjectName("questiontype")
         self.questiontype.hide()
         self.questiontype.activated.connect(self.update_val)
         self.qss_filechooser = QPushButton("Choose file...")
@@ -443,7 +431,7 @@ class EditGui(QWidget):
         self.prev_refresh_layout = QHBoxLayout()
         self.refresh_button = QPushButton("Refresh Preview")
         self.refresh_button.clicked.connect(self.load_preview)
-        self.prev_refresh_layout.addWidget(self.refresh_button, alignment=Qt.AlignRight | Qt.AlignBottom)
+        self.prev_refresh_layout.addWidget(self.refresh_button, alignment=Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignBottom)
         self.automatic_refresh = QCheckBox("automatic refresh")
         self.prev_refresh_layout.addWidget(self.automatic_refresh)
         self.prev_layout.addLayout(self.prev_refresh_layout)
@@ -451,21 +439,22 @@ class EditGui(QWidget):
         scroll = QScrollArea()
         scroll.setWidget(edit)
         scroll.setWidgetResizable(True)
-        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
+        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
         scroll.setStyleSheet("QScrollArea{border: 1px solid transparent;}")
         splitter.addWidget(structure_view)
         splitter.addWidget(scroll)
         splitter.addWidget(preview)
         layout.addWidget(splitter)
+        splitter.setSizes([int(self.width()/3), int(self.width()/3), int(self.width()/3)])
         self.setLayout(layout)
 
     def choose_qss(self):
         """Choose an existing qss/css file as stylesheet."""
         dlg = QFileDialog(self)
-        dlg.setFileMode(QFileDialog.ExistingFile)
+        dlg.setFileMode(QFileDialog.FileMode.ExistingFile)
         dlg.setNameFilter("QSS/CSS files (*.qss *.css)")
         dlg.setStyle(self.style())
-        if dlg.exec_():
+        if dlg.exec():
             self.qss_filename.setText(dlg.selectedFiles()[0])
             if self.parent().structure["stylesheet"] != self.qss_filename.text():
                 self.parent().undo_stack.append(copy.deepcopy(dict(self.parent().structure)))
@@ -479,10 +468,10 @@ class EditGui(QWidget):
     def choose_pwfile(self):
         """Choose an existing txt file as password file."""
         dlg = QFileDialog(self)
-        dlg.setFileMode(QFileDialog.ExistingFile)
+        dlg.setFileMode(QFileDialog.FileMode.ExistingFile)
         dlg.setNameFilter("Password files (*.txt)")
         dlg.setStyle(self.style())
-        if dlg.exec_():
+        if dlg.exec():
             self.pw_file.setText(dlg.selectedFiles()[0])
             page = self.treeview.selectedItems()[0].parent().text(0)
             question = self.treeview.selectedItems()[0].text(0)
@@ -496,10 +485,10 @@ class EditGui(QWidget):
     def choose_imgfile(self):
         """Choose an existing image file."""
         dlg = QFileDialog(self)
-        dlg.setFileMode(QFileDialog.ExistingFile)
+        dlg.setFileMode(QFileDialog.FileMode.ExistingFile)
         dlg.setNameFilter("Image files (*.png *.jpg *.jpeg *.gif)")
         dlg.setStyle(self.style())
-        if dlg.exec_():
+        if dlg.exec():
             self.img_file.setText(dlg.selectedFiles()[0])
             page = self.treeview.selectedItems()[0].parent().text(0)
             question = self.treeview.selectedItems()[0].text(0)
@@ -513,10 +502,10 @@ class EditGui(QWidget):
     def choose_randfile(self):
         """Choose an existing txt file as randomization order file."""
         dlg = QFileDialog(self)
-        dlg.setFileMode(QFileDialog.ExistingFile)
+        dlg.setFileMode(QFileDialog.FileMode.ExistingFile)
         dlg.setNameFilter("Randomization files (*.txt *.csv)")
         dlg.setStyle(self.style())
-        if dlg.exec_():
+        if dlg.exec():
             self.rand_file.setText(dlg.selectedFiles()[0])
             if self.parent().structure["randomization_file"] != self.rand_file.text():
                 self.parent().undo_stack.append(copy.deepcopy(dict(self.parent().structure)))
@@ -533,18 +522,18 @@ class EditGui(QWidget):
         file : str, optional, default=None
             name/path of the config file, use None for previewing an unsaved structure.
         """
-        if (type(QApplication.focusWidget()) == QLineEdit) or (type(QApplication.focusWidget()) == TextEdit):
+        if isinstance(QApplication.focusWidget(), (QLineEdit, TextEdit)):
             self.edit_done()
+        self.parent().save()
         error_found, _, _ = validate_questionnaire(
             listify(self.parent().structure, self.parent().status, self.parent().status_duration), suppress=True)
         if not error_found and len(self.parent().structure.sections) > 0:
             self.clear_layout(self.prev_widget)
             if file is None or not file:
-                if not file and (self.parent().structure.filename is None or file == "./tmp.txt" or
-                                 self.parent().structure.filename == "./tmp.txt"):
+                if not file and (self.parent().structure.filename is None or file == "./tmp.txt" or self.parent().structure.filename == "./tmp.txt"):
                     self.parent().structure.filename = "./tmp.txt"
                     self.parent().structure.encoding = "utf-8"
-                    self.parent().structure.initial_comment = ["Created with QUEST version {}".format(VERSION)]
+                    self.parent().structure.initial_comment = [f'Created with QUEST version {VERSION}.']
                     self.parent().structure.write()
                     file = "./tmp.txt"
                 else:
@@ -624,7 +613,7 @@ class EditGui(QWidget):
                 page = QTreeWidgetItem(root, [sec])
                 for q in structure[sec].sections:
                     quest = QTreeWidgetItem(page, [q])
-                    quest.setFlags(quest.flags() & ~Qt.ItemIsDropEnabled)
+                    quest.setFlags(quest.flags() & ~Qt.ItemFlag.ItemIsDropEnabled)
             self.treeview.addTopLevelItem(root)
         else:
             root = QTreeWidgetItem(self.treeview, ["<new questionnaire>"])
@@ -653,8 +642,7 @@ class EditGui(QWidget):
                         if field == "go_back":
                             val_field = QCheckBox("")
                             val_field.toggled.connect(self.update_val)
-                            val_field.setChecked(True if ((self.parent().structure[field] == "True") or (
-                                    type(self.parent().structure["go_back"]) is bool and self.parent().structure["go_back"])) else False)
+                            val_field.setChecked(True if ((self.parent().structure[field] == "True") or (isinstance(self.parent().structure["go_back"], bool) and self.parent().structure["go_back"])) else False)
                         elif field == "save_message":
                             val_field = TextEdit(self.parent().structure[field] if field in self.parent().structure.keys() else "")
                             val_field.editingFinished.connect(self.edit_done)
@@ -664,7 +652,7 @@ class EditGui(QWidget):
                             if current_pages:
                                 self.save_after.addItems(current_pages)
                                 selected = current_pages.index(self.parent().structure[field]) if (field in self.parent().structure.keys() and self.parent().structure[field] in current_pages) else -1
-                                self.save_after.setCurrentIndex(selected if selected > -1 else len(current_pages)-1)
+                                self.save_after.setCurrentIndex(selected if selected > -1 else len(current_pages) - 1)
                                 self.parent().structure[field] = self.save_after.currentText()
                             self.save_after.show()
                         elif field == "stylesheet":
@@ -699,7 +687,6 @@ class EditGui(QWidget):
                         elif field == "video_player":
                             val_field = QComboBox()
                             val_field.addItems(video_player)
-                            print(self.parent().structure[field])
                             val_field.setCurrentIndex(video_player.index(self.parent().structure[field]))
                             val_field.activated.connect(self.update_val)
                         else:
@@ -707,18 +694,17 @@ class EditGui(QWidget):
                             if field in self.parent().structure.keys():
                                 val_field.setText(str(self.parent().structure[field]))
                             val_field.editingFinished.connect(self.edit_done)
-                            if field == "back_text" and (("go_back" in self.parent().structure.keys()) and
-                                                         ((self.parent().structure["go_back"] == "False") or (
-                                    type(self.parent().structure["go_back"]) is bool and not self.parent().structure["go_back"]))):
+                            if field == "back_text" and (("go_back" in self.parent().structure.keys()) and ((self.parent().structure["go_back"] == "False") or (
+                                    isinstance(self.parent().structure["go_back"], bool) and not self.parent().structure["go_back"]))):
                                 val_field.setDisabled(True)
                         self.edit_layout.addRow(QLabel(field), val_field)
-                        if type(val_field) != QHBoxLayout:
+                        if not isinstance(val_field, QHBoxLayout):
                             val_field.setToolTip(tooltips[field])
             elif (val.parent().data() is not None) and (val.parent().parent().data() is None):  # page
                 if self.parent().structure[val.data()]:
                     for k in page_fields:
                         val_field = None
-                        if k == "title" or k == "randomgroup" or k == "pupil_on_next":
+                        if k in ["title", "randomgroup", "pupil_on_next"]:
                             val_field = QLineEdit(self.parent().structure[val.data()][k] if k in self.parent().structure[val.data()] else "")
                             val_field.editingFinished.connect(self.edit_done)
                         elif k == "description":
@@ -764,12 +750,14 @@ class EditGui(QWidget):
                                         self.img_layout.addWidget(self.img_file)
                                 elif fields_per_type[question_data[k]][0][field] == "QPlainTextEdit":
                                     if field not in question_data.keys():
-                                        val_field = TextEdit("")
+                                        val_field = TextEdit()
+                                        val_field.setText("")
                                     else:
-                                        val_field = TextEdit(str(question_data[field]))
+                                        val_field = TextEdit()
+                                        val_field.setText(str(question_data[field]))
                                     val_field.editingFinished.connect(self.edit_done)
                                     if (field == "label") and ((question_data["labelled"] == "False") or (
-                                            type(question_data["labelled"]) is bool and not question_data["labelled"])):
+                                            isinstance(question_data["labelled"], bool) and not question_data["labelled"])):
                                         val_field.setDisabled(True)
                                 elif fields_per_type[question_data[k]][0][field] == "QComboBox":
                                     if field == "receiver":
@@ -815,14 +803,12 @@ class EditGui(QWidget):
                                             self.clear_layout(self.policy_layout)
                                             if question_data[field] == "free":
                                                 self.policy_layout.addWidget(QLabel("x_pos"))
-                                                ann_field = QLineEdit(str(question_data[
-                                                                              "x_pos"]) if "x_pos" in question_data.keys() else "")
+                                                ann_field = QLineEdit(str(question_data["x_pos"]) if "x_pos" in question_data.keys() else "")
                                                 ann_field.setObjectName("x_pos")
                                                 self.policy_layout.addWidget(ann_field)
                                                 ann_field.editingFinished.connect(self.edit_done)
                                                 self.policy_layout.addWidget(QLabel("y_pos"))
-                                                ann_field = QLineEdit(str(question_data[
-                                                                              "y_pos"]) if "y_pos" in question_data.keys() else "")
+                                                ann_field = QLineEdit(str(question_data["y_pos"]) if "y_pos" in question_data.keys() else "")
                                                 ann_field.setObjectName("y_pos")
                                                 self.policy_layout.addWidget(ann_field)
                                                 ann_field.editingFinished.connect(self.edit_done)
@@ -921,9 +907,9 @@ class EditGui(QWidget):
                                             bg.addButton(rb, cnt)
                                             bg.buttonClicked.connect(self.update_val)
                                             cnt += 1
-                                if type(val_field) != QHBoxLayout:
+                                if not isinstance(val_field, QHBoxLayout):
                                     val_field.setToolTip(tooltips[field])
-                                if field == "policy" or field == "annotation" or field == "recording_name" or field == "function" or field == "image_position":
+                                if field in ["policy", "annotation", "recording_name", "function", "image_position"]:
                                     self.edit_layout.addRow(QLabel(field), val_field)
                                     self.edit_layout.addRow(self.policy_layout)
                                 elif field == "password_file":
@@ -945,22 +931,20 @@ class EditGui(QWidget):
                 self.parent().undoaction.setEnabled(True)
                 self.parent().redo_stack.clear()
                 self.parent().redoaction.setEnabled(False)
-            if type(self.sender()) is QButtonGroup:
+            if isinstance(self.sender(), QButtonGroup):
                 lbl = self.sender().parent().parent().layout().labelForField(self.sender().parent().layout()).text()
                 new_val = self.sender().checkedId()
                 if lbl == "size":
                     if self.sender().checkedId():  # multiline
-                        pos = \
-                            self.sender().parent().parent().layout().getLayoutPosition(self.sender().parent().layout())[0] + 1
-                        self.sender().parent().parent().layout().itemAt(pos, 1).widget().setEnabled(False)
-                        self.sender().parent().parent().layout().itemAt(pos, 1).widget().setCurrentIndex(0)
+                        pos = self.sender().parent().parent().layout().getLayoutPosition(self.sender().parent().layout())[0] + 1
+                        self.sender().parent().parent().layout().itemAt(pos, QFormLayout.ItemRole.FieldRole).widget().setEnabled(False)
+                        self.sender().parent().parent().layout().itemAt(pos, QFormLayout.ItemRole.FieldRole).widget().setCurrentIndex(0)
                         self.clear_layout(self.policy_layout)
                     else:
-                        pos = \
-                            self.sender().parent().parent().layout().getLayoutPosition(self.sender().parent().layout())[0] + 1
-                        self.sender().parent().parent().layout().itemAt(pos, 1).widget().setEnabled(True)
+                        pos = self.sender().parent().parent().layout().getLayoutPosition(self.sender().parent().layout())[0] + 1
+                        self.sender().parent().parent().layout().itemAt(pos, QFormLayout.ItemRole.FieldRole).widget().setEnabled(True)
                         self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["policy"] = \
-                            self.sender().parent().parent().layout().itemAt(pos, 1).widget().currentText()
+                            self.sender().parent().parent().layout().itemAt(pos, QFormLayout.ItemRole.FieldRole).widget().currentText()
                     self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["policy"] = ["None"]
                     new_val += 1
                 elif lbl == "buttons":
@@ -968,17 +952,17 @@ class EditGui(QWidget):
                     for btn in self.sender().buttons():
                         if btn.isChecked():
                             new_val.append(player_buttons[self.sender().buttons().index(btn)])
-            elif type(self.sender().parent().layout()) != QVBoxLayout:
+            elif not isinstance(self.sender().parent().layout(), QVBoxLayout):
                 lbl = self.sender().parent().layout().labelForField(self.sender()).text()
-            if type(self.sender()) is QCheckBox:
-                if (lbl == "go_back") or (lbl == "labelled"):
+            if isinstance(self.sender(), QCheckBox):
+                if lbl in ["go_back", "labelled"]:
                     if new_val:
                         pos = self.sender().parent().layout().getWidgetPosition(self.sender())[0] + 1
-                        self.sender().parent().layout().itemAt(pos, 1).widget().setEnabled(True)
+                        self.sender().parent().layout().itemAt(pos, QFormLayout.ItemRole.FieldRole).widget().setEnabled(True)
                     else:
                         pos = self.sender().parent().layout().getWidgetPosition(self.sender())[0] + 1
-                        self.sender().parent().layout().itemAt(pos, 1).widget().setEnabled(False)
-            elif type(self.sender()) is QComboBox:
+                        self.sender().parent().layout().itemAt(pos, QFormLayout.ItemRole.FieldRole).widget().setEnabled(False)
+            elif isinstance(self.sender(), QComboBox):
                 if self.sender().objectName() == "receiver":
                     self.sender().parent().layout().itemAt(1).widget().layout().itemAt(1).widget().setEnabled(False)
                     self.sender().parent().layout().itemAt(1).widget().layout().itemAt(3).widget().setEnabled(False)
@@ -1079,12 +1063,12 @@ class EditGui(QWidget):
                     new_val = self.sender().currentText()
                     # add all needed fields for the new type, keep values of fields if already present
                     for field in fields_per_type[new_val][0].keys():
-                        if field in default_values.keys() and \
+                        if field in default_values and \
                                 field not in self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]:
                             self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)][field] = default_values[field]
                     # remove no longer valid fields
                     for field in self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)].keys():
-                        if field not in fields_per_type[new_val][0].keys():
+                        if field not in fields_per_type[new_val][0]:
                             self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)].pop(field)
 
             # update the value just changed
@@ -1136,38 +1120,28 @@ class EditGui(QWidget):
                     new_val[1] = self.sender().text() if len(new_val) > 1 else new_val.append(self.sender().text())
             elif self.sender().objectName() == "anno":
                 new_val = self.sender().text()
-                self.parent().structure[self.treeview.currentItem().parent().text(0)][
-                    self.treeview.currentItem().text(0)]["annotation"] = new_val
+                self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["annotation"] = new_val
             elif self.sender().objectName() == "rec":
                 new_val = self.sender().text()
-                self.parent().structure[self.treeview.currentItem().parent().text(0)][
-                    self.treeview.currentItem().text(0)]["recording_name"] = new_val
+                self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["recording_name"] = new_val
             elif self.sender().objectName() == "x_pos":
                 new_val = self.sender().text()
-                self.parent().structure[self.treeview.currentItem().parent().text(0)][
-                    self.treeview.currentItem().text(0)]["x_pos"] = new_val
+                self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["x_pos"] = new_val
             elif self.sender().objectName() == "y_pos":
                 new_val = self.sender().text()
-                self.parent().structure[self.treeview.currentItem().parent().text(0)][
-                    self.treeview.currentItem().text(0)]["y_pos"] = new_val
+                self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["y_pos"] = new_val
             elif self.sender().objectName() == "rec_ip":
                 new_val = self.sender().text()
-                if len(self.parent().structure[self.treeview.currentItem().parent().text(0)][
-                    self.treeview.currentItem().text(0)]["receiver"]) > 0:
-                    self.parent().structure[self.treeview.currentItem().parent().text(0)][
-                        self.treeview.currentItem().text(0)]["receiver"][0] = new_val
+                if len(self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["receiver"]) > 0:
+                    self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["receiver"][0] = new_val
                 else:
-                    self.parent().structure[self.treeview.currentItem().parent().text(0)][
-                        self.treeview.currentItem().text(0)]["receiver"] = [new_val, ""]
+                    self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["receiver"] = [new_val, ""]
             elif self.sender().objectName() == "rec_port":
                 new_val = self.sender().text()
-                if len(self.parent().structure[self.treeview.currentItem().parent().text(0)][
-                           self.treeview.currentItem().text(0)]["receiver"]) > 0:
-                    self.parent().structure[self.treeview.currentItem().parent().text(0)][
-                        self.treeview.currentItem().text(0)]["receiver"][1] = new_val
+                if len(self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["receiver"]) > 0:
+                    self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["receiver"][1] = new_val
                 else:
-                    self.parent().structure[self.treeview.currentItem().parent().text(0)][
-                        self.treeview.currentItem().text(0)]["receiver"] = ["", new_val]
+                    self.parent().structure[self.treeview.currentItem().parent().text(0)][self.treeview.currentItem().text(0)]["receiver"] = ["", new_val]
         if self.automatic_refresh.isChecked():
             self.load_preview()
 
@@ -1181,12 +1155,13 @@ class EditGui(QWidget):
             value of the button clicked (True if it is supposed to be updated)
         """
         msg = QMessageBox()
-        msg.setIcon(QMessageBox.Question)
-        msg.setText('The current value of "save_after" is "{}". Do you want to change it to the new page ({})?'.format(self.save_after.currentText(), new_page))
+        msg.setIcon(QMessageBox.Icon.Question)
+        msg.setText(f'The current value of "save_after" is "{self.save_after.currentText()}". Do you want to change it to the new page ({new_page})?')
         msg.setWindowFlags(Qt.CustomizeWindowHint)  # removes title bar
-        msg.addButton("Yes", QMessageBox.AcceptRole)
-        msg.addButton("No", QMessageBox.RejectRole)
-        retval = msg.exec_()
+        msg.addButton("Yes", QMessageBox.ButtonRole.AcceptRole)
+        msg.addButton("No", QMessageBox.ButtonRole.RejectRole)
+        msg.exec()
+        retval = msg.buttonRole(msg.clickedButton())
         return retval
 
     def clear_layout(self, layout):
@@ -1198,7 +1173,7 @@ class EditGui(QWidget):
             the layout to be cleared
         """
         while layout.count():
-            if type(layout) == QFormLayout:
+            if isinstance(layout, QFormLayout):
                 trr = layout.takeRow(0)
                 child = trr.fieldItem
                 lbl = trr.labelItem
@@ -1206,11 +1181,7 @@ class EditGui(QWidget):
                     lbl.widget().deleteLater()
             else:
                 child = layout.takeAt(0)
-            if child.widget() and (not child.widget() == self.questiontype) and \
-                    (not child.widget() == self.qss_filechooser) and (not child.widget() == self.qss_filename)\
-                    and (not child.widget() == self.pw_file) and (not child.widget() == self.save_after) and\
-                    (not child.widget() == self.img_file) and\
-                    (not child.widget() == self.rand_file) and (not child.widget() == self.rand_filechooser):
+            if child.widget() and child.widget() not in [self.questiontype, self.qss_filechooser, self.qss_filename, self.pw_file, self.save_after, self.img_file, self.rand_file, self.rand_filechooser]:
                 child.widget().deleteLater()
             elif child.widget() == self.questiontype:
                 self.questiontype.hide()
@@ -1303,7 +1274,7 @@ class EditGui(QWidget):
                 paste_quest.triggered.connect(lambda: self.paste(self.treeview.itemAt(position)))
                 menu.addAction(paste_quest)
             if menu is not None:
-                menu.exec_(self.treeview.viewport().mapToGlobal(position))
+                menu.exec(self.treeview.viewport().mapToGlobal(position))
 
     def copy(self, node, copy_type):
         """Copy a page or question.
@@ -1341,7 +1312,7 @@ class EditGui(QWidget):
         pasted = False
         before = copy.deepcopy(dict(self.parent().structure))
         if self.copied[0] is not None:
-            if item is None or type(item) is bool:
+            if item is None or isinstance(item, bool):
                 item = self.current_item
             if item is not None:
                 if (item.parent() is None and self.copied[1] != "page") or (item.parent() is not None and item.text(0) not in self.parent().structure.sections and self.copied[1] != "question"):
@@ -1372,10 +1343,10 @@ class EditGui(QWidget):
         data : configobj.Section, default=None
             not None when adding a page by copy+paste
         """
-        text, ok = QInputDialog.getText(self, "New page", "Name of the new page:", QLineEdit.Normal)
+        text, ok = QInputDialog.getText(self, "New page", "Name of the new page:", QLineEdit.EchoMode.Normal)
         if ok and text not in self.parent().structure.keys() and text != '':
             self.treeview.expandItem(self.treeview.itemAt(0, 0))
-            if data is None or type(data) != configobj.Section:
+            if data is None or not isinstance(data, configobj.Section):
                 self.parent().undo_stack.append(
                     copy.deepcopy(dict(self.parent().structure)))
                 self.parent().undoaction.setEnabled(True)
@@ -1390,7 +1361,7 @@ class EditGui(QWidget):
                     self.parent().structure["save_after"] = text
                 else:
                     new_val = self.change_save_after_message(text)
-                    if new_val == QMessageBox.AcceptRole:
+                    if new_val == QMessageBox.ButtonRole.AcceptRole:
                         self.parent().structure["save_after"] = text
             else:
                 page = QTreeWidgetItem(self.treeview.itemAt(0, 0), self.treeview.currentItem())
@@ -1404,19 +1375,18 @@ class EditGui(QWidget):
                 for quest in data.sections:
                     _ = QTreeWidgetItem(page, [quest])
                 new_val = self.change_save_after_message(text)
-                if new_val == QMessageBox.AcceptRole:
+                if new_val == QMessageBox.ButtonRole.AcceptRole:
                     self.parent().structure["save_after"] = text
                 self.update_structure()
             self.treeview.setCurrentItem(page)
             self.show_details(self.treeview.indexFromItem(page))
-            if self.automatic_refresh.isChecked() and (data is None or type(data) != configobj.Section):
+            if self.automatic_refresh.isChecked() and (data is None or not isinstance(data, configobj.Section)):
                 self.load_preview()
         elif text in self.parent().structure.keys():
             if text in general_fields:
-                self.set_status_message(
-                    "Cannot create page named {}. A general field is already named that.".format(text))
+                self.set_status_message(f'Cannot create page named {text}. A general field is already named that.')
             else:
-                self.set_status_message("Page {} already exists.".format(text))
+                self.set_status_message(f'Page {text} already exists.')
         else:
             self.set_status_message("Add page aborted.")
 
@@ -1430,7 +1400,7 @@ class EditGui(QWidget):
         data : configObj.Section, default=None
             not None when adding a page by copy+paste
         """
-        text, ok = QInputDialog.getText(self, "New question", "Name of the new question:", QLineEdit.Normal)
+        text, ok = QInputDialog.getText(self, "New question", "Name of the new question:", QLineEdit.EchoMode.Normal)
         if ok and text not in self.parent().structure[page.text(0)].keys() and text != '':
             self.treeview.expandItem(page)
             if data is None:
@@ -1440,13 +1410,13 @@ class EditGui(QWidget):
                 self.parent().redoaction.setEnabled(False)
                 self.parent().structure[page.text(0)][text] = {}
                 quest = QTreeWidgetItem(page, [text])
-                quest.setFlags(quest.flags() & ~Qt.ItemIsDropEnabled)
+                quest.setFlags(quest.flags() & ~Qt.ItemFlag.ItemIsDropEnabled)
                 new_question = {"type": "HLine"}
                 self.parent().structure[page.text(0)][text] = new_question
             else:
                 quest = QTreeWidgetItem(page, self.treeview.currentItem())
                 quest.setText(0, text)
-                quest.setFlags(quest.flags() & ~Qt.ItemIsDropEnabled)
+                quest.setFlags(quest.flags() & ~Qt.ItemFlag.ItemIsDropEnabled)
                 new_question = data.copy()
                 self.parent().structure[page.text(0)][text] = new_question  # data
                 self.update_structure()
@@ -1456,10 +1426,9 @@ class EditGui(QWidget):
                 self.load_preview()
         elif text in self.parent().structure[page.text(0)].keys():
             if text in page_fields:
-                self.set_status_message(
-                    "Cannot create question named {}. A general field is already named that.".format(text))
+                self.set_status_message(f'Cannot create question named {text}. A general field is already named that.')
             else:
-                self.set_status_message("Question {} already exists.".format(text))
+                self.set_status_message(f'Question {text} already exists.')
         else:
             self.set_status_message("Add question aborted.")
 
@@ -1478,7 +1447,7 @@ class EditGui(QWidget):
         self.parent().structure.pop(item.text(0))
         if "save_after" in self.parent().structure.keys() and self.parent().structure["save_after"] == item.text(0):
             self.parent().structure["save_after"] = None
-        sip.delete(item)  # delete AFTER last ref!
+        shiboken6.delete(item)  # delete AFTER last ref!
         self.treeview.clearSelection()
         self.current_item = None
         self.clear_layout(self.edit_layout)
@@ -1498,7 +1467,7 @@ class EditGui(QWidget):
         self.parent().redo_stack.clear()
         self.parent().redoaction.setEnabled(False)
         self.parent().structure[item.parent().text(0)].pop(item.text(0))
-        sip.delete(item)  # delete AFTER last ref!
+        shiboken6.delete(item)  # delete AFTER last ref!
         self.clear_layout(self.edit_layout)
         self.treeview.clearSelection()
         self.current_item = None
@@ -1513,7 +1482,7 @@ class EditGui(QWidget):
         item : QTreeWidgetItem
             the page to be renamed
         """
-        text, ok = QInputDialog.getText(self, "Rename page", "New name for the page:", QLineEdit.Normal)
+        text, ok = QInputDialog.getText(self, "Rename page", "New name for the page:", QLineEdit.EchoMode.Normal)
         if ok and text not in self.parent().structure.keys() and text != '':
             self.parent().undo_stack.append(copy.deepcopy(dict(self.parent().structure)))
             self.parent().undoaction.setEnabled(True)
@@ -1525,10 +1494,9 @@ class EditGui(QWidget):
             self.show_details(self.treeview.indexFromItem(item))
         elif text in self.parent().structure.keys():
             if text in general_fields:
-                self.set_status_message(
-                    "Cannot rename page to {}. A general field is already named that.".format(text))
+                self.set_status_message(f'Cannot rename page to {text}. A general field is already named that.')
             else:
-                self.set_status_message("Page {} already exists.".format(text))
+                self.set_status_message(f'Page {text} already exists.')
         else:
             self.set_status_message("Add page aborted.")
 
@@ -1540,7 +1508,7 @@ class EditGui(QWidget):
         item : QTreeWidgetItem
             the question to be renamed
         """
-        text, ok = QInputDialog.getText(self, "Rename question", "New name for the question:", QLineEdit.Normal)
+        text, ok = QInputDialog.getText(self, "Rename question", "New name for the question:", QLineEdit.EchoMode.Normal)
         if ok and text not in self.parent().structure[item.parent().text(0)].keys() and text != '':
             self.parent().undo_stack.append(copy.deepcopy(dict(self.parent().structure)))
             self.parent().undoaction.setEnabled(True)
@@ -1552,10 +1520,9 @@ class EditGui(QWidget):
             self.show_details(self.treeview.indexFromItem(item))
         elif text in self.parent().structure[item.parent().text(0)].keys():
             if text in page_fields:
-                self.set_status_message(
-                    "Cannot rename question to {}. A general field is already named that.".format(text))
+                self.set_status_message(f'Cannot rename question to {text}. A general field is already named that.')
             else:
-                self.set_status_message("Question {} already exists.".format(text))
+                self.set_status_message(f'Question {text} already exists.')
         else:
             self.set_status_message("Add question aborted.")
 
@@ -1585,12 +1552,12 @@ class EditGui(QWidget):
 
         if pages != self.parent().structure.sections:
             # TODO Testcases
-            for page_no in range(len(pages)):
+            for page_no, pg in enumerate(pages):
                 if page_no < len(self.parent().structure.sections):
-                    if pages[page_no] != self.parent().structure.sections[page_no]:
+                    if pg != self.parent().structure.sections[page_no]:
                         self.parent().structure.pop(self.parent().structure.sections[page_no])
                         while (page_no < len(self.parent().structure.sections)) and (
-                                pages[page_no] != self.parent().structure.sections[page_no]):
+                                pg != self.parent().structure.sections[page_no]):
                             self.parent().structure.pop(self.parent().structure.sections[page_no])
                 else:
                     break
@@ -1656,19 +1623,19 @@ class EditGui(QWidget):
                             else:
                                 # it's the question moved here, it's not been processed yet
                                 diff = []
-                                for other_page in range(len(self.parent().structure.sections)):
-                                    if len(self.parent().structure[self.parent().structure.sections[other_page]].sections) > len(questions[other_page]):
+                                for other_page, sec in enumerate(self.parent().structure.sections):
+                                    if len(self.parent().structure[sec].sections) > len(questions[other_page]):
                                         # find the page it's came from
-                                        diff = [self.parent().structure.sections[other_page]]
+                                        diff = [sec]
                                         # print("other page:", diff)
                                         # print(self.parent().structure[diff[0]])
                                         # print("sec", self.parent().structure[diff[0]].sections)
                                         # print("new quests",questions[other_page])
-                                        for other_sections in self.parent().structure[self.parent().structure.sections[other_page]].sections:
+                                        for other_sections in self.parent().structure[sec].sections:
                                             # print("e2", other_sections)
                                             if other_sections not in questions[other_page]:  # find the question removed
                                                 # print("diff found", other_sections)
-                                                diff.append(self.parent().structure[self.parent().structure.sections[other_page]][other_sections])
+                                                diff.append(self.parent().structure[sec][other_sections])
                                 # print("Adding", questions[page][quest_no], diff[1])
                                 self.parent().structure[pages[page]][questions[page][quest_no]] = diff[1]  # append here
                                 # print("New structure after adding:", self.parent().structure.sections, self.parent().structure[pages[page]].sections)
@@ -1680,4 +1647,4 @@ class EditGui(QWidget):
 if __name__ == '__main__':
     app = QApplication([])
     ex = QEditGuiMain()
-    app.exec_()
+    app.exec()
diff --git a/src/RadioMatrix.py b/src/RadioMatrix.py
index 96626fd048c6a76534f4e0104c0aa6d780bcd5fd..6cb896200a548407f25693b13d8f969582b77cc7 100644
--- a/src/RadioMatrix.py
+++ b/src/RadioMatrix.py
@@ -1,8 +1,8 @@
 """A matrix of questions with radiobuttons as answers using all one set of answer possibilities."""
 import random
 
-from PyQt5.QtCore import Qt
-from PyQt5.QtWidgets import QWidget, QFormLayout, QLabel, QHBoxLayout
+from PySide6.QtCore import Qt
+from PySide6.QtWidgets import QWidget, QFormLayout, QLabel, QHBoxLayout
 
 from src.AnswerRadioButton import make_answers
 
@@ -37,17 +37,17 @@ class RadioMatrix(QWidget):
             self.name = None
         self.id = qid
 
-        if type(questions) is str:
+        if isinstance(questions, str):
             questions = [questions]
-        if type(answers) is str:
+        if isinstance(answers, str):
             answers = [answers]
 
-        if randomize is True:
+        if randomize:
             random.seed(self.parent().parent().start.__str__())  # uses starting time
-            self.id_order = [i+1 for i in range(0, len(questions))]
+            self.id_order = [i + 1 for i in range(0, len(questions))]
             random.shuffle(self.id_order)
         else:
-            self.id_order = [i+1 for i in range(0, len(questions))]
+            self.id_order = [i + 1 for i in range(0, len(questions))]
 
         layout = QFormLayout()
         headerlbl = QLabel("")
@@ -56,14 +56,14 @@ class RadioMatrix(QWidget):
         for h in range(0, len(answers) - 1):
             lbl = QLabel()
             lbl.setText(answers[h])
-            lbl.setAlignment(Qt.AlignHCenter)
+            lbl.setAlignment(Qt.AlignmentFlag.AlignHCenter)
             lbl.setObjectName("MatrixHeader")
             header_layout.addWidget(lbl)
             header_layout.addStretch()
         if len(answers) >= 1:
             lbl = QLabel()
             lbl.setText(answers[-1])
-            lbl.setAlignment(Qt.AlignHCenter)
+            lbl.setAlignment(Qt.AlignmentFlag.AlignHCenter)
             lbl.setObjectName("MatrixHeader")
             header_layout.addWidget(lbl)
         header_widget = QWidget()
@@ -73,10 +73,8 @@ class RadioMatrix(QWidget):
         self.buttongroups = []
         self.questions = []
         for quest in self.id_order:
-            bg_layout, bg = make_answers([""]*len(answers), self,
-                                         qid+"_{0:02d}".format(quest) if len(questions) >= 10 else qid+"_{}".format(quest),
-                                         self.name, start_answer_id, log=False)
-            quest_label = QLabel(questions[quest-1])
+            bg_layout, bg = make_answers([""] * len(answers), self, f'{qid}_{quest:02d}' if len(questions) >= 10 else f'{qid}_{quest}', self.name, start_answer_id, log=False)
+            quest_label = QLabel(questions[quest - 1])
             layout.addRow(quest_label, bg_layout)
             self.buttongroups.append(bg)
             self.questions.append(quest_label)
diff --git a/src/Slider.py b/src/Slider.py
index d79a0b2269ebda1aef767e8473351c0318c1ca01..a50c3a186352bb6e45dd478551bd82ca296234a1 100644
--- a/src/Slider.py
+++ b/src/Slider.py
@@ -5,10 +5,9 @@ position - a function that's not possible with QSlider.
 The functionality is adapted from: https://www.queryxchange.com/q/27_52689047/moving-qslider-to-mouse-click-position/
 """
 from math import ceil
-
-from PyQt5.QtCore import Qt, QPoint, pyqtSignal
-from PyQt5.QtGui import QPainter, QColor, QPen, QPaintEvent, QMouseEvent
-from PyQt5.QtWidgets import QSlider, QStyle, QStyleOptionSlider
+from PySide6.QtCore import Qt, Signal
+from PySide6.QtGui import QPainter, QColor, QPen
+from PySide6.QtWidgets import QSlider, QStyle, QStyleOptionSlider
 
 
 class Slider(QSlider):
@@ -38,8 +37,16 @@ class Slider(QSlider):
     strokewidth_disabled = None
     strokecolor_disabled = None
     moving = False
-    mushra_stopped = pyqtSignal()
+    mushra_stopped = Signal(str)
     moved = False
+    mouse_down = False
+    prev = None
+    _min = None
+    _max = None
+    start = None
+    step = None
+    sid = None
+    tick_dist = None
 
     def paintEvent(self, event):
         """
@@ -65,36 +72,33 @@ class Slider(QSlider):
         opt.initFrom(self)
         opt.orientation = self.orientation()
 
-        groove = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderGroove, self)
-        handle = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderHandle, self)
+        groove = self.style().subControlRect(QStyle.ComplexControl.CC_Slider, opt, QStyle.SubControl.SC_SliderGroove, self)
+        handle = self.style().subControlRect(QStyle.ComplexControl.CC_Slider, opt, QStyle.SubControl.SC_SliderHandle, self)
 
-        interval = self.tickInterval()
-        if self.tickPosition() != QSlider.NoTicks:
-            min_value = 0
-            max_value = int((self._max-self._min)/self.step) if self._max > self._min else - 1 * int((self._max-self._min)/self.step)
-            for i in range(0, max_value - min_value + 1, interval):
+        if self.tickPosition() != QSlider.TickPosition.NoTicks:
+            for i in range(0, self.maximum() - self.minimum() + 1, self.tickInterval()):
                 h = 10
                 magic_height = 4
-                if self.orientation() == Qt.Horizontal:
-                    x = round(i / (max_value - min_value) * self.width())
+                if self.orientation() == Qt.Orientation.Horizontal:
+                    x = round(i / (self.maximum() - self.minimum()) * self.width())
                     if x == 0:
                         x += ceil(0.5 * p.pen().width())
                         if p.pen().width() % 2 == 0:
                             x += 1
-                    elif x >= (self.width()):
+                    elif x >= self.width():
                         x = self.width() - ceil(0.5 * p.pen().width()) - 1
                     else:
                         x -= ceil(0.5 * p.pen().width())
-                    if (self.tickPosition() == QSlider.TicksBothSides) or (self.tickPosition() == QSlider.TicksAbove):
+                    if (self.tickPosition() == QSlider.TickPosition.TicksBothSides) or (self.tickPosition() == QSlider.TickPosition.TicksAbove):
                         y = groove.top() - ceil(0.5 * p.pen().width())
                         p.drawLine(x, y + h, x, y - magic_height)
-                    if (self.tickPosition() == QSlider.TicksBothSides) or (self.tickPosition() == QSlider.TicksBelow):
+                    if (self.tickPosition() == QSlider.TickPosition.TicksBothSides) or (self.tickPosition() == QSlider.TickPosition.TicksBelow):
                         y = groove.bottom()
                         if p.pen().width() > 1:
                             y += ceil(0.5 * p.pen().width())
                         p.drawLine(x, y + h, x, y - magic_height)
-                elif self.orientation() == Qt.Vertical:
-                    y = round(i / (max_value - min_value) * groove.height())
+                elif self.orientation() == Qt.Orientation.Vertical:
+                    y = round(i / (self.maximum() - self.minimum()) * groove.height())
                     if y == groove.height():  # lowest mark
                         y -= ceil(0.5 * p.pen().width()) - 1
                     elif y == 0:
@@ -103,12 +107,12 @@ class Slider(QSlider):
                             y += 1
                     else:
                         y -= ceil(0.5 * p.pen().width())
-                    if (self.tickPosition() == QSlider.TicksBothSides) or (self.tickPosition() == QSlider.TicksLeft):
+                    if (self.tickPosition() == QSlider.TickPosition.TicksBothSides) or (self.tickPosition() == QSlider.TickPosition.TicksLeft):
                         x = groove.left() + handle.width()
                         if p.pen().width() > 1:
                             x -= ceil(0.5 * p.pen().width())
                         p.drawLine(x, y, x - magic_height, y)
-                    if (self.tickPosition() == QSlider.TicksBothSides) or (self.tickPosition() == QSlider.TicksRight):
+                    if (self.tickPosition() == QSlider.TickPosition.TicksBothSides) or (self.tickPosition() == QSlider.TickPosition.TicksRight):
                         x = groove.right() - handle.width()
                         if p.pen().width() > 1:
                             x += ceil(0.5 * p.pen().width())
@@ -123,18 +127,16 @@ class Slider(QSlider):
         event : QMouseEvent
             event that occurred, only presses of the left mouse button are of relevance here
         """
-        if event.button() == Qt.LeftButton:
-            if self.orientation() == Qt.Horizontal:
+        if event.button() == Qt.MouseButton.LeftButton:
+            if self.orientation() == Qt.Orientation.Horizontal:
                 self.blockSignals(True)
-            val = self.pixel_pos_to_range_value(event.pos())
+            val = self.pixel_pos_to_range_value(event.position())
             self.moved = True
-            if self.value() != val:
+            self.mouse_down = True
+            if self.value() != val: # TODO?
                 self.setValue(val)
                 self.blockSignals(False)
-                # print("New val {} unblocked (press)".format(val))
-                self.valueChanged.emit(self.value())
-                self.mushra_stopped.emit()
-                if self.orientation() == Qt.Horizontal:
+                if self.orientation() == Qt.Orientation.Horizontal:
                     self.blockSignals(True)
 
     def mouseMoveEvent(self, event):
@@ -145,12 +147,13 @@ class Slider(QSlider):
         event : QMouseEvent
             event that occurred, only presses of the left mouse button are of relevance here
         """
-        if self.orientation() == Qt.Horizontal:
-            self.blockSignals(True)
-        val = self.pixel_pos_to_range_value(event.pos())
-        if self.value() != val:
-            self.setValue(val)
-            self.moving = True
+        if self.mouse_down:
+            if self.orientation() == Qt.Orientation.Horizontal:
+                self.blockSignals(True)
+            val = self.pixel_pos_to_range_value(event.position())
+            if self.value() != val:
+                self.setValue(val)
+                self.moving = True
 
     def mouseReleaseEvent(self, event):
         """End of move event, populate new value.
@@ -160,17 +163,18 @@ class Slider(QSlider):
         event : QMouseEvent
             event that occurred, only presses of the left mouse button are of relevance here
         """
-        if self.orientation() == Qt.Horizontal:
+        if self.orientation() == Qt.Orientation.Horizontal:
             self.blockSignals(True)
+        self.mouse_down = False
         if self.moving:
-            val = self.pixel_pos_to_range_value(event.pos())
+            val = self.pixel_pos_to_range_value(event.position())
             self.setValue(val)
             self.moving = False
             self.blockSignals(False)
-            # print("New val {} unblocked (move)".format(val))
-            self.valueChanged.emit(self.value())
-            self.mushra_stopped.emit()
-            if self.orientation() == Qt.Horizontal:
+            # print(f'New val {val} unblocked (move)')
+            self.valueChanged.emit(val)
+            self.mushra_stopped.emit(self.sid)
+            if self.orientation() == Qt.Orientation.Horizontal:
                 self.blockSignals(True)
 
     def keyPressEvent(self, event):
@@ -181,9 +185,9 @@ class Slider(QSlider):
         event : QKeyEvent
             event that occurred, only presses of the arrow keys are relevant
         """
-        if self.orientation() == Qt.Horizontal:
+        if self.orientation() == Qt.Orientation.Horizontal:
             self.blockSignals(True)
-        if event.key() in [Qt.Key_Up, Qt.Key_Down, Qt.Key_Left, Qt.Key_Right]:
+        if event.key() in [Qt.Key.Key_Up, Qt.Key.Key_Down, Qt.Key.Key_Left, Qt.Key.Key_Right]:
             self.prev = self.value()
             super(Slider, self).keyPressEvent(event)
 
@@ -195,16 +199,16 @@ class Slider(QSlider):
         event : QKeyEvent
             event that occurred, only presses of the arrow keys are relevant
         """
-        if self.orientation() == Qt.Horizontal:
+        if self.orientation() == Qt.Orientation.Horizontal:
             self.blockSignals(True)
-        if event.key() in [Qt.Key_Up, Qt.Key_Down, Qt.Key_Left, Qt.Key_Right]:
+        if event.key() in [Qt.Key.Key_Up, Qt.Key.Key_Down, Qt.Key.Key_Left, Qt.Key.Key_Right]:
             super(Slider, self).keyReleaseEvent(event)
             if self.value() != self.prev:
                 self.blockSignals(False)
-                # print("New val {} unblocked (key)".format(self.value()))
+                # print(f'New val {self.value()} unblocked (key)')
                 self.valueChanged.emit(self.value())
-                self.mushra_stopped.emit()
-                if self.orientation() == Qt.Horizontal:
+                self.mushra_stopped.emit(self.sid)
+                if self.orientation() == Qt.Orientation.Horizontal:
                     self.blockSignals(True)
 
     def value(self):
@@ -214,8 +218,15 @@ class Slider(QSlider):
         -------
         int or float : current handle position in the range
         """
-        value = round(self._min + super(Slider, self).value() * (self.step if self._min < self._max else -1*self.step), str(self.step)[::-1].find('.'))
-        return value if int(self.step) != float(self.step) else int(value)
+        if not self.invertedAppearance():
+            value = self.minimum() + self._min + super(Slider, self).value() * self.step
+            if int(self.step) != float(self.step):  # float step size
+                value = round(value, str(self.step)[::-1].find('.'))
+            return value if int(self.step) != float(self.step) else int(value)
+        else:
+            value = self._min + super(Slider, self).value() * self.step  # super(Slider, self).value() #TODO float?TODO TODO TODO FALSCH!!!
+            # print("new value", value)
+            return value if int(self.step) != float(self.step) else int(value)
 
     def get_moved(self):
         """ Return whether the slider has been touched by the user.
@@ -225,42 +236,7 @@ class Slider(QSlider):
         boolean - if the slider handle has been moved
         """
         return self.moved
-    '''
-    def setValue(self, value):
-        index = round((value - self._min) / self.step)
-        return super(Slider, self).setValue(index)
 
-    def value(self):
-        return self.index * self.step + self._min
-
-    @property
-    def index(self):
-        return super(Slider, self).value()
-
-    def setIndex(self, index):
-        return super(Slider, self).setValue(index)
-
-    def setMinimum(self, value):
-        self._min = value
-        self._range_adjusted()
-
-    def setMaximum(self, value):
-        self._max = value
-        self._range_adjusted()
-
-    def setInterval(self, value):
-        # To avoid division by zero
-        if not value:
-            raise ValueError('Interval of zero specified')
-        self.step = value
-        self._range_adjusted()
-
-    def _range_adjusted(self):
-        number_of_steps = int((self._max - self._min) / self.step)
-        print(number_of_steps, self._max, self._min, self.step)
-        super(Slider, self).setMaximum(max(number_of_steps, self._max))
-        print(self.minimum(), self.maximum(), self.value())
-    '''
     def pixel_pos_to_range_value(self, pos):
         """
         Helper to move the slider to the cursor independently of the OS and stylesheet.
@@ -277,10 +253,10 @@ class Slider(QSlider):
         """
         opt = QStyleOptionSlider()
         self.initStyleOption(opt)
-        gr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderGroove, self)
-        sr = self.style().subControlRect(QStyle.CC_Slider, opt, QStyle.SC_SliderHandle, self)
+        gr = self.style().subControlRect(QStyle.ComplexControl.CC_Slider, opt, QStyle.SubControl.SC_SliderGroove, self)
+        sr = self.style().subControlRect(QStyle.ComplexControl.CC_Slider, opt, QStyle.SubControl.SC_SliderHandle, self)
 
-        if self.orientation() == Qt.Horizontal:
+        if self.orientation() == Qt.Orientation.Horizontal:
             slider_length = sr.width()
             slider_min = gr.x()
             slider_max = gr.right() - slider_length + 1
@@ -289,11 +265,10 @@ class Slider(QSlider):
             slider_min = gr.y()
             slider_max = gr.bottom() - slider_length + 1
         pr = pos - sr.center() + sr.topLeft()
-        p = pr.x() if self.orientation() == Qt.Horizontal else pr.y()
-        return QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), p - slider_min,
-                                              slider_max - slider_min, opt.upsideDown)
+        p = pr.x() if self.orientation() == Qt.Orientation.Horizontal else pr.y()
+        return QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), p - slider_min, slider_max - slider_min, opt.upsideDown)
 
-    def prepare_slider(self, min_val, max_val, start, step=1, tickpos=QSlider.TicksBelow):
+    def prepare_slider(self, min_val, max_val, start, step=1, tick_interval=1, tickpos=QSlider.TickPosition.TicksBelow, sid=None):
         """
         Set all parameters of the slider at once, to reduce repeating bulky code in the main gui class.
 
@@ -307,23 +282,32 @@ class Slider(QSlider):
             default starting point of the slider, if outside of min_val and max_val, it will be set to the closest of them
         step :  int, default=1
             step size of slider
+        tick_interval :  int, default=1
+            distance between visible ticks of slider
         tickpos : QSlider.TickPosition, default=QSlider.TicksBelow
-            position of tickmarks (if any), see also PyQt5.QtWidgets.QSlider
+            position of tickmarks (if any), see also PySide6.QtWidgets.QSlider
         """
         self._min = min_val
         self._max = max_val
         self.step = step
         self.start = start
         self.prev = None
-        if self.orientation() == Qt.Horizontal:
+        if self.orientation() == Qt.Orientation.Horizontal:
             self.blockSignals(True)  # don't spam new values on move, click and release
-        self.setMinimum(0)
-        self.setMaximum(int((max_val-min_val)/self.step) if max_val > min_val else -1*int((max_val-min_val)/self.step))
-        self.setTickInterval(1)
+        if self._min > self._max:
+            self.setInvertedAppearance(True)
+            self.setMaximum(0)
+            self.setMinimum(int((max_val - min_val) / self.step))
+        else:
+            self.setMinimum(0)
+            self.setMaximum(int((max_val - min_val) / self.step))
+        self.setValue(round((self.start - self._min) / self.step))
+        self.setTickInterval(tick_interval)
+        # TODO self.tick_dist = int(tick_interval)
         self.setSingleStep(1)
-        self.setValue(round(abs((start-self._min)/step)))
         self.setTickPosition(tickpos)
-
+        self.sid = sid
+        
         if hasattr(self.parent(), "page_log"):  # awkward workaround to reference "Page"
             sheet = self.parent().parent().styleSheet()
             sheet = sheet[sheet.find("Slider::groove"):]
@@ -331,20 +315,20 @@ class Slider(QSlider):
             width = 1
             color = QColor("black")
             if sheet.find("border-width:") > -1:
-                width = sheet[sheet.find("border-width:")+len("border-width:"):sheet.find("px", sheet.find("border-width:"))].strip(" ")
+                width = sheet[sheet.find("border-width:") + len("border-width:"):sheet.find("px", sheet.find("border-width:"))].strip(" ")
             elif sheet.find("border:") > -1:
-                border = sheet[sheet.find("border:")+len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ")
+                border = sheet[sheet.find("border:") + len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ")
                 border = border.split(" ")
                 for entry in border:
                     if entry.find("px") > -1:
                         width = entry.strip(" px")
             if sheet.find("border-color:") > -1:
-                color = sheet[sheet.find("border-color:")+len("border-color:"):sheet.find(";", sheet.find("border-color:"))].strip(" ")
+                color = sheet[sheet.find("border-color:") + len("border-color:"):sheet.find(";", sheet.find("border-color:"))].strip(" ")
             elif sheet.find("border:") > -1:
-                border = sheet[sheet.find("border:")+len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ")
+                border = sheet[sheet.find("border:") + len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ")
                 border = border.split(" ")
                 for entry in border:
-                    if QColor.isValidColor(entry):
+                    if QColor.isValidColorName(entry):
                         color = entry
             self.strokewidth = int(width)
             self.strokecolor = QColor(color)
@@ -370,20 +354,19 @@ class Slider(QSlider):
                 border = sheet[sheet.find("border:") + len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ")
                 border = border.split(" ")
                 for entry in border:
-                    if QColor.isValidColor(entry):
+                    if QColor.isValidColorName(entry):
                         color_disabled = entry
             self.strokewidth_disabled = int(width_disabled)
             self.strokecolor_disabled = QColor(color_disabled)
 
         if self.objectName() != "":
             sheet = self.parent().parent().styleSheet()
-            sheet = sheet[sheet.find("Slider#{}::groove".format(self.objectName())):]
+            sheet = sheet[sheet.find(f'Slider#{self.objectName()}::groove'):]
             sheet = sheet[:sheet.find("}")]
             width = 1
             color = QColor("black")
             if sheet.find("border-width:") > -1:
-                width = sheet[sheet.find("border-width:") + len("border-width:"):sheet.find("px", sheet.find(
-                    "border-width:"))].strip(" ")
+                width = sheet[sheet.find("border-width:") + len("border-width:"):sheet.find("px", sheet.find("border-width:"))].strip(" ")
             elif sheet.find("border:") > -1:
                 border = sheet[sheet.find("border:") + len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ")
                 border = border.split(" ")
@@ -391,25 +374,23 @@ class Slider(QSlider):
                     if entry.find("px") > -1:
                         width = entry.strip(" px")
             if sheet.find("border-color:") > -1:
-                color = sheet[sheet.find("border-color:") + len("border-color:"):sheet.find(";", sheet.find(
-                    "border-color:"))].strip(" ")
+                color = sheet[sheet.find("border-color:") + len("border-color:"):sheet.find(";", sheet.find("border-color:"))].strip(" ")
             elif sheet.find("border:") > -1:
                 border = sheet[sheet.find("border:") + len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ")
                 border = border.split(" ")
                 for entry in border:
-                    if QColor.isValidColor(entry):
+                    if QColor.isValidColorName(entry):
                         color = entry
             self.strokewidth = int(width)
             self.strokecolor = QColor(color)
 
             sheet = self.parent().parent().styleSheet()
-            sheet = sheet[sheet.find("Slider#{}::groove:disabled".format(self.objectName())):]
+            sheet = sheet[sheet.find(f'Slider#{self.objectName()}::groove:disabled'):]
             sheet = sheet[:sheet.find("}")]
             width_disabled = self.strokewidth
             color_disabled = self.strokecolor
             if sheet.find("border-width:") > -1:
-                width_disabled = sheet[sheet.find("border-width:") + len("border-width:"):sheet.find("px", sheet.find(
-                    "border-width:"))].strip(" ")
+                width_disabled = sheet[sheet.find("border-width:") + len("border-width:"):sheet.find("px", sheet.find("border-width:"))].strip(" ")
             elif sheet.find("border:") > -1:
                 border = sheet[sheet.find("border:") + len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ")
                 border = border.split(" ")
@@ -417,13 +398,12 @@ class Slider(QSlider):
                     if entry.find("px") > -1:
                         width_disabled = entry.strip(" px")
             if sheet.find("border-color:") > -1:
-                color_disabled = sheet[sheet.find("border-color:") + len("border-color:"):sheet.find(";", sheet.find(
-                    "border-color:"))].strip(" ")
+                color_disabled = sheet[sheet.find("border-color:") + len("border-color:"):sheet.find(";", sheet.find("border-color:"))].strip(" ")
             elif sheet.find("border:") > -1:
                 border = sheet[sheet.find("border:") + len("border:"):sheet.find(";", sheet.find("border:"))].strip(" ")
                 border = border.split(" ")
                 for entry in border:
-                    if QColor.isValidColor(entry):
+                    if QColor.isValidColorName(entry):
                         color_disabled = entry
             self.strokewidth_disabled = int(width_disabled)
             self.strokecolor_disabled = QColor(color_disabled)
diff --git a/src/TextEdit.py b/src/TextEdit.py
index 89e5042b33a7bae153cceb2bab4948dfd758c46a..9f4ecd6e61bef57edc615cc1ac58c71058acd72f 100644
--- a/src/TextEdit.py
+++ b/src/TextEdit.py
@@ -3,9 +3,8 @@ A TextEdit editor that sends editingFinished events when the text was changed an
 Original version (PyQt4): https://gist.github.com/hahastudio/4345418
 """
 
-from PyQt5.QtCore import pyqtSignal, QObject
-from PyQt5.QtGui import QFocusEvent
-from PyQt5.QtWidgets import QTextEdit
+from PySide6.QtCore import Signal
+from PySide6.QtWidgets import QTextEdit
 
 
 # noinspection PyUnresolvedReferences
@@ -29,15 +28,15 @@ class TextEdit(QTextEdit):
     .. [1] https://gist.github.com/hahastudio/4345418
     """
 
-    editingFinished = pyqtSignal()
-    receivedFocus = pyqtSignal()
+    editingFinished = Signal()
+    receivedFocus = Signal()
 
-    def __init__(self, parent):
+    def __init__(self, parent=None):
         """
 
         Parameters
         ----------
-        parent : QObject
+        parent : QObject, opt
             widget/layout this widget is embedded in
         """
         super(TextEdit, self).__init__(parent)
diff --git a/src/Tree.py b/src/Tree.py
index 98354ec9425ae26338b87d9fd5e9b6ae1f68c59a..c5354bb1fa9f502c8a38a9bb0d146ba2ed8114cc 100644
--- a/src/Tree.py
+++ b/src/Tree.py
@@ -1,7 +1,7 @@
 """Customized QTreeWidget with drag&drop functionality according to the questionnaire structure."""
-from PyQt5.QtCore import Qt, pyqtSignal
-from PyQt5.QtGui import QDragMoveEvent, QDropEvent
-from PyQt5.QtWidgets import QTreeWidget, QAbstractItemView, QInputDialog, QLineEdit, QTreeWidgetItem
+from PySide6.QtCore import Qt, Signal
+from PySide6.QtGui import QDragMoveEvent
+from PySide6.QtWidgets import QTreeWidget, QAbstractItemView, QInputDialog, QLineEdit
 
 
 # noinspection PyUnresolvedReferences
@@ -17,8 +17,8 @@ class Tree(QTreeWidget):
     parent : QObject, optional
         widget/layout this widget is embedded in
     """
-    tree_changed = pyqtSignal()
-    error_message = pyqtSignal(str)
+    tree_changed = Signal()
+    error_message = Signal(str)
 
     def __init__(self, parent=None):
         """
@@ -35,7 +35,7 @@ class Tree(QTreeWidget):
         self.setDragEnabled(True)
         self.setDefaultDropAction(Qt.MoveAction)
 
-    def dragMoveEvent(self, event: QDragMoveEvent) -> None:
+    def dragMoveEvent(self, event):
         """Changed behaviour on dragging.
 
         Don't accept any drops from somewhere else.
@@ -45,11 +45,11 @@ class Tree(QTreeWidget):
         event : QDragMoveEvent
         """
         super().dragMoveEvent(event)
-        if self.dropIndicatorPosition() == self.OnViewport:
+        if self.dropIndicatorPosition() == QAbstractItemView.OnViewport:
             # do not accept drop on the viewport
             event.ignore()
 
-    def dropEvent(self, event) -> None:
+    def dropEvent(self, event):
         """Changed behaviour on drop, according to the questionnaire structure.
 
         This means: \n
@@ -63,13 +63,13 @@ class Tree(QTreeWidget):
         """
         source = self.indexFromItem(self.selectedItems()[0])
         if event.source() == self:
-            if self.dropIndicatorPosition() == self.OnViewport:
+            if self.dropIndicatorPosition() == QAbstractItemView.OnViewport:
                 event.ignore()
-            if self.dropIndicatorPosition() == self.OnItem:
-                tree_target_item = self.itemAt(event.pos())
+            if self.dropIndicatorPosition() == QAbstractItemView.OnItem:
+                tree_target_item = self.itemAt(event.position().toPoint())
                 target_children = []
-                for ch in range(self.itemAt(event.pos()).childCount()):
-                    target_children.append(self.itemAt(event.pos()).child(ch))
+                for ch in range(self.itemAt(event.position().toPoint()).childCount()):
+                    target_children.append(self.itemAt(event.position().toPoint()).child(ch))
                 if tree_target_item.parent() is None:  # something was dropped on root
                     if source.parent().data() == tree_target_item.text(0):
                         # root item only accepts pages
@@ -115,7 +115,7 @@ class Tree(QTreeWidget):
                 else:
                     event.ignore()
             else:  # move above/below item
-                tree_target_item = self.itemAt(event.pos())
+                tree_target_item = self.itemAt(event.position().toPoint())
                 if tree_target_item.parent() is None:
                     event.ignore()  # don't move anything above/below root
                 elif (tree_target_item.parent().parent() is None and source.parent().parent().data() is not None) or \
@@ -187,8 +187,7 @@ class Tree(QTreeWidget):
             ok : bool
                 True if renaming was executed successfully
         """
-        text, ok = QInputDialog.getText(self, "Rename question",
-                                        "Rename the moved question (the name already existed):", QLineEdit.Normal)
+        text, ok = QInputDialog.getText(self, "Rename question", "Rename the moved question (the name already existed):", QLineEdit.Normal)
         if not ok:
             return None, ok
         else:
diff --git a/src/Validator.py b/src/Validator.py
index e0cc6ed7a91e041a81654f944ebd722afcfa206b..0862b771700295e5fbb9bb33344b5ede2814698f 100644
--- a/src/Validator.py
+++ b/src/Validator.py
@@ -4,10 +4,9 @@ import ast
 import re
 from os import path
 
-from configobj import ConfigObj
-from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator
-from PyQt5.QtWidgets import QSizePolicy, QMessageBox
-from PyQt5.QtCore import QRegExp
+from PySide6.QtGui import QIntValidator, QDoubleValidator, QRegularExpressionValidator, QValidator
+from PySide6.QtWidgets import QSizePolicy, QMessageBox
+from PySide6.QtCore import QRegularExpression
 
 from src.MessageBox import ResizeMessageBox
 from src.tools import fields_per_type, player_buttons, policy_possibilities, randomize_options, image_positions, video_player
@@ -33,7 +32,7 @@ def validate_passwords(file, policy):
     elif policy[0] == "double":
         validator = QDoubleValidator(int(policy[1]), int(policy[2]), int(policy[3]))
     elif policy[0] == "regex":
-        validator = QRegExpValidator(QRegExp(policy[1]))
+        validator = QRegularExpressionValidator(QRegularExpression(policy[1]))
     else:
         # policy[0] == "None":
         return True
@@ -41,7 +40,7 @@ def validate_passwords(file, policy):
         passwords = f.read().splitlines()
     for password in passwords:
         res = validator.validate(password, 0)
-        if res[0] != 2:
+        if res[0] != QValidator.State.Acceptable:
             return False
     return True
 
@@ -126,130 +125,126 @@ def listify(structure, status=None, status_duration=None):
             if "label" in structure[page][quest].keys() and ("," in structure[page][quest]["label"] or
                                                              "[" in structure[page][quest]["label"] or
                                                              "]" in structure[page][quest]["label"] or
-                                                             type(structure[page][quest]["label"]) == list):
+                                                             isinstance(structure[page][quest]["label"], list)):
                 sublist = False
                 lblcpy = structure[page][quest]["label"]
                 labels = []
                 try:
-                    if type(lblcpy) == str:
+                    if isinstance(lblcpy, str):
                         if lblcpy[0] == "[" and lblcpy[1] == "[" and lblcpy[-1] == "]" and lblcpy[-2] == "]":
                             lblcpy = lblcpy.strip(' "')[1:-1]
                         elif lblcpy.count("[") == 1 and lblcpy.count("]") == 1 and lblcpy.count(",") == 0:
                             lblcpy = lblcpy.strip(' []"')
                         lblcpy = lblcpy.split(",")
-                    for t in range(0, len(lblcpy)):
-                        if type(lblcpy[t]) == str:
-                            if '[' in lblcpy[t]:  # t is list:
-                                if ('[' in lblcpy[t]) and (']' not in lblcpy[t]):
+                    for _, lblc in enumerate(lblcpy):
+                        if isinstance(lblc, str):
+                            if '[' in lblc:  # t is list:
+                                if ('[' in lblc) and (']' not in lblc):
                                     sublist = True
-                                if ',' not in lblcpy[t]:
-                                    labels.append([float(lblcpy[t].strip(" '][").strip('"'))])
+                                if ',' not in lblc:
+                                    labels.append([float(lblc.strip(" '][").strip('"'))])
                                 else:
-                                    if len(lblcpy[t].split(",")) == 2:
-                                        entry = lblcpy[t].split(",")
+                                    if len(lblc.split(",")) == 2:
+                                        entry = lblc.split(",")
                                         labels.append([float(entry[0].strip(" '[]").strip('"')), entry[1].strip(" '[]").strip('"')])
                                     else:
                                         labels[-1].append(float(entry.strip(" '[]").strip('"')))
                             elif sublist:
-                                if ']' in lblcpy[t]:
+                                if ']' in lblc:
                                     sublist = False
-                                    labels[-1].append(lblcpy[t].strip(" ]['").strip('"'))
+                                    labels[-1].append(lblc.strip(" ]['").strip('"'))
                                 else:
-                                    labels[-1].append(float(lblcpy[t]))
+                                    labels[-1].append(float(lblc))
                             elif not sublist:
-                                labels.append(lblcpy[t].strip(" '[]").strip('"'))
+                                labels.append(lblc.strip(" '[]").strip('"'))
                         else:
-                            if type(lblcpy[t]) == list or type(lblcpy[t]) == tuple:
-                                if len(lblcpy[t]) == 2:
-                                    labels.append([float(lblcpy[t][0]), lblcpy[t][1]])
+                            if isinstance(lblc, list) or isinstance(lblc, tuple):
+                                if len(lblc) == 2:
+                                    labels.append([float(lblc[0]), lblc[1]])
                                 else:
-                                    labels[-1].append(lblcpy[t])
+                                    labels[-1].append(lblc)
                     structure[page][quest]["label"] = labels
                 except (ValueError, SyntaxError) as e:
                     if status is not None:
-                        status.showMessage("Invalid value found in a 'label' field: {}".format(e), status_duration)
+                        status.showMessage(f'Invalid value found in a "label" field: {e}', status_duration)
 
             if "track" in structure[page][quest].keys() and ("," in structure[page][quest]["track"] or
                                                              "[" in structure[page][quest]["track"] or
                                                              "]" in structure[page][quest]["track"] or
-                                                             type(structure[page][quest]["track"]) == list):
+                                                             isinstance(structure[page][quest]["track"], list)):
                 sublist = False
                 trackscpy = structure[page][quest]["track"]
                 tracks = []
                 try:
-                    if type(trackscpy) == str:
+                    if isinstance(trackscpy, str):
                         if trackscpy[0] == "[" and trackscpy[-1] == "]":
                             trackscpy = trackscpy.strip(" []")
                         trackscpy = trackscpy.split(",")
-                    for t in range(0, len(trackscpy)):
-                        if type(trackscpy[t]) == str:
-                            if '[' in trackscpy[t]:  # t is list:
-                                if ('[' in trackscpy[t]) and (']' not in trackscpy[t]):
+                    for _, tcpy in enumerate(trackscpy):
+                        if isinstance(tcpy, str):
+                            if '[' in tcpy:  # t is list:
+                                if ('[' in tcpy) and (']' not in tcpy):
                                     sublist = True
-                                if ',' not in trackscpy[t]:
-                                    tracks.append([int(trackscpy[t].strip(" ']["))])
+                                if ',' not in tcpy:
+                                    tracks.append([int(tcpy.strip(" ']["))])
                                 else:
                                     tracks.append([])
-                                    for entry in trackscpy[t].split(","):
+                                    for entry in tcpy.split(","):
                                         tracks[-1].append(int(entry.strip(" '[]")))
                             elif sublist:
-                                if ']' in trackscpy[t]:
+                                if ']' in tcpy:
                                     sublist = False
-                                    tracks[-1].append(int(trackscpy[t].strip(" ]['")))
+                                    tracks[-1].append(int(tcpy.strip(" ]['")))
                                 else:
-                                    tracks[-1].append(int(trackscpy[t]))
+                                    tracks[-1].append(int(tcpy))
                             elif not sublist:
-                                tracks.append(int(trackscpy[t].strip(" '")))
+                                tracks.append(int(tcpy.strip(" '")))
                         else:
-                            if type(trackscpy[t]) == list:
+                            if isinstance(tcpy, list):
                                 tracks.append([])
-                                for s in range(len(trackscpy[t])):
-                                    tracks[-1].append(int(trackscpy[t][s]))
+                                for _, tcpys in enumerate(tcpy):
+                                    tracks[-1].append(int(tcpys))
                             else:
-                                tracks.append(trackscpy[t])
+                                tracks.append(tcpy)
                     structure[page][quest]["track"] = tracks
                 except (ValueError, SyntaxError) as e:
                     if status is not None:
-                        status.showMessage("Invalid value found in a 'track' field: {}".format(e), status_duration)
+                        status.showMessage(f'Invalid value found in a "track" field: {e}', status_duration)
             try:
                 if "answers" in structure[page][quest].keys():
                     if "," in structure[page][quest]["answers"]:
                         structure[page][quest]["answers"] = ast.literal_eval(structure[page][quest]["answers"])
-                    elif type(structure[page][quest]["answers"]) == str:
+                    elif isinstance(structure[page][quest]["answers"], str):
                         structure[page][quest]["answers"] = structure[page][quest]["answers"].strip("[] ")
                     else:  # list-like
                         for entry in range(len(structure[page][quest]["answers"])):
-                            if type(entry) == str:
-                                structure[page][quest]["answers"][entry] = structure[page][quest]["answers"][
-                                    entry].strip("[] ")
+                            if isinstance(entry, str):
+                                structure[page][quest]["answers"][entry] = structure[page][quest]["answers"][entry].strip("[] ")
                 if "button_texts" in structure[page][quest].keys():
                     if "," in structure[page][quest]["button_texts"]:
                         structure[page][quest]["button_texts"] = ast.literal_eval(
                             structure[page][quest]["button_texts"])
-                    elif type(structure[page][quest]["button_texts"]) == str:
+                    elif isinstance(structure[page][quest]["button_texts"], str):
                         structure[page][quest]["button_texts"] = structure[page][quest]["button_texts"].strip("[] ")
                     else:  # list-like
                         for entry in range(len(structure[page][quest]["button_texts"])):
-                            structure[page][quest]["button_texts"][entry] = structure[page][quest]["button_texts"][
-                                entry].strip("[] ")
+                            structure[page][quest]["button_texts"][entry] = structure[page][quest]["button_texts"][entry].strip("[] ")
                 if "header" in structure[page][quest].keys():
                     if "," in structure[page][quest]["header"]:
                         structure[page][quest]["header"] = ast.literal_eval(structure[page][quest]["header"])
-                    elif type(structure[page][quest]["header"]) == str:
+                    elif isinstance(structure[page][quest]["header"], str):
                         structure[page][quest]["header"] = structure[page][quest]["header"].strip("[] ")
                     else:  # list-like
                         for entry in range(len(structure[page][quest]["header"])):
-                            structure[page][quest]["header"][entry] = structure[page][quest]["header"][entry].strip(
-                                "[] ")
+                            structure[page][quest]["header"][entry] = structure[page][quest]["header"][entry].strip("[] ")
                 if "questions" in structure[page][quest].keys():
                     if "," in structure[page][quest]["questions"]:
                         structure[page][quest]["questions"] = ast.literal_eval(structure[page][quest]["questions"])
-                    elif type(structure[page][quest]["questions"]) == str:
+                    elif isinstance(structure[page][quest]["questions"], str):
                         structure[page][quest]["questions"] = structure[page][quest]["questions"].strip("[] ")
                     else:  # list-like
                         for entry in range(len(structure[page][quest]["questions"])):
-                            structure[page][quest]["questions"][entry] = structure[page][quest]["questions"][
-                                entry].strip("[] ")
+                            structure[page][quest]["questions"][entry] = structure[page][quest]["questions"][entry].strip("[] ")
             except (ValueError, SyntaxError):
                 if "answers" in structure[page][quest].keys() and "," in structure[page][quest]["answers"]:
                     structure[page][quest]["answers"] = string_to_list(structure[page][quest]["answers"])
@@ -316,7 +311,7 @@ def string_to_list(string):
         return result
 
 
-def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
+def validate_questionnaire(structure, suppress=False):
     """Check the questionnaire structure for duplicates in answer IDs.
 
     Parameters
@@ -369,7 +364,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                     raise ValueError
             except ValueError:
                 error_found = True
-                error_details.append("Invalid audio port, couldn't be converted to a number 0-65535.\n")
+                error_details.append("Invalid audio port, could not be converted to a number 0-65535.\n")
         elif "audio_ip" in structure.keys():
             warning_found = True
             warning_details.append("No audio_port found, but IP. Audio will be disabled.\n")
@@ -385,7 +380,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                     raise ValueError
             except ValueError:
                 error_found = True
-                error_details.append("Invalid audio receive port, couldn't be converted to a number 0-65535.\n")
+                error_details.append("Invalid audio receive port, could not be converted to a number 0-65535.\n")
 
     if "video_ip" in structure.keys():
         if structure["video_ip"] != "":
@@ -408,7 +403,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                     raise ValueError
             except ValueError:
                 error_found = True
-                error_details.append("Invalid video port, couldn't be converted to a number 0-65535.\n")
+                error_details.append("Invalid video port, could not be converted to a number 0-65535.\n")
         elif "video_ip" in structure.keys():
             warning_found = True
             warning_details.append("No video_port found, but IP. Video will be disabled.\n")
@@ -448,7 +443,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                     raise ValueError
             except ValueError:
                 error_found = True
-                error_details.append("Invalid pupil port, couldn't be converted to a number 0-65535.\n")
+                error_details.append("Invalid pupil port, could not be converted to a number 0-65535.\n")
         elif "pupil_ip" in structure.keys():
             warning_found = True
             warning_details.append("No pupil_port found, but IP. The connection to pupil will be disabled.\n")
@@ -477,7 +472,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                     raise ValueError
             except ValueError:
                 error_found = True
-                error_details.append("Invalid help port, couldn't be converted to a number 0-65535.\n")
+                error_details.append("Invalid help port, could not be converted to a number 0-65535.\n")
         elif "help_ip" in structure.keys():
             warning_found = True
             warning_details.append("No help_port found, but IP. Calling help will be disabled.\n")
@@ -519,7 +514,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                     raise ValueError
             except ValueError:
                 error_found = True
-                error_details.append("Invalid global_osc_send_port, couldn't be converted to a number 0-65535.\n")
+                error_details.append("Invalid global_osc_send_port, could not be converted to a number 0-65535.\n")
         elif "global_osc_ip" in structure.keys():
             warning_found = True
             warning_details.append("No global_osc_send_port found, but IP. Sending over global will be disabled.\n")
@@ -535,7 +530,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                     raise ValueError
             except ValueError:
                 error_found = True
-                error_details.append("Invalid global_osc_recv_port, couldn't be converted to a number 0-65535.\n")
+                error_details.append("Invalid global_osc_recv_port, could not be converted to a number 0-65535.\n")
         elif "global_osc_ip" in structure.keys():
             warning_found = True
             warning_details.append("No global_osc_recv_port found, but IP. Receiving over global will be disabled.\n")
@@ -564,13 +559,11 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
             warning_found = True
             warning_details.append("Text for forward and backward button are the same.\n")
 
-    if "send_text" in structure.keys() and "forward_text" in structure.keys() and structure["send_text"] == structure[
-        "forward_text"]:
+    if "send_text" in structure.keys() and "forward_text" in structure.keys() and structure["send_text"] == structure["forward_text"]:
         warning_found = True
         warning_details.append("Text for forward and send button are the same.\n")
 
-    if "answer_pos" in structure.keys() and "answer_neg" in structure.keys() and structure["answer_pos"] == structure[
-        "answer_neg"]:
+    if "answer_pos" in structure.keys() and "answer_neg" in structure.keys() and structure["answer_pos"] == structure["answer_neg"]:
         warning_found = True
         warning_details.append("Text for positive and negative answer are the same.\n")
 
@@ -641,7 +634,7 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
     for page in structure.sections:
         if not structure[page].sections:
             warning_found = True
-            warning_details.append("There are no questions on page {}.\n".format(page))
+            warning_details.append(f'There are no questions on page {page}.\n')
 
         if "pupil_on_next" in structure[page].keys():
             if structure[page]["pupil_on_next"] == '' or structure[page]["pupil_on_next"] == 'None':
@@ -651,72 +644,59 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                 warning_found = True
                 warning_details.append("Incomplete connection to pupil given. The connection to pupil will be disabled.\n")
 
-        if "randomgroup" in structure[page].keys() and ("randomization" not in structure.keys() or \
-            ("randomization" in structure.keys() and structure["randomization"] == "None")):
+        if "randomgroup" in structure[page].keys() and ("randomization" not in structure.keys() or ("randomization" in structure.keys() and structure["randomization"] == "None")):
             error_found = True
             error_details.append("Using randomgroup, but no randomization option was chosen.\n")
 
         for quest in structure[page].sections:
             if structure[page][quest] == {}:
                 warning_found = True
-                warning_details.append("There are no attributes for question '{}' on page '{}'.\n".format(quest, page))
+                warning_details.append(f'There are no attributes for question "{quest}" on page "{page}".\n')
 
             if "id" in structure[page][quest].keys():
                 if structure[page][quest]["id"] == "":
                     error_found = True
-                    error_details.append("No ID was given for question '{}' on page '{}'.\n".format(quest, page))
-                elif structure[page][quest]["id"] not in ids.keys():
+                    error_details.append(f'No ID was given for question "{quest}" on page "{page}".\n')
+                elif structure[page][quest]["id"] not in ids:
                     ids[structure[page][quest]["id"]] = (page, quest)
                 else:
                     error_found = True
                     error_details.append(
-                        "ID '{}' already used in question '{}' on page '{}'. Found again in question '{}' on page '{}'.\n".format(
-                            structure[page][quest]["id"], ids[structure[page][quest]["id"]][1],
-                            ids[structure[page][quest]["id"]][0], quest, page))
-            elif "id" not in structure[page][quest].keys() and "type" in structure[page][quest].keys() and \
-                    "id" in fields_per_type[structure[page][quest]["type"]][0].keys():
+                        f'ID "{structure[page][quest]["id"]}" already used in question "{ids[structure[page][quest]["id"]][1]}" on page "{ids[structure[page][quest]["id"]][0]}". Found again in question "{quest}" on page "{page}".\n')
+            elif "id" not in structure[page][quest].keys() and "type" in structure[page][quest].keys() and "id" in fields_per_type[structure[page][quest]["type"]][0].keys():
                 error_found = True
-                error_details.append("No ID was given for question '{}' on page '{}'.\n".format(quest, page))
+                error_details.append(f'No ID was given for question "{quest}" on page "{page}".\n')
 
             if "x" in structure[page][quest].keys():
                 try:
                     _ = structure[page][quest].as_bool("x")
                 except ValueError:
                     error_found = True
-                    error_details.append(
-                        "No valid value found for 'x' for question '{}' on page '{}'.\n".format(quest, page))
-                    structure[page][quest][
-                        "x"] = False  # This happens so the rest of the routine  where x is referenced doesn't have to catch errors
-            elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "ABX" and \
-                    "x" not in structure[page][quest].keys():
+                    error_details.append(f'No valid value found for "x" for question "{quest}" on page "{page}".\n')
+                    structure[page][quest]["x"] = False  # This happens so the rest of the routine  where x is referenced does not have to catch errors
+            elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "ABX" and "x" not in structure[page][quest].keys():
                 structure[page][quest]["x"] = False
                 warning_found = True
-                warning_details.append(
-                    "No option for 'x' found for question '{}' on page '{}', using False as default value.\n".format(quest, page))
+                warning_details.append(f'No option for "x" found for question "{quest}" on page "{page}", using False as default value.\n')
 
             if "play_once" in structure[page][quest].keys():
                 try:
                     _ = structure[page][quest].as_bool("play_once")
                 except ValueError:
                     error_found = True
-                    error_details.append(
-                        "No valid value found for 'play_once' for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'No valid value found for "play_once" for question "{quest}" on page "{page}".\n')
                     structure[page][quest]["play_once"] = False
-            elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Player" and \
-                    "play_once" not in structure[page][quest].keys():
+            elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Player" and "play_once" not in structure[page][quest].keys():
                 structure[page][quest]["play_once"] = False
                 warning_found = True
-                warning_details.append(
-                    "No option for 'play_once' found for question '{}' on page '{}', using False by default.\n".format(
-                        quest, page))
+                warning_details.append(f'No option for "play_once" found for question "{quest}" on page "{page}", using False by default.\n')
 
             if "required" in structure[page][quest].keys():
                 try:
                     _ = structure[page][quest].as_bool("required")
                 except ValueError:
                     error_found = True
-                    error_details.append(
-                        "No valid value found for 'required' for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'No valid value found for "required" for question "{quest}" on page "{page}".\n')
                     structure[page][quest]["required"] = False  # default value
 
             if "labelled" in structure[page][quest].keys():
@@ -724,205 +704,154 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                     _ = structure[page][quest].as_bool("labelled")
                 except ValueError:
                     error_found = True
-                    error_details.append(
-                        "No valid value found for 'labelled' for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'No valid value found for "labelled" for question "{quest}" on page "{page}".\n')
                     structure[page][quest]["labelled"] = False  # default value
-            elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and \
-                    "labelled" not in structure[page][quest].keys():
+            elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and "labelled" not in structure[page][quest].keys():
                 structure[page][quest]["labelled"] = False
                 warning_found = True
-                warning_details.append(
-                    "No option for 'labelled' found for question '{}' on page '{}', setting it to False.\n".format(
-                        quest, page))
+                warning_details.append(f'No option for "labelled" found for question "{quest}" on page "{page}", setting it to False.\n')
 
             if "question_above" in structure[page][quest].keys():
                 try:
                     _ = structure[page][quest].as_bool("question_above")
                 except ValueError:
                     error_found = True
-                    error_details.append(
-                        "No valid value found for 'question_above' for question '{}' on page '{}'.\n".format(quest,
-                                                                                                             page))
+                    error_details.append(f'No valid value found for "question_above" for question "{quest}" on page "{page}".\n')
                     structure[page][quest]["question_above"] = False  # default value
 
             if "text" in structure[page][quest].keys() and structure[page][quest]["text"] == "":
                 warning_found = True
-                warning_details.append("No text was given for question '{}' on page '{}'.\n".format(quest, page))
+                warning_details.append(f'No text was given for question "{quest}" on page "{page}".\n')
             elif "text" not in structure[page][quest].keys() and "type" in structure[page][quest].keys() and \
                     "text" in fields_per_type[structure[page][quest]["type"]][0].keys():
                 structure[page][quest]["text"] = ""
                 warning_found = True
-                warning_details.append("No text was given for question '{}' on page '{}'.\n".format(quest, page))
+                warning_details.append(f'No text was given for question "{quest}" on page "{page}".\n')
 
             if "answers" in structure[page][quest].keys():
-                if structure[page][quest]["answers"] == "" and ("type" not in structure[page][quest].keys() or
-                                                                ("type" in structure[page][quest].keys() and not structure[page][quest]["type"] == "ABX")):
+                if structure[page][quest]["answers"] == "" and ("type" not in structure[page][quest].keys() or ("type" in structure[page][quest].keys() and not structure[page][quest]["type"] == "ABX")):
                     warning_found = True
-                    warning_details.append(
-                        "No answer possibilities were given for question '{}' on page '{}'.\n".format(quest, page))
+                    warning_details.append(f'No answer possibilities were given for question "{quest}" on page "{page}".\n')
                 if "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "ABX":
-                    if ((type(structure[page][quest]["answers"]) != list and type(
-                            structure[page][quest]["answers"]) != tuple) and structure[page][quest]["answers"] != "") or \
-                            ((type(structure[page][quest]["answers"]) == list or type(
-                                structure[page][quest]["answers"]) == tuple) and len(
-                                structure[page][quest]["answers"]) != 2):
+                    if ((not isinstance(structure[page][quest]["answers"], list) and not isinstance(structure[page][quest]["answers"], tuple)) and
+                        structure[page][quest]["answers"] != "") or \
+                            (isinstance(structure[page][quest]["answers"], (list, tuple)) and len(structure[page][quest]["answers"]) != 2):
                         error_found = True
-                        error_details.append(
-                            "Please give two answer options for the ABX type question '{}' on page '{}' or leave this field empty.\n".format(
-                                quest, page))
+                        error_details.append(f'Please give two answer options for the ABX type question "{quest}" on page "{page}" or leave this field empty.\n')
                 elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "AFC":
-                    if ((type(structure[page][quest]["answers"]) != list and type(
-                            structure[page][quest]["answers"]) != tuple) and structure[page][quest]["answers"] != "") or \
-                            ((type(structure[page][quest]["answers"]) == list or type(
-                                structure[page][quest]["answers"]) == tuple) and len(
-                                structure[page][quest]["answers"]) != structure[page][quest].as_int(
-                                "number_of_choices")):
+                    if ((not isinstance(structure[page][quest]["answers"], list) and not isinstance(structure[page][quest]["answers"], tuple)) and structure[page][quest]["answers"] != "") or (isinstance(structure[page][quest]["answers"], (list, tuple)) and len(structure[page][quest]["answers"]) != structure[page][quest].as_int("number_of_choices")):
                         error_found = True
-                        error_details.append(
-                            "Please give as many answer options for the AFC type question '{}' as number_of_choices on page '{}' or leave this field empty.\n".format(
-                                quest, page))
+                        error_details.append(f'Please give as many answer options for the AFC type question "{quest}" as number_of_choices on page "{page}" or leave this field empty.\n')
             elif "type" in structure[page][quest].keys() and \
                     (structure[page][quest]["type"] == "Radio" or structure[page][quest]["type"] == "Check" or
                      structure[page][quest]["type"] == "Matrix") and "answers" not in structure[page][quest].keys():
                 structure[page][quest]["answers"] = ""
                 warning_found = True
-                warning_details.append(
-                    "No answer possibilities were given for question '{}' on page '{}'.\n".format(quest, page))
+                warning_details.append(f'No answer possibilities were given for question "{quest}" on page "{page}".\n')
 
             if "start_answer_id" in structure[page][quest].keys():
                 try:
                     int(structure[page][quest]["start_answer_id"])
                     if int(structure[page][quest]["start_answer_id"]) < 0:
                         error_found = True
-                        error_details.append(
-                            "The start answer ID in question '{}' on page '{}' can't have a negative value.\n".format(
-                                quest, page))
+                        error_details.append(f'The start answer ID in question "{quest}" on page "{page}" can not have a negative value.\n')
                 except ValueError:
                     error_found = True
-                    error_details.append(
-                        "The start answer ID in question '{}' on page '{}' couldn't be interpreted as an integer.\n".format(
-                            quest, page))
+                    error_details.append(f'The start answer ID in question "{quest}" on page "{page}" could not be interpreted as an integer.\n')
 
             if "min" in structure[page][quest].keys():
                 if structure[page][quest]["min"] == "":
                     error_found = True
-                    error_details.append(
-                        "No minimum value was given for the slider in question '{}' on page '{}'.\n".format(quest,
-                                                                                                            page))
+                    error_details.append(f'No minimum value was given for the slider in question "{quest}" on page "{page}".\n')
                 else:
                     try:
                         float(structure[page][quest]["min"])
                     except ValueError:
                         error_found = True
-                        error_details.append(
-                            "The minimum value found for the slider in question '{}' on page '{}' couldn't be interpreted as a number.\n".format(
-                                quest, page))
-            elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and \
-                    "min" not in structure[page][quest].keys():
+                        error_details.append(f'The minimum value found for the slider in question "{quest}" on page "{page}" could not be interpreted as a number.\n')
+            elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and "min" not in structure[page][quest].keys():
                 error_found = True
-                error_details.append(
-                    "No minimum value was given for the slider in question '{}' on page '{}'.\n".format(quest, page))
+                error_details.append(f'No minimum value was given for the slider in question "{quest}" on page "{page}".\n')
 
             if "max" in structure[page][quest].keys():
                 if structure[page][quest]["max"] == "":
                     error_found = True
-                    error_details.append(
-                        "No maximum value was given for the slider in question '{}' on page '{}'.\n".format(quest,
-                                                                                                            page))
+                    error_details.append(f'No maximum value was given for the slider in question "{quest}" on page "{page}".\n')
                 else:
                     try:
                         float(structure[page][quest]["max"])
                     except ValueError:
                         error_found = True
-                        error_details.append(
-                            "The maximum value found for the slider in question '{}' on page '{}' couldn't be interpreted as a number.\n".format(
-                                quest, page))
+                        error_details.append(f'The maximum value found for the slider in question "{quest}" on page "{page}" could not be interpreted as a number.\n')
                 try:
                     if "min" in structure[page][quest].keys() and round(float(structure[page][quest]["max"]) - float(structure[page][quest]["min"]), 3) == 0.0:
                         error_found = True
-                        error_details.append(
-                            "Maximum and Minimum value for the slider in question '{}' on page '{}' are the same.\n".format(
-                                quest, page))
+                        error_details.append(f'Maximum and Minimum value for the slider in question "{quest}" on page "{page}" are the same.\n')
                 except ValueError:
                     pass
             elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and \
                     "max" not in structure[page][quest].keys():
                 error_found = True
-                error_details.append(
-                    "No maximum value was given for the slider in question '{}' on page '{}'.\n".format(quest, page))
+                error_details.append(f'"No maximum value was given for the slider in question "{quest}" on page "{page}".\n')
 
             if "start" in structure[page][quest].keys():
                 if structure[page][quest]["start"] == "":
                     error_found = True
-                    error_details.append(
-                        "No starting value was given for the slider in question '{}' on page '{}'.\n".format(quest,
-                                                                                                             page))
+                    error_details.append(f'No starting value was given for the slider in question "{quest}" on page "{page}".\n')
                 else:
                     try:
                         float(structure[page][quest]["start"])
                         if "min" in structure[page][quest].keys() and "max" in structure[page][quest].keys():
-                            if float(structure[page][quest]["start"]) < float(structure[page][quest]["min"]) < float(structure[page][quest]["max"]) or \
-                                    float(structure[page][quest]["start"]) > float(structure[page][quest]["min"]) > float(structure[page][quest]["max"]):
-                                structure[page][quest]["start"] = float(structure[page][quest]["min"])
-                            elif float(structure[page][quest]["start"]) > float(structure[page][quest]["max"]) < float(structure[page][quest]["min"]) or \
-                                    float(structure[page][quest]["start"]) < float(structure[page][quest]["max"]) < float(structure[page][quest]["min"]):
-                                structure[page][quest]["start"] = float(structure[page][quest]["max"])
+                            if float(structure[page][quest]["min"]) < float(structure[page][quest]["max"]):
+                                if float(structure[page][quest]["start"]) < float(structure[page][quest]["min"]):
+                                    structure[page][quest]["start"] = float(structure[page][quest]["min"]) if float(structure[page][quest]["min"]) != int(structure[page][quest]["min"]) or float(structure[page][quest]["step"]) != int(structure[page][quest]["step"]) else int(structure[page][quest]["min"])
+                                elif float(structure[page][quest]["start"]) > float(structure[page][quest]["max"]):
+                                    structure[page][quest]["start"] = float(structure[page][quest]["max"]) if float(structure[page][quest]["max"]) != int(structure[page][quest]["max"]) or float(structure[page][quest]["step"]) != int(structure[page][quest]["step"]) else int(structure[page][quest]["max"])
+                            else: # decreasing numbers
+                                if float(structure[page][quest]["start"]) > float(structure[page][quest]["min"]):
+                                    structure[page][quest]["start"] = float(structure[page][quest]["min"]) if float(structure[page][quest]["min"]) != int(structure[page][quest]["min"]) or float(structure[page][quest]["step"]) != int(structure[page][quest]["step"]) else int(structure[page][quest]["min"])
+                                elif float(structure[page][quest]["start"]) < float(structure[page][quest]["max"]):
+                                    structure[page][quest]["start"] = float(structure[page][quest]["max"]) if float(structure[page][quest]["max"]) != int(structure[page][quest]["max"]) or float(structure[page][quest]["step"]) != int(structure[page][quest]["step"]) else int(structure[page][quest]["max"])
                     except ValueError:
                         error_found = True
-                        error_details.append(
-                            "The starting value found for the slider in question '{}' on page '{}' couldn't be interpreted as a number.\n".format(
-                                quest, page))
+                        error_details.append(f'The starting value found for the slider in question "{quest}" on page "{page}" could not be interpreted as a number.\n')
             elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and \
                     "start" not in structure[page][quest].keys():
                 error_found = True
-                error_details.append(
-                    "No starting value was given for the slider in question '{}' on page '{}'.\n".format(quest, page))
+                error_details.append(f'No starting value was given for the slider in question "{quest}" on page "{page}".\n')
 
             if "step" in structure[page][quest].keys():
                 if structure[page][quest]["step"] == "":
                     error_found = True
-                    error_details.append(
-                        "No step value was given for the slider in question '{}' on page '{}'.\n".format(quest,
-                                                                                                            page))
+                    error_details.append(f'No step value was given for the slider in question "{quest}" on page "{page}".\n')
                 else:
                     try:
                         if float(structure[page][quest]["step"]) <= 0:
                             error_found = True
-                            error_details.append(
-                                "The step value found for the slider in question '{}' on page '{}' needs to be bigger than 0.\n".format(
-                                    quest, page))
+                            error_details.append(f'The step value found for the slider in question "{quest}" on page "{page}" needs to be bigger than 0.\n')
                     except ValueError:
                         error_found = True
-                        error_details.append(
-                            "The step value found for the slider in question '{}' on page '{}' couldn't be interpreted as a number.\n".format(
-                                quest, page))
+                        error_details.append(f'The step value found for the slider in question "{quest}" on page "{page}" could not be interpreted as a number.\n')
                 try:
                     if "min" in structure[page][quest].keys() and "max" in structure[page][quest].keys() \
                             and abs(float(structure[page][quest]["max"]) - float(structure[page][quest]["min"])) < float(structure[page][quest]["step"]):
                         error_found = True
-                        error_details.append(
-                            "The step value for the slider in question '{}' on page '{}' is bigger than the range.\n".format(
-                                quest, page))
+                        error_details.append(f'The step value for the slider in question "{quest}" on page "{page}" is bigger than the range.\n')
                 except ValueError:
                     pass
-            elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and \
-                    "step" not in structure[page][quest].keys():
+            elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Slider" and "step" not in structure[page][quest].keys():
                 error_found = True
-                error_details.append(
-                    "No step value was given for the slider in question '{}' on page '{}'.\n".format(quest, page))
+                error_details.append(f'No step value was given for the slider in question "{quest}" on page "{page}".\n')
 
             if "label" in structure[page][quest].keys() and "labelled" in structure[page][quest].keys() and \
                     structure[page][quest].as_bool("labelled"):
-                if type(structure[page][quest]["label"][0]) != list and type(structure[page][quest]["label"][0]) != tuple:
-                    if len(structure[page][quest]["label"]) != (float(structure[page][quest]["max"]) - float(
-                            structure[page][quest]["min"])) / float(structure[page][quest]["step"]) + 1:
+                if not isinstance(structure[page][quest]["label"][0], list) and not isinstance(structure[page][quest]["label"][0], tuple):
+                    if len(structure[page][quest]["label"]) != (float(structure[page][quest]["max"]) - float(structure[page][quest]["min"])) / float(structure[page][quest]["step"]) + 1:
                         error_found = True
-                        error_details.append(
-                            "The number of given labels doesn't match the number of ticks for question '{}' on page '{}'.\n".format(
-                                quest, page))
+                        error_details.append(f'The number of given labels does not match the number of ticks for question "{quest}" on page "{page}".\n')
                 elif len(structure[page][quest]["label"][0]) != 2:
                     error_found = True
-                    error_details.append("No valid format for labels for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'No valid format for labels for question "{quest}" on page "{page}".\n')
                 else:  # list / tuple of single pairs
                     tick = []
                     try:
@@ -931,42 +860,38 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                             if not (float(structure[page][quest]["max"]) <= float(pair[0]) <= float(structure[page][quest]["min"]) or
                                     float(structure[page][quest]["max"]) >= float(pair[0]) >= float(structure[page][quest]["min"])):
                                 error_found = True
-                                error_details.append("Tick value outside of slider range found for question '{}' on page '{}'.\n".format(quest, page))
+                                error_details.append(f'Tick value outside of slider range found for question "{quest}" on page "{page}".\n')
                         if len(tick) != len(set(tick)):
                             error_found = True
-                            error_details.append("Double definition of tick labels found for question '{}' on page '{}'.\n".format(quest, page))
+                            error_details.append(f'Double definition of tick labels found for question "{quest}" on page "{page}".\n')
                     except ValueError:
                         error_found = True
-                        error_details.append(
-                            "A label tick for the slider in question '{}' on page '{}' couldn't be interpreted as a number.\n".format(
-                                quest, page))
+                        error_details.append(f'A label tick for the slider in question "{quest}" on page "{page}" could not be interpreted as a number.\n')
 
             if "policy" in structure[page][quest].keys():
                 if structure[page][quest]["policy"] == "None" or structure[page][quest]["policy"] == "[None]":
                     structure[page][quest]["policy"] = ["None"]
-                if (type(structure[page][quest]["policy"]) == str and structure[page][quest]["policy"] not in policy_possibilities) or \
-                        (type(structure[page][quest]["policy"]) == list and structure[page][quest]["policy"][0] not in policy_possibilities):
+                if (isinstance(structure[page][quest]["policy"], str) and structure[page][quest]["policy"] not in policy_possibilities) or \
+                        (isinstance(structure[page][quest]["policy"], list) and structure[page][quest]["policy"][0] not in policy_possibilities):
                     error_found = True
-                    error_details.append("Invalid policy type in question '{}' on page '{}'.\n".format(quest, page))
-                if (type(structure[page][quest]["policy"]) == str and structure[page][quest]["policy"] == "int") or \
-                        (type(structure[page][quest]["policy"]) == list and structure[page][quest]["policy"][0] == 'int' and len(structure[page][quest]["policy"]) != 3):
+                    error_details.append(f'Invalid policy type in question "{quest}" on page "{page}".\n')
+                if (isinstance(structure[page][quest]["policy"], str) and structure[page][quest]["policy"] == "int") or \
+                        (isinstance(structure[page][quest]["policy"], list) and structure[page][quest]["policy"][0] == 'int' and len(structure[page][quest]["policy"]) != 3):
                     error_found = True
-                    error_details.append("Policy type 'int' takes two arguments, a different amount was given in question '{}' on page '{}'.\n".format(quest, page))
-                elif (type(structure[page][quest]["policy"]) == str and structure[page][quest]["policy"] == "double") or \
-                        (type(structure[page][quest]["policy"]) == list and structure[page][quest]["policy"][0] == 'double' and len(structure[page][quest]["policy"]) != 4):
+                    error_details.append(f'Policy type "int" takes two arguments, a different amount was given in question "{quest}" on page "{page}".\n')
+                elif (isinstance(structure[page][quest]["policy"], str) and structure[page][quest]["policy"] == "double") or \
+                        (isinstance(structure[page][quest]["policy"], list) and structure[page][quest]["policy"][0] == 'double' and len(structure[page][quest]["policy"]) != 4):
                     error_found = True
-                    error_details.append("Policy type 'double' takes three arguments, a different amount was given in question '{}' on page '{}'.\n".format(quest, page))
-                elif (type(structure[page][quest]["policy"]) == str and structure[page][quest]["policy"] == "regex") or \
-                        (type(structure[page][quest]["policy"]) == list and structure[page][quest]["policy"][0] == 'regex' and len(structure[page][quest]["policy"]) != 2):
+                    error_details.append(f'Policy type "double" takes three arguments, a different amount was given in question "{quest}" on page "{page}".\n')
+                elif (isinstance(structure[page][quest]["policy"], str) and structure[page][quest]["policy"] == "regex") or \
+                        (isinstance(structure[page][quest]["policy"], list) and structure[page][quest]["policy"][0] == 'regex' and len(structure[page][quest]["policy"]) != 2):
                     error_found = True
-                    error_details.append("Policy type 'regex' takes one argument, a different amount was given in question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'Policy type "regex" takes one argument, a different amount was given in question "{quest}" on page "{page}".\n')
 
                 if (structure[page][quest]["policy"][0] == "int") or (structure[page][quest]["policy"][0] == "double"):
                     if structure[page][quest]["policy"][1] == "":
                         error_found = True
-                        error_details.append(
-                            "No minimum value was given for the policy in question '{}' on page '{}'.\n".format(quest,
-                                                                                                                page))
+                        error_details.append(f'No minimum value was given for the policy in question "{quest}" on page "{page}".\n"')
                     else:
                         try:
                             if structure[page][quest]["policy"][0] == "int":
@@ -975,14 +900,10 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                                 float(structure[page][quest]["policy"][1])
                         except ValueError:
                             error_found = True
-                            error_details.append(
-                                "Minimum value given for the policy in question '{}' on page '{}' couldn't be converted to a valid number.\n".format(
-                                    quest, page))
+                            error_details.append(f'Minimum value given for the policy in question "{quest}" on page "{page}" could not be converted to a valid number.\n')
                     if structure[page][quest]["policy"][2] == "":
                         error_found = True
-                        error_details.append(
-                            "No maximum value was given for the policy in question '{}' on page '{}'.\n".format(quest,
-                                                                                                                page))
+                        error_details.append(f'No maximum value was given for the policy in question "{quest}" on page "{page}".\n')
                     else:
                         try:
                             if structure[page][quest]["policy"][0] == "int":
@@ -991,279 +912,206 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                                 float(structure[page][quest]["policy"][2])
                         except ValueError:
                             error_found = True
-                            error_details.append(
-                                "Maximum value given for the policy in question '{}' on page '{}' couldn't be converted to a valid number.\n".format(
-                                    quest, page))
+                            error_details.append(f'Maximum value given for the policy in question "{quest}" on page "{page}" could not be converted to a valid number.\n')
                 if structure[page][quest]["policy"][0] == "double":
                     if structure[page][quest]["policy"][3] == "":
                         error_found = True
-                        error_details.append(
-                            "No number of decimals was given for the policy in question '{}' on page '{}'.\n".format(
-                                quest, page))
+                        error_details.append(f'No number of decimals was given for the policy in question "{quest}" on page "{page}".\n')
                     else:
                         try:
                             int(structure[page][quest]["policy"][3])
                         except ValueError:
                             error_found = True
-                            error_details.append(
-                                "Number of decimals given for the policy in question '{}' on page '{}' couldn't be converted to a number.\n".format(
-                                    quest, page))
+                            error_details.append(f'Number of decimals given for the policy in question "{quest}" on page "{page}" could not be converted to a number.\n')
                 if structure[page][quest]["policy"][0] == "regex":
                     if structure[page][quest]["policy"][1] == "":
                         error_found = True
-                        error_details.append(
-                            "No regex was given for the policy in question '{}' on page '{}'.\n".format(quest, page))
+                        error_details.append(f'No regex was given for the policy in question "{quest}" on page "{page}".\n')
                     else:
                         try:
                             re.compile(str(structure[page][quest]["policy"][1]))
                         except re.error:
                             error_found = True
-                            error_details.append(
-                                "An invalid regex was given for the policy in question '{}' on page '{}'.\n".format(
-                                    quest, page))
+                            error_details.append(f'An invalid regex was given for the policy in question "{quest}" on page "{page}".\n')
 
             if "start_cue" in structure[page][quest].keys():
                 if structure[page][quest]["start_cue"] == "":
                     error_found = True
-                    error_details.append(
-                        "No start cue was given in question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'No start cue was given in question "{quest}" on page "{page}".\n')
                 else:
                     try:
                         int(structure[page][quest]["start_cue"])
                     except (ValueError, TypeError):
                         error_found = True
-                        error_details.append(
-                            "Start cue given in question '{}' on page '{}' couldn't be converted to a number.\n".format(
-                                quest, page))
+                        error_details.append(f'Start cue given in question "{quest}" on page "{page}" could not be converted to a number.\n')
             elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Player" \
                     and "start_cue" not in structure[page][quest].keys():
                 error_found = True
-                error_details.append(
-                    "No start cue was given in question '{}' on page '{}'.\n".format(quest, page))
+                error_details.append(f'No start cue was given in question "{quest}" on page "{page}".\n')
 
             if "end_cue" in structure[page][quest].keys():
                 try:
                     int(structure[page][quest]["end_cue"])
                     if "start_cue" in structure[page][quest].keys() and structure[page][quest]["start_cue"] == structure[page][quest]["end_cue"]:
                         error_found = True
-                        error_details.append(
-                            "The same cue ({}) was used as start- and end-cue for one condition in question '{}' on page '{}'.\n".format(
-                                structure[page][quest]["start_cue"], quest, page))
+                        error_details.append(f'The same cue ({structure[page][quest]["start_cue"]}) was used as start- and end-cue for one condition in question "{quest}" on page "{page}".\n')
                 except (ValueError, TypeError):
                     error_found = True
-                    error_details.append(
-                        "End cue given in question '{}' on page '{}' couldn't be converted to a number.\n".format(
-                            quest, page))
+                    error_details.append(f'End cue given in question "{quest}" on page "{page}" could not be converted to a number.\n')
 
             if "track" in structure[page][quest].keys():
                 if structure[page][quest]["track"] == "":
                     error_found = True
-                    error_details.append(
-                        "No track(s) was given for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'No track(s) was given for question "{quest}" on page "{page}".\n')
                 else:
                     try:
-                        if type(structure[page][quest]["track"]) == list or \
-                                type(structure[page][quest]["track"]) == tuple:
+                        if isinstance(structure[page][quest]["track"], (list, tuple)):
                             if "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "ABX" and (
                                     len(structure[page][quest]["track"]) > 2 or len(structure[page][quest]["track"]) < 1):
                                 error_found = True
-                                error_details.append(
-                                    "There should be 1 or 2 tracks for AB(X)-tests, but {} were given in question '{}' on page '{}'.\n".format(
-                                        len(structure[page][quest]["track"]), quest, page))
+                                error_details.append(f'There should be 1 or 2 tracks for AB(X)-tests, but {len(structure[page][quest]["track"])} were given in question "{quest}" on page "{page}".\n')
                             elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "MUSHRA" and \
                                     len(structure[page][quest]["track"]) != len(structure[page][quest]["start_cues"]) and \
                                     len(structure[page][quest]["track"]) > 1:
                                 error_found = True
-                                error_details.append(
-                                    "The number of tracks given doesn't equal the number of cues given in question '{}' on page '{}'.\n".format(
-                                        quest, page))
+                                error_details.append(f'The number of tracks given does not equal the number of cues given in question "{quest}" on page "{page}".\n')
 
                             elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "ABX" and len(structure[page][quest]["track"]) == 1:
                                 structure[page][quest]["track"].append(structure[page][quest]["track"][0])
                             for entry in range(len(structure[page][quest]["track"])):
-                                if type(structure[page][quest]["track"][entry]) == str:
-                                    if type(structure[page][quest]["track"]) == tuple:
+                                if isinstance(structure[page][quest]["track"][entry], str):
+                                    if isinstance(structure[page][quest]["track"], tuple):
                                         structure[page][quest]["track"] = list(structure[page][quest]["track"])
-                                    structure[page][quest]["track"][entry] = structure[page][quest]["track"][
-                                        entry].strip("' \"")
+                                    structure[page][quest]["track"][entry] = structure[page][quest]["track"][entry].strip("' \"")
                                     int(structure[page][quest]["track"][entry])
                                     if int(structure[page][quest]["track"][entry]) < 1:
                                         error_found = True
-                                        error_details.append(
-                                            "Tracks given for question '{}' on page '{}' needs to be greater than 0.\n".format(
-                                                quest, page))
-                                elif type(structure[page][quest]["track"][entry]) == list:
+                                        error_details.append(f'Tracks given for question "{quest}" on page "{page}" needs to be greater than 0.\n')
+                                elif isinstance(structure[page][quest]["track"][entry], list):
                                     if "type" in structure[page][quest].keys() and structure[page][quest]["type"] != "MUSHRA":
                                         error_found = True
-                                        error_details.append("Tracks given for question '{}' on page '{}' need to be one or more integers, not lists.\n".format(
-                                                quest, page))
+                                        error_details.append(f'Tracks given for question "{quest}" on page "{page}" need to be one or more integers, not lists.\n')
                                     for entry2 in range(len(structure[page][quest]["track"][entry])):
-                                        if type(structure[page][quest]["track"][entry][entry2]) != int:
-                                            structure[page][quest]["track"][entry][entry2] = \
-                                                structure[page][quest]["track"][entry][entry2].strip("' \"")
+                                        if not isinstance(structure[page][quest]["track"][entry][entry2], int):
+                                            structure[page][quest]["track"][entry][entry2] = structure[page][quest]["track"][entry][entry2].strip("' \"")
                                         int(structure[page][quest]["track"][entry][entry2])
                                         if int(structure[page][quest]["track"][entry][entry2]) < 1:
                                             error_found = True
-                                            error_details.append(
-                                                "Tracks given for question '{}' on page '{}' needs to be greater than 0.\n".format(
-                                                    quest, page))
+                                            error_details.append(f'Tracks given for question "{quest}" on page "{page}" needs to be greater than 0.\n')
                                 else:  # int
                                     if structure[page][quest]["track"][entry] < 1:
                                         error_found = True
-                                        error_details.append(
-                                            "Track given for question '{}' on page '{}' needs to be greater than 0.\n".format(
-                                                quest, page))
+                                        error_details.append(f'Track given for question "{quest}" on page "{page}" needs to be greater than 0.\n')
                         else:
                             int(structure[page][quest]["track"])
 
                             if int(structure[page][quest]["track"]) < 1:
                                 error_found = True
-                                error_details.append(
-                                    "Track given for question '{}' on page '{}' needs to be greater than 0.\n".format(
-                                        quest, page))
+                                error_details.append(f'Track given for question "{quest}" on page "{page}" needs to be greater than 0.\n')
                             if "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "ABX":
-                                structure[page][quest]["track"] = [structure[page][quest]["track"],
-                                                                   structure[page][quest]["track"]]
+                                structure[page][quest]["track"] = [structure[page][quest]["track"], structure[page][quest]["track"]]
                     except ValueError:
                         error_found = True
-                        error_details.append(
-                            "Track(s) given for question '{}' on page '{}' couldn't be converted to a number or list of numbers.\n".format(
-                                quest, page))
+                        error_details.append(f'Track(s) given for question "{quest}" on page "{page}" could not be converted to a number or list of numbers.\n')
             elif "type" in structure[page][quest].keys() and \
                     (structure[page][quest]["type"] == "Player" or structure[page][quest]["type"] == "MUSHRA" or
                      structure[page][quest]["type"] == "ABX" or structure[page][quest]["type"] == "AFC") \
                     and "track" not in structure[page][quest].keys():
                 error_found = True
-                error_details.append(
-                    "No track(s) was given for question '{}' on page '{}'.\n".format(quest, page))
+                error_details.append(f'No track(s) was given for question "{quest}" on page "{page}".\n')
 
             if "buttons" in structure[page][quest].keys():
                 if len(structure[page][quest]["buttons"]) == 0:
                     warning_found = True
-                    warning_details.append(
-                        "No buttons are displayed for the player in question '{}' on page '{}'. It will play when this page is loaded.\n".format(
-                            quest, page))
+                    warning_details.append(f'No buttons are displayed for the player in question "{quest}" on page "{page}". It will play when this page is loaded.\n')
                 else:
                     try:
-                        if type(structure[page][quest]["buttons"]) is list or type(
-                                structure[page][quest]["buttons"]) is tuple:
+                        if isinstance(structure[page][quest]["buttons"], (list, tuple)):
                             for button in structure[page][quest]["buttons"]:
                                 if button not in player_buttons:
                                     raise ValueError
                             if "Play" not in structure[page][quest]["buttons"]:
                                 warning_found = True
-                                warning_details.append(
-                                    "No Play button is displayed for the player in question '{}' on page '{}'. It will play when this page is loaded.\n".format(
-                                        quest, page))
-                        elif type(structure[page][quest]["buttons"]) is str:
+                                warning_details.append(f'No Play button is displayed for the player in question "{quest}" on page "{page}". It will play when this page is loaded.\n')
+                        elif isinstance(structure[page][quest]["buttons"], str):
                             if structure[page][quest]["buttons"] not in player_buttons:
                                 raise ValueError
                             elif "Play" != structure[page][quest]["buttons"]:
                                 warning_found = True
-                                warning_details.append(
-                                    "No Play button is displayed for the player in question '{}' on page '{}'. It will play when this page is loaded.\n".format(
-                                        quest, page))
+                                warning_details.append(f'No Play button is displayed for the player in question "{quest}" on page "{page}". It will play when this page is loaded.\n')
                         else:
                             raise ValueError
                     except ValueError:
                         error_found = True
-                        error_details.append(
-                            "Invalid value found for 'buttons' for question '{}' on page '{}'.\n".format(quest, page))
-            elif "type" in structure[page][quest].keys() and structure[page][quest][
-                "type"] == "Player" and "buttons" not in structure[page][quest].keys():
+                        error_details.append(f'Invalid value found for "buttons" for question "{quest}" on page "{page}".\n')
+            elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Player" and "buttons" not in structure[page][quest].keys():
                 warning_found = True
-                warning_details.append(
-                    "No buttons are displayed for the player in question '{}' on page '{}'. It will play when this page is loaded.\n".format(
-                        quest, page))
+                warning_details.append(f'No buttons are displayed for the player in question "{quest}" on page "{page}". It will play when this page is loaded.\n')
 
             if "start_cues" in structure[page][quest].keys():
                 if structure[page][quest]["start_cues"] == "":
                     error_found = True
-                    error_details.append(
-                        "No start cues were given for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'No start cues were given for question "{quest}" on page "{page}".\n')
                 else:
                     try:
-                        if type(structure[page][quest]["start_cues"]) == list or \
-                                type(structure[page][quest]["start_cues"]) == tuple:
+                        if isinstance(structure[page][quest]["start_cues"], (list, tuple)):
                             for entry in range(len(structure[page][quest]["start_cues"])):
-                                if type(structure[page][quest]["start_cues"][entry]) == str:
-                                    if type(structure[page][quest]["start_cues"]) == tuple:
+                                if isinstance(structure[page][quest]["start_cues"][entry], str):
+                                    if isinstance(structure[page][quest]["start_cues"], tuple):
                                         structure[page][quest]["start_cues"] = list(structure[page][quest]["start_cues"])
                                     structure[page][quest]["start_cues"][entry] = structure[page][quest]["start_cues"][entry].strip("' \"")
                                     int(structure[page][quest]["start_cues"][entry])
                             if "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "ABX" and (len(structure[page][quest]["start_cues"]) != 2):
                                 error_found = True
-                                error_details.append(
-                                    "There should be exactly 2 start_cues for AB(X)-tests, but {} were given in question '{}' on page '{}'.\n".format(
-                                        1 if type(structure[page][quest]["start_cues"]) == int else len(
-                                            structure[page][quest]["start_cues"]), quest, page))
+                                error_details.append(f'There should be exactly 2 start_cues for AB(X)-tests, but {1 if isinstance(structure[page][quest]["start_cues"], int) else len(structure[page][quest]["start_cues"])} were given in question "{quest}" on page "{page}".\n')
                         else:
                             int(structure[page][quest]["start_cues"])
                             if structure[page][quest]["type"] == "ABX":
                                 error_found = True
-                                error_details.append(
-                                    "There should be exactly 2 start_cues for AB(X)-tests, but {} were given in question '{}' on page '{}'.\n".format(
-                                        1 if type(structure[page][quest]["start_cues"]) == int else len(
-                                            structure[page][quest]["start_cues"]), quest, page))
+                                error_details.append(f'There should be exactly 2 start_cues for AB(X)-tests, but {1 if isinstance(structure[page][quest]["start_cues"], int) else len(structure[page][quest]["start_cues"])} were given in question "{quest}" on page "{page}".\n')
+
                     except ValueError:
                         error_found = True
-                        error_details.append(
-                            "Start cues given for question '{}' on page '{}' couldn't be converted to a list of numbers.\n".format(
-                                quest, page))
+                        error_details.append(f'Start cues given for question "{quest}" on page "{page}" could not be converted to a list of numbers.\n')
             elif "type" in structure[page][quest].keys() and (structure[page][quest]["type"] == "MUSHRA" or
                                                               structure[page][quest]["type"] == "ABX" or
                                                               structure[page][quest]["type"] == "AFC") \
                     and "start_cues" not in structure[page][quest].keys():
                 error_found = True
-                error_details.append("No start cues were given for question '{}' on page '{}'.\n".format(quest, page))
+                error_details.append(f'No start cues were given for question "{quest}" on page "{page}".\n')
 
             if "end_cues" in structure[page][quest].keys():
                 if structure[page][quest]["end_cues"] == "":
                     error_found = True
-                    error_details.append("No end cues were given for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'No end cues were given for question "{quest}" on page "{page}".\n')
                 else:
                     try:
-                        if type(structure[page][quest]["end_cues"]) == list or type(
-                                structure[page][quest]["end_cues"]) == tuple:
+                        if isinstance(structure[page][quest]["end_cues"], (list, tuple)):
                             for entry in range(len(structure[page][quest]["end_cues"])):
-                                if type(structure[page][quest]["end_cues"][entry]) == str:
-                                    if type(structure[page][quest]["end_cues"]) == tuple:
+                                if isinstance(structure[page][quest]["end_cues"][entry], str):
+                                    if isinstance(structure[page][quest]["end_cues"], tuple):
                                         structure[page][quest]["end_cues"] = list(structure[page][quest]["end_cues"])
-                                    structure[page][quest]["end_cues"][entry] = structure[page][quest]["end_cues"][
-                                        entry].strip("' \"")
+                                    structure[page][quest]["end_cues"][entry] = structure[page][quest]["end_cues"][entry].strip("' \"")
                                     int(structure[page][quest]["end_cues"][entry])
                         else:
                             int(structure[page][quest]["end_cues"])
                     except ValueError:
                         error_found = True
-                        error_details.append(
-                            "End cues given for question '{}' on page '{}' couldn't be converted to a list of numbers.\n".format(
-                                quest, page))
-                    if "start_cues" not in structure[page][quest].keys() or \
-                            len(structure[page][quest]["end_cues"]) != len(structure[page][quest]["start_cues"]):
+                        error_details.append(f'End cues given for question "{quest}" on page "{page}" could not be converted to a list of numbers.\n')
+                    if "start_cues" not in structure[page][quest].keys() or len(structure[page][quest]["end_cues"]) != len(structure[page][quest]["start_cues"]):
                         error_found = True
-                        error_details.append(
-                            "The number of start- and end-cues in question '{}' on page '{}' doesn't match.\n".format(
-                                quest, page))
-            elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "MUSHRA" \
-                    and "end_cues" not in structure[page][quest].keys():
+                        error_details.append(f'The number of start- and end-cues in question "{quest}" on page "{page}" does not match.\n')
+            elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "MUSHRA" and "end_cues" not in structure[page][quest].keys():
                 error_found = True
-                error_details.append(
-                    "No end cues were given for question '{}' on page '{}'.\n".format(quest, page))
+                error_details.append(f'No end cues were given for question "{quest}" on page "{page}".\n')
 
             if "start_cues" in structure[page][quest].keys() and "end_cues" in structure[page][quest].keys():
-                if (type(structure[page][quest]["end_cues"]) == list or type(
-                        structure[page][quest]["end_cues"]) == tuple) and (
-                        type(structure[page][quest]["start_cues"]) == list or
-                        type(structure[page][quest]["start_cues"]) == tuple) and (
+                if isinstance(structure[page][quest]["end_cues"], (list, tuple)) and isinstance(structure[page][quest]["start_cues"], (list, tuple)) and (
                         len(structure[page][quest]["start_cues"]) == len(structure[page][quest]["end_cues"])):
                     for entry in range(len(structure[page][quest]["start_cues"])):
-                        if int(structure[page][quest]["start_cues"][entry]) == int(
-                                structure[page][quest]["end_cues"][entry]):
+                        if int(structure[page][quest]["start_cues"][entry]) == int(structure[page][quest]["end_cues"][entry]):
                             error_found = True
-                            error_details.append(
-                                "The same cue ({}) was used as start- and end-cue for one condition in question '{}' on page '{}'.\n".format(
-                                    structure[page][quest]["start_cues"][entry], quest, page))
+                            error_details.append(f'The same cue ({structure[page][quest]["start_cues"][entry]}) was used as start- and end-cue for one condition in question "{quest}" on page "{page}".\n')
 
             if "xfade" in structure[page][quest].keys():
                 try:
@@ -1277,48 +1125,38 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                                 all_same_marker = False
                         if not all_same_marker:
                             error_found = True
-                            error_details.append(
-                                "Xfade is only applicable if all start- and end-markers are the same each in question '{}' on page '{}'.\n".format(
-                                    quest, page))
-                        if (type(structure[page][quest]["track"]) == int or type(structure[page][quest]["track"]) == str) or \
-                                ((type(structure[page][quest]["track"]) == list or type(structure[page][quest]["track"]) == tuple) and \
-                                 (type(structure[page][quest]["track"][0]) == list and len(set(structure[page][quest]["track"][0])) == 1 or len(set(structure[page][quest]["track"])) == 1)):
+                            error_details.append(f'Xfade is only applicable if all start- and end-markers are the same each in question "{quest}" on page "{page}".\n')
+                        if isinstance(structure[page][quest]["track"], (int, str)) or \
+                                (isinstance(structure[page][quest]["track"], (list, tuple)) and
+                                 (isinstance(structure[page][quest]["track"][0], list) and len(set(structure[page][quest]["track"][0])) == 1 or len(set(structure[page][quest]["track"])) == 1)):
                             error_found = True
-                            error_details.append(
-                                "For xfade stimuli need to be placed on different tracks in question '{}' on page '{}'.\n".format(
-                                    quest, page))
+                            error_details.append(f'For xfade stimuli need to be placed on different tracks in question "{quest}" on page "{page}".\n')
                 except ValueError:
                     error_found = True
-                    error_details.append(
-                        "No valid value found for 'xfade' for question '{}' on page '{}'.\n".format(quest, page))
-                    structure[page][quest][
-                        "xfade"] = False  # This happens so the rest of the routine where xfade is referenced doesn't have to catch errors
+                    error_details.append(f'No valid value found for "xfade" for question "{quest}" on page "{page}".\n')
+                    structure[page][quest]["xfade"] = False  # This happens so the rest of the routine where xfade is referenced does not have to catch errors
 
             if "crossfade" in structure[page][quest].keys():
                 try:
                     structure[page][quest].as_bool("crossfade")
                 except ValueError:
                     error_found = True
-                    error_details.append(
-                        "No valid value found for 'crossfade' for question '{}' on page '{}'.\n".format(quest, page))
-                    structure[page][quest]["crossfade"] = False  # This happens so the rest of the routine where crossfade is referenced doesn't have to catch errors
+                    error_details.append(f'No valid value found for "crossfade" for question "{quest}" on page "{page}".\n')
+                    structure[page][quest]["crossfade"] = False  # This happens so the rest of the routine where crossfade is referenced does not have to catch errors
 
             if "inscription" in structure[page][quest].keys():
                 if structure[page][quest]["inscription"] == "":
                     warning_found = True
-                    warning_details.append(
-                        "No inscription for the button in question '{}' on page '{}'.\n".format(quest, page))
+                    warning_details.append(f'No inscription for the button in question "{quest}" on page "{page}".\n')
                 elif structure[page][quest]["inscription"] == "None":
                     warning_found = True
-                    warning_details.append(
-                        "Internally used inscription 'None' used in question '{}' on page '{}'.\n".format(quest, page))
+                    warning_details.append(f'Internally used inscription "None" used in question "{quest}" on page "{page}".\n')
             elif "type" in structure[page][quest].keys() and (structure[page][quest]["type"] == "Button"
                                                               or structure[page][quest]["type"] == "OSCButton") and \
                     "inscription" not in structure[page][quest].keys():
                 structure[page][quest]["inscription"] = ""
                 warning_found = True
-                warning_details.append(
-                    "No inscription for the button in question '{}' on page '{}'.\n".format(quest, page))
+                warning_details.append(f'No inscription for the button in question "{quest}" on page "{page}".\n')
 
             if "type" in structure[page][quest].keys() and structure[page][quest]["type"] is not None:
                 if structure[page][quest]["type"] == "Button" and (
@@ -1331,22 +1169,18 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                                                                    structure["audio_ip"] == "" or
                                                                    structure["audio_port"] == ""):
                     warning_found = True
-                    warning_details.append(
-                        "This questionnaire uses MUSHRA, but no valid address for an audio-application is set.\n")
+                    warning_details.append("This questionnaire uses MUSHRA, but no valid address for an audio-application is set.\n")
                 if (structure[page][quest]["type"] == "Player" or structure[page][quest]["type"] == "ABX" or
                     structure[page][quest]["type"] == "AFC") and \
                         ("audio_ip" not in structure.keys() or "audio_port" not in structure.keys() or
                          structure["audio_ip"] == "" or structure["audio_port"] == ""):
                     warning_found = True
-                    warning_details.append(
-                        "This questionnaire uses an audio player, but no valid address for an audio-application is set.\n")
+                    warning_details.append("This questionnaire uses an audio player, but no valid address for an audio-application is set.\n")
                 if structure[page][quest]["type"] == "Player" and "video" in structure[page][quest].keys() \
                         and ("video_ip" not in structure.keys() or "video_port" not in structure.keys() or
                              structure["video_ip"] == "" or structure["video_port"] == ""):
                     warning_found = True
-                    warning_details.append(
-                        "This questionnaire uses a video in question '{}' on page '{}', but no valid address for a video-application is set.\n".format(
-                            quest, page))
+                    warning_details.append(f'This questionnaire uses a video in question "{quest}" on page "{page}", but no valid address for a video-application is set.\n')
                 if (structure[page][quest]["type"] == "Button" or "pupil" in structure[page][quest].keys() and structure[page][quest]["pupil"] != "") and \
                         ("pupil_ip" not in structure.keys() or "pupil_port" not in structure.keys() or
                          structure["pupil_ip"] == "" or structure["pupil_port"] == ""):
@@ -1358,144 +1192,123 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                         structure[page][quest]["objectName"] == "headline" or \
                         structure[page][quest]["objectName"] == "SliderHeader":
                     warning_found = True
-                    warning_details.append(
-                        "The objectName in question '{}' on page '{}' uses a predefined name.\n".format(quest, page))
+                    warning_details.append(f'The objectName in question "{quest}" on page "{page}" uses a predefined name.\n')
 
             if "timer" in structure[page][quest].keys() and structure[page][quest]["timer"] != "":
                 try:
                     if int(structure[page][quest]["timer"]) < 0:
                         warning_found = True
-                        warning_details.append(
-                            "The timer in question '{}' on page '{}' needs to be greater than or equal to 0. Setting it to 0 by default.\n".format(quest, page))
+                        warning_details.append(f'The timer in question "{quest}" on page "{page}" needs to be greater than or equal to 0. Setting it to 0 by default.\n')
                         structure[page][quest]["timer"] = 0
                 except ValueError:
                     error_found = True
-                    error_details.append(
-                        "The timer in question '{}' on page '{}' needs to be a numeric value.\n".format(quest, page))
+                    error_details.append(f'The timer in question "{quest}" on page "{page}" needs to be a numeric value.\n')
 
             if "password_file" in structure[page][quest].keys():
                 if structure[page][quest]["password_file"] == "":
                     warning_found = True
-                    warning_details.append(
-                        "No password_file found for question '{}' on page '{}'.\n".format(quest, page))
+                    warning_details.append(f'No password_file found for question "{quest}" on page "{page}".\n')
                 elif not path.isfile(structure[page][quest]["password_file"]):
                     error_found = True
-                    error_details.append(
-                        "No valid password_file for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'No valid password_file for question "{quest}" on page "{page}".\n')
                 elif not validate_passwords(structure[page][quest]["password_file"], structure[page][quest]["policy"]):
                     warning_found = True
-                    warning_details.append(
-                        "Passwords in file do not match policy of field for question '{}' on page '{}'.\n".format(quest,
-                                                                                                                  page))
+                    warning_details.append(f'Passwords in file do not match policy of field for question "{quest}" on page "{page}".\n')
             elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Password" and \
                     "password_file" not in structure[page][quest].keys():
                 structure[page][quest]["password_file"] = ""
                 warning_found = True
-                warning_details.append(
-                    "No password_file found for question '{}' on page '{}'.\n".format(quest, page))
+                warning_details.append(f'No password_file found for question "{quest}" on page "{page}".\n')
 
             if "button_texts" in structure[page][quest].keys():
-                if ((type(structure[page][quest]["button_texts"]) != list and type(
-                        structure[page][quest]["button_texts"]) != tuple) and structure[page][quest][
-                        "button_texts"] != "") or \
-                        ((type(structure[page][quest]["button_texts"]) == list or type(
-                            structure[page][quest]["button_texts"]) == tuple) and
-                         ((len(structure[page][quest]["button_texts"]) != 2 and structure[page][quest].as_bool(
-                             "x") == False) or
-                          (len(structure[page][quest]["button_texts"]) != 3 and structure[page][quest].as_bool(
-                              "x") == True))):
+                if (not isinstance(structure[page][quest]["button_texts"], list) and not isinstance(structure[page][quest]["button_texts"], tuple) and
+                        structure[page][quest]["button_texts"] != "") or \
+                        (isinstance(structure[page][quest]["button_texts"], (list, tuple)) and
+                        ((len(structure[page][quest]["button_texts"]) != 2 and not structure[page][quest].as_bool("x")) or
+                        (len(structure[page][quest]["button_texts"]) != 3 and structure[page][quest].as_bool("x")))):
                     error_found = True
-                    error_details.append(
-                        "Please give no, two or three (if option X is used) button_texts for the ABX type question '{}' on page '{}'.\n".format(
-                            quest, page))
+                    error_details.append(f'Please give no, two or three (if option X is used) button_texts for the ABX type question "{quest}" on page "{page}".\n')
 
             if "randomize" in structure[page][quest].keys():
                 try:
                     _ = structure[page][quest].as_bool("randomize")
                 except ValueError:
                     error_found = True
-                    error_details.append(
-                        "No valid value found for 'randomize' for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'No valid value found for "randomize" for question "{quest}" on page "{page}".\n')
             elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Matrix" and \
                     "randomize" not in structure[page][quest].keys():
                 structure[page][quest]["randomize"] = False
                 warning_found = True
-                warning_details.append(
-                    "No option for 'randomize' found for question '{}' on page '{}'.\n".format(quest, page))
+                warning_details.append(f'No option for "randomize" found for question "{quest}" on page "{page}".\n')
 
             if "questions" in structure[page][quest].keys():
                 if structure[page][quest]["questions"] == "" or len(structure[page][quest]["questions"]) == 0:
                     warning_found = True
-                    warning_details.append(
-                        "No questions for the matrix in question '{}' on page '{}' found.\n".format(quest, page))
+                    warning_details.append(f'No questions for the matrix in question "{quest}" on page "{page}" found.\n')
             elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Matrix" and \
                     "questions" not in structure[page][quest].keys():
                 structure[page][quest]["questions"] = ""
                 warning_found = True
-                warning_details.append(
-                    "No questions for the matrix in question '{}' on page '{}' found.\n".format(quest, page))
+                warning_details.append(f'No questions for the matrix in question "{quest}" on page "{page}" found.\n')
 
             if "image_file" in structure[page][quest].keys():
                 if structure[page][quest]["image_file"] == "":
                     warning_found = True
-                    warning_details.append(
-                        "No image_file found for question '{}' on page '{}'.\n".format(quest, page))
+                    warning_details.append(f'No image_file found for question "{quest}" on page "{page}".\n')
                 elif not path.isfile(structure[page][quest]["image_file"]):
                     error_found = True
-                    error_details.append(
-                        "No valid image_file for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'No valid image_file for question "{quest}" on page "{page}".\n')
             elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Image" and \
                     "image_file" not in structure[page][quest].keys():
                 structure[page][quest]["image_file"] = ""
                 warning_found = True
-                warning_details.append(
-                    "No image_file found for question '{}' on page '{}'.\n".format(quest, page))
+                warning_details.append(f'No image_file found for question "{quest}" on page "{page}".\n')
 
             if "image_position" in structure[page][quest].keys():
                 if structure[page][quest]["image_position"] not in image_positions:
                     error_found = True
-                    error_details.append("Invalid image position found for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'Invalid image position found for question "{quest}" on page "{page}".\n')
                 elif structure[page][quest]["image_position"] == "free" and ("x_pos" not in structure[page][quest].keys() and "y_pos" not in structure[page][quest].keys()):
                     warning_found = True
-                    warning_details.append("Image '{}' on page '{}' is chosen to be positioned freely, but no coordinates were given.\n".format(quest, page))
+                    warning_details.append(f'Image "{quest}" on page "{page}" is chosen to be positioned freely, but no coordinates were given.\n')
                     structure[page][quest]["x_pos"] = 0 if "x_pos" not in structure[page][quest].keys() else structure[page][quest]["x_pos"]
                     structure[page][quest]["y_pos"] = 0 if "y_pos" not in structure[page][quest].keys() else structure[page][quest]["y_pos"]
             elif "image_position" not in structure[page][quest].keys() and "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "Image":
                 error_found = True
-                error_details.append("No image_position found for question '{}' on page '{}'.\n".format(quest, page))
+                error_details.append(f'No image_position found for question "{quest}" on page "{page}".\n')
 
             if "width" in structure[page][quest].keys():
                 try:
                     int(structure[page][quest]["width"])
                     if int(structure[page][quest]["width"]) <= 0:
                         error_found = True
-                        error_details.append("Width needs to be bigger than 0 for question '{}' on page '{}'.\n".format(quest, page))
+                        error_details.append(f'Width needs to be bigger than 0 for question "{quest}" on page "{page}".\n')
                 except ValueError:
                     error_found = True
-                    error_details.append("Invalid value for width for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'Invalid value for width for question "{quest}" on page "{page}".\n')
 
             if "height" in structure[page][quest].keys():
                 try:
                     int(structure[page][quest]["height"])
                     if int(structure[page][quest]["height"]) <= 0:
                         error_found = True
-                        error_details.append("Height needs to be bigger than 0 for question '{}' on page '{}'.\n".format(quest, page))
+                        error_details.append(f'Height needs to be bigger than 0 for question "{quest}" on page "{page}".\n')
                 except ValueError:
                     error_found = True
-                    error_details.append("Height value for width for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'Height value for width for question "{quest}" on page "{page}".\n')
 
             if "x_pos" in structure[page][quest].keys():
                 try:
                     int(structure[page][quest]["x_pos"])
                     if int(structure[page][quest]["x_pos"]) < 0:
                         error_found = True
-                        error_details.append("X position needs to be bigger or equal to 0 for question '{}' on page '{}'.\n".format(quest, page))
+                        error_details.append(f'X position needs to be bigger or equal to 0 for question "{quest}" on page "{page}".\n')
                 except ValueError:
                     error_found = True
-                    error_details.append("Invalid value for x position for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'Invalid value for x position for question "{quest}" on page "{page}".\n')
             elif "image_position" in structure[page][quest].keys() and structure[page][quest]["image_position"] == "free":
                 warning_found = True
-                warning_details.append("No x position given for the question '{}' on page '{}'.\n".format(quest, page))
+                warning_details.append(f'No x position given for the question "{quest}" on page "{page}".\n')
                 structure[page][quest]["x_pos"] = 0
 
             if "y_pos" in structure[page][quest].keys():
@@ -1503,53 +1316,52 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                     int(structure[page][quest]["y_pos"])
                     if int(structure[page][quest]["y_pos"]) < 0:
                         error_found = True
-                        error_details.append("Y position needs to be bigger or equal to than 0 for question '{}' on page '{}'.\n".format(quest, page))
+                        error_details.append(f'Y position needs to be bigger or equal to than 0 for question "{quest}" on page "{page}".\n')
                 except ValueError:
                     error_found = True
-                    error_details.append("Invalid value for y position for question '{}' on page '{}'.\n".format(quest, page))
+                    error_details.append(f'Invalid value for y position for question "{quest}" on page "{page}".\n')
             elif "image_position" in structure[page][quest].keys() and structure[page][quest]["image_position"] == "free":
                 warning_found = True
-                warning_details.append("No y position given for the question '{}' on page '{}'.\n".format(quest, page))
+                warning_details.append(f'No y position given for the question "{quest}" on page "{page}".\n')
                 structure[page][quest]["y_pos"] = 0
 
             if "address" in structure[page][quest].keys():
                 if structure[page][quest]["address"] == "":
                     error_found = True
-                    error_details.append(
-                        "No OSC-address for question '{}' on page '{}' was given.\n".format(quest, page))
+                    error_details.append(f'No OSC-address for question "{quest}" on page "{page}" was given.\n')
                 elif not structure[page][quest]["address"].startswith("/"):
                     warning_found = True
-                    warning_details.append("The OSC-address of question '{}' on page '{}' should start with '/'.\n".format(quest, page))
+                    warning_details.append(f'The OSC-address of question "{quest}" on page "{page}" should start with "/".\n')
             elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "OSCButton" and \
                     "address" not in structure[page][quest].keys():
                 error_found = True
-                error_details.append("No OSC-address for question '{}' on page '{}' was given.\n".format(quest, page))
+                error_details.append(f'No OSC-address for question "{quest}" on page "{page}" was given.\n')
 
             if "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "OSCButton" and \
                     "value" not in structure[page][quest].keys():
                 error_found = True
-                error_details.append("No value for question '{}' on page '{}' was given.\n".format(quest, page))
+                error_details.append(f'No value for question "{quest}" on page "{page}" was given.\n')
 
             if "receiver" in structure[page][quest].keys():
-                if type(structure[page][quest]["receiver"]) is not list and type(structure[page][quest]["receiver"]) is not tuple:
+                if not isinstance(structure[page][quest]["receiver"], list) and not isinstance(structure[page][quest]["receiver"], tuple):
                     error_found = True
-                    error_details.append("The receiver of question '{}' on page '{}' needs to have the format (IP, Port).\n".format(quest, page))
+                    error_details.append(f'The receiver of question "{quest}" on page "{page}" needs to have the format (IP, Port).\n')
                 elif len(structure[page][quest]["receiver"]) > 0:
                     match = re.match(ip_mask, structure[page][quest]["receiver"][0])
                     if match is None or match.span()[1] < len(structure[page][quest]["receiver"][0]):
                         error_found = True
-                        error_details.append("No valid IP address given for the receiver in question '{}' on page '{}'.\n".format(quest, page))
+                        error_details.append(f'No valid IP address given for the receiver in question "{quest}" on page "{page}".\n')
                     try:
                         int(structure[page][quest]["receiver"][1])
                         if int(structure[page][quest]["receiver"][1]) < 0 or int(structure[page][quest]["receiver"][1]) > 65535:
                             raise ValueError
                     except ValueError:
                         error_found = True
-                        error_details.append("Invalid receiver port in question '{}' on page '{}', couldn't be converted to a number 0-65535.\n".format(quest, page))
+                        error_details.append(f'Invalid receiver port in question "{quest}" on page "{page}", could not be converted to a number 0-65535.\n')
             elif "type" in structure[page][quest].keys() and structure[page][quest]["type"] == "OSCButton" and \
                     "receiver" not in structure[page][quest].keys():
                 error_found = True
-                error_details.append("No receiver found for question '{}' on page '{}'.\n".format(quest, page))
+                error_details.append(f'No receiver found for question "{quest}" on page "{page}".\n')
 
     # remove duplicate errors/warnings
     warning_details = list(dict.fromkeys(warning_details))
@@ -1580,5 +1392,5 @@ def validate_questionnaire(structure, suppress=False) -> (bool, bool, str):
                 error_string += warn + "\n"
         msg.setDetailedText(error_string)
     if not suppress or error_found:
-        msg.exec_()
+        msg.exec()
     return error_found, warning_found, warning_details
diff --git a/src/Video.py b/src/Video.py
index df3f64fc43485a207213b2eef1b6eed867849fb9..41c66ee8c2675e6afc95c1a7e14003649bdef672 100644
--- a/src/Video.py
+++ b/src/Video.py
@@ -8,9 +8,9 @@ madmapper = {
     "pause": ["/pause", 1],
     "unpause": ["/play", 1],
     "reset": ["/medias/selected/position_sec", 0.0]
-    #"loop_on": ["/medias/selected/loop", True],  # TBC
-    #"loop_off": ["/medias/selected/loop", False],  # TBC
-    #"restart": ["/medias/selected/restart"]  # TBC
+    # "loop_on": ["/medias/selected/loop", True],  # TBC
+    # "loop_off": ["/medias/selected/loop", False],  # TBC
+    # "restart": ["/medias/selected/restart"]  # TBC
 }
 
 vlc = {
diff --git a/src/__init__.py b/src/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/launcher.exe b/src/launcher.exe
index 0edb316c5c55d085608c821c3508f6dc7ec6d967..a3e7b8f4f1ba1e5021d60807e669f33261557223 100644
Binary files a/src/launcher.exe and b/src/launcher.exe differ
diff --git a/src/randomization.py b/src/randomization.py
index 9bf5ea3e37b0ff9eb6d02af08332937dbbbce1a9..a8103d4ec80fb68f8323e405a0d6c7face427962 100644
--- a/src/randomization.py
+++ b/src/randomization.py
@@ -40,8 +40,8 @@ def order_from_file(file):
     """
     with open(file) as f:
         orders = f.read().splitlines()
-    for row in range(0, len(orders)):
-        orders[row] = orders[row].split(",")
+    for row, order in enumerate(orders):
+        orders[row] = order.split(",")
         for entry in range(0, len(orders[row])):
             orders[row][entry] = int(orders[row][entry])
     return orders
diff --git a/src/tools.py b/src/tools.py
index 38d9fadf2fa40130e96875b30a67c0b5c963d0a7..940b7f5e37bf3eafebd07654ba6d3f2880d91aa4 100644
--- a/src/tools.py
+++ b/src/tools.py
@@ -126,7 +126,7 @@ types = list(fields_per_type.keys())
 
 policy_possibilities = ["None", "int", "double", "regex"]
 
-function_possibilites = ["Annotate", "Recording", "Stop", "Calibration"]
+function_possibilites = ["Annotate", "Recording", "Stop"]
 
 player_buttons = ["Play", "Pause", "Stop"]
 
@@ -214,7 +214,7 @@ default_values = {
     "labelled": False,
     "buttons": player_buttons,
     "policy": ["None"],
-    "function": "Calibration",
+    "function": "Annotate",
     "inscription": "",
     "password_file": "",
     "button_texts": "",
diff --git a/test/ABX_test.py b/test/ABX_test.py
index 32ebe9a3048d0cb058a92a81bf50294c830673e9..7ebbe80e14b5b128ce22880c22ecbf96ba0337d6 100644
--- a/test/ABX_test.py
+++ b/test/ABX_test.py
@@ -1,6 +1,6 @@
 """Testing the behaviour of ABX.py + QEditGui.py"""
 
-from context import *
+from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, types, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, ABX, ast
 
 
 @pytest.fixture
@@ -33,19 +33,19 @@ def run2():
 # noinspection PyArgumentList
 def test_create(gui_init, qtbot):
     # create a page
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     # create a question
     tv.setCurrentItem(tv.topLevelItem(0).child(0))
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -58,36 +58,36 @@ def test_create(gui_init, qtbot):
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
-    QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter)
+    QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter)
     gui_init.gui.questiontype.setCurrentIndex(types.index("ABX"))
     assert gui_init.gui.questiontype.currentText() == "ABX"
     # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable)
     layout = gui_init.gui.edit_layout
     not_none_rows = 0
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem):
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["ABX"][0].keys()
-            assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \
-                   fields_per_type["ABX"][0][layout.itemAt(row, 0).widget().text()]
-            if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["ABX"][0]
+            assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \
+                   fields_per_type["ABX"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()]
-            elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().isChecked() == default_values[
-                    layout.itemAt(row, 0).widget().text()]
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[
+                    layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
     assert not_none_rows == len(fields_per_type["ABX"][0].keys())
     assert len(gui_init.undo_stack) == 12  # 2 for creating page & question, 10 for choosing ABX
 
@@ -102,7 +102,7 @@ def test_create(gui_init, qtbot):
             structure["Page 1"][key] = value
     structure["Page 1"]["Question 1"] = {"type": "ABX"}
     for key, value in default_values.items():
-        if key in fields_per_type["ABX"][0].keys():
+        if key in fields_per_type["ABX"][0]:
             structure["Page 1"]["Question 1"][key] = value
     listify(gui_init.structure)
     listify(structure)
@@ -132,8 +132,8 @@ def test_create(gui_init, qtbot):
 def test_button_texts(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -141,98 +141,98 @@ def test_button_texts(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     labels_pos = find_row_by_label(gui_load.gui.edit_layout, 'button_texts')
-    x_pos = find_row_by_label(gui_load.gui.edit_layout, 'x')
+    x_pos = find_row_by_label(gui_load.gui.edit_layout, "x")
 
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("only one")
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "only one"
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("only one")
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one"
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "only one"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("1")
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "1"
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1")
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1"
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "1"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("one, two, too many")
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "one, two, too many"
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, too many")
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, too many"
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "one, two, too many"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == ""
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
     # ABX
-    gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == True
-    assert gui_load.structure["Page 1"]["Question 1"]["x"] == True
-
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("one, two")
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "one, two"
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert gui_load.structure["Page 1"]["Question 1"]["x"]
+
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two")
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two"
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "one, two"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("one, two, three, too many")
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "one, two, three, too many"
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, three, too many")
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, three, too many"
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "one, two, three, too many"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("one, two, not too many")
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "one, two, not too many"
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, not too many")
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, not too many"
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == "one, two, not too many"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == ""
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     QTimer.singleShot(150, handle_dialog_no_save)
     gui_load.close()
 
@@ -240,8 +240,8 @@ def test_button_texts(gui_load, qtbot):
 def test_answers(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -249,84 +249,84 @@ def test_answers(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     ans_pos = find_row_by_label(gui_load.gui.edit_layout, 'answers')
     button_pos = find_row_by_label(gui_load.gui.edit_layout, 'button_texts')
-    x_pos = find_row_by_label(gui_load.gui.edit_layout, 'x')
+    x_pos = find_row_by_label(gui_load.gui.edit_layout, "x")
 
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().setText("only one")
-    assert gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().text() == "only one"
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().setText("only one")
+    assert gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one"
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().setText("1")
-    assert gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().text() == "1"
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1")
+    assert gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1"
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "1"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().setText("one, two, too many")
-    assert gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().text() == "one, two, too many"
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, too many")
+    assert gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, too many"
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "one, two, too many"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # ABX
-    gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == True
-    assert gui_load.structure["Page 1"]["Question 1"]["x"] == True
-    gui_load.gui.edit_layout.itemAt(button_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(button_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert gui_load.structure["Page 1"]["Question 1"]["x"]
+    gui_load.gui.edit_layout.itemAt(button_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(button_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == ""
 
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().setText("only one")
-    assert gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().text() == "only one"
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().setText("only one")
+    assert gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one"
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().setText("one, two, too many")
-    assert gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().text() == "one, two, too many"
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, too many")
+    assert gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, too many"
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "one, two, too many"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().setText("one, two")
-    assert gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().text() == "one, two"
-    gui_load.gui.edit_layout.itemAt(ans_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two")
+    assert gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two"
+    gui_load.gui.edit_layout.itemAt(ans_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "one, two"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     QTimer.singleShot(150, handle_dialog_no_save)
     gui_load.close()
 
@@ -341,70 +341,70 @@ def test_x(gui_load, qtbot):
     # It is not case sensitive.
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
     gui_load.structure["Page 1"]["Question 1"]["x"] = True
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     gui_load.structure["Page 1"]["Question 1"]["x"] = False
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
     gui_load.structure["Page 1"]["Question 1"]["x"] = "True"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     gui_load.structure["Page 1"]["Question 1"]["x"] = "False"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
     gui_load.structure["Page 1"]["Question 1"]["x"] = 1
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     gui_load.structure["Page 1"]["Question 1"]["x"] = 0
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
     gui_load.structure["Page 1"]["Question 1"]["x"] = "true"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     gui_load.structure["Page 1"]["Question 1"]["x"] = "false"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
     gui_load.structure["Page 1"]["Question 1"]["x"] = 123
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
     gui_load.close()
 
 
 def test_start_cues(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -412,115 +412,115 @@ def test_start_cues(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     sc_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_cues')
     button_pos = find_row_by_label(gui_load.gui.edit_layout, 'button_texts')
-    x_pos = find_row_by_label(gui_load.gui.edit_layout, 'x')
+    x_pos = find_row_by_label(gui_load.gui.edit_layout, "x")
 
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1")
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1"
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1")
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1"
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1, 2, 3")
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1, 2, 3"
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1, 2, 3")
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, 2, 3"
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1, 2, 3"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == ""
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1, 2")
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1, 2"
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1, 2")
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, 2"
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1, 2"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("'1', 2")
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "'1', 2"
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("'1', 2")
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "'1', 2"
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "'1', 2"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1, '2'")
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1, '2'"
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1, '2'")
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, '2'"
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1, '2'"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
     # ABX
-    gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == True
-    assert gui_load.structure["Page 1"]["Question 1"]["x"] == True
-    gui_load.gui.edit_layout.itemAt(button_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(button_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert gui_load.structure["Page 1"]["Question 1"]["x"]
+    gui_load.gui.edit_layout.itemAt(button_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(button_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == ""
 
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1")
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1"
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1")
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1"
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1, 2, 3")
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1, 2, 3"
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1, 2, 3")
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, 2, 3"
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1, 2, 3"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("'1', 2")
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "'1', 2"
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("'1', 2")
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "'1', 2"
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "'1', 2"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     QTimer.singleShot(150, handle_dialog_no_save)
     gui_load.close()
 
@@ -528,8 +528,8 @@ def test_start_cues(gui_load, qtbot):
 def test_track(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -537,126 +537,126 @@ def test_track(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     track_pos = find_row_by_label(gui_load.gui.edit_layout, 'track')
     button_pos = find_row_by_label(gui_load.gui.edit_layout, 'button_texts')
-    x_pos = find_row_by_label(gui_load.gui.edit_layout, 'x')
+    x_pos = find_row_by_label(gui_load.gui.edit_layout, "x")
 
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1, 2, 3")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1, 2, 3"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1, 2, 3")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, 2, 3"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1, 2, 3"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == ""
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1, 2")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1, 2"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1, 2")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, 2"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1, 2"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("'1', 2")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "'1', 2"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("'1', 2")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "'1', 2"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "'1', 2"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("'1','2'")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "'1','2'"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("'1','2'")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "'1','2'"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "'1','2'"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1,'2'")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,'2'"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,'2'")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,'2'"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1,'2'"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
     # ABX
-    gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == True
-    assert gui_load.structure["Page 1"]["Question 1"]["x"] == True
-    gui_load.gui.edit_layout.itemAt(button_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(button_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert gui_load.structure["Page 1"]["Question 1"]["x"]
+    gui_load.gui.edit_layout.itemAt(button_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(button_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["button_texts"] == ""
 
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1, 2, 3")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1, 2, 3"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1, 2, 3")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, 2, 3"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1, 2, 3"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("'1',2")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "'1',2"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("'1',2")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "'1',2"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "'1',2"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     QTimer.singleShot(150, handle_dialog_no_save)
     gui_load.close()
 
@@ -665,7 +665,7 @@ def test_track(gui_load, qtbot):
 def test_execute_questionnaire_no_interaction(run, qtbot):
     assert run.Stack.count() == 1
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_abx.csv', mode='r') as file:
@@ -674,12 +674,12 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 7
-    assert lines[0] == '1'  # participant number
-    assert lines[2] == '-1'  # no answer given in button group
-    assert lines[3] == '[]'  # first element not played
-    assert lines[4] == '[]'  # second element not played
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[2] == '-1'  # no answer given in button group
+    assert results[3] == '[]'  # first element not played
+    assert results[4] == '[]'  # second element not played
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6])  # timestamp
     os.remove("./test/results/results_abx.csv")
 
 
@@ -688,11 +688,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
     with mock_file(r'./test/results/results_abx.csv'):
         assert run.Stack.count() == 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -700,20 +700,20 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == '1_order'
-                    assert lines[2] == '1_answer'
-                    assert lines[3] == '1_duration_A'
-                    assert lines[4] == '1_duration_B'
-                    assert lines[5] == 'Start'
-                    assert lines[6] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == '1_order'
+                    assert results[2] == '1_answer'
+                    assert results[3] == '1_duration_A'
+                    assert results[4] == '1_duration_B'
+                    assert results[5] == 'Start'
+                    assert results[6] == 'End'
         assert len(results) == 7
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[2] == '-1'  # no answer given in button group
-        assert lines[3] == '[]'  # first element not played
-        assert lines[4] == '[]'  # second element not played
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[2] == '-1'  # no answer given in button group
+        assert results[3] == '[]'  # first element not played
+        assert results[4] == '[]'  # second element not played
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6])  # timestamp
         os.remove(res_file)
 
 
@@ -721,16 +721,16 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
 def test_execute_questionnaire_ab(run, qtbot):
     assert run.Stack.count() == 1
     for child in run.Stack.currentWidget().children():
-        if type(child) == ABX:
-            QTest.mouseClick(child.a_button.play_button, Qt.LeftButton)
+        if isinstance(child, ABX):
+            QTest.mouseClick(child.a_button.play_button, Qt.MouseButton.LeftButton)
             QTest.qWait(1000)
-            QTest.mouseClick(child.b_button.play_button, Qt.LeftButton)
+            QTest.mouseClick(child.b_button.play_button, Qt.MouseButton.LeftButton)
             QTest.qWait(500)
-            QTest.mouseClick(child.a_button.play_button, Qt.LeftButton)
-            QTest.mouseClick(child.answer.button(0), Qt.LeftButton, delay=1)
+            QTest.mouseClick(child.a_button.play_button, Qt.MouseButton.LeftButton)
+            QTest.mouseClick(child.answer.button(0), Qt.MouseButton.LeftButton, delay=1000)
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
 
     results = []
     with open('./test/results/results_abx.csv', mode='r') as file:
@@ -739,22 +739,22 @@ def test_execute_questionnaire_ab(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == '1_order'
-                assert lines[2] == '1_answer'
-                assert lines[3] == '1_duration_A'
-                assert lines[4] == '1_duration_B'
-                assert lines[5] == 'Start'
-                assert lines[6] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == '1_order'
+                assert results[2] == '1_answer'
+                assert results[3] == '1_duration_A'
+                assert results[4] == '1_duration_B'
+                assert results[5] == 'Start'
+                assert results[6] == 'End'
     assert len(results) == 7
-    assert lines[0] == '1'  # participant number
-    assert lines[2] == '0'  # first answer given in button group
-    assert len(ast.literal_eval(lines[3])) == 2  # first element played twice
-    assert float(ast.literal_eval(lines[3])[0]) > 1.0
-    assert len(ast.literal_eval(lines[4])) == 1  # second element played once
-    assert float(ast.literal_eval(lines[4])[0]) > 0.5
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[2] == '0'  # first answer given in button group
+    assert len(ast.literal_eval(results[3])) == 2  # first element played twice
+    assert float(ast.literal_eval(results[3])[0]) > 1.0
+    assert len(ast.literal_eval(results[4])) == 1  # second element played once
+    assert float(ast.literal_eval(results[4])[0]) > 0.5
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6])  # timestamp
     os.remove("./test/results/results_abx.csv")
 
 
@@ -763,19 +763,19 @@ def test_execute_questionnaire_blocked(run, qtbot):
     with mock_file(r'./test/results/results_abx.csv'):
         assert run.Stack.count() == 1
         for child in run.Stack.currentWidget().children():
-            if type(child) == ABX:
-                QTest.mouseClick(child.a_button.play_button, Qt.LeftButton)
+            if isinstance(child, ABX):
+                QTest.mouseClick(child.a_button.play_button, Qt.MouseButton.LeftButton)
                 QTest.qWait(1000)
-                QTest.mouseClick(child.b_button.play_button, Qt.LeftButton)
+                QTest.mouseClick(child.b_button.play_button, Qt.MouseButton.LeftButton)
                 QTest.qWait(500)
-                QTest.mouseClick(child.a_button.play_button, Qt.LeftButton)
-                QTest.mouseClick(child.answer.button(0), Qt.LeftButton, delay=1)
+                QTest.mouseClick(child.a_button.play_button, Qt.MouseButton.LeftButton)
+                QTest.mouseClick(child.answer.button(0), Qt.MouseButton.LeftButton, delay=1000)
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -783,22 +783,22 @@ def test_execute_questionnaire_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == '1_order'
-                    assert lines[2] == '1_answer'
-                    assert lines[3] == '1_duration_A'
-                    assert lines[4] == '1_duration_B'
-                    assert lines[5] == 'Start'
-                    assert lines[6] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == '1_order'
+                    assert results[2] == '1_answer'
+                    assert results[3] == '1_duration_A'
+                    assert results[4] == '1_duration_B'
+                    assert results[5] == 'Start'
+                    assert results[6] == 'End'
         assert len(results) == 7
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[2] == '0'  # first answer given in button group
-        assert len(ast.literal_eval(lines[3])) == 2  # first element played twice
-        assert float(ast.literal_eval(lines[3])[0]) > 1.0
-        assert len(ast.literal_eval(lines[4])) == 1  # second element played once
-        assert float(ast.literal_eval(lines[4])[0]) > 0.5
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[2] == '0'  # first answer given in button group
+        assert len(ast.literal_eval(results[3])) == 2  # first element played twice
+        assert float(ast.literal_eval(results[3])[0]) > 1.0
+        assert len(ast.literal_eval(results[4])) == 1  # second element played once
+        assert float(ast.literal_eval(results[4])[0]) > 0.5
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6])  # timestamp
         os.remove(res_file)
 
 
@@ -807,7 +807,7 @@ def test_execute_questionnaire_no_interaction_x(run2, qtbot):
     assert run2.Stack.count() == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run2.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run2.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_abx.csv', mode='r') as file:
@@ -816,13 +816,13 @@ def test_execute_questionnaire_no_interaction_x(run2, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 8
-    assert lines[0] == '1'  # participant number
-    assert lines[2] == '-1'  # no answer given in button group
-    assert lines[3] == '[]'  # first element not played
-    assert lines[4] == '[]'  # second element not played
-    assert lines[5] == '[]'  # x not played
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[7])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[2] == '-1'  # no answer given in button group
+    assert results[3] == '[]'  # first element not played
+    assert results[4] == '[]'  # second element not played
+    assert results[5] == '[]'  # x not played
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[7])  # timestamp
     os.remove("./test/results/results_abx.csv")
 
 
@@ -831,11 +831,11 @@ def test_execute_questionnaire_no_interaction_x_blocked(run2, qtbot):
     with mock_file(r'./test/results/results_abx.csv'):
         assert run2.Stack.count() == 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run2.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run2.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -843,22 +843,22 @@ def test_execute_questionnaire_no_interaction_x_blocked(run2, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == '1_order'
-                    assert lines[2] == '1_answer'
-                    assert lines[3] == '1_duration_A'
-                    assert lines[4] == '1_duration_B'
-                    assert lines[5] == '1_duration_X'
-                    assert lines[6] == 'Start'
-                    assert lines[7] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == '1_order'
+                    assert results[2] == '1_answer'
+                    assert results[3] == '1_duration_A'
+                    assert results[4] == '1_duration_B'
+                    assert results[5] == '1_duration_X'
+                    assert results[6] == 'Start'
+                    assert results[7] == 'End'
         assert len(results) == 8
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[2] == '-1'  # no answer given in button group
-        assert lines[3] == '[]'  # first element not played
-        assert lines[4] == '[]'  # second element not played
-        assert lines[5] == '[]'  # x not played
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[7])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[2] == '-1'  # no answer given in button group
+        assert results[3] == '[]'  # first element not played
+        assert results[4] == '[]'  # second element not played
+        assert results[5] == '[]'  # x not played
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[7])  # timestamp
         os.remove(res_file)
 
 
@@ -866,23 +866,23 @@ def test_execute_questionnaire_no_interaction_x_blocked(run2, qtbot):
 def test_execute_questionnaire_abx(run2, qtbot):
     assert run2.Stack.count() == 1
     for child in run2.Stack.currentWidget().children():
-        if type(child) == ABX:
-            QTest.mouseClick(child.x_button.play_button, Qt.LeftButton)
+        if isinstance(child, ABX):
+            QTest.mouseClick(child.x_button.play_button, Qt.MouseButton.LeftButton)
             QTest.qWait(500)
-            QTest.mouseClick(child.a_button.play_button, Qt.LeftButton)
+            QTest.mouseClick(child.a_button.play_button, Qt.MouseButton.LeftButton)
             QTest.qWait(1000)
-            QTest.mouseClick(child.x_button.play_button, Qt.LeftButton)
+            QTest.mouseClick(child.x_button.play_button, Qt.MouseButton.LeftButton)
             QTest.qWait(500)
-            QTest.mouseClick(child.b_button.play_button, Qt.LeftButton)
+            QTest.mouseClick(child.b_button.play_button, Qt.MouseButton.LeftButton)
             QTest.qWait(500)
-            QTest.mouseClick(child.x_button.play_button, Qt.LeftButton)
+            QTest.mouseClick(child.x_button.play_button, Qt.MouseButton.LeftButton)
             QTest.qWait(500)
-            QTest.mouseClick(child.b_button.play_button, Qt.LeftButton)
+            QTest.mouseClick(child.b_button.play_button, Qt.MouseButton.LeftButton)
             QTest.qWait(2000)
-            QTest.mouseClick(child.answer.button(0), Qt.LeftButton, delay=1)
+            QTest.mouseClick(child.answer.button(0), Qt.MouseButton.LeftButton, delay=1000)
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run2.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(run2.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
 
     results = []
     with open('./test/results/results_abx.csv', mode='r') as file:
@@ -891,22 +891,22 @@ def test_execute_questionnaire_abx(run2, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == '1_order'
-                assert lines[2] == '1_answer'
-                assert lines[3] == '1_duration_A'
-                assert lines[4] == '1_duration_B'
-                assert lines[5] == '1_duration_X'
-                assert lines[6] == 'Start'
-                assert lines[7] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == '1_order'
+                assert results[2] == '1_answer'
+                assert results[3] == '1_duration_A'
+                assert results[4] == '1_duration_B'
+                assert results[5] == '1_duration_X'
+                assert results[6] == 'Start'
+                assert results[7] == 'End'
     assert len(results) == 8
-    assert lines[0] == '1'  # participant number
-    assert lines[2] == '0'  # first answer given in button group
-    assert len(ast.literal_eval(lines[3])) == 1  # first element played once
-    assert len(ast.literal_eval(lines[4])) == 2  # second element played twice
-    assert len(ast.literal_eval(lines[5])) == 3  # third (x) element played three times
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[7])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[2] == '0'  # first answer given in button group
+    assert len(ast.literal_eval(results[3])) == 1  # first element played once
+    assert len(ast.literal_eval(results[4])) == 2  # second element played twice
+    assert len(ast.literal_eval(results[5])) == 3  # third (x) element played three times
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[7])  # timestamp
     os.remove("./test/results/results_abx.csv")
 
 
@@ -915,26 +915,26 @@ def test_execute_questionnaire_abx_blocked(run2, qtbot):
     with mock_file(r'./test/results/results_abx.csv'):
         assert run2.Stack.count() == 1
         for child in run2.Stack.currentWidget().children():
-            if type(child) == ABX:
-                QTest.mouseClick(child.x_button.play_button, Qt.LeftButton)
+            if isinstance(child, ABX):
+                QTest.mouseClick(child.x_button.play_button, Qt.MouseButton.LeftButton)
                 QTest.qWait(500)
-                QTest.mouseClick(child.a_button.play_button, Qt.LeftButton)
+                QTest.mouseClick(child.a_button.play_button, Qt.MouseButton.LeftButton)
                 QTest.qWait(1000)
-                QTest.mouseClick(child.x_button.play_button, Qt.LeftButton)
+                QTest.mouseClick(child.x_button.play_button, Qt.MouseButton.LeftButton)
                 QTest.qWait(500)
-                QTest.mouseClick(child.b_button.play_button, Qt.LeftButton)
+                QTest.mouseClick(child.b_button.play_button, Qt.MouseButton.LeftButton)
                 QTest.qWait(500)
-                QTest.mouseClick(child.x_button.play_button, Qt.LeftButton)
+                QTest.mouseClick(child.x_button.play_button, Qt.MouseButton.LeftButton)
                 QTest.qWait(500)
-                QTest.mouseClick(child.b_button.play_button, Qt.LeftButton)
+                QTest.mouseClick(child.b_button.play_button, Qt.MouseButton.LeftButton)
                 QTest.qWait(2000)
-                QTest.mouseClick(child.answer.button(0), Qt.LeftButton, delay=1)
+                QTest.mouseClick(child.answer.button(0), Qt.MouseButton.LeftButton, delay=1000)
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run2.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run2.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -942,20 +942,20 @@ def test_execute_questionnaire_abx_blocked(run2, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == '1_order'
-                    assert lines[2] == '1_answer'
-                    assert lines[3] == '1_duration_A'
-                    assert lines[4] == '1_duration_B'
-                    assert lines[5] == '1_duration_X'
-                    assert lines[6] == 'Start'
-                    assert lines[7] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == '1_order'
+                    assert results[2] == '1_answer'
+                    assert results[3] == '1_duration_A'
+                    assert results[4] == '1_duration_B'
+                    assert results[5] == '1_duration_X'
+                    assert results[6] == 'Start'
+                    assert results[7] == 'End'
         assert len(results) == 8
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[2] == '0'  # first answer given in button group
-        assert len(ast.literal_eval(lines[3])) == 1  # first element played once
-        assert len(ast.literal_eval(lines[4])) == 2  # second element played twice
-        assert len(ast.literal_eval(lines[5])) == 3  # third (x) element played three times
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[6])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[7])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[2] == '0'  # first answer given in button group
+        assert len(ast.literal_eval(results[3])) == 1  # first element played once
+        assert len(ast.literal_eval(results[4])) == 2  # second element played twice
+        assert len(ast.literal_eval(results[5])) == 3  # third (x) element played three times
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[6])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[7])  # timestamp
         os.remove(res_file)
diff --git a/test/Button_test.py b/test/Button_test.py
index d19954d8b2ad5c6b56ab29ab9b900f396d3603ea..d16ba1d8e9b3cca27fadae67f9c135674dc502d0 100644
--- a/test/Button_test.py
+++ b/test/Button_test.py
@@ -1,6 +1,7 @@
 """Testing the behaviour of PupilCoreButton.py + QEditGui.py"""
 
-from context import *
+from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, open_pupil, Button, handle_dialog_warning
+
 
 recording_path = "C:\\Users\\Administrator\\recordings\\"  # TODO change to your path
 
@@ -40,19 +41,18 @@ def run():
 # noinspection PyArgumentList
 def test_create(gui_init, qtbot):
     # create a page
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     # create a question
     tv.setCurrentItem(tv.topLevelItem(0).child(0))
-    assert gui_init.gui.question_add.isEnabled() == True
-    QTest.qWait(500)
+    assert gui_init.gui.question_add.isEnabled()
 
     QTimer.singleShot(100, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -65,33 +65,33 @@ def test_create(gui_init, qtbot):
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
-    QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter)
+    QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter)
     assert gui_init.gui.questiontype.currentText() == "Button"
     # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable)
     layout = gui_init.gui.edit_layout
     not_none_rows = 0
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem):
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["Button"][0].keys()
-            assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \
-                   'TextEdit' if fields_per_type["Button"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\
-                   else fields_per_type["Button"][0][layout.itemAt(row, 0).widget().text()]
-            if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Button"][0]
+            assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \
+                   'TextEdit' if fields_per_type["Button"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\
+                   else fields_per_type["Button"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()]
-            elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().isChecked() == default_values[
-                    layout.itemAt(row, 0).widget().text()]
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[
+                    layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
     assert not_none_rows == len(fields_per_type["Button"][0].keys())
     assert len(gui_init.undo_stack) == 9  # 2 for creating page & question, 7 for choosing Button
 
@@ -106,7 +106,7 @@ def test_create(gui_init, qtbot):
             structure["Page 1"][key] = value
     structure["Page 1"]["Question 1"] = {"type": "Button"}
     for key, value in default_values.items():
-        if key in fields_per_type["Button"][0].keys():
+        if key in fields_per_type["Button"][0]:
             structure["Page 1"]["Question 1"][key] = value
     listify(gui_init.structure)
     listify(structure)
@@ -137,8 +137,8 @@ def test_create(gui_init, qtbot):
 def test_inscription(gui_load, qtbot, capfd):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -146,110 +146,111 @@ def test_inscription(gui_load, qtbot, capfd):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     ins_pos = find_row_by_label(gui_load.gui.edit_layout, 'inscription')
 
     # change text
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("Click me")
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Click me"
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("Click me")
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Click me"
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Click me"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Click me"
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Click me"
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Click me"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/pbtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Button:
+        if isinstance(child, Button):
             assert child.button.text() == "Click me"
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
 
     #  empty inscription -> warning
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("")
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == ""
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("")
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ""
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == ""
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == ""
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ""
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == ""
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == True
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     QTimer.singleShot(500, handle_dialog_warning)
     test_gui = StackedWindowGui("./test/pbtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Button:
+        if isinstance(child, Button):
             assert child.button.text() == ""
             child.button.click()
             QTest.qWait(1000)
             out, err = capfd.readouterr()
             assert out.index("Trigger {'topic': 'annotation', 'label': 'test', 'timestamp':") != -1
-            assert out.endswith(", 'duration': 1} Message forwarded.\n") == True
+            assert out.endswith(", 'duration': 1} Message forwarded.\n")
+            
     QTimer.singleShot(1000, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
 
     # predefined 'None'
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("None")
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "None"
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("None")
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "None"
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "None"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "None"
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "None"
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "None"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == True
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     QTimer.singleShot(150, handle_dialog_warning)
     test_gui = StackedWindowGui("./test/pbtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Button:
+        if isinstance(child, Button):
             assert child.button.text() == "None"
             child.button.click()
             QTest.qWait(500)
             out, err = capfd.readouterr()
             assert out.index("Trigger {'topic': 'annotation', 'label': 'test', 'timestamp':") != -1
-            assert out.endswith(", 'duration': 1} Message forwarded.\n") == True
+            assert out.endswith(", 'duration': 1} Message forwarded.\n")
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
 
     # reset file
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("Text")
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Text"
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("Text")
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Text"
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Text"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Text"
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Text"
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Text"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
 
     os.remove("./test/results/results_pb.csv")
     gui_load.close()
@@ -260,8 +261,8 @@ def test_inscription(gui_load, qtbot, capfd):
 def test_custom_annotation_text(gui_load, qtbot, capfd):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -269,7 +270,7 @@ def test_custom_annotation_text(gui_load, qtbot, capfd):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
 
     # change text
     gui_load.structure["Page 1"]["Question 1"]["annotation"] = "Custom text"
@@ -279,33 +280,33 @@ def test_custom_annotation_text(gui_load, qtbot, capfd):
     assert gui_load.structure["Page 1"]["Question 1"]["annotation"] == "Custom text"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Question 1"]["annotation"] == "Custom text"
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/pbtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Button:
+        if isinstance(child, Button):
             child.button.click()
             out, err = capfd.readouterr()
             assert out.index("Trigger {'topic': 'annotation', 'label': 'Custom text', 'timestamp':") != -1
-            assert out.endswith(", 'duration': 1} Message forwarded.\n") == True
+            assert out.endswith(", 'duration': 1} Message forwarded.\n")
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
 
     gui_load.structure["Page 1"]["Question 1"].pop("annotation")
     assert "annotation" not in gui_load.structure["Page 1"]["Question 1"].keys()
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     assert "annotation" not in gui_load.structure["Page 1"]["Question 1"].keys()
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     gui_load.close()
 
 
@@ -314,8 +315,8 @@ def test_custom_annotation_text(gui_load, qtbot, capfd):
 def test_custom_recording_name(gui_load, qtbot, capfd):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -323,18 +324,18 @@ def test_custom_recording_name(gui_load, qtbot, capfd):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     func_pos = find_row_by_label(gui_load.gui.edit_layout, 'function')
-    func_cb = gui_load.gui.edit_layout.itemAt(func_pos, 1).widget()
+    func_cb = gui_load.gui.edit_layout.itemAt(func_pos, QFormLayout.ItemRole.FieldRole).widget()
 
-    QTest.mouseClick(func_cb, Qt.LeftButton)
-    QTest.keyClick(func_cb, Qt.Key_Down)
-    QTest.keyClick(func_cb, Qt.Key_Enter)
+    QTest.mouseClick(func_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(func_cb, Qt.Key.Key_Down)
+    QTest.keyClick(func_cb, Qt.Key.Key_Enter)
     assert func_cb.currentText() == "Recording"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Question 1"]["function"] == "Recording"
 
@@ -346,38 +347,38 @@ def test_custom_recording_name(gui_load, qtbot, capfd):
     assert gui_load.structure["Page 1"]["Question 1"]["recording_name"] == "MyRecording"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Question 1"]["recording_name"] == "MyRecording"
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/pbtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Button:
+        if isinstance(child, Button):
             child.button.click()
             out, err = capfd.readouterr()
-            assert out.endswith("MyRecording\nStart recording... OK\n") == True
+            assert out.endswith("MyRecording\nStart recording... OK\n")
 
     test_gui.pupil_remote.send_string('r')
     print("Stop recording...", test_gui.pupil_remote.recv_string())
 
     QTimer.singleShot(500, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
-    assert os.path.exists(recording_path+"MyRecording") == True
+    assert os.path.exists(f'{recording_path}MyRecording')
     # os.remove(recording_path+"MyRecording")
 
-    QTest.mouseClick(func_cb, Qt.LeftButton)
-    QTest.keyClick(func_cb, Qt.Key_Up)
-    QTest.keyClick(func_cb, Qt.Key_Enter)
+    QTest.mouseClick(func_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(func_cb, Qt.Key.Key_Up)
+    QTest.keyClick(func_cb, Qt.Key.Key_Enter)
     assert func_cb.currentText() == "Annotate"
     gui_load.structure["Page 1"]["Question 1"].pop("recording_name")
     assert "recording_name" not in gui_load.structure["Page 1"]["Question 1"].keys()
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     assert "recording_name" not in gui_load.structure["Page 1"]["Question 1"].keys()
     gui_load.save()
@@ -389,8 +390,8 @@ def test_custom_recording_name(gui_load, qtbot, capfd):
 def test_custom_recording_name_id(gui_load2, qtbot, capfd):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load2.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -398,9 +399,9 @@ def test_custom_recording_name_id(gui_load2, qtbot, capfd):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     func_pos = find_row_by_label(gui_load2.gui.edit_layout, 'function')
-    func_cb = gui_load2.gui.edit_layout.itemAt(func_pos, 1).widget()
+    func_cb = gui_load2.gui.edit_layout.itemAt(func_pos, QFormLayout.ItemRole.FieldRole).widget()
 
     assert func_cb.currentText() == "Recording"
     assert gui_load2.structure["Page 1"]["Question 1"]["function"] == "Recording"
@@ -413,31 +414,33 @@ def test_custom_recording_name_id(gui_load2, qtbot, capfd):
     assert gui_load2.structure["Page 1"]["Question 1"]["recording_name"] == "id:tf"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load2.gui.refresh_button.click()
     assert gui_load2.structure["Page 1"]["Question 1"]["recording_name"] == "id:tf"
-    QTest.keyClicks(gui_load2, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load2, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/pbtest2.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QLineEdit:
+        if isinstance(child, QLineEdit):
             # noinspection PyTypeChecker
-            QTest.keyClicks(child, "test", Qt.NoModifier, delay=1)
+            QTest.keyClicks(child, "test", Qt.KeyboardModifier.NoModifier, delay=1000)
             assert child.text() == "test"
+    QTest.qWait(1000)
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Button:
+        if isinstance(child, Button):
             child.button.click()
             out, err = capfd.readouterr()
-            assert out.endswith("test\nStart recording... OK\n") == True
+            assert out.endswith("\nStart recording... OK\n")
+            QTest.qWait(500)
 
     test_gui.pupil_remote.send_string('r')
     print("Stop recording...", test_gui.pupil_remote.recv_string())
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
-    assert os.path.exists(recording_path+"test") == True
+    assert os.path.exists(f'{recording_path}test')
     # os.remove(recording_path+"test")
 
     gui_load2.structure["Page 1"]["Question 1"].pop("recording_name")
@@ -452,8 +455,8 @@ def test_custom_recording_name_id(gui_load2, qtbot, capfd):
 def test_function(gui_load, qtbot, capfd):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -461,88 +464,66 @@ def test_function(gui_load, qtbot, capfd):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     func_pos = find_row_by_label(gui_load.gui.edit_layout, 'function')
-    func_cb = gui_load.gui.edit_layout.itemAt(func_pos, 1).widget()
+    func_cb = gui_load.gui.edit_layout.itemAt(func_pos, QFormLayout.ItemRole.FieldRole).widget()
     assert func_cb.currentText() == 'Annotate'
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/pbtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Button:
+        if isinstance(child, Button):
             child.button.click()
             out, err = capfd.readouterr()
             assert out.index("Trigger {'topic': 'annotation', 'label': 'test', 'timestamp':") != -1
-            assert out.endswith(", 'duration': 1} Message forwarded.\n") == True
+            assert out.endswith(", 'duration': 1} Message forwarded.\n")
             QTest.qWait(500)
     test_gui.close()
 
-    QTest.mouseClick(func_cb, Qt.LeftButton)
-    QTest.keyClick(func_cb, Qt.Key_Down)
-    QTest.keyClick(func_cb, Qt.Key_Enter)
+    QTest.mouseClick(func_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(func_cb, Qt.Key.Key_Down)
+    QTest.keyClick(func_cb, Qt.Key.Key_Enter)
     assert func_cb.currentText() == "Recording"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Question 1"]["function"] == "Recording"
     gui_load.save()
     test_gui = StackedWindowGui("./test/pbtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Button:
+        if isinstance(child, Button):
             child.button.click()
             out, err = capfd.readouterr()
-            assert out.endswith("Start recording... OK\n") == True
+            assert out.endswith("Start recording... OK\n")
             QTest.qWait(500)
     test_gui.close()
 
-    QTest.mouseClick(func_cb, Qt.LeftButton)
-    QTest.keyClick(func_cb, Qt.Key_Down)
-    QTest.keyClick(func_cb, Qt.Key_Enter)
+    QTest.mouseClick(func_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(func_cb, Qt.Key.Key_Down)
+    QTest.keyClick(func_cb, Qt.Key.Key_Enter)
     assert func_cb.currentText() == "Stop"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     gui_load.save()
     test_gui = StackedWindowGui("./test/pbtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Button:
+        if isinstance(child, Button):
             child.button.click()
             out, err = capfd.readouterr()
-            assert out.endswith("Stop recording... OK\n") == True
+            assert out.endswith("Stop recording... OK\n")
             QTest.qWait(500)
     test_gui.close()
 
-    QTest.mouseClick(func_cb, Qt.LeftButton)
-    QTest.keyClick(func_cb, Qt.Key_Down)
-    QTest.keyClick(func_cb, Qt.Key_Enter)
-    assert func_cb.currentText() == "Calibration"
-    QTimer.singleShot(150, handle_dialog_error)
-    error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    gui_load.gui.refresh_button.click()
-    gui_load.save()
-    '''
-    test_gui = StackedWindowGui("./test/pbtest.txt")
-    for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Button:
-            child.button.click()
-            out, err = capfd.readouterr()
-            assert out.endswith("Calibrate... OK\n") == True
-            QTest.qWait(5000)
-    test_gui.close()
-    '''
-
-    QTest.mouseClick(func_cb, Qt.LeftButton)
-    QTest.keyClick(func_cb, Qt.Key_Up)
-    QTest.keyClick(func_cb, Qt.Key_Up)
-    QTest.keyClick(func_cb, Qt.Key_Up)
-    QTest.keyClick(func_cb, Qt.Key_Enter)
+    QTest.mouseClick(func_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(func_cb, Qt.Key.Key_Up)
+    QTest.keyClick(func_cb, Qt.Key.Key_Up)
+    QTest.keyClick(func_cb, Qt.Key.Key_Enter)
     assert func_cb.currentText() == 'Annotate'
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     gui_load.save()
     os.remove("./test/results/results_pb.csv")
     gui_load.close()
@@ -556,7 +537,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
     assert run.Stack.count() == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_pb.csv', mode='r') as file:
@@ -565,15 +546,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'pb'
-                assert lines[2] == 'Start'
-                assert lines[3] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'pb'
+                assert results[2] == 'Start'
+                assert results[3] == 'End'
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == 'False'  # the button was not clicked
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == 'False'  # the button was not clicked
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_pb.csv")
 
 
@@ -582,11 +563,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
     with mock_file(r'./test/results/results_pb.csv'):
         assert run.Stack.count() == 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -594,15 +575,15 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'pb'
-                    assert lines[2] == 'Start'
-                    assert lines[3] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'pb'
+                    assert results[2] == 'Start'
+                    assert results[3] == 'End'
         assert len(results) == 4
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == 'False'  # the button was not clicked
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == 'False'  # the button was not clicked
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
         os.remove(res_file)
 
 
@@ -613,14 +594,14 @@ def test_execute_questionnaire(run, qtbot, capfd):
         os.remove("./test/results/results_pb.csv")
     assert run.Stack.count() == 1
     for child in run.Stack.currentWidget().children():
-        if type(child) is Button:
+        if isinstance(child, Button):
             child.button.click()
             out, err = capfd.readouterr()
-            assert out.startswith("Trigger {'topic': 'annotation', 'label': 'test', 'timestamp':") == True
-            assert out.endswith(", 'duration': 1} Message forwarded.\n") == True
+            assert out.startswith("Trigger {'topic': 'annotation', 'label': 'test', 'timestamp':")
+            assert out.endswith(", 'duration': 1} Message forwarded.\n")
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_pb.csv', mode='r') as file:
@@ -629,15 +610,15 @@ def test_execute_questionnaire(run, qtbot, capfd):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'pb'
-                assert lines[2] == 'Start'
-                assert lines[3] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'pb'
+                assert results[2] == 'Start'
+                assert results[3] == 'End'
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == 'True'  # button was clicked
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == 'True'  # button was clicked
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_pb.csv")
 
 
@@ -647,17 +628,17 @@ def test_execute_questionnaire_blocked(run, qtbot, capfd):
     with mock_file(r'./test/results/results_pb.csv'):
         assert run.Stack.count() == 1
         for child in run.Stack.currentWidget().children():
-            if type(child) is Button:
+            if isinstance(child, Button):
                 child.button.click()
                 out, err = capfd.readouterr()
-                assert out.startswith("Trigger {'topic': 'annotation', 'label': 'test', 'timestamp':") == True
-                assert out.endswith(", 'duration': 1} Message forwarded.\n") == True
+                assert out.startswith("Trigger {'topic': 'annotation', 'label': 'test', 'timestamp':")
+                assert out.endswith(", 'duration': 1} Message forwarded.\n")
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -665,13 +646,13 @@ def test_execute_questionnaire_blocked(run, qtbot, capfd):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'pb'
-                    assert lines[2] == 'Start'
-                    assert lines[3] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'pb'
+                    assert results[2] == 'Start'
+                    assert results[3] == 'End'
         assert len(results) == 4
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == 'True'  # the button was not clicked
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == 'True'  # the button was not clicked
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
         os.remove(res_file)
diff --git a/test/CheckBox_test.py b/test/CheckBox_test.py
index d5786b3fcfb75923a191b655bf533d9d1fd7bbca..7bbf7fdc2a006598a7d220bfe3b516ce97c6746b 100644
--- a/test/CheckBox_test.py
+++ b/test/CheckBox_test.py
@@ -1,6 +1,6 @@
 """Testing the behaviour of Answer_Checkbox.py + QEditGui.py"""
 
-from context import *
+from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, make_answers_cb
 
 
 @pytest.fixture
@@ -27,19 +27,19 @@ def run():
 # noinspection PyArgumentList
 def test_create(gui_init, qtbot):
     # create a page
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     # create a question
     tv.setCurrentItem(tv.topLevelItem(0).child(0))
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -52,28 +52,28 @@ def test_create(gui_init, qtbot):
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
-    QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter)
+    QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter)
     assert gui_init.gui.questiontype.currentText() == "Check"
     # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable)
     layout = gui_init.gui.edit_layout
     not_none_rows = 0
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem):
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["Check"][0].keys()
-            assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \
-                   'TextEdit' if fields_per_type["Check"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\
-                   else fields_per_type["Check"][0][layout.itemAt(row, 0).widget().text()]
-            if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Check"][0]
+            assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \
+                   'TextEdit' if fields_per_type["Check"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\
+                   else fields_per_type["Check"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()]
-            elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().isChecked() == default_values[
-                    layout.itemAt(row, 0).widget().text()]
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[
+                    layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
     assert not_none_rows == len(fields_per_type["Check"][0].keys())
     assert len(gui_init.undo_stack) == 4  # 2 for creating page & question, 2 for choosing Check
 
@@ -88,7 +88,7 @@ def test_create(gui_init, qtbot):
             structure["Page 1"][key] = value
     structure["Page 1"]["Question 1"] = {"type": "Check"}
     for key, value in default_values.items():
-        if key in fields_per_type["Check"][0].keys():
+        if key in fields_per_type["Check"][0]:
             structure["Page 1"]["Question 1"][key] = value
     listify(gui_init.structure)
     listify(structure)
@@ -118,8 +118,8 @@ def test_create(gui_init, qtbot):
 def test_answers(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -127,63 +127,65 @@ def test_answers(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'answers')
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("[only one]")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[only one]"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[only one]")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "[only one]"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[only one]"
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]"
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one"  # structure got listified with refresh
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"])
+    assert not error_found
+    assert not warning_found
+    _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"], gui_load.structure["Page 1"]["Question 1"]["id"])
     assert len(cbs) == 1
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("only one")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "only one"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("only one")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"])
+    assert not error_found
+    assert not warning_found
+    _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"], gui_load.structure["Page 1"]["Question 1"]["id"])
     assert len(cbs) == 1
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("[one, two, three]")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[one, two, three]"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[one, two, three]")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[one, two, three]"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "[one, two, three]"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     gui_load.structure = listify(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == ["one", "two", "three"]
-    _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"])
+    _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"], gui_load.structure["Page 1"]["Question 1"]["id"])
     assert len(cbs) == 3
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == ""
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ""
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == ""
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == True
-    _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"])
+    assert not error_found
+    assert warning_found
+    _, cbs = make_answers_cb(gui_load.structure["Page 1"]["Question 1"]["answers"], gui_load.structure["Page 1"]["Question 1"]["id"])
     assert len(cbs) == 1
-    QTimer.singleShot(150, handle_dialog_no_save)
+    
+    gui_load.structure["Page 1"]["Question 1"]["answers"] = ["yes", " no", " maybe"]
+    gui_load.save()
     gui_load.close()
 
 
@@ -192,7 +194,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
     assert run.Stack.count() == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_cb.csv', mode='r') as file:
@@ -201,20 +203,21 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'cb1_0'
-                assert lines[2] == 'cb1_1'
-                assert lines[3] == 'cb1_2'
-                assert lines[4] == 'Start'
-                assert lines[5] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'cb1_0'
+                assert results[2] == 'cb1_1'
+                assert results[3] == 'cb1_2'
+                assert results[4] == 'Start'
+                assert results[5] == 'End'
     assert len(results) == 6
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == 'False'  # first cb not checked
-    assert lines[2] == 'False'  # second cb not checked
-    assert lines[3] == 'False'  # third cb not checked
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == 'False'  # first cb not checked
+    assert results[2] == 'False'  # second cb not checked
+    assert results[3] == 'False'  # third cb not checked
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
     os.remove("./test/results/results_cb.csv")
+    QTest.qWait(5000)
 
 
 # noinspection PyArgumentList
@@ -222,11 +225,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
     with mock_file(r'./test/results/results_cb.csv'):
         assert run.Stack.count() == 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -234,20 +237,21 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'cb1_0'
-                    assert lines[2] == 'cb1_1'
-                    assert lines[3] == 'cb1_2'
-                    assert lines[4] == 'Start'
-                    assert lines[5] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'cb1_0'
+                    assert results[2] == 'cb1_1'
+                    assert results[3] == 'cb1_2'
+                    assert results[4] == 'Start'
+                    assert results[5] == 'End'
         assert len(results) == 6
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == 'False'  # first cb not checked
-        assert lines[2] == 'False'  # second cb not checked
-        assert lines[3] == 'False'  # third cb not checked
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == 'False'  # first cb not checked
+        assert results[2] == 'False'  # second cb not checked
+        assert results[3] == 'False'  # third cb not checked
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
         os.remove(res_file)
+        QTest.qWait(5000)
 
 
 # noinspection PyArgumentList
@@ -255,13 +259,13 @@ def test_execute_questionnaire(run, qtbot):
     assert run.Stack.count() == 1
     cb_cnt = 1
     for child in run.Stack.currentWidget().children():
-        if type(child) == QCheckBox:
-            for i in range(cb_cnt):
+        if isinstance(child, QCheckBox):
+            for _ in range(cb_cnt):
                 child.click()
             cb_cnt += 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
 
     results = []
     with open('./test/results/results_cb.csv', mode='r') as file:
@@ -270,13 +274,14 @@ def test_execute_questionnaire(run, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 6
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == 'True'  # first box checked
-    assert lines[2] == 'False'  # second box not checked
-    assert lines[3] == 'True'  # third box checked
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == 'True'  # first box checked
+    assert results[2] == 'False'  # second box not checked
+    assert results[3] == 'True'  # third box checked
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
     os.remove("./test/results/results_cb.csv")
+    QTest.qWait(5000)
 
 
 # noinspection PyArgumentList
@@ -285,16 +290,16 @@ def test_execute_questionnaire_blocked(run, qtbot):
         assert run.Stack.count() == 1
         cb_cnt = 1
         for child in run.Stack.currentWidget().children():
-            if type(child) == QCheckBox:
-                for i in range(cb_cnt):
+            if isinstance(child, QCheckBox):
+                for _ in range(cb_cnt):
                     child.click()
                 cb_cnt += 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -302,17 +307,18 @@ def test_execute_questionnaire_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'cb1_0'
-                    assert lines[2] == 'cb1_1'
-                    assert lines[3] == 'cb1_2'
-                    assert lines[4] == 'Start'
-                    assert lines[5] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'cb1_0'
+                    assert results[2] == 'cb1_1'
+                    assert results[3] == 'cb1_2'
+                    assert results[4] == 'Start'
+                    assert results[5] == 'End'
         assert len(results) == 6
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == 'True'  # first cb checked
-        assert lines[2] == 'False'  # second cb not checked
-        assert lines[3] == 'True'  # third cb checked
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == 'True'  # first cb checked
+        assert results[2] == 'False'  # second cb not checked
+        assert results[3] == 'True'  # third cb checked
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
         os.remove(res_file)
+        QTest.qWait(5000)
diff --git a/test/Image_test.py b/test/Image_test.py
index 3294c3d93db9a3d8720111c395f6558639adb3ab..ecd509ea2bb5dbee4c5d21c07fd1a28ad1097f5c 100644
--- a/test/Image_test.py
+++ b/test/Image_test.py
@@ -1,6 +1,6 @@
 """Testing the behaviour of Image.py + QEditGui.py"""
 
-from context import *
+from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, QHBoxLayout, keyboard, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, Image
 
 
 @pytest.fixture
@@ -27,19 +27,19 @@ def run():
 # noinspection PyArgumentList
 def test_create(gui_init, qtbot):
     # create a page
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     # create a question
     tv.setCurrentItem(tv.topLevelItem(0).child(0))
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -52,42 +52,42 @@ def test_create(gui_init, qtbot):
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
-    QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter)
+    QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter)
     assert gui_init.gui.questiontype.currentText() == "Image"
     # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable)
     layout = gui_init.gui.edit_layout
     not_none_rows = 0
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem):
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["Image"][0].keys()
-            assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \
-                   'TextEdit' if fields_per_type["Image"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit' else fields_per_type["Image"][0][layout.itemAt(row, 0).widget().text()]
-            if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Image"][0]
+            assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \
+                   'TextEdit' if fields_per_type["Image"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit' else fields_per_type["Image"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()]
-            elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().isChecked() == default_values[
-                    layout.itemAt(row, 0).widget().text()]
-        elif type(layout.itemAt(row, 1)) == QHBoxLayout and \
-                gui_init.gui.img_layout == layout.itemAt(row, 1):
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[
+                    layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+        elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout) and \
+                gui_init.gui.img_layout == layout.itemAt(row, QFormLayout.ItemRole.FieldRole):
             not_none_rows += 1
-            assert layout.itemAt(row, 1).itemAt(1).widget().text() == default_values[
-                layout.itemAt(row, 0).widget().text()]
+            assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(1).widget().text() == default_values[
+                layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
     assert not_none_rows == len(fields_per_type["Image"][0].keys())
     assert len(gui_init.undo_stack) == 14  # 2 for creating page & question, 12 for choosing Image
 
@@ -102,7 +102,7 @@ def test_create(gui_init, qtbot):
             structure["Page 1"][key] = value
     structure["Page 1"]["Question 1"] = {"type": "Image"}
     for key, value in default_values.items():
-        if key in fields_per_type["Image"][0].keys():
+        if key in fields_per_type["Image"][0]:
             structure["Page 1"]["Question 1"][key] = value
     listify(gui_init.structure)
     listify(structure)
@@ -133,8 +133,8 @@ def test_create(gui_init, qtbot):
 def test_file(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(1))  # should be 'Image'
@@ -142,9 +142,9 @@ def test_file(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Image"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     img_str = find_row_by_label(gui_load.gui.edit_layout, 'image_file')
-    imgfile = gui_load.gui.edit_layout.itemAt(img_str[0], 1).itemAt(img_str[1]).widget().text()
+    imgfile = gui_load.gui.edit_layout.itemAt(img_str[0], QFormLayout.ItemRole.FieldRole).itemAt(img_str[1]).widget().text()
     assert imgfile == './src/Configs/Logo.png'
 
     def handle_file_chooser():
@@ -152,11 +152,11 @@ def test_file(gui_load, qtbot):
         keyboard.write("Logo.png")
         keyboard.press("enter")
 
-    img_btn = gui_load.gui.edit_layout.itemAt(find_row_by_label(gui_load.gui.edit_layout, 'image_file_btn')[0], 1).itemAt(0).widget()
+    img_btn = gui_load.gui.edit_layout.itemAt(find_row_by_label(gui_load.gui.edit_layout, 'image_file_btn')[0], QFormLayout.ItemRole.FieldRole).itemAt(0).widget()
     QTimer.singleShot(100, handle_file_chooser)
     QTest.mouseClick(img_btn, Qt.MouseButton.LeftButton)
 
-    imgfile = gui_load.gui.edit_layout.itemAt(img_str[0], 1).itemAt(img_str[1]).widget().text()
+    imgfile = gui_load.gui.edit_layout.itemAt(img_str[0], QFormLayout.ItemRole.FieldRole).itemAt(img_str[1]).widget().text()
     assert imgfile.endswith("Logo.png")
 
     QTimer.singleShot(150, handle_dialog_no_save)
@@ -167,8 +167,8 @@ def test_file(gui_load, qtbot):
 def test_scale(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(1))  # should be 'Image'
@@ -176,111 +176,113 @@ def test_scale(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Image"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     width_pos = find_row_by_label(gui_load.gui.edit_layout, 'width')
     height_pos = find_row_by_label(gui_load.gui.edit_layout, 'height')
 
-    gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().insert("99")
-    assert gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().text() == "99"
-    gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().insert("99")
+    assert gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99"
+    gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Image"]["width"] == "99"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().text() == "99"
+    assert gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99"
     assert gui_load.structure["Page 1"]["Image"]["width"] == "99"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().insert("99")
-    assert gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().text() == "99"
-    gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().editingFinished.emit()
+    assert not error_found
+    assert not warning_found
+    gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().insert("99")
+    assert gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99"
+    gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Image"]["height"] == "99"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().text() == "99"
+    assert gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99"
     assert gui_load.structure["Page 1"]["Image"]["height"] == "99"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
     test_gui = StackedWindowGui("./test/imgtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Image:
+        if isinstance(child, Image):
             assert child.width() == 99
             assert child.height() == 99
     test_gui.close()
 
     #  -------- -1 ---------
-    gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().insert("-1")
-    assert gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().text() == "-1"
-    gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().insert("-1")
+    assert gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1"
+    gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Image"]["width"] == "-1"
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().text() == "-1"
+    assert gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1"
     assert gui_load.structure["Page 1"]["Image"]["width"] == "-1"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
-    gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().insert("-1")
-    assert gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().text() == "-1"
-    gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().editingFinished.emit()
+    assert error_found
+    assert not warning_found
+    gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().insert("-1")
+    assert gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1"
+    gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Image"]["height"] == "-1"
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().text() == "-1"
+    assert gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1"
     assert gui_load.structure["Page 1"]["Image"]["height"] == "-1"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     #  ---------0--------
-    gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().insert("0")
-    assert gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().text() == "0"
-    gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0")
+    assert gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
+    gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Image"]["width"] == "0"
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(width_pos, 1).widget().text() == "0"
+    assert gui_load.gui.edit_layout.itemAt(width_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
     assert gui_load.structure["Page 1"]["Image"]["width"] == "0"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
-    gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().insert("0")
-    assert gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().text() == "0"
-    gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().editingFinished.emit()
+    assert error_found
+    assert not warning_found
+    gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0")
+    assert gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
+    gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Image"]["height"] == "0"
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(height_pos, 1).widget().text() == "0"
+    assert gui_load.gui.edit_layout.itemAt(height_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
     assert gui_load.structure["Page 1"]["Image"]["height"] == "0"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     gui_load.structure["Page 1"]["Image"]["height"] = 100
     gui_load.structure["Page 1"]["Image"]["width"] = 250
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
     gui_load.close()
     os.remove("./test/results/results_img.csv")
 
@@ -289,8 +291,8 @@ def test_scale(gui_load, qtbot):
 def test_move(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(1))  # should be 'Image'
@@ -298,109 +300,111 @@ def test_move(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Image"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     x_pos = find_row_by_label(gui_load.gui.edit_layout, 'x_pos')
     y_pos = find_row_by_label(gui_load.gui.edit_layout, 'y_pos')
 
-    gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().clear()
-    gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().insert("99")
-    assert gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().text() == "99"
-    gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().clear()
+    gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().insert("99")
+    assert gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().text() == "99"
+    gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Image"]["x_pos"] == "99"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().text() == "99"
+    assert gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().text() == "99"
     assert gui_load.structure["Page 1"]["Image"]["x_pos"] == "99"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().clear()
-    gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().insert("99")
-    assert gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().text() == "99"
-    gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().editingFinished.emit()
+    assert not error_found
+    assert not warning_found
+    gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().clear()
+    gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().insert("99")
+    assert gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().text() == "99"
+    gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Image"]["y_pos"] == "99"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().text() == "99"
+    assert gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().text() == "99"
     assert gui_load.structure["Page 1"]["Image"]["y_pos"] == "99"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
     test_gui = StackedWindowGui("./test/imgtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Image:
+        if isinstance(child, Image):
             assert child.x() == 99
             assert child.y() == 99
     test_gui.close()
 
     #  -------- -1 ---------
-    gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().clear()
-    gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().insert("-1")
-    assert gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().text() == "-1"
-    gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().clear()
+    gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().insert("-1")
+    assert gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().text() == "-1"
+    gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Image"]["x_pos"] == "-1"
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().text() == "-1"
+    assert gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().text() == "-1"
     assert gui_load.structure["Page 1"]["Image"]["x_pos"] == "-1"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
-    gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().clear()
-    gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().insert("-1")
-    assert gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().text() == "-1"
-    gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().editingFinished.emit()
+    assert error_found
+    assert not warning_found
+    gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().clear()
+    gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().insert("-1")
+    assert gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().text() == "-1"
+    gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Image"]["y_pos"] == "-1"
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().text() == "-1"
+    assert gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().text() == "-1"
     assert gui_load.structure["Page 1"]["Image"]["y_pos"] == "-1"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     #  ---------0--------
-    gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().clear()
-    gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().insert("0")
-    assert gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().text() == "0"
-    gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().clear()
+    gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().insert("0")
+    assert gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().text() == "0"
+    gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Image"]["x_pos"] == "0"
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(x_pos[0], 1).itemAt(x_pos[1]).widget().text() == "0"
+    assert gui_load.gui.edit_layout.itemAt(x_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(x_pos[1]).widget().text() == "0"
     assert gui_load.structure["Page 1"]["Image"]["x_pos"] == "0"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
-    gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().clear()
-    gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().insert("0")
-    assert gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().text() == "0"
-    gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().editingFinished.emit()
+    assert error_found
+    assert not warning_found
+    gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().clear()
+    gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().insert("0")
+    assert gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().text() == "0"
+    gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Image"]["y_pos"] == "0"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(y_pos[0], 1).itemAt(y_pos[1]).widget().text() == "0"
+    assert gui_load.gui.edit_layout.itemAt(y_pos[0], QFormLayout.ItemRole.FieldRole).itemAt(y_pos[1]).widget().text() == "0"
     assert gui_load.structure["Page 1"]["Image"]["y_pos"] == "0"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
     gui_load.structure["Page 1"]["Image"]["x_pos"] = 1800
     gui_load.structure["Page 1"]["Image"]["y_pos"] = 400
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
     gui_load.close()
     os.remove("./test/results/results_img.csv")
 
@@ -409,8 +413,8 @@ def test_move(gui_load, qtbot):
 def test_image_position(gui_load, qtbot, capfd):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(1))  # should be 'Image'
@@ -418,126 +422,125 @@ def test_image_position(gui_load, qtbot, capfd):
     assert tv.selectedItems()[0].text(0) == "Image"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
 
     # --- free ---
     pos_pos = find_row_by_label(gui_load.gui.edit_layout, 'image_position')
-    pos_cb = gui_load.gui.edit_layout.itemAt(pos_pos, 1).widget()
+    pos_cb = gui_load.gui.edit_layout.itemAt(pos_pos, QFormLayout.ItemRole.FieldRole).widget()
     assert pos_cb.currentText() == 'free'
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/imgtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Image:
+        if isinstance(child, Image):
             assert child.x() == 1800
             assert child.y() == 400
     test_gui.close()
 
     # --- right ---
-    QTest.mouseClick(pos_cb, Qt.LeftButton)
-    QTest.keyClick(pos_cb, Qt.Key_Up)
-    QTest.keyClick(pos_cb, Qt.Key_Enter)
+    QTest.mouseClick(pos_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Up)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Enter)
     assert pos_cb.currentText() == "right"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Image"]["image_position"] == "right"
     gui_load.save()
     test_gui = StackedWindowGui("./test/imgtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Image:
-            assert type(child.parent().layout()) == QHBoxLayout
-            print(child.parent().children())
+        if isinstance(child, Image):
+            assert isinstance(child.parent().layout(), QHBoxLayout)
             assert child.parent().layout().indexOf(child) == 1
     test_gui.close()
 
     # --- left ---
-    QTest.mouseClick(pos_cb, Qt.LeftButton)
-    QTest.keyClick(pos_cb, Qt.Key_Up)
-    QTest.keyClick(pos_cb, Qt.Key_Enter)
+    QTest.mouseClick(pos_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Up)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Enter)
     assert pos_cb.currentText() == "left"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Image"]["image_position"] == "left"
     gui_load.save()
     test_gui = StackedWindowGui("./test/imgtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Image:
-            assert type(child.parent().layout()) == QHBoxLayout
+        if isinstance(child, Image):
+            assert isinstance(child.parent().layout(), QHBoxLayout)
             assert child.parent().layout().indexOf(child) == 0
     test_gui.close()
 
     # --- bottom ---
-    QTest.mouseClick(pos_cb, Qt.LeftButton)
-    QTest.keyClick(pos_cb, Qt.Key_Up)
-    QTest.keyClick(pos_cb, Qt.Key_Enter)
+    QTest.mouseClick(pos_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Up)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Enter)
     assert pos_cb.currentText() == "bottom"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Image"]["image_position"] == "bottom"
     gui_load.save()
     test_gui = StackedWindowGui("./test/imgtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Image:
-            assert type(child.parent().layout()) == QFormLayout
+        if isinstance(child, Image):
+            assert isinstance(child.parent().layout(), QFormLayout)
             assert child.parent().layout().getWidgetPosition(child)[0] == len(gui_load.structure["Page 1"].sections) - 1
 
     # --- top ---
-    QTest.mouseClick(pos_cb, Qt.LeftButton)
-    QTest.keyClick(pos_cb, Qt.Key_Up)
-    QTest.keyClick(pos_cb, Qt.Key_Enter)
+    QTest.mouseClick(pos_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Up)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Enter)
     assert pos_cb.currentText() == "top"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Image"]["image_position"] == "top"
     gui_load.save()
     test_gui = StackedWindowGui("./test/imgtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Image:
-            assert type(child.parent().layout()) == QFormLayout
+        if isinstance(child, Image):
+            assert isinstance(child.parent().layout(), QFormLayout)
             assert child.parent().layout().getWidgetPosition(child)[0] == 0
     test_gui.close()
 
     # --- here ---
-    QTest.mouseClick(pos_cb, Qt.LeftButton)
-    QTest.keyClick(pos_cb, Qt.Key_Up)
-    QTest.keyClick(pos_cb, Qt.Key_Enter)
+    QTest.mouseClick(pos_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Up)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Enter)
     assert pos_cb.currentText() == "here"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Image"]["image_position"] == "here"
     gui_load.save()
     test_gui = StackedWindowGui("./test/imgtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Image:
-            assert type(child.parent().layout()) == QFormLayout
+        if isinstance(child, Image):
+            assert isinstance(child.parent().layout(), QFormLayout)
             assert child.parent().layout().getWidgetPosition(child)[0] == gui_load.structure["Page 1"].sections.index("Image")
     test_gui.close()
 
-    QTest.mouseClick(pos_cb, Qt.LeftButton)
-    QTest.keyClick(pos_cb, Qt.Key_Down)
-    QTest.keyClick(pos_cb, Qt.Key_Down)
-    QTest.keyClick(pos_cb, Qt.Key_Down)
-    QTest.keyClick(pos_cb, Qt.Key_Down)
-    QTest.keyClick(pos_cb, Qt.Key_Down)
-    QTest.keyClick(pos_cb, Qt.Key_Enter)
+    QTest.mouseClick(pos_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Down)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Down)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Down)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Down)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Down)
+    QTest.keyClick(pos_cb, Qt.Key.Key_Enter)
     assert pos_cb.currentText() == 'free'
     gui_load.structure["Page 1"]["Image"]["x_pos"] = 1800
     gui_load.structure["Page 1"]["Image"]["y_pos"] = 400
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     gui_load.save()
     os.remove("./test/results/results_img.csv")
     gui_load.close()
@@ -547,13 +550,13 @@ def test_image_position(gui_load, qtbot, capfd):
 def test_execute_questionnaire_no_interaction(run, qtbot):
     assert run.Stack.count() == 1
     for child in run.Stack.currentWidget().children():
-        if type(child) == Image:
+        if isinstance(child, Image):
             assert child.width() == 250
             assert child.height() == 100
             assert child.x() == 1800
             assert child.y() == 400
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_img.csv', mode='r') as file:
@@ -562,13 +565,13 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'Start'
-                assert lines[2] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'Start'
+                assert results[2] == 'End'
     assert len(results) == 3
-    assert lines[0] == '1'  # participant number
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[1])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[1])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
     os.remove("./test/results/results_img.csv")
 
 
@@ -577,11 +580,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
     with mock_file(r'./test/results/results_img.csv'):
         assert run.Stack.count() == 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -589,11 +592,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'Start'
-                    assert lines[2] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'Start'
+                    assert results[2] == 'End'
         assert len(results) == 3
-        assert lines[0] == '-1'  # participant number unknown
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[1])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[1])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
         os.remove(res_file)
diff --git a/test/MockReceiver.py b/test/MockReceiver.py
index ec304e65d4e919c2a2ff8393768a34d5cef6f176..059452a1ecbd13ec1961ca60f05290eb889c5618 100644
--- a/test/MockReceiver.py
+++ b/test/MockReceiver.py
@@ -33,6 +33,7 @@ class MockReceiver(Thread):
 
     def message_handler(self, addr, args):
         """Handle the received OSC messages"""
+        # print("message received....",addr, args)
         if addr == "/play":
             self.message_stack.append(("/stop", 0.0))
             self.message_stack.append((addr, 1.0))
@@ -59,6 +60,7 @@ class MockReceiver(Thread):
             self.message_stack.append(("/track/4/mute", 1.0))
         else:
             self.message_stack.append((addr, args))
+        # print("Message stack afterwards.....", self.message_stack)
 
     def start_server(self, port):
         """Start OSC listener."""
@@ -69,5 +71,5 @@ class MockReceiver(Thread):
             self.server = osc_server.ThreadingOSCUDPServer(('127.0.0.1', port), dispat)
         except Exception as e:
             print(e)
-        print("Serving on {}".format(self.server.server_address))
+        print(f'Serving on {self.server.server_address}')
         self.server.serve_forever()
diff --git a/test/Mushra_test.py b/test/Mushra_test.py
index ec067ba5ee38b785634addbb1431c93ff36f719f..b98cf3eda6bbfd3701ca4c80531ee28c7b9e8ccf 100644
--- a/test/Mushra_test.py
+++ b/test/Mushra_test.py
@@ -1,7 +1,7 @@
 """Testing the behaviour of MUSHRA.py + QEditGui.py"""
-
-from context import *
-thread = None
+import time
+from context import pytest, MUSHRA, QPoint, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, handle_dialog, csv, re, os, mock_file, MockReceiver, QHBoxLayout
+THREAD = None
 
 
 @pytest.fixture
@@ -21,25 +21,25 @@ def gui_load(gui_init):
 
 def prepare_listeners(structure):
     """Set up the listeners for Reaper"""
-    global thread
+    global THREAD
     print("setting up thread....")
-    thread = MockReceiver(int(structure["audio_port"]))
+    THREAD = MockReceiver(int(structure["audio_port"]))
     QTest.qWait(1000)
-    thread.start()
+    THREAD.start()
     QTest.qWait(3000)
 
 
 @pytest.fixture
 def run():
     """Execute the questionnaire."""
-    global thread
+    global THREAD
     structure = ConfigObj("./test/osctest.txt")
     port = int(structure["Page 1"]["Question 1"]["receiver"][1])
     print("setting up thread....")
     # if thread is None or (thread is not None and thread.port != port):
-    thread = MockReceiver(port)
+    THREAD = MockReceiver(port)
     QTest.qWait(1000)
-    thread.start()
+    THREAD.start()
     QTest.qWait(1000)
     # elif thread is not None and not thread.is_alive():
     #    thread.start()
@@ -64,29 +64,29 @@ def find_row_by_label(layout, label):
         row of the field
     """
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem and layout.itemAt(row, 0).widget().text() == label:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() == label:
             return row
-        elif type(layout.itemAt(row, 1)) == QHBoxLayout:
-            if layout.itemAt(row, 0).widget().text() == label:
+        elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout):
+            if layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() == label:
                 return row
 
 
 # noinspection PyArgumentList
 def test_create(gui_init, qtbot):
     # create a page
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(200, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     # create a question
     tv.setCurrentItem(tv.topLevelItem(0).child(0))
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(200, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -99,36 +99,36 @@ def test_create(gui_init, qtbot):
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
-    QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter)
+    QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter)
     assert gui_init.gui.questiontype.currentText() == "MUSHRA"
     # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable)
     layout = gui_init.gui.edit_layout
     not_none_rows = 0
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem):
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["MUSHRA"][0].keys()
-            assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \
-                   'TextEdit' if fields_per_type["MUSHRA"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\
-                   else fields_per_type["MUSHRA"][0][layout.itemAt(row, 0).widget().text()]
-            if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["MUSHRA"][0]
+            assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \
+                   'TextEdit' if fields_per_type["MUSHRA"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\
+                   else fields_per_type["MUSHRA"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()]
-            elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().isChecked() == default_values[
-                    layout.itemAt(row, 0).widget().text()]
-        elif type(layout.itemAt(row, 1)) == QHBoxLayout:
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[
+                    layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+        elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout):
             not_none_rows += 1
-            for cbs in range(layout.itemAt(row, 1).count()):
-                assert layout.itemAt(row, 1).itemAt(cbs).widget().isChecked() == True
+            for cbs in range(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).count()):
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(cbs).widget().isChecked()
 
     assert not_none_rows == len(fields_per_type["MUSHRA"][0].keys())
     assert len(gui_init.undo_stack) == 8  # 2 for creating page & question, 6 for choosing MUSHRA
@@ -144,7 +144,7 @@ def test_create(gui_init, qtbot):
             structure["Page 1"][key] = value
     structure["Page 1"]["Question 1"] = {"type": "MUSHRA"}
     for key, value in default_values.items():
-        if key in fields_per_type["MUSHRA"][0].keys():
+        if key in fields_per_type["MUSHRA"][0]:
             structure["Page 1"]["Question 1"][key] = value
     listify(gui_init.structure)
     listify(structure)
@@ -174,8 +174,8 @@ def test_create(gui_init, qtbot):
 def test_start_cues(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -183,51 +183,52 @@ def test_start_cues(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     sc_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_cues')
 
     # try to set it as string
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("one")
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "one"
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one")
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one"
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "one"
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "one"
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one"
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "one"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # set it as list shorter than end_cues
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1,2")
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1,2"
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,2")
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2"
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1,2"
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1,2"
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2"
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == (1, 2)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True  # len(start_cues)==2, len(end_cues)==3
-    assert warning_found == False
-    QTimer.singleShot(150, handle_dialog_no_save)
+    assert error_found  # len(start_cues)==2, len(end_cues)==3
+    assert not warning_found
+    gui_load.structure["Page 1"]["Question 1"]["start_cues"] = [1, 2, 3]
+    gui_load.save()
     gui_load.close()
 
 
 def test_end_cues(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -235,7 +236,7 @@ def test_end_cues(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
 
     # try to set it as string
     gui_load.structure["Page 1"]["Question 1"]["end_cues"] = "one"
@@ -246,8 +247,8 @@ def test_end_cues(gui_load, qtbot):
     assert gui_load.structure["Page 1"]["Question 1"]["end_cues"] == "one"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # try to set it as list shorter than start_cues
     gui_load.structure["Page 1"]["Question 1"]["end_cues"] = "1,2"
@@ -258,15 +259,15 @@ def test_end_cues(gui_load, qtbot):
     assert gui_load.structure["Page 1"]["Question 1"]["end_cues"] == (1, 2)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # try to set it same as start_cues
     end_pos = find_row_by_label(gui_load.gui.edit_layout, 'end_cues')
-    gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().setText("5, 2, 6")
-    assert gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().text() == "5, 2, 6"
-    gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().setText("5, 2, 6")
+    assert gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "5, 2, 6"
+    gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     gui_load.structure["Page 1"]["Question 1"]["end_cues"] = "5, 2, 6"
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.load_preview()
@@ -275,17 +276,19 @@ def test_end_cues(gui_load, qtbot):
     assert gui_load.structure["Page 1"]["Question 1"]["end_cues"] == (5, 2, 6)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
-    QTimer.singleShot(150, handle_dialog_no_save)
+    assert error_found
+    assert not warning_found
+    
+    gui_load.structure["Page 1"]["Question 1"]["end_cues"] = (4, 5, 6)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     gui_load.close()
 
 
 def test_track(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -293,88 +296,90 @@ def test_track(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     track_pos = find_row_by_label(gui_load.gui.edit_layout, 'track')
 
     # try to set it as string
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("one")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "one"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "one"
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "one"
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one"
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "one"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # set it as list (shouldn't work as audio_tracks = 4 by default)
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1,2,3,4,5")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,2,3,4,5"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,2,3,4,5")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2,3,4,5"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1,2,3,4,5"
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,2,3,4,5"
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2,3,4,5"
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == [1, 2, 3, 4, 5]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
     # but it works when audio_tracks is >= max(track)
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1,2,3")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,2,3"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,2,3")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2,3"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1,2,3"
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,2,3"
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2,3"
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == [1, 2, 3]
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
     # only one -> all the same track
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1"
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1"
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == '1'
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
     # len(start/end_cues)>len(track)>1 -> error
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1,1")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,1"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,1")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,1"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1,1"
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,1"
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,1"
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == [1, 1]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
-    QTimer.singleShot(150, handle_dialog_no_save)
+    assert error_found
+    assert not warning_found
+    
+    gui_load.structure["Page 1"]["Question 1"]["track"] = [1, 1, 1]
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     gui_load.close()
 
 
@@ -385,8 +390,8 @@ def test_xfade(gui_load, qtbot):
 
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -394,133 +399,130 @@ def test_xfade(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center(), delay=1)
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center(), delay=1000)
     x_pos = find_row_by_label(gui_load.gui.edit_layout, 'xfade')
     start_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_cues')
     end_pos = find_row_by_label(gui_load.gui.edit_layout, 'end_cues')
     track_pos = find_row_by_label(gui_load.gui.edit_layout, 'track')
 
     # set xfade to true
-    assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == False
-    gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == True
-    assert gui_load.structure["Page 1"]["Question 1"]["xfade"] == True
+    assert not gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert gui_load.structure["Page 1"]["Question 1"]["xfade"]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True  # start and end need to be the same for all cues
-    assert warning_found == False
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().setText("1,1,1")
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "1,1,1"
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit()
+    assert error_found  # start and end need to be the same for all cues
+    assert not warning_found
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,1,1")
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,1,1"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1,1,1"
-    gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().setText("2,2,2")
-    assert gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().text() == "2,2,2"
-    gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().setText("2,2,2")
+    assert gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "2,2,2"
+    gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["end_cues"] == "2,2,2"
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.refresh_button.click()
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True  # need to change tracks from all 1
-    assert warning_found == False
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1,1,2")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,1,2"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    assert error_found  # need to change tracks from all 1
+    assert not warning_found
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,1,2")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,1,2"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1,1,2"
     gui_load.gui.refresh_button.click()
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=1)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners(ConfigObj("./test/mrtest.txt"))
     test_gui = StackedWindowGui("./test/mrtest.txt")
     assert test_gui.Stack.count() == 1
-    assert thread.message_stack[-1] == ("/action", MUSHRA.loop_off_command)
+    time.sleep(1)
+    assert THREAD.message_stack[-1] == ("/action", MUSHRA.loop_off_command)
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == MUSHRA:
-            assert child.loop_button.isEnabled() == True
-            assert child.loop_button.isChecked() == False
-            assert child.xfade.isEnabled() == True
-            assert child.xfade.isChecked() == False
-            assert child.pause_button.isEnabled() == False
-            assert child.stop_button.isEnabled() == False
+        if isinstance(child, MUSHRA):
+            assert child.loop_button.isEnabled()
+            assert not child.loop_button.isChecked()
+            assert child.xfade.isEnabled()
+            assert not child.xfade.isChecked()
+            assert not child.pause_button.isEnabled()
+            assert not child.stop_button.isEnabled()
             child.refbutton.click()
-            QTest.qWait(2000)
-            print(thread.message_stack)
-            assert thread.message_stack[-6] == ('/track/1/mute', 0.0)
-            assert thread.message_stack[-3] == ("/action", 40161)
-            assert thread.message_stack[-1] == ("/play", 1.0)
-            assert thread.message_stack[-2] == ("/stop", 0.0)
-            assert child.loop_button.isEnabled() == False
-            assert child.loop_button.isChecked() == False
+            time.sleep(5)
+            assert THREAD.message_stack[-6] == ('/track/1/mute', 0.0)
+            assert THREAD.message_stack[-3] == ("/action", 40161)
+            assert THREAD.message_stack[-1] == ("/play", 1.0)
+            assert THREAD.message_stack[-2] == ("/stop", 0.0)
+            assert not child.loop_button.isEnabled()
+            assert not child.loop_button.isChecked()
             child.stop_button.click()
-            QTest.qWait(2000)
-            assert thread.message_stack[-1] == ("/play", 0.0)
-            assert thread.message_stack[-2] == ("/stop", 1.0)
-            assert child.loop_button.isEnabled() == True
-            assert child.loop_button.isChecked() == False
+            time.sleep(5)
+            assert THREAD.message_stack[-1] == ("/play", 0.0)
+            assert THREAD.message_stack[-2] == ("/stop", 1.0)
+            assert child.loop_button.isEnabled()
+            assert not child.loop_button.isChecked()
             child.loop_button.click()
-            QTest.qWait(2000)
-            assert thread.message_stack[-1] == ('/action', '_RSa8eee394f75b27ef6bb9f0e15b6bee26d9363990')
-            assert child.loop_button.isEnabled() == True
-            assert child.loop_button.isChecked() == True
-            for sl in range(len(child.buttons)):
-                child.buttons[sl].click()  # starts each stimulus
-                assert child.loop_button.isEnabled() == False
-                assert child.loop_button.isChecked() == True
-                QTest.qWait(2000)
-                print(thread.message_stack)
-                assert thread.message_stack[-9] == ('/track/{}/mute'.format(sl+1), 0.0)
-                assert thread.message_stack[-6] == ("/action", 40162)
-                assert thread.message_stack[-5] == ("/action", 40223)
-                assert thread.message_stack[-4] == ("/action", 40161)
-                assert thread.message_stack[-3] == ("/action", 40222)
-                assert thread.message_stack[-1] == ("/play", 1.0)
-                assert thread.message_stack[-2] == ("/stop", 0.0)
+            time.sleep(5)
+            assert THREAD.message_stack[-1] == ('/action', MUSHRA.loop_on_command)
+            assert child.loop_button.isEnabled()
+            assert child.loop_button.isChecked()
+            for sl, btn in enumerate(child.buttons):
+                btn.click()  # starts each stimulus
+                assert not child.loop_button.isEnabled()
+                assert child.loop_button.isChecked()
+                time.sleep(5)
+                assert THREAD.message_stack[-9] == (f'/track/{sl + 1}/mute', 0.0)
+                assert THREAD.message_stack[-6] == ("/action", 40162)
+                assert THREAD.message_stack[-5] == ("/action", 40223)
+                assert THREAD.message_stack[-4] == ("/action", 40161)
+                assert THREAD.message_stack[-3] == ("/action", 40222)
+                assert THREAD.message_stack[-1] == ("/play", 1.0)
+                assert THREAD.message_stack[-2] == ("/stop", 0.0)
                 bb = child.sliders[sl].rect()
-                QTest.mouseClick(child.sliders[sl], Qt.LeftButton, pos=QPoint(bb.center().x(), int(
-                            bb.bottom() - 0.1 * (sl + 1) * bb.bottom())))
+                QTest.mouseClick(child.sliders[sl], Qt.MouseButton.LeftButton, pos=QPoint(bb.center().x(), int(bb.bottom() - 0.1 * (sl + 1) * bb.bottom())))
             child.stop_button.click()
-            assert child.loop_button.isEnabled() == True
-            assert child.loop_button.isChecked() == True
+            assert child.loop_button.isEnabled()
+            assert child.loop_button.isChecked()
             child.loop_button.click()
-            assert child.loop_button.isEnabled() == True
-            assert child.loop_button.isChecked() == False
-            print(thread.message_stack)
+            assert child.loop_button.isEnabled()
+            assert not child.loop_button.isChecked()
     test_gui.close()
-    thread.stop(0.1)
+    THREAD.stop(0.1)
     QTest.qWait(1000)
 
     # reset file
-    assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == True
-    gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(x_pos, 1).widget().isChecked() == False
-    assert gui_load.structure["Page 1"]["Question 1"]["xfade"] == False
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().setText("1,2,3")
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "1,2,3"
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert not gui_load.gui.edit_layout.itemAt(x_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert not gui_load.structure["Page 1"]["Question 1"]["xfade"]
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,2,3")
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2,3"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cues"] == "1,2,3"
-    gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().setText("4,5,6")
-    assert gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().text() == "4,5,6"
-    gui_load.gui.edit_layout.itemAt(end_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().setText("4,5,6")
+    assert gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "4,5,6"
+    gui_load.gui.edit_layout.itemAt(end_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["end_cues"] == "4,5,6"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().setText("1,1,1")
-    assert gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().text() == "1,1,1"
-    gui_load.gui.edit_layout.itemAt(track_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,1,1")
+    assert gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,1,1"
+    gui_load.gui.edit_layout.itemAt(track_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["track"] == "1,1,1"
     gui_load.gui.refresh_button.click()
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=1)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
 
     os.remove("./test/results/results_mr.csv")
     gui_load.close()
@@ -529,10 +531,10 @@ def test_xfade(gui_load, qtbot):
 # noinspection PyArgumentList
 def test_execute_questionnaire_no_interaction(run, qtbot):
     assert run.Stack.count() == 1
-    assert thread.message_stack[-1] == ("/action", MUSHRA.loop_off_command)
+    assert THREAD.message_stack[-1] == ("/action", MUSHRA.loop_off_command)
 
     QTimer.singleShot(200, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_mr.csv', mode='r') as file:
@@ -541,21 +543,21 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'mr'
-                assert lines[2] == 'mr_1'
-                assert lines[3] == 'mr_2'
-                assert lines[4] == 'Start'
-                assert lines[5] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'mr'
+                assert results[2] == 'mr_1'
+                assert results[3] == 'mr_2'
+                assert results[4] == 'Start'
+                assert results[5] == 'End'
     assert len(results) == 6
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '[[], [], []]'  # no stimulus played yet
-    assert lines[2] == '100'  # default slider value
-    assert lines[3] == '100'  # default slider value
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '[[], [], []]'  # no stimulus played yet
+    assert results[2] == '100'  # default slider value
+    assert results[3] == '100'  # default slider value
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
     os.remove("./test/results/results_mr.csv")
-    thread.stop(0.1)
+    THREAD.stop(0.1)
     QTest.qWait(1000)
 
 
@@ -563,13 +565,13 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
 def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
     with mock_file(r'./test/results/results_mr.csv'):
         assert run.Stack.count() == 1
-        assert thread.message_stack[-1] == ("/action", MUSHRA.loop_off_command)
+        assert THREAD.message_stack[-1] == ("/action", MUSHRA.loop_off_command)
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -577,21 +579,21 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'mr'
-                    assert lines[2] == 'mr_1'
-                    assert lines[3] == 'mr_2'
-                    assert lines[4] == 'Start'
-                    assert lines[5] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'mr'
+                    assert results[2] == 'mr_1'
+                    assert results[3] == 'mr_2'
+                    assert results[4] == 'Start'
+                    assert results[5] == 'End'
         assert len(results) == 6
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == '[[], [], []]'  # no stimulus played yet
-        assert lines[2] == '100'  # default slider value
-        assert lines[3] == '100'  # default slider value
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == '[[], [], []]'  # no stimulus played yet
+        assert results[2] == '100'  # default slider value
+        assert results[3] == '100'  # default slider value
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
         os.remove(res_file)
-        thread.stop(0.1)
+        THREAD.stop(0.1)
         QTest.qWait(1000)
 
 
@@ -600,23 +602,23 @@ def test_execute_questionnaire(run, qtbot):
     if os.path.exists("./test/results/results_mr.csv"):
         os.remove("./test/results/results_mr.csv")
     assert run.Stack.count() == 1
-    assert thread.message_stack[-1] == ("/action", MUSHRA.loop_off_command)
+    assert THREAD.message_stack[-1] == ("/action", MUSHRA.loop_off_command)
     for child in run.Stack.currentWidget().children():
-        if type(child) == MUSHRA:
-            assert child.conditionsUseSameMarker == False
-            assert hasattr(child, 'xfade') == False
-            assert child.playing == False
+        if isinstance(child, MUSHRA):
+            assert not child.conditionsUseSameMarker
+            assert not hasattr(child, 'xfade')
+            assert not child.playing
             child.refbutton.click()
             for sl in range(len(child.buttons)):
-                assert child.sliders[sl].isEnabled() == False
-            for sl in range(len(child.buttons)):
-                child.buttons[sl].click()  # starts each stimulus
+                assert not child.sliders[sl].isEnabled()
+            for sl, btn in enumerate(child.buttons):
+                btn.click()  # starts each stimulus
                 QTest.qWait(500)
                 bb = child.sliders[sl].rect()
-                QTest.mouseClick(child.sliders[sl], Qt.LeftButton, pos=QPoint(bb.center().x(), int(bb.bottom()-0.1*(sl+1)*bb.bottom())))
+                QTest.mouseClick(child.sliders[sl], Qt.MouseButton.LeftButton, pos=QPoint(bb.center().x(), int(bb.bottom() - 0.1 * (sl + 1) * bb.bottom())))
 
     QTimer.singleShot(200, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
 
     results = []
     with open('./test/results/results_mr.csv', mode='r') as file:
@@ -625,13 +627,13 @@ def test_execute_questionnaire(run, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 6
-    assert lines[0] == '1'  # participant number
-    assert re.match(r'\[\[\d.\d+], \[\d.\d+], \[\d.\d+]]', lines[1])  # list of durations
-    assert int(lines[2]) < int(lines[3])
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert re.match(r'\[\[\d.\d+], \[\d.\d+], \[\d.\d+]]', results[1])  # list of durations
+    assert int(results[2]) < int(results[3])
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
     os.remove("./test/results/results_mr.csv")
-    thread.stop(0.1)
+    THREAD.stop(0.1)
     QTest.qWait(1000)
 
 
@@ -639,27 +641,26 @@ def test_execute_questionnaire(run, qtbot):
 def test_execute_questionnaire_blocked(run, qtbot):
     with mock_file(r'./test/results/results_mr.csv'):
         assert run.Stack.count() == 1
-        assert thread.message_stack[-1] == ("/action", MUSHRA.loop_off_command)
+        assert THREAD.message_stack[-1] == ("/action", MUSHRA.loop_off_command)
         for child in run.Stack.currentWidget().children():
-            if type(child) == MUSHRA:
-                assert child.conditionsUseSameMarker == False
-                assert hasattr(child, 'xfade') == False
-                assert child.playing == False
+            if isinstance(child, MUSHRA):
+                assert not child.conditionsUseSameMarker
+                assert not hasattr(child, 'xfade')
+                assert not child.playing
                 child.refbutton.click()
                 for sl in range(len(child.buttons)):
-                    assert child.sliders[sl].isEnabled() == False
-                for sl in range(len(child.buttons)):
-                    child.buttons[sl].click()  # starts each stimulus
+                    assert not child.sliders[sl].isEnabled()
+                for sl, btn in enumerate(child.buttons):
+                    btn.click()  # starts each stimulus
                     QTest.qWait(500)
                     bb = child.sliders[sl].rect()
-                    QTest.mouseClick(child.sliders[sl], Qt.LeftButton,
-                                     pos=QPoint(bb.center().x(), int(bb.bottom() - 0.1 * (sl + 1) * bb.bottom())))
+                    QTest.mouseClick(child.sliders[sl], Qt.MouseButton.LeftButton, pos=QPoint(bb.center().x(), int(bb.bottom() - 0.1 * (sl + 1) * bb.bottom())))
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -667,18 +668,18 @@ def test_execute_questionnaire_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'mr'
-                    assert lines[2] == 'mr_1'
-                    assert lines[3] == 'mr_2'
-                    assert lines[4] == 'Start'
-                    assert lines[5] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'mr'
+                    assert results[2] == 'mr_1'
+                    assert results[3] == 'mr_2'
+                    assert results[4] == 'Start'
+                    assert results[5] == 'End'
         assert len(results) == 6
-        assert lines[0] == '-1'  # participant number unknown
-        assert re.match(r'\[\[\d.\d+], \[\d.\d+], \[\d.\d+]]', lines[1])  # list of durations
-        assert int(lines[2]) < int(lines[3])
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert re.match(r'\[\[\d.\d+], \[\d.\d+], \[\d.\d+]]', results[1])  # list of durations
+        assert int(results[2]) < int(results[3])
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
         os.remove(res_file)
-        thread.stop(0.1)
+        THREAD.stop(0.1)
         QTest.qWait(1000)
diff --git a/test/OSCButton_test.py b/test/OSCButton_test.py
index b3c26154d54f5fa255413be5773e63b7d6a468c9..b88b02b7c6ea6473563beb6a1b88a7509e3d3cc4 100644
--- a/test/OSCButton_test.py
+++ b/test/OSCButton_test.py
@@ -1,5 +1,5 @@
 """Testing the behaviour of OSCButton.py + QEditGui.py"""
-from context import *
+from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, OSCButton, MockReceiver, handle_dialog_warning
 thread = None
 
 
@@ -47,19 +47,19 @@ def run():
 # noinspection PyArgumentList
 def test_create(gui_init, qtbot):
     # create a page
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     # create a question
     tv.setCurrentItem(tv.topLevelItem(0).child(0))
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -72,39 +72,39 @@ def test_create(gui_init, qtbot):
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
-    QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter)
+    QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter)
     assert gui_init.gui.questiontype.currentText() == "OSCButton"
     # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable)
     layout = gui_init.gui.edit_layout
     not_none_rows = 0
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem):
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["OSCButton"][0].keys()
-            assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \
-                   'TextEdit' if fields_per_type["OSCButton"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\
-                   else fields_per_type["OSCButton"][0][layout.itemAt(row, 0).widget().text()]
-            if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["OSCButton"][0]
+            assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \
+                   'TextEdit' if fields_per_type["OSCButton"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\
+                   else fields_per_type["OSCButton"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()]
-            elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().isChecked() == default_values[
-                    layout.itemAt(row, 0).widget().text()]
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[
+                    layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
     assert not_none_rows == len(fields_per_type["OSCButton"][0].keys())
     assert len(gui_init.undo_stack) == 15  # 2 for creating page & question, 13 for choosing OSCButton
 
@@ -119,7 +119,7 @@ def test_create(gui_init, qtbot):
             structure["Page 1"][key] = value
     structure["Page 1"]["Question 1"] = {"type": "OSCButton"}
     for key, value in default_values.items():
-        if key in fields_per_type["OSCButton"][0].keys():
+        if key in fields_per_type["OSCButton"][0]:
             structure["Page 1"]["Question 1"][key] = value
     listify(gui_init.structure)
     listify(structure)
@@ -149,8 +149,8 @@ def test_create(gui_init, qtbot):
 def test_inscription(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -158,113 +158,113 @@ def test_inscription(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     ins_pos = find_row_by_label(gui_load.gui.edit_layout, 'inscription')
 
     # change text
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("Click me")
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Click me"
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("Click me")
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Click me"
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Click me"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Click me"
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Click me"
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Click me"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners("./test/osctest.txt")
     test_gui = StackedWindowGui("./test/osctest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == OSCButton:
+        if isinstance(child, OSCButton):
             assert child.button.text() == "Click me"
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     thread.stop(0.1)
     QTest.qWait(1000)
 
     #  empty inscription -> warning
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("")
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == ""
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("")
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ""
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == ""
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == ""
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ""
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == ""
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == True
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners("./test/osctest.txt")
     QTimer.singleShot(500, handle_dialog_warning)
     test_gui = StackedWindowGui("./test/osctest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == OSCButton:
+        if isinstance(child, OSCButton):
             assert child.button.text() == ""
             child.button.click()
             QTest.qWait(1000)
     QTimer.singleShot(1000, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     thread.stop(0.1)
     QTest.qWait(1000)
 
     # predefined 'None'
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("None")
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "None"
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("None")
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "None"
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "None"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "None"
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "None"
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "None"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == True
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners("./test/osctest.txt")
     QTimer.singleShot(150, handle_dialog_warning)
     test_gui = StackedWindowGui("./test/osctest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == OSCButton:
+        if isinstance(child, OSCButton):
             assert child.button.text() == "None"
             child.button.click()
             QTest.qWait(500)
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     thread.stop(0.1)
     QTest.qWait(1000)
 
     # reset file
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().setText("Send message")
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Send message"
-    gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().setText("Send message")
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Send message"
+    gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Send message"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(ins_pos, 1).widget().text() == "Send message"
+    assert gui_load.gui.edit_layout.itemAt(ins_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Send message"
     assert gui_load.structure["Page 1"]["Question 1"]["inscription"] == "Send message"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
 
     os.remove("./test/results/results_osc.csv")
     gui_load.close()
@@ -274,8 +274,8 @@ def test_inscription(gui_load, qtbot):
 def test_address(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -283,68 +283,68 @@ def test_address(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     adr_pos = find_row_by_label(gui_load.gui.edit_layout, 'address')
 
     # change text to without / -> warning
-    gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().setText("send")
-    assert gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().text() == "send"
-    gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().setText("send")
+    assert gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "send"
+    gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["address"] == "send"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().text() == "send"
+    assert gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "send"
     assert gui_load.structure["Page 1"]["Question 1"]["address"] == "send"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == True
+    assert not error_found
+    assert warning_found
     gui_load.gui.refresh_button.click()
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners("./test/osctest.txt")
     QTimer.singleShot(150, handle_dialog_warning)
     test_gui = StackedWindowGui("./test/osctest.txt")
     assert test_gui.Stack.count() == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     thread.stop(0.1)
     QTest.qWait(1000)
 
     #  empty address -> error
-    gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().setText("")
-    assert gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().text() == ""
-    gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().setText("")
+    assert gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ""
+    gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["address"] == ""
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().text() == ""
+    assert gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ""
     # assert gui_load.structure["Page 1"]["Question 1"]["address"] == "" #TODO??
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # reset file
-    gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().setText("/message")
-    assert gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().text() == "/message"
-    gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().setText("/message")
+    assert gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "/message"
+    gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["address"] == "/message"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(adr_pos, 1).widget().text() == "/message"
+    assert gui_load.gui.edit_layout.itemAt(adr_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "/message"
     assert gui_load.structure["Page 1"]["Question 1"]["address"] == "/message"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
 
     os.remove("./test/results/results_osc.csv")
     gui_load.close()
@@ -354,8 +354,8 @@ def test_address(gui_load, qtbot):
 def test_value(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -363,65 +363,65 @@ def test_value(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     val_pos = find_row_by_label(gui_load.gui.edit_layout, 'value')
 
     # change text
-    gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().setText("send")
-    assert gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().text() == "send"
-    gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().setText("send")
+    assert gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "send"
+    gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["value"] == "send"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().text() == "send"
+    assert gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "send"
     assert gui_load.structure["Page 1"]["Question 1"]["value"] == "send"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners("./test/osctest.txt")
     test_gui = StackedWindowGui("./test/osctest.txt")
     assert test_gui.Stack.count() == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     thread.stop(0.1)
     QTest.qWait(1000)
 
     #  empty value
-    gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["value"] == ""
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().text() == ""
+    assert gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ""
     # assert gui_load.structure["Page 1"]["Question 1"]["address"] == "" #TODO??
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # reset file
-    gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().setText("Hello world!")
-    assert gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().text() == "Hello world!"
-    gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().setText("Hello world!")
+    assert gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Hello world!"
+    gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["value"] == "Hello world!"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(val_pos, 1).widget().text() == "Hello world!"
+    assert gui_load.gui.edit_layout.itemAt(val_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Hello world!"
     assert gui_load.structure["Page 1"]["Question 1"]["value"] == "Hello world!"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
 
     os.remove("./test/results/results_osc.csv")
     gui_load.close()
@@ -431,8 +431,8 @@ def test_value(gui_load, qtbot):
 def test_receiver(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -440,30 +440,30 @@ def test_receiver(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     rec_pos = find_row_by_label(gui_load.gui.edit_layout, 'receiver')
-    rec_cb = gui_load.gui.edit_layout.itemAt(rec_pos, 1).widget().layout().itemAt(0).widget()
-    rec_ip = gui_load.gui.edit_layout.itemAt(rec_pos, 1).widget().layout().itemAt(1).widget().layout().itemAt(1).widget()
-    rec_port = gui_load.gui.edit_layout.itemAt(rec_pos, 1).widget().layout().itemAt(1).widget().layout().itemAt(3).widget()
+    rec_cb = gui_load.gui.edit_layout.itemAt(rec_pos, QFormLayout.ItemRole.FieldRole).widget().layout().itemAt(0).widget()
+    rec_ip = gui_load.gui.edit_layout.itemAt(rec_pos, QFormLayout.ItemRole.FieldRole).widget().layout().itemAt(1).widget().layout().itemAt(1).widget()
+    rec_port = gui_load.gui.edit_layout.itemAt(rec_pos, QFormLayout.ItemRole.FieldRole).widget().layout().itemAt(1).widget().layout().itemAt(3).widget()
 
-    QTest.mouseClick(rec_cb, Qt.LeftButton)
-    QTest.keyClick(rec_cb, Qt.Key_Down)
-    QTest.keyClick(rec_cb, Qt.Key_Enter)
+    QTest.mouseClick(rec_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(rec_cb, Qt.Key.Key_Down)
+    QTest.keyClick(rec_cb, Qt.Key.Key_Enter)
     assert rec_cb.currentText() == "audio"
-    assert rec_ip.isEnabled() == False
+    assert not rec_ip.isEnabled()
     assert rec_ip.text() == gui_load.structure["audio_ip"]
-    assert rec_port.isEnabled() == False
+    assert not rec_port.isEnabled()
     assert rec_port.text() == gui_load.structure["audio_port"]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Question 1"]["receiver"] == ["127.0.0.1", "8000"]
     '''
-    QTest.mouseClick(rec_cb, Qt.LeftButton)
-    QTest.keyClick(rec_cb, Qt.Key_Down)
-    QTest.keyClick(rec_cb, Qt.Key_Enter)
+    QTest.mouseClick(rec_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(rec_cb, Qt.Key.Key_Down)
+    QTest.keyClick(rec_cb, Qt.Key.Key_Enter)
     assert rec_cb.currentText() == "help"
     assert rec_ip.isEnabled() == False
     assert rec_ip.text() == gui_load.structure["help_ip"]
@@ -471,32 +471,32 @@ def test_receiver(gui_load, qtbot):
     assert rec_port.text() == gui_load.structure["help_port"]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Question 1"]["receiver"] == ["", ""]
     '''
-    QTest.mouseClick(rec_cb, Qt.LeftButton)
-    QTest.keyClick(rec_cb, Qt.Key_Down)
-    QTest.keyClick(rec_cb, Qt.Key_Enter)
+    QTest.mouseClick(rec_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(rec_cb, Qt.Key.Key_Down)
+    QTest.keyClick(rec_cb, Qt.Key.Key_Enter)
     assert rec_cb.currentText() == "video"
-    assert rec_ip.isEnabled() == False
+    assert not rec_ip.isEnabled()
     assert rec_ip.text() == gui_load.structure["video_ip"]
-    assert rec_port.isEnabled() == False
+    assert not rec_port.isEnabled()
     assert rec_port.text() == gui_load.structure["video_port"]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Question 1"]["receiver"] == ["127.0.0.1", "5005"]
 
     # revert file
-    QTest.mouseClick(rec_cb, Qt.LeftButton)
-    QTest.keyClick(rec_cb, Qt.Key_Up)
-    QTest.keyClick(rec_cb, Qt.Key_Up)
-    QTest.keyClick(rec_cb, Qt.Key_Up)
-    QTest.keyClick(rec_cb, Qt.Key_Enter)
+    QTest.mouseClick(rec_cb, Qt.MouseButton.LeftButton)
+    QTest.keyClick(rec_cb, Qt.Key.Key_Up)
+    QTest.keyClick(rec_cb, Qt.Key.Key_Up)
+    QTest.keyClick(rec_cb, Qt.Key.Key_Up)
+    QTest.keyClick(rec_cb, Qt.Key.Key_Enter)
     assert rec_cb.currentText() == "<new>"
     assert rec_ip.isEnabled()
     assert rec_ip.text() == ""
@@ -509,8 +509,8 @@ def test_receiver(gui_load, qtbot):
     assert gui_load.structure["Page 1"]["Question 1"]["receiver"] == ["127.0.0.1", ""]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
     rec_port.clear()
     rec_port.setText("8000")
     assert rec_port.text() == "8000"
@@ -529,7 +529,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
     assert run.Stack.count() == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_osc.csv', mode='r') as file:
@@ -538,15 +538,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'osc'
-                assert lines[2] == 'Start'
-                assert lines[3] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'osc'
+                assert results[2] == 'Start'
+                assert results[3] == 'End'
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == 'False'  # button not clicked
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == 'False'  # button not clicked
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_osc.csv")
     assert thread.message_stack[-1] != ("/message", "Hello world!")
     thread.stop(0.1)
@@ -558,11 +558,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
     with mock_file(r'./test/results/results_osc.csv'):
         assert run.Stack.count() == 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -570,18 +570,17 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'osc'
-                    assert lines[2] == 'Start'
-                    assert lines[3] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'osc'
+                    assert results[2] == 'Start'
+                    assert results[3] == 'End'
         assert len(results) == 4
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == 'False'  # button not clicked
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == 'False'  # button not clicked
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
         os.remove(res_file)
     assert thread.message_stack[-1] != ("/message", "Hello world!")
-    print(thread.message_stack)
     thread.stop(0.1)
     QTest.qWait(1000)
 
@@ -592,11 +591,11 @@ def test_execute_questionnaire(run, qtbot):
         os.remove("./test/results/results_osc.csv")
     assert run.Stack.count() == 1
     for child in run.Stack.currentWidget().children():
-        if type(child) is OSCButton:
+        if isinstance(child, OSCButton):
             child.button.click()
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_osc.csv', mode='r') as file:
@@ -605,18 +604,17 @@ def test_execute_questionnaire(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'osc'
-                assert lines[2] == 'Start'
-                assert lines[3] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'osc'
+                assert results[2] == 'Start'
+                assert results[3] == 'End'
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == 'True'  # button was clicked
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == 'True'  # button was clicked
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_osc.csv")
     assert thread.message_stack[-1] == ("/message", "Hello world!")
-    print(thread.message_stack)
     thread.stop(0.1)
     QTest.qWait(1000)
 
@@ -626,15 +624,15 @@ def test_execute_questionnaire_blocked(run, qtbot):
     with mock_file(r'./test/results/results_osc.csv'):
         assert run.Stack.count() == 1
         for child in run.Stack.currentWidget().children():
-            if type(child) is OSCButton:
+            if isinstance(child, OSCButton):
                 child.button.click()
                 QTest.qWait(3000)
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -642,17 +640,16 @@ def test_execute_questionnaire_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'osc'
-                    assert lines[2] == 'Start'
-                    assert lines[3] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'osc'
+                    assert results[2] == 'Start'
+                    assert results[3] == 'End'
         assert len(results) == 4
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == 'True'  # button not clicked
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == 'True'  # button not clicked
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
         os.remove(res_file)
-        print(thread.message_stack)
         assert thread.message_stack[-1] == ('/message', 'Hello world!')
         thread.stop(0.1)
         QTest.qWait(1000)
diff --git a/test/Player_test.py b/test/Player_test.py
index 75647b7e5306006a2b5a66b4516ebb9655b8f1a8..b5360138a6fb22b627f6844231bb57545803c8b3 100644
--- a/test/Player_test.py
+++ b/test/Player_test.py
@@ -1,6 +1,6 @@
 """Testing the behaviour of Player.py + QEditGui.py"""
-
-from context import *
+import time
+from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, handle_dialog, csv, re, os, mock_file, Player, QHBoxLayout, MockReceiver, player_buttons, handle_dialog_warning, open_pupil
 thread_audio = None
 thread_video = None
 
@@ -67,29 +67,29 @@ def find_row_by_label(layout, label):
         row of the field
     """
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem and layout.itemAt(row, 0).widget().text() == label:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() == label:
             return row
-        elif type(layout.itemAt(row, 1)) == QHBoxLayout:
-            if layout.itemAt(row, 0).widget().text() == label:
+        elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout):
+            if layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() == label:
                 return row
 
 
 # noinspection PyArgumentList
 def test_create(gui_init, qtbot):
     # create a page
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(200, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     # create a question
     tv.setCurrentItem(tv.topLevelItem(0).child(0))  # .setSelected(True)
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(200, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -102,35 +102,35 @@ def test_create(gui_init, qtbot):
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
-    QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter)
+    QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter)
     assert gui_init.gui.questiontype.currentText() == "Player"
     # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable)
     layout = gui_init.gui.edit_layout
     not_none_rows = 0
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem):
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["Player"][0].keys()
-            assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \
-                   'TextEdit' if fields_per_type["Player"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\
-                   else fields_per_type["Player"][0][layout.itemAt(row, 0).widget().text()]
-            if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Player"][0]
+            assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \
+                   'TextEdit' if fields_per_type["Player"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\
+                   else fields_per_type["Player"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()]
-            elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().isChecked() == default_values[
-                    layout.itemAt(row, 0).widget().text()]
-        elif type(layout.itemAt(row, 1)) == QHBoxLayout:
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[
+                    layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+        elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout):
             not_none_rows += 1
-            for cbs in range(layout.itemAt(row, 1).count()):
-                assert layout.itemAt(row, 1).itemAt(cbs).widget().isChecked() == True
+            for cbs in range(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).count()):
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(cbs).widget().isChecked()
 
     assert not_none_rows == len(fields_per_type["Player"][0].keys())
     assert len(gui_init.undo_stack) == 7  # 2 for creating page & question, 5 for choosing Player
@@ -146,7 +146,7 @@ def test_create(gui_init, qtbot):
             structure["Page 1"][key] = value
     structure["Page 1"]["Question 1"] = {"type": "Player"}
     for key, value in default_values.items():
-        if key in fields_per_type["Player"][0].keys():
+        if key in fields_per_type["Player"][0]:
             structure["Page 1"]["Question 1"][key] = value
     listify(gui_init.structure)
     listify(structure)
@@ -176,8 +176,8 @@ def test_create(gui_init, qtbot):
 def test_start_cue(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -185,51 +185,52 @@ def test_start_cue(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     sc_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_cue')
 
     # try to set it as string
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("one")
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "one"
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one")
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one"
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cue"] == "one"
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "one"
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one"
     assert gui_load.structure["Page 1"]["Question 1"]["start_cue"] == "one"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # try to set it as list
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().setText("1,2")
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1,2"
-    gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1,2")
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2"
+    gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_cue"] == "1,2"
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(sc_pos, 1).widget().text() == "1,2"
+    assert gui_load.gui.edit_layout.itemAt(sc_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1,2"
     assert gui_load.structure["Page 1"]["Question 1"]["start_cue"] == "1,2"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
-    QTimer.singleShot(150, handle_dialog_no_save)
+    assert error_found
+    assert not warning_found
+    gui_load.structure["Page 1"]["Question 1"]["start_cue"] = "1"
+    gui_load.save()
     gui_load.close()
 
 
 def test_end_cue(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -237,7 +238,7 @@ def test_end_cue(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
 
     # try to set it as string
     gui_load.structure["Page 1"]["Question 1"]["end_cue"] = "one"
@@ -248,8 +249,8 @@ def test_end_cue(gui_load, qtbot):
     assert gui_load.structure["Page 1"]["Question 1"]["end_cue"] == "one"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # try to set it as list
     gui_load.structure["Page 1"]["Question 1"]["end_cue"] = "1,2"
@@ -260,8 +261,8 @@ def test_end_cue(gui_load, qtbot):
     assert gui_load.structure["Page 1"]["Question 1"]["end_cue"] == "1,2"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # try to set it same as start_cue
     gui_load.structure["Page 1"]["Question 1"]["end_cue"] = "1"
@@ -272,8 +273,8 @@ def test_end_cue(gui_load, qtbot):
     assert gui_load.structure["Page 1"]["Question 1"]["end_cue"] == "1"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # set value
     gui_load.structure["Page 1"]["Question 1"]["end_cue"] = "2"
@@ -283,8 +284,10 @@ def test_end_cue(gui_load, qtbot):
     assert gui_load.structure["Page 1"]["Question 1"]["end_cue"] == "2"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
+    gui_load.structure["Page 1"]["Question 1"]["end_cue"] = ""
+    gui_load.save()
     gui_load.close()
 
 
@@ -295,8 +298,8 @@ def test_play_once(gui_load, qtbot):
 
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -304,115 +307,115 @@ def test_play_once(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center(), delay=1)
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center(), delay=1000)
     po_pos = find_row_by_label(gui_load.gui.edit_layout, 'play_once')
 
     # set play_once to true
-    assert gui_load.gui.edit_layout.itemAt(po_pos, 1).widget().isChecked() == False
-    gui_load.gui.edit_layout.itemAt(po_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(po_pos, 1).widget().isChecked() == True
-    assert gui_load.structure["Page 1"]["Question 1"]["play_once"] == True
+    assert not gui_load.gui.edit_layout.itemAt(po_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    gui_load.gui.edit_layout.itemAt(po_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert gui_load.gui.edit_layout.itemAt(po_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert gui_load.structure["Page 1"]["Question 1"]["play_once"]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=1)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners(ConfigObj("./test/pltest.txt"))
     test_gui = StackedWindowGui("./test/pltest.txt")
     assert test_gui.Stack.count() == 1
+    time.sleep(5)
     assert thread_audio.message_stack[-1] == ("/action", 40297)
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Player:
-            assert child.play_button.isEnabled() == True
-            assert child.pause_button.isEnabled() == False
-            assert child.stop_button.isEnabled() == False
+        if isinstance(child, Player):
+            assert child.play_button.isEnabled()
+            assert not child.pause_button.isEnabled()
+            assert not child.stop_button.isEnabled()
             child.play_button.click()
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-5] == ("/action", 40161)
             assert thread_audio.message_stack[-1] == ("/play", 1.0)
             assert thread_audio.message_stack[-2] == ("/stop", 0.0)
-            assert child.play_button.isEnabled() == False
-            assert child.pause_button.isEnabled() == True
-            assert child.stop_button.isEnabled() == True
+            assert not child.play_button.isEnabled()
+            assert child.pause_button.isEnabled()
+            assert child.stop_button.isEnabled()
             child.pause_button.click()  # pause
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-1] == ("/play", 0.0)
             assert thread_audio.message_stack[-2] == ("/pause", 1.0)
             assert thread_audio.message_stack[-3] == ("/stop", 1.0)
-            assert child.play_button.isEnabled() == False
-            assert child.pause_button.isEnabled() == True
-            assert child.stop_button.isEnabled() == True
+            assert not child.play_button.isEnabled()
+            assert child.pause_button.isEnabled()
+            assert child.stop_button.isEnabled()
             child.pause_button.click()  # unpause
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-1] == ("/play", 1.0)
             assert thread_audio.message_stack[-2] == ("/pause", 0.0)
             assert thread_audio.message_stack[-3] == ("/stop", 0.0)
-            assert child.play_button.isEnabled() == False
-            assert child.pause_button.isEnabled() == True
-            assert child.stop_button.isEnabled() == True
+            assert not child.play_button.isEnabled()
+            assert child.pause_button.isEnabled()
+            assert child.stop_button.isEnabled()
             child.stop_button.click()  # stop
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-1] == ("/play", 0.0)
             assert thread_audio.message_stack[-2] == ("/stop", 1.0)
-            assert child.play_button.isEnabled() == False
-            assert child.pause_button.isEnabled() == False
-            assert child.stop_button.isEnabled() == False
+            assert not child.play_button.isEnabled()
+            assert not child.pause_button.isEnabled()
+            assert not child.stop_button.isEnabled()
     test_gui.close()
     thread_audio.stop(0.1)
     QTest.qWait(1000)
 
     # reset file
-    assert gui_load.gui.edit_layout.itemAt(po_pos, 1).widget().isChecked() == True
-    gui_load.gui.edit_layout.itemAt(po_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(po_pos, 1).widget().isChecked() == False
-    assert gui_load.structure["Page 1"]["Question 1"]["play_once"] == False
+    assert gui_load.gui.edit_layout.itemAt(po_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    gui_load.gui.edit_layout.itemAt(po_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert not gui_load.gui.edit_layout.itemAt(po_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert not gui_load.structure["Page 1"]["Question 1"]["play_once"]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners(ConfigObj("./test/pltest.txt"))
     test_gui = StackedWindowGui("./test/pltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Player:
-            assert child.play_button.isEnabled() == True
-            assert child.pause_button.isEnabled() == False
-            assert child.stop_button.isEnabled() == False
+        if isinstance(child, Player):
+            assert child.play_button.isEnabled()
+            assert not child.pause_button.isEnabled()
+            assert not child.stop_button.isEnabled()
             child.play_button.click()
-            QTest.qWait(100)
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-5] == ("/action", 40161)
             assert thread_audio.message_stack[-1] == ("/play", 1.0)
             assert thread_audio.message_stack[-2] == ("/stop", 0.0)
-            assert child.play_button.isEnabled() == True
-            assert child.pause_button.isEnabled() == True
-            assert child.stop_button.isEnabled() == True
+            assert child.play_button.isEnabled()
+            assert child.pause_button.isEnabled()
+            assert child.stop_button.isEnabled()
             child.pause_button.click()  # pause
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-1] == ("/play", 0.0)
             assert thread_audio.message_stack[-2] == ("/pause", 1.0)
             assert thread_audio.message_stack[-3] == ("/stop", 1.0)
-            assert child.play_button.isEnabled() == True
-            assert child.pause_button.isEnabled() == True
-            assert child.stop_button.isEnabled() == True
+            assert child.play_button.isEnabled()
+            assert child.pause_button.isEnabled()
+            assert child.stop_button.isEnabled()
             child.pause_button.click()  # unpause
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-1] == ("/play", 1.0)
             assert thread_audio.message_stack[-2] == ("/pause", 0.0)
             assert thread_audio.message_stack[-3] == ("/stop", 0.0)
-            assert child.play_button.isEnabled() == True
-            assert child.pause_button.isEnabled() == True
-            assert child.stop_button.isEnabled() == True
+            assert child.play_button.isEnabled()
+            assert child.pause_button.isEnabled()
+            assert child.stop_button.isEnabled()
             child.stop_button.click()  # stop
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-1] == ("/play", 0.0)
             assert thread_audio.message_stack[-2] == ("/stop", 1.0)
-            assert child.play_button.isEnabled() == True
-            assert child.pause_button.isEnabled() == False
-            assert child.stop_button.isEnabled() == False
+            assert child.play_button.isEnabled()
+            assert not child.pause_button.isEnabled()
+            assert not child.stop_button.isEnabled()
     test_gui.close()
     thread_audio.stop(0.1)
     QTest.qWait(1000)
@@ -425,8 +428,8 @@ def test_play_once(gui_load, qtbot):
 def test_timer_and_two_pages(gui_load2, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load2.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -434,54 +437,53 @@ def test_timer_and_two_pages(gui_load2, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center(), delay=1)
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center(), delay=1000)
     time_pos = find_row_by_label(gui_load2.gui.edit_layout, 'timer')
 
     # set timer value
-    assert gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().text() == ''
-    gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().setText("one")
-    gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().editingFinished.emit()
-    assert gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().text() == 'one'
+    assert gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ''
+    gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one")
+    gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().text() == 'one'
     assert gui_load2.structure["Page 1"]["Question 1"]["timer"] == 'one'
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure)
-    assert error_found == True
-    assert warning_found == False
-    gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().clear()
-    assert gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().text() == ''
-    gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().setText("1000")
-    gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().editingFinished.emit()
-    assert gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().text() == '1000'
+    assert error_found
+    assert not warning_found
+    gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    assert gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ''
+    gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().setText("1000")
+    gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().text() == '1000'
     assert gui_load2.structure["Page 1"]["Question 1"]["timer"] == '1000'
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load2.gui.refresh_button.click()
-    QTest.keyClicks(gui_load2, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load2, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners(ConfigObj("./test/pltest2.txt"))
     test_gui = StackedWindowGui("./test/pltest2.txt")
     assert test_gui.Stack.count() == 2
     hidden = None
-    print(thread_audio.message_stack)
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QLineEdit:
+        if isinstance(child, QLineEdit):
             hidden = child
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Player:
-            assert child.play_button.isEnabled() == True
-            assert hidden.isHidden() == True
-            assert hidden.isVisible() == False
+        if isinstance(child, Player):
+            assert child.play_button.isEnabled()
+            assert hidden.isHidden()
+            assert not hidden.isVisible()
             child.play_button.click()
             QTest.qWait(2000)
-            print(thread_audio.message_stack)
+            assert child.play_button.isEnabled()
+            assert child.timer.remainingTime() <= 0
+            assert not hidden.isHidden()
+            assert hidden.isVisible()
+            time.sleep(2)
             assert thread_audio.message_stack[-5] == ("/action", 40161)
             assert thread_audio.message_stack[-1] == ("/play", 1.0)
             assert thread_audio.message_stack[-2] == ("/stop", 0.0)
-            assert child.play_button.isEnabled() == True
-            assert child.timer.remainingTime() <= 0
-            assert hidden.isHidden() == False
-            assert hidden.isVisible() == True
 
     QTest.qWait(3000)
     test_gui.close()
@@ -494,42 +496,40 @@ def test_timer_and_two_pages(gui_load2, qtbot):
     assert test_gui.Stack.count() == 2
     hidden = None
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QLineEdit:
+        if isinstance(child, QLineEdit):
             hidden = child
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Player:
-            assert child.play_button.isEnabled() == True
-            assert hidden.isHidden() == True
-            assert hidden.isVisible() == False
+        if isinstance(child, Player):
+            assert child.play_button.isEnabled()
+            assert hidden.isHidden()
+            assert not hidden.isVisible()
             child.play_button.click()
             QTest.qWait(500)
             child.stop_button.click()
-            assert hidden.isHidden() == True
-            assert hidden.isVisible() == False
-            QTest.qWait(1000)
-            print(thread_audio.message_stack)
+            assert hidden.isHidden()
+            assert not hidden.isVisible()
+            time.sleep(5)
             assert thread_audio.message_stack[-7] == ("/action", 40161)
             assert thread_audio.message_stack[-3] == ("/play", 1.0)
             assert thread_audio.message_stack[-4] == ("/stop", 0.0)
             assert thread_audio.message_stack[-1] == ("/play", 0.0)
             assert thread_audio.message_stack[-2] == ("/stop", 1.0)
             QTest.qWait(700)
-            assert hidden.isHidden() == True
-            assert hidden.isVisible() == False
+            assert hidden.isHidden()
+            assert not hidden.isVisible()
             # assert child.timer.remainingTime() <= 500
             assert child.countdown > 0
             assert child.countdown == 1000
             child.play_button.click()
             assert child.timer.remainingTime() >= 900  # timer is restarted
             QTest.qWait(500)
-            assert hidden.isHidden() == True
-            assert hidden.isVisible() == False
+            assert hidden.isHidden()
+            assert not hidden.isVisible()
             QTest.qWait(700)
             assert child.timer.remainingTime() <= 0
-            assert hidden.isHidden() == False
-            assert hidden.isVisible() == True
-            QTest.qWait(2000)
-            print(thread_audio.message_stack)
+            assert not hidden.isHidden()
+            assert hidden.isVisible()
+            time.sleep(5)
             assert thread_audio.message_stack[-1] == ("/play", 1.0)
             assert thread_audio.message_stack[-2] == ("/stop", 0.0)
             # TODO in reality REAPER should ping back stop, but this doesn't work with the MockReceiver
@@ -543,23 +543,22 @@ def test_timer_and_two_pages(gui_load2, qtbot):
     assert test_gui.Stack.count() == 2
     hidden = None
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QLineEdit:
+        if isinstance(child, QLineEdit):
             hidden = child
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Player:
-            assert child.play_button.isEnabled() == True
-            assert hidden.isHidden() == True
-            assert hidden.isVisible() == False
+        if isinstance(child, Player):
+            assert child.play_button.isEnabled()
+            assert hidden.isHidden()
+            assert not hidden.isVisible()
             child.play_button.click()
             QTest.qWait(500)
             child.pause_button.click()
-            assert hidden.isHidden() == True
-            assert hidden.isVisible() == False
+            assert hidden.isHidden()
+            assert not hidden.isVisible()
             QTest.qWait(700)
-            assert hidden.isHidden() == True
-            assert hidden.isVisible() == False
-            QTest.qWait(2000)
-            print(thread_audio.message_stack)
+            assert hidden.isHidden()
+            assert not hidden.isVisible()
+            time.sleep(5)
             assert thread_audio.message_stack[-8] == ("/action", 40161)
             assert thread_audio.message_stack[-4] == ("/play", 1.0)
             assert thread_audio.message_stack[-5] == ("/stop", 0.0)
@@ -575,8 +574,9 @@ def test_timer_and_two_pages(gui_load2, qtbot):
             assert child.timer.remainingTime() > 0
             QTest.qWait(700)
             assert child.timer.remainingTime() <= 0
-            assert hidden.isHidden() == False
-            assert hidden.isVisible() == True
+            assert not hidden.isHidden()
+            assert hidden.isVisible()
+            time.sleep(5)
             assert thread_audio.message_stack[-1] == ("/play", 1.0)
             assert thread_audio.message_stack[-2] == ("/pause", 0.0)
             assert thread_audio.message_stack[-3] == ("/stop", 0.0)
@@ -586,36 +586,36 @@ def test_timer_and_two_pages(gui_load2, qtbot):
 
     # reset file
     os.remove("./test/results/results_pl.csv")
-    gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().clear()
-    gui_load2.gui.edit_layout.itemAt(time_pos, 1).widget().editingFinished.emit()
+    gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load2.gui.edit_layout.itemAt(time_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load2.structure["Page 1"]["Question 1"]["timer"] == ''
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load2.gui.refresh_button.click()
     assert "timer" not in gui_load2.structure["Page 1"]["Question 1"].keys()
-    QTest.keyClicks(gui_load2, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load2, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners(ConfigObj("./test/pltest2.txt"))
     test_gui = StackedWindowGui("./test/pltest2.txt")
     assert test_gui.Stack.count() == 2
     hidden = None
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QLineEdit:
+        if isinstance(child, QLineEdit):
             hidden = child
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Player:
-            assert child.play_button.isEnabled() == True
-            assert hidden.isHidden() == False
-            assert hidden.isVisible() == True
+        if isinstance(child, Player):
+            assert child.play_button.isEnabled()
+            assert not hidden.isHidden()
+            assert hidden.isVisible()
             child.play_button.click()
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-5] == ("/action", 40161)
             assert thread_audio.message_stack[-1] == ("/play", 1.0)
             assert thread_audio.message_stack[-2] == ("/stop", 0.0)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     QTimer.singleShot(200, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_pl.csv', mode='r') as file:
@@ -623,11 +623,11 @@ def test_timer_and_two_pages(gui_load2, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 5
-    assert lines[0] == '1'  # participant number
-    assert re.match(r'\[\d.\d+]', lines[1])  # list of duration
-    assert lines[2] == ''  # text field
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert re.match(r'\[\d.\d+]', results[1])  # list of duration
+    assert results[2] == ''  # text field
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
     os.remove("./test/results/results_pl.csv")
     thread_audio.stop(0.1)
     QTest.qWait(1000)
@@ -638,8 +638,8 @@ def test_timer_and_two_pages(gui_load2, qtbot):
 def test_play_button_text(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -647,7 +647,7 @@ def test_play_button_text(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
 
     # change text
     gui_load.structure["Page 1"]["Question 1"]["play_button_text"] = "Click me"
@@ -656,20 +656,20 @@ def test_play_button_text(gui_load, qtbot):
     assert gui_load.structure["Page 1"]["Question 1"]["play_button_text"] == "Click me"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners(ConfigObj("./test/pltest.txt"))
     test_gui = StackedWindowGui("./test/pltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Player:
+        if isinstance(child, Player):
             assert child.play_button.text() == "Click me"
-    QTest.qWait(2000)
+    time.sleep(5)
     assert thread_audio.message_stack[-1] == ("/action", 40297)
     QTimer.singleShot(200, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     thread_audio.stop(0.1)
     QTest.qWait(1000)
@@ -679,9 +679,9 @@ def test_play_button_text(gui_load, qtbot):
     assert "play_button_text" not in gui_load.structure["Page 1"]["Question 1"].keys()
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
 
     os.remove("./test/results/results_pl.csv")
     gui_load.close()
@@ -692,7 +692,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
     assert run.Stack.count() == 1
 
     QTimer.singleShot(200, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_pl.csv', mode='r') as file:
@@ -701,15 +701,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'pl'
-                assert lines[2] == 'Start'
-                assert lines[3] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'pl'
+                assert results[2] == 'Start'
+                assert results[3] == 'End'
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '[]'  # not played yet
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '[]'  # not played yet
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     assert thread_audio.message_stack[-1] == ("/action", 40297)
     os.remove("./test/results/results_pl.csv")
     thread_audio.stop(0.1)
@@ -721,11 +721,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
     with mock_file(r'./test/results/results_pl.csv'):
         assert run.Stack.count() == 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -733,15 +733,15 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'pl'
-                    assert lines[2] == 'Start'
-                    assert lines[3] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'pl'
+                    assert results[2] == 'Start'
+                    assert results[3] == 'End'
         assert len(results) == 4
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == '[]'  # not played yet
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == '[]'  # not played yet
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
         assert thread_audio.message_stack[-1] == ("/action", 40297)
         os.remove(res_file)
         thread_audio.stop(0.1)
@@ -754,17 +754,17 @@ def test_execute_questionnaire(run, qtbot):
         os.remove("./test/results/results_pl.csv")
     assert run.Stack.count() == 1
     for child in run.Stack.currentWidget().children():
-        if type(child) == Player:
+        if isinstance(child, Player):
             child.playing = False
             child.play_button.click()
-            QTest.qWait(2000)
+            time.sleep(5)
 
             assert thread_audio.message_stack[-5] == ("/action", 40161)
             assert thread_audio.message_stack[-1] == ("/play", 1.0)
             assert thread_audio.message_stack[-2] == ("/stop", 0.0)
 
     QTimer.singleShot(200, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
 
     results = []
     with open('./test/results/results_pl.csv', mode='r') as file:
@@ -773,10 +773,10 @@ def test_execute_questionnaire(run, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert re.match(r'\[\d.\d+]', lines[1])  # list of duration
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert re.match(r'\[\d.\d+]', results[1])  # list of duration
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_pl.csv")
     thread_audio.stop(0.1)
     QTest.qWait(1000)
@@ -787,19 +787,19 @@ def test_execute_questionnaire_blocked(run, qtbot):
     with mock_file(r'./test/results/results_pl.csv'):
         assert run.Stack.count() == 1
         for child in run.Stack.currentWidget().children():
-            if type(child) == Player:
+            if isinstance(child, Player):
                 child.playing = False
                 child.play_button.click()
-                QTest.qWait(5000)
+                time.sleep(5)
                 assert thread_audio.message_stack[-5] == ("/action", 40161)
                 assert thread_audio.message_stack[-1] == ("/play", 1.0)
                 assert thread_audio.message_stack[-2] == ("/stop", 0.0)
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -807,15 +807,15 @@ def test_execute_questionnaire_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'pl'
-                    assert lines[2] == 'Start'
-                    assert lines[3] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'pl'
+                    assert results[2] == 'Start'
+                    assert results[3] == 'End'
         assert len(results) == 4
-        assert lines[0] == '-1'  # participant number unknown
-        assert re.match(r'\[\d.\d+]', lines[1])
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert re.match(r'\[\d.\d+]', results[1])
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
         os.remove(res_file)
         thread_audio.stop(0.1)
         QTest.qWait(1000)
@@ -825,8 +825,8 @@ def test_execute_questionnaire_blocked(run, qtbot):
 def test_buttons(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -834,46 +834,45 @@ def test_buttons(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     btn_pos = find_row_by_label(gui_load.gui.edit_layout, 'buttons')
 
-    for btn in range(gui_load.gui.edit_layout.itemAt(btn_pos, 1).count()):
-        assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(btn).widget().isChecked() == True
+    for btn in range(gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).count()):
+        assert gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(btn).widget().isChecked()
     assert gui_load.structure["Page 1"]["Question 1"]["buttons"] == player_buttons
 
     # try to add a non-defined button
     gui_load.structure["Page 1"]["Question 1"]["buttons"].append("Record")
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # no button chosen -> warning plus autoplay on load
-    for btn in range(gui_load.gui.edit_layout.itemAt(btn_pos, 1).count()):
-        gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(btn).widget().click()
-        assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(btn).widget().isChecked() == False
+    for btn in range(gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).count()):
+        gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(btn).widget().click()
+        assert not gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(btn).widget().isChecked()
     assert gui_load.structure["Page 1"]["Question 1"]["buttons"] == []
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == True
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners(ConfigObj("./test/pltest.txt"))
     QTest.qWait(2000)
     QTimer.singleShot(150, handle_dialog_warning)
     test_gui = StackedWindowGui("./test/pltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Player:
+        if isinstance(child, Player):
             assert child.buttons == []
-            assert child.playing == True
-    QTest.qWait(5000)
-    print(thread_audio.message_stack)
+            assert child.playing
+    time.sleep(5)
     assert thread_audio.message_stack[-5] == ("/action", 40161)
     assert thread_audio.message_stack[-1] == ("/play", 1.0)
     assert thread_audio.message_stack[-2] == ("/stop", 0.0)
     QTimer.singleShot(200, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     thread_audio.stop(0.1)
     QTest.qWait(1000)
@@ -884,44 +883,44 @@ def test_buttons(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert re.match(r'\[\d.\d+]', lines[1])  # list of duration
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert re.match(r'\[\d.\d+]', results[1])  # list of duration
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_pl.csv")
 
     # just stop button
-    gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(2).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(2).widget().isChecked() == True
+    gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(2).widget().click()
+    assert gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(2).widget().isChecked()
     assert gui_load.structure["Page 1"]["Question 1"]["buttons"] == ["Stop"]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == True
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners(ConfigObj("./test/pltest.txt"))
     QTest.qWait(3000)
     QTimer.singleShot(150, handle_dialog_warning)
     test_gui = StackedWindowGui("./test/pltest.txt")
     assert test_gui.Stack.count() == 1
-    QTest.qWait(3000)
+    time.sleep(5)
     assert thread_audio.message_stack[-5] == ("/action", 40161)
     assert thread_audio.message_stack[-1] == ("/play", 1.0)
     assert thread_audio.message_stack[-2] == ("/stop", 0.0)
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Player:
+        if isinstance(child, Player):
             assert child.buttons == ["Stop"]
-            assert child.playing == True
-            assert child.stop_button.isEnabled() == True
+            assert child.playing
+            assert child.stop_button.isEnabled()
             assert child.stop_button is not None
             child.stop_button.click()
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-1] == ("/play", 0.0)
             assert thread_audio.message_stack[-2] == ("/stop", 1.0)
-            assert child.playing == False
-            assert child.stop_button.isEnabled() == False
+            assert not child.playing
+            assert not child.stop_button.isEnabled()
     QTimer.singleShot(200, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     thread_audio.stop(0.1)
     QTest.qWait(1000)
@@ -931,69 +930,69 @@ def test_buttons(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert re.match(r'\[\d.\d+]', lines[1])  # list of duration
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert re.match(r'\[\d.\d+]', results[1])  # list of duration
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_pl.csv")
 
     # stop and pause
-    gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(1).widget().isChecked() == True
+    gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(1).widget().click()
+    assert gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(1).widget().isChecked()
     assert gui_load.structure["Page 1"]["Question 1"]["buttons"] == ["Pause", "Stop"]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == True
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners(ConfigObj("./test/pltest.txt"))
     QTimer.singleShot(150, handle_dialog_warning)
     test_gui = StackedWindowGui("./test/pltest.txt")
-    QTest.qWait(5000)
+    time.sleep(5)
     assert thread_audio.message_stack[-5] == ("/action", 40161)
     assert thread_audio.message_stack[-1] == ("/play", 1.0)
     assert thread_audio.message_stack[-2] == ("/stop", 0.0)
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Player:
+        if isinstance(child, Player):
             assert child.buttons == ["Pause", "Stop"]
-            assert child.playing == True
-            assert child.pause_button.isEnabled() == True
-            assert child.pause_button.isChecked() == False
+            assert child.playing
+            assert child.pause_button.isEnabled()
+            assert not child.pause_button.isChecked()
             assert child.pause_button is not None
-            assert child.stop_button.isEnabled() == True
+            assert child.stop_button.isEnabled()
             assert child.stop_button is not None
             child.pause_button.click()
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-1] == ("/play", 0.0)
             assert thread_audio.message_stack[-2] == ("/pause", 1.0)
             assert thread_audio.message_stack[-3] == ("/stop", 1.0)
-            assert child.playing == False
-            assert child.pause_button.isEnabled() == True
-            assert child.pause_button.isChecked() == True
+            assert not child.playing
+            assert child.pause_button.isEnabled()
+            assert child.pause_button.isChecked()
             assert child.pause_button is not None
-            assert child.stop_button.isEnabled() == True
+            assert child.stop_button.isEnabled()
             assert child.stop_button is not None
             child.pause_button.click()
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-1] == ("/play", 1.0)
             assert thread_audio.message_stack[-2] == ("/pause", 0.0)
             assert thread_audio.message_stack[-3] == ("/stop", 0.0)
-            assert child.playing == True
-            assert child.pause_button.isEnabled() == True
-            assert child.pause_button.isChecked() == False
+            assert child.playing
+            assert child.pause_button.isEnabled()
+            assert not child.pause_button.isChecked()
             assert child.pause_button is not None
-            assert child.stop_button.isEnabled() == True
+            assert child.stop_button.isEnabled()
             assert child.stop_button is not None
             child.stop_button.click()
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-1] == ("/play", 0.0)
             assert thread_audio.message_stack[-2] == ("/stop", 1.0)
-            assert child.playing == False
-            assert child.pause_button.isEnabled() == False
-            assert child.stop_button.isEnabled() == False
+            assert not child.playing
+            assert not child.pause_button.isEnabled()
+            assert not child.stop_button.isEnabled()
     QTimer.singleShot(200, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     thread_audio.stop(0.1)
     QTest.qWait(1000)
@@ -1003,46 +1002,46 @@ def test_buttons(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert re.match(r'\[\d.\d+, \d.\d+]', lines[1])  # list of duration
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert re.match(r'\[\d.\d+, \d.\d+]', results[1])  # list of duration
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_pl.csv")
 
     # just play button
-    gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(2).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(2).widget().isChecked() == False
-    gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(1).widget().isChecked() == False
-    gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(0).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(0).widget().isChecked() == True
+    gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(2).widget().click()
+    assert not gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(2).widget().isChecked()
+    gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(1).widget().click()
+    assert not gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(1).widget().isChecked()
+    gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(0).widget().click()
+    assert gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(0).widget().isChecked()
     assert gui_load.structure["Page 1"]["Question 1"]["buttons"] == ["Play"]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners(ConfigObj("./test/pltest.txt"))
     test_gui = StackedWindowGui("./test/pltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Player:
+        if isinstance(child, Player):
             assert child.buttons == ["Play"]
-            assert child.playing == False
+            assert not child.playing
             assert child.play_button is not None
             child.play_button.click()
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-5] == ("/action", 40161)
             assert thread_audio.message_stack[-1] == ("/play", 1.0)
             assert thread_audio.message_stack[-2] == ("/stop", 0.0)
-            assert child.playing == True
+            assert child.playing
             child.play_button.click()
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-5] == ("/action", 40161)
             assert thread_audio.message_stack[-1] == ("/play", 1.0)
             assert thread_audio.message_stack[-2] == ("/stop", 0.0)
     QTimer.singleShot(200, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     thread_audio.stop(0.1)
     QTest.qWait(1000)
@@ -1052,31 +1051,31 @@ def test_buttons(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert re.match(r'\[\d.\d+, \d.\d+]', lines[1])  # list of duration
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert re.match(r'\[\d.\d+, \d.\d+]', results[1])  # list of duration
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_pl.csv")
 
     # reset file
-    for btn in range(gui_load.gui.edit_layout.itemAt(btn_pos, 1).count()):
-        if not gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(btn).widget().isChecked():
-            gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(btn).widget().click()
-        assert gui_load.gui.edit_layout.itemAt(btn_pos, 1).itemAt(btn).widget().isChecked() == True
+    for btn in range(gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).count()):
+        if not gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(btn).widget().isChecked():
+            gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(btn).widget().click()
+        assert gui_load.gui.edit_layout.itemAt(btn_pos, QFormLayout.ItemRole.FieldRole).itemAt(btn).widget().isChecked()
     assert gui_load.structure["Page 1"]["Question 1"]["buttons"] == player_buttons
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     gui_load.close()
 
 
 def test_video(gui_load2, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load2.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -1084,18 +1083,18 @@ def test_video(gui_load2, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     vid_pos = find_row_by_label(gui_load2.gui.edit_layout, 'video')
 
-    assert gui_load2.gui.edit_layout.itemAt(vid_pos, 1).widget().text() == ''
+    assert gui_load2.gui.edit_layout.itemAt(vid_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ''
     vid_path = "./some_video.mp4"
-    gui_load2.gui.edit_layout.itemAt(vid_pos, 1).widget().setText(vid_path)
-    gui_load2.gui.edit_layout.itemAt(vid_pos, 1).widget().editingFinished.emit()
-    assert gui_load2.gui.edit_layout.itemAt(vid_pos, 1).widget().text() == vid_path
+    gui_load2.gui.edit_layout.itemAt(vid_pos, QFormLayout.ItemRole.FieldRole).widget().setText(vid_path)
+    gui_load2.gui.edit_layout.itemAt(vid_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load2.gui.edit_layout.itemAt(vid_pos, QFormLayout.ItemRole.FieldRole).widget().text() == vid_path
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure)
-    assert error_found == False
-    assert warning_found == True
+    assert not error_found
+    assert warning_found
 
     # set video ip/port
     gui_load2.structure["video_ip"] = "127.0.0.1"
@@ -1103,25 +1102,25 @@ def test_video(gui_load2, qtbot):
     gui_load2.structure["video_player"] = "VLC"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load2.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
     gui_load2.gui.refresh_button.click()
-    QTest.keyClicks(gui_load2, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load2, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners(ConfigObj("./test/pltest2.txt"))
     test_gui = StackedWindowGui("./test/pltest2.txt")
     assert test_gui.Stack.count() == 2
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Player:
+        if isinstance(child, Player):
             child.play_button.click()
             QTest.qWait(500)
             child.pause_button.click()
             QTest.qWait(500)
             child.play_button.click()
     QTest.qWait(2000)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     QTimer.singleShot(200, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     assert thread_video.message_stack[-6] == ("/vlc_start", './some_video.mp4')
     assert thread_video.message_stack[-5] == ("/vlc_pause", 1)
@@ -1129,7 +1128,6 @@ def test_video(gui_load2, qtbot):
     assert thread_video.message_stack[-3] == ("/vlc_stop", 1)
     assert thread_video.message_stack[-2] == ("/vlc_still", 1)
     assert thread_video.message_stack[-1] == ("/vlc_finish", 1)
-    print(thread_video.message_stack)
     thread_audio.stop(0.1)
     thread_video.stop(0.1)
     QTest.qWait(1000)
@@ -1138,23 +1136,22 @@ def test_video(gui_load2, qtbot):
     # MadMapper
     gui_load2.structure["video_player"] = "MadMapper"
     gui_load2.gui.refresh_button.click()
-    QTest.keyClicks(gui_load2, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load2, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners(ConfigObj("./test/pltest2.txt"))
     test_gui = StackedWindowGui("./test/pltest2.txt")
     assert test_gui.Stack.count() == 2
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Player:
+        if isinstance(child, Player):
             child.play_button.click()
             QTest.qWait(500)
             child.pause_button.click()
             QTest.qWait(500)
             child.play_button.click()
     QTest.qWait(2000)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     QTimer.singleShot(200, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
-    print(thread_video.message_stack)  # the reply is a bis fucked up since it is configured for Reaper
     assert thread_video.message_stack[0] == ("/medias/selected/position_sec", 0.0)
     assert thread_video.message_stack[1] == ('/cues/Bank-1/scenes/by_name/./some_video.mp4', 1)
     assert thread_video.message_stack[3] == ("/play", 1)
@@ -1170,7 +1167,7 @@ def test_video(gui_load2, qtbot):
     gui_load2.structure.pop("video_port")
     gui_load2.structure.pop("video_player")
     gui_load2.structure["Page 1"]["Question 1"].pop("video")
-    QTest.keyClicks(gui_load2, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load2, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     gui_load2.close()
 
 
@@ -1180,8 +1177,8 @@ def test_pupil(gui_load, qtbot, capfd):
     open_pupil()
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -1189,16 +1186,16 @@ def test_pupil(gui_load, qtbot, capfd):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center(), delay=1)
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center(), delay=1000)
     pupil_pos = find_row_by_label(gui_load.gui.edit_layout, 'pupil')
 
-    assert gui_load.gui.edit_layout.itemAt(pupil_pos, 1).widget().text() == ''
+    assert gui_load.gui.edit_layout.itemAt(pupil_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ''
     assert "pupil" not in gui_load.structure["Page 1"]["Question 1"].keys()
 
     # try to set pupil annotation text without setting global pupil ip/port
-    gui_load.gui.edit_layout.itemAt(pupil_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(pupil_pos, 1).widget().setText("Custom Annotation")
-    gui_load.gui.edit_layout.itemAt(pupil_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(pupil_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(pupil_pos, QFormLayout.ItemRole.FieldRole).widget().setText("Custom Annotation")
+    gui_load.gui.edit_layout.itemAt(pupil_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     # QTimer.singleShot(200, handle_dialog_error)
     gui_load.gui.load_preview()
     # QTimer.singleShot(200, handle_dialog_error)
@@ -1206,37 +1203,37 @@ def test_pupil(gui_load, qtbot, capfd):
     assert gui_load.structure["Page 1"]["Question 1"]["pupil"] == "Custom Annotation"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == True
+    assert not error_found
+    assert warning_found
 
     # set pupil ip/port
     gui_load.structure["pupil_ip"] = "127.0.0.1"
     gui_load.structure["pupil_port"] = 50020
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=1)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     prepare_listeners(ConfigObj("./test/pltest.txt"))
     test_gui = StackedWindowGui("./test/pltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Player:
+        if isinstance(child, Player):
             child.play_button.click()
-            QTest.qWait(2000)
+            time.sleep(5)
             assert thread_audio.message_stack[-5] == ("/action", 40161)
             assert thread_audio.message_stack[-1] == ("/play", 1.0)
             assert thread_audio.message_stack[-2] == ("/stop", 0.0)
             QTest.qWait(1000)
-            assert child.playing == True
+            assert child.playing
             out, err = capfd.readouterr()
             assert out.index("Trigger {'topic': 'annotation', 'label': 'Custom Annotation', 'timestamp':") != -1
-            assert out.endswith(", 'duration': 1} Message forwarded.\n") == True
+            assert out.endswith(", 'duration': 1} Message forwarded.\n")
             QTest.qWait(2000)
 
     QTest.qWait(3000)
     QTimer.singleShot(2000, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=150)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=150)
     QTest.qWait(3000)
     test_gui.close()
     thread_audio.stop(0.1)
@@ -1246,16 +1243,16 @@ def test_pupil(gui_load, qtbot, capfd):
     # reset file
     gui_load.structure.pop("pupil_ip")
     gui_load.structure.pop("pupil_port")
-    gui_load.gui.edit_layout.itemAt(pupil_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(pupil_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(pupil_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(pupil_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
     assert "pupil" not in gui_load.structure["Page 1"]["Question 1"].keys()
     QTimer.singleShot(250, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     QTest.qWait(2000)
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     QTest.qWait(1000)
     gui_load.close()
diff --git a/test/RadioButton_test.py b/test/RadioButton_test.py
index 95a0e89c815b0d1419f7482a5ec3b70eee46a826..c1e3f120c9a5c98b70bb9aa20840205907e156ae 100644
--- a/test/RadioButton_test.py
+++ b/test/RadioButton_test.py
@@ -1,6 +1,6 @@
 """Testing the behaviour of Answer_RadioButton.py + QEditGui.py"""
 
-from context import *
+from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, make_answers, QRadioButton
 
 
 @pytest.fixture
@@ -27,19 +27,19 @@ def run():
 # noinspection PyArgumentList
 def test_create(gui_init, qtbot):
     # create a page
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     # create a question
     tv.setCurrentItem(tv.topLevelItem(0).child(0))
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -52,28 +52,28 @@ def test_create(gui_init, qtbot):
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
-    QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter)
+    QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter)
     assert gui_init.gui.questiontype.currentText() == "Radio"
     # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable)
     layout = gui_init.gui.edit_layout
     not_none_rows = 0
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem):
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["Radio"][0].keys()
-            assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \
-                   'TextEdit' if fields_per_type["Radio"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\
-                   else fields_per_type["Radio"][0][layout.itemAt(row, 0).widget().text()]
-            if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Radio"][0]
+            assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \
+                   'TextEdit' if fields_per_type["Radio"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\
+                   else fields_per_type["Radio"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().text() == \
-                       str(default_values[layout.itemAt(row, 0).widget().text()])
-            elif type(layout.itemAt(row, 1).widget()) == QRadioButton and layout.itemAt(row, 0).widget().text() in \
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == \
+                       str(default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()])
+            elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QRadioButton) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().isChecked() == default_values[
-                    layout.itemAt(row, 0).widget().text()]
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[
+                    layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
     assert not_none_rows == len(fields_per_type["Radio"][0].keys())
     assert len(gui_init.undo_stack) == 3  # 2 for creating page & question, 1 for choosing Radio
 
@@ -88,7 +88,7 @@ def test_create(gui_init, qtbot):
             structure["Page 1"][key] = value
     structure["Page 1"]["Question 1"] = {"type": "Radio"}
     for key, value in default_values.items():
-        if key in fields_per_type["Radio"][0].keys():
+        if key in fields_per_type["Radio"][0]:
             structure["Page 1"]["Question 1"][key] = value
     listify(gui_init.structure)
     listify(structure)
@@ -118,8 +118,8 @@ def test_create(gui_init, qtbot):
 def test_answers(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -127,71 +127,73 @@ def test_answers(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'answers')
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("[only one]")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[only one]"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[only one]")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "[only one]"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[only one]"
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]"
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one"  # listify ran at refresh
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     _, bg = make_answers(gui_load.structure["Page 1"]["Question 1"]["answers"],
                          gui_load.gui.preview_gui.Stack.currentWidget(),
                          gui_load.structure["Page 1"]["Question 1"]['id'])
     assert len(bg.buttons()) == 1
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("only one")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "only one"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("only one")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     _, bg = make_answers(gui_load.structure["Page 1"]["Question 1"]["answers"],
                          gui_load.gui.preview_gui.Stack.currentWidget(),
                          gui_load.structure["Page 1"]["Question 1"]['id'])
     assert len(bg.buttons()) == 1
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("[one, two, three]")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[one, two, three]"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[one, two, three]")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[one, two, three]"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "[one, two, three]"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     gui_load.structure = listify(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == ["one", "two", "three"]
     _, bg = make_answers(gui_load.structure["Page 1"]["Question 1"]["answers"],
                          gui_load.gui.preview_gui.Stack.currentWidget(),
                          gui_load.structure["Page 1"]["Question 1"]['id'])
     assert len(bg.buttons()) == 3
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == ""
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ""
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == ""
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == True
+    assert not error_found
+    assert warning_found
     _, bg = make_answers(gui_load.structure["Page 1"]["Question 1"]["answers"],
                          gui_load.gui.preview_gui.Stack.currentWidget(),
                          gui_load.structure["Page 1"]["Question 1"]['id'])
     assert len(bg.buttons()) == 1
-    QTimer.singleShot(150, handle_dialog_no_save)
+    
+    gui_load.structure["Page 1"]["Question 1"]["answers"] = ["yes", "no"]
+    gui_load.save()
     gui_load.close()
 
 
@@ -199,8 +201,8 @@ def test_answers(gui_load, qtbot):
 def test_start_id(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -208,32 +210,32 @@ def test_start_id(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_answer_id')
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().insert("99")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "99"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().insert("99")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "99"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "99"
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99"
     assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "99"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/rbtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QRadioButton:
+        if isinstance(child, QRadioButton):
             child.click()
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_rb.csv', mode='r') as file:
@@ -242,17 +244,17 @@ def test_start_id(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '100'  # second/last box checked and starts with 99
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '100'  # second/last box checked and starts with 99
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_rb.csv")
 
     #  -------- -1 ---------
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -260,30 +262,30 @@ def test_start_id(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_answer_id')
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().insert("-1")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "-1"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().insert("-1")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "-1"
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "-1"
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1"
     assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "-1"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     #  ---------0--------
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -291,32 +293,32 @@ def test_start_id(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_answer_id')
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().insert("0")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "0"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "0"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "0"
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
     assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "0"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/rbtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QRadioButton:
+        if isinstance(child, QRadioButton):
             child.click()
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
 
     results = []
     with open('./test/results/results_rb.csv', mode='r') as file:
@@ -325,10 +327,10 @@ def test_start_id(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '1'  # second/last box checked and starts with 0
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '1'  # second/last box checked and starts with 0
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_rb.csv")
     gui_load.close()
 
@@ -338,7 +340,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
     assert run.Stack.count() == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_rb.csv', mode='r') as file:
@@ -347,15 +349,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'rb'
-                assert lines[2] == 'Start'
-                assert lines[3] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'rb'
+                assert results[2] == 'Start'
+                assert results[3] == 'End'
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '-1'  # no radiobutton checked
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '-1'  # no radiobutton checked
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_rb.csv")
 
 
@@ -364,11 +366,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
     with mock_file(r'./test/results/results_rb.csv'):
         assert run.Stack.count() == 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -376,15 +378,15 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'rb'
-                    assert lines[2] == 'Start'
-                    assert lines[3] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'rb'
+                    assert results[2] == 'Start'
+                    assert results[3] == 'End'
         assert len(results) == 4
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == '-1'  # no radiobutton checked
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == '-1'  # no radiobutton checked
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
         os.remove(res_file)
 
 
@@ -392,11 +394,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
 def test_execute_questionnaire(run, qtbot):
     assert run.Stack.count() == 1
     for child in run.Stack.currentWidget().children():
-        if type(child) == QRadioButton:
+        if isinstance(child, QRadioButton):
             child.click()
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
 
     results = []
     with open('./test/results/results_rb.csv', mode='r') as file:
@@ -405,10 +407,10 @@ def test_execute_questionnaire(run, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '1'  # second/last box checked and starts with 0
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '1'  # second/last box checked and starts with 0
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_rb.csv")
 
 
@@ -417,14 +419,14 @@ def test_execute_questionnaire_blocked(run, qtbot):
     with mock_file(r'./test/results/results_rb.csv'):
         assert run.Stack.count() == 1
         for child in run.Stack.currentWidget().children():
-            if type(child) == QRadioButton:
+            if isinstance(child, QRadioButton):
                 child.click()
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -432,13 +434,13 @@ def test_execute_questionnaire_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'rb'
-                    assert lines[2] == 'Start'
-                    assert lines[3] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'rb'
+                    assert results[2] == 'Start'
+                    assert results[3] == 'End'
         assert len(results) == 4
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == '1'
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == '1'
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
         os.remove(res_file)
diff --git a/test/RadioMatrix_test.py b/test/RadioMatrix_test.py
index 09acdf862e50e2cc6b26be9a46e503216e00de30..d5364d60a75e57769c689b3673a5de12607394c2 100644
--- a/test/RadioMatrix_test.py
+++ b/test/RadioMatrix_test.py
@@ -1,6 +1,6 @@
 """Testing the behaviour of RadioMatrix.py + QEditGui.py"""
 
-from context import *
+from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, RadioMatrix, handle_dialog_warning, QRadioButton
 
 
 @pytest.fixture
@@ -41,19 +41,19 @@ def run_2():
 # noinspection PyArgumentList
 def test_create(gui_init, qtbot):
     # create a page
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     # create a question
     tv.setCurrentItem(tv.topLevelItem(0).child(0))  # .setSelected(True)
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -66,38 +66,38 @@ def test_create(gui_init, qtbot):
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
-    QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter)
+    QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter)
     assert gui_init.gui.questiontype.currentText() == "Matrix"
     # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable)
     layout = gui_init.gui.edit_layout
     not_none_rows = 0
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem):
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["Matrix"][0].keys()
-            assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \
-                   'TextEdit' if fields_per_type["Matrix"][0][layout.itemAt(row, 0).widget().text()] == \
-                   'QPlainTextEdit' else fields_per_type["Matrix"][0][layout.itemAt(row, 0).widget().text()]
-            if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Matrix"][0]
+            assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \
+                   'TextEdit' if fields_per_type["Matrix"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == \
+                   'QPlainTextEdit' else fields_per_type["Matrix"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().text() == \
-                       str(default_values[layout.itemAt(row, 0).widget().text()])
-            elif type(layout.itemAt(row, 1).widget()) == QRadioButton and layout.itemAt(row, 0).widget().text() in \
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == \
+                       str(default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()])
+            elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QRadioButton) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().isChecked() == default_values[
-                    layout.itemAt(row, 0).widget().text()]
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[
+                    layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
     assert not_none_rows == len(fields_per_type["Matrix"][0].keys())
     assert len(gui_init.undo_stack) == 13  # 2 for creating page & question, 11 for choosing Matrix
 
@@ -112,7 +112,7 @@ def test_create(gui_init, qtbot):
             structure["Page 1"][key] = value
     structure["Page 1"]["Question 1"] = {"type": "Matrix"}
     for key, value in default_values.items():
-        if key in fields_per_type["Matrix"][0].keys():
+        if key in fields_per_type["Matrix"][0]:
             structure["Page 1"]["Question 1"][key] = value
     listify(gui_init.structure)
     listify(structure)
@@ -143,8 +143,8 @@ def test_create(gui_init, qtbot):
 def test_answers(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -152,148 +152,153 @@ def test_answers(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'answers')
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("[only one]")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[only one]"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[only one]")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "[only one]"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[only one]"
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]"
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one"  # listify already ran
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
     test_gui = StackedWindowGui("./test/rmtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
+        if isinstance(child, RadioMatrix.RadioMatrix):
             for bg in child.buttongroups:
                 assert len(bg.buttons()) == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     '''
     QTest.qWait(1000) # TODO
     for child in gui_load.gui.preview_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
+        if isinstance(child, RadioMatrix.RadioMatrix):
             for bg in child.buttongroups:
                 assert len(bg.buttons()) == 1
     '''
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("only one")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "only one"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("only one")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "only one"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
     test_gui = StackedWindowGui("./test/rmtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
+        if isinstance(child, RadioMatrix.RadioMatrix):
             for bg in child.buttongroups:
                 assert len(bg.buttons()) == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     '''
     for child in gui_load.gui.preview_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
+        if isinstance(child, RadioMatrix.RadioMatrix):
             for bg in child.buttongroups:
                 assert len(bg.buttons()) == 1
     '''
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("[one, two, three]")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "[one, two, three]"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[one, two, three]")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[one, two, three]"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "[one, two, three]"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     gui_load.structure = listify(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == ["one", "two", "three"]
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
     test_gui = StackedWindowGui("./test/rmtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
+        if isinstance(child, RadioMatrix.RadioMatrix):
             for bg in child.buttongroups:
                 assert len(bg.buttons()) == 3
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     '''
     for child in gui_load.gui.preview_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
+        if isinstance(child, RadioMatrix.RadioMatrix):
             for bg in child.buttongroups:
                 assert len(bg.buttons()) == 3
     '''
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == ""
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ""
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == ""
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == True
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
 
     QTimer.singleShot(150, handle_dialog_warning)
     test_gui = StackedWindowGui("./test/rmtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
+        if isinstance(child, RadioMatrix.RadioMatrix):
             for bg in child.buttongroups:
                 assert len(bg.buttons()) == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     '''
     for child in gui_load.gui.preview_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
+        if isinstance(child, RadioMatrix.RadioMatrix):
             for bg in child.buttongroups:
                 assert len(bg.buttons()) == 1
     '''
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("1, 2, 3, 4, 5")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "1, 2, 3, 4, 5"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("1, 2, 3, 4, 5")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1, 2, 3, 4, 5"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == "1, 2, 3, 4, 5"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     gui_load.structure = listify(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     assert gui_load.structure["Page 1"]["Question 1"]["answers"] == (1, 2, 3, 4, 5)
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
     test_gui = StackedWindowGui("./test/rmtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
+        if isinstance(child, RadioMatrix.RadioMatrix):
             for bg in child.buttongroups:
                 assert len(bg.buttons()) == 5
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     gui_load.close()
 
@@ -305,8 +310,8 @@ def test_start_id(gui_load, qtbot):
 
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -314,33 +319,34 @@ def test_start_id(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_answer_id')
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().insert("99")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "99"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().insert("99")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "99"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "99"
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99"
     assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "99"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
     test_gui = StackedWindowGui("./test/rmtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
-            for bg in range(len(child.buttongroups)):
-                child.buttongroups[bg].buttons()[bg].click()
+        if isinstance(child, RadioMatrix.RadioMatrix):
+            for bg, grp in enumerate(child.buttongroups):
+                grp.buttons()[bg].click()
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_rm.csv', mode='r') as file:
@@ -349,19 +355,19 @@ def test_start_id(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 6
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '99'  # first button in first row clicked, id starts with 99
-    assert lines[2] == '100'  # second button in second row clicked, id starts with 99
-    assert lines[3] == '[1, 2]'  # order
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '99'  # first button in first row clicked, id starts with 99
+    assert results[2] == '100'  # second button in second row clicked, id starts with 99
+    assert results[3] == '[1, 2]'  # order
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
     os.remove("./test/results/results_rm.csv")
 
     #  -------- -1 ---------
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -369,30 +375,30 @@ def test_start_id(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_answer_id')
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().insert("-1")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "-1"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().insert("-1")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "-1"
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.load_preview()
     QTimer.singleShot(150, handle_dialog_error)
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "-1"
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1"
     assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "-1"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     #  ---------0--------
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -400,33 +406,34 @@ def test_start_id(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'start_answer_id')
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().insert("0")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "0"
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "0"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "0"
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
     assert gui_load.structure["Page 1"]["Question 1"]["start_answer_id"] == "0"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
     test_gui = StackedWindowGui("./test/rmtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
-            for bg in range(len(child.buttongroups)):
-                child.buttongroups[bg].buttons()[bg].click()
+        if isinstance(child, RadioMatrix.RadioMatrix):
+            for bg, grp in enumerate(child.buttongroups):
+                grp.buttons()[bg].click()
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
 
     results = []
     with open('./test/results/results_rm.csv', mode='r') as file:
@@ -435,12 +442,12 @@ def test_start_id(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 6
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '0'  # first button in first row clicked, id starts with 0
-    assert lines[2] == '1'  # second button in second row clicked, id starts with 0
-    assert lines[3] == '[1, 2]'  # order
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '0'  # first button in first row clicked, id starts with 0
+    assert results[2] == '1'  # second button in second row clicked, id starts with 0
+    assert results[3] == '[1, 2]'  # order
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
     os.remove("./test/results/results_rm.csv")
     gui_load.close()
 
@@ -449,8 +456,8 @@ def test_start_id(gui_load, qtbot):
 def test_questions(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -458,118 +465,123 @@ def test_questions(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     quest_pos = find_row_by_label(gui_load.gui.edit_layout, 'questions')
 
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().setPlainText("[only one]")
-    assert gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().text() == "[only one]"
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[only one]")
+    assert gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]"
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["questions"] == "[only one]"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().text() == "[only one]"
+    assert gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[only one]"
     assert gui_load.structure["Page 1"]["Question 1"]["questions"] == "only one"  # listify already ran
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     gui_load.gui.refresh_button.click()
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
     test_gui = StackedWindowGui("./test/rmtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
+        if isinstance(child, RadioMatrix.RadioMatrix):
             assert len(child.buttongroups) == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
 
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().setPlainText("only one")
-    assert gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().text() == "only one"
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("only one")
+    assert gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one"
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["questions"] == "only one"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
     test_gui = StackedWindowGui("./test/rmtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
+        if isinstance(child, RadioMatrix.RadioMatrix):
             assert len(child.buttongroups) == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
 
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().setPlainText("[one, two, three]")
-    assert gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().text() == "[one, two, three]"
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("[one, two, three]")
+    assert gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[one, two, three]"
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["questions"] == "[one, two, three]"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     gui_load.structure = listify(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     assert gui_load.structure["Page 1"]["Question 1"]["questions"] == ["one", "two", "three"]
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
     test_gui = StackedWindowGui("./test/rmtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
+        if isinstance(child, RadioMatrix.RadioMatrix):
             assert len(child.buttongroups) == 3
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
 
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().setPlainText("")
-    assert gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().text() == ""
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("")
+    assert gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ""
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["questions"] == ""
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == True
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
 
     QTimer.singleShot(150, handle_dialog_warning)
     test_gui = StackedWindowGui("./test/rmtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
+        if isinstance(child, RadioMatrix.RadioMatrix):
             assert len(child.buttongroups) == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
 
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().setPlainText("I like it very much., I don't like it at all.")
-    assert gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().text() == "I like it very much., I don't like it at all."
-    gui_load.gui.edit_layout.itemAt(quest_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("I like it very much., I don't like it at all.")
+    assert gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "I like it very much., I don't like it at all."
+    gui_load.gui.edit_layout.itemAt(quest_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["questions"] == "I like it very much., I don't like it at all."
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     gui_load.structure = listify(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     assert gui_load.structure["Page 1"]["Question 1"]["questions"] == ["I like it very much.", "I don't like it at all."]
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    QTest.qWait(2000)
     test_gui = StackedWindowGui("./test/rmtest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
+        if isinstance(child, RadioMatrix.RadioMatrix):
             assert len(child.buttongroups) == 2
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     gui_load.close()
 
@@ -581,7 +593,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
     assert run.Stack.count() == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_rm.csv', mode='r') as file:
@@ -590,19 +602,19 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'rm_1'  # first row
-                assert lines[2] == 'rm_2'  # second row
-                assert lines[3] == 'rm_order'  # second row
-                assert lines[4] == 'Start'
-                assert lines[5] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'rm_1'  # first row
+                assert results[2] == 'rm_2'  # second row
+                assert results[3] == 'rm_order'  # second row
+                assert results[4] == 'Start'
+                assert results[5] == 'End'
     assert len(results) == 6
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '-1'  # no radiobutton checked
-    assert lines[2] == '-1'  # no radiobutton checked
-    assert lines[3] == '[1, 2]'  # order
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '-1'  # no radiobutton checked
+    assert results[2] == '-1'  # no radiobutton checked
+    assert results[3] == '[1, 2]'  # order
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
     os.remove("./test/results/results_rm.csv")
 
 
@@ -611,11 +623,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
     with mock_file(r'./test/results/results_rm.csv'):
         assert run.Stack.count() == 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -623,19 +635,19 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'rm_1'  # first row
-                    assert lines[2] == 'rm_2'  # second row
-                    assert lines[3] == 'rm_order'  # second row
-                    assert lines[4] == 'Start'
-                    assert lines[5] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'rm_1'  # first row
+                    assert results[2] == 'rm_2'  # second row
+                    assert results[3] == 'rm_order'  # second row
+                    assert results[4] == 'Start'
+                    assert results[5] == 'End'
         assert len(results) == 6
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == '-1'  # no radiobutton checked
-        assert lines[2] == '-1'  # no radiobutton checked
-        assert lines[3] == '[1, 2]'  # order
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == '-1'  # no radiobutton checked
+        assert results[2] == '-1'  # no radiobutton checked
+        assert results[3] == '[1, 2]'  # order
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
         os.remove(res_file)
 
 
@@ -645,12 +657,12 @@ def test_execute_questionnaire(run, qtbot):
         os.remove("./test/results/results_rm.csv")
     assert run.Stack.count() == 1
     for child in run.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
-            for bg in range(len(child.buttongroups)):
-                child.buttongroups[bg].button(bg).click()
+        if isinstance(child, RadioMatrix.RadioMatrix):
+            for bg, grp in enumerate(child.buttongroups):
+                grp.button(bg).click()
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
 
     results = []
     with open('./test/results/results_rm.csv', mode='r') as file:
@@ -659,12 +671,12 @@ def test_execute_questionnaire(run, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 6
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '0'  # first button in first row clicked, id starts with 0
-    assert lines[2] == '1'  # second button in second row clicked, id starts with 0
-    assert lines[3] == '[1, 2]'  # order
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '0'  # first button in first row clicked, id starts with 0
+    assert results[2] == '1'  # second button in second row clicked, id starts with 0
+    assert results[3] == '[1, 2]'  # order
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
     os.remove("./test/results/results_rm.csv")
 
 
@@ -673,15 +685,15 @@ def test_execute_questionnaire_blocked(run, qtbot):
     with mock_file(r'./test/results/results_rm.csv'):
         assert run.Stack.count() == 1
         for child in run.Stack.currentWidget().children():
-            if type(child) == RadioMatrix.RadioMatrix:
-                for bg in range(len(child.buttongroups)):
-                    child.buttongroups[bg].button(bg).click()
+            if isinstance(child, RadioMatrix.RadioMatrix):
+                for bg, grp in enumerate(child.buttongroups):
+                    grp.button(bg).click()
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -689,19 +701,19 @@ def test_execute_questionnaire_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'rm_1'  # first row
-                    assert lines[2] == 'rm_2'  # second row
-                    assert lines[3] == 'rm_order'  # second row
-                    assert lines[4] == 'Start'
-                    assert lines[5] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'rm_1'  # first row
+                    assert results[2] == 'rm_2'  # second row
+                    assert results[3] == 'rm_order'  # second row
+                    assert results[4] == 'Start'
+                    assert results[5] == 'End'
         assert len(results) == 6
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == '0'
-        assert lines[2] == '1'
-        assert lines[3] == '[1, 2]'  # order
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[4])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[5])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == '0'
+        assert results[2] == '1'
+        assert results[3] == '[1, 2]'  # order
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[4])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[5])  # timestamp
         os.remove(res_file)
 
 
@@ -711,9 +723,9 @@ def test_two_pages(run_2, qtbot):
         os.remove("./test/results/results_rm.csv")
     assert run_2.Stack.count() == 2
 
-    QTest.mouseClick(run_2.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run_2.forwardbutton, Qt.MouseButton.LeftButton)
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run_2.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run_2.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_rm.csv', mode='r') as file:
@@ -722,25 +734,25 @@ def test_two_pages(run_2, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'rm_1'  # first row
-                assert lines[2] == 'rm_2'  # second row
-                assert lines[3] == 'rm_order'  # second row
-                assert lines[4] == 'rm2_1'  # first row
-                assert lines[5] == 'rm2_2'  # second row
-                assert lines[6] == 'rm2_order'  # second row
-                assert lines[7] == 'Start'
-                assert lines[8] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'rm_1'  # first row
+                assert results[2] == 'rm_2'  # second row
+                assert results[3] == 'rm_order'  # second row
+                assert results[4] == 'rm2_1'  # first row
+                assert results[5] == 'rm2_2'  # second row
+                assert results[6] == 'rm2_order'  # second row
+                assert results[7] == 'Start'
+                assert results[8] == 'End'
     assert len(results) == 9
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '-1'  # no radiobutton checked
-    assert lines[2] == '-1'  # no radiobutton checked
-    assert lines[3] == '[1, 2]'  # order
-    assert lines[4] == '-1'  # no radiobutton checked
-    assert lines[5] == '-1'  # no radiobutton checked
-    assert lines[6] == '[1, 2]'  # order
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[7])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[8])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '-1'  # no radiobutton checked
+    assert results[2] == '-1'  # no radiobutton checked
+    assert results[3] == '[1, 2]'  # order
+    assert results[4] == '-1'  # no radiobutton checked
+    assert results[5] == '-1'  # no radiobutton checked
+    assert results[6] == '[1, 2]'  # order
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[7])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[8])  # timestamp
     os.remove("./test/results/results_rm.csv")
 
 
@@ -751,8 +763,8 @@ def test_randomize(gui_load_2, qtbot):
 
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load_2.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load_2.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -760,52 +772,52 @@ def test_randomize(gui_load_2, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load_2.gui.edit_layout, 'randomize')
 
-    gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().click()
-    assert gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().isChecked() == True
-    assert gui_load_2.structure["Page 1"]["Question 1"]["randomize"] == True
+    gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert gui_load_2.structure["Page 1"]["Question 1"]["randomize"]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load_2.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
     tv.setCurrentItem(tv.topLevelItem(0).child(1).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load_2.gui.edit_layout, 'randomize')
 
-    gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().click()
-    assert gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().isChecked() == True
-    assert gui_load_2.structure["Page 2"]["Question 1"]["randomize"] == True
+    gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert gui_load_2.structure["Page 2"]["Question 1"]["randomize"]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load_2.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    QTest.keyClicks(gui_load_2, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load_2, 's', modifier=Qt.KeyboardModifier.ControlModifier)
     test_gui = StackedWindowGui("./test/rm_two_pages.txt")
     assert test_gui.Stack.count() == 2
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
-            for bg in range(len(child.buttongroups)):
-                child.buttongroups[bg].buttons()[bg].click()
+        if isinstance(child, RadioMatrix.RadioMatrix):
+            for bg, grp in enumerate(child.buttongroups):
+                grp.buttons()[bg].click()
             questions1 = child.questions
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
-            for bg in range(len(child.buttongroups)):
-                child.buttongroups[bg].buttons()[bg].click()
+        if isinstance(child, RadioMatrix.RadioMatrix):
+            for bg, grp in enumerate(child.buttongroups):
+                grp.buttons()[bg].click()
             questions2 = child.questions
-    for quest in range(len(questions1)):
-        assert questions2[quest].text() == questions1[quest].text()
+    for quest, qst in enumerate(questions1):
+        assert questions2[quest].text() == qst.text()
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_rm.csv', mode='r') as file:
@@ -814,19 +826,19 @@ def test_randomize(gui_load_2, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 9
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == lines[4]
-    assert lines[2] == lines[5]
-    assert lines[3] == lines[6]  # order
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[7])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[8])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == results[4]
+    assert results[2] == results[5]
+    assert results[3] == results[6]  # order
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[7])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[8])  # timestamp
     os.remove("./test/results/results_rm.csv")
 
     #  --set to False --
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load_2.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load_2.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -834,52 +846,54 @@ def test_randomize(gui_load_2, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load_2.gui.edit_layout, 'randomize')
 
-    gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().click()
-    assert gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().isChecked() == False
-    assert gui_load_2.structure["Page 1"]["Question 1"]["randomize"] == False
+    gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert not gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert not gui_load_2.structure["Page 1"]["Question 1"]["randomize"]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load_2.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
     tv.setCurrentItem(tv.topLevelItem(0).child(1).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load_2.gui.edit_layout, 'randomize')
 
-    gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().click()
-    assert gui_load_2.gui.edit_layout.itemAt(answers_pos, 1).widget().isChecked() == False
-    assert gui_load_2.structure["Page 2"]["Question 1"]["randomize"] == False
+    gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert not gui_load_2.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert not gui_load_2.structure["Page 2"]["Question 1"]["randomize"]
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load_2.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    QTest.keyClicks(gui_load_2, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load_2, 's', modifier=Qt.KeyboardModifier.ControlModifier)
+    gui_load_2.save()
+    QTest.qWait(1000)
     test_gui = StackedWindowGui("./test/rm_two_pages.txt")
     assert test_gui.Stack.count() == 2
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
-            for bg in range(len(child.buttongroups)):
-                child.buttongroups[bg].buttons()[bg].click()
+        if isinstance(child, RadioMatrix.RadioMatrix):
+            for bg, grp in enumerate(child.buttongroups):
+                grp.buttons()[bg].click()
             questions1 = child.questions
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == RadioMatrix.RadioMatrix:
-            for bg in range(len(child.buttongroups)):
-                child.buttongroups[bg].buttons()[bg].click()
+        if isinstance(child, RadioMatrix.RadioMatrix):
+            for bg, grp in enumerate(child.buttongroups):
+                grp.buttons()[bg].click()
             questions2 = child.questions
-    for quest in range(len(questions1)):
-        assert questions2[quest].text() == questions1[quest].text()
+    for quest, qst in enumerate(questions1):
+        assert questions2[quest].text() == qst.text()
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_rm.csv', mode='r') as file:
@@ -888,11 +902,11 @@ def test_randomize(gui_load_2, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 9
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == lines[4]
-    assert lines[2] == lines[5]
-    assert lines[3] == lines[6]  # order
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[7])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[8])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == results[4]
+    assert results[2] == results[5]
+    assert results[3] == results[6]  # order
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[7])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[8])  # timestamp
     os.remove("./test/results/results_rm.csv")
     gui_load_2.close()
diff --git a/test/Slider_test.py b/test/Slider_test.py
index 62ec60c5a6334ba1b5fd5a2d638c47ab86ca3985..7186654ffa2f2d5c85b4f12bb80ecf09e00799b8 100644
--- a/test/Slider_test.py
+++ b/test/Slider_test.py
@@ -1,6 +1,6 @@
 """Testing the behaviour of AnswerSlider.py + QEditGui.py"""
 
-from context import *
+from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, Slider, LabeledSlider, QRadioButton
 
 
 @pytest.fixture
@@ -27,19 +27,19 @@ def run():
 # noinspection PyArgumentList
 def test_create(gui_init, qtbot):
     # create a page
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     # create a question
     tv.setCurrentItem(tv.topLevelItem(0).child(0))  # .setSelected(True)
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -52,31 +52,31 @@ def test_create(gui_init, qtbot):
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
-    QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter)
+    QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter)
     assert gui_init.gui.questiontype.currentText() == "Slider"
     # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable)
     layout = gui_init.gui.edit_layout
     not_none_rows = 0
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem):
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["Slider"][0].keys()
-            assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \
-                   'TextEdit' if fields_per_type["Slider"][0][layout.itemAt(row, 0).widget().text()] == \
-                   'QPlainTextEdit' else fields_per_type["Slider"][0][layout.itemAt(row, 0).widget().text()]
-            if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Slider"][0]
+            assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \
+                   'TextEdit' if fields_per_type["Slider"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == \
+                   'QPlainTextEdit' else fields_per_type["Slider"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().text() == \
-                       str(default_values[layout.itemAt(row, 0).widget().text()])
-            elif type(layout.itemAt(row, 1).widget()) == QRadioButton and layout.itemAt(row, 0).widget().text() in \
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == \
+                       str(default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()])
+            elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QRadioButton) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().isChecked() == default_values[
-                    layout.itemAt(row, 0).widget().text()]
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[
+                    layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
     assert not_none_rows == len(fields_per_type["Slider"][0].keys())
     assert len(gui_init.undo_stack) == 6  # 2 for creating page & question, 4 for choosing Slider
 
@@ -91,7 +91,7 @@ def test_create(gui_init, qtbot):
             structure["Page 1"][key] = value
     structure["Page 1"]["Question 1"] = {"type": "Slider"}
     for key, value in default_values.items():
-        if key in fields_per_type["Slider"][0].keys():
+        if key in fields_per_type["Slider"][0]:
             structure["Page 1"]["Question 1"][key] = value
     listify(gui_init.structure)
     listify(structure)
@@ -122,8 +122,8 @@ def test_create(gui_init, qtbot):
 def test_labels(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -131,94 +131,94 @@ def test_labels(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     labels_pos = find_row_by_label(gui_load.gui.edit_layout, 'label')
     cb_pos = find_row_by_label(gui_load.gui.edit_layout, 'labelled')
 
     # activate labels
     assert "label" not in gui_load.structure["Page 1"]["Question 1"].keys()
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().isEnabled() == False
-    gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == True
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().isEnabled() == True
+    assert not gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().isEnabled()
+    gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().isEnabled()
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     gui_load.structure = listify(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     assert "label" not in gui_load.structure["Page 1"]["Question 1"].keys()
-    assert gui_load.structure["Page 1"]["Question 1"]["labelled"] == True
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert gui_load.structure["Page 1"]["Question 1"]["labelled"]
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == LabeledSlider.LabeledSlider:
+        if isinstance(child, LabeledSlider.LabeledSlider):
             assert len(child.levels) == len(range(int(gui_load.structure["Page 1"]["Question 1"]["min"]),
-                                                  int(gui_load.structure["Page 1"]["Question 1"]["max"])+1))
+                                                  int(gui_load.structure["Page 1"]["Question 1"]["max"]) + 1))
             assert child.levels[0][0] == child.sl.minimum()
             assert child.levels[0][1] == gui_load.structure["Page 1"]["Question 1"]["min"]
             assert child.levels[-1][0] == child.sl.maximum()
             assert child.levels[-1][1] == gui_load.structure["Page 1"]["Question 1"]["max"]
-        elif type(child) == Slider.Slider:
+        elif isinstance(child, Slider.Slider):
             assert False
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
 
     # adding too little labels -> error
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("only one")
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "only one"
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("only one")
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "only one"
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["label"] == "only one"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("one, two, three")
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "one, two, three"
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, three")
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, three"
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["label"] == "one, two, three"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     assert gui_load.structure["Page 1"]["Question 1"]["label"] == ["one", "two", "three"]
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # adding too many labels -> error
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("one, two, three, four, five, six")
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "one, two, three, four, five, six"
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, three, four, five, six")
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, three, four, five, six"
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["label"] == "one, two, three, four, five, six"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     assert gui_load.structure["Page 1"]["Question 1"]["label"] == ["one", "two", "three", "four", "five", "six"]
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # correct number of labels
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("one, two, three, four, five")
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "one, two, three, four, five"
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("one, two, three, four, five")
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "one, two, three, four, five"
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["label"] == "one, two, three, four, five"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     assert gui_load.structure["Page 1"]["Question 1"]["label"] == ["one", "two", "three", "four", "five"]
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == LabeledSlider.LabeledSlider:
+        if isinstance(child, LabeledSlider.LabeledSlider):
             assert len(child.levels) == len(range(int(gui_load.structure["Page 1"]["Question 1"]["min"]),
                                                   int(gui_load.structure["Page 1"]["Question 1"]["max"]) + 1))
             assert child.levels[0][0] == child.sl.minimum()
@@ -226,50 +226,50 @@ def test_labels(gui_load, qtbot):
             assert child.levels[-1][0] == child.sl.maximum()
             assert child.levels[-1][1] == gui_load.structure["Page 1"]["Question 1"]["label"][-1]
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
 
     # adding too many labels fields -> error
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("[0, two, three], [4, five, six]")
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "[0, two, three], [4, five, six]"
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("[0, two, three], [4, five, six]")
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[0, two, three], [4, five, six]"
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["label"] == "[0, two, three], [4, five, six]"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # no number in first position -> error
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("[two, three]")
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "[two, three]"
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("[two, three]")
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[two, three]"
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["label"] == "[two, three]"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # correct number of labels
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().setText("[0, null], [4, four]")
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == "[0, null], [4, four]"
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().setText("[0, null], [4, four]")
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "[0, null], [4, four]"
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["label"] == "[0, null], [4, four]"
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     assert gui_load.structure["Page 1"]["Question 1"]["label"] == [[0, "null"], [4, "four"]]
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == LabeledSlider.LabeledSlider:
+        if isinstance(child, LabeledSlider.LabeledSlider):
             assert len(child.levels) == len(range(int(gui_load.structure["Page 1"]["Question 1"]["min"]),
                                                   int(gui_load.structure["Page 1"]["Question 1"]["max"]) + 1))
             assert child.levels[0][0] == child.sl.minimum()
@@ -277,63 +277,63 @@ def test_labels(gui_load, qtbot):
             assert child.levels[-1][0] == child.sl.maximum()
             assert child.levels[-1][1] == "four"
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
 
     # disable labelled with label field filled
-    gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == False
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().isEnabled() == False
+    gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert not gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert not gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().isEnabled()
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     gui_load.structure = listify(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     # assert "label" not in gui_load.structure["Page 1"]["Question 1"].keys()  # they stay, they are just not loaded
-    assert gui_load.structure["Page 1"]["Question 1"]["labelled"] == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=100)
+    assert not gui_load.structure["Page 1"]["Question 1"]["labelled"]
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Slider.Slider:
+        if isinstance(child, Slider.Slider):
             assert True
-        elif type(child) == LabeledSlider.LabeledSlider:
+        elif isinstance(child, LabeledSlider.LabeledSlider):
             assert False
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
-    gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == True
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().isEnabled() == True
+    gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().isEnabled()
 
     # reset to default
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().clear()
-    assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().text() == ""
-    gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    assert gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ""
+    gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["label"] == ""
-    if gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked():
-        gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click()
-        assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == False
-        assert gui_load.gui.edit_layout.itemAt(labels_pos, 1).widget().isEnabled() == False
+    if gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked():
+        gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+        assert not gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+        assert not gui_load.gui.edit_layout.itemAt(labels_pos, QFormLayout.ItemRole.FieldRole).widget().isEnabled()
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     gui_load.structure = listify(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     assert "label" not in gui_load.structure["Page 1"]["Question 1"].keys()
-    assert gui_load.structure["Page 1"]["Question 1"]["labelled"] == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=100)
+    assert not gui_load.structure["Page 1"]["Question 1"]["labelled"]
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Slider.Slider:
+        if isinstance(child, Slider.Slider):
             assert True
-        elif type(child) == LabeledSlider.LabeledSlider:
+        elif isinstance(child, LabeledSlider.LabeledSlider):
             assert False
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     gui_load.close()
 
@@ -345,8 +345,8 @@ def test_start(gui_load, qtbot):
 
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -354,44 +354,44 @@ def test_start(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     start_pos = find_row_by_label(gui_load.gui.edit_layout, 'start')
 
     # try to put a string in -> error
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("zero")
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "zero"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("zero")
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "zero"
     assert gui_load.structure["Page 1"]["Question 1"]["start"] == "zero"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # greater than max
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("99")
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "99"
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("99")
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start"] == "99"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "99"
-    assert gui_load.structure["Page 1"]["Question 1"]["start"] == "99"
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "99"  # TODO unschönes Verhalten -> gleich anders anzeigen?!
+    assert gui_load.structure["Page 1"]["Question 1"]["start"] == int(gui_load.structure["Page 1"]["Question 1"]["max"])
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Slider.Slider:
+        if isinstance(child, Slider.Slider):
             assert child.value() == int(gui_load.structure["Page 1"]["Question 1"]["max"])
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_sl.csv', mode='r') as file:
@@ -400,36 +400,36 @@ def test_start(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '4'  # initial value within bounds (min<max<start)->max
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '4'  # initial value within bounds (min<max<start)->max
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_sl.csv")
 
     # smaller than min
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("-1")
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "-1"
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("-1")
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start"] == "-1"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "-1"
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-1"
     assert gui_load.structure["Page 1"]["Question 1"]["start"] == int(gui_load.structure["Page 1"]["Question 1"]["min"])
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Slider.Slider:
+        if isinstance(child, Slider.Slider):
             assert child.value() == int(gui_load.structure["Page 1"]["Question 1"]["min"])
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_sl.csv', mode='r') as file:
@@ -438,36 +438,36 @@ def test_start(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"]))  # initial value within bounds (start<min<max)->min
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"]))  # initial value within bounds (start<min<max)->min
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_sl.csv")
 
     # somewhere in between
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("2")
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "2"
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("2")
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "2"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start"] == "2"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "2"
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "2"
     assert gui_load.structure["Page 1"]["Question 1"]["start"] == "2"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Slider.Slider:
+        if isinstance(child, Slider.Slider):
             assert child.value() == 2
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_sl.csv', mode='r') as file:
@@ -476,27 +476,109 @@ def test_start(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '2'  # initial value within bounds
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '2'  # initial value within bounds
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_sl.csv")
+    
+    # somewhere in between (negative range)
+    gui_load.structure["Page 1"]["Question 1"]["min"] = 5
+    gui_load.structure["Page 1"]["Question 1"]["max"] = 0
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("2")
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "2"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load.structure["Page 1"]["Question 1"]["start"] == "2"
+    gui_load.gui.load_preview()
+    gui_load.gui.refresh_button.click()
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "2"
+    assert gui_load.structure["Page 1"]["Question 1"]["start"] == "2"
+    QTimer.singleShot(150, handle_dialog_error)
+    error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
+    assert not error_found
+    assert not warning_found
+
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    test_gui = StackedWindowGui("./test/sltest.txt")
+    assert test_gui.Stack.count() == 1
+    for child in test_gui.Stack.currentWidget().children():
+        if isinstance(child, Slider.Slider):
+            assert child.value() == 2
+
+    QTimer.singleShot(100, handle_dialog)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
+    test_gui.close()
+    results = []
+    with open('./test/results/results_sl.csv', mode='r') as file:
+        csv_file = csv.reader(file, delimiter=';')
+
+        for lines in csv_file:
+            results = lines
+    assert len(results) == 4
+    assert results[0] == '1'  # participant number
+    assert results[1] == '2'  # initial value within bounds
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
+    os.remove("./test/results/results_sl.csv")
+    
+    gui_load.structure["Page 1"]["Question 1"]["min"] = -1
+    gui_load.structure["Page 1"]["Question 1"]["max"] = -6
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("-2")
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-2"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load.structure["Page 1"]["Question 1"]["start"] == "-2"
+    gui_load.gui.load_preview()
+    gui_load.gui.refresh_button.click()
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-2"
+    assert gui_load.structure["Page 1"]["Question 1"]["start"] == "-2"
+    QTimer.singleShot(150, handle_dialog_error)
+    error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
+    assert not error_found
+    assert not warning_found
+
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    test_gui = StackedWindowGui("./test/sltest.txt")
+    assert test_gui.Stack.count() == 1
+    for child in test_gui.Stack.currentWidget().children():
+        if isinstance(child, Slider.Slider):
+            assert child.value() == -2
+
+    QTimer.singleShot(100, handle_dialog)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
+    test_gui.close()
+    results = []
+    with open('./test/results/results_sl.csv', mode='r') as file:
+        csv_file = csv.reader(file, delimiter=';')
+
+        for lines in csv_file:
+            results = lines
+    assert len(results) == 4
+    assert results[0] == '1'  # participant number
+    assert results[1] == '-2'  # initial value within bounds
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
+    os.remove("./test/results/results_sl.csv")
+    
 
     # reset to default
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("0")
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "0"
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit()
+    gui_load.structure["Page 1"]["Question 1"]["min"] = 0
+    gui_load.structure["Page 1"]["Question 1"]["max"] = 4
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0")
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["start"] == "0"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "0"
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
     assert gui_load.structure["Page 1"]["Question 1"]["start"] == "0"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     gui_load.close()
 
 
@@ -507,8 +589,8 @@ def test_step(gui_load, qtbot):
 
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -516,69 +598,69 @@ def test_step(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     start_pos = find_row_by_label(gui_load.gui.edit_layout, 'step')
 
     # try to put a string in -> error
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("zero")
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "zero"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("zero")
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "zero"
     assert gui_load.structure["Page 1"]["Question 1"]["step"] == "zero"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # greater than max+min -> error
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("10")
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "10"
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "10"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("10")
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "10"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "10"
     assert gui_load.structure["Page 1"]["Question 1"]["step"] == "10"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # 0 -> error
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("0")
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "0"
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "0"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0")
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
     assert gui_load.structure["Page 1"]["Question 1"]["step"] == "0"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # greater than 1
     gui_load.structure["Page 1"]["Question 1"]["max"] = "5"
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("2")
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "2"
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("2")
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "2"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["step"] == "2"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "2"
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "2"
     assert gui_load.structure["Page 1"]["Question 1"]["step"] == "2"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
-    for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Slider.Slider:
-            print(child.tickInterval())  # TODO is it possible to count the displayed ticks/steps?
+    #for child in test_gui.Stack.currentWidget().children():
+    #    if isinstance(child, Slider.Slider):
+    #        print(child.tickInterval())  # TODO is it possible to count the displayed ticks/steps?
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_sl.csv', mode='r') as file:
@@ -587,37 +669,37 @@ def test_step(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '0'  # initial value
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '0'  # initial value
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_sl.csv")
 
     # smaller than 1
     gui_load.structure["Page 1"]["Question 1"]["max"] = "4"
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("0.5")
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "0.5"
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0.5")
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0.5"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["step"] == "0.5"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "0.5"
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0.5"
     assert gui_load.structure["Page 1"]["Question 1"]["step"] == '0.5'
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
-    for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Slider.Slider:
-            print(child.tickInterval())  # TODO is it possible to count the displayed ticks/steps?
+    #for child in test_gui.Stack.currentWidget().children():
+    #    if isinstance(child, Slider.Slider):
+    #        print(child.tickInterval())  # TODO is it possible to count the displayed ticks/steps?
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_sl.csv', mode='r') as file:
@@ -626,27 +708,27 @@ def test_step(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '0.0'  # initial value
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '0.0'  # initial value
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_sl.csv")
 
     # reset to default
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().insert("1")
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "1"
-    gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().insert("1")
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1"
+    gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["step"] == "1"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(start_pos, 1).widget().text() == "1"
+    assert gui_load.gui.edit_layout.itemAt(start_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "1"
     assert gui_load.structure["Page 1"]["Question 1"]["step"] == "1"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     gui_load.close()
 
 
@@ -657,8 +739,8 @@ def test_min(gui_load, qtbot):
 
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -666,58 +748,59 @@ def test_min(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     min_pos = find_row_by_label(gui_load.gui.edit_layout, 'min')
 
     # try to put a string in -> error
-    gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().insert("zero")
-    gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().text() == "zero"
+    gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().insert("zero")
+    gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "zero"
     assert gui_load.structure["Page 1"]["Question 1"]["min"] == "zero"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # min = max -> error
-    gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().insert("4")
-    gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().text() == "4"
+    gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().insert("4")
+    gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "4"
     assert gui_load.structure["Page 1"]["Question 1"]["min"] == "4"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # greater than max
-    gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().insert("9")
-    assert gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().text() == "9"
-    gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().insert("9")
+    assert gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "9"
+    gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["min"] == "9"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().text() == "9"
+    assert gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "9"
     assert gui_load.structure["Page 1"]["Question 1"]["min"] == "9"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Slider.Slider:
-            assert child.minimum() == 0
+        if isinstance(child, Slider.Slider):
+            assert child.minimum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(gui_load.structure["Page 1"]["Question 1"]["min"])) / int(gui_load.structure["Page 1"]["Question 1"]["step"]))
             assert child._min == int(gui_load.structure["Page 1"]["Question 1"]["min"])
-            assert child.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"])-int(gui_load.structure["Page 1"]["Question 1"]["min"]))/int(gui_load.structure["Page 1"]["Question 1"]["step"])) if int(gui_load.structure["Page 1"]["Question 1"]["max"]) > int(gui_load.structure["Page 1"]["Question 1"]["min"]) else -1*int((int(gui_load.structure["Page 1"]["Question 1"]["max"])-int(gui_load.structure["Page 1"]["Question 1"]["min"]))/int(gui_load.structure["Page 1"]["Question 1"]["step"]))
+            assert child.maximum() == 0
             assert child._max == int(gui_load.structure["Page 1"]["Question 1"]["max"])
+            assert child.value() == gui_load.structure["Page 1"]["Question 1"]["start"]
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_sl.csv', mode='r') as file:
@@ -726,42 +809,35 @@ def test_min(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '4'  # initial value < max < min -> max
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '4'  # initial value < max < min -> max
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_sl.csv")
 
     # with labels
     cb_pos = find_row_by_label(gui_load.gui.edit_layout, 'labelled')
-    gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == True
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=100)
+    gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == LabeledSlider.LabeledSlider:
+        if isinstance(child, LabeledSlider.LabeledSlider):
             assert len(child.levels) == len(range(int(gui_load.structure["Page 1"]["Question 1"]["min"]),
                                                   int(gui_load.structure["Page 1"]["Question 1"]["max"]) - 1, -1))
-            assert child.levels[0][0] == child.sl.minimum()
+            assert child.levels[0][0] == child.sl.maximum()
             assert child.levels[0][1] == gui_load.structure["Page 1"]["Question 1"]["min"]
-            assert child.levels[-1][0] == child.sl.maximum()
+            assert child.levels[-1][0] == child.sl.maximum() - child.sl.minimum()
             assert child.levels[-1][1] == gui_load.structure["Page 1"]["Question 1"]["max"]
-            assert child.sl.minimum() == 0
+            assert child.sl.minimum() == int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(gui_load.structure["Page 1"]["Question 1"]["min"])
             assert child.sl._min == int(gui_load.structure["Page 1"]["Question 1"]["min"])
-            assert child.sl.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(
-                gui_load.structure["Page 1"]["Question 1"]["min"])) / int(
-                gui_load.structure["Page 1"]["Question 1"]["step"])) if int(
-                gui_load.structure["Page 1"]["Question 1"]["max"]) > int(
-                gui_load.structure["Page 1"]["Question 1"]["min"]) else -1 * int((int(
-                gui_load.structure["Page 1"]["Question 1"]["max"]) - int(
-                gui_load.structure["Page 1"]["Question 1"]["min"])) / int(
-                gui_load.structure["Page 1"]["Question 1"]["step"]))
+            assert child.sl.maximum() == 0
             assert child.sl._max == int(gui_load.structure["Page 1"]["Question 1"]["max"])
-        elif type(child) == Slider.Slider:
+        elif isinstance(child, Slider.Slider):
             assert False
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_sl.csv', mode='r') as file:
@@ -770,47 +846,40 @@ def test_min(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '4'  # initial value < max < min -> max
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '4'  # initial value < max < min -> max
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_sl.csv")
-    gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == False
+    gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert not gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
 
     # reset to default (min < max)
-    gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().insert("0")
-    assert gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().text() == "0"
-    gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0")
+    assert gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
+    gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["min"] == "0"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(min_pos, 1).widget().text() == "0"
+    assert gui_load.gui.edit_layout.itemAt(min_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
     assert gui_load.structure["Page 1"]["Question 1"]["min"] == "0"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
 
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Slider.Slider:
+        if isinstance(child, Slider.Slider):
             assert child.minimum() == 0
             assert child._min == int(gui_load.structure["Page 1"]["Question 1"]["min"])
-            assert child.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(
-                gui_load.structure["Page 1"]["Question 1"]["min"])) / int(
-                gui_load.structure["Page 1"]["Question 1"]["step"])) if int(
-                gui_load.structure["Page 1"]["Question 1"]["max"]) > int(
-                gui_load.structure["Page 1"]["Question 1"]["min"]) else -1 * int((int(
-                gui_load.structure["Page 1"]["Question 1"]["max"]) - int(
-                gui_load.structure["Page 1"]["Question 1"]["min"])) / int(
-                gui_load.structure["Page 1"]["Question 1"]["step"]))
+            assert child.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(gui_load.structure["Page 1"]["Question 1"]["min"])) / int(gui_load.structure["Page 1"]["Question 1"]["step"])) if int(gui_load.structure["Page 1"]["Question 1"]["max"]) > int(gui_load.structure["Page 1"]["Question 1"]["min"]) else -1 * int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(gui_load.structure["Page 1"]["Question 1"]["min"])) / int(gui_load.structure["Page 1"]["Question 1"]["step"]))
             assert child._max == int(gui_load.structure["Page 1"]["Question 1"]["max"])
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_sl.csv', mode='r') as file:
@@ -819,10 +888,10 @@ def test_min(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"]))  # initial value
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"]))  # initial value
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_sl.csv")
 
     # initial value
@@ -838,8 +907,8 @@ def test_max(gui_load, qtbot):
 
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -847,65 +916,59 @@ def test_max(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     max_pos = find_row_by_label(gui_load.gui.edit_layout, 'max')
 
     # try to put a string in -> error
-    gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().insert("zero")
-    gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().text() == "zero"
+    gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().insert("zero")
+    gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "zero"
     assert gui_load.structure["Page 1"]["Question 1"]["max"] == "zero"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # min = max -> error
-    gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().insert("0")
-    gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().text() == "0"
+    gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().insert("0")
+    gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "0"
     assert gui_load.structure["Page 1"]["Question 1"]["max"] == "0"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == True
-    assert warning_found == False
+    assert error_found
+    assert not warning_found
 
     # smaller than min
-    gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().insert("-5")
-    assert gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().text() == "-5"
-    gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().insert("-5")
+    assert gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-5"
+    gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["max"] == "-5"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().text() == "-5"
+    assert gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "-5"
     assert gui_load.structure["Page 1"]["Question 1"]["max"] == "-5"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Slider.Slider:
-            assert child.minimum() == 0
+        if isinstance(child, Slider.Slider):
+            assert child.invertedAppearance()
+            assert child.minimum() == -5
             assert child._min == int(gui_load.structure["Page 1"]["Question 1"]["min"])
-            assert child.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(
-                gui_load.structure["Page 1"]["Question 1"]["min"])) / int(
-                gui_load.structure["Page 1"]["Question 1"]["step"])) if int(
-                gui_load.structure["Page 1"]["Question 1"]["max"]) > int(
-                gui_load.structure["Page 1"]["Question 1"]["min"]) else -1 * int((int(
-                gui_load.structure["Page 1"]["Question 1"]["max"]) - int(
-                gui_load.structure["Page 1"]["Question 1"]["min"])) / int(
-                gui_load.structure["Page 1"]["Question 1"]["step"]))
+            assert child.maximum() == 0
             assert child._max == int(gui_load.structure["Page 1"]["Question 1"]["max"])
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_sl.csv', mode='r') as file:
@@ -914,42 +977,35 @@ def test_max(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"]))  # initial value
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == str(gui_load.structure["Page 1"]["Question 1"]["start"])  # initial value
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_sl.csv")
 
     # with labels
     cb_pos = find_row_by_label(gui_load.gui.edit_layout, 'labelled')
-    gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == True
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier, delay=100)
+    gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == LabeledSlider.LabeledSlider:
+        if isinstance(child, LabeledSlider.LabeledSlider):
             assert len(child.levels) == len(range(int(gui_load.structure["Page 1"]["Question 1"]["min"]),
                                                   int(gui_load.structure["Page 1"]["Question 1"]["max"]) - 1, -1))
-            assert child.levels[0][0] == child.sl.minimum()
+            assert child.levels[0][0] == child.sl.maximum()
             assert child.levels[0][1] == gui_load.structure["Page 1"]["Question 1"]["min"]
-            assert child.levels[-1][0] == child.sl.maximum()
+            assert child.levels[-1][0] == child.sl.maximum() - child.sl.minimum()
             assert child.levels[-1][1] == gui_load.structure["Page 1"]["Question 1"]["max"]
-            assert child.sl.minimum() == 0
+            assert child.sl.minimum() == -5
             assert child.sl._min == int(gui_load.structure["Page 1"]["Question 1"]["min"])
-            assert child.sl.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(
-                gui_load.structure["Page 1"]["Question 1"]["min"])) / int(
-                gui_load.structure["Page 1"]["Question 1"]["step"])) if int(
-                gui_load.structure["Page 1"]["Question 1"]["max"]) > int(
-                gui_load.structure["Page 1"]["Question 1"]["min"]) else -1 * int((int(
-                gui_load.structure["Page 1"]["Question 1"]["max"]) - int(
-                gui_load.structure["Page 1"]["Question 1"]["min"])) / int(
-                gui_load.structure["Page 1"]["Question 1"]["step"]))
+            assert child.sl.maximum() == 0
             assert child.sl._max == int(gui_load.structure["Page 1"]["Question 1"]["max"])
-        elif type(child) == Slider.Slider:
+        elif isinstance(child, Slider.Slider):
             assert False
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_sl.csv', mode='r') as file:
@@ -958,47 +1014,40 @@ def test_max(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"]))  # initial value
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == str(gui_load.structure["Page 1"]["Question 1"]["start"])  # initial value
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_sl.csv")
-    gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(cb_pos, 1).widget().isChecked() == False
+    gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert not gui_load.gui.edit_layout.itemAt(cb_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
 
     # reset to default (min < max)
-    gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().insert("4")
-    assert gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().text() == "4"
-    gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().insert("4")
+    assert gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "4"
+    gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["max"] == "4"
     gui_load.gui.load_preview()
     gui_load.gui.refresh_button.click()
-    assert gui_load.gui.edit_layout.itemAt(max_pos, 1).widget().text() == "4"
+    assert gui_load.gui.edit_layout.itemAt(max_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "4"
     assert gui_load.structure["Page 1"]["Question 1"]["max"] == "4"
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
 
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == Slider.Slider:
+        if isinstance(child, Slider.Slider):
             assert child.minimum() == 0
             assert child._min == int(gui_load.structure["Page 1"]["Question 1"]["min"])
-            assert child.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(
-                gui_load.structure["Page 1"]["Question 1"]["min"])) / int(
-                gui_load.structure["Page 1"]["Question 1"]["step"])) if int(
-                gui_load.structure["Page 1"]["Question 1"]["max"]) > int(
-                gui_load.structure["Page 1"]["Question 1"]["min"]) else -1 * int((int(
-                gui_load.structure["Page 1"]["Question 1"]["max"]) - int(
-                gui_load.structure["Page 1"]["Question 1"]["min"])) / int(
-                gui_load.structure["Page 1"]["Question 1"]["step"]))
+            assert child.maximum() == int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(gui_load.structure["Page 1"]["Question 1"]["min"])) / int(gui_load.structure["Page 1"]["Question 1"]["step"])) if int(gui_load.structure["Page 1"]["Question 1"]["max"]) > int(gui_load.structure["Page 1"]["Question 1"]["min"]) else -1 * int((int(gui_load.structure["Page 1"]["Question 1"]["max"]) - int(gui_load.structure["Page 1"]["Question 1"]["min"])) / int(gui_load.structure["Page 1"]["Question 1"]["step"]))
             assert child._max == int(gui_load.structure["Page 1"]["Question 1"]["max"])
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     results = []
     with open('./test/results/results_sl.csv', mode='r') as file:
@@ -1006,10 +1055,10 @@ def test_max(gui_load, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"]))  # initial value
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == str(int(gui_load.structure["Page 1"]["Question 1"]["start"]))  # initial value
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_sl.csv")
 
     gui_load.structure["Page 1"]["Question 1"]["start"] = 0
@@ -1024,8 +1073,8 @@ def test_text_position(gui_load, qtbot):
 
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -1033,50 +1082,50 @@ def test_text_position(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     qa_pos = find_row_by_label(gui_load.gui.edit_layout, 'question_above')
-    assert gui_load.gui.edit_layout.itemAt(qa_pos, 1).widget().isChecked() == False
+    assert not gui_load.gui.edit_layout.itemAt(qa_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QFormLayout:
+        if isinstance(child, QFormLayout):
             assert child.rowCount() == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     os.remove("./test/results/results_sl.csv")
 
     # change position to above
-    gui_load.gui.edit_layout.itemAt(qa_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(qa_pos, 1).widget().isChecked() == True
+    gui_load.gui.edit_layout.itemAt(qa_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert gui_load.gui.edit_layout.itemAt(qa_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     gui_load.structure = listify(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    assert gui_load.structure["Page 1"]["Question 1"]["question_above"] == True
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    assert gui_load.structure["Page 1"]["Question 1"]["question_above"]
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QFormLayout:
+        if isinstance(child, QFormLayout):
             assert child.rowCount() == 2
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     os.remove("./test/results/results_sl.csv")
     # revert to original
-    gui_load.gui.edit_layout.itemAt(qa_pos, 1).widget().click()
-    assert gui_load.gui.edit_layout.itemAt(qa_pos, 1).widget().isChecked() == False
+    gui_load.gui.edit_layout.itemAt(qa_pos, QFormLayout.ItemRole.FieldRole).widget().click()
+    assert not gui_load.gui.edit_layout.itemAt(qa_pos, QFormLayout.ItemRole.FieldRole).widget().isChecked()
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     gui_load.structure = listify(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
-    assert gui_load.structure["Page 1"]["Question 1"]["question_above"] == False
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    assert not error_found
+    assert not warning_found
+    assert not gui_load.structure["Page 1"]["Question 1"]["question_above"]
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     gui_load.close()
 
 
@@ -1087,8 +1136,8 @@ def test_header(gui_load, qtbot):
 
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -1096,55 +1145,55 @@ def test_header(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     header_pos = find_row_by_label(gui_load.gui.edit_layout, 'header')
-    assert gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().text() == ''
+    assert gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ''
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QFormLayout:
+        if isinstance(child, QFormLayout):
             assert child.rowCount() == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     os.remove("./test/results/results_sl.csv")
 
     # add header
-    gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().clear()
-    assert gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().text() == ''
-    gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().setPlainText('one, "", "", "", four')
-    gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().text() == 'one, "", "", "", four'
+    gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    assert gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ''
+    gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText('one, "", "", "", four')
+    gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().text() == 'one, "", "", "", four'
     gui_load.structure = listify(gui_load.structure)
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     assert gui_load.structure["Page 1"]["Question 1"]["header"] == ['one', "", "", "", 'four']
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/sltest.txt")
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QFormLayout:
+        if isinstance(child, QFormLayout):
             assert child.rowCount() == 2
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
     test_gui.close()
     os.remove("./test/results/results_sl.csv")
 
     # revert to original
-    gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(header_pos, 1).widget().text() == ''
+    gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(header_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ''
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
     gui_load.structure = listify(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     assert "header" not in gui_load.structure["Page 1"]["Question 1"].keys()
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     gui_load.close()
 
 
@@ -1155,7 +1204,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
     assert run.Stack.count() == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_sl.csv', mode='r') as file:
@@ -1164,15 +1213,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'sl'  # first row
-                assert lines[2] == 'Start'
-                assert lines[3] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'sl'  # first row
+                assert results[2] == 'Start'
+                assert results[3] == 'End'
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '0'  # initial value
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '0'  # initial value
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_sl.csv")
 
 
@@ -1181,11 +1230,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
     with mock_file(r'./test/results/results_sl.csv'):
         assert run.Stack.count() == 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -1193,15 +1242,15 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'sl'  # first row
-                    assert lines[2] == 'Start'
-                    assert lines[3] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'sl'  # first row
+                    assert results[2] == 'Start'
+                    assert results[3] == 'End'
         assert len(results) == 4
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == '0'  # initial value
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == '0'  # initial value
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
         os.remove(res_file)
 
 
@@ -1211,13 +1260,13 @@ def test_execute_questionnaire(run, qtbot):
         os.remove("./test/results/results_sl.csv")
     assert run.Stack.count() == 1
     for child in run.Stack.currentWidget().children():
-        if type(child) == Slider.Slider:
+        if isinstance(child, Slider.Slider):
             bb = child.rect()
-            QTest.mouseClick(child, Qt.LeftButton, pos=bb.center())
-            assert child.value() == int((child._max+child._min)/2)
+            QTest.mouseClick(child, Qt.MouseButton.LeftButton, pos=bb.center())
+            assert child.value() == int((child._max + child._min) / 2)
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton, delay=1)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton, delay=1000)
 
     results = []
     with open('./test/results/results_sl.csv', mode='r') as file:
@@ -1226,10 +1275,10 @@ def test_execute_questionnaire(run, qtbot):
         for lines in csv_file:
             results = lines
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == '2'  # middle of 0 and 4 is 2
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == '2'  # middle of 0 and 4 is 2
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_sl.csv")
 
 
@@ -1238,16 +1287,16 @@ def test_execute_questionnaire_blocked(run, qtbot):
     with mock_file(r'./test/results/results_sl.csv'):
         assert run.Stack.count() == 1
         for child in run.Stack.currentWidget().children():
-            if type(child) == Slider.Slider:
+            if isinstance(child, Slider.Slider):
                 bb = child.rect()
-                QTest.mouseClick(child, Qt.LeftButton, pos=bb.center())
+                QTest.mouseClick(child, Qt.MouseButton.LeftButton, pos=bb.center())
                 assert child.value() == int((child._max + child._min) / 2)
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -1255,13 +1304,13 @@ def test_execute_questionnaire_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'sl'  # first row
-                    assert lines[2] == 'Start'
-                    assert lines[3] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'sl'  # first row
+                    assert results[2] == 'Start'
+                    assert results[3] == 'End'
         assert len(results) == 4
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == '2'
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == '2'
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
         os.remove(res_file)
diff --git a/test/Treeview_Test.py b/test/Treeview_Test.py
index 8786d92064a57e1b4a15777d9c7e325c24315e70..22e6def59527c9089c2eda3072e013ffe76df243 100644
--- a/test/Treeview_Test.py
+++ b/test/Treeview_Test.py
@@ -2,7 +2,7 @@
 Ref how to auto-dialog: https://stackoverflow.com/a/59148220
 """
 
-from context import *
+from context import pytest, QEditGuiMain, QTimer, open_config_file, QTest, handle_dialog_p, handle_dialog_q, Qt, default_values, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_sa
 
 
 @pytest.fixture
@@ -28,11 +28,11 @@ def test_create(gui_init, qtbot):
 # noinspection PyArgumentList
 def test_add_page(gui_init, qtbot):
     tv = gui_init.gui.treeview
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -69,18 +69,18 @@ def test_load_file(gui_init, qtbot):
 
 # noinspection PyArgumentList
 def test_add_page_add_question(gui_init, qtbot):
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     tv.setCurrentItem(tv.topLevelItem(0).child(0))
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -97,11 +97,11 @@ def test_add_question_after_load(gui_init, qtbot):
     gui_init.load_file()
     tv = gui_init.gui.treeview
     tv.setCurrentItem(tv.topLevelItem(0).child(0))
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "onepage.txt"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -118,12 +118,12 @@ def test_add_page_after_load(gui_init, qtbot):
     gui_init.load_file()
     tv = gui_init.gui.treeview
     tv.setCurrentItem(tv.topLevelItem(0))
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
     QTimer.singleShot(200, handle_dialog_sa)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
 
     assert tv.itemAt(0, 0).text(0) == "onepage.txt"
     assert tv.topLevelItemCount() == 1
diff --git a/test/cbtest.txt b/test/cbtest.txt
index f995c58f46c3465b5fd5d439716e707d03f8eec5..25718f38658fd45be2925838972114bc173a6111 100644
--- a/test/cbtest.txt
+++ b/test/cbtest.txt
@@ -1,4 +1,4 @@
-# Created with QUEST version 1.0.6
+# Created with QUEST version 1.1.0.
 go_back = True
 back_text = Zurück
 forward_text = Weiter
diff --git a/test/context.py b/test/context.py
index 4690a31e07924029620be5cd11717653e6c89016..bbc440124cb787501f7a6c39d9d226f21d4944a0 100644
--- a/test/context.py
+++ b/test/context.py
@@ -10,9 +10,9 @@ import keyboard
 from MockReceiver import MockReceiver
 import portalocker
 from pythonosc import osc_server, dispatcher
-from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator
-from PyQt5.QtCore import QTimer, QPoint
-from PyQt5.QtWidgets import QCheckBox, QLabel, QRadioButton, QFormLayout, QButtonGroup, QPlainTextEdit
+from PySide6.QtGui import QIntValidator, QDoubleValidator, QRegularExpressionValidator, QPalette
+from PySide6.QtCore import QTimer, QPoint
+from PySide6.QtWidgets import QCheckBox, QLabel, QRadioButton, QFormLayout, QButtonGroup, QPlainTextEdit
 import asyncio
 
 
diff --git a/test/hline_test.py b/test/hline_test.py
index cc2480178d8a953701e669b6a4ba9e947fcb7f93..c90c188ca85eba8e8337b4cefb3839c241a97ac1 100644
--- a/test/hline_test.py
+++ b/test/hline_test.py
@@ -1,6 +1,6 @@
 """Testing the behaviour of Plain text + QEditGui.py"""
 
-from context import *
+from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, ConfigObj, QHLine, QCheckBox, QLineEdit, page_fields, listify, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, handle_dialog, csv, re, os, mock_file
 
 
 @pytest.fixture
@@ -27,19 +27,19 @@ def run():
 # noinspection PyArgumentList
 def test_create(gui_init, qtbot):
     # create a page
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     # create a question
     tv.setCurrentItem(tv.topLevelItem(0).child(0))
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -56,19 +56,19 @@ def test_create(gui_init, qtbot):
     layout = gui_init.gui.edit_layout
     not_none_rows = 0
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem):
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["HLine"][0].keys()
-            assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \
-                   'TextEdit' if fields_per_type["HLine"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\
-                   else fields_per_type["HLine"][0][layout.itemAt(row, 0).widget().text()]
-            if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["HLine"][0]
+            assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \
+                   'TextEdit' if fields_per_type["HLine"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\
+                   else fields_per_type["HLine"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()]
-            elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().isChecked() == default_values[
-                    layout.itemAt(row, 0).widget().text()]
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[
+                    layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
     assert not_none_rows == len(fields_per_type["HLine"][0].keys())
     assert len(gui_init.undo_stack) == 2  # 2 for creating page & question
 
@@ -83,7 +83,7 @@ def test_create(gui_init, qtbot):
             structure["Page 1"][key] = value
     structure["Page 1"]["Question 1"] = {"type": "HLine"}
     for key, value in default_values.items():
-        if key in fields_per_type["Plain Text"][0].keys():
+        if key in fields_per_type["Plain Text"][0]:
             structure["Page 1"]["Question 1"][key] = value
     listify(gui_init.structure)
     listify(structure)
@@ -115,12 +115,12 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
     assert run.Stack.count() == 1
     line_cnt = 0
     for child in run.Stack.currentWidget().children():
-        if type(child) == QHLine:
+        if isinstance(child, QHLine):
             line_cnt += 1
     assert line_cnt == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_hl.csv', mode='r') as file:
@@ -129,13 +129,13 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'Start'
-                assert lines[2] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'Start'
+                assert results[2] == 'End'
     assert len(results) == 3
-    assert lines[0] == '1'  # participant number
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[1])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[1])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
     os.remove("./test/results/results_hl.csv")
 
 
@@ -144,11 +144,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
     with mock_file(r'./test/results/results_hl.csv'):
         assert run.Stack.count() == 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -156,11 +156,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'Start'
-                    assert lines[2] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'Start'
+                    assert results[2] == 'End'
         assert len(results) == 3
-        assert lines[0] == '-1'  # participant number unknown
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[1])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[1])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
         os.remove(res_file)
diff --git a/test/imgtest.txt b/test/imgtest.txt
index 8a6b6206c244249ff04b5566c47cb94753b270c4..ec06d1b68964acf3292001cd7636587148ae2655 100644
--- a/test/imgtest.txt
+++ b/test/imgtest.txt
@@ -1,4 +1,4 @@
-# Created with QUEST version 1.0.6
+# Created with QUEST version 1.1.0.
 go_back = True
 back_text = Zurück
 forward_text = Weiter
diff --git a/test/listify_test.py b/test/listify_test.py
index cfd2fcb1730a7f72dfd1f98a5276bbc1f83aca10..49443e54ff770c11262988ff85ba11d8aafa6b7a 100644
--- a/test/listify_test.py
+++ b/test/listify_test.py
@@ -1,6 +1,6 @@
 """Test if the listify function in Validator.py is working correctly."""
 
-from context import *
+from context import listify, ConfigObj
 
 
 # fields: "answers", "button_texts", "header", "label", "questions"
@@ -116,7 +116,7 @@ def test_list_as_list_of_strings():
     assert structure['Page 1']['Question 1']['answers'] == ['answer1', 'answer2']
     assert structure['Page 1']['Question 1']['button_texts'] == ['button1', 'button2']
     assert structure['Page 1']['Question 1']['header'] == ['head1', 'head2']
-    assert structure['Page 1']['Question 1']['label'] == [[1.0, 'label2']]  # sublist pairs with number as 0st entry
+    assert structure['Page 1']['Question 1']['label'] == [[1.0, 'label2']]  # sublist pairs with number as 0th entry
     assert structure['Page 1']['Question 1']['questions'] == ['quest1', 'quest2']
 
 
diff --git a/test/mrtest.txt b/test/mrtest.txt
index bb08300c899a6013cbab0ecdf3babdfc6bba3e4f..ac497084986c394fe9028e617836979b6f3a1ba3 100644
--- a/test/mrtest.txt
+++ b/test/mrtest.txt
@@ -1,4 +1,4 @@
-# Created with QUEST version 1.0.6
+# Created with QUEST version 1.1.0.
 go_back = True
 back_text = Zurück
 forward_text = Weiter
diff --git a/test/osctest.txt b/test/osctest.txt
index df6d91dcbd86b4db35b43e87113078c33ae2ea92..6bcc5e972f7a0ee0de8cf2e0de37ebeafaaf989d 100644
--- a/test/osctest.txt
+++ b/test/osctest.txt
@@ -1,4 +1,4 @@
-# Created with QUEST version 1.0.6
+# Created with QUEST version 1.1.0.
 audio_ip = 127.0.0.1
 audio_port = 8000
 video_ip = 127.0.0.1
diff --git a/test/password_test.py b/test/password_test.py
index 6bcd4189a86350af6baf1511d7a04f834024e42d..7b196e245ce5ca2f66b408a4e8bff6ae3294b244 100644
--- a/test/password_test.py
+++ b/test/password_test.py
@@ -1,6 +1,6 @@
 """Testing the behaviour of PasswordEntry.py + QEditGui.py"""
 
-from context import *
+from context import pytest, QEditGuiMain, PasswordEntry, QHBoxLayout, keyboard, QIntValidator, QDoubleValidator, QRegularExpressionValidator, QPalette, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file
 
 
 @pytest.fixture
@@ -27,19 +27,19 @@ def run():
 # noinspection PyArgumentList
 def test_create(gui_init, qtbot):
     # create a page
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     # create a question
     tv.setCurrentItem(tv.topLevelItem(0).child(0))  # .setSelected(True)
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -52,40 +52,40 @@ def test_create(gui_init, qtbot):
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
-    QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter)
+    QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter)
     assert gui_init.gui.questiontype.currentText() == "Password"
     # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable)
     layout = gui_init.gui.edit_layout
     not_none_rows = 0
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem):
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["Password"][0].keys()
-            assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \
-                   'TextEdit' if fields_per_type["Password"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\
-                   else fields_per_type["Password"][0][layout.itemAt(row, 0).widget().text()]
-            if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Password"][0]
+            assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \
+                   'TextEdit' if fields_per_type["Password"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\
+                   else fields_per_type["Password"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()]
-            elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().isChecked() == default_values[
-                    layout.itemAt(row, 0).widget().text()]
-        elif type(layout.itemAt(row, 1)) == QHBoxLayout and \
-                gui_init.gui.pw_layout == layout.itemAt(row, 1):
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[
+                    layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+        elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout) and \
+                gui_init.gui.pw_layout == layout.itemAt(row, QFormLayout.ItemRole.FieldRole):
             not_none_rows += 1
-            assert layout.itemAt(row, 1).itemAt(1).widget().text() == default_values[
-                layout.itemAt(row, 0).widget().text()]
+            assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(1).widget().text() == default_values[
+                layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
     assert not_none_rows == len(fields_per_type["Password"][0].keys())
     assert len(gui_init.undo_stack) == 11  # 2 for creating page & question, 9 for choosing Password
 
@@ -100,7 +100,7 @@ def test_create(gui_init, qtbot):
             structure["Page 1"][key] = value
     structure["Page 1"]["Question 1"] = {"type": "Password"}
     for key, value in default_values.items():
-        if key in fields_per_type["Password"][0].keys():
+        if key in fields_per_type["Password"][0]:
             structure["Page 1"]["Question 1"][key] = value
     listify(gui_init.structure)
     listify(structure)
@@ -134,13 +134,13 @@ def test_password_file(gui_load, run, qtbot):
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     pw_str = find_row_by_label(gui_load.gui.edit_layout, 'password_file')
-    pwfile = gui_load.gui.edit_layout.itemAt(pw_str[0], 1).itemAt(pw_str[1]).widget().text()
+    pwfile = gui_load.gui.edit_layout.itemAt(pw_str[0], QFormLayout.ItemRole.FieldRole).itemAt(pw_str[1]).widget().text()
     with open(pwfile) as f:
         passwords = f.read().splitlines()
     for child in run.Stack.currentWidget().children():
-        if type(child) == PasswordEntry:
+        if isinstance(child, PasswordEntry):
             assert child.passwords == passwords
 
     def handle_file_chooser():
@@ -148,11 +148,11 @@ def test_password_file(gui_load, run, qtbot):
         keyboard.write("mock_pws_int.txt")
         keyboard.press("enter")
 
-    pw_btn = gui_load.gui.edit_layout.itemAt(find_row_by_label(gui_load.gui.edit_layout, 'password_file_btn')[0], 1).itemAt(0).widget()
+    pw_btn = gui_load.gui.edit_layout.itemAt(find_row_by_label(gui_load.gui.edit_layout, 'password_file_btn')[0], QFormLayout.ItemRole.FieldRole).itemAt(0).widget()
     QTimer.singleShot(100, handle_file_chooser)
     QTest.mouseClick(pw_btn, Qt.MouseButton.LeftButton)
 
-    pwfile = gui_load.gui.edit_layout.itemAt(pw_str[0], 1).itemAt(pw_str[1]).widget().text()
+    pwfile = gui_load.gui.edit_layout.itemAt(pw_str[0], QFormLayout.ItemRole.FieldRole).itemAt(pw_str[1]).widget().text()
     assert pwfile.endswith("mock_pws_int.txt")
     with open(pwfile) as f:
         passwords = f.read().splitlines()
@@ -165,8 +165,8 @@ def test_password_file(gui_load, run, qtbot):
 def test_policy(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -174,109 +174,118 @@ def test_policy(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     pw_str = find_row_by_label(gui_load.gui.edit_layout, 'password_file')
-    pwfile = gui_load.gui.edit_layout.itemAt(pw_str[0], 1).itemAt(pw_str[1]).widget()
+    pwfile = gui_load.gui.edit_layout.itemAt(pw_str[0], QFormLayout.ItemRole.FieldRole).itemAt(pw_str[1]).widget()
     answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'policy')
-    policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget()
+    policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget()
     assert policy_cb.currentText() == 'None'
     assert find_row_by_label(gui_load.gui.edit_layout, "min") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "max") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "dec") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/pwtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == PasswordEntry:
+        if isinstance(child, PasswordEntry):
             assert child.validator() is None
     test_gui.close()
 
-    QTest.mouseClick(policy_cb, Qt.LeftButton)
-    QTest.keyClick(policy_cb, Qt.Key_Down)
-    QTest.keyClick(policy_cb, Qt.Key_Enter)
+    QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Down, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000)
     assert policy_cb.currentText() == "int"
-    assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos+1, 1)
-    assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos+1, 3)
+    policy_cb.clearFocus()
+    gui_load.gui.setFocus()
+    assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos + 1, 1)
+    assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos + 1, 3)
     assert find_row_by_label(gui_load.gui.edit_layout, "dec") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None
     min_b = find_row_by_label(gui_load.gui.edit_layout, "min")
-    QTest.keyClicks(gui_load.gui.edit_layout.itemAt(min_b[0], 1).itemAt(min_b[1]).widget(), '1000')
-    gui_load.gui.edit_layout.itemAt(min_b[0], 1).itemAt(min_b[1]).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(min_b[0], 1).itemAt(min_b[1]).widget().text() == '1000'
+    QTest.keyClicks(gui_load.gui.edit_layout.itemAt(min_b[0], QFormLayout.ItemRole.FieldRole).itemAt(min_b[1]).widget(), '1000')
+    gui_load.gui.edit_layout.itemAt(min_b[0], QFormLayout.ItemRole.FieldRole).itemAt(min_b[1]).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(min_b[0], QFormLayout.ItemRole.FieldRole).itemAt(min_b[1]).widget().text() == '1000'
     max_b = find_row_by_label(gui_load.gui.edit_layout, "max")
-    QTest.keyClicks(gui_load.gui.edit_layout.itemAt(max_b[0], 1).itemAt(max_b[1]).widget(), '9999')
-    gui_load.gui.edit_layout.itemAt(max_b[0], 1).itemAt(max_b[1]).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(max_b[0], 1).itemAt(max_b[1]).widget().text() == '9999'
+    QTest.keyClicks(gui_load.gui.edit_layout.itemAt(max_b[0], QFormLayout.ItemRole.FieldRole).itemAt(max_b[1]).widget(), '9999')
+    gui_load.gui.edit_layout.itemAt(max_b[0], QFormLayout.ItemRole.FieldRole).itemAt(max_b[1]).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(max_b[0], QFormLayout.ItemRole.FieldRole).itemAt(max_b[1]).widget().text() == '9999'
     gui_load.structure["Page 1"]["Question 1"]["password_file"] = "./test/mock_pws_int.txt"
     pwfile.setText("./test/mock_pws_int.txt")
     gui_load.gui.refresh_button.click()
+    QTest.qWait(2000)
     assert gui_load.structure["Page 1"]["Question 1"]["policy"] == ['int', '1000', '9999']
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    gui_load.save() # have to enforce save since focus is lost somwhow....
+    QTest.qWait(1000)
     test_gui = StackedWindowGui("./test/pwtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == PasswordEntry:
-            assert type(child.validator()) == QIntValidator
+        if isinstance(child, PasswordEntry):
+            assert isinstance(child.validator(), QIntValidator)
     test_gui.close()
 
-    QTest.mouseClick(policy_cb, Qt.LeftButton)
-    QTest.keyClick(policy_cb, Qt.Key_Down)
-    QTest.keyClick(policy_cb, Qt.Key_Enter)
+    QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Down, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000)
     assert policy_cb.currentText() == "double"
-    assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos+1, 1)
-    assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos+1, 3)
-    assert find_row_by_label(gui_load.gui.edit_layout, "dec") == (answers_pos+1, 5)
+    assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos + 1, 1)
+    assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos + 1, 3)
+    assert find_row_by_label(gui_load.gui.edit_layout, "dec") == (answers_pos + 1, 5)
     assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None
     min_b = find_row_by_label(gui_load.gui.edit_layout, "min")
-    QTest.keyClicks(gui_load.gui.edit_layout.itemAt(min_b[0], 1).itemAt(min_b[1]).widget(), '1')
-    gui_load.gui.edit_layout.itemAt(min_b[0], 1).itemAt(min_b[1]).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(min_b[0], 1).itemAt(min_b[1]).widget().text() == '1'
+    QTest.keyClicks(gui_load.gui.edit_layout.itemAt(min_b[0], QFormLayout.ItemRole.FieldRole).itemAt(min_b[1]).widget(), '1')
+    gui_load.gui.edit_layout.itemAt(min_b[0], QFormLayout.ItemRole.FieldRole).itemAt(min_b[1]).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(min_b[0], QFormLayout.ItemRole.FieldRole).itemAt(min_b[1]).widget().text() == '1'
     max_b = find_row_by_label(gui_load.gui.edit_layout, "max")
-    QTest.keyClicks(gui_load.gui.edit_layout.itemAt(max_b[0], 1).itemAt(max_b[1]).widget(), '100')
-    gui_load.gui.edit_layout.itemAt(max_b[0], 1).itemAt(max_b[1]).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(max_b[0], 1).itemAt(max_b[1]).widget().text() == '100'
+    QTest.keyClicks(gui_load.gui.edit_layout.itemAt(max_b[0], QFormLayout.ItemRole.FieldRole).itemAt(max_b[1]).widget(), '100')
+    gui_load.gui.edit_layout.itemAt(max_b[0], QFormLayout.ItemRole.FieldRole).itemAt(max_b[1]).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(max_b[0], QFormLayout.ItemRole.FieldRole).itemAt(max_b[1]).widget().text() == '100'
     dec_b = find_row_by_label(gui_load.gui.edit_layout, "dec")
-    QTest.keyClicks(gui_load.gui.edit_layout.itemAt(dec_b[0], 1).itemAt(dec_b[1]).widget(), '2')
-    gui_load.gui.edit_layout.itemAt(dec_b[0], 1).itemAt(dec_b[1]).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(dec_b[0], 1).itemAt(dec_b[1]).widget().text() == '2'
+    QTest.keyClicks(gui_load.gui.edit_layout.itemAt(dec_b[0], QFormLayout.ItemRole.FieldRole).itemAt(dec_b[1]).widget(), '2')
+    gui_load.gui.edit_layout.itemAt(dec_b[0], QFormLayout.ItemRole.FieldRole).itemAt(dec_b[1]).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(dec_b[0], QFormLayout.ItemRole.FieldRole).itemAt(dec_b[1]).widget().text() == '2'
     gui_load.structure["Page 1"]["Question 1"]["password_file"] = "./test/mock_pws_double.txt"
     pwfile.setText("./test/mock_pws_double.txt")
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Question 1"]["policy"] == ['double', '1', '100', '2']
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    gui_load.save() # have to enforce save since focus is lost somwhow....
+    QTest.qWait(1000)
     test_gui = StackedWindowGui("./test/pwtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == PasswordEntry:
-            assert type(child.validator()) == QDoubleValidator
+        if isinstance(child, PasswordEntry):
+            assert isinstance(child.validator(), QDoubleValidator)
     test_gui.close()
 
-    QTest.mouseClick(policy_cb, Qt.LeftButton)
-    QTest.keyClick(policy_cb, Qt.Key_Down)
-    QTest.keyClick(policy_cb, Qt.Key_Enter)
+    QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Down, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000)
     assert policy_cb.currentText() == "regex"
     assert find_row_by_label(gui_load.gui.edit_layout, "min") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "max") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "dec") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "exp") == (answers_pos + 1, 1)
     exp_b = find_row_by_label(gui_load.gui.edit_layout, "exp")
-    QTest.keyClicks(gui_load.gui.edit_layout.itemAt(exp_b[0], 1).itemAt(exp_b[1]).widget(), '[A-Z]\\d')
-    gui_load.gui.edit_layout.itemAt(exp_b[0], 1).itemAt(exp_b[1]).widget().editingFinished.emit()
-    assert gui_load.gui.edit_layout.itemAt(exp_b[0], 1).itemAt(exp_b[1]).widget().text() == '[A-Z]\\d'
+    QTest.keyClicks(gui_load.gui.edit_layout.itemAt(exp_b[0], QFormLayout.ItemRole.FieldRole).itemAt(exp_b[1]).widget(), '[A-Z]\\d')
+    gui_load.gui.edit_layout.itemAt(exp_b[0], QFormLayout.ItemRole.FieldRole).itemAt(exp_b[1]).widget().editingFinished.emit()
+    assert gui_load.gui.edit_layout.itemAt(exp_b[0], QFormLayout.ItemRole.FieldRole).itemAt(exp_b[1]).widget().text() == '[A-Z]\\d'
     gui_load.structure["Page 1"]["Question 1"]["password_file"] = "./test/mock_pws_regex.txt"
     pwfile.setText("./test/mock_pws_regex.txt")
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Question 1"]["policy"] == ['regex', '[A-Z]\\d']
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    gui_load.save() # have to enforce save since focus is lost somwhow....
+    QTest.qWait(2000)
     test_gui = StackedWindowGui("./test/pwtest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == PasswordEntry:
-            assert type(child.validator()) == QRegExpValidator
+        if isinstance(child, PasswordEntry):
+            assert isinstance(child.validator(), QRegularExpressionValidator)
     test_gui.close()
 
-    QTest.mouseClick(policy_cb, Qt.LeftButton)
-    QTest.keyClick(policy_cb, Qt.Key_Up)
-    QTest.keyClick(policy_cb, Qt.Key_Up)
-    QTest.keyClick(policy_cb, Qt.Key_Up)
-    QTest.keyClick(policy_cb, Qt.Key_Enter)
+    QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Up)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Up)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Up)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000)
     assert policy_cb.currentText() == 'None'
     assert find_row_by_label(gui_load.gui.edit_layout, "min") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "max") is None
@@ -284,7 +293,8 @@ def test_policy(gui_load, qtbot):
     assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None
     gui_load.structure["Page 1"]["Question 1"]["password_file"] = "./test/mock_pws.txt"
     pwfile.setText("./test/mock_pws.txt")
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    gui_load.save() # have to enforce save since focus is lost somwhow....
     gui_load.close()
 
 
@@ -295,7 +305,7 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
     assert run.Stack.count() == 1
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_pw.csv', mode='r') as file:
@@ -304,15 +314,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'pw'
-                assert lines[2] == 'Start'
-                assert lines[3] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'pw'
+                assert results[2] == 'Start'
+                assert results[3] == 'End'
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == ''
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == ''
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_pw.csv")
 
 
@@ -321,11 +331,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
     with mock_file(r'./test/results/results_pw.csv'):
         assert run.Stack.count() == 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -333,15 +343,15 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'pw'
-                    assert lines[2] == 'Start'
-                    assert lines[3] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'pw'
+                    assert results[2] == 'Start'
+                    assert results[3] == 'End'
         assert len(results) == 4
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == ''
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == ''
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
         os.remove(res_file)
 
 
@@ -351,23 +361,23 @@ def test_execute_questionnaire_type_pw(run, qtbot):
         os.remove("./test/results/results_pw.csv")
     assert run.Stack.count() == 1
     for child in run.Stack.currentWidget().children():
-        if type(child) is PasswordEntry:
+        if isinstance(child, PasswordEntry):
             assert child.text() == ''
-            QTest.keyClicks(child, "wrong", modifier=Qt.NoModifier, delay=1)
+            QTest.keyClicks(child, "wrong", modifier=Qt.KeyboardModifier.NoModifier, delay=500)
             assert child.text() == 'wrong'
-            assert child.validate() == False
+            assert not child.validate()
             assert child.toolTip() == "Invalid password."
             assert child.objectName() == 'required'
-            # assert child.palette().color(6).name() == 'red'
+            # assert child.palette().color(QPalette.Text).name() == 'red'
             child.clear()
-            QTest.keyClicks(child, "password", modifier=Qt.NoModifier, delay=1)
+            QTest.keyClicks(child, "password", modifier=Qt.KeyboardModifier.NoModifier, delay=500)
             assert child.text() == 'password'
-            assert child.validate() == True
+            assert child.validate()
             assert child.toolTip() == ""
             assert child.objectName() == ''
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_pw.csv', mode='r') as file:
@@ -376,15 +386,15 @@ def test_execute_questionnaire_type_pw(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'pw'
-                assert lines[2] == 'Start'
-                assert lines[3] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'pw'
+                assert results[2] == 'Start'
+                assert results[3] == 'End'
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == 'password'
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == 'password'
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_pw.csv")
 
 
@@ -393,26 +403,26 @@ def test_execute_questionnaire_blocked(run, qtbot):
     with mock_file(r'./test/results/results_pw.csv'):
         assert run.Stack.count() == 1
         for child in run.Stack.currentWidget().children():
-            if type(child) is PasswordEntry:
+            if isinstance(child, PasswordEntry):
                 assert child.text() == ''
-                QTest.keyClicks(child, "wrong", modifier=Qt.NoModifier, delay=1)
+                QTest.keyClicks(child, "wrong", modifier=Qt.KeyboardModifier.NoModifier, delay=500)
                 assert child.text() == 'wrong'
-                assert child.validate() == False
+                assert not child.validate()
                 assert child.toolTip() == "Invalid password."
                 assert child.objectName() == 'required'
-                # assert child.palette().color(6).name() == 'red'
+                # assert child.palette().color(QPalette.Text).name() == 'red'
                 child.clear()
-                QTest.keyClicks(child, "password", modifier=Qt.NoModifier, delay=1)
+                QTest.keyClicks(child, "password", modifier=Qt.KeyboardModifier.NoModifier, delay=500)
                 assert child.text() == 'password'
-                assert child.validate() == True
+                assert child.validate()
                 assert child.toolTip() == ""
                 assert child.objectName() == ''
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -420,15 +430,15 @@ def test_execute_questionnaire_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'pw'
-                    assert lines[2] == 'Start'
-                    assert lines[3] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'pw'
+                    assert results[2] == 'Start'
+                    assert results[3] == 'End'
         assert len(results) == 4
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == 'password'
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == 'password'
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
         os.remove(res_file)
 
 
@@ -438,26 +448,26 @@ def test_execute_questionnaire_type_wrong_pw(run, qtbot):
         os.remove("./test/results/results_pw.csv")
     assert run.Stack.count() == 1
     for child in run.Stack.currentWidget().children():
-        if type(child) is PasswordEntry:
+        if isinstance(child, PasswordEntry):
             assert child.text() == ''
-            QTest.keyClicks(child, "wrong", modifier=Qt.NoModifier, delay=1)
+            QTest.keyClicks(child, "wrong", modifier=Qt.KeyboardModifier.NoModifier, delay=500)
             assert child.text() == 'wrong'
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
     for child in run.Stack.currentWidget().children():
-        if type(child) is PasswordEntry:
+        if isinstance(child, PasswordEntry):
             assert child.text() == 'wrong'
             assert child.toolTip() == "Invalid password."
             assert child.objectName() == 'required'
-            assert child.palette().color(6).name() == '#ff0000'  # == red
+            assert child.palette().color(QPalette.Text).name() == '#ff0000'  # == red
             child.clear()
-            QTest.keyClicks(child, "password", modifier=Qt.NoModifier, delay=1)
+            QTest.keyClicks(child, "password", modifier=Qt.KeyboardModifier.NoModifier, delay=500)
             assert child.text() == 'password'
-            assert child.validate() == True
+            assert child.validate()
             assert child.toolTip() == ""
             assert child.objectName() == ''
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_pw.csv', mode='r') as file:
@@ -466,13 +476,13 @@ def test_execute_questionnaire_type_wrong_pw(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'pw'
-                assert lines[2] == 'Start'
-                assert lines[3] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'pw'
+                assert results[2] == 'Start'
+                assert results[3] == 'End'
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == 'password'
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == 'password'
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_pw.csv")
diff --git a/test/pbtest.txt b/test/pbtest.txt
index 595ade74e1974bf7b30eacf5c6c73fd44b4b5f33..5bbb8e04444bf5ae563711518ac254928b38476b 100644
--- a/test/pbtest.txt
+++ b/test/pbtest.txt
@@ -1,4 +1,4 @@
-# Created with QUEST version 1.0.6
+# Created with QUEST version 1.1.0.
 pupil_ip = 127.0.0.1
 go_back = True
 back_text = Zurück
diff --git a/test/pbtest2.txt b/test/pbtest2.txt
index 78953da1a50e9cd66bb66428d25f48209962b1d2..54f650d648562ade2e9b9e2196b434052463b64d 100644
--- a/test/pbtest2.txt
+++ b/test/pbtest2.txt
@@ -1,4 +1,4 @@
-# Created with QUEST version 1.0.6
+# Created with QUEST version 1.1.0.
 pupil_ip = 127.0.0.1
 go_back = True
 back_text = Zurück
diff --git a/test/plain_text_test.py b/test/plain_text_test.py
index 91179cd633d451503f5c01d8b06ac0d975a35c05..8cd6ea6d016c6714ba1b3d698453fdf1e7e50d5e 100644
--- a/test/plain_text_test.py
+++ b/test/plain_text_test.py
@@ -1,6 +1,6 @@
 """Testing the behaviour of Plain text + QEditGui.py"""
 
-from context import *
+from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, QLabel, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file
 
 
 @pytest.fixture
@@ -27,19 +27,19 @@ def run():
 # noinspection PyArgumentList
 def test_create(gui_init, qtbot):
     # create a page
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     # create a question
     tv.setCurrentItem(tv.topLevelItem(0).child(0))  # .setSelected(True)
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -52,34 +52,34 @@ def test_create(gui_init, qtbot):
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
-    QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter)
+    QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter)
     assert gui_init.gui.questiontype.currentText() == "Plain Text"
     # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable)
     layout = gui_init.gui.edit_layout
     not_none_rows = 0
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem):
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["Plain Text"][0].keys()
-            assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \
-                   'TextEdit' if fields_per_type["Plain Text"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\
-                   else fields_per_type["Plain Text"][0][layout.itemAt(row, 0).widget().text()]
-            if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Plain Text"][0]
+            assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \
+                   'TextEdit' if fields_per_type["Plain Text"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\
+                   else fields_per_type["Plain Text"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()]
-            elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().isChecked() == default_values[
-                    layout.itemAt(row, 0).widget().text()]
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[
+                    layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
     assert not_none_rows == len(fields_per_type["Plain Text"][0].keys())
     assert len(gui_init.undo_stack) == 10  # 2 for creating page & question, 8 for choosing Plain Text
 
@@ -94,7 +94,7 @@ def test_create(gui_init, qtbot):
             structure["Page 1"][key] = value
     structure["Page 1"]["Question 1"] = {"type": "Plain Text"}
     for key, value in default_values.items():
-        if key in fields_per_type["Plain Text"][0].keys():
+        if key in fields_per_type["Plain Text"][0]:
             structure["Page 1"]["Question 1"][key] = value
     listify(gui_init.structure)
     listify(structure)
@@ -124,8 +124,8 @@ def test_create(gui_init, qtbot):
 def test_text(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -133,28 +133,28 @@ def test_text(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'text')
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("Some text.")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == "Some text."
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("Some text.")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == "Some text."
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["text"] == "Some text."
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
 
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().clear()
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().setPlainText("")
-    assert gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().text() == ""
-    gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget().editingFinished.emit()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().clear()
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().setPlainText("")
+    assert gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().text() == ""
+    gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget().editingFinished.emit()
     assert gui_load.structure["Page 1"]["Question 1"]["text"] == ""
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == True
+    assert not error_found
+    assert warning_found
     QTimer.singleShot(150, handle_dialog_no_save)
     gui_load.close()
 
@@ -163,11 +163,11 @@ def test_text(gui_load, qtbot):
 def test_execute_questionnaire_no_interaction(run, qtbot):
     assert run.Stack.count() == 1
     for child in run.Stack.currentWidget().children():
-        if type(child) == QLabel:
+        if isinstance(child, QLabel):
             assert child.text() == "This is a test.\nDoes it work?"
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_pt.csv', mode='r') as file:
@@ -176,13 +176,13 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'Start'
-                assert lines[2] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'Start'
+                assert results[2] == 'End'
     assert len(results) == 3
-    assert lines[0] == '1'  # participant number
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[1])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[1])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
     os.remove("./test/results/results_pt.csv")
 
 
@@ -191,11 +191,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
     with mock_file(r'./test/results/results_pt.csv'):
         assert run.Stack.count() == 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -203,11 +203,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'Start'
-                    assert lines[2] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'Start'
+                    assert results[2] == 'End'
         assert len(results) == 3
-        assert lines[0] == '-1'  # participant number unknown
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[1])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[1])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
         os.remove(res_file)
diff --git a/test/pltest.txt b/test/pltest.txt
index 1b9bd53c44972fe983bc7640c83ff011b3bdaecb..2411e21c9383ef59cc698365bc8c6c322a4de75a 100644
--- a/test/pltest.txt
+++ b/test/pltest.txt
@@ -1,4 +1,4 @@
-# Created with QUEST version 1.0.6
+# Created with QUEST version 1.1.0.
 go_back = True
 back_text = Zurück
 forward_text = Weiter
diff --git a/test/pltest2.txt b/test/pltest2.txt
index 200e51c5b9677d672e301b655e521a46016f02b0..82fa713a7c8663ca9e0330918b3a741dedc34dde 100644
--- a/test/pltest2.txt
+++ b/test/pltest2.txt
@@ -1,4 +1,4 @@
-# Created with QUEST version 1.0.6
+# Created with QUEST version 1.1.0.
 go_back = True
 back_text = Zurück
 forward_text = Weiter
diff --git a/test/pwtest.txt b/test/pwtest.txt
index 254e778098c82099ce0c75bf676eecc78b9172bf..92e5e0472b949de6f75b06fa0d6787cc0bbccf2a 100644
--- a/test/pwtest.txt
+++ b/test/pwtest.txt
@@ -1,4 +1,4 @@
-# Created with QUEST version 1.0.6
+# Created with QUEST version 1.1.0.
 go_back = True
 back_text = Zurück
 forward_text = Weiter
diff --git a/test/pytest.ini b/test/pytest.ini
index e7fa301c9cbd8e5cc72cbb044924b473b683e512..b127307aced9ff932c84fd78649a801c793daed6 100644
--- a/test/pytest.ini
+++ b/test/pytest.ini
@@ -1,4 +1,4 @@
 [pytest]
-qt_api=pyqt5
+qt_api=pyside6
 markers =
     pupil: marks tests as requiring Pupil Capture to be open (deselect with '-m "not pupil"')
\ No newline at end of file
diff --git a/test/rbtest.txt b/test/rbtest.txt
index b11edfe5e0b75079ac09d229a179e081b8013431..dd6f74aa1e3120344363661f703dac8bdb1f9c72 100644
--- a/test/rbtest.txt
+++ b/test/rbtest.txt
@@ -1,4 +1,4 @@
-# Created with QUEST version 1.0.6
+# Created with QUEST version 1.1.0.
 go_back = True
 back_text = Zurück
 forward_text = Weiter
diff --git a/test/rm_two_pages.txt b/test/rm_two_pages.txt
index c656dac96c071c9096d4870e445ef8a9f6369ea6..696b8da3e52679ec9471b148dd7934376dbc21d2 100644
--- a/test/rm_two_pages.txt
+++ b/test/rm_two_pages.txt
@@ -1,4 +1,4 @@
-# Created with QUEST version 1.0.6
+# Created with QUEST version 1.1.0.
 go_back = True
 back_text = Zurück
 forward_text = Weiter
diff --git a/test/rmtest.txt b/test/rmtest.txt
index fe1dbd87023ab2eee6412da689efd78bca171075..0de5dd1943145f685bd173e28bfc295e5735fed3 100644
--- a/test/rmtest.txt
+++ b/test/rmtest.txt
@@ -1,4 +1,4 @@
-# Created with QUEST version 1.0.6
+# Created with QUEST version 1.1.0.
 go_back = True
 back_text = Zurück
 forward_text = Weiter
diff --git a/test/save_after_tests.py b/test/save_after_tests.py
index 7fc0fbccd46dc141fd8dce33ebbde7367f0fb9fc..0e0139243624911b05f8fcc81b89a29a08519883 100644
--- a/test/save_after_tests.py
+++ b/test/save_after_tests.py
@@ -1,6 +1,6 @@
 """Testing the behaviour of save_after"""
 
-from context import *
+from context import pytest, QEditGuiMain, QTimer, StackedWindowGui, QTest, Qt, handle_dialog, os
 
 
 @pytest.fixture
@@ -36,9 +36,9 @@ def test_execute_questionnaire_1(run, qtbot):
     assert run.forwardbutton.text() == "Absenden"
     assert run.forwardbutton.isEnabled()
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
     assert run.forwardbutton.text() == "Absenden"
-    assert run.forwardbutton.isEnabled() == False
+    assert not run.forwardbutton.isEnabled()
 
     os.remove("./test/results/results.csv")
 
@@ -50,13 +50,12 @@ def test_execute_questionnaire_2(run2, qtbot):
     assert run2.Stack.count() == 2
     assert run2.forwardbutton.text() == "Weiter"
     assert run2.forwardbutton.isEnabled()
-    QTest.mouseClick(run2.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run2.forwardbutton, Qt.MouseButton.LeftButton)
     assert run2.forwardbutton.text() == "Absenden"
     assert run2.forwardbutton.isEnabled()
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run2.forwardbutton, Qt.LeftButton)
-    assert run2.forwardbutton.isEnabled() == False
-
+    QTest.mouseClick(run2.forwardbutton, Qt.MouseButton.LeftButton)
+    assert not run2.forwardbutton.isEnabled()
     os.remove("./test/results/results.csv")
 
 
@@ -68,11 +67,11 @@ def test_execute_questionnaire_3(run3, qtbot):
     assert run3.forwardbutton.text() == "Absenden"
     assert run3.forwardbutton.isEnabled()
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run3.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run3.forwardbutton, Qt.MouseButton.LeftButton)
     assert run3.forwardbutton.text() == "Weiter"
     assert run3.forwardbutton.isEnabled()
-    QTest.mouseClick(run3.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run3.forwardbutton, Qt.MouseButton.LeftButton)
     assert run3.forwardbutton.text() == "Weiter"
-    assert run3.forwardbutton.isEnabled() == False
+    assert not run3.forwardbutton.isEnabled()
 
     os.remove("./test/results/results.csv")
diff --git a/test/sltest.txt b/test/sltest.txt
index ba3c2ca17c255696fc10fe84554941cdc004f407..2fbb17a39c16e7a91a6c88c706f72f7548f6295c 100644
--- a/test/sltest.txt
+++ b/test/sltest.txt
@@ -1,4 +1,4 @@
-# Created with QUEST version 1.0.6
+# Created with QUEST version 1.1.0.
 go_back = True
 back_text = Zurück
 forward_text = Weiter
diff --git a/test/str_to_list_test.py b/test/str_to_list_test.py
index 7323784ab7fe0235ade3f89a6fa8e1903854b124..540f3c529d10b647ce9d6e9f3d2af3216bc7d637 100644
--- a/test/str_to_list_test.py
+++ b/test/str_to_list_test.py
@@ -1,6 +1,6 @@
 """Test if the string_to_list function in Validator.py is working correctly."""
 
-from context import *
+from context import string_to_list
 
 
 def test_single_string():
@@ -67,7 +67,7 @@ def test_quotes():
 
 # TODO this does not work, should it?
 '''
-def test_quotes_comma():  
+def test_quotes_comma():
     assert string_to_list("except 'this, that' one") == ["except 'this, that' one"]
     assert string_to_list("[except 'this, that' one]") == ["except 'this, that' one"]
     assert string_to_list("except 'this, that'") == ["except 'this, that'"]
diff --git a/test/test_helpers.py b/test/test_helpers.py
index 6837bc68d6cf97c87cd49aa013120d97b54c7150..63e5525c368b79f4ea4eb1a2b8d4cac44991eb9a 100644
--- a/test/test_helpers.py
+++ b/test/test_helpers.py
@@ -3,9 +3,9 @@ import os
 
 import keyboard
 import psutil
-from PyQt5.QtCore import Qt
-from PyQt5.QtTest import QTest
-from PyQt5.QtWidgets import QApplication, QMessageBox, QLineEdit, QWidgetItem, QHBoxLayout
+from PySide6.QtCore import Qt
+from PySide6.QtTest import QTest
+from PySide6.QtWidgets import QApplication, QMessageBox, QLineEdit, QWidgetItem, QHBoxLayout, QFormLayout
 
 PUPIL_PATH = "C:\\Program Files (x86)\\Pupil-Labs\\Pupil v3.5.1\\Pupil Capture v3.5.1\\pupil_capture.exe"
 
@@ -14,7 +14,7 @@ PUPIL_PATH = "C:\\Program Files (x86)\\Pupil-Labs\\Pupil v3.5.1\\Pupil Capture v
 def handle_dialog_sa():
     """Click 'No' on change save_after dialog."""
     dialog = QApplication.activeModalWidget()
-    QTest.mouseClick(dialog.buttons()[1], Qt.LeftButton)
+    QTest.mouseClick(dialog.buttons()[1], Qt.MouseButton.LeftButton)
 
 
 # noinspection PyArgumentList
@@ -37,28 +37,28 @@ def handle_dialog_q():
 def handle_dialog():
     """Click 'Yes' on save dialog."""
     dialog = QApplication.activeModalWidget()
-    QTest.mouseClick(dialog.buttons()[0], Qt.LeftButton)
+    QTest.mouseClick(dialog.buttons()[0], Qt.MouseButton.LeftButton)
 
 
 # noinspection PyArgumentList
 def handle_dialog_no_save():
     """Click 'No' on save dialog."""
     dialog = QApplication.activeModalWidget()
-    QTest.mouseClick(dialog.buttons()[1], Qt.LeftButton)
+    QTest.mouseClick(dialog.buttons()[1], Qt.MouseButton.LeftButton)
 
 
 # noinspection PyArgumentList
 def handle_dialog_error():
     """Click 'OK' on error dialog."""
     dialog = QApplication.activeModalWidget()
-    QTest.mouseClick(dialog.button(QMessageBox.Ok), Qt.LeftButton)
+    QTest.mouseClick(dialog.button(QMessageBox.StandardButton.Ok), Qt.MouseButton.LeftButton)
 
 
 # noinspection PyArgumentList
 def handle_dialog_warning():
     """Click 'Yes' on dialog and execute questionnaire."""
     dialog = QApplication.activeModalWidget()
-    QTest.mouseClick(dialog.button(QMessageBox.Yes), Qt.LeftButton)
+    QTest.mouseClick(dialog.button(QMessageBox.StandardButton.Yes), Qt.MouseButton.LeftButton)
 
 
 # noinspection PyArgumentList
@@ -91,12 +91,12 @@ def find_row_by_label(layout, label):
         row of the field
     """
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem and layout.itemAt(row, 0).widget().text() == label:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() == label:
             return row
-        elif type(layout.itemAt(row, 1)) == QHBoxLayout:
-            for child in range(layout.itemAt(row, 1).count()):
-                if type(layout.itemAt(row, 1).itemAt(child)) == QWidgetItem and \
-                        layout.itemAt(row, 1).itemAt(child).widget().objectName() == label:
+        elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout):
+            for child in range(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).count()):
+                if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(child), QWidgetItem) and \
+                        layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(child).widget().objectName() == label:
                     return row, child
 
 
@@ -104,3 +104,4 @@ def open_pupil():
     """Checks if Pupil Capture is open and if not starts it."""
     if "pupil_capture.exe" not in (i.name() for i in psutil.process_iter()):
         os.startfile(PUPIL_PATH)  # subprocess.call([PUPIL_PATH]) ?
+        QTest.qWait(2000)
diff --git a/test/text_test.py b/test/text_test.py
index bab204f63e4a99ea9f4447223290b224fe8118c0..52d444b70a055837e0f05150f84c8dc57e8b4448 100644
--- a/test/text_test.py
+++ b/test/text_test.py
@@ -1,6 +1,6 @@
 """Testing the behaviour of AnswerTextField.py + QEditGui.py"""
 
-from context import *
+from context import pytest, QEditGuiMain, QTimer, open_config_file, StackedWindowGui, QTest, handle_dialog_p, handle_dialog_q, Qt, QFormLayout, QWidgetItem, fields_per_type, default_values, QCheckBox, QLineEdit, page_fields, listify, ConfigObj, general_fields, handle_dialog_error, validate_questionnaire, handle_dialog_no_save, find_row_by_label, handle_dialog, csv, re, os, mock_file, QPlainTextEdit, QHBoxLayout, QRadioButton, QIntValidator, QDoubleValidator, QRegularExpressionValidator, QButtonGroup
 
 
 @pytest.fixture
@@ -27,19 +27,19 @@ def run():
 # noinspection PyArgumentList
 def test_create(gui_init, qtbot):
     # create a page
-    assert gui_init.gui.page_add.isEnabled() == True
+    assert gui_init.gui.page_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_p)
-    QTest.mouseClick(gui_init.gui.page_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.page_add, Qt.MouseButton.LeftButton, delay=1000)
     tv = gui_init.gui.treeview
     # create a question
     tv.setCurrentItem(tv.topLevelItem(0).child(0))
-    assert gui_init.gui.question_add.isEnabled() == True
+    assert gui_init.gui.question_add.isEnabled()
     QTest.qWait(500)
 
     QTimer.singleShot(100, handle_dialog_q)
-    QTest.mouseClick(gui_init.gui.question_add, Qt.LeftButton, delay=1)
+    QTest.mouseClick(gui_init.gui.question_add, Qt.MouseButton.LeftButton, delay=1000)
     assert tv.itemAt(0, 0).text(0) == "<new questionnaire>"
     assert tv.topLevelItemCount() == 1
     assert tv.topLevelItem(0).childCount() == 1
@@ -52,36 +52,36 @@ def test_create(gui_init, qtbot):
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
     assert len(tv.selectedItems()) == 1
     assert tv.selectedItems()[0].text(0) == "Question 1"
-    QTest.mouseClick(gui_init.gui.questiontype, Qt.LeftButton)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Down)
-    QTest.keyClick(gui_init.gui.questiontype, Qt.Key_Enter)
+    QTest.mouseClick(gui_init.gui.questiontype, Qt.MouseButton.LeftButton)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Down)
+    QTest.keyClick(gui_init.gui.questiontype, Qt.Key.Key_Enter)
     assert gui_init.gui.questiontype.currentText() == "Text"
     # check if the layout is correct, if all needed fields are loaded and have correct default values (if applicable)
     layout = gui_init.gui.edit_layout
     not_none_rows = 0
     for row in range(layout.rowCount()):
-        if type(layout.itemAt(row, 1)) == QWidgetItem:
+        if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QWidgetItem):
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["Text"][0].keys()
-            assert str(type(layout.itemAt(row, 1).widget())).strip("'<>").rsplit(".", 1)[1] == \
-                   'TextEdit' if fields_per_type["Text"][0][layout.itemAt(row, 0).widget().text()] == 'QPlainTextEdit'\
-                   else fields_per_type["Text"][0][layout.itemAt(row, 0).widget().text()]
-            if type(layout.itemAt(row, 1).widget()) == QLineEdit and layout.itemAt(row, 0).widget().text() in \
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Text"][0]
+            assert str(type(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget())).strip("'<>").rsplit(".", 1)[1] == \
+                   'TextEdit' if fields_per_type["Text"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()] == 'QPlainTextEdit'\
+                   else fields_per_type["Text"][0][layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QLineEdit) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().text() == default_values[layout.itemAt(row, 0).widget().text()]
-            elif type(layout.itemAt(row, 1).widget()) == QCheckBox and layout.itemAt(row, 0).widget().text() in \
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().text() == default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+            elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget(), QCheckBox) and layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in \
                     default_values:
-                assert layout.itemAt(row, 1).widget().isChecked() == default_values[
-                    layout.itemAt(row, 0).widget().text()]
-        elif type(layout.itemAt(row, 1)) == QHBoxLayout and layout.itemAt(row, 1).count() > 0:
+                assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).widget().isChecked() == default_values[
+                    layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
+        elif isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole), QHBoxLayout) and layout.itemAt(row, QFormLayout.ItemRole.FieldRole).count() > 0:
             not_none_rows += 1
-            assert layout.itemAt(row, 0).widget().text() in fields_per_type["Text"][0].keys()
-            for cnt in range(layout.itemAt(row, 1).count()):
-                if type(layout.itemAt(row, 1).itemAt(cnt).widget()) == QRadioButton:
-                    assert layout.itemAt(row, 1).itemAt(cnt).widget().group().checkedId() + 1 == \
-                           default_values[layout.itemAt(row, 0).widget().text()]
+            assert layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text() in fields_per_type["Text"][0]
+            for cnt in range(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).count()):
+                if isinstance(layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(cnt).widget(), QRadioButton):
+                    assert layout.itemAt(row, QFormLayout.ItemRole.FieldRole).itemAt(cnt).widget().group().checkedId() + 1 == \
+                           default_values[layout.itemAt(row, QFormLayout.ItemRole.LabelRole).widget().text()]
     assert not_none_rows == len(fields_per_type["Text"][0].keys())
     assert len(gui_init.undo_stack) == 5  # 2 for creating page & question, 3 for choosing Text
 
@@ -96,7 +96,7 @@ def test_create(gui_init, qtbot):
             structure["Page 1"][key] = value
     structure["Page 1"]["Question 1"] = {"type": "Text"}
     for key, value in default_values.items():
-        if key in fields_per_type["Text"][0].keys():
+        if key in fields_per_type["Text"][0]:
             structure["Page 1"]["Question 1"][key] = value
     listify(gui_init.structure)
     listify(structure)
@@ -126,8 +126,8 @@ def test_create(gui_init, qtbot):
 def test_policy(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -135,33 +135,33 @@ def test_policy(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'policy')
-    policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget()
+    policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget()
     assert policy_cb.currentText() == 'None'
     assert find_row_by_label(gui_load.gui.edit_layout, "min") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "max") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "dec") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/tftest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QLineEdit:
+        if isinstance(child, QLineEdit):
             assert child.validator() is None
     test_gui.close()
 
-    QTest.mouseClick(policy_cb, Qt.LeftButton)
-    QTest.keyClick(policy_cb, Qt.Key_Down)
-    QTest.keyClick(policy_cb, Qt.Key_Enter)
+    QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Down, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000)
     assert policy_cb.currentText() == "int"
-    assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos+1, 1)
-    assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos+1, 3)
+    assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos + 1, 1)
+    assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos + 1, 3)
     assert find_row_by_label(gui_load.gui.edit_layout, "dec") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None
     hboxes = gui_load.gui.edit_layout.findChildren(QHBoxLayout)
     hbox = None
     for box in hboxes:
-        if type(box.itemAt(1).widget()) == QLineEdit:
+        if isinstance(box.itemAt(1).widget(), QLineEdit):
             hbox = box
     QTest.keyClicks(hbox.itemAt(1).widget(), '1')
     hbox.itemAt(1).widget().editingFinished.emit()
@@ -171,24 +171,26 @@ def test_policy(gui_load, qtbot):
     assert hbox.itemAt(3).widget().text() == '100'
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Question 1"]["policy"] == ['int', '1', '100']
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    gui_load.save() # have to enforce save since focus is lost somwhow....
+    QTest.qWait(1000)
     test_gui = StackedWindowGui("./test/tftest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QLineEdit:
-            assert type(child.validator()) == QIntValidator
+        if isinstance(child, QLineEdit):
+            assert isinstance(child.validator(), QIntValidator)
     test_gui.close()
 
-    QTest.mouseClick(policy_cb, Qt.LeftButton)
-    QTest.keyClick(policy_cb, Qt.Key_Down)
-    QTest.keyClick(policy_cb, Qt.Key_Enter)
+    QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Down, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000)
     assert policy_cb.currentText() == "double"
-    assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos+1, 1)
-    assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos+1, 3)
-    assert find_row_by_label(gui_load.gui.edit_layout, "dec") == (answers_pos+1, 5)
+    assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos + 1, 1)
+    assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos + 1, 3)
+    assert find_row_by_label(gui_load.gui.edit_layout, "dec") == (answers_pos + 1, 5)
     assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None
     hboxes = gui_load.gui.edit_layout.findChildren(QHBoxLayout)
     for box in hboxes:
-        if type(box.itemAt(1).widget()) == QLineEdit:
+        if isinstance(box.itemAt(1).widget(), QLineEdit):
             hbox = box
     QTest.keyClicks(hbox.itemAt(1).widget(), '1')
     hbox.itemAt(1).widget().editingFinished.emit()
@@ -201,16 +203,18 @@ def test_policy(gui_load, qtbot):
     assert hbox.itemAt(5).widget().text() == '2'
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Question 1"]["policy"] == ['double', '1', '100', '2']
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    gui_load.save() # have to enforce save since focus is lost somwhow....
+    QTest.qWait(1000)
     test_gui = StackedWindowGui("./test/tftest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QLineEdit:
-            assert type(child.validator()) == QDoubleValidator
+        if isinstance(child, QLineEdit):
+            assert isinstance(child.validator(), QDoubleValidator)
     test_gui.close()
 
-    QTest.mouseClick(policy_cb, Qt.LeftButton)
-    QTest.keyClick(policy_cb, Qt.Key_Down)
-    QTest.keyClick(policy_cb, Qt.Key_Enter)
+    QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Down, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000)
     assert policy_cb.currentText() == "regex"
     assert find_row_by_label(gui_load.gui.edit_layout, "min") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "max") is None
@@ -218,32 +222,34 @@ def test_policy(gui_load, qtbot):
     assert find_row_by_label(gui_load.gui.edit_layout, "exp") == (answers_pos + 1, 1)
     hboxes = gui_load.gui.edit_layout.findChildren(QHBoxLayout)
     for box in hboxes:
-        if type(box.itemAt(1).widget()) == QLineEdit:
+        if isinstance(box.itemAt(1).widget(), QLineEdit):
             hbox = box
     QTest.keyClicks(hbox.itemAt(1).widget(), '[A-Z]')
     hbox.itemAt(1).widget().editingFinished.emit()
     assert hbox.itemAt(1).widget().text() == '[A-Z]'
     gui_load.gui.refresh_button.click()
     assert gui_load.structure["Page 1"]["Question 1"]["policy"] == ['regex', '[A-Z]']
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
+    gui_load.save() # have to enforce save since focus is lost somwhow....
+    QTest.qWait(1000)
     test_gui = StackedWindowGui("./test/tftest.txt")
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) == QLineEdit:
-            assert type(child.validator()) == QRegExpValidator
+        if isinstance(child, QLineEdit):
+            assert isinstance(child.validator(), QRegularExpressionValidator)
     test_gui.close()
 
-    QTest.mouseClick(policy_cb, Qt.LeftButton)
-    QTest.keyClick(policy_cb, Qt.Key_Up)
-    QTest.keyClick(policy_cb, Qt.Key_Up)
-    QTest.keyClick(policy_cb, Qt.Key_Up)
-    QTest.keyClick(policy_cb, Qt.Key_Enter)
+    QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Up)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Up)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Up)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000)
     assert policy_cb.currentText() == 'None'
     assert find_row_by_label(gui_load.gui.edit_layout, "min") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "max") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "dec") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None
     assert gui_load.structure["Page 1"]["Question 1"]["size"] == '1'
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     gui_load.save()
     gui_load.close()
     QTest.qWait(500)
@@ -253,8 +259,8 @@ def test_policy(gui_load, qtbot):
 def test_policy_enable(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -262,9 +268,9 @@ def test_policy_enable(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'policy')
-    policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget()
+    policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget()
     assert policy_cb.currentText() == 'None'
     assert find_row_by_label(gui_load.gui.edit_layout, "min") is None
     assert find_row_by_label(gui_load.gui.edit_layout, "max") is None
@@ -274,24 +280,24 @@ def test_policy_enable(gui_load, qtbot):
     hboxes = gui_load.gui.edit_layout.findChildren(QHBoxLayout)
     hbox = None
     for box in hboxes:
-        if box.count() > 0 and type(box.itemAt(0).widget()) == QRadioButton:
+        if box.count() > 0 and isinstance(box.itemAt(0).widget(), QRadioButton):
             hbox = box
-    assert type(hbox.itemAt(1).widget()) == QRadioButton
+    assert isinstance(hbox.itemAt(1).widget(), QRadioButton)
     assert hbox.findChild(QButtonGroup).checkedId() == 0
-    assert hbox.itemAt(1).widget().isChecked() == False
+    assert not hbox.itemAt(1).widget().isChecked()
     hbox.itemAt(1).widget().click()
-    assert hbox.itemAt(1).widget().isChecked() == True
+    assert hbox.itemAt(1).widget().isChecked()
     assert hbox.findChild(QButtonGroup).checkedId() == 1
     assert policy_cb.currentText() == 'None'
-    assert policy_cb.isEnabled() == False
+    assert not policy_cb.isEnabled()
 
     hbox.itemAt(0).widget().click()
-    assert hbox.itemAt(0).widget().isChecked() == True
+    assert hbox.itemAt(0).widget().isChecked()
     assert policy_cb.currentText() == 'None'
-    assert policy_cb.isEnabled() == True
-    QTest.mouseClick(policy_cb, Qt.LeftButton)
-    QTest.keyClick(policy_cb, Qt.Key_Down)
-    QTest.keyClick(policy_cb, Qt.Key_Enter)
+    assert policy_cb.isEnabled()
+    QTest.mouseClick(policy_cb, Qt.MouseButton.LeftButton, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Down, delay=1000)
+    QTest.keyClick(policy_cb, Qt.Key.Key_Enter, delay=1000)
     assert policy_cb.currentText() == "int"
     assert find_row_by_label(gui_load.gui.edit_layout, "min") == (answers_pos + 1, 1)
     assert find_row_by_label(gui_load.gui.edit_layout, "max") == (answers_pos + 1, 3)
@@ -299,18 +305,18 @@ def test_policy_enable(gui_load, qtbot):
     assert find_row_by_label(gui_load.gui.edit_layout, "exp") is None
 
     hbox.itemAt(1).widget().click()
-    assert hbox.itemAt(1).widget().isChecked() == True
+    assert hbox.itemAt(1).widget().isChecked()
     assert hbox.findChild(QButtonGroup).checkedId() == 1
     assert policy_cb.currentText() == 'None'
-    assert policy_cb.isEnabled() == False
+    assert not policy_cb.isEnabled()
 
     hbox.itemAt(0).widget().click()
-    assert hbox.itemAt(0).widget().isChecked() == True
+    assert hbox.itemAt(0).widget().isChecked()
     assert hbox.findChild(QButtonGroup).checkedId() == 0
     assert policy_cb.currentText() == 'None'
-    assert policy_cb.isEnabled() == True
+    assert policy_cb.isEnabled()
     assert gui_load.structure["Page 1"]["Question 1"]["size"] == 1
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     gui_load.save()
     gui_load.close()
 
@@ -323,15 +329,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
     found_le = False
     found_te = False
     for child in run.Stack.currentWidget().children():
-        if type(child) == QLineEdit:
+        if isinstance(child, QLineEdit):
             found_le = True
-        elif type(child) == QPlainTextEdit:
+        elif isinstance(child, QPlainTextEdit):
             found_te = True
-    assert found_le == True
-    assert found_te == False
+    assert found_le
+    assert not found_te
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_tf.csv', mode='r') as file:
@@ -340,15 +346,15 @@ def test_execute_questionnaire_no_interaction(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'tf'
-                assert lines[2] == 'Start'
-                assert lines[3] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'tf'
+                assert results[2] == 'Start'
+                assert results[3] == 'End'
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == ''
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == ''
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_tf.csv")
 
 
@@ -357,11 +363,11 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
     with mock_file(r'./test/results/results_tf.csv'):
         assert run.Stack.count() == 1
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -369,15 +375,15 @@ def test_execute_questionnaire_no_interaction_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'tf'
-                    assert lines[2] == 'Start'
-                    assert lines[3] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'tf'
+                    assert results[2] == 'Start'
+                    assert results[3] == 'End'
         assert len(results) == 4
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == ''
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == ''
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
         os.remove(res_file)
 
 
@@ -387,13 +393,13 @@ def test_execute_questionnaire(run, qtbot):
         os.remove("./test/results/results_tf.csv")
     assert run.Stack.count() == 1
     for child in run.Stack.currentWidget().children():
-        if type(child) is QLineEdit:
+        if isinstance(child, QLineEdit):
             assert child.text() == ''
-            QTest.keyClicks(child, "texttext", modifier=Qt.NoModifier, delay=1)
+            QTest.keyClicks(child, "texttext", modifier=Qt.KeyboardModifier.NoModifier, delay=500)
             assert child.text() == 'texttext'
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_tf.csv', mode='r') as file:
@@ -402,15 +408,15 @@ def test_execute_questionnaire(run, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'tf'
-                assert lines[2] == 'Start'
-                assert lines[3] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'tf'
+                assert results[2] == 'Start'
+                assert results[3] == 'End'
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == 'texttext'
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == 'texttext'
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_tf.csv")
 
 
@@ -419,18 +425,18 @@ def test_execute_questionnaire_blocked(run, qtbot):
     with mock_file(r'./test/results/results_tf.csv'):
         assert run.Stack.count() == 1
         for child in run.Stack.currentWidget().children():
-            if type(child) is QLineEdit:
+            if isinstance(child, QLineEdit):
                 assert child.text() == ''
-                QTest.keyClicks(child, "texttext", modifier=Qt.NoModifier, delay=1)
+                QTest.keyClicks(child, "texttext", modifier=Qt.KeyboardModifier.NoModifier, delay=500)
                 assert child.text() == 'texttext'
 
         QTimer.singleShot(100, handle_dialog)
-        QTest.mouseClick(run.forwardbutton, Qt.LeftButton)
+        QTest.mouseClick(run.forwardbutton, Qt.MouseButton.LeftButton)
 
         res_file = None
         for file in os.listdir("./test/results/"):
             if file.find("_backup_"):
-                res_file = "./test/results/{}".format(file)
+                res_file = f'./test/results/{file}'
         results = []
         with open(res_file, mode='r') as file:
             csv_file = csv.reader(file, delimiter=';')
@@ -438,15 +444,15 @@ def test_execute_questionnaire_blocked(run, qtbot):
             for lines in csv_file:
                 results = lines
                 if results[0].startswith('data'):
-                    assert lines[0] == 'data_row_number'  # participant number
-                    assert lines[1] == 'tf'
-                    assert lines[2] == 'Start'
-                    assert lines[3] == 'End'
+                    assert results[0] == 'data_row_number'  # participant number
+                    assert results[1] == 'tf'
+                    assert results[2] == 'Start'
+                    assert results[3] == 'End'
         assert len(results) == 4
-        assert lines[0] == '-1'  # participant number unknown
-        assert lines[1] == 'texttext'
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+        assert results[0] == '-1'  # participant number unknown
+        assert results[1] == 'texttext'
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+        assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
         os.remove(res_file)
 
 
@@ -454,8 +460,8 @@ def test_execute_questionnaire_blocked(run, qtbot):
 def test_execute_textedit(gui_load, qtbot):
     QTimer.singleShot(150, handle_dialog_error)
     error_found, warning_found, warning_details = validate_questionnaire(gui_load.structure)
-    assert error_found == False
-    assert warning_found == False
+    assert not error_found
+    assert not warning_found
     tv = gui_load.gui.treeview
     tv.expandAll()
     tv.setCurrentItem(tv.topLevelItem(0).child(0).child(0))  # should be 'Question 1'
@@ -463,38 +469,38 @@ def test_execute_textedit(gui_load, qtbot):
     assert tv.selectedItems()[0].text(0) == "Question 1"
 
     rect = tv.visualItemRect(tv.currentItem())
-    QTest.mouseClick(tv.viewport(), Qt.LeftButton, Qt.NoModifier, rect.center())
+    QTest.mouseClick(tv.viewport(), Qt.MouseButton.LeftButton, Qt.KeyboardModifier.NoModifier, rect.center())
     answers_pos = find_row_by_label(gui_load.gui.edit_layout, 'policy')
-    policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, 1).widget()
+    policy_cb = gui_load.gui.edit_layout.itemAt(answers_pos, QFormLayout.ItemRole.FieldRole).widget()
     hboxes = gui_load.gui.edit_layout.findChildren(QHBoxLayout)
     hbox = None
     for box in hboxes:
-        if box.count() > 0 and type(box.itemAt(0).widget()) == QRadioButton:
+        if box.count() > 0 and isinstance(box.itemAt(0).widget(), QRadioButton):
             hbox = box
-    assert type(hbox.itemAt(1).widget()) == QRadioButton
+    assert isinstance(hbox.itemAt(1).widget(), QRadioButton)
     assert hbox.findChild(QButtonGroup).checkedId() == 0
-    assert hbox.itemAt(1).widget().isChecked() == False
+    assert not hbox.itemAt(1).widget().isChecked()
     hbox.itemAt(1).widget().click()
-    assert hbox.itemAt(1).widget().isChecked() == True
+    assert hbox.itemAt(1).widget().isChecked()
     assert hbox.findChild(QButtonGroup).checkedId() == 1
     assert policy_cb.currentText() == 'None'
-    assert policy_cb.isEnabled() == False
+    assert not policy_cb.isEnabled()
 
     if os.path.exists("./test/results/results_tf.csv"):
         os.remove("./test/results/results_tf.csv")
     gui_load.gui.refresh_button.click()
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     test_gui = StackedWindowGui("./test/tftest.txt")
 
     assert test_gui.Stack.count() == 1
     for child in test_gui.Stack.currentWidget().children():
-        if type(child) is QPlainTextEdit:
+        if isinstance(child, QPlainTextEdit):
             assert child.toPlainText() == ''
-            QTest.keyClicks(child, "texttext", modifier=Qt.NoModifier, delay=1)
+            QTest.keyClicks(child, "texttext", modifier=Qt.KeyboardModifier.NoModifier, delay=500)
             assert child.toPlainText() == 'texttext'
 
     QTimer.singleShot(100, handle_dialog)
-    QTest.mouseClick(test_gui.forwardbutton, Qt.LeftButton)
+    QTest.mouseClick(test_gui.forwardbutton, Qt.MouseButton.LeftButton)
 
     results = []
     with open('./test/results/results_tf.csv', mode='r') as file:
@@ -503,30 +509,30 @@ def test_execute_textedit(gui_load, qtbot):
         for lines in csv_file:
             results = lines
             if results[0].startswith('data'):
-                assert lines[0] == 'data_row_number'  # participant number
-                assert lines[1] == 'tf'
-                assert lines[2] == 'Start'
-                assert lines[3] == 'End'
+                assert results[0] == 'data_row_number'  # participant number
+                assert results[1] == 'tf'
+                assert results[2] == 'Start'
+                assert results[3] == 'End'
     assert len(results) == 4
-    assert lines[0] == '1'  # participant number
-    assert lines[1] == 'texttext'
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[2])  # timestamp
-    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', lines[3])  # timestamp
+    assert results[0] == '1'  # participant number
+    assert results[1] == 'texttext'
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[2])  # timestamp
+    assert re.match(r'\d+-\d+-\d+ \d+:\d+:\d+.\d+', results[3])  # timestamp
     os.remove("./test/results/results_tf.csv")
 
     assert hbox.findChild(QButtonGroup).checkedId() == 1
-    assert hbox.itemAt(1).widget().isChecked() == True
+    assert hbox.itemAt(1).widget().isChecked()
     hbox.itemAt(0).widget().click()
-    assert hbox.itemAt(0).widget().isChecked() == True
+    assert hbox.itemAt(0).widget().isChecked()
     assert hbox.findChild(QButtonGroup).checkedId() == 0
     assert policy_cb.currentText() == 'None'
-    assert policy_cb.isEnabled() == True
+    assert policy_cb.isEnabled()
     gui_load.gui.refresh_button.click()
-    assert hbox.itemAt(0).widget().isChecked() == True
+    assert hbox.itemAt(0).widget().isChecked()
     assert hbox.findChild(QButtonGroup).checkedId() == 0
     assert policy_cb.currentText() == 'None'
-    assert policy_cb.isEnabled() == True
+    assert policy_cb.isEnabled()
     assert gui_load.structure['Page 1']['Question 1']['size'] == 1
-    QTest.keyClicks(gui_load, 's', modifier=Qt.ControlModifier)
+    QTest.keyClicks(gui_load, 's', modifier=Qt.KeyboardModifier.ControlModifier, delay=1000)
     gui_load.save()
     gui_load.close()
diff --git a/test/tftest.txt b/test/tftest.txt
index fe78ab161b827c42004bfe60f18e5ef8df6969dc..f08d2f0e9cf6d1656ae81bd238848c3e26835e5e 100644
--- a/test/tftest.txt
+++ b/test/tftest.txt
@@ -1,4 +1,4 @@
-# Created with QUEST version 1.0.6
+# Created with QUEST version 1.1.0.
 go_back = True
 back_text = Zurück
 forward_text = Weiter
diff --git a/test/validate_test.py b/test/validate_test.py
index cec703cf3fb2c5821a8f5e87b41b41aa0650f77f..b85e4fd77ce01933913aa6589daa20bf172a80e8 100644
--- a/test/validate_test.py
+++ b/test/validate_test.py
@@ -1,12 +1,17 @@
 """Test if the validate function in Validator.py is working correctly."""
 
-from context import *
+from context import pytest, QTimer, QTest, Qt, ConfigObj, validate_questionnaire, QApplication, QMessageBox, ConfigObjError
 
 
 @pytest.fixture
 def gui_init():
     """Start GUI"""
-    gui = QApplication([])
+    if not QApplication.instance():
+        gui = QApplication([])
+    else:
+        while QApplication.instance():
+            QApplication.instance().shutdown()
+        gui = QApplication([])
     return gui
 
 
@@ -20,7 +25,7 @@ def test_global_settings(gui_init):
         dialog = QApplication.activeModalWidget()
         global text
         text = dialog.detailedText()
-        QTest.mouseClick(dialog.button(QMessageBox.Ok), Qt.LeftButton)
+        QTest.mouseClick(dialog.button(QMessageBox.StandardButton.Ok), Qt.MouseButton.LeftButton)
 
     structure = ConfigObj()
     structure["go_back"] = True
@@ -31,66 +36,66 @@ def test_global_settings(gui_init):
     structure["help_text"] = "Help"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("Invalid help IP(v4) found.\n") > -1
     structure["help_ip"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No help_ip found, but help port. Calling help will be disabled.\n"
     structure.pop("help_ip")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No help_ip found, but help port. Calling help will be disabled.\n"
     structure["help_ip"] = "127.0.0.1"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["help_port"] = "abcd"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid help port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid help port, could not be converted to a number 0-65535.\n") > -1
     structure["help_port"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No help_port found, but IP. Calling help will be disabled.\n"
     structure.pop("help_port")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No help_port found, but IP. Calling help will be disabled.\n"
     structure["help_port"] = -1
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid help port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid help port, could not be converted to a number 0-65535.\n") > -1
     structure["help_port"] = 65536
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid help port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid help port, could not be converted to a number 0-65535.\n") > -1
     structure["help_port"] = 3500
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure.pop("help_text")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No text given for the help button, but a connection. The external logging will still work.\n"
     structure["help_text"] = "HELP"
     structure.pop("help_ip")
     structure.pop("help_port")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No help connection given, but text. Calling help will be disabled.\n"
     structure.pop("help_text")
     # -------audio-------
@@ -98,78 +103,78 @@ def test_global_settings(gui_init):
     structure["audio_port"] = "2000"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("Invalid audio IP(v4) found.\n") > -1
     structure["audio_ip"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No audio_ip found, but audio port. Audio will be disabled.\n"
     structure.pop("audio_ip")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No audio_ip found, but audio port. Audio will be disabled.\n"
     structure["audio_ip"] = "127.0.0.1"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["audio_port"] = "abcd"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid audio port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid audio port, could not be converted to a number 0-65535.\n") > -1
     structure["audio_port"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No audio_port found, but IP. Audio will be disabled.\n"
     structure.pop("audio_port")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No audio_port found, but IP. Audio will be disabled.\n"
     structure["audio_port"] = -1
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid audio port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid audio port, could not be converted to a number 0-65535.\n") > -1
     structure["audio_port"] = 65536
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid audio port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid audio port, could not be converted to a number 0-65535.\n") > -1
     structure["audio_port"] = 3500
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
 
     structure["audio_recv_port"] = "abcd"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid audio receive port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid audio receive port, could not be converted to a number 0-65535.\n") > -1
     structure["audio_recv_port"] = -1
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid audio receive port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid audio receive port, could not be converted to a number 0-65535.\n") > -1
     structure["audio_recv_port"] = 65536
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid audio receive port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid audio receive port, could not be converted to a number 0-65535.\n") > -1
     structure["audio_recv_port"] = 3500
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure.pop("audio_ip")
     structure.pop("audio_port")
     structure.pop("audio_recv_port")
@@ -179,75 +184,75 @@ def test_global_settings(gui_init):
     structure["video_player"] = "VLC"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("Invalid video IP(v4) found.\n") > -1
     structure["video_ip"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No video_ip found, but video port. Video will be disabled.\n"
     structure.pop("video_ip")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No video_ip found, but video port. Video will be disabled.\n"
     structure["video_ip"] = "127.0.0.1"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["video_port"] = "abcd"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid video port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid video port, could not be converted to a number 0-65535.\n") > -1
     structure["video_port"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No video_port found, but IP. Video will be disabled.\n"
     structure.pop("video_port")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No video_port found, but IP. Video will be disabled.\n"
     structure["video_port"] = -1
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid video port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid video port, could not be converted to a number 0-65535.\n") > -1
     structure["video_port"] = 65536
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid video port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid video port, could not be converted to a number 0-65535.\n") > -1
     structure["video_port"] = 3500
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["video_player"] = "None"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No video_player chosen, but IP and port. Video will be disabled.\n"
     structure.pop("video_player")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No video_player found, but IP and port. Video will be disabled.\n"
     structure["video_player"] = "abc"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("Invalid value for video_player.\n") > -1
     structure["video_player"] = "MadMapper"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure.pop("video_ip")
     structure.pop("video_port")
     structure.pop("video_player")
@@ -256,86 +261,86 @@ def test_global_settings(gui_init):
     structure["pupil_port"] = "2000"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("Invalid pupil IP(v4) found.\n") > -1
     structure["pupil_ip"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No pupil_ip found, but pupil port. The connection to pupil will be disabled.\n"
     structure.pop("pupil_ip")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No pupil_ip found, but pupil port. The connection to pupil will be disabled.\n"
     structure["pupil_ip"] = "127.0.0.1"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["pupil_port"] = "abcd"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid pupil port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid pupil port, could not be converted to a number 0-65535.\n") > -1
     structure["pupil_port"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No pupil_port found, but IP. The connection to pupil will be disabled.\n"
     structure.pop("pupil_port")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No pupil_port found, but IP. The connection to pupil will be disabled.\n"
     structure["pupil_port"] = -1
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid pupil port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid pupil port, could not be converted to a number 0-65535.\n") > -1
     structure["pupil_port"] = 65536
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid pupil port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid pupil port, could not be converted to a number 0-65535.\n") > -1
     structure["pupil_port"] = 3500
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure.pop("pupil_ip")
     structure.pop("pupil_port")
     # ------navigation-------
     structure.pop("go_back")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No option for 'go_back' found, using False as default value.\n"
     structure["back_text"] = "back"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "Backwards navigation is not allowed but text for back button was set. The button will not be displayed.\n"
     structure["forward_text"] = "back"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[1] == "Text for forward and backward button are the same.\n"
     structure.pop("back_text")
     structure["send_text"] = "back"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "Text for forward and send button are the same.\n"
     structure.pop("forward_text")
     structure.pop("send_text")
     structure["go_back"] = "maybe"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("No valid value found for 'go_back'.\n") > -1
     structure["go_back"] = "false"
     # TODO Tests for pagecount_text?
@@ -346,87 +351,87 @@ def test_global_settings(gui_init):
     structure["global_osc_recv_port"] = 5000
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("Invalid global_osc IP(v4) found.\n") > -1
     structure["global_osc_ip"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No global_osc_ip found, but global_osc_send_port. Sending over global OSC will be disabled.\n"
     structure.pop("global_osc_ip")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No global_osc_ip found, but global_osc_send_port. Sending over global OSC will be disabled.\n"
     structure["global_osc_ip"] = "127.0.0.1"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["global_osc_send_port"] = "abcd"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid global_osc_send_port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid global_osc_send_port, could not be converted to a number 0-65535.\n") > -1
     structure["global_osc_send_port"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No global_osc_send_port found, but IP. Sending over global will be disabled.\n"
     structure.pop("global_osc_send_port")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No global_osc_send_port found, but IP. Sending over global will be disabled.\n"
     structure["global_osc_send_port"] = -1
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid global_osc_send_port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid global_osc_send_port, could not be converted to a number 0-65535.\n") > -1
     structure["global_osc_send_port"] = 65536
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid global_osc_send_port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid global_osc_send_port, could not be converted to a number 0-65535.\n") > -1
     structure["global_osc_send_port"] = 3500
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure.pop("global_osc_recv_port")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No global_osc_recv_port found, but IP. Receiving over global will be disabled.\n"
 
     structure["global_osc_recv_port"] = "abcd"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid global_osc_recv_port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid global_osc_recv_port, could not be converted to a number 0-65535.\n") > -1
     structure["global_osc_recv_port"] = -1
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid global_osc_recv_port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid global_osc_recv_port, could not be converted to a number 0-65535.\n") > -1
     structure["global_osc_recv_port"] = 65536
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid global_osc_recv_port, couldn't be converted to a number 0-65535.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find("Invalid global_osc_recv_port, could not be converted to a number 0-65535.\n") > -1
     structure["global_osc_recv_port"] = 3500
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure.pop("global_osc_send_port")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "No global_osc_send_port found, but IP. Sending over global will be disabled.\n"
     structure.pop("global_osc_ip")
     structure.pop("global_osc_recv_port")
@@ -435,25 +440,25 @@ def test_global_settings(gui_init):
     structure["save_after"] = "5"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("The value given for 'save_after' is not the name of a page of this questionnaire.\n") > -1
     structure.pop("save_after")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
-    #assert det[0] == "No value for 'save_after' given, saving after the last page by default.\n"
+    assert not err
+    assert not warn
+    # assert det[0] == "No value for 'save_after' given, saving after the last page by default.\n"
     structure["save_after"] = None
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     # TODO test for having a page
     # no tests needed for save_message
     structure["answer_pos"] = "maybe"
     structure["answer_neg"] = "maybe"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "Text for positive and negative answer are the same.\n"
     structure.pop("answer_pos")
     structure.pop("answer_neg")
@@ -461,106 +466,106 @@ def test_global_settings(gui_init):
     structure["delimiter"] = "none"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("Invalid delimiter found. It can only have one character.\n") > -1
     structure["delimiter"] = "\t"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure.pop("delimiter")
     structure["filepath_results"] = "A://some/weird/path/res.txt"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == True
+    assert err
+    assert warn
     assert det[0] == "Path for results file does not exist. It will be created.\n"
     assert -1 <= text.find("Invalid drive name for results file path.\n") > -1
     structure["filepath_results"] = "./test/results/results.csv"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["filepath_results"] = "./test/results/new/results.csv"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "Path for results file does not exist. It will be created.\n"
     structure.pop("filepath_results")
     # ------style------
     structure["button_fade"] = "ten"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("'button_fade' could not be converted to a non-negative number.\n") > -1
     structure["button_fade"] = -5
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("'button_fade' could not be converted to a non-negative number.\n") > -1
     structure["button_fade"] = "600"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["stylesheet"] = "A://B/C/D.css"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("Invalid stylesheet path.\n") > -1
     structure["stylesheet"] = "./src/Images/RadioChecked.svg"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("Invalid file for stylesheet, it has to be *.qss.\n") > -1
     structure["stylesheet"] = "./src/stylesheets/minimal.qss"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["randomization"] = "random"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("Invalid randomization option.\n") > -1
     structure["randomization"] = "None"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["randomization"] = "from file"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("Randomization 'from file' chosen, but no file given.\n") > -1
     structure["randomization_file"] = "A://B/C/D.css"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("Invalid randomization_file path.\n") > -1
     structure["randomization_file"] = "./src/Images/RadioChecked.svg"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("Invalid file for randomization, it has to be *.txt or *.csv.\n") > -1
     structure["randomization_file"] = "./src/Configs/all_question_types.txt"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find("Contents of randomization_file invalid.\n") > -1
     structure["randomization_file"] = "./test/random.txt"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure.pop("randomization")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "Randomization_file found, but no option for randomization.\n"
 
     gui_init.exit()
@@ -572,40 +577,40 @@ def test_page_settings(gui_init):
     structure["save_after"] = None
     structure["Page"] = {}
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "There are no questions on page Page.\n"
     structure["Page"]["Question"] = {"type": "HLine"}
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     # title and description are just text and do not need tests
     structure["Page"]["pupil_on_next"] = "this page is done"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[0] == "Incomplete connection to pupil given. The connection to pupil will be disabled.\n"
     structure["pupil_ip"] = "127.0.0.1"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[1] == "Incomplete connection to pupil given. The connection to pupil will be disabled.\n"
     structure.pop("pupil_ip")
     structure["pupil_port"] = 9000
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
+    assert not err
+    assert warn
     assert det[1] == "Incomplete connection to pupil given. The connection to pupil will be disabled.\n"
     structure["pupil_ip"] = "127.0.0.1"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure.pop("pupil_ip")
     structure.pop("pupil_port")
     structure["Page"].pop("pupil_on_next")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     # TODO own test for randomgroup
 
     gui_init.exit()
@@ -623,7 +628,7 @@ def test_question_settings(gui_init):
         dialog = QApplication.activeModalWidget()
         global text
         text = dialog.detailedText()
-        QTest.mouseClick(dialog.button(QMessageBox.Ok), Qt.LeftButton)
+        QTest.mouseClick(dialog.button(QMessageBox.StandardButton.Ok), Qt.MouseButton.LeftButton)
 
     structure = ConfigObj()
     structure["go_back"] = True
@@ -631,28 +636,28 @@ def test_question_settings(gui_init):
     structure["Page"] = {}
     structure["Page"]["Question"] = {}
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "There are no attributes for question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'There are no attributes for question "Question" on page "Page".\n'
 
     # ------id------
     structure["Page"]["Question"]["id"] = ""
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No ID was given for question 'Question' on page 'Page'.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('No ID was given for question "Question" on page "Page".\n') > -1
     structure["Page"]["Question"]["type"] = "HLine"
     structure["Page"]["Question"].pop("id")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["type"] = "Check"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == True  # from the question type
-    assert -1 <= text.find("No ID was given for question 'Question' on page 'Page'.\n") > -1
+    assert err
+    assert warn  # from the question type
+    assert -1 <= text.find('No ID was given for question "Question" on page "Page".\n') > -1
     structure["Page"]["Question"].pop("type")
     structure["Page"]["Question"].pop("text")
     structure["Page"]["Question"].pop("answers")
@@ -660,85 +665,85 @@ def test_question_settings(gui_init):
     structure["Page"]["Question2"] = {"id": "some id"}
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("ID 'some id' already used in question 'Question' on page 'Page'. Found again in question 'Question2' on page 'Page'.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('ID "some id" already used in question "Question" on page "Page". Found again in question "Question2" on page "Page".\n') > -1
     structure["Page"].pop("Question2")
     structure["Page2"] = {"Question": {"id": "some id"}}
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "ID 'some id' already used in question 'Question' on page 'Page'. Found again in question 'Question' on page 'Page2'.\n") > -1
+        'ID "some id" already used in question "Question" on page "Page". Found again in question "Question" on page "Page2".\n') > -1
     structure.pop("Page2")
 
     # ------x------
     structure["Page"]["Question"]["x"] = "something"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No valid value found for 'x' for question 'Question' on page 'Page'.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('No valid value found for "x" for question "Question" on page "Page".\n') > -1
     structure["Page"]["Question"]["x"] = True
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["type"] = "ABX"
     structure["Page"]["Question"]["start_cues"] = [1, 2]
     structure["Page"]["Question"]["track"] = 1
     structure["Page"]["Question"].pop("x")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No option for 'x' found for question 'Question' on page 'Page', using False as default value.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No option for "x" found for question "Question" on page "Page", using False as default value.\n'
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------play_once------
     structure["Page"]["Question"]["play_once"] = "something"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No valid value found for 'play_once' for question 'Question' on page 'Page'.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('No valid value found for "play_once" for question "Question" on page "Page".\n') > -1
     structure["Page"]["Question"]["play_once"] = True
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["type"] = "Player"
     structure["Page"]["Question"]["start_cue"] = 1
     structure["Page"]["Question"]["track"] = 1
     structure["Page"]["Question"].pop("play_once")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No option for 'play_once' found for question 'Question' on page 'Page', using False by default.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No option for "play_once" found for question "Question" on page "Page", using False by default.\n'
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------required------
     structure["Page"]["Question"]["required"] = "something"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No valid value found for 'required' for question 'Question' on page 'Page'.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('No valid value found for "required" for question "Question" on page "Page".\n') > -1
     structure["Page"]["Question"]["required"] = True
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"].pop("required")
 
     # ------labelled------
     structure["Page"]["Question"]["labelled"] = "something"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No valid value found for 'labelled' for question 'Question' on page 'Page'.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('No valid value found for "labelled" for question "Question" on page "Page".\n') > -1
     structure["Page"]["Question"]["labelled"] = True
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["type"] = "Slider"
     structure["Page"]["Question"]["min"] = 1
     structure["Page"]["Question"]["max"] = 10
@@ -746,45 +751,44 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["start"] = 10
     structure["Page"]["Question"].pop("labelled")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[
-               0] == "No option for 'labelled' found for question 'Question' on page 'Page', setting it to False.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No option for "labelled" found for question "Question" on page "Page", setting it to False.\n'
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------question_above------
     structure["Page"]["Question"]["question_above"] = "something"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No valid value found for 'question_above' for question 'Question' on page 'Page'.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('No valid value found for "question_above" for question "Question" on page "Page".\n') > -1
     structure["Page"]["Question"]["question_above"] = True
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------text------
     structure["Page"]["Question"]["text"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No text was given for question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No text was given for question "Question" on page "Page".\n'
     structure["Page"]["Question"]["type"] = "Plain Text"
     structure["Page"]["Question"].pop("text")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No text was given for question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No text was given for question "Question" on page "Page".\n'
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------answers------
     structure["Page"]["Question"]["answers"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No answer possibilities were given for question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No answer possibilities were given for question "Question" on page "Page".\n'
     structure["audio_ip"] = "127.0.0.1"
     structure["audio_port"] = 8000
     structure["Page"]["Question"]["type"] = "ABX"
@@ -793,68 +797,68 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["x"] = False
     structure["Page"]["Question"]["text"] = "Some text."
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["answers"] = "1"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Please give two answer options for the ABX type question 'Question' on page 'Page' or leave this field empty.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Please give two answer options for the ABX type question "Question" on page "Page" or leave this field empty.\n')
     structure["Page"]["Question"]["answers"] = ["1", "b", "c"]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "Please give two answer options for the ABX type question 'Question' on page 'Page' or leave this field empty.\n")
+        'Please give two answer options for the ABX type question "Question" on page "Page" or leave this field empty.\n')
     structure["Page"]["Question"]["answers"] = ["1", "2"]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["answers"] = ("1", "2")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"] = {'id': 'id', "type": "Radio", "text": "some text"}
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No answer possibilities were given for question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No answer possibilities were given for question "Question" on page "Page".\n'
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------start_answer_id------
     structure["Page"]["Question"]["start_answer_id"] = -1
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("The start answer ID in question 'Question' on page 'Page' can't have a negative value.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('The start answer ID in question "Question" on page "Page" can not have a negative value.\n')
     structure["Page"]["Question"]["start_answer_id"] = ""
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("The start answer ID in question 'Question' on page 'Page' couldn't be interpreted as an integer.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('The start answer ID in question "Question" on page "Page" could not be interpreted as an integer.\n')
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------min------
     structure["Page"]["Question"]["min"] = ""
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No minimum value found for the slider in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No minimum value found for the slider in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["min"] = 1.5
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["min"] = "ten"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("The minimum value found for the slider in question 'Question' on page 'Page' couldn't be interpreted as an integer.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('The minimum value found for the slider in question "Question" on page "Page" could not be interpreted as an integer.\n')
     structure["Page"]["Question"]["type"] = "Slider"
     structure["Page"]["Question"]["max"] = 10
     structure["Page"]["Question"]["start"] = 10
@@ -864,28 +868,28 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"].pop("min")
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No minimum value was given for the slider in question 'Question' on page 'Page'")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No minimum value was given for the slider in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["min"] = 20
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------max------
     structure["Page"]["Question"]["max"] = ""
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No maximum value found for the slider in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No maximum value found for the slider in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["max"] = "ten"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("The maximum value found for the slider in question 'Question' on page 'Page' couldn't be interpreted as an integer.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('The maximum value found for the slider in question "Question" on page "Page" could not be interpreted as an integer.\n')
     structure["Page"]["Question"]["type"] = "Slider"
     structure["Page"]["Question"]["min"] = 10
     structure["Page"]["Question"]["step"] = 0.1
@@ -895,39 +899,39 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"].pop("max")
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No maximum value was given for the slider in question 'Question' on page 'Page'")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No maximum value was given for the slider in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["max"] = 0
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["max"] = 0.1
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["max"] = 10
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Maximum and Minimum value for the slider in question 'Question' on page 'Page' are the same.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Maximum and Minimum value for the slider in question "Question" on page "Page" are the same.\n')
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------start------
     structure["Page"]["Question"]["start"] = ""
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No starting value found for the slider in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No starting value found for the slider in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["start"] = "ten"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "The starting value found for the slider in question 'Question' on page 'Page' couldn't be interpreted as an integer.\n")
+        'The starting value found for the slider in question "Question" on page "Page" could not be interpreted as an integer.\n')
     structure["Page"]["Question"]["type"] = "Slider"
     structure["Page"]["Question"]["max"] = 10
     structure["Page"]["Question"]["min"] = 0
@@ -937,33 +941,33 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"].pop("start")
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No starting value was given for the slider in question 'Question' on page 'Page'")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No starting value was given for the slider in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["start"] = 0
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["start"] = 0.5
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"] = {'id': 'id'}
-    
+
     # ------step------
     structure["Page"]["Question"]["step"] = ""
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No step value found for the slider in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No step value found for the slider in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["step"] = "ten"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "The step value found for the slider in question 'Question' on page 'Page' couldn't be interpreted as a number.\n")
+        'The step value found for the slider in question "Question" on page "Page" could not be interpreted as a number.\n')
     structure["Page"]["Question"]["type"] = "Slider"
     structure["Page"]["Question"]["max"] = 1.5
     structure["Page"]["Question"]["min"] = 0.5
@@ -973,26 +977,26 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"].pop("step")
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No step value was given for the slider in question 'Question' on page 'Page'")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No step value was given for the slider in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["step"] = 0
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("The step value found for the slider in question 'Question' on page 'Page' needs to be bigger than 0.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('The step value found for the slider in question "Question" on page "Page" needs to be bigger than 0.\n')
     structure["Page"]["Question"]["step"] = 2
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "The step value for the slider in question 'Question' on page 'Page' is bigger than the range.\n")
+        'The step value for the slider in question "Question" on page "Page" is bigger than the range.\n')
     structure["Page"]["Question"]["step"] = 0.5
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------label------
@@ -1005,218 +1009,212 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["start"] = 0
     structure["Page"]["Question"]["label"] = "some label"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["labelled"] = True
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("The number of given labels doesn't match the number of ticks for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('The number of given labels does not match the number of ticks for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["label"] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["label"] = [[1, 2, "test"]]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No valid format for labels for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No valid format for labels for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["label"] = [[-1, "no"], [11, "out"]]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Tick value outside of slider range found for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Tick value outside of slider range found for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["label"] = [[5, "no"], [5, "out"]]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Double definition of tick labels found for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Double definition of tick labels found for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["label"] = [["null", "no"]]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("A label tick for the slider in question 'Question' on page 'Page' couldn't be interpreted as a number.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('A label tick for the slider in question "Question" on page "Page" could not be interpreted as a number.\n')
     structure["Page"]["Question"]["label"] = [[0, "negativ"], [10, "positiv"]]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------policy------
     structure["Page"]["Question"]["policy"] = "something"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid policy type in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Invalid policy type in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = ["something"]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid policy type in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Invalid policy type in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = "None"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["policy"] = "int"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Policy type 'int' takes two arguments, a different amount was given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Policy type "int" takes two arguments, a different amount was given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = ["int", 1, 2, 3]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find(
-        "Policy type 'int' takes two arguments, a different amount was given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Policy type "int" takes two arguments, a different amount was given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = ["int", "", 2]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find(
-        "No minimum value was given for the policy in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No minimum value was given for the policy in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = ["int", "ab", 2]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "Minimum value given for the policy in question 'Question' on page 'Page' couldn't be converted to a valid number.\n")
+        'Minimum value given for the policy in question "Question" on page "Page" could not be converted to a valid number.\n')
     structure["Page"]["Question"]["policy"] = ["int", 1, "ab"]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "Maximum value given for the policy in question 'Question' on page 'Page' couldn't be converted to a valid number.\n")
+        'Maximum value given for the policy in question "Question" on page "Page" could not be converted to a valid number.\n')
     structure["Page"]["Question"]["policy"] = ["int", 1, ""]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No maximum value was given for the policy in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No maximum value was given for the policy in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = ["int", 1, 100]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["policy"] = "double"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find(
-        "Policy type 'double' takes three arguments, a different amount was given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Policy type "double" takes three arguments, a different amount was given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = ["double", 1, 2, 3, 4]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find(
-        "Policy type 'double' takes two arguments, a different amount was given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Policy type "double" takes two arguments, a different amount was given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = ["double", "", 2, 3]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "No minimum value was given for the policy in question 'Question' on page 'Page'.\n")
+        'No minimum value was given for the policy in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = ["double", "ab", 2, 3]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "Minimum value given for the policy in question 'Question' on page 'Page' couldn't be converted to a valid number.\n")
+        'Minimum value given for the policy in question "Question" on page "Page" could not be converted to a valid number.\n')
     structure["Page"]["Question"]["policy"] = ["double", 1, "ab", 3]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "Maximum value given for the policy in question 'Question' on page 'Page' couldn't be converted to a valid number.\n")
+        'Maximum value given for the policy in question "Question" on page "Page" could not be converted to a valid number.\n')
     structure["Page"]["Question"]["policy"] = ["double", 1, "", 3]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No maximum value was given for the policy in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No maximum value was given for the policy in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = ["double", 1, 2, "ab"]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "Number of decimals given for the policy in question 'Question' on page 'Page' couldn't be converted to a valid number.\n")
+        'Number of decimals given for the policy in question "Question" on page "Page" could not be converted to a valid number.\n')
     structure["Page"]["Question"]["policy"] = ["double", 1, 2, ""]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No number of decimals was given for the policy in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No number of decimals was given for the policy in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = ["double", 1, 100, 3]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["policy"] = "regex"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find(
-        "Policy type 'regex' takes one argument, a different amount was given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Policy type "regex" takes one argument, a different amount was given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = ["regex", "some", 67]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find(
-        "Policy type 'regex' takes one argument, a different amount was given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Policy type "regex" takes one argument, a different amount was given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = ["regex", ""]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "No regex was given for the policy in question 'Question' on page 'Page'.\n")
+        'No regex was given for the policy in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = ["regex", "[.*"]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "An invalid regex was given for the policy in question 'Question' on page 'Page'.\n")
+        'An invalid regex was given for the policy in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["policy"] = ["regex", "[A-Z]\\d"]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------start_cue------
     structure["Page"]["Question"]["start_cue"] = ""
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No start cue was given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No start cue was given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["start_cue"] = [12]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Start cue given in question 'Question' on page 'Page' couldn't be converted to a number.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Start cue given in question "Question" on page "Page" could not be converted to a number.\n')
     structure["Page"]["Question"]["start_cue"] = 12
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["type"] = "Player"
     structure["Page"]["Question"].pop("start_cue")
     structure["Page"]["Question"]["track"] = 1
@@ -1224,61 +1222,61 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["buttons"] = ["Play"]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No start cue was given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No start cue was given in question "Question" on page "Page".\n')
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------end_cue------
     structure["Page"]["Question"]["end_cue"] = ""
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No end cue was given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No end cue was given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["end_cue"] = [12]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("End cue given in question 'Question' on page 'Page' couldn't be converted to a number.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('End cue given in question "Question" on page "Page" could not be converted to a number.\n')
     structure["Page"]["Question"]["end_cue"] = 12
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["start_cue"] = 12
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("The same cue (12) was used as start- and end-cue for one condition in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('The same cue (12) was used as start- and end-cue for one condition in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["end_cue"] = 14
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------track------
     structure["Page"]["Question"]["track"] = ""
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No track(s) was given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No track(s) was given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["track"] = [1]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["track"] = 1
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["track"] = -1
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Track given for question 'Question' on page 'Page' needs to be greater than 0.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Track given for question "Question" on page "Page" needs to be greater than 0.\n')
     structure["Page"]["Question"]["type"] = "Player"
     structure["Page"]["Question"].pop("track")
     structure["Page"]["Question"]["start_cue"] = 1
@@ -1286,16 +1284,16 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["buttons"] = ["Play"]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No track(s) was given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No track(s) was given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["track"] = [1, [1, 1]]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "Tracks given for question 'Question' on page 'Page' need to be one or more integers, not lists.\n")
+        'Tracks given for question "Question" on page "Page" need to be one or more integers, not lists.\n')
     structure["Page"]["Question"] = {'id': 'id'}
     structure["Page"]["Question"]["type"] = "ABX"
     structure["Page"]["Question"]["start_cues"] = [1, 2]
@@ -1303,24 +1301,24 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["x"] = False
     structure["Page"]["Question"]["track"] = 1
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["track"] = [1]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["track"] = [1, -1]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Track given for question 'Question' on page 'Page' needs to be greater than 0.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Track given for question "Question" on page "Page" needs to be greater than 0.\n')
     structure["Page"]["Question"]["track"] = [1, [1, 2]]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Tracks given for question 'Question' on page 'Page' need to be one or more integers, not lists.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Tracks given for question "Question" on page "Page" need to be one or more integers, not lists.\n')
     structure["Page"]["Question"] = {'id': 'id'}
     structure["Page"]["Question"]["type"] = "MUSHRA"
     structure["Page"]["Question"]["start_cues"] = [1, 2]
@@ -1328,109 +1326,109 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["text"] = "some text"
     structure["Page"]["Question"]["track"] = 1
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["track"] = [1]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["track"] = [1, 1, 2]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("The number of tracks given doesn't equal the number of cues given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('The number of tracks given does not equal the number of cues given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["track"] = [1, 2]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["track"] = [1, [1, 2]]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["track"] = [[1, 2], [1, 2, -3]]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Track given for question 'Question' on page 'Page' needs to be greater than 0.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Track given for question "Question" on page "Page" needs to be greater than 0.\n')
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------crossfade------
     structure["Page"]["Question"]["crossfade"] = ""
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No valid value found for 'crossfade' for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No valid value found for "crossfade" for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["crossfade"] = True
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["crossfade"] = 0
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------buttons------
     structure["Page"]["Question"]["buttons"] = []
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No buttons are displayed for the player in question 'Question' on page 'Page'. It will play when this page is loaded.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No buttons are displayed for the player in question "Question" on page "Page". It will play when this page is loaded.\n'
     structure["Page"]["Question"]["buttons"] = ["Pause"]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No Play button is displayed for the player in question 'Question' on page 'Page'. It will play when this page is loaded.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No Play button is displayed for the player in question "Question" on page "Page". It will play when this page is loaded.\n'
     structure["Page"]["Question"]["buttons"] = "Stop"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No Play button is displayed for the player in question 'Question' on page 'Page'. It will play when this page is loaded.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No Play button is displayed for the player in question "Question" on page "Page". It will play when this page is loaded.\n'
     structure["Page"]["Question"]["buttons"] = "Reverse"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid value found for 'buttons' for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Invalid value found for "buttons" for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["buttons"] = ["Skip"]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid value found for 'buttons' for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Invalid value found for "buttons" for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["type"] = "Player"
     structure["Page"]["Question"]["track"] = 1
     structure["Page"]["Question"]["start_cue"] = 1
     structure["Page"]["Question"]["play_once"] = False
     structure["Page"]["Question"].pop("buttons")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No buttons are displayed for the player in question 'Question' on page 'Page'. It will play when this page is loaded.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No buttons are displayed for the player in question "Question" on page "Page". It will play when this page is loaded.\n'
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------start_cues------
     structure["Page"]["Question"]["start_cues"] = ""
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No start cues were given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No start cues were given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["start_cues"] = ["abc"]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Start cues given for question 'Question' on page 'Page' couldn't be converted to a list of number.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Start cues given for question "Question" on page "Page" could not be converted to a list of number.\n')
     structure["Page"]["Question"]["start_cues"] = "abc"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "Start cues given for question 'Question' on page 'Page' couldn't be converted to a list of number.\n")
+        'Start cues given for question "Question" on page "Page" could not be converted to a list of number.\n')
     structure["Page"]["Question"]["type"] = "ABX"
     structure["Page"]["Question"]["start_cues"] = 14
     structure["Page"]["Question"]["track"] = 1
@@ -1438,26 +1436,26 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["x"] = False
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("There should be exactly 2 start_cues for AB(X)-tests, but 1 were given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('There should be exactly 2 start_cues for AB(X)-tests, but 1 were given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["start_cues"] = [1, 2, 3]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "There should be exactly 2 start_cues for AB(X)-tests, but 1 were given in question 'Question' on page 'Page'.\n")
+        'There should be exactly 2 start_cues for AB(X)-tests, but 1 were given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["start_cues"] = [1, 2]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"].pop("start_cues")
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No start cues were given for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No start cues were given for question "Question" on page "Page".\n')
     structure["Page"]["Question"] = {'id': 'id'}
     structure["Page"]["Question"]["type"] = "MUSHRA"
     structure["Page"]["Question"]["end_cues"] = [3, 4]
@@ -1465,32 +1463,32 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["track"] = 1
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No start cues were given for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No start cues were given for question "Question" on page "Page".\n')
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------end_cues------
     structure["Page"]["Question"]["end_cues"] = ""
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No end cues were given in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No end cues were given in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["end_cues"] = ["abc"]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "End cues given for question 'Question' on page 'Page' couldn't be converted to a list of number.\n")
+        'End cues given for question "Question" on page "Page" could not be converted to a list of number.\n')
     structure["Page"]["Question"]["end_cues"] = "abc"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "End cues given for question 'Question' on page 'Page' couldn't be converted to a list of number.\n")
+        'End cues given for question "Question" on page "Page" could not be converted to a list of number.\n')
     structure["Page"]["Question"] = {'id': 'id'}
     structure["Page"]["Question"]["type"] = "MUSHRA"
     structure["Page"]["Question"]["start_cues"] = [3, 4]
@@ -1498,130 +1496,130 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["track"] = 1
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No end cues were given for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No end cues were given for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["end_cues"] = [4, 4]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("The same cue (4) was used as start- and end-cue for one condition in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('The same cue (4) was used as start- and end-cue for one condition in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["end_cues"] = [1, 2, 3]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "The number of start- and end-cues in question 'Question' on page 'Page' doesn't match.\n")
+        'The number of start- and end-cues in question "Question" on page "Page" does not match.\n')
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------xfade------
     structure["Page"]["Question"]["xfade"] = ""
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No valid value found for 'xfade' for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No valid value found for "xfade" for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["start_cues"] = [1, 1, 2]
     structure["Page"]["Question"]["end_cues"] = [2, 2, 2]
     structure["Page"]["Question"]["track"] = [1, 2, 3]
     structure["Page"]["Question"]["xfade"] = True
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Xfade is only applicable if all start- and end-markers are the same each in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Xfade is only applicable if all start- and end-markers are the same each in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["start_cues"] = [1, 1, 1]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["track"] = [1, 1, 1]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("For xfade stimuli need to be placed on different tracks in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('For xfade stimuli need to be placed on different tracks in question "Question" on page "Page".\n')
     structure["Page"]["Question"]["track"] = 2
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("For xfade stimuli need to be placed on different tracks in question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('For xfade stimuli need to be placed on different tracks in question "Question" on page "Page".\n')
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------inscription------
     structure["Page"]["Question"]["inscription"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No inscription for the button in question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No inscription for the button in question "Question" on page "Page".\n'
     structure["Page"]["Question"]["inscription"] = "None"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "Internally used inscription 'None' used in question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'Internally used inscription "None" used in question "Question" on page "Page".\n'
     structure["Page"]["Question"].pop("inscription")
     structure["pupil_ip"] = "127.0.0.1"
     structure["pupil_port"] = 50500
     structure["Page"]["Question"]["type"] = "Button"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No inscription for the button in question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No inscription for the button in question "Question" on page "Page".\n'
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------objectName------
     structure["Page"]["Question"]["objectName"] = "required"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "The objectName in question 'Question' on page 'Page' uses a predefined name.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'The objectName in question "Question" on page "Page" uses a predefined name.\n'
     structure["Page"]["Question"]["objectName"] = "headline"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "The objectName in question 'Question' on page 'Page' uses a predefined name.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'The objectName in question "Question" on page "Page" uses a predefined name.\n'
     structure["Page"]["Question"]["objectName"] = "SliderHeader"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "The objectName in question 'Question' on page 'Page' uses a predefined name.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'The objectName in question "Question" on page "Page" uses a predefined name.\n'
     structure["Page"]["Question"].pop("objectName")
 
     # ------timer------
     structure["Page"]["Question"]["timer"] = "ten"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("The timer in question 'Question' on page 'Page' needs to be a numeric value.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('The timer in question "Question" on page "Page" needs to be a numeric value.\n')
     structure["Page"]["Question"]["timer"] = -20
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "The timer in question 'Question' on page 'Page' needs to be greater than or equal to 0. Setting it to 0 by default.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'The timer in question "Question" on page "Page" needs to be greater than or equal to 0. Setting it to 0 by default.\n'
     structure["Page"]["Question"].pop("timer")
 
     # ------password_file------
     structure["Page"]["Question"]["password_file"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No password_file found for question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No password_file found for question "Question" on page "Page".\n'
     structure["Page"]["Question"]["password_file"] = "./invalid/path.txt"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No valid password_file for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No valid password_file for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["type"] = "Password"
     structure["Page"]["Question"]["text"] = "text"
     structure["Page"]["Question"].pop("password_file")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No password_file found for question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No password_file found for question "Question" on page "Page".\n'
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------button_texts------
@@ -1629,87 +1627,87 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["button_texts"] = [1, 1, 1]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Please give no, two or three (if option X is used) button_texts for the ABX type question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Please give no, two or three (if option X is used) button_texts for the ABX type question "Question" on page "Page".\n')
     structure["Page"]["Question"]["x"] = True
     structure["Page"]["Question"]["button_texts"] = [1, 1, 1]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["button_texts"] = [1, 1]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "Please give no, two or three (if option X is used) button_texts for the ABX type question 'Question' on page 'Page'.\n")
+        'Please give no, two or three (if option X is used) button_texts for the ABX type question "Question" on page "Page".\n')
     structure["Page"]["Question"]["button_texts"] = "sth"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
+    assert err
+    assert not warn
     assert -1 <= text.find(
-        "Please give no, two or three (if option X is used) button_texts for the ABX type question 'Question' on page 'Page'.\n")
+        'Please give no, two or three (if option X is used) button_texts for the ABX type question "Question" on page "Page".\n')
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------randomize------
     structure["Page"]["Question"]["randomize"] = "not bool"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No valid value found for 'randomize' for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No valid value found for "randomize" for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["type"] = "Matrix"
     structure["Page"]["Question"]["text"] = "some text"
     structure["Page"]["Question"]["answers"] = "some answer"
     structure["Page"]["Question"]["questions"] = "something"
     structure["Page"]["Question"].pop("randomize")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No option for 'randomize' found for question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No option for "randomize" found for question "Question" on page "Page".\n'
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------questions------
     structure["Page"]["Question"]["questions"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No questions for the matrix in question 'Question' on page 'Page' found.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No questions for the matrix in question "Question" on page "Page" found.\n'
     structure["Page"]["Question"]["questions"] = []
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No questions for the matrix in question 'Question' on page 'Page' found.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No questions for the matrix in question "Question" on page "Page" found.\n'
     structure["Page"]["Question"]["type"] = "Matrix"
     structure["Page"]["Question"]["text"] = "some text"
     structure["Page"]["Question"]["answers"] = "some answer"
     structure["Page"]["Question"]["randomize"] = False
     structure["Page"]["Question"].pop("questions")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No questions for the matrix in question 'Question' on page 'Page' found.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No questions for the matrix in question "Question" on page "Page" found.\n'
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------width------
     structure["Page"]["Question"]["width"] = "ten"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid value for width for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Invalid value for width for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["width"] = -20
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Width needs to be bigger than 0 for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Width needs to be bigger than 0 for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["width"] = 300
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"].pop("width")
     structure["Page"]["Question"] = {'id': 'id'}
 
@@ -1717,19 +1715,19 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["height"] = "ten"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid value for height for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Invalid value for height for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["height"] = -20
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Height needs to be bigger than 0 for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Height needs to be bigger than 0 for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["height"] = 300
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"].pop("height")
     structure["Page"]["Question"] = {'id': 'id'}
 
@@ -1737,130 +1735,130 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["x_pos"] = "ten"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid value for x position for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Invalid value for x position for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["x_pos"] = -20
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("X position needs to be bigger or equal to 0 for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('X position needs to be bigger or equal to 0 for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["x_pos"] = 300
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"].pop("x_pos")
     structure["Page"]["Question"]["type"] = "Image"
     structure["Page"]["Question"]["image_file"] = "./test/Logo.png"
     structure["Page"]["Question"]["image_position"] = "free"
     structure["Page"]["Question"]["y_pos"] = 300
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No x position given for the question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No x position given for the question "Question" on page "Page".\n'
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------y_pos------
     structure["Page"]["Question"]["y_pos"] = "ten"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid value for y position for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Invalid value for y position for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["y_pos"] = -20
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Y position needs to be bigger or equal to 0 for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Y position needs to be bigger or equal to 0 for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["y_pos"] = 300
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"].pop("y_pos")
     structure["Page"]["Question"]["type"] = "Image"
     structure["Page"]["Question"]["image_file"] = "./test/Logo.png"
     structure["Page"]["Question"]["image_position"] = "free"
     structure["Page"]["Question"]["x_pos"] = 300
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No y position given for the question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No y position given for the question "Question" on page "Page".\n'
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------image_file------
     structure["Page"]["Question"]["image_file"] = ""
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No image_file found for question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No image_file found for question "Question" on page "Page".\n'
     structure["Page"]["Question"]["image_file"] = "./invalid/path.txt"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No valid image_file for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No valid image_file for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["type"] = "Image"
     structure["Page"]["Question"]["image_position"] = "here"
     structure["Page"]["Question"].pop("image_file")
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "No image_file found for question 'Question' on page 'Page'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'No image_file found for question "Question" on page "Page".\n'
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------image_position------
     structure["Page"]["Question"]["image_position"] = "everywhere"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid image position found for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('Invalid image position found for question "Question" on page "Page".\n')
     structure["Page"]["Question"]["image_position"] = "free"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "Image 'Question' on page 'Page' is chosen to be positioned freely, but no coordinates were given.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'Image "Question" on page "Page" is chosen to be positioned freely, but no coordinates were given.\n'
     structure["Page"]["Question"]["type"] = "Image"
     structure["Page"]["Question"]["image_file"] = "./test/Logo.png"
     structure["Page"]["Question"].pop("image_position")
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No image_position found for question 'Question' on page 'Page'.\n")
+    assert err
+    assert not warn
+    assert -1 <= text.find('No image_position found for question "Question" on page "Page".\n')
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------receiver------
     structure["Page"]["Question"]["receiver"] = ["ip", 3000]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No valid IP address given for the receiver in question 'Question' on page 'Page'.") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('No valid IP address given for the receiver in question "Question" on page "Page".') > -1
     structure["Page"]["Question"]["receiver"] = ["", 3000]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No valid IP address given for the receiver in question 'Question' on page 'Page'.") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('No valid IP address given for the receiver in question "Question" on page "Page".') > -1
     structure["Page"]["Question"]["receiver"] = ["127.0.0.1", ""]
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("Invalid receiver port in question 'Question' on page 'Page', couldn't be converted to a number 0-65535.") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('Invalid receiver port in question "Question" on page "Page", could not be converted to a number 0-65535.') > -1
     structure["Page"]["Question"]["receiver"] = ["127.0.0.1", 800]
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"]["receiver"] = "audio"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("The receiver of question 'Question' on page 'Page' needs to have the format (IP, Port).") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('The receiver of question "Question" on page "Page" needs to have the format (IP, Port).') > -1
     structure["Page"]["Question"].pop("receiver")
     structure["Page"]["Question"]["type"] = "OSCButton"
     structure["Page"]["Question"]["address"] = "/msg"
@@ -1868,27 +1866,27 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["inscription"] = "Text"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No receiver found for question 'Question' on page 'Page'.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('No receiver found for question "Question" on page "Page".\n') > -1
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------address------
     structure["Page"]["Question"]["address"] = ""
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No OSC-address for question 'Question' on page 'Page' was given.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('No OSC-address for question "Question" on page "Page" was given.\n') > -1
     structure["Page"]["Question"]["address"] = "message"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == True
-    assert det[0] == "The OSC-address of question 'Question' on page 'Page' should start with '/'.\n"
+    assert not err
+    assert warn
+    assert det[0] == 'The OSC-address of question "Question" on page "Page" should start with "/".\n'
     structure["Page"]["Question"]["address"] = "/audio"
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == False
-    assert warn == False
+    assert not err
+    assert not warn
     structure["Page"]["Question"].pop("address")
     structure["Page"]["Question"]["type"] = "OSCButton"
     structure["Page"]["Question"]["receiver"] = ["127.0.0.1", 8000]
@@ -1896,9 +1894,9 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["inscription"] = "Text"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No OSC-address for question 'Question' on page 'Page' was given.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('No OSC-address for question "Question" on page "Page" was given.\n') > -1
     structure["Page"]["Question"] = {'id': 'id'}
 
     # ------value------
@@ -1908,9 +1906,9 @@ def test_question_settings(gui_init):
     structure["Page"]["Question"]["inscription"] = "Text"
     QTimer.singleShot(150, handle_dialog_error)
     err, warn, det = validate_questionnaire(structure, True)
-    assert err == True
-    assert warn == False
-    assert -1 <= text.find("No value for question 'Question' on page 'Page' was given.\n") > -1
+    assert err
+    assert not warn
+    assert -1 <= text.find('No value for question "Question" on page "Page" was given.\n') > -1
     structure["Page"]["Question"] = {'id': 'id'}
 
     gui_init.exit()