diff --git a/extension/jsx/utils/shapeHelper.jsx b/extension/jsx/utils/shapeHelper.jsx
index b0fa5ef..1f7ae19 100644
--- a/extension/jsx/utils/shapeHelper.jsx
+++ b/extension/jsx/utils/shapeHelper.jsx
@@ -467,7 +467,7 @@
         /*if (!isText) {
             getShapeBounds(layerOb);
         }*/
-        getShapeBounds(layerOb);
+        //getShapeBounds(layerOb);
     }
     
     ob.exportShape = exportShape;
diff --git a/player/index.html b/player/index.html
index 5e1d421..e3cd954 100644
--- a/player/index.html
+++ b/player/index.html
@@ -12,8 +12,8 @@
 
         #bodymovin{
             background-color:#333;
-            width:1000px;
-            height:700px;
+            width:1200px;
+            height:900px;
             /*width:800px;
             height:500px;*/
             display:block;
@@ -97,6 +97,7 @@
     <script src="js/utils/expressions/ShapeInterface.js"></script>
     <script src="js/utils/expressions/LayerInterface.js"></script>
     <script src="js/utils/expressions/CompInterface.js"></script>
+    <script src="js/utils/expressions/TransformInterface.js"></script>
     <script src="js/utils/expressions/ProjectInterface.js"></script>
     <script src="js/effects/SliderEffect.js"></script>
     <script src="js/effects.js"></script>
@@ -114,10 +115,13 @@
     var anim;
     var animData = {
         container: document.getElementById('bodymovin'),
-        renderer: 'canvas',
-        loop: false,
+        renderer: 'svg',
+        loop: true,
         autoplay: true,
         autoloadSegments: true,
+        rendererSettings: {
+            progressiveLoad:true
+        },
         //animationData: anim2
         path: 'exports/render/data.json'
     };
diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js
index 3ddb752..efc9372 100644
--- a/player/js/animation/AnimationItem.js
+++ b/player/js/animation/AnimationItem.js
@@ -216,6 +216,8 @@
 };
 
 AnimationItem.prototype.configAnimation = function (animData) {
+    //animData.w = Math.round(animData.w/blitter);
+    //animData.h = Math.round(animData.h/blitter);
     this.animationData = animData;
     this.totalFrames = Math.floor(this.animationData.op - this.animationData.ip);
     this.animationData.tf = this.totalFrames;
diff --git a/player/js/elements/BaseElement.js b/player/js/elements/BaseElement.js
index 1b5cc4e..c54a563 100644
--- a/player/js/elements/BaseElement.js
+++ b/player/js/elements/BaseElement.js
@@ -64,9 +64,34 @@
     return this.isVisible;
 };
 
+BaseElement.prototype.globalToLocal = function(pt){
+    var transforms = [];
+    transforms.push(this.finalTransform);
+    var flag = true;
+    var comp = this.comp;
+    while(flag){
+        if(comp.finalTransform){
+            if(comp.data.hasMask){
+                transforms.splice(0,0,comp.finalTransform);
+            }
+            comp = comp.comp;
+        } else {
+            flag = false;
+        }
+    }
+    var i, len = transforms.length,ptNew;
+    for(i=0;i<len;i+=1){
+        ptNew = transforms[i].mat.applyToPointArray(0,0,0);
+        //ptNew = transforms[i].mat.applyToPointArray(pt[0],pt[1],pt[2]);
+        pt = [pt[0] - ptNew[0],pt[1] - ptNew[1],0];
+    }
+    return pt;
+};
+
 BaseElement.prototype.initExpressions = function(){
     this.layerInterface = LayerExpressionInterface(this);
     //layers[i].layerInterface = LayerExpressionInterface(layers[i]);
+    //layers[i].layerInterface = LayerExpressionInterface(layers[i]);
     if(this.data.hasMask){
         this.layerInterface.registerMaskInterface(this.maskManager);
     }
diff --git a/player/js/elements/ShapeElement.js b/player/js/elements/ShapeElement.js
index ed55b49..42f3510 100644
--- a/player/js/elements/ShapeElement.js
+++ b/player/js/elements/ShapeElement.js
@@ -219,7 +219,7 @@
                     });
                 }
             }
