diff --git a/lib/+artoa/+controller/+edit/+offsets/open.m b/lib/+artoa/+controller/+edit/+offsets/open.m
index 7d846394495ba90a591e8d531c5a73df45bd1f26..cd75d603f3400e3e71a353999f7b081bdef14823 100644
--- a/lib/+artoa/+controller/+edit/+offsets/open.m
+++ b/lib/+artoa/+controller/+edit/+offsets/open.m
@@ -1,4 +1,4 @@
-function [] = open()
+function [] = open(~, ~)
 %OPEN Initializes the offset details gui.
 %   Detailed explanation goes here
 
diff --git a/lib/+artoa/+controller/+edit/+pressure/open.m b/lib/+artoa/+controller/+edit/+pressure/open.m
index 19758331c415b2643492e76c1fe2358cedb382a5..d2217712b9362305e7dd471d595a99ee69a23f1c 100644
--- a/lib/+artoa/+controller/+edit/+pressure/open.m
+++ b/lib/+artoa/+controller/+edit/+pressure/open.m
@@ -1,4 +1,4 @@
-function [] = open()
+function [] = open(~, ~)
 %OPENEDITTEMPERATURE Initializes the pressure editing gui.
 %   Detailed explanation goes here
 
diff --git a/lib/+artoa/+controller/+edit/+temperature/open.m b/lib/+artoa/+controller/+edit/+temperature/open.m
index d3fcf4b0d9714537e3bb00468c475595b277b127..8e7210f3a830e24851e74058faa377000177b0b9 100644
--- a/lib/+artoa/+controller/+edit/+temperature/open.m
+++ b/lib/+artoa/+controller/+edit/+temperature/open.m
@@ -1,4 +1,4 @@
-function [] = open()
+function [] = open(~, ~)
 %OPENEDITTEMPERATURE Initializes the temperature editing gui.
 %   Detailed explanation goes here
 
diff --git a/lib/+artoa/+controller/+edit/+timeOfArrival/open.m b/lib/+artoa/+controller/+edit/+timeOfArrival/open.m
index 24db0493bf198a976aca853a890b369df4a3487e..d9a4408c6a30c28a688b907a810748c305c891a0 100644
--- a/lib/+artoa/+controller/+edit/+timeOfArrival/open.m
+++ b/lib/+artoa/+controller/+edit/+timeOfArrival/open.m
@@ -1,4 +1,4 @@
-function [] = open()
+function [] = open(~, ~)
 %OPEN Initializes the time of arrival editing gui.
 
 global artoaGui artoaWorkspace;
diff --git a/lib/+artoa/+controller/+file/loadArtoaIni.m b/lib/+artoa/+controller/+file/loadArtoaIni.m
index 3e147f4a431cc36b0385a6259427b3da4e9269a8..9d5ade9b12c5f2b970295af26887dbfcc61b6a29 100644
--- a/lib/+artoa/+controller/+file/loadArtoaIni.m
+++ b/lib/+artoa/+controller/+file/loadArtoaIni.m
@@ -1,4 +1,4 @@
-function [] = loadArtoaIni()
+function [] = loadArtoaIni(~, ~)
 %RELOADARTOAINI Loads the artoa.ini file and copies the required values to workspace.
 %   
 
diff --git a/lib/+artoa/+controller/+file/loadInterim.m b/lib/+artoa/+controller/+file/loadInterim.m
index 5418e7c41871e1bfd07b50aed41b4e010123e184..80ae9267720f9cccd1c417acd0e2e8181f086c0a 100644
--- a/lib/+artoa/+controller/+file/loadInterim.m
+++ b/lib/+artoa/+controller/+file/loadInterim.m
@@ -1,4 +1,4 @@
-function [] = loadInterim()
+function [] = loadInterim(~, ~)
 %LOADINTERIM Loads the current state of ARTOA4 from the file specified by dialog.
 %   
 
diff --git a/lib/+artoa/+controller/+file/loadRfb.m b/lib/+artoa/+controller/+file/loadRfb.m
index 776370ec40f24d5fcd7fb3d6d2fb1674c809e2f9..119ebd6828799504d477cfc985228056531e7c19 100644
--- a/lib/+artoa/+controller/+file/loadRfb.m
+++ b/lib/+artoa/+controller/+file/loadRfb.m
@@ -1,4 +1,4 @@
-function [] = loadRfb()
+function [] = loadRfb(~, ~)
 %LOADRFB Creates a file selection dialog and reads the file into memory.
 
 global artoaDataInput;
