diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml
index 056a93f..d8a1d70 100644
--- a/app/qml/ApplicationSettings.qml
+++ b/app/qml/ApplicationSettings.qml
@@ -99,7 +99,12 @@ QtObject {
     property real rbgShift: 0.0
 
     property real _margin: 0.5
+    property real _frameMargin: 0.5
+
     property real margin: Utils.lint(1.0, 20.0, _margin)
+    property real frameMargin: Utils.lint(1.0, 50.0, _frameMargin)
+
+    property real totalMargin: frameMargin + margin
 
     readonly property int no_rasterization: 0
     readonly property int scanline_rasterization: 1
@@ -238,8 +243,7 @@ QtObject {
             "burnInQuality": burnInQuality,
             "useCustomCommand": useCustomCommand,
             "customCommand": customCommand,
-            "useFastBurnIn": useFastBurnIn,
-            "blinkingCursor": blinkingCursor
+            "useFastBurnIn": useFastBurnIn
         }
         return stringify(settings)
     }
@@ -266,7 +270,9 @@ QtObject {
             "windowOpacity": windowOpacity,
             "fontName": fontNames[rasterization],
             "fontWidth": fontWidth,
-            "margin": _margin
+            "margin": _margin,
+            "blinkingCursor": blinkingCursor,
+            "frameMargin": _frameMargin,
         }
         return settings
     }
@@ -335,9 +341,6 @@ QtObject {
 
         useFastBurnIn = settings.useFastBurnIn
                 !== undefined ? settings.useFastBurnIn : useFastBurnIn
-
-        blinkingCursor = settings.blinkingCursor
-                !== undefined ? settings.blinkingCursor : blinkingCursor
     }
 
     function loadProfileString(profileString) {
@@ -379,6 +382,9 @@ QtObject {
         fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth
 
         _margin = settings.margin !== undefined ? settings.margin : _margin
+        _frameMargin = settings.frameMargin !== undefined ? settings.frameMargin : _frameMargin
+
+        blinkingCursor = settings.blinkingCursor !== undefined ? settings.blinkingCursor : blinkingCursor
 
         handleFontChanged()
     }
@@ -459,7 +465,9 @@ QtObject {
                 "screenCurvature": 0.3,
                 "staticNoise": 0.1198,
                 "windowOpacity": 1,
-                "margin": 0.5
+                "margin": 0.5,
+                "blinkingCursor": false,
+                "frameMargin": 0.1
             }'
             builtin: true
         }
@@ -486,7 +494,9 @@ QtObject {
                 "screenCurvature": 0.3,
                 "staticNoise": 0.1198,
                 "windowOpacity": 1,
-                "margin": 0.5
+                "margin": 0.5,
+                "blinkingCursor": false,
+                "frameMargin": 0.1
             }'
             builtin: true
         }
@@ -513,7 +523,9 @@ QtObject {
                 "screenCurvature": 0.3,
                 "staticNoise": 0.15,
                 "windowOpacity": 1,
-                "margin": 0.5
+                "margin": 0.5,
+                "blinkingCursor": false,
+                "frameMargin": 0.1
             }'
             builtin: true
         }
@@ -540,7 +552,9 @@ QtObject {
                 "screenCurvature": 0,
                 "staticNoise": 0.15,
                 "windowOpacity": 1,
-                "margin": 0.5
+                "margin": 0.5,
+                "blinkingCursor": false,
+                "frameMargin": 0.1
             }'
             builtin: true
         }
@@ -567,7 +581,9 @@ QtObject {
                 "screenCurvature": 0.5,
                 "staticNoise": 0.099,
                 "windowOpacity": 1,
-                "margin": 0.5
+                "margin": 0.5,
+                "blinkingCursor": false,
+                "frameMargin": 0.2
             }'
             builtin: true
         }
@@ -594,7 +610,9 @@ QtObject {
                 "screenCurvature": 0.5,
                 "staticNoise": 0.2969,
                 "windowOpacity": 1,
-                "margin": 0.5
+                "margin": 0.5,
+                "blinkingCursor": false,
+                "frameMargin": 0.5
             }'
             builtin: true
         }
@@ -621,7 +639,9 @@ QtObject {
                 "screenCurvature": 0.4,
                 "staticNoise": 0.0503,
                 "windowOpacity": 1,
-                "margin": 0.5
+                "margin": 0.5,
+                "blinkingCursor": false,
+                "frameMargin": 0.2
             }'
             builtin: true
         }
@@ -648,7 +668,9 @@ QtObject {
                 "screenCurvature": 0.2,
                 "staticNoise": 0,
                 "windowOpacity": 1,
-                "margin": 0.5
+                "margin": 0.5,
+                "blinkingCursor": false,
+                "frameMargin": 0.1
             }'
             builtin: true
         }
@@ -675,7 +697,9 @@ QtObject {
                 "screenCurvature": 0,
                 "staticNoise": 0.0955,
                 "windowOpacity": 0.7,
-                "margin": 0.1
+                "margin": 0.1,
+                "blinkingCursor": false,
+                "frameMargin": 0
             }'
             builtin: true
         }
diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml
index 5cbd22a..9edf981 100644
--- a/app/qml/PreprocessedTerminal.qml
+++ b/app/qml/PreprocessedTerminal.qml
@@ -73,7 +73,7 @@ Item{
         id: kterminal
 
         property int textureResolutionScale: appSettings.lowResolutionFont ? devicePixelRatio : 1
-        property int margin: appSettings.margin / screenScaling
+        property int margin: appSettings.totalMargin / screenScaling
         property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth))
         property int totalHeight: Math.floor(parent.height / screenScaling)
 
@@ -177,8 +177,8 @@ Item{
     }
     property alias contextmenu: menuLoader.item
 
-    MouseArea{
-        property real margin: appSettings.margin
+    MouseArea {
+        property real margin: appSettings.totalMargin
 
         acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
         anchors.fill: parent
@@ -219,8 +219,8 @@ Item{
             var cc = Qt.size(0.5 - x, 0.5 - y);
             var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize;
 
-            return Qt.point((x - cc.width  * (1+distortion) * distortion) * kterminal.totalWidth,
-                           (y - cc.height * (1+distortion) * distortion) * kterminal.totalHeight)
+            return Qt.point((x - cc.width  * (1+distortion) * distortion) * (kterminal.totalWidth),
+                           (y - cc.height * (1+distortion) * distortion) * (kterminal.totalHeight))
         }
     }
     ShaderEffectSource{
diff --git a/app/qml/SettingsGeneralTab.qml b/app/qml/SettingsGeneralTab.qml
index 8ad311b..ed3359e 100644
--- a/app/qml/SettingsGeneralTab.qml
+++ b/app/qml/SettingsGeneralTab.qml
@@ -206,6 +206,13 @@ ColumnLayout {
                 onValueChanged: appSettings._margin = value
                 value: appSettings._margin
             }
+            Label {
+                text: qsTr("Frame size")
+            }
+            SimpleSlider {
+                onValueChanged: appSettings._frameMargin = value
+                value: appSettings._frameMargin
+            }
             Label {
                 text: qsTr("Opacity")
             }
diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml
index 8e17fe6..4164320 100644
--- a/app/qml/ShaderTerminal.qml
+++ b/app/qml/ShaderTerminal.qml
@@ -79,8 +79,8 @@ Item {
          property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
          property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight)
          property real staticNoise: appSettings.staticNoise
-         property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
-                                               (height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
+         property size scaleNoiseSize: Qt.size((width * 0.75) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
+                                               (height * 0.75) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
 
          property size virtualResolution: parent.virtualResolution
 
@@ -88,6 +88,8 @@ Item {
          // We progressively disable rasterization from 4x up to 2x resolution.
          property real rasterizationIntensity: Utils.smoothstep(2.0, 4.0, _screenDensity)
 
+         property real displayTerminalFrame: appSettings._frameMargin > 0 || appSettings.screenCurvature > 0
+
          property real time: timeManager.time
          property ShaderEffectSource noiseSource: noiseShaderSource
 
@@ -190,9 +192,10 @@ Item {
              (((staticNoise !== 0 || jitter !== 0) ||(fallBack && (flickering || horizontalSync))) ? "
                  uniform lowp sampler2D noiseSource;
                  uniform highp vec2 scaleNoiseSize;" : "") +
-             (screenCurvature !== 0 ? "
-                 uniform highp float screenCurvature;
+             (displayTerminalFrame ? "
                  uniform lowp sampler2D frameSource;" : "") +
+             (screenCurvature !== 0 ? "
+                 uniform highp float screenCurvature;" : "") +
              (glowingLine !== 0 ? "
                  uniform highp float glowingLine;" : "") +
              (chromaColor !== 0 ? "
@@ -328,7 +331,7 @@ Item {
                  (ambientLight !== 0 ? "
                      finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
 
-                 (screenCurvature !== 0 ?
+                 (displayTerminalFrame ?
                     "vec4 frameColor = texture2D(frameSource, qt_TexCoord0);
                      finalColor = mix(finalColor, frameColor.rgb, frameColor.a);"
                  : "") +
@@ -351,7 +354,7 @@ Item {
      Loader {
          id: terminalFrameLoader
 
-         active: screenCurvature !== 0
+         active: dynamicShader.displayTerminalFrame
 
          width: staticShader.width
          height: staticShader.height
@@ -363,7 +366,7 @@ Item {
              visible: false
              format: ShaderEffectSource.RGBA
 
-             NewTerminalFrame {
+             TerminalFrame {
                  id: terminalFrame
                  blending: false
                  anchors.fill: parent
@@ -441,18 +444,9 @@ Item {
              (ambientLight !== 0 ? "
                  uniform lowp float ambientLight;" : "") +
 
-             "
-             float min2(vec2 v) {
-                 return min(v.x, v.y);
-             }
-
-             float sum2(vec2 v) {
-                 return v.x + v.y;
-             }
-
-             float rgb2grey(vec3 v){
-                 return dot(v, vec3(0.21, 0.72, 0.04));
-             }" +
+             shaderLibrary.min2 +
+             shaderLibrary.sum2 +
+             shaderLibrary.rgb2grey +
 
              "vec3 convertWithChroma(vec3 inColor) {
                 vec3 outColor = inColor;" +
diff --git a/app/qml/NewTerminalFrame.qml b/app/qml/TerminalFrame.qml
similarity index 58%
rename from app/qml/NewTerminalFrame.qml
rename to app/qml/TerminalFrame.qml
index 8fb2817..3e1baef 100644
--- a/app/qml/NewTerminalFrame.qml
+++ b/app/qml/TerminalFrame.qml
@@ -22,7 +22,7 @@ import QtQuick 2.0
 import "utils.js" as Utils
 
 ShaderEffect {
-    property color _staticFrameColor: "#ffffff"
+    property color _staticFrameColor: "#fff"
     property color _backgroundColor: appSettings.backgroundColor
     property color _fontColor: appSettings.fontColor
     property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2)
@@ -30,9 +30,15 @@ ShaderEffect {
 
     property color frameColor: Utils.mix(_staticFrameColor, _lightColor, _ambientLight)
     property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
-    property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight)
 
-    property size aadelta: Qt.size(1.0 / width, 1.0 / height)
+    // Coefficient of the log curve used to approximate shadowing
+    property real screenShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight)
+    property real frameShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight)
+
+    property size margin: Qt.size(
+        appSettings.frameMargin / width * appSettings.windowScaling,
+        appSettings.frameMargin / height * appSettings.windowScaling
+    )
 
     ShaderLibrary {
         id: shaderLibrary
@@ -44,10 +50,11 @@ ShaderEffect {
         #endif
 
         uniform lowp float screenCurvature;
-        uniform lowp float shadowLength;
+        uniform lowp float screenShadowCoeff;
+        uniform lowp float frameShadowCoeff;
         uniform highp float qt_Opacity;
         uniform lowp vec4 frameColor;
-        uniform mediump vec2 aadelta;
+        uniform mediump vec2 margin;
 
         varying highp vec2 qt_TexCoord0;
 
@@ -65,25 +72,29 @@ ShaderEffect {
 
         "
 
-        void main(){
-            vec2 staticCoords = qt_TexCoord0;
-            vec2 coords = distortCoordinates(staticCoords);
+        vec2 positiveLog(vec2 x) {
+            return clamp(log(x), vec2(0.0), vec2(100.0));
+        }
 
-            vec3 color = vec3(0.0);
+        void main() {
+            vec2 staticCoords = qt_TexCoord0;
+            vec2 coords = distortCoordinates(staticCoords) * (vec2(1.0) + margin * 2.0) - margin;
+
+            vec2 vignetteCoords = staticCoords * (1.0 - staticCoords.yx);
+            float vignette = pow(prod2(vignetteCoords) * 15.0, 0.25);
+
+            vec3 color = frameColor.rgb * vec3(1.0 - vignette);
             float alpha = 0.0;
 
-            float outShadowLength = shadowLength;
-            float inShadowLength = shadowLength * 0.5;
+            float frameShadow = max2(positiveLog(-coords * frameShadowCoeff + vec2(1.0)) + positiveLog(coords * frameShadowCoeff - (vec2(frameShadowCoeff) - vec2(1.0))));
+            frameShadow = max(sqrt(frameShadow), 0.0);
+            color *= frameShadow;
+            alpha = sum2(1.0 - step(vec2(0.0), coords) + step(vec2(1.0), coords));
+            alpha = clamp(alpha, 0.0, 1.0);
+            alpha *= mix(1.0, 0.9, frameShadow);
 
-            float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords));
-            outShadow = clamp(sqrt(outShadow), 0.0, 1.0);
-            color += frameColor.rgb * outShadow;
-            alpha = sum2(1.0 - smoothstep(vec2(0.0), aadelta, coords) + smoothstep(vec2(1.0) - aadelta, vec2(1.0), coords));
-            alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, outShadow);
-
-            float inShadow = 1.0 - prod2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords));
-            inShadow = 0.5 * inShadow * inShadow;
-            alpha = max(alpha, inShadow);
+            float screenShadow = 1.0 - prod2(positiveLog(coords * screenShadowCoeff + vec2(1.0)) * positiveLog(-coords * screenShadowCoeff + vec2(screenShadowCoeff + 1.0)));
+            alpha = max(0.8 * screenShadow, alpha);
 
             gl_FragColor = vec4(color * alpha, alpha);
         }
diff --git a/app/qml/resources.qrc b/app/qml/resources.qrc
index 04b2701..ca16a75 100644
--- a/app/qml/resources.qrc
+++ b/app/qml/resources.qrc
@@ -40,7 +40,7 @@
         fonts/1977-commodore-pet/PetMe.ttf
         BurnInEffect.qml
         fonts/modern-terminus/TerminusTTF-4.46.0.ttf
-        NewTerminalFrame.qml
+        TerminalFrame.qml
         SlowBurnIn.qml
         menus/WindowMenu.qml
         menus/FullContextMenu.qml