-        }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd'){
+        }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd' || arr[i].ty == 'ms'){
             var modifier = ShapeModifiers.getModifier(arr[i].ty);
             modifier.init(this,arr[i],dynamicProperties);
             this.shapeModifiers.push(modifier);
@@ -267,6 +267,7 @@
         this.hide();
         return;
     }
+    this.globalToLocal([0,0,0]);
 
     this.hidden = false;
     this.renderModifiers();
diff --git a/player/js/elements/svgElements/SVGBaseElement.js b/player/js/elements/svgElements/SVGBaseElement.js
index c14e55f..93702a0 100644
--- a/player/js/elements/svgElements/SVGBaseElement.js
+++ b/player/js/elements/svgElements/SVGBaseElement.js
@@ -55,8 +55,8 @@
             feCTr.appendChild(feFunc);
             this.globalData.defs.appendChild(fil);
             var alphaRect = document.createElementNS(svgNS,'rect');
-            alphaRect.setAttribute('width','100%');
-            alphaRect.setAttribute('height','100%');
+            alphaRect.setAttribute('width',this.comp.data.w);
+            alphaRect.setAttribute('height',this.comp.data.h);
             alphaRect.setAttribute('x','0');
             alphaRect.setAttribute('y','0');
             alphaRect.setAttribute('fill','#ffffff');
diff --git a/player/js/mask.js b/player/js/mask.js
index 9c1ef25..1fd8264 100644
--- a/player/js/mask.js
+++ b/player/js/mask.js
@@ -31,11 +31,11 @@
         if((properties[i].mode == 's' || properties[i].mode == 'i') && count == 0){
             rect = document.createElementNS(svgNS, 'rect');
             rect.setAttribute('fill', '#ffffff');
-            rect.setAttribute('x', '0');
-            rect.setAttribute('y', '0');
-            rect.setAttribute('width', '100%');
-            rect.setAttribute('height', '100%');
+            rect.setAttribute('width', this.element.comp.data.w);
+            rect.setAttribute('height', this.element.comp.data.h);
             currentMasks.push(rect);
+        } else {
+            rect = null;
         }
 
         if(properties[i].mode == 'n' || properties[i].cl === false) {
@@ -123,6 +123,9 @@
             lastPath: '',
             prop:ShapePropertyFactory.getShapeProp(this.element,properties[i],3,this.dynamicProperties,null)
         };
+        if(rect){
+            this.viewData[i].invRect = rect;
+        }
         if(!this.viewData[i].prop.k){
             this.drawPath(properties[i],this.viewData[i].prop.v,this.viewData[i]);
         }
@@ -162,6 +165,10 @@
             if(this.viewData[i].prop.mdf || this.firstFrame){
                 this.drawPath(this.masksProperties[i],this.viewData[i].prop.v,this.viewData[i]);
             }
+            if(this.viewData[i].invRect && (this.element.finalTransform.mProp.mdf || this.firstFrame)){
+                this.viewData[i].invRect.setAttribute('x', -this.element.finalTransform.mProp.v.props[12]);
+                this.viewData[i].invRect.setAttribute('y', -this.element.finalTransform.mProp.v.props[13]);
+            }
             if(this.storedData[i].x && (this.storedData[i].x.mdf || this.firstFrame)){
                 var feMorph = this.storedData[i].expan;
                 if(this.storedData[i].x.v < 0){
diff --git a/player/js/renderers/SVGRenderer.js b/player/js/renderers/SVGRenderer.js
index 01df78f..717e265 100644
--- a/player/js/renderers/SVGRenderer.js
+++ b/player/js/renderers/SVGRenderer.js
@@ -131,6 +131,7 @@
     }else{
         this.renderedFrame = num;
     }
+    //clearPoints();
     /*console.log('-------');
     console.log('FRAME ',num);*/
     this.globalData.frameNum = num;
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index 8503b33..4cfcef0 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -61,6 +61,7 @@
     function completeShapes(arr){
         var i, len = arr.length;
         var j, jLen;
+        var hasPaths = false;
         for(i=len-1;i>=0;i-=1){
             if(arr[i].ty == 'sh'){
                 if(arr[i].ks.k.i){
@@ -76,10 +77,23 @@
                         }
                     }
                 }
+                hasPaths = true;
             }else if(arr[i].ty == 'gr'){
                 completeShapes(arr[i].it);
             }
         }
