diff --git a/app/app.pro b/app/app.pro
index 39bd4ec..1e42dcc 100644
--- a/app/app.pro
+++ b/app/app.pro
@@ -1,4 +1,4 @@
-QT += qml quick widgets sql
+QT += qml quick widgets sql quickcontrols2
 TARGET = cool-retro-term 
 
 DESTDIR = $$OUT_PWD/../
diff --git a/app/main.cpp b/app/main.cpp
index c58679e..afd0834 100644
--- a/app/main.cpp
+++ b/app/main.cpp
@@ -6,11 +6,13 @@
 
 #include <QtWidgets/QApplication>
 #include <QIcon>
+#include <QQuickStyle>
 
 #include <QDebug>
 #include <stdlib.h>
 
 #include <QFontDatabase>
+#include <QLoggingCategory>
 
 #include <fileio.h>
 #include <monospacefontmanager.h>
@@ -33,6 +35,9 @@ int main(int argc, char *argv[])
     // This disables QT appmenu under Ubuntu, which is not working with QML apps.
     setenv("QT_QPA_PLATFORMTHEME", "", 1);
 
+    // Disable Connections slot warnings
+    QLoggingCategory::setFilterRules("qt.qml.connections.warning=false");
+
 #if defined (Q_OS_LINUX)
     setenv("QSG_RENDER_LOOP", "threaded", 0);
 #endif
@@ -42,6 +47,9 @@ int main(int argc, char *argv[])
     setenv("LC_CTYPE", "UTF-8", 1);
 #endif
 
+    // Force fusion style on every platform
+    QQuickStyle::setStyle("Fusion");
+
     if (argc>1 && (!strcmp(argv[1],"-h") || !strcmp(argv[1],"--help"))) {
         QTextStream cout(stdout, QIODevice::WriteOnly);
         cout << "Usage: " << argv[0] << " [--default-settings] [--workdir <dir>] [--program <prog>] [-p|--profile <prof>] [--fullscreen] [-h|--help]" << endl;
@@ -65,9 +73,7 @@ int main(int argc, char *argv[])
     }
 
     QApplication app(argc, argv);
-    // set application attributes
-    // Has no effects, see https://bugreports.qt.io/browse/QTBUG-51293
-    // app.setAttribute(Qt::AA_MacDontSwapCtrlAndMeta, true);
+    app.setAttribute(Qt::AA_MacDontSwapCtrlAndMeta, true);
 
     QQmlApplicationEngine engine;
     FileIO fileIO;
diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml
index d8a1d70..424f0bd 100644
--- a/app/qml/ApplicationSettings.qml
+++ b/app/qml/ApplicationSettings.qml
@@ -34,6 +34,8 @@ QtObject {
     readonly property real minBurnInFadeTime: 160
     readonly property real maxBurnInFadeTime: 1600
 
+    property bool isMacOS: Qt.platform.os === "osx"
+
     // GENERAL SETTINGS ///////////////////////////////////////////////////////
     property int x: 100
     property int y: 100
@@ -41,7 +43,7 @@ QtObject {
     property int height: 768
 
     property bool fullscreen: false
-    property bool showMenubar: Qt.platform.os === "osx" ? true : false
+    property bool showMenubar: false
 
     property string wintitle: "cool-retro-term"
 
@@ -52,9 +54,7 @@ QtObject {
     property bool verbose: false
 
     property real bloomQuality: 0.5
-
     property real burnInQuality: 0.5
-    property bool useFastBurnIn: Qt.platform.os === "osx" ? false : true
 
     property bool blinkingCursor: false
 
@@ -242,8 +242,7 @@ QtObject {
             "bloomQuality": bloomQuality,
             "burnInQuality": burnInQuality,
             "useCustomCommand": useCustomCommand,
-            "customCommand": customCommand,
-            "useFastBurnIn": useFastBurnIn
+            "customCommand": customCommand
         }
         return stringify(settings)
     }
@@ -338,9 +337,6 @@ QtObject {
                 !== undefined ? settings.useCustomCommand : useCustomCommand
         customCommand = settings.customCommand
                 !== undefined ? settings.customCommand : customCommand
-
-        useFastBurnIn = settings.useFastBurnIn
-                !== undefined ? settings.useFastBurnIn : useFastBurnIn
     }
 
     function loadProfileString(profileString) {
diff --git a/app/qml/BurnInEffect.qml b/app/qml/BurnInEffect.qml
index 9061b9c..6478b95 100644
--- a/app/qml/BurnInEffect.qml
+++ b/app/qml/BurnInEffect.qml
@@ -29,26 +29,29 @@ Loader {
     property real lastUpdate: 0
     property real prevLastUpdate: 0
 
-    property real delay: (1.0 / appSettings.fps) * 1000
     property real burnIn: appSettings.burnIn
     property real burnInFadeTime: 1 / Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn)
     property real _minBurnInFadeTime: appSettings.minBurnInFadeTime
     property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime
 
-    active: appSettings.useFastBurnIn && appSettings.burnIn !== 0
+    active: appSettings.burnIn !== 0
 
     anchors.fill: parent
 
     function completelyUpdate() {
-        prevLastUpdate = lastUpdate;
-        lastUpdate = timeManager.time;
-        item.source.scheduleUpdate();
+        let newTime = timeManager.time
+        if (newTime > lastUpdate) {
+            prevLastUpdate = lastUpdate
+            lastUpdate = newTime
+        }
+
+        item.source.scheduleUpdate()
     }
 
-    function restartBlurSource(){
-        prevLastUpdate = timeManager.time;
-        lastUpdate = prevLastUpdate;
-        completelyUpdate();
+    function restartBlurSource() {
+        prevLastUpdate = timeManager.time
+        lastUpdate = prevLastUpdate
+        completelyUpdate()
     }
 
     sourceComponent: Item {
@@ -72,20 +75,30 @@ Loader {
 
             Connections {
                 target: kterminal
-                onImagePainted: completelyUpdate()
+
+                function onImagePainted() {
+                    completelyUpdate()
+                }
             }
             // Restart blurred source settings change.
-            Connections{
-                target: appSettings
-                onBurnInChanged: burnInEffect.restartBlurSource();
-                onTerminalFontChanged: burnInEffect.restartBlurSource();
-                onRasterizationChanged: burnInEffect.restartBlurSource();
-                onBurnInQualityChanged: burnInEffect.restartBlurSource();
-            }
-
             Connections {
-                target: kterminalScrollbar
-                onOpacityChanged: completelyUpdate()
+                target: appSettings
+
+                function onBurnInChanged() {
+                    burnInEffect.restartBlurSource()
+                }
+
+                function onTerminalFontChanged() {
+                    burnInEffect.restartBlurSource()
+                }
+
+                function onRasterizationChanged() {
+                    burnInEffect.restartBlurSource()
+                }
+
+                function onBurnInQualityChanged() {
+                    burnInEffect.restartBlurSource()
+                }
             }
         }
 
diff --git a/app/qml/ColorButton.qml b/app/qml/ColorButton.qml
index f46134b..a2d97e3 100644
--- a/app/qml/ColorButton.qml
+++ b/app/qml/ColorButton.qml
@@ -34,10 +34,8 @@ Item {
         visible: false
 
         //This is a workaround to a Qt 5.2 bug.
-        onColorChanged: if (Qt.platform.os !== "osx")
-                            colorSelected(color)
-        onAccepted: if (Qt.platform.os === "osx")
-                        colorSelected(color)
+        onColorChanged: if (!appSettings.isMacOS) colorSelected(color)
+        onAccepted: if (appSettings.isMacOS) colorSelected(color)
     }
     Rectangle {
         anchors.fill: parent
diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml
index 9edf981..85660e9 100644
--- a/app/qml/PreprocessedTerminal.qml
+++ b/app/qml/PreprocessedTerminal.qml
@@ -34,7 +34,6 @@ Item{
 
     property ShaderEffectSource mainSource: kterminalSource
     property BurnInEffect burnInEffect: burnInEffect
-    property SlowBurnIn slowBurnInEffect: slowBurnInEffect
     property real fontWidth: 1.0
     property real screenScaling: 1.0
     property real scaleTexture: 1.0
@@ -45,28 +44,54 @@ Item{
     property size fontMetrics: kterminal.fontMetrics
 
     // Manage copy and paste
-    Connections{
+    Connections {
         target: copyAction
-        onTriggered: kterminal.copyClipboard();
+
+        function onTriggered() {
+            kterminal.copyClipboard()
+        }
     }
-    Connections{
+    Connections {
         target: pasteAction
-        onTriggered: kterminal.pasteClipboard()
+
+        function onTriggered() {
+            kterminal.pasteClipboard()
+        }
     }
 
     //When settings are updated sources need to be redrawn.
-    Connections{
+    Connections {
         target: appSettings
-        onFontScalingChanged: terminalContainer.updateSources();
-        onFontWidthChanged: terminalContainer.updateSources();
+
+        function onFontScalingChanged() {
+            terminalContainer.updateSources()
+        }
+
+        function onFontWidthChanged() {
+            terminalContainer.updateSources()
+        }
     }
-    Connections{
+    Connections {
         target: terminalContainer
-        onWidthChanged: terminalContainer.updateSources();
-        onHeightChanged: terminalContainer.updateSources();
+
+        function onWidthChanged() {
+            terminalContainer.updateSources()
+        }
+
+        function onHeightChanged() {
+            terminalContainer.updateSources()
+        }
     }
+    Connections {
+        target: terminalWindow
+
+        function onActiveChanged() {
+            kterminal.forceActiveFocus()
+        }
+    }
+
     function updateSources() {
-        kterminal.update();
+        kterminal.update()
     }
 
     QMLTermWidget {
@@ -143,7 +168,7 @@ Item{
                 var args = Utils.tokenizeCommandLine(appSettings.customCommand);
                 ksession.setShellProgram(args[0]);
                 ksession.setArgs(args.slice(1));
-            } else if (!defaultCmd && Qt.platform.os === "osx") {
+            } else if (!defaultCmd && appSettings.isMacOS) {
                 // OSX Requires the following default parameters for auto login.
                 ksession.setArgs(["-i", "-l"]);
             }
@@ -173,7 +198,7 @@ Item{
 
     Loader {
         id: menuLoader
-        sourceComponent: (Qt.platform.os === "osx" || appSettings.showMenubar ? shortContextMenu : fullContextMenu)
+        sourceComponent: (appSettings.isMacOS || appSettings.showMenubar ? shortContextMenu : fullContextMenu)
     }
     property alias contextmenu: menuLoader.item
 
@@ -250,9 +275,5 @@ Item{
         BurnInEffect {
             id: burnInEffect
         }
-
-        SlowBurnIn {
-            id: slowBurnInEffect
-        }
     }
 }
diff --git a/app/qml/SettingsAdvancedTab.qml b/app/qml/SettingsAdvancedTab.qml
index 2a4e238..f7eb161 100644
--- a/app/qml/SettingsAdvancedTab.qml
+++ b/app/qml/SettingsAdvancedTab.qml
@@ -154,12 +154,6 @@ ColumnLayout {
             Label {
                 text: Math.round(burnInSlider.value * 100) + "%"
             }
-            CheckBox {
-                Layout.columnSpan: 2
-                text: qsTr("Burnin optimization (Might display timing artifacts)")
-                checked: appSettings.useFastBurnIn
-                onCheckedChanged: appSettings.useFastBurnIn = checked
-            }
         }
     }
 }
diff --git a/app/qml/SettingsGeneralTab.qml b/app/qml/SettingsGeneralTab.qml
index ed3359e..40fbc0d 100644
--- a/app/qml/SettingsGeneralTab.qml
+++ b/app/qml/SettingsGeneralTab.qml
@@ -33,6 +33,7 @@ ColumnLayout {
                 Layout.fillWidth: true
                 Layout.fillHeight: true
                 model: appSettings.profilesList
+                clip: true
                 delegate: Rectangle {
                     width: label.width
                     height: label.height
@@ -215,10 +216,12 @@ ColumnLayout {
             }
             Label {
                 text: qsTr("Opacity")
+                visible: !appSettings.isMacOS
             }
             SimpleSlider {
                 onValueChanged: appSettings.windowOpacity = value
                 value: appSettings.windowOpacity
+                visible: !appSettings.isMacOS
             }
         }
     }
diff --git a/app/qml/SettingsTerminalTab.qml b/app/qml/SettingsTerminalTab.qml
index 8e3a35c..7811d4c 100644
--- a/app/qml/SettingsTerminalTab.qml
+++ b/app/qml/SettingsTerminalTab.qml
@@ -68,7 +68,10 @@ ColumnLayout {
                 }
                 Connections {
                     target: appSettings
-                    onTerminalFontChanged: fontChanger.updateIndex()
+
+                    function onTerminalFontChanged() {
+                        fontChanger.updateIndex()
+                    }
                 }
                 Component.onCompleted: updateIndex()
             }
diff --git a/app/qml/SettingsWindow.qml b/app/qml/SettingsWindow.qml
index 6b5c024..1009aa2 100644
--- a/app/qml/SettingsWindow.qml
+++ b/app/qml/SettingsWindow.qml
@@ -27,42 +27,49 @@ import QtQuick.Dialogs 1.1
 Window {
     id: settings_window
     title: qsTr("Settings")
-    width: 800
-    height: 600
+    width: 600
+    height: 480
 
     property int tabmargins: 15
 
-    TabBar {
-        id: bar
-        width: parent.width
-        TabButton {
-            text: qsTr("General")
-        }
-        TabButton {
-            text: qsTr("Terminal")
-        }
-        TabButton {
-            text: qsTr("Effects")
-        }
-        TabButton {
-            text: qsTr("Advanced")
-        }
-    }
+    Item {
+        anchors { fill: parent;  margins: tabmargins }
 
-    StackLayout {
-        anchors {
-            top: bar.bottom
-            left: parent.left
-            right: parent.right
-            bottom: parent.bottom
-            margins: tabmargins
+        TabBar {
+            id: bar
+            anchors { left: parent.left; right: parent.right; top: parent.top; }
+            TabButton {
+                text: qsTr("General")
+            }
+            TabButton {
+                text: qsTr("Terminal")
+            }
+            TabButton {
+                text: qsTr("Effects")
+            }
+            TabButton {
+                text: qsTr("Advanced")
+            }
         }
 
-        currentIndex: bar.currentIndex
+        Frame {
+            anchors {
+                top: bar.bottom
+                left: parent.left
+                right: parent.right
+                bottom: parent.bottom
+            }
 
-        SettingsGeneralTab { }
-        SettingsTerminalTab { }
-        SettingsEffectsTab { }
-        SettingsAdvancedTab { }
+            StackLayout {
+                anchors.fill: parent
+
+                currentIndex: bar.currentIndex
+
+                SettingsGeneralTab { }
+                SettingsTerminalTab { }
+                SettingsEffectsTab { }
+                SettingsAdvancedTab { }
+            }
+        }
     }
 }
diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml
index 4164320..2de0d9b 100644
--- a/app/qml/ShaderTerminal.qml
+++ b/app/qml/ShaderTerminal.qml
@@ -24,7 +24,6 @@ import QtGraphicalEffects 1.0
 import "utils.js" as Utils
 
 Item {
-    property SlowBurnIn slowBurnInEffect
     property ShaderEffectSource source
     property BurnInEffect burnInEffect
     property ShaderEffectSource bloomSource
@@ -67,14 +66,10 @@ Item {
          property real glowingLine: appSettings.glowingLine * 0.2
 
          // Fast burnin properties
-         property real burnIn: appSettings.useFastBurnIn ? appSettings.burnIn : 0
+         property real burnIn: appSettings.burnIn
          property real burnInLastUpdate: burnInEffect.lastUpdate
          property real burnInTime: burnInEffect.burnInFadeTime
 
-         // Slow burnin properties
-         property real slowBurnIn: appSettings.useFastBurnIn ? 0 : appSettings.burnIn
-         property ShaderEffectSource slowBurnInSource: slowBurnInEffect.source
-
          property real jitter: appSettings.jitter
          property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
          property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight)
@@ -185,8 +180,6 @@ Item {
                  uniform sampler2D burnInSource;
                  uniform highp float burnInLastUpdate;
                  uniform highp float burnInTime;" : "") +
-             (slowBurnIn !== 0 ? "
-                 uniform sampler2D slowBurnInSource;" : "") +
              (staticNoise !== 0 ? "
                  uniform highp float staticNoise;" : "") +
              (((staticNoise !== 0 || jitter !== 0) ||(fallBack && (flickering || horizontalSync))) ? "
@@ -314,11 +307,6 @@ Item {
                      txt_color = max(txt_color, convertWithChroma(burnInColor));"
                  : "") +
 
-                 (slowBurnIn !== 0 ? "
-                     vec4 txt_blur = texture2D(slowBurnInSource, staticCoords);
-                     txt_color = max(txt_color, convertWithChroma(txt_blur.rgb * txt_blur.a));
-                 " : "") +
-
                   "txt_color += fontColor.rgb * vec3(color);" +
 
                   "txt_color = applyRasterization(staticCoords, txt_color, virtualResolution, rasterizationIntensity);\n" +
diff --git a/app/qml/SlowBurnIn.qml b/app/qml/SlowBurnIn.qml
deleted file mode 100644
index 25899ba..0000000
--- a/app/qml/SlowBurnIn.qml
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
-* Copyright (c) 2013-2021 "Filippo Scognamiglio"
-* https://github.com/Swordfish90/cool-retro-term
-*
-* This file is part of cool-retro-term.
-*
-* cool-retro-term is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*******************************************************************************/
-
-import QtQuick 2.0
-
-import "utils.js" as Utils
-
-Loader {
-    property ShaderEffectSource source: item ? item.source : null
-
-    active: !appSettings.useFastBurnIn && appSettings.burnIn !== 0
-    anchors.fill: parent
-
-    sourceComponent: Item {
-        property alias source: burnInSourceEffect
-        property int burnInScaling: scaleTexture * appSettings.burnInQuality
-
-        ShaderEffectSource {
-            property bool updateBurnIn: false
-            property real burnIn: appSettings.burnIn
-            property real fps: appSettings.fps !== 0 ? appSettings.fps : 60
-            property real burnInFadeTime: Utils.lint(minBurnInFadeTime, maxBurnInFadeTime, burnIn)
-            property real burnInCoefficient: 1000 / (fps * burnInFadeTime)
-            property real minBurnInFadeTime: appSettings.minBurnInFadeTime
-            property real maxBurnInFadeTime: appSettings.maxBurnInFadeTime
-
-            id: burnInSourceEffect
-
-            anchors.fill: parent
-
-            sourceItem: burnInEffect
-            recursive: true
-            live: false
-            hideSource: true
-            wrapMode: kterminalSource.wrapMode
-
-            visible: false
-
-            function restartBlurSource(){
-                livetimer.restart();
-            }
-
-            // This updates the burnin synched with the timer.
-            Connections {
-                target: burnInSourceEffect.updateBurnIn ? timeManager : null
-                ignoreUnknownSignals: false
-                onTimeChanged: {
-                    burnInSourceEffect.scheduleUpdate();
-                }
-            }
-
-            Timer {
-                id: livetimer
-
-                // The interval assumes 60 fps. This is the time needed burnout a white pixel.
-                // We multiply 1.1 to have a little bit of margin over the theoretical value.
-                // This solution is not extremely clean, but it's probably the best to avoid measuring fps.
-
-                interval: burnInSourceEffect.burnInFadeTime * 1.1
-                running: true
-                onTriggered: burnInSourceEffect.updateBurnIn = false;
-            }
-            Connections {
-                target: kterminal
-                onImagePainted:{
-                    burnInSourceEffect.scheduleUpdate();
-                    burnInSourceEffect.updateBurnIn = true;
-                    livetimer.restart();
-                }
-            }
-            // Restart blurred source settings change.
-            Connections {
-                target: appSettings
-                onBurnInChanged: burnInSourceEffect.restartBlurSource();
-                onTerminalFontChanged: burnInSourceEffect.restartBlurSource();
-                onRasterizationChanged: burnInSourceEffect.restartBlurSource();
-                onBurnInQualityChanged: burnInSourceEffect.restartBlurSource();
-            }
-            Connections {
-                target: kterminalScrollbar
-                onOpacityChanged: burnInSourceEffect.restartBlurSource();
-            }
-
-            ShaderEffect {
-                id: burnInEffect
-
-                property variant txt_source: kterminalSource
-                property variant blurredSource: burnInSourceEffect
-                property real burnInCoefficient: burnInSourceEffect.burnInCoefficient
-
-                anchors.fill: parent
-                blending: false
-
-                fragmentShader:
-                    "#ifdef GL_ES
-                        precision mediump float;
-                    #endif\n" +
-
-                    "uniform lowp float qt_Opacity;" +
-                    "uniform lowp sampler2D txt_source;" +
-
-                    "varying highp vec2 qt_TexCoord0;
-                     uniform lowp sampler2D blurredSource;
-                     uniform highp float burnInCoefficient;" +
-
-                    "float max3(vec3 v) {
-                         return max (max (v.x, v.y), v.z);
-                    }" +
-
-                    "void main() {" +
-                        "vec2 coords = qt_TexCoord0;" +
-                        "vec3 origColor = texture2D(txt_source, coords).rgb;" +
-                        "vec3 blur_color = texture2D(blurredSource, coords).rgb - vec3(burnInCoefficient);" +
-                        "vec3 color = min(origColor + blur_color, max(origColor, blur_color));" +
-
-                        "gl_FragColor = vec4(color, max3(color - origColor));" +
-                    "}"
-
-                onStatusChanged: if (log) console.log(log) //Print warning messages
-            }
-        }
-    }
-}
diff --git a/app/qml/TerminalContainer.qml b/app/qml/TerminalContainer.qml
index 9896354..b6be435 100644
--- a/app/qml/TerminalContainer.qml
+++ b/app/qml/TerminalContainer.qml
@@ -33,7 +33,6 @@ ShaderTerminal {
 
     source: terminal.mainSource
     burnInEffect: terminal.burnInEffect
-    slowBurnInEffect: terminal.slowBurnInEffect
     virtualResolution: terminal.virtualResolution
     screenResolution: Qt.size(
         terminalWindow.width * devicePixelRatio * appSettings.windowScaling,
diff --git a/app/qml/main.qml b/app/qml/main.qml
index 0e8395f..8ae0774 100644
--- a/app/qml/main.qml
+++ b/app/qml/main.qml
@@ -53,20 +53,30 @@ ApplicationWindow {
     property bool fullscreen: appSettings.fullscreen
     onFullscreenChanged: visibility = (fullscreen ? Window.FullScreen : Window.Windowed)
 
-    menuBar: WindowMenu {
-        id: mainMenu
-        visible: (Qt.platform.os === "osx" || appSettings.showMenubar)
+    menuBar: qtquickMenuLoader.item
+
+    Loader {
+        id: qtquickMenuLoader
+        active: !appSettings.isMacOS && appSettings.showMenubar
+        sourceComponent: WindowMenu { }
+    }
+
+    Loader {
+        id: globalMenuLoader
+        active: appSettings.isMacOS
+        sourceComponent: OSXMenu { }
     }
 
     property string wintitle: appSettings.wintitle
 
     color: "#00000000"
+
     title: terminalContainer.title || qsTr(appSettings.wintitle)
 
     Action {
         id: showMenubarAction
         text: qsTr("Show Menubar")
-        enabled: Qt.platform.os !== "osx"
+        enabled: !appSettings.isMacOS
         shortcut: "Ctrl+Shift+M"
         checkable: true
         checked: appSettings.showMenubar
@@ -75,7 +85,7 @@ ApplicationWindow {
     Action {
         id: fullscreenAction
         text: qsTr("Fullscreen")
-        enabled: Qt.platform.os !== "osx"
+        enabled: !appSettings.isMacOS
         shortcut: "Alt+F11"
         onTriggered: appSettings.fullscreen = !appSettings.fullscreen
         checkable: true
@@ -154,7 +164,7 @@ ApplicationWindow {
     onClosing: {
         // OSX Since we are currently supporting only one window
         // quit the application when it is closed.
-        if (Qt.platform.os === "osx")
+        if (appSettings.isMacOS)
             Qt.quit()
     }
 }
diff --git a/app/qml/menus/OSXMenu.qml b/app/qml/menus/OSXMenu.qml
new file mode 100644
index 0000000..3fe9971
--- /dev/null
+++ b/app/qml/menus/OSXMenu.qml
@@ -0,0 +1,89 @@
+/*******************************************************************************
+* Copyright (c) 2013-2021 "Filippo Scognamiglio"
+* https://github.com/Swordfish90/cool-retro-term
+*
+* This file is part of cool-retro-term.
+*
+* cool-retro-term is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*******************************************************************************/
+
+import QtQuick 2.3
+import Qt.labs.platform 1.1
+
+MenuBar {
+    id: defaultMenuBar
+
+    Menu {
+        title: qsTr("File")
+        MenuItem {
+            text: quitAction.text
+            onTriggered: quitAction.trigger()
+        }
+    }
+    Menu {
+        title: qsTr("Edit")
+        MenuItem {
+            text: copyAction.text
+            shortcut: "Meta+C"
+            onTriggered: copyAction.trigger()
+        }
+        MenuItem {
+            text: pasteAction.text
+            shortcut: "Meta+V"
+            onTriggered: pasteAction.trigger()
+        }
+        MenuSeparator {}
+        MenuItem {
+            text: showsettingsAction.text
+            shortcut: showsettingsAction.shortcut
+            onTriggered: showsettingsAction.trigger()
+        }
+    }
+    Menu {
+        title: qsTr("View")
+        MenuItem {
+            text: zoomIn.text
+            shortcut: "Meta++"
+            onTriggered: zoomIn.trigger()
+        }
+        MenuItem {
+            text: zoomOut.text
+            shortcut: "Meta+-"
+            onTriggered: zoomOut.trigger()
+        }
+    }
+    Menu {
+        id: profilesMenu
+        title: qsTr("Profiles")
+        Instantiator {
+            model: appSettings.profilesList
+            delegate: MenuItem {
+                text: model.text
+                onTriggered: {
+                    appSettings.loadProfileString(obj_string)
+                    appSettings.handleFontChanged()
+                }
+            }
+            onObjectAdded: profilesMenu.insertItem(index, object)
+            onObjectRemoved: profilesMenu.removeItem(object)
+        }
+    }
+    Menu {
+        title: qsTr("Help")
+        MenuItem {
+            text: showAboutAction.text
+            onTriggered: showAboutAction.trigger()
+        }
+    }
+}
diff --git a/app/qml/resources.qrc b/app/qml/resources.qrc
index 0cb4d24..1114d8d 100644
--- a/app/qml/resources.qrc
+++ b/app/qml/resources.qrc
@@ -41,10 +41,10 @@
         <file>BurnInEffect.qml</file>
         <file>fonts/modern-terminus/TerminusTTF-4.46.0.ttf</file>
         <file>TerminalFrame.qml</file>
-        <file>SlowBurnIn.qml</file>
         <file>menus/WindowMenu.qml</file>
         <file>menus/FullContextMenu.qml</file>
         <file>menus/ShortContextMenu.qml</file>
         <file>ShaderLibrary.qml</file>
+        <file>menus/OSXMenu.qml</file>
     </qresource>
 </RCC>
diff --git a/qmltermwidget b/qmltermwidget
index 5c47d1f..6322802 160000
--- a/qmltermwidget
+++ b/qmltermwidget
@@ -1 +1 @@
-Subproject commit 5c47d1f49455394226e0e595f79c148f0c098006
+Subproject commit 63228027e1f97c24abb907550b22ee91836929c5