diff --git a/lib/+artoa/+controller/+file/loadSoundSourceFile.m b/lib/+artoa/+controller/+file/loadSoundSourceFile.m
index ce3bad6529419e727e4666768412a7fe95e102e1..609898a49f87c2da82548707499a66fa4b4c80b4 100644
--- a/lib/+artoa/+controller/+file/loadSoundSourceFile.m
+++ b/lib/+artoa/+controller/+file/loadSoundSourceFile.m
@@ -1,4 +1,4 @@
-function [] = loadSoundSourceFile()
+function [] = loadSoundSourceFile(~, ~)
 %LOADSOUNDSOURCEFILE Creates a file selection dialog and reads the file into memory.
 
 global artoaGui artoaDataInput;
diff --git a/lib/+artoa/+controller/+file/saveInterim.m b/lib/+artoa/+controller/+file/saveInterim.m
index 54d81e849e065fb9c84bdcbeed7b66cd267f8bad..f3d1f39db5fbecf1578ac4dce21e0d979c199875 100644
--- a/lib/+artoa/+controller/+file/saveInterim.m
+++ b/lib/+artoa/+controller/+file/saveInterim.m
@@ -1,4 +1,4 @@
-function [] = saveInterim()
+function [] = saveInterim(~, ~)
 %SAVEINTERIM Saves the current state of ARTOA4 to the file specified by dialog.
 %   
 
diff --git a/lib/+artoa/+controller/+track/+parameter/open.m b/lib/+artoa/+controller/+track/+parameter/open.m
index 9f19e7a1a922f94fa78531ae4ec28c10279a8644..45442636cdc82d028f2a89876b0c1f14820a5859 100644
--- a/lib/+artoa/+controller/+track/+parameter/open.m
+++ b/lib/+artoa/+controller/+track/+parameter/open.m
@@ -1,4 +1,4 @@
-function [] = open()
+function [] = open(~, ~)
 %OPEN Initializes the tracking parameter gui.
 %   
 
diff --git a/lib/+artoa/+controller/+track/+trajectoryOutput/open.m b/lib/+artoa/+controller/+track/+trajectoryOutput/open.m
index bd746c84220c3d18d9ef5e8b2296d644302c1ef5..8ab156722935d107ec5103cc6cc25c09e32766ea 100644
--- a/lib/+artoa/+controller/+track/+trajectoryOutput/open.m
+++ b/lib/+artoa/+controller/+track/+trajectoryOutput/open.m
@@ -1,4 +1,4 @@
-function [] = open()
+function [] = open(~, ~)
 %OPEN Initializes the trajectory output gui.
 %   
 
diff --git a/lib/+artoa/+controller/initializeArtoa4.m b/lib/+artoa/+controller/initializeArtoa4.m
index d54591fa4d2666406766bab05054ee933a5328ab..c07dbc6bf6623e39ca60489337896c00c24d8ce5 100644
--- a/lib/+artoa/+controller/initializeArtoa4.m
+++ b/lib/+artoa/+controller/initializeArtoa4.m
@@ -54,9 +54,27 @@ catch ex
     error([mfilename ': Reading soundsource file failed with the following message: ' ex.message]);
 end
 
-%% Start artoa4
+%% Prepare callbacks for main gui
+callbacks = struct();
+callbacks.CloseRequestFcn = @artoa.controller.quit;
+callbacks.quit = @artoa.controller.quit;
+callbacks.WindowButtonDownFcn = @artoa.controller.main.windowButtonDownFcn;
+callbacks.loadRfb = @artoa.controller.file.loadRfb;
+callbacks.loadInterim = @artoa.controller.file.loadInterim;
+callbacks.loadSoundsourceFile = @artoa.controller.file.loadSoundSourceFile;
+callbacks.saveRic = @artoa.controller.saveRic;
+callbacks.saveInterim = @artoa.controller.file.saveInterim;
+callbacks.loadArtoaIni = @artoa.controller.file.loadArtoaIni;
+callbacks.openEditTemperature = @artoa.controller.edit.temperature.open;
+callbacks.openEditPressure = @artoa.controller.edit.pressure.open;
+callbacks.openEditTimeOfArrival = @artoa.controller.edit.timeOfArrival.open;
+callbacks.openEditOffsets = @artoa.controller.edit.offsets.open;
+callbacks.openTrackParameter = @artoa.controller.track.parameter.open;
+callbacks.openTrackTrajectoryOutput = @artoa.controller.track.trajectoryOutput.open;
+callbacks.switchHideDeletedDataPoints = @artoa.controller.switchHideDeletedPoints;
 