+        if(hasPaths){
+            //mx: distance
+            //ss: sensitivity
+            //dc: decay
+            /*arr.push({
+                "ty": "ms",
+                "mx":20,
+                "ss":10,
+                 "dc":0.001,
+                "maxDist":200
+            });*/
+        }
     }
 
     function convertPathsToAbsoluteValues(path){
@@ -172,9 +186,161 @@
         }
     }());
 
+    /*function blitPaths(path){
+        var i, len = path.i.length;
+        for(i=0;i<len;i+=1){
+            path.i[i][0] /= blitter;
+            path.i[i][1] /= blitter;
+            path.o[i][0] /= blitter;
+            path.o[i][1] /= blitter;
+            path.v[i][0] /= blitter;
+            path.v[i][1] /= blitter;
+        }
+    }
+
+    function blitShapes(arr){
+        var i, len = arr.length;
+        var j, jLen;
+        var hasPaths = false;
+        for(i=len-1;i>=0;i-=1){
+            if(arr[i].ty == 'sh'){
+                if(arr[i].ks.k.i){
+                    blitPaths(arr[i].ks.k);
+                }else{
+                    jLen = arr[i].ks.k.length;
+                    for(j=0;j<jLen;j+=1){
+                        if(arr[i].ks.k[j].s){
+                            blitPaths(arr[i].ks.k[j].s[0]);
+                        }
+                        if(arr[i].ks.k[j].e){
+                            blitPaths(arr[i].ks.k[j].e[0]);
+                        }
+                    }
+                }
+                hasPaths = true;
+            }else if(arr[i].ty == 'gr'){
+                blitShapes(arr[i].it);
+            }else if(arr[i].ty == 'rc'){
+                blitProperty(arr[i].p);
+                blitProperty(arr[i].s);
+            }else if(arr[i].ty == 'st'){
+                blitProperty(arr[i].w);
+            }else if(arr[i].ty == 'tr'){
+                blitProperty(arr[i].p);
+                blitProperty(arr[i].sk);
+                blitProperty(arr[i].a);
+            }else if(arr[i].ty == 'el'){
+                blitProperty(arr[i].p);
+                blitProperty(arr[i].s);
+            }else if(arr[i].ty == 'rd'){
+                blitProperty(arr[i].r);
+            }else{
+
+                //console.log(arr[i].ty );
+            }
+        }
+    }
+
+    function blitText(data, fontManager){
+
+    }
+
+    function blitValue(val){
+        if(typeof(val) === 'number'){
+            val /= blitter;
+        } else {
+            var i = val.length-1;
+            while(i>=0){
+                val[i] /= blitter;
+                i-=1;
+            }
+        }
+        return val;
+    }
+
+    function blitProperty(data){
+        if(!data.k.length){
+            data.k = blitValue(data.k);
+        }else if(typeof(data.k[0]) === 'number'){
+            data.k = blitValue(data.k);
+        } else {
+            var i, len = data.k.length;
+            for(i=0;i<len;i+=1){
+                if(data.k[i].s){
+                    //console.log('pre S: ', data.k[i].s);
+                    data.k[i].s = blitValue(data.k[i].s);
+                    //console.log('post S: ', data.k[i].s);
+                }
+                if(data.k[i].e){
+                    //console.log('pre E: ', data.k[i].e);
+                    data.k[i].e = blitValue(data.k[i].e);
+                    //console.log('post E: ', data.k[i].e);
+                }
+            }
+        }
+    }
+
+    function blitLayers(layers,comps, fontManager){
+        var layerData;
+        var animArray, lastFrame;
+        var i, len = layers.length;
+        var j, jLen, k, kLen;
+        for(i=0;i<len;i+=1){
+            layerData = layers[i];
+            if(!('ks' in layerData)){
+                continue;
+            }
+            blitProperty(layerData.ks.a);
+            blitProperty(layerData.ks.p);
+            layerData.completed = true;
+            if(layerData.tt){
+                layers[i-1].td = layerData.tt;
+            }
+            animArray = [];
+            lastFrame = -1;
+            if(layerData.hasMask){
+                var maskProps = layerData.masksProperties;
+                jLen = maskProps.length;
+                for(j=0;j<jLen;j+=1){
+                    if(maskProps[j].pt.k.i){
+                        blitPaths(maskProps[j].pt.k);
+                    }else{
+                        kLen = maskProps[j].pt.k.length;
+                        for(k=0;k<kLen;k+=1){
+                            if(maskProps[j].pt.k[k].s){
+                                blitPaths(maskProps[j].pt.k[k].s[0]);
+                            }
+                            if(maskProps[j].pt.k[k].e){
+                                blitPaths(maskProps[j].pt.k[k].e[0]);
+                            }
+                        }
+                    }
+                }
+            }
+            if(layerData.ty===0){
+                layerData.w = Math.round(layerData.w/blitter);
+                layerData.h = Math.round(layerData.h/blitter);
+                blitLayers(layerData.layers,comps, fontManager);
+            }else if(layerData.ty === 4){
+                blitShapes(layerData.shapes);
+            }else if(layerData.ty == 5){
+                blitText(layerData, fontManager);
+            }else if(layerData.ty == 1){
+                layerData.sh /= blitter;
+                layerData.sw /= blitter;
+            } else {
+            }
+        }
+    }
+
+    function blitAnimation(animationData,comps, fontManager){
+        blitLayers(animationData.layers,comps, fontManager);
+    }*/
+
     function completeData(animationData, fontManager){
         checkColors(animationData);
         completeLayers(animationData.layers, animationData.assets, fontManager);
+        //blitAnimation(animationData, animationData.assets, fontManager);
     }
 
     function completeText(data, fontManager){
diff --git a/player/js/utils/common.js b/player/js/utils/common.js
index 1b03778..c12c664 100644
--- a/player/js/utils/common.js
+++ b/player/js/utils/common.js
@@ -10,6 +10,7 @@
 var bm_floor = Math.floor;
 var bm_max = Math.max;
 var bm_min = Math.min;
+var blitter = 10;
 
 var BMMath = {};
 (function(){
diff --git a/player/js/utils/expressions/LayerInterface.js b/player/js/utils/expressions/LayerInterface.js
index 783b05c..2f56d7f 100644
--- a/player/js/utils/expressions/LayerInterface.js
+++ b/player/js/utils/expressions/LayerInterface.js
@@ -1,21 +1,23 @@
 var LayerExpressionInterface = (function (){
-   function toWorld(arr){
-       var toWorldMat = new Matrix();
-       toWorldMat.reset();
-       this._elem.finalTransform.mProp.applyToMatrix(toWorldMat);
-       if(this._elem.hierarchy && this._elem.hierarchy.length){
-           var i, len = this._elem.hierarchy.length;
-           for(i=0;i<len;i+=1){
-               this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);
-           }
-           return toWorldMat.applyToPointArray(arr[0],arr[1],arr[2]||0);
-       }
-       return toWorldMat.applyToPointArray(arr[0],arr[1],arr[2]||0);
-   }
+    function toWorld(arr){
+        var toWorldMat = new Matrix();
+        toWorldMat.reset();
+        this._elem.finalTransform.mProp.applyToMatrix(toWorldMat);
+        if(this._elem.hierarchy && this._elem.hierarchy.length){
+            var i, len = this._elem.hierarchy.length;
+            for(i=0;i<len;i+=1){
+                this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);
+            }
+            return toWorldMat.applyToPointArray(arr[0],arr[1],arr[2]||0);
+        }
+        return toWorldMat.applyToPointArray(arr[0],arr[1],arr[2]||0);
+    }
 
 
     return function(elem){
 
+        var transformInterface = TransformExpressionInterface(elem.transform);
+
         function _registerMaskInterface(maskManager){
             _thisLayerFunction.mask = maskManager.getMask.bind(maskManager);
         }
@@ -25,8 +27,9 @@
                 case "ADBE Root Vectors Group":
                 case 2:
                     return _thisLayerFunction.shapeInterface;
-                    //
-                    break;
+                case "Transform":
+                case "transform":
+                    return transformInterface;
                 case 4:
                     return elem.effectsManager;
             }
@@ -46,30 +49,30 @@
         });
         Object.defineProperty(_thisLayerFunction, "rotation", {
             get: function(){
-                return elem.transform.rotation;
+                return transformInterface.rotation;
             }
         });
         Object.defineProperty(_thisLayerFunction, "scale", {
             get: function () {
-                return elem.transform.scale;
+                return transformInterface.scale;
             }
         });
 
         Object.defineProperty(_thisLayerFunction, "position", {
             get: function () {
-                    return elem.transform.position;
-                }
+                return transformInterface.position;
+            }
         });
 
         Object.defineProperty(_thisLayerFunction, "anchorPoint", {
             get: function () {
-                return elem.transform.anchorPoint;
+                return transformInterface.anchorPoint;
             }
         });
 
         Object.defineProperty(_thisLayerFunction, "transform", {
             get: function () {
-                return elem.transform;
+                return transformInterface;
             }
         });
         Object.defineProperty(_thisLayerFunction, "_name", { value:elem.data.nm });
