diff --git a/player/js/utils/shapes/ZigZagModifier.js b/player/js/utils/shapes/ZigZagModifier.js
index 45047cc..6afbb93 100644
--- a/player/js/utils/shapes/ZigZagModifier.js
+++ b/player/js/utils/shapes/ZigZagModifier.js
@@ -17,42 +17,79 @@
   this._isAnimated = this.amplitude.effectsSequence.length !== 0 && this.frequency.effectsSequence.length !== 0;
 };
 
-ZigZagModifier.prototype.processPath = function (path, amplitude, frequency) {
-  var pathLength = path._length;
-  var clonedPath = shapePool.newElement();
-  clonedPath.c = path.c;
-  var vX;
-  var vY;
-  var direction = -1;
+function angleMean(a, b) {
+  if (Math.abs(a - b) > Math.PI) return (a + b) / 2 + Math.PI;
 
-  if (!path.c) {
-    pathLength -= 1;
+  return (a + b) / 2;
+}
+
+function zigZagCorner(outputBezier, segmentBefore, segmentAfter, amplitude, direction) {
+  var point;
+  var angle;
+
+  if (!segmentBefore) {
+    point = segmentAfter.points[0];
+    angle = segmentAfter.normalAngle(0);
+  } else if (!segmentAfter) {
+    point = segmentBefore.points[3];
+    angle = segmentBefore.normalAngle(1);
+  } else {
+    point = segmentAfter.points[0];
+    angle = angleMean(segmentAfter.normalAngle(0), segmentBefore.normalAngle(1));
   }
 
-  for (var cur = 0; cur < pathLength; cur += 1) {
-    var bez = PolynomialBezier.shapeSegment(path, cur);
+  var px = point[0] + Math.cos(angle) * direction * amplitude;
+  var py = point[1] - Math.sin(angle) * direction * amplitude;
+  outputBezier.setTripleAt(px, py, px, py, px, py, outputBezier.length());
+}
 
-    vX = bez.points[0][0];
-    vY = bez.points[0][1];
-    clonedPath.setTripleAt(vX, vY, vX, vY, vX, vY, clonedPath.length());
+function zigZagSegment(outputBezier, segment, amplitude, frequency, direction) {
+  for (var i = 0; i < frequency; i += 1) {
+    var t = (i + 1) / (frequency + 1);
+    var angle = segment.normalAngle(t);
+    var point = segment.point(t);
+    var px = point[0] + Math.cos(angle) * direction * amplitude;
+    var py = point[1] - Math.sin(angle) * direction * amplitude;
+
+    outputBezier.setTripleAt(px, py, px, py, px, py, outputBezier.length());
 
     direction = -direction;
+  }
 
-    for (var i = 0; i < frequency; i += 1) {
-      var t = (i + 1) / (frequency + 1);
-      var pt = bez.point(t);
-      var normal = bez.normalAngle(t);
-      vX = pt[0] + Math.cos(normal) * direction * amplitude;
-      vY = pt[1] - Math.sin(normal) * direction * amplitude;
+  return direction;
+}
 
-      clonedPath.setTripleAt(vX, vY, vX, vY, vX, vY, clonedPath.length());
-      direction = -direction;
+ZigZagModifier.prototype.processPath = function (path, amplitude, frequency) {
+  var count = path._length;
+  var clonedPath = shapePool.newElement();
+  clonedPath.c = path.c;
+
+  if (!path.c) {
+    count -= 1;
+  }
+
+  if (count === 0) return clonedPath;
+
+  var direction = -1;
+  var segment = path.c ? PolynomialBezier.shapeSegment(path, count - 1) : null;
+  var nextSegment = PolynomialBezier.shapeSegment(path, 0);
+
+  zigZagCorner(clonedPath, segment, nextSegment, amplitude, -1);
+
+  for (var i = 0; i < count; i += 1) {
+    segment = nextSegment;
+
+    direction = zigZagSegment(clonedPath, segment, amplitude, frequency, -direction);
+
+    if (i === count - 1 && !path.c) {
+      nextSegment = null;
+    } else {
+      nextSegment = PolynomialBezier.shapeSegment(path, (i + 1) % count);
     }
 
-    vX = bez.points[3][0];
-    vY = bez.points[3][1];
-    clonedPath.setTripleAt(vX, vY, vX, vY, vX, vY, clonedPath.length());
+    zigZagCorner(clonedPath, segment, nextSegment, amplitude, direction);
   }
+
   return clonedPath;
 };
 