-artoa.gui.main();
+%% Start artoa4
+artoa.gui.main(callbacks);
 
 %% Update the settings defined by ini
 if artoa.data.getMember(artoaDataInput.ini, {'view', 'hidedeleteddatapoints'}, false)
diff --git a/lib/+artoa/+controller/quit.m b/lib/+artoa/+controller/quit.m
index 0be0b008fbe7fb0232e3931a45d94fe2a883652a..46b160a18289e868280882092f3f5cff112b0622 100644
--- a/lib/+artoa/+controller/quit.m
+++ b/lib/+artoa/+controller/quit.m
@@ -1,4 +1,4 @@
-function [] = quit()
+function [] = quit(~, ~)
 %QUIT Closes all windows, cleans up workspace and quits ARTOA4.
 
 global artoaGui;
diff --git a/lib/+artoa/+controller/switchHideDeletedPoints.m b/lib/+artoa/+controller/switchHideDeletedPoints.m
index 63ff1b5f25a5c4e0c9e09f64e8c3db3667ba9825..a9d5b7c8d8db21f5ef5161080b4aefaaa1e7983e 100644
--- a/lib/+artoa/+controller/switchHideDeletedPoints.m
+++ b/lib/+artoa/+controller/switchHideDeletedPoints.m
@@ -1,4 +1,4 @@
-function [] = switchHideDeletedPoints()
+function [] = switchHideDeletedPoints(~, ~)
 %SWITCHVIEWSHOWALL Switches wether all data points are shown or not.
 %   Switches the menu checkbox and updates the workspace accordingly.
 
diff --git a/lib/+artoa/+gui/main.m b/lib/+artoa/+gui/main.m
index 85022507fabbb0411a7917109dcea27fb32fb105..86566f9587d70bd4c6e33ea20770ad3cfae40ac3 100644
--- a/lib/+artoa/+gui/main.m
+++ b/lib/+artoa/+gui/main.m
@@ -1,8 +1,35 @@
-function [ ] = main()
+function [ ] = main(pCallbacks)
 %MAIN Contains the definition of main ARTOA4 gui.
 
 global artoaGui;
 