diff --git a/player/js/utils/expressions/TransformInterface.js b/player/js/utils/expressions/TransformInterface.js
new file mode 100644
index 0000000..d6953f4
--- /dev/null
+++ b/player/js/utils/expressions/TransformInterface.js
@@ -0,0 +1,47 @@
+var TransformExpressionInterface = (function (){
+    return function(transform){
+        function _thisFunction(name){
+            switch(name){
+                case "scale":
+                case "Scale":
+                    console.log('transformtransform', transform);
+                    console.log('_thisFunction', _thisFunction.scale);
+                    return _thisFunction.scale;
+                case "rotation":
+                case "Rotation":
+                    return _thisFunction.rotation;
+                case "position":
+                case "Position":
+                    return _thisFunction.position;
+                case "anchorPoint":
+                case "AnchorPoint":
+                    return _thisFunction.anchorPoint;
+            }
+        }
+
+        Object.defineProperty(_thisFunction, "rotation", {
+            get: function(){
+                return transform.rotation;
+            }
+        });
+        Object.defineProperty(_thisFunction, "scale", {
+            get: function () {
+                return transform.scale;
+            }
+        });
+
+        Object.defineProperty(_thisFunction, "position", {
+            get: function () {
+                return transform.position;
+            }
+        });
+
+        Object.defineProperty(_thisFunction, "anchorPoint", {
+            get: function () {
+                return transform.anchorPoint;
+            }
+        });
+
+        return _thisFunction;
+    }
+}());
\ No newline at end of file
diff --git a/player/js/utils/shapes/MouseModifier.js b/player/js/utils/shapes/MouseModifier.js
new file mode 100644
index 0000000..6a775ce
--- /dev/null
+++ b/player/js/utils/shapes/MouseModifier.js
@@ -0,0 +1,229 @@
+function MouseModifier(){};
+extendPrototype(ShapeModifier,MouseModifier);
+MouseModifier.prototype.processKeys = function(forceRender){
+    if(this.elem.globalData.frameId === this.frameId && !forceRender){
+        return;
+    }
+    this.mdf = true;
+
+};
+
+MouseModifier.prototype.addShapeToModifier = function(){
+    this.positions.push([]);
+};
+
+MouseModifier.prototype.processPath = function(path, mouseCoords, positions){
+    var i, len = path.v.length;
+    var vValues = [],oValues = [],iValues = [];
+    var dist;
+    //console.log(mouseCoords);
+    var theta, x,y;
+    //// OPTION A
+    for(i=0;i<len;i+=1){
+        if(!positions.v[i]){
+            positions.v[i] = [path.v[i][0],path.v[i][1]];
+            positions.o[i] = [path.o[i][0],path.o[i][1]];
+            positions.i[i] = [path.i[i][0],path.i[i][1]];
+            positions.distV[i] = 0;
+            positions.distO[i] = 0;
+            positions.distI[i] = 0;
+
+        }
+        theta = Math.atan2(
+            path.v[i][1] - mouseCoords[1],
+            path.v[i][0] - mouseCoords[0]
+        );
+
+        x = mouseCoords[0] - positions.v[i][0];
+        y = mouseCoords[1] - positions.v[i][1];
+        var distance = Math.sqrt( (x * x) + (y * y) );
+        positions.distV[i] += (distance - positions.distV[i]) * this.data.dc;
+
+        positions.v[i][0] = Math.cos(theta) * Math.max(0,this.data.maxDist-positions.distV[i])/2 + (path.v[i][0]);
+        positions.v[i][1] = Math.sin(theta) * Math.max(0,this.data.maxDist-positions.distV[i])/2 + (path.v[i][1]);
+
+
+        theta = Math.atan2(
+            path.o[i][1] - mouseCoords[1],
+            path.o[i][0] - mouseCoords[0]
+        );
+
+        x = mouseCoords[0] - positions.o[i][0];
+        y = mouseCoords[1] - positions.o[i][1];
+        var distance = Math.sqrt( (x * x) + (y * y) );
+        positions.distO[i] += (distance - positions.distO[i]) * this.data.dc;
+
+        positions.o[i][0] = Math.cos(theta) * Math.max(0,this.data.maxDist-positions.distO[i])/2 + (path.o[i][0]);
+        positions.o[i][1] = Math.sin(theta) * Math.max(0,this.data.maxDist-positions.distO[i])/2 + (path.o[i][1]);
+
+
+        theta = Math.atan2(
+            path.i[i][1] - mouseCoords[1],
+            path.i[i][0] - mouseCoords[0]
+        );
+
+        x = mouseCoords[0] - positions.i[i][0];
+        y = mouseCoords[1] - positions.i[i][1];
+        var distance = Math.sqrt( (x * x) + (y * y) );
+        positions.distI[i] += (distance - positions.distI[i]) * this.data.dc;
+
+        positions.i[i][0] = Math.cos(theta) * Math.max(0,this.data.maxDist-positions.distI[i])/2 + (path.i[i][0]);
+        positions.i[i][1] = Math.sin(theta) * Math.max(0,this.data.maxDist-positions.distI[i])/2 + (path.i[i][1]);
+
+        /////OPTION 1
+        vValues.push(positions.v[i]);
+         oValues.push(positions.o[i]);
+         iValues.push(positions.i[i]);
+
+
+
+        /////OPTION 2
+        //vValues.push(positions.v[i]);
+        // iValues.push([path.i[i][0]+(positions.v[i][0]-path.v[i][0]),path.i[i][1]+(positions.v[i][1]-path.v[i][1])]);
+        // oValues.push([path.o[i][0]+(positions.v[i][0]-path.v[i][0]),path.o[i][1]+(positions.v[i][1]-path.v[i][1])]);
+
+
+
+        /////OPTION 3
+        //vValues.push(positions.v[i]);
+        //iValues.push(path.i[i]);
+        //oValues.push(path.o[i]);
+
+
+        /////OPTION 4
+        //vValues.push(path.v[i]);
+         //oValues.push(positions.o[i]);
+         //iValues.push(positions.i[i]);
+    }
+
+
+
+    //// OPTION B
+    /*for(i=0;i<len;i+=1){
+        if(!positions.v[i]){
+            positions.v[i] = [path.v[i][0],path.v[i][1]];
+            positions.o[i] = [path.o[i][0],path.o[i][1]];
+            positions.i[i] = [path.i[i][0],path.i[i][1]];
+            positions.distV[i] = 0;
+
+        }
+        theta = Math.atan2(
+            positions.v[i][1] - mouseCoords[1],
+            positions.v[i][0] - mouseCoords[0]
+        );
+        x = mouseCoords[0] - positions.v[i][0];
+        y = mouseCoords[1] - positions.v[i][1];
+        var distance = this.data.ss * this.data.mx / Math.sqrt( (x * x) + (y * y) );
+
+        positions.v[i][0] += Math.cos(theta) * distance + (path.v[i][0] - positions.v[i][0]) * this.data.dc;
+        positions.v[i][1] += Math.sin(theta) * distance + (path.v[i][1] - positions.v[i][1]) * this.data.dc;
+
+
+        theta = Math.atan2(
+            positions.o[i][1] - mouseCoords[1],
+            positions.o[i][0] - mouseCoords[0]
+        );
+        x = mouseCoords[0] - positions.o[i][0];
+        y = mouseCoords[1] - positions.o[i][1];
+        var distance =  this.data.ss * this.data.mx / Math.sqrt( (x * x) + (y * y) );
+
+        positions.o[i][0] += Math.cos(theta) * distance + (path.o[i][0] - positions.o[i][0]) * this.data.dc;
+        positions.o[i][1] += Math.sin(theta) * distance + (path.o[i][1] - positions.o[i][1]) * this.data.dc;
+
+
+        theta = Math.atan2(
+            positions.i[i][1] - mouseCoords[1],
+            positions.i[i][0] - mouseCoords[0]
+        );
+        x = mouseCoords[0] - positions.i[i][0];
+        y = mouseCoords[1] - positions.i[i][1];
+        var distance =  this.data.ss * this.data.mx / Math.sqrt( (x * x) + (y * y) );
+
+        positions.i[i][0] += Math.cos(theta) * distance + (path.i[i][0] - positions.i[i][0]) * this.data.dc;
+        positions.i[i][1] += Math.sin(theta) * distance + (path.i[i][1] - positions.i[i][1]) * this.data.dc;
+
+        /////OPTION 1
+        //vValues.push(positions.v[i]);
+        // oValues.push(positions.o[i]);
+        // iValues.push(positions.i[i]);
+
+
+
+        /////OPTION 2
+        //vValues.push(positions.v[i]);
+        // iValues.push([path.i[i][0]+(positions.v[i][0]-path.v[i][0]),path.i[i][1]+(positions.v[i][1]-path.v[i][1])]);
+        // oValues.push([path.o[i][0]+(positions.v[i][0]-path.v[i][0]),path.o[i][1]+(positions.v[i][1]-path.v[i][1])]);
+
+
+
+        /////OPTION 3
+        //vValues.push(positions.v[i]);
+        //iValues.push(path.i[i]);
+        //oValues.push(path.o[i]);
+
+
+        /////OPTION 4
+        //vValues.push(path.v[i]);
+        // oValues.push(positions.o[i]);
+        // iValues.push(positions.i[i]);
+    }*/
+
+
+    return {
+        v:vValues,
+        o:oValues,
+        i:iValues,
+        c:path.c
+    };
+}
+
+MouseModifier.prototype.processShapes = function(){
+    var mouseX = this.elem.globalData.mouseX;
+    var mouseY = this.elem.globalData.mouseY;
+    var shapePaths;
+    var i, len = this.shapes.length;
+    var j, jLen;
+
+    if(mouseX){
+        var localMouseCoords = this.elem.globalToLocal([mouseX,mouseY,0]);
+
+        var shapeData, newPaths = [];
+        for(i=0;i<len;i+=1){
+            shapeData = this.shapes[i];
+            if(!shapeData.shape.mdf && !this.mdf){
+                shapeData.shape.paths = shapeData.last;
+            } else {
+                shapeData.shape.mdf = true;
+                shapePaths = shapeData.shape.paths;
+                jLen = shapePaths.length;
+                for(j=0;j<jLen;j+=1){
+                    if(!this.positions[i][j]){
+                        this.positions[i][j] = {
+                            v:[],
+                            o:[],
+                            i:[],
+                            distV:[],
+                            distO:[],
+                            distI:[]
+                        };
+                    }
+                    newPaths.push(this.processPath(shapePaths[j],localMouseCoords, this.positions[i][j]));
+                }
+                shapeData.shape.paths = newPaths;
+                shapeData.last = newPaths;
+            }
+        }
+
+    }
+
+}
+
+MouseModifier.prototype.initModifierProperties = function(elem,data){
+    this.getValue = this.processKeys;
+    this.data = data;
+    this.positions = [];
+};
+
+
+
+ShapeModifiers.registerModifier('ms',MouseModifier);
\ No newline at end of file
diff --git a/player/js/utils/shapes/ShapeModifiers.js b/player/js/utils/shapes/ShapeModifiers.js
index 87a8748..5dd45d7 100644
--- a/player/js/utils/shapes/ShapeModifiers.js
+++ b/player/js/utils/shapes/ShapeModifiers.js
@@ -19,9 +19,11 @@
 
 function ShapeModifier(){}
 ShapeModifier.prototype.initModifierProperties = function(){};
