diff --git a/containment/package/contents/ui/abilities/Metrics.qml b/containment/package/contents/ui/abilities/Metrics.qml
index 6ff2fda1b..c19e3fd77 100644
--- a/containment/package/contents/ui/abilities/Metrics.qml
+++ b/containment/package/contents/ui/abilities/Metrics.qml
@@ -24,8 +24,10 @@ Ability.MetricsPrivate {
 
     //! Margin
     margin.length: fraction.lengthMargin * iconSize
-    margin.thickness: marginMinThickness + fraction.thicknessMargin * Math.max(0, _iconSize - marginMinThickness)
-    margin.maxThickness: marginMinThickness + fraction.thicknessMargin * Math.max(0, _maxIconSize - marginMinThickness)
+    margin.tailThickness: marginMinThickness + fraction.thicknessMargin * Math.max(0, _iconSize - marginMinThickness)
+    margin.maxTailThickness: marginMinThickness + fraction.thicknessMargin * Math.max(0, _maxIconSize - marginMinThickness)
+    margin.headThickness: margin.tailThickness
+    margin.maxHeadThickness: margin.maxTailThickness
     //margin.thickness: fraction.thicknessMargin * iconSize
    // margin.maxThickness: fraction.thicknessMargin * maxIconSize
     margin.screenEdge: (root.screenEdgeMarginEnabled && root.behaveAsPlasmaPanel)
@@ -34,22 +36,24 @@ Ability.MetricsPrivate {
                            0 : plasmoid.configuration.screenEdgeMargin
 
     //! MarginsAra
-    marginsArea.marginThickness: {
+    marginsArea.headThickness: {
         if (!themeExtended) {
-            return metrics.margin.thickness;
+            return metrics.margin.headThickness;
         }
 
         if (plasmoid.location === PlasmaCore.Types.TopEdge) {
-            return themeExtended.marginsAreaBottom + metrics.margin.thickness;
+            return themeExtended.marginsAreaBottom + metrics.margin.headThickness;
         } else if (plasmoid.location === PlasmaCore.Types.LeftEdge) {
-            return themeExtended.marginsAreaRight + metrics.margin.thickness;
+            return themeExtended.marginsAreaRight + metrics.margin.headThickness;
         } else if (plasmoid.location === PlasmaCore.Types.RightEdge) {
-            return themeExtended.marginsAreaLeft + metrics.margin.thickness;
+            return themeExtended.marginsAreaLeft + metrics.margin.headThickness;
         }
 
-        return themeExtended.marginsAreaTop + metrics.margin.thickness;
+        return themeExtended.marginsAreaTop + metrics.margin.headThickness;
     }
 
+    marginsArea.tailThickness: marginsArea.headThickness
+
     //! Mask
     mask.maxScreenEdge : root.behaveAsDockWithMask ? Math.max(0, plasmoid.configuration.screenEdgeMargin) : 0
       // window geometry is updated after the local screen margin animation was zeroed*/
@@ -57,18 +61,18 @@ Ability.MetricsPrivate {
 
     mask.thickness.hidden: LatteCore.WindowSystem.compositingActive ?  2 : 1
     mask.thickness.normal: mask.screenEdge + Math.max(totals.thickness + extraThicknessForNormal, background.thickness + background.shadows.headThickness)
-    mask.thickness.medium: mask.screenEdge + (1 + (0.65 * (parabolic.factor.maxZoom-1)))*(totals.thickness+extraThicknessForZoomed)
-    mask.thickness.zoomed: mask.screenEdge + ((totals.thickness+extraThicknessForZoomed) * parabolic.factor.maxZoom) + 2
-    mask.thickness.maxNormal: mask.maxScreenEdge + maxIconSize + (margin.maxThickness * 2) + extraThicknessForNormal
-    mask.thickness.maxMedium: mask.maxScreenEdge + Math.max(mask.thickness.maxNormalForItems, extraThicknessForNormal + (1 + (0.65 * (parabolic.factor.maxZoom-1)))*(maxIconSize+margin.maxThickness))
-    mask.thickness.maxZoomed: mask.maxScreenEdge + Math.max( ((maxIconSize+(margin.maxThickness * 2)) * parabolic.factor.maxZoom) + extraThicknessForZoomed,
+    mask.thickness.medium: mask.screenEdge + mediumFactor*(iconSize+extraThicknessForZoomed) + mediumMarginsFactor*totals.thicknessEdges
+    mask.thickness.zoomed: mask.screenEdge + ((iconSize+extraThicknessForZoomed) * parabolic.factor.maxZoom) + maxMarginsFactor*totals.thicknessEdges + 2
+    mask.thickness.maxNormal: mask.maxScreenEdge + maxIconSize + (margin.maxTailThickness + margin.maxHeadThickness) + extraThicknessForNormal
+    mask.thickness.maxMedium: mask.maxScreenEdge + Math.max(mask.thickness.maxNormalForItems, extraThicknessForNormal + (mediumFactor*maxIconSize)+(mediumMarginsFactor*margin.tailThickness))
+    mask.thickness.maxZoomed: mask.maxScreenEdge + Math.max( ((maxIconSize*parabolic.factor.maxZoom) + ((margin.maxTailThickness + margin.maxHeadThickness)*maxMarginsFactor)) + extraThicknessForZoomed,
                                                                     background.thickness + background.shadows.headThickness)
 
     mask.thickness.normalForItems: margin.screenEdge + totals.thickness
-    mask.thickness.zoomedForItems: margin.screenEdge + (parabolic.factor.zoom * totals.thickness)
+    mask.thickness.zoomedForItems: margin.screenEdge + (parabolic.factor.zoom * iconSize) + (parabolic.factor.marginThicknessZoom * totals.thicknessEdges)
 
-    mask.thickness.maxNormalForItemsWithoutScreenEdge: maxIconSize + (margin.maxThickness * 2)
-    mask.thickness.maxZoomedForItemsWithoutScreenEdge: (maxIconSize + (margin.maxThickness * 2)) * parabolic.factor.maxZoom
+    mask.thickness.maxNormalForItemsWithoutScreenEdge: maxIconSize + margin.maxTailThickness + margin.maxHeadThickness
+    mask.thickness.maxZoomedForItemsWithoutScreenEdge: maxIconSize*parabolic.factor.maxZoom + (margin.maxTailThickness + margin.maxHeadThickness)*maxMarginsFactor
 
     mask.thickness.maxNormalForItems: mask.maxScreenEdge + mask.thickness.maxNormalForItemsWithoutScreenEdge
     mask.thickness.maxZoomedForItems: mask.maxScreenEdge + mask.thickness.maxZoomedForItemsWithoutScreenEdge
diff --git a/containment/package/contents/ui/abilities/ParabolicEffect.qml b/containment/package/contents/ui/abilities/ParabolicEffect.qml
index 0a1d04388..01821eef6 100644
--- a/containment/package/contents/ui/abilities/ParabolicEffect.qml
+++ b/containment/package/contents/ui/abilities/ParabolicEffect.qml
@@ -24,6 +24,7 @@ Ability.ParabolicEffectPrivate {
         return (maxSize/metrics.iconSize);
     }
     factor.maxZoom: Math.max(factor.zoom, animations.requirements.zoomFactor)
+    factor.marginThicknessZoomInPercentage: 1.0 //100%
     restoreZoomIsBlocked: restoreZoomIsBlockedFromApplet || (view && view.contextMenuIsShown)
     spread: settings ? settings.parabolicSpread : 3
 
diff --git a/containment/package/contents/ui/abilities/privates/MetricsPrivate.qml b/containment/package/contents/ui/abilities/privates/MetricsPrivate.qml
index f7fc62a28..6d490bfee 100644
--- a/containment/package/contents/ui/abilities/privates/MetricsPrivate.qml
+++ b/containment/package/contents/ui/abilities/privates/MetricsPrivate.qml
@@ -74,8 +74,8 @@ AbilityHost.Metrics {
         shadowMaxNeededMargin = (shadowMaxNeededMargin * shadowOpacity);
 
         //! give some more space when items shadows are enabled and extremely big
-        if (root.myView.itemShadow.isEnabled && metrics.margin.maxThickness < shadowMaxNeededMargin) {
-            return shadowMaxNeededMargin - metrics.margin.maxThickness;
+        if (root.myView.itemShadow.isEnabled && metrics.margin.maxHeadThickness < shadowMaxNeededMargin) {
+            return shadowMaxNeededMargin - metrics.margin.maxHeadThickness;
         }
 
         return 0;
@@ -83,6 +83,9 @@ AbilityHost.Metrics {
 
     readonly property int extraThicknessFromIndicators: indicators.info.extraMaskThickness
 
+    readonly property real mediumFactor: (1 + (0.65 * (parabolic.factor.maxZoom-1)))
+    readonly property real mediumMarginsFactor: 1 + ((mediumFactor-1) * parabolic.factor.marginThicknessZoomInPercentage)
+    readonly property real maxMarginsFactor: 1 + ((parabolic.factor.maxZoom-1) * parabolic.factor.marginThicknessZoomInPercentage)
 
     //! BEHAVIORS
     Behavior on iconSize {
@@ -113,7 +116,14 @@ AbilityHost.Metrics {
             }
         }
 
-        Behavior on thickness {
+        Behavior on tailThickness {
+            NumberAnimation {
+                duration: 0.8 * animations.duration.proposed
+                easing.type: Easing.OutCubic
+            }
+        }
+
+        Behavior on headThickness {
             NumberAnimation {
                 duration: 0.8 * animations.duration.proposed
                 easing.type: Easing.OutCubic
diff --git a/containment/package/contents/ui/applet/AppletItem.qml b/containment/package/contents/ui/applet/AppletItem.qml
index d5983c5a4..463c30f4d 100644
--- a/containment/package/contents/ui/applet/AppletItem.qml
+++ b/containment/package/contents/ui/applet/AppletItem.qml
@@ -833,10 +833,12 @@ Item {
                 readonly property int badgeThickness: {
                     if (plasmoid.location === PlasmaCore.Types.BottomEdge
                             || plasmoid.location === PlasmaCore.Types.RightEdge) {
-                        return ((appletItem.metrics.iconSize + appletItem.metrics.margin.thickness) * wrapper.zoomScale) + appletItem.metrics.margin.screenEdge;
+                        var marginthickness = appletItem.metrics.margin.tailThickness * wrapper.zoomMarginScale;
+                        return (appletItem.metrics.iconSize * wrapper.zoomScale) + marginthickness + appletItem.metrics.margin.screenEdge;
                     }
 
-                    return ((appletItem.metrics.iconSize + appletItem.metrics.margin.thickness) * wrapper.zoomScale);
+                    var marginthickness = appletItem.metrics.margin.headThickness * wrapper.zoomMarginScale;
+                    return (appletItem.metrics.iconSize * wrapper.zoomScale) + marginthickness;
                 }
 
                 ShortcutBadge{
diff --git a/containment/package/contents/ui/applet/EventsSink.qml b/containment/package/contents/ui/applet/EventsSink.qml
index 391a8b3d5..2de0d6efd 100644
--- a/containment/package/contents/ui/applet/EventsSink.qml
+++ b/containment/package/contents/ui/applet/EventsSink.qml
@@ -11,8 +11,8 @@ import org.kde.latte.core 0.2 as LatteCore
 Item {
     property Item destination: null
 
-    readonly property int headThickness: destination ? destination.headThicknessMargin : appletItem.metrics.margin.thickness
-    readonly property int tailThickness: destination ? destination.tailThicknessMargin : appletItem.metrics.margin.thickness
+    readonly property int headThickness: destination ? destination.headThicknessMargin : appletItem.metrics.margin.headThickness
+    readonly property int tailThickness: destination ? destination.tailThicknessMargin : appletItem.metrics.margin.tailThickness
     readonly property int thickness: headThickness + tailThickness + (root.isHorizontal ? destination.height : destination.width)
     readonly property int lengthPadding: {
         if ( (root.myView.alignment === LatteCore.Types.Justify && appletItem.firstChildOfStartLayout)
diff --git a/containment/package/contents/ui/applet/ItemWrapper.qml b/containment/package/contents/ui/applet/ItemWrapper.qml
index d3ca0161a..0f89af5ab 100644
--- a/containment/package/contents/ui/applet/ItemWrapper.qml
+++ b/containment/package/contents/ui/applet/ItemWrapper.qml
@@ -140,7 +140,7 @@ Item{
                                      ? 0 : appletItem.lengthAppletFullMargins
 
     property real scaledLength: zoomScaleLength * (layoutLength + marginsLength)
-    property real scaledThickness: zoomScaleThickness * (layoutThickness + marginsThickness)
+    property real scaledThickness: zoomScaleThickness * layoutThickness + (zoomMarginScale*marginsThickness)
 
     property real zoomScaleLength: disableLengthScale ? 1 : zoomScale
     property real zoomScaleThickness: disableThicknessScale ? 1 : zoomScale
@@ -149,6 +149,7 @@ Item{
     property real layoutThickness: 0
 
     property real zoomScale: 1
+    readonly property real zoomMarginScale: 1 + (zoomScale - 1) * parabolic.factor.marginThicknessZoomInPercentage
 
     readonly property alias headThicknessMargin: _wrapperContainer.headThicknessMargin
     readonly property alias tailThicknessMargin: _wrapperContainer.tailThicknessMargin
@@ -458,20 +459,20 @@ Item{
             } else if (appletItem.canFillThickness) {
                 return appliedEdgeMargin;
             } else if (appletItem.inMarginsArea) {
-                return appliedEdgeMargin + (wrapper.zoomScaleThickness * appletItem.metrics.marginsArea.marginThickness);
+                return appliedEdgeMargin + (wrapper.zoomMarginScale * appletItem.metrics.marginsArea.tailThickness);
             }
 
-            return appliedEdgeMargin + (wrapper.zoomScaleThickness * appletItem.metrics.margin.thickness);
+            return appliedEdgeMargin + (wrapper.zoomMarginScale * appletItem.metrics.margin.tailThickness);
         }
 
         readonly property int headThicknessMargin: {
             if (appletItem.canFillThickness || appletItem.canFillScreenEdge) {
                 return 0;
             } else if (appletItem.inMarginsArea) {
-                return (wrapper.zoomScaleThickness * appletItem.metrics.marginsArea.marginThickness);
+                return (wrapper.zoomMarginScale * appletItem.metrics.marginsArea.headThickness);
             }
 
-            return (wrapper.zoomScaleThickness * appletItem.metrics.margin.thickness);
+            return wrapper.zoomMarginScale * appletItem.metrics.margin.headThickness;
         }
 
         readonly property real zoomScaleThickness: wrapper.zoomScaleThickness
diff --git a/containment/package/contents/ui/applet/PaddingsInConfigureApplets.qml b/containment/package/contents/ui/applet/PaddingsInConfigureApplets.qml
index 7d02e3bd4..fd0304109 100644
--- a/containment/package/contents/ui/applet/PaddingsInConfigureApplets.qml
+++ b/containment/package/contents/ui/applet/PaddingsInConfigureApplets.qml
@@ -11,23 +11,37 @@ import org.kde.plasma.core 2.0 as PlasmaCore
 Item {
     id: paddingsVisual
 
-    readonly property int thickness: {
+    readonly property int headThickness: {
         if ((appletItem.canFillThickness && !appletItem.isMarginsAreaSeparator && !communicator.indexerIsSupported)
                 || (appletItem.canFillScreenEdge && !communicator.indexerIsSupported) ) {
             return 1;
         } else if (appletItem.isMarginsAreaSeparator) {
-            return appletItem.metrics.marginsArea.marginThickness + maxMarginAreaSeparatorGap;
+            return appletItem.metrics.marginsArea.headThickness + maxMarginAreaSeparatorGap;
         } else if (appletItem.inMarginsArea) {
-            return appletItem.metrics.marginsArea.marginThickness;
+            return appletItem.metrics.marginsArea.headThickness;
         }
 
-        return appletItem.metrics.margin.thickness;
+        return appletItem.metrics.margin.headThickness;
     }
+
+    readonly property int tailThickness: {
+        if ((appletItem.canFillThickness && !appletItem.isMarginsAreaSeparator && !communicator.indexerIsSupported)
+                || (appletItem.canFillScreenEdge && !communicator.indexerIsSupported) ) {
+            return 1;
+        } else if (appletItem.isMarginsAreaSeparator) {
+            return appletItem.metrics.marginsArea.tailThickness + maxMarginAreaSeparatorGap;
+        } else if (appletItem.inMarginsArea) {
+            return appletItem.metrics.marginsArea.tailThickness;
+        }
+
+        return appletItem.metrics.margin.tailThickness;
+    }
+
     readonly property int length: root.isHorizontal ? wrapper.width : wrapper.height
 
     readonly property int parentThickness: root.isHorizontal ? wrapper.height : wrapper.width
     readonly property int maxMarginAreaSeparatorCenteredRectLength: Math.max(0.6 * paddingsVisual.length, 4)
-    readonly property int marginAreaSeparatorFreeThickness: ((parentThickness - 2*appletItem.metrics.marginsArea.marginThickness - maxMarginAreaSeparatorCenteredRectLength - 10) / 2)
+    readonly property int marginAreaSeparatorFreeThickness: ((parentThickness - appletItem.metrics.marginsArea.headThickness - appletItem.metrics.marginsArea.tailThickness - maxMarginAreaSeparatorCenteredRectLength - 10) / 2)
     readonly property int maxMarginAreaSeparatorGap: Math.max(3, 0.5 * marginAreaSeparatorFreeThickness)
 
     property color color: "blue"
@@ -39,8 +53,8 @@ Item {
         anchors.bottomMargin: plasmoid.location === PlasmaCore.Types.BottomEdge ? appletItem.metrics.margin.screenEdge : 0
         anchors.rightMargin: plasmoid.location === PlasmaCore.Types.RightEdge ? appletItem.metrics.margin.screenEdge : 0
 
-        width: root.isHorizontal ? length : thickness
-        height: root.isHorizontal ? thickness : length
+        width: root.isHorizontal ? length : tailThickness
+        height: root.isHorizontal ? tailThickness : length
 
         color: parent.color
 
@@ -95,11 +109,11 @@ Item {
         anchors.bottomMargin: plasmoid.location === PlasmaCore.Types.BottomEdge ? normalMargin : 0
         anchors.rightMargin: plasmoid.location === PlasmaCore.Types.RightEdge ? normalMargin : 0
 
-        width: root.isHorizontal ? length : thickness
-        height: root.isHorizontal ? thickness : length
+        width: root.isHorizontal ? length : headThickness
+        height: root.isHorizontal ? headThickness : length
         color: parent.color
 
-        readonly property int normalMargin: appletItem.metrics.mask.thickness.normalForItems - thickness
+        readonly property int normalMargin: appletItem.metrics.mask.thickness.normalForItems - headThickness
 
         states:[
             State{
diff --git a/containment/package/contents/ui/applet/TitleTooltipParent.qml b/containment/package/contents/ui/applet/TitleTooltipParent.qml
index c1d0ddd29..383df74df 100644
--- a/containment/package/contents/ui/applet/TitleTooltipParent.qml
+++ b/containment/package/contents/ui/applet/TitleTooltipParent.qml
@@ -20,7 +20,7 @@ Item{
     property int size: 1
     property int thickness: Math.min(Math.max(minimumThickness, preferredThickness), maximumThickness)
     property int minimumThickness: 0
-    readonly property int preferredThickness: (parabolic.factor.zoom * metrics.totals.thickness) + metrics.margin.screenEdge
+    readonly property int preferredThickness: (parabolic.factor.zoom * metrics.iconSize) + (parabolic.factor.marginThicknessZoom * metrics.totals.thicknessEdges) + metrics.margin.screenEdge
     property int maximumThickness: 9999
 
     property Item metrics: null
diff --git a/containment/package/contents/ui/applet/communicator/LatteBridge.qml b/containment/package/contents/ui/applet/communicator/LatteBridge.qml
index db494b8bd..5c99bd1d4 100644
--- a/containment/package/contents/ui/applet/communicator/LatteBridge.qml
+++ b/containment/package/contents/ui/applet/communicator/LatteBridge.qml
@@ -91,7 +91,7 @@ Item{
     //   USE CASE: it can be used from applets that want to be informed what is the thickness padding
     //       currently applied
     // @since: 0.10
-    readonly property int thicknessPadding: appletItem.metrics.margin.thickness
+    readonly property int thicknessPadding: appletItem.metrics.margin.tailThickness
 
     // NAME: lengthMargin
     //   USAGE: read-only
diff --git a/containment/package/contents/ui/background/MultiLayered.qml b/containment/package/contents/ui/background/MultiLayered.qml
index 191b7afaf..ecd340ac6 100644
--- a/containment/package/contents/ui/background/MultiLayered.qml
+++ b/containment/package/contents/ui/background/MultiLayered.qml
@@ -235,7 +235,7 @@ BackgroundProperties{
     property int animationTime: 6*animations.speedFactor.current*animations.duration.small
 
     //! Metrics related
-    readonly property bool isGreaterThanItemThickness: root.useThemePanel && (totals.visualThickness >= (metrics.iconSize + metrics.margin.thickness))
+    readonly property bool isGreaterThanItemThickness: root.useThemePanel && (totals.visualThickness >= (metrics.iconSize + metrics.margin.tailThickness))
 
     //! CustomShadowedRectangle  properties
     readonly property bool customShadowedRectangleIsEnabled: customRadiusIsEnabled || (customDefShadowIsEnabled || customUserShadowIsEnabled)
diff --git a/containment/package/contents/ui/debugger/DebugWindow.qml b/containment/package/contents/ui/debugger/DebugWindow.qml
index 023504a6b..e2100d23e 100644
--- a/containment/package/contents/ui/debugger/DebugWindow.qml
+++ b/containment/package/contents/ui/debugger/DebugWindow.qml
@@ -482,11 +482,19 @@ Window{
             }
 
             Text{
-                text: "Thickness Margin"+space
+                text: "Head Thickness Margin"+space
             }
 
             Text{
-                text: metrics.margin.thickness
+                text: metrics.margin.headThickness
+            }
+
+            Text{
+                text: "Tail Thickness Margin"+space
+            }
+
+            Text{
+                text: metrics.margin.tailThickness
             }
 
             Text{
diff --git a/containment/package/contents/ui/main.qml b/containment/package/contents/ui/main.qml
index 098fb35bd..bc9d59b59 100644
--- a/containment/package/contents/ui/main.qml
+++ b/containment/package/contents/ui/main.qml
@@ -858,7 +858,7 @@ Item {
             width: root.isHorizontal ? parent.length : parent.thickness - metrics.margin.screenEdge
             height: root.isHorizontal ? parent.thickness - metrics.margin.screenEdge : parent.length
 
-            property int thickMargin: metrics.margin.screenEdge //+ metrics.margin.thickness
+            property int thickMargin: metrics.margin.screenEdge
 
             LatteComponents.AddItem{
                 id: dndSpacerAddItem
diff --git a/declarativeimports/abilities/definition/Metrics.qml b/declarativeimports/abilities/definition/Metrics.qml
index 5dbbc61f5..b4055b801 100644
--- a/declarativeimports/abilities/definition/Metrics.qml
+++ b/declarativeimports/abilities/definition/Metrics.qml
@@ -14,14 +14,17 @@ Item {
     property int backgroundThickness: 16
 
     property MetricsTypes.Margin margin: MetricsTypes.Margin{
-        thickness: 4
-        maxThickness: 4
+        tailThickness: 4
+        maxTailThickness: 4
+        headThickness: 4
+        maxHeadThickness: 4
         length: 4
         screenEdge: 0
     }
 
     property MetricsTypes.MarginsArea marginsArea: MetricsTypes.MarginsArea{
-        marginThickness: 8 //margin.thickness + 4
+        tailThickness: 8 //margin.thickness + 4
+        headThickness: 8 //margin.thickness + 4
         //readonly property int iconSize: _metrics.totals.thickness - thicknessEdges
         //readonly property int thicknessEdges: 2*marginThickness
     }
diff --git a/declarativeimports/abilities/definition/ParabolicEffect.qml b/declarativeimports/abilities/definition/ParabolicEffect.qml
index e0ea7c743..584ea8d42 100644
--- a/declarativeimports/abilities/definition/ParabolicEffect.qml
+++ b/declarativeimports/abilities/definition/ParabolicEffect.qml
@@ -19,6 +19,7 @@ Item {
     property ParabolicEffectTypes.Factor factor: ParabolicEffectTypes.Factor{
         zoom: 1.6
         maxZoom: 1.6
+        marginThicknessZoomInPercentage: 1.0
     }
 
     readonly property ParabolicEffectTypes.PrivateProperties _privates: ParabolicEffectTypes.PrivateProperties {
diff --git a/declarativeimports/abilities/definition/metrics/Margin.qml b/declarativeimports/abilities/definition/metrics/Margin.qml
index d7e2c3c67..8534a51bf 100644
--- a/declarativeimports/abilities/definition/metrics/Margin.qml
+++ b/declarativeimports/abilities/definition/metrics/Margin.qml
@@ -6,8 +6,10 @@
 import QtQuick 2.0
 
 Item {
-    property int thickness: 4
-    property int maxThickness: 4
+    property int tailThickness: 4
+    property int maxTailThickness: 4
+    property int headThickness: 4
+    property int maxHeadThickness: 4
     property int length: 4
     property int screenEdge: 0
 }
diff --git a/declarativeimports/abilities/definition/metrics/MarginsArea.qml b/declarativeimports/abilities/definition/metrics/MarginsArea.qml
index 7c8465aa4..550bf5f07 100644
--- a/declarativeimports/abilities/definition/metrics/MarginsArea.qml
+++ b/declarativeimports/abilities/definition/metrics/MarginsArea.qml
@@ -6,7 +6,8 @@
 import QtQuick 2.0
 
 Item {
-    property int marginThickness: 8
+    property int headThickness: 8
+    property int tailThickness: 8
     readonly property int iconSize: _metrics.totals.thickness - thicknessEdges
-    readonly property int thicknessEdges: 2*marginThickness
+    readonly property int thicknessEdges: headThickness + tailThickness
 }
diff --git a/declarativeimports/abilities/definition/metrics/Totals.qml b/declarativeimports/abilities/definition/metrics/Totals.qml
index c8329ba8d..612b16bed 100644
--- a/declarativeimports/abilities/definition/metrics/Totals.qml
+++ b/declarativeimports/abilities/definition/metrics/Totals.qml
@@ -11,5 +11,5 @@ Item {
     readonly property int lengthEdges: 2 * lengthEdge
     readonly property int lengthPaddings: 2 * padding.length
     readonly property int thickness: iconSize + thicknessEdges
-    readonly property int thicknessEdges: 2 * margin.thickness
+    readonly property int thicknessEdges: margin.tailThickness + margin.headThickness
 }
diff --git a/declarativeimports/abilities/definition/paraboliceffect/Factor.qml b/declarativeimports/abilities/definition/paraboliceffect/Factor.qml
index 79a48d538..5611b8f9f 100644
--- a/declarativeimports/abilities/definition/paraboliceffect/Factor.qml
+++ b/declarativeimports/abilities/definition/paraboliceffect/Factor.qml
@@ -8,4 +8,7 @@ import QtQuick 2.7
 Item {
     property real zoom: 1.6
     property real maxZoom: 1.6
+    readonly property real marginThicknessZoom: 1.0 + ((zoom-1.0) * marginThicknessZoomInPercentage)
+
+    property real marginThicknessZoomInPercentage: 1.0 //100&
 }
diff --git a/declarativeimports/abilities/items/BasicItem.qml b/declarativeimports/abilities/items/BasicItem.qml
index acd26cb1d..96cbc9127 100644
--- a/declarativeimports/abilities/items/BasicItem.qml
+++ b/declarativeimports/abilities/items/BasicItem.qml
@@ -123,8 +123,10 @@ Item{
 
     readonly property int itemIndex: index
     readonly property int animationTime: (abilityItem.abilities.animations.active ? abilityItem.abilities.animations.speedFactor.current : 2) * (1.2 * abilityItem.abilities.animations.duration.small)
-    readonly property int iconOffsetX: indicatorBackLayer.level.requested.iconOffsetX
-    readonly property int iconOffsetY: indicatorBackLayer.level.requested.iconOffsetY
+    property int iconAnimatedOffsetX: 0
+    property int iconAnimatedOffsetY: 0
+    readonly property int iconOffsetX: iconAnimatedOffsetX + indicatorBackLayer.level.requested.iconOffsetX
+    readonly property int iconOffsetY: iconAnimatedOffsetY + indicatorBackLayer.level.requested.iconOffsetY
     readonly property int iconTransformOrigin: indicatorBackLayer.level.requested.iconTransformOrigin
     readonly property real iconOpacity: indicatorBackLayer.level.requested.iconOpacity
     readonly property real iconRotation: indicatorBackLayer.level.requested.iconRotation
diff --git a/declarativeimports/abilities/items/basicitem/ParabolicItem.qml b/declarativeimports/abilities/items/basicitem/ParabolicItem.qml
index 1c22541eb..1fb765709 100644
--- a/declarativeimports/abilities/items/basicitem/ParabolicItem.qml
+++ b/declarativeimports/abilities/items/basicitem/ParabolicItem.qml
@@ -38,17 +38,21 @@ Item{
     property real scaleLength: hasZoomPerAxis ? zoomLength : zoom
     property real scaleThickness: hasZoomPerAxis ? zoomThickness : zoom
 
+    readonly property real marginZoom: 1 + ((zoom-1) * abilityItem.abilities.parabolic.factor.marginThicknessZoomInPercentage)
+    readonly property real marginScaleThickness: 1 + ((scaleThickness-1) * abilityItem.abilities.parabolic.factor.marginThicknessZoomInPercentage)
+
     property real cleanScalingLength: abilityItem.abilities.metrics.totals.length * zoom
-    property real cleanScalingThickness: abilityItem.abilities.metrics.totals.thickness * zoom
+    property real cleanScalingThickness: (abilityItem.abilities.metrics.iconSize * zoom) + (abilityItem.abilities.metrics.totals.thicknessEdges * marginZoom)
 
     property real basicScalingLength: hasZoomPerAxis ? abilityItem.abilities.metrics.totals.length * scaleLength : cleanScalingLength
-    property real basicScalingThickness: hasZoomPerAxis ? abilityItem.abilities.metrics.totals.thickness * scaleThickness : cleanScalingThickness
+    property real basicScalingThickness: hasZoomPerAxis ? (abilityItem.abilities.metrics.iconSize * scaleThickness) + (abilityItem.abilities.metrics.totals.thicknessEdges * marginScaleThickness) :
+                                                          cleanScalingThickness
 
     property real regulatorLength: abilityItem.isSeparator ? (abilityItem.isHorizontal ? width : height) : basicScalingLength
     property real regulatorThickness: abilityItem.isSeparator ? (abilityItem.isHorizontal ? height : width) : basicScalingThickness
 
     property real visualScaledLength: (abilityItem.abilities.metrics.iconSize + abilityItem.abilities.metrics.totals.lengthPaddings) * zoom
-    property real visualScaledThickness: abilityItem.abilities.metrics.totals.thickness * zoom
+    property real visualScaledThickness: cleanScalingThickness
     /// end of Scalers///////  
 
     readonly property alias contentItemContainer: _contentItemContainer
@@ -95,7 +99,7 @@ Item{
 
         TitleTooltipParent{
             id: _titleTooltipVisualParent
-            thickness: abilityItem.abilities.parabolic.factor.zoom * abilityItem.abilities.metrics.totals.thickness
+            thickness: abilityItem.abilities.metrics.mask.thickness.zoomedForItems - abilityItem.abilities.metrics.margin.screenEdge
         }
 
         //fix bug #478, when changing form factor sometimes the tasks are not positioned
@@ -138,9 +142,22 @@ Item{
         //! Main contented item
         Item {
             id: _contentItemContainer
-            anchors.centerIn: parent
-            anchors.horizontalCenterOffset: abilityItem.iconOffsetX
-            anchors.verticalCenterOffset: abilityItem.iconOffsetY
+            anchors.bottom: (abilityItem.location === PlasmaCore.Types.BottomEdge) ? parent.bottom : undefined
+            anchors.top: (abilityItem.location === PlasmaCore.Types.TopEdge) ? parent.top : undefined
+            anchors.left: (abilityItem.location === PlasmaCore.Types.LeftEdge) ? parent.left : undefined
+            anchors.right: (abilityItem.location === PlasmaCore.Types.RightEdge) ? parent.right : undefined
+
+            anchors.horizontalCenter: abilityItem.isHorizontal ? parent.horizontalCenter : undefined
+            anchors.verticalCenter: abilityItem.isHorizontal ? undefined : parent.verticalCenter
+
+            anchors.bottomMargin: (abilityItem.location === PlasmaCore.Types.BottomEdge) ? tailMargin + abilityItem.iconOffsetY : 0
+            anchors.topMargin: (abilityItem.location === PlasmaCore.Types.TopEdge) ? tailMargin + abilityItem.iconOffsetY : 0
+            anchors.leftMargin: (abilityItem.location === PlasmaCore.Types.LeftEdge) ? tailMargin + abilityItem.iconOffsetX : 0
+            anchors.rightMargin: (abilityItem.location === PlasmaCore.Types.RightEdge) ? tailMargin + abilityItem.iconOffsetX : 0
+
+            anchors.horizontalCenterOffset: abilityItem.isHorizontal ? abilityItem.iconOffsetX : 0
+            anchors.verticalCenterOffset: abilityItem.isVertical ? abilityItem.iconOffsetY : 0
+
             transformOrigin: abilityItem.iconTransformOrigin
             opacity: abilityItem.iconOpacity
             rotation: abilityItem.iconRotation
@@ -152,12 +169,18 @@ Item{
 
             property int zoomedSize: abilityItem.abilities.parabolic.factor.zoom * abilityItem.abilities.metrics.iconSize
             property real basicScalingLength: abilityItem.abilities.metrics.iconSize * (parabolicItem.hasZoomPerAxis ? parabolicItem.scaleLength : parabolicItem.zoom)
-            property real basicScalingThickness: proposedItemThickness * (parabolicItem.hasZoomPerAxis ? parabolicItem.scaleThickness : parabolicItem.zoom)
+            property real basicScalingThickness: proposedItemThickness * appliedZoom
+
+            readonly property real appliedZoom: (parabolicItem.hasZoomPerAxis ? parabolicItem.scaleThickness : parabolicItem.zoom)
+            readonly property real marginAppliedZoom: 1 + ((appliedZoom-1) * abilityItem.abilities.parabolic.factor.marginThicknessZoomInPercentage)
 
             readonly property int proposedItemThickness: abilityItem.abilities.indexer.inMarginsArea ?
                                                              Math.max(16, abilityItem.abilities.metrics.marginsArea.iconSize) :
                                                              abilityItem.abilities.metrics.iconSize
 
+            readonly property int itemNormalTailMargin: abilityItem.abilities.indexer.inMarginsArea ? abilityItem.abilities.metrics.marginsArea.tailThickness : abilityItem.abilities.metrics.margin.tailThickness
+            readonly property real tailMargin: Math.round(itemNormalTailMargin * marginAppliedZoom)
+
             property real newTempSize: {
                 if (parabolicItem.opacity === 1 ) {
                     return Math.min(basicScalingLength, basicScalingThickness);
@@ -203,6 +226,18 @@ Item{
             width: abilityItem.abilities.metrics.iconSize * (parabolicItem.hasZoomPerAxis ? parabolicItem.scaleThickness : parabolicItem.zoom)
             height: width
         }
+
+        Loader{
+            anchors.fill: _contentItemContainer
+            active: abilityItem.abilities.debug.graphicsEnabled
+
+            sourceComponent: Rectangle{
+                anchors.fill: parent
+                color: "transparent"
+                border.color:  "yellow"
+                border.width: 1
+            }
+        }
     }
 
     function sendEndOfNeedBothAxisAnimation(){
diff --git a/declarativeimports/abilities/items/basicitem/SeparatorItem.qml b/declarativeimports/abilities/items/basicitem/SeparatorItem.qml
index 7286d0895..1cf0d03e0 100644
--- a/declarativeimports/abilities/items/basicitem/SeparatorItem.qml
+++ b/declarativeimports/abilities/items/basicitem/SeparatorItem.qml
@@ -34,7 +34,7 @@ Loader {
 
     opacity: 0.4
 
-    readonly property int margin: abilityItem.abilities.metrics.margin.screenEdge + abilityItem.abilities.metrics.margin.thickness
+    readonly property int margin: abilityItem.abilities.metrics.margin.screenEdge + abilityItem.abilities.metrics.margin.tailThickness
 
     active: abilityItem.isSeparatorVisible
 
diff --git a/plasmoid/package/contents/ui/main.qml b/plasmoid/package/contents/ui/main.qml
index b7e7d812d..a8f6faa70 100644
--- a/plasmoid/package/contents/ui/main.qml
+++ b/plasmoid/package/contents/ui/main.qml
@@ -716,10 +716,11 @@ Item {
         launchers.isStealingDroppedLaunchers: plasmoid.configuration.isPreferredForDroppedLaunchers
         launchers.syncer.isBlocked: inDraggingPhase
 
-        metrics.local.iconSize: inPlasmaDesktop ? maxIconSizeInPlasma : (inPlasmaPanel ? Math.max(16, panelThickness - 2*metrics.margin.thickness) : maxIconSizeInPlasma)
+        metrics.local.iconSize: inPlasmaDesktop ? maxIconSizeInPlasma : (inPlasmaPanel ? Math.max(16, panelThickness - metrics.margin.tailThickness - metrics.margin.headThickness) : maxIconSizeInPlasma)
         metrics.local.backgroundThickness: metrics.totals.thickness
         metrics.local.margin.length: 0.1 * metrics.iconSize
-        metrics.local.margin.thickness: inPlasmaDesktop ? 0.16 * metrics.iconSize : Math.max(2, (panelThickness - maxIconSizeInPlasma) / 2)
+        metrics.local.margin.tailThickness: inPlasmaDesktop ? 0.16 * metrics.iconSize : Math.max(2, (panelThickness - maxIconSizeInPlasma) / 2)
+        metrics.local.margin.headThickness: metrics.local.margin.tailThickness
         metrics.local.padding.length: 0.04 * metrics.iconSize
 
         myView.local.isHidingBlocked: root.contextMenu || root.windowPreviewIsShown
diff --git a/plasmoid/package/contents/ui/task/animations/LauncherAnimation.qml b/plasmoid/package/contents/ui/task/animations/LauncherAnimation.qml
index b609762e8..26f9cb9e7 100644
--- a/plasmoid/package/contents/ui/task/animations/LauncherAnimation.qml
+++ b/plasmoid/package/contents/ui/task/animations/LauncherAnimation.qml
@@ -83,9 +83,6 @@ Item{
                 }
             }
         }
-
-        taskItem.parabolicItem.zoomLength = taskItem.parabolicItem.zoom;
-        taskItem.parabolicItem.zoomThickness = taskItem.parabolicItem.zoom;
     }
 
     function startLauncherAnimation(){
diff --git a/plasmoid/package/contents/ui/task/animations/NewWindowAnimation.qml b/plasmoid/package/contents/ui/task/animations/NewWindowAnimation.qml
index 0fdefd604..d98cdc558 100644
--- a/plasmoid/package/contents/ui/task/animations/NewWindowAnimation.qml
+++ b/plasmoid/package/contents/ui/task/animations/NewWindowAnimation.qml
@@ -50,10 +50,6 @@ Item{
 
     function clear(){
         newWindowAnimationLoader.item.stop();
-
-        taskItem.parabolicItem.zoomLength = 1.0;
-        taskItem.parabolicItem.zoomThickness = 1.0;
-
         taskItem.setBlockingAnimation(false);
         taskItem.inAttentionBuiltinAnimation = false;
         taskItem.inNewWindowBuiltinAnimation = false;
@@ -80,12 +76,7 @@ Item{
     function init(){
         taskItem.setBlockingAnimation(true);
         taskItem.inNewWindowBuiltinAnimation = true;
-
-        taskItem.parabolicItem.zoomLength = taskItem.parabolicItem.zoom;
-        taskItem.parabolicItem.zoomThickness = taskItem.parabolicItem.zoom;
-
         taskItem.inAttentionBuiltinAnimation = isDemandingAttention;
-
         taskItem.abilities.animations.needThickness.addEvent(needThicknessEvent);
     }
 
diff --git a/plasmoid/package/contents/ui/task/animations/RealRemovalAnimation.qml b/plasmoid/package/contents/ui/task/animations/RealRemovalAnimation.qml
index a5366bdee..3d3d68de0 100644
--- a/plasmoid/package/contents/ui/task/animations/RealRemovalAnimation.qml
+++ b/plasmoid/package/contents/ui/task/animations/RealRemovalAnimation.qml
@@ -158,9 +158,9 @@ SequentialAnimation {
         }
 
         PropertyAnimation {
-            target: taskItem.parabolicItem
-            property: "zoomThickness"
-            to: 0
+            target: taskItem
+            property: taskItem.isVertical ? "iconAnimatedOffsetX" : "iconAnimatedOffsetY"
+            to: -0.7*taskItem.abilities.metrics.iconSize
             duration: taskRealRemovalAnimation.enabledAnimation ? 1.35*showWindowAnimation.speed : 0
             easing.type: Easing.InQuad
         }
diff --git a/plasmoid/package/contents/ui/task/animations/ShowWindowAnimation.qml b/plasmoid/package/contents/ui/task/animations/ShowWindowAnimation.qml
index f44453760..25b210127 100644
--- a/plasmoid/package/contents/ui/task/animations/ShowWindowAnimation.qml
+++ b/plasmoid/package/contents/ui/task/animations/ShowWindowAnimation.qml
@@ -65,6 +65,15 @@ SequentialAnimation{
             duration: showWindowAnimation.speed
             easing.type: Easing.OutQuad
         }
+
+        PropertyAnimation {
+            target: taskItem
+            property: taskItem.isVertical ? "iconAnimatedOffsetX" : "iconAnimatedOffsetY"
+            from: -taskItem.abilities.metrics.iconSize
+            to: 0
+            duration: showWindowAnimation.speed
+            easing.type: Easing.OutQuad
+        }
     }
 
     onStopped: {
diff --git a/plasmoid/package/contents/ui/task/animations/launcher/BounceAnimation.qml b/plasmoid/package/contents/ui/task/animations/launcher/BounceAnimation.qml
index 5f76c6f87..06c41be12 100644
--- a/plasmoid/package/contents/ui/task/animations/launcher/BounceAnimation.qml
+++ b/plasmoid/package/contents/ui/task/animations/launcher/BounceAnimation.qml
@@ -8,6 +8,8 @@ import QtQuick 2.0
 import org.kde.plasma.plasmoid 2.0
 
 SequentialAnimation{
+    readonly property string bouncePropertyName: taskItem.isVertical ? "iconAnimatedOffsetX" : "iconAnimatedOffsetY"
+
     //Ghost animation that acts as a delayer
     PropertyAnimation {
         target: taskItem.parabolicItem
@@ -18,47 +20,29 @@ SequentialAnimation{
     }
     //end of ghost animation
 
-    ParallelAnimation{
+    ParallelAnimation {
         PropertyAnimation {
             target: taskItem.parabolicItem
-            property: "zoomThickness"
-            to: taskItem.containsMouse ? 1+2*(taskItem.abilities.parabolic.factor.maxZoom-1) : 1 + (1.5 * (taskItem.abilities.parabolic.factor.maxZoom-1))
+            property: "zoom"
+            to: 1
             duration: launcherAnimation.speed
             easing.type: Easing.OutQuad
         }
 
         PropertyAnimation {
-            target: taskItem.parabolicItem
-            property: "zoomLength"
-            to: 1
+            target: taskItem
+            property: bouncePropertyName
+            to: taskItem.abilities.metrics.iconSize
             duration: launcherAnimation.speed
             easing.type: Easing.OutQuad
         }
     }
 
     PropertyAnimation {
-        target: taskItem.parabolicItem
-        property: "zoomThickness"
-        to: 1
+        target: taskItem
+        property: bouncePropertyName
+        to: 0
         duration: 4*launcherAnimation.speed
         easing.type: Easing.OutBounce
     }
-
-    ParallelAnimation{
-        PropertyAnimation {
-            target: taskItem.parabolicItem
-            property: "zoomLength"
-            to: 1
-            duration: 0.5 * taskItem.abilities.animations.speedFactor.current*launcherAnimation.speed
-            easing.type: Easing.OutBounce
-        }
-
-        PropertyAnimation {
-            target: taskItem.parabolicItem
-            property: "zoom"
-            to: 1
-            duration:  0.5 * taskItem.abilities.animations.speedFactor.current*launcherAnimation.speed
-            easing.type: Easing.OutQuad
-        }
-    }
 }
diff --git a/plasmoid/package/contents/ui/task/animations/newwindow/BounceAnimation.qml b/plasmoid/package/contents/ui/task/animations/newwindow/BounceAnimation.qml
index e53f440e2..69503eb4c 100644
--- a/plasmoid/package/contents/ui/task/animations/newwindow/BounceAnimation.qml
+++ b/plasmoid/package/contents/ui/task/animations/newwindow/BounceAnimation.qml
@@ -11,6 +11,8 @@ SequentialAnimation{
     alwaysRunToEnd: true
     loops: newWindowAnimation.isDemandingAttention ? 20 : 1
 
+    readonly property string bouncePropertyName: taskItem.isVertical ? "iconAnimatedOffsetX" : "iconAnimatedOffsetY"
+
     Component.onCompleted: {
         if (newWindowAnimation.inDelayedStartup) {
             newWindowAnimation.inDelayedStartup = false;
@@ -19,30 +21,20 @@ SequentialAnimation{
         }
     }
 
-    ParallelAnimation{
-        PropertyAnimation {
-            target: taskItem.parabolicItem
-            property: "zoomThickness"
-            to: 1 + (thickPercentage * 2 * (taskItem.abilities.animations.requirements.zoomFactor-1))
-            duration: newWindowAnimation.speed
-            easing.type: Easing.OutQuad
-
-            property real thickPercentage: taskItem.inAttentionBuiltinAnimation ? 0.8 : 0.6
-        }
-
+    ParallelAnimation {
         PropertyAnimation {
-            target: taskItem.parabolicItem
-            property: "zoomLength"
-            to: 1
+            target: taskItem
+            property: bouncePropertyName
+            to: 0.6 * taskItem.abilities.metrics.iconSize
             duration: newWindowAnimation.speed
             easing.type: Easing.OutQuad
         }
     }
 
     PropertyAnimation {
-        target: taskItem.parabolicItem
-        property: "zoomThickness"
-        to: 1
+        target: taskItem
+        property: bouncePropertyName
+        to: 0
         duration: 4.4*newWindowAnimation.speed
         easing.type: Easing.OutBounce
     }