+%% Initialize callbacks
+
+availableCallbacks = { ...
+    'CloseRequestFcn', ...
+    'WindowButtonDownFcn', ...
+    'loadRfb', ...
+    'loadInterim', ...
+    'loadSoundsourceFile', ...
+    'saveRic', ...
+    'saveInterim', ...
+    'loadArtoaIni', ...
+    'quit', ...
+    'openEditTemperature', ...
+    'openEditPressure', ...
+    'openEditTimeOfArrival', ...
+    'openEditOffsets', ...
+    'openTrackParameter', ...
+    'openTrackTrajectoryOutput', ...
+    'switchHideDeletedDataPoints' ...
+};
+
+for i = 1:length(availableCallbacks) % check if a callback is undefined
+    if ~isfield(pCallbacks, availableCallbacks{i})
+        pCallbacks.(availableCallbacks{i}) = @(~, ~) false;
+    end
+end
+
 %% Initialize main window
 
 artoaGui.figures.main = figure( ...
@@ -13,7 +40,7 @@ artoaGui.figures.main = figure( ...
     'WindowKeyPressFcn', @artoa.controller.main.shortcuts ...
 );
 
-set(artoaGui.figures.main, 'CloseRequestFcn', 'artoa.controller.quit();');
+set(artoaGui.figures.main, 'CloseRequestFcn', pCallbacks.CloseRequestFcn);
 
 %% Initialize file menu
 artoaGui.main.menus = struct();
@@ -29,17 +56,17 @@ uimenu( ...
 uimenu( ...
     loadHandle, ...
     'Label', 'RFB file', ...
-    'Callback', 'artoa.controller.file.loadRfb();' ...
+    'Callback', pCallbacks.loadRfb ...
 );
 uimenu( ...
     loadHandle, ...
     'Label', 'Interim file', ...
-    'Callback', 'artoa.controller.file.loadInterim();' ...
+    'Callback', pCallbacks.loadInterim ...
 );
 uimenu( ...
     loadHandle, ...
     'Label', 'SoSo file', ...
-    'Callback', 'artoa.controller.file.loadSoundSourceFile();' ...
+    'Callback', pCallbacks.loadSoundsourceFile ...
 );
 
 
@@ -53,27 +80,27 @@ artoaGui.main.menus.fileSave = uimenu( ...
 uimenu( ...
     artoaGui.main.menus.fileSave, ...
     'Label', 'RIC file', ...
-    'Callback', 'artoa.controller.saveRic();', ...
+    'Callback', pCallbacks.saveRic, ...
     'Enable', 'off' ...
 );
 
 uimenu( ...
     artoaGui.main.menus.fileSave, ...
     'Label', 'Interim file', ...
-    'Callback', 'artoa.controller.file.saveInterim();' ...
+    'Callback', pCallbacks.saveInterim ...
 );
 
 artoaGui.main.menus.fileReloadArtoaIni = uimenu( ...
     artoaGui.main.menus.file, ...
     'Label', 'Reload artoa.ini', ...
-    'Callback', 'artoa.controller.file.loadArtoaIni();' ...
+    'Callback', pCallbacks.loadArtoaIni ...
 );
 
 % QUIT
 artoaGui.main.menus.fileQuit = uimenu( ...
     artoaGui.main.menus.file, ...
     'Label', 'Quit', ...
-    'Callback', 'artoa.controller.quit();' ...
+    'Callback', pCallbacks.quit ...
 );
 
 %% Initialize edit menu
@@ -88,21 +115,21 @@ artoaGui.main.menus.edit = uimenu( ...
 artoaGui.main.menus.editTemperature = uimenu( ...
     artoaGui.main.menus.edit, ...
     'Label', 'Temperature', ...
-    'Callback', 'artoa.controller.edit.temperature.open();' ...
+    'Callback', pCallbacks.openEditTemperature ...
 );
 
 % PRESSURE
 artoaGui.main.menus.editPressure = uimenu( ...
     artoaGui.main.menus.edit, ...
     'Label', 'Pressure', ...
-    'Callback', 'artoa.controller.edit.pressure.open();' ...
+    'Callback', pCallbacks.openEditPressure ...
 );
 
 % TIME OF ARRIVAL
 artoaGui.main.menus.editTimeOfArrival = uimenu( ...
     artoaGui.main.menus.edit, ...
     'Label', 'Time of arrival', ...
-    'Callback', 'artoa.controller.edit.timeOfArrival.open();', ...
+    'Callback', pCallbacks.openEditTimeOfArrival, ...
     'Separator', 'on', ...
     'Enable', 'off' ...
 );
@@ -110,7 +137,7 @@ artoaGui.main.menus.editTimeOfArrival = uimenu( ...
 artoaGui.main.menus.editOffsetDetails = uimenu( ...
     artoaGui.main.menus.edit, ...
     'Label', 'Offset details', ...
-    'Callback', 'artoa.controller.edit.offsets.open();', ...
+    'Callback', pCallbacks.openEditOffsets, ...
     'Separator', 'on' ...
 );
 
@@ -126,14 +153,14 @@ artoaGui.main.menus.track = uimenu( ...
 artoaGui.main.menus.trackParameter = uimenu( ...
     artoaGui.main.menus.track, ...
     'Label', 'Track Parameter', ...
-    'Callback', 'artoa.controller.track.parameter.open();' ...
+    'Callback', pCallbacks.openTrackParameter ...
 );
 
 % TRAJECTORY OUTPUT
 artoaGui.main.menus.trajectoryOutput = uimenu( ...
     artoaGui.main.menus.track, ...
     'Label', 'Trajectory output', ...
-    'Callback', 'artoa.controller.track.trajectoryOutput.open();' ...
+    'Callback', pCallbacks.openTrackTrajectoryOutput ...
 );
 
 
@@ -148,7 +175,7 @@ artoaGui.main.menus.view = uimenu( ...
 artoaGui.main.menus.viewHideDeletedDataPoints = uimenu( ...
     artoaGui.main.menus.view, ...
     'Label', 'Hide deleted data points', ...
-    'Callback', 'artoa.controller.switchHideDeletedPoints();' ...
+    'Callback', pCallbacks.switchHideDeletedDataPoints ...
 );
 
 %% Initialize shortcut hints
@@ -179,7 +206,7 @@ gitInfo = getGitInfo();
 
 artoaGui.main.textVersionInfo = uicontrol( ...
     'Parent', artoaGui.figures.main, ...
-    'String', ['Version 4.' gitInfo.hash(1:8)], ...
+    'String', artoa.controller.main.getVersionString(), ...
     'Style', 'text', ...
     'FontSize', 10, ...
     'Units', 'normalized', ...