+ShapeModifier.prototype.addShapeToModifier = function(){};
 ShapeModifier.prototype.addShape = function(shape){
     if(!this.closed){
         this.shapes.push({shape:shape,last:[]});
+        this.addShapeToModifier(shape);
     }
 }
 ShapeModifier.prototype.init = function(elem,data,dynamicProperties){
diff --git a/player/js/utils/shapes/ShapeProperty.js b/player/js/utils/shapes/ShapeProperty.js
index 58adf3e..c4abc03 100644
--- a/player/js/utils/shapes/ShapeProperty.js
+++ b/player/js/utils/shapes/ShapeProperty.js
@@ -60,11 +60,27 @@
                 keyPropS = keyData.s[0];
             }
 
+            if(this.v.i.length !== keyPropS.i.length){
+                this.v.i.length = keyPropS.i.length;
+                this.v.o.length = keyPropS.o.length;
+                this.v.v.length = keyPropS.v.length;
+                this.pv.i.length = keyPropS.i.length;
+                this.pv.o.length = keyPropS.o.length;
+                this.pv.v.length = keyPropS.v.length;
+            }
             jLen = this.v.i.length;
             kLen = keyPropS.i[0].length;
             var hasModified = false;
             var vertexValue;
             for(j=0;j<jLen;j+=1){
+                if(!this.v.i[j]){
+                    this.v.i[j] = Array.apply(null,{length:kLen});
+                    this.v.o[j] = Array.apply(null,{length:kLen});
+                    this.v.v[j] = Array.apply(null,{length:kLen});
+                    this.pv.i[j] = Array.apply(null,{length:kLen});
+                    this.pv.o[j] = Array.apply(null,{length:kLen});
+                    this.pv.v[j] = Array.apply(null,{length:kLen});
+                }
                 for(k=0;k<kLen;k+=1){
                     if(isHold){
                         vertexValue = keyPropS.i[j][k];
