merge fix
diff --git a/extension/jsx/elements/layerElement.jsx b/extension/jsx/elements/layerElement.jsx
index 86b8cc0..a235332 100644
--- a/extension/jsx/elements/layerElement.jsx
+++ b/extension/jsx/elements/layerElement.jsx
@@ -91,7 +91,7 @@
     function prepareLayer(layerInfo, ind) {
         var layerData = {};
         var layerType = getLayerType(layerInfo);
-        if (layerType === ob.layerTypes.audio || layerType === ob.layerTypes.guide || layerType === ob.layerTypes.light || layerType === ob.layerTypes.adjustment || layerType === ob.layerTypes.pholderStill || layerType === ob.layerTypes.pholderVideo) {
+        if (layerType === ob.layerTypes.audio || layerType === ob.layerTypes.light || layerType === ob.layerTypes.adjustment || layerType === ob.layerTypes.pholderStill || layerType === ob.layerTypes.pholderVideo) {
             layerData.isValid = false;
             layerData.render = false;
         }
@@ -176,7 +176,9 @@
         }
         
         var lType = layerData.ty;
-        if (lType !== ob.layerTypes.camera) {
+        if (lType === ob.layerTypes.guide) {
+            bm_effectsHelper.exportEffects(layerInfo, layerData, frameRate);
+        } else if (lType !== ob.layerTypes.camera) {
             bm_transformHelper.exportTransform(layerInfo, layerData, frameRate);
             bm_maskHelper.exportMasks(layerInfo, layerData, frameRate);
             bm_effectsHelper.exportEffects(layerInfo, layerData, frameRate);
diff --git a/extension/jsx/utils/effectsHelper.jsx b/extension/jsx/utils/effectsHelper.jsx
index b43015e..8e37cd9 100644
--- a/extension/jsx/utils/effectsHelper.jsx
+++ b/extension/jsx/utils/effectsHelper.jsx
@@ -8,7 +8,10 @@
         angleControl: 1,
         colorControl: 2,
         pointControl: 3,
-        checkboxControl: 4
+        checkboxControl: 4,
+        group: 5,
+        noValue: 6,
+        dropDownControl: 7
     };
     
     function getEffectType(name) {
@@ -24,16 +27,45 @@
         case 'ADBE Checkbox Control':
             return effectTypes.checkboxControl;
         default:
-            //bm_eventDispatcher.log(name);
+            bm_eventDispatcher.log(name);
             return '';
         }
     }
     
+    function findEffectPropertyType(prop) {
+        var propertyValueType = prop.propertyValueType;
+            bm_eventDispatcher.log('prop.propertyValueType: ' + prop.propertyValueType);
+            bm_eventDispatcher.log('PropertyValueType.COLOR: ' + PropertyValueType.COLOR);
+            bm_eventDispatcher.log('PropertyValueType.OneD: ' + PropertyValueType.OneD);
+        //Prop ertyValueType.NO_VALUE
+        if (propertyValueType === PropertyValueType.NO_VALUE) {
+            return effectTypes.noValue;
+        } else if (propertyValueType === PropertyValueType.OneD) {
+             if (!prop.isInterpolationTypeValid(KeyframeInterpolationType.LINEAR)){
+                return effectTypes.dropDownControl;
+             }
+            return effectTypes.sliderControl;
+        } else if (propertyValueType === PropertyValueType.COLOR) {
+            return effectTypes.colorControl;
+        } else {
+            return effectTypes.pointControl;
+        }
+        return '';
+    }
+    
+    function exportNoValueControl(effect, frameRate) {
+        var ob = {};
+        ob.ty = effectTypes.noValue;
+        ob.nm = effect.name;
+        ob.v = 0;
+        return ob;
+    }
+    
     function exportSliderControl(effect, frameRate) {
         var ob = {};
         ob.ty = effectTypes.sliderControl;
         ob.nm = effect.name;
-        ob.v = bm_keyframeHelper.exportKeyframes(effect.property('Slider'), frameRate);
+        ob.v = bm_keyframeHelper.exportKeyframes(effect, frameRate);
         return ob;
     }
     
@@ -41,7 +73,7 @@
         var ob = {};
         ob.ty = effectTypes.angleControl;
         ob.nm = effect.name;
-        ob.v = bm_keyframeHelper.exportKeyframes(effect.property('Angle'), frameRate);
+        ob.v = bm_keyframeHelper.exportKeyframes(effect, frameRate);
         return ob;
     }
     
@@ -49,7 +81,7 @@
         var ob = {};
         ob.ty = effectTypes.colorControl;
         ob.nm = effect.name;
-        ob.v = bm_keyframeHelper.exportKeyframes(effect.property('Color'), frameRate);
+        ob.v = bm_keyframeHelper.exportKeyframes(effect, frameRate);
         return ob;
     }
     
@@ -57,7 +89,7 @@
         var ob = {};
         ob.ty = effectTypes.pointControl;
         ob.nm = effect.name;
-        ob.v = bm_keyframeHelper.exportKeyframes(effect.property('Point'), frameRate);
+        ob.v = bm_keyframeHelper.exportKeyframes(effect, frameRate);
         return ob;
     }
     
@@ -65,7 +97,15 @@
         var ob = {};
         ob.ty = effectTypes.checkboxControl;
         ob.nm = effect.name;
-        ob.v = bm_keyframeHelper.exportKeyframes(effect.property('Checkbox'), frameRate);
+        ob.v = bm_keyframeHelper.exportKeyframes(effect, frameRate);
+        return ob;
+    }
+    
+    function exportDropDownControl(effect, frameRate) {
+        var ob = {};
+        ob.ty = effectTypes.dropDownControl;
+        ob.nm = effect.name;
+        ob.v = bm_keyframeHelper.exportKeyframes(effect, frameRate);
         return ob;
     }
     
@@ -77,7 +117,7 @@
             for (var s in prop) {
                 propsArray.push({key:s,value:''});
             }
-            /* bm_eventDispatcher.log(propsArray);
+             bm_eventDispatcher.log(propsArray);
             bm_eventDispatcher.log('prop.name: ' + prop.name);
             bm_eventDispatcher.log('prop.matchName: ' + prop.matchName);
             bm_eventDispatcher.log('prop.propertyType: ' + prop.propertyType);
@@ -90,11 +130,45 @@
             if(prop.hasMin){
                 bm_eventDispatcher.log('prop.minValue: ' + prop.minValue);
             }
-            bm_eventDispatcher.log('----------------');*/
+            bm_eventDispatcher.log('----------------');
         }
     }
     
+    function exportCustomEffect(elem, frameRate) {
+        var ob = {};
+        ob.ty = effectTypes.group;
+        ob.nm = elem.name;
+        ob.ef = [];
+        var i, len = elem.numProperties, prop;
+        for (i = 0; i < len; i += 1) {
+            prop = elem.property(i + 1);
+            if(prop.propertyType === 6012){
+                var type = findEffectPropertyType(prop);
+                //effectTypes.noValue;
+                if (type === effectTypes.noValue) {
+                    ob.ef.push(exportNoValueControl(prop, frameRate));
+                } else if(type === effectTypes.sliderControl) {
+                    ob.ef.push(exportSliderControl(prop, frameRate));
+                } else if(type === effectTypes.colorControl) {
+                    ob.ef.push(exportColorControl(prop, frameRate));
+                } else if(type === effectTypes.dropDownControl) {
+                    ob.ef.push(exportDropDownControl(prop, frameRate));
+                } else {
+                    ob.ef.push(exportPointControl(prop, frameRate));
+                }
+            } else {
+                if(prop.name !== 'Compositing Options' && prop.matchName !== 'ADBE Effect Built In Params') {
+                    ob.ef.push(exportCustomEffect(prop, frameRate));
+                }
+            }
+        }
+        return ob;
+    }
+    
     function exportEffects(layerInfo, layerData, frameRate) {
+        bm_eventDispatcher.log('PropertyType.PROPERTY' + PropertyType.PROPERTY);
+        bm_eventDispatcher.log('PropertyType.INDEXED_GROUP' + PropertyType.INDEXED_GROUP);
+        bm_eventDispatcher.log('PropertyType.NAMED_GROUP' + PropertyType.NAMED_GROUP);
         if (!(layerInfo.effect && layerInfo.effect.numProperties > 0)) {
             return;
         }
@@ -103,25 +177,28 @@
         var effectsArray = [];
         for (i = 0; i < len; i += 1) {
             effectElement = effects(i + 1);
-            //iterateEffectProperties(effectElement);
-            var effectType = getEffectType(effectElement.matchName);
+            effectsArray.push(exportCustomEffect(effectElement, frameRate));
+            /*var effectType = getEffectType(effectElement.matchName);
             switch (effectType) {
             case effectTypes.sliderControl:
-                effectsArray.push(exportSliderControl(effectElement, frameRate));
+                effectsArray.push(exportSliderControl(effectElement.property('Slider'), frameRate));
                 break;
             case effectTypes.angleControl:
-                effectsArray.push(exportAngleControl(effectElement, frameRate));
+                effectsArray.push(exportAngleControl(effectElement.property('Angle'), frameRate));
                 break;
             case effectTypes.colorControl:
-                effectsArray.push(exportColorControl(effectElement, frameRate));
+                effectsArray.push(exportColorControl(effectElement.property('Color'), frameRate));
                 break;
             case effectTypes.pointControl:
-                effectsArray.push(exportPointControl(effectElement, frameRate));
+                effectsArray.push(exportPointControl(effectElement.property('Point'), frameRate));
                 break;
             case effectTypes.checkboxControl:
-                effectsArray.push(exportCheckboxControl(effectElement, frameRate));
+                effectsArray.push(exportCheckboxControl(effectElement.property('Checkbox'), frameRate));
                 break;
-            }
+            default:
+                //iterateEffectProperties(effectElement);
+                effectsArray.push(exportCustomEffect(effectElement, frameRate));
+            }*/
         }
         if (effectsArray.length) {
             layerData.ef = effectsArray;
diff --git a/extension/jsx/utils/expressionHelper.jsx b/extension/jsx/utils/expressionHelper.jsx
index c83bad5..0550037 100644
--- a/extension/jsx/utils/expressionHelper.jsx
+++ b/extension/jsx/utils/expressionHelper.jsx
@@ -449,6 +449,10 @@
             assignmentObject = createAssignmentObject();
             assignmentObject.expression.right = expressionStatement.expression;
             return assignmentObject;
+        } else if(expressionStatement.expression.type === 'ConditionalExpression'){
+            assignmentObject = createAssignmentObject();
+            assignmentObject.expression.right = expressionStatement.expression;
+            return assignmentObject;
         }
         return expressionStatement;
     }
diff --git a/player/index.html b/player/index.html
index d0aeabd..0a4a060 100644
--- a/player/index.html
+++ b/player/index.html
@@ -9,9 +9,9 @@
             overflow: hidden;
         }
         #bodymovin{
-            background-color:#fff;
-            width:100%;
-            height:100%;
+            background-color:#ccc;
+            width:800px;
+            height:800px;
             /*width:800px;
             height:500px;*/
             display:block;
@@ -101,13 +101,13 @@
     var count = 0;
     var animData = {
         container: document.getElementById('bodymovin'),
-        renderer: 'canvas',
+        renderer: 'svg',
         loop: true,
         prerender: false,
         autoplay: true,
         autoloadSegments: false,
         //animationData: anim2
-        path: 'exports/bm/data.json'
+        path: 'exports/render/ik.json'
     };
 
     var anim;
diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js
index a2a873f..23a734e 100644
--- a/player/js/animation/AnimationItem.js
+++ b/player/js/animation/AnimationItem.js
@@ -233,7 +233,7 @@
     this.firstFrame = Math.round(this.animationData.ip);
     this.frameMult = this.animationData.fr / 1000;
     /*
-    this.firstFrame = 77;
+    this.firstFrame = 0;
     this.totalFrames = 1;
     this.animationData.tf = 1;
     //this.frameMult = 1/100;
diff --git a/player/js/effects.js b/player/js/effects.js
index 7063597..d3696fe 100644
--- a/player/js/effects.js
+++ b/player/js/effects.js
@@ -1,42 +1,56 @@
 function EffectsManager(data,element,dynamicProperties){
-    this.data = data;
-    this.element = element;
+    var data = data;
+    var element = element;
     var effects = data.ef;
-    this.effectElements = [];
+    var effectElements = [];
     var i,len = effects.length;
     var eff;
     for(i=0;i<len;i++){
         switch(effects[i].ty){
             case 0:
                 eff = new SliderEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff.proxyFunction.bind(eff));
+                effectElements.push(eff.proxyFunction.bind(eff));
                 break;
             case 1:
 ;                eff = new AngleEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff.proxyFunction.bind(eff));
+                effectElements.push(eff.proxyFunction.bind(eff));
                 break;
             case 2:
                 eff = new ColorEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff.proxyFunction.bind(eff));
+                effectElements.push(eff.proxyFunction.bind(eff));
                 break;
             case 3:
                 eff = new PointEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff.proxyFunction.bind(eff));
+                effectElements.push(eff.proxyFunction.bind(eff));
                 break;
             case 4:
+            case 7:
                 eff = new CheckboxEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff.proxyFunction.bind(eff));
+                effectElements.push(eff.proxyFunction.bind(eff));
+                break;
+            case 5:
+                eff = new EffectsManager(effects[i],element,dynamicProperties);
+                effectElements.push(eff);
+                break;
+            case 6:
+                eff = new NoValueEffect(effects[i],element,dynamicProperties);
+                effectElements.push(eff);
                 break;
         }
     }
-}
 
-EffectsManager.prototype.getEffect = function(name){
-    var effects = this.data.ef, i = 0, len = effects.length;
-    while(i<len) {
-        if(effects[i].nm === name){
-            return this.effectElements[i];
+    var fn = function(name){
+        var effects = data.ef, i = 0, len = effects.length;
+        while(i<len) {
+            if(name === effects[i].nm || name === i + 1){
+                if(effects[i].ty === 5){
+                    return effectElements[i];
+                } else{
+                    return effectElements[i]();
+                }
+            }
+            i += 1;
         }
-        i += 1;
     }
-};
\ No newline at end of file
+    return fn;
+}
\ No newline at end of file
diff --git a/player/js/effects/SliderEffect.js b/player/js/effects/SliderEffect.js
index 626cb14..239a2fb 100644
--- a/player/js/effects/SliderEffect.js
+++ b/player/js/effects/SliderEffect.js
@@ -13,6 +13,18 @@
 function CheckboxEffect(data,elem, dynamicProperties){
     this.p = PropertyFactory.getProp(elem,data.v,1,0,dynamicProperties);
 }
+function NoValueEffect(data,elem, dynamicProperties){
+    this.p = {};
+}
+
+function groupEffectFunction(num){
+
+}
+
+function GroupEffect() {
+    var fn = groupEffectFunction;
+    return fn;
+}
 
 SliderEffect.prototype.proxyFunction = function(){
     if(this.p.k){
diff --git a/player/js/elements/BaseElement.js b/player/js/elements/BaseElement.js
index 8241ed7..cb6c3c9 100644
--- a/player/js/elements/BaseElement.js
+++ b/player/js/elements/BaseElement.js
@@ -62,20 +62,24 @@
     this.lastNum = -99999;
     if(this.data.ef){
         this.effectsManager = new EffectsManager(this.data,this,this.dynamicProperties);
-        this.effect = this.effectsManager.getEffect.bind(this.effectsManager);
+        this.effect = this.effectsManager.bind(this.effectsManager);
     }
-    this.finalTransform = {
-        mProp: PropertyFactory.getProp(this,this.data.ks,2,null,this.dynamicProperties),
-        matMdf: false,
-        opMdf: false,
-        mat: new Matrix(),
-        opacity: 1
-    };
-    this.finalTransform.op = this.finalTransform.mProp.o;
-    this.transform = this.finalTransform.mProp;
-    this.createElements();
-    if(this.data.hasMask){
-        this.addMasks(this.data);
+    if(this.data.ty === 11){
+
+    } else {
+        this.finalTransform = {
+            mProp: PropertyFactory.getProp(this,this.data.ks,2,null,this.dynamicProperties),
+            matMdf: false,
+            opMdf: false,
+            mat: new Matrix(),
+            opacity: 1
+        };
+        this.finalTransform.op = this.finalTransform.mProp.o;
+        this.transform = this.finalTransform.mProp;
+        this.createElements();
+        if(this.data.hasMask){
+            this.addMasks(this.data);
+        }
     }
 };
 BaseElement.prototype.getType = function(){
@@ -115,6 +119,35 @@
     return this.maskManager.getMask(nm);
 }
 
+Object.defineProperty(BaseElement.prototype, "hasParent", {
+    get: function hasParent() {
+        return this.hierarchy && this.hierarchy.length;
+    }
+});
+Object.defineProperty(BaseElement.prototype, "parent", {
+    get: function parent() {
+        return this.hierarchy[0];
+    }
+});
+
+Object.defineProperty(BaseElement.prototype, "rotation", {
+    get: function rotation() {
+        return this.transform.rotation;
+    }
+});
+
+Object.defineProperty(BaseElement.prototype, "scale", {
+    get: function scale() {
+        return this.transform.scale;
+    }
+});
+
+Object.defineProperty(BaseElement.prototype, "position", {
+    get: function position() {
+        return this.transform.position;
+    }
+});
+
 Object.defineProperty(BaseElement.prototype, "anchorPoint", {
     get: function anchorPoint() {
         return this.finalTransform.mProp.anchorPoint;
diff --git a/player/js/elements/CompElement.js b/player/js/elements/CompElement.js
index a8d0638..527ce8b 100644
--- a/player/js/elements/CompElement.js
+++ b/player/js/elements/CompElement.js
@@ -1,5 +1,5 @@
 function ICompElement(data,parentContainer,globalData,comp, placeholder){
-    this.parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
+    this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
     this.layers = data.layers;
     this.isSvg = true;
     if(this.data.tm){
@@ -23,7 +23,7 @@
 };
 
 ICompElement.prototype.prepareFrame = function(num){
-    this.parent.prepareFrame.call(this,num);
+    this._parent.prepareFrame.call(this,num);
     if(this.isVisible===false){
         return;
     }
@@ -42,7 +42,7 @@
 };
 
 ICompElement.prototype.renderFrame = function(parentMatrix){
-    var renderParent = this.parent.renderFrame.call(this,parentMatrix);
+    var renderParent = this._parent.renderFrame.call(this,parentMatrix);
     var i,len = this.layers.length;
     if(renderParent===false){
         this.hide();
@@ -72,7 +72,7 @@
 };
 
 ICompElement.prototype.destroy = function(){
-    this.parent.destroy.call();
+    this._parent.destroy.call();
     var i,len = this.layers.length;
     for( i = 0; i < len; i+=1 ){
         this.elements[i].destroy();
diff --git a/player/js/elements/ImageElement.js b/player/js/elements/ImageElement.js
index d60c142..7655bcd 100644
--- a/player/js/elements/ImageElement.js
+++ b/player/js/elements/ImageElement.js
@@ -1,7 +1,7 @@
 function IImageElement(data,parentContainer,globalData,comp,placeholder){
     this.assetData = globalData.getAssetData(data.refId);
     this.path = globalData.getPath();
-    this.parent.constructor.call(this,data,parentContainer,globalData,comp,placeholder);
+    this._parent.constructor.call(this,data,parentContainer,globalData,comp,placeholder);
 }
 createElement(SVGBaseElement, IImageElement);
 
@@ -20,7 +20,7 @@
 
     img.src = this.path+this.assetData.p;
 
-    this.parent.createElements.call(this);
+    this._parent.createElements.call(this);
 
     this.innerElem = document.createElementNS(svgNS,'image');
     this.innerElem.setAttribute('width',this.assetData.w+"px");
@@ -47,7 +47,7 @@
 };
 
 IImageElement.prototype.renderFrame = function(parentMatrix){
-    var renderParent = this.parent.renderFrame.call(this,parentMatrix);
+    var renderParent = this._parent.renderFrame.call(this,parentMatrix);
     if(renderParent===false){
         this.hide();
         return;
@@ -70,6 +70,6 @@
 };
 
 IImageElement.prototype.destroy = function(){
-    this.parent.destroy.call();
+    this._parent.destroy.call();
     this.innerElem =  null;
 };
\ No newline at end of file
diff --git a/player/js/elements/ShapeElement.js b/player/js/elements/ShapeElement.js
index 8b1ce7e..2bf4dd5 100644
--- a/player/js/elements/ShapeElement.js
+++ b/player/js/elements/ShapeElement.js
@@ -4,7 +4,7 @@
     this.stylesList = [];
     this.viewData = [];
     this.shapesContainer = document.createElementNS(svgNS,'g');
-    this.parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
+    this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
 }
 createElement(SVGBaseElement, IShapeElement);
 
@@ -26,7 +26,7 @@
 
 IShapeElement.prototype.createElements = function(){
     //TODO check if I can use symbol so i can set its viewBox
-    this.parent.createElements.call(this);
+    this._parent.createElements.call(this);
     this.searchShapes(this.shapesData,this.viewData,this.dynamicProperties,[]);
     this.layerElement.appendChild(this.shapesContainer);
     styleUnselectableDiv(this.layerElement);
@@ -191,7 +191,7 @@
 IShapeElement.prototype.renderFrame = function(parentMatrix){
 
 
-    var renderParent = this.parent.renderFrame.call(this,parentMatrix);
+    var renderParent = this._parent.renderFrame.call(this,parentMatrix);
     if(renderParent===false){
         this.hide();
         return;
@@ -382,9 +382,9 @@
 };
 
 IShapeElement.prototype.destroy = function(){
-    this.parent.destroy.call();
+    this._parent.destroy.call();
     this.shapeData = null;
     this.viewData = null;
     this.parentContainer = null;
     this.placeholder = null;
-};
\ No newline at end of file
+};
diff --git a/player/js/elements/SolidElement.js b/player/js/elements/SolidElement.js
index 6a617c5..71e708f 100644
--- a/player/js/elements/SolidElement.js
+++ b/player/js/elements/SolidElement.js
@@ -1,10 +1,10 @@
 function ISolidElement(data,parentContainer,globalData,comp, placeholder){
-    this.parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
+    this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
 }
 createElement(SVGBaseElement, ISolidElement);
 
 ISolidElement.prototype.createElements = function(){
-    this.parent.createElements.call(this);
+    this._parent.createElements.call(this);
 
     var rect = document.createElementNS(svgNS,'rect');
     ////rect.style.width = this.data.sw;
diff --git a/player/js/elements/TextElement.js b/player/js/elements/TextElement.js
index 15bbf5b..fcfa12f 100644
--- a/player/js/elements/TextElement.js
+++ b/player/js/elements/TextElement.js
@@ -1,7 +1,7 @@
 function ITextElement(data, animationItem,parentContainer,globalData){
 }
 ITextElement.prototype.init = function(){
-    this.parent.init.call(this);
+    this._parent.init.call(this);
     this.lettersChangedFlag = false;
     var data = this.data;
     this.renderedLetters = Array.apply(null,{length:data.t.d.l.length});
diff --git a/player/js/elements/canvasElements/CVCompElement.js b/player/js/elements/canvasElements/CVCompElement.js
index 5b1c86a..37201b8 100644
--- a/player/js/elements/canvasElements/CVCompElement.js
+++ b/player/js/elements/canvasElements/CVCompElement.js
@@ -1,5 +1,5 @@
 function CVCompElement(data, comp,globalData){
-    this.parent.constructor.call(this,data, comp,globalData);
+    this._parent.constructor.call(this,data, comp,globalData);
     this.layers = data.layers;
     if(this.data.tm){
         this.tm = PropertyFactory.getProp(this,this.data.tm,0,globalData.frameRate,this.dynamicProperties);
@@ -8,7 +8,7 @@
 createElement(CVBaseElement, CVCompElement);
 
 CVCompElement.prototype.prepareFrame = function(num){
-    this.parent.prepareFrame.call(this,num);
+    this._parent.prepareFrame.call(this,num);
     if(this.isVisible===false){
         return;
     }
@@ -27,7 +27,7 @@
 };
 
 CVCompElement.prototype.renderFrame = function(parentMatrix){
-    if(this.parent.renderFrame.call(this,parentMatrix)===false){
+    if(this._parent.renderFrame.call(this,parentMatrix)===false){
         return;
     }
     var i,len = this.layers.length;
@@ -57,5 +57,5 @@
     }
     this.layers = null;
     this.elements = null;
-    this.parent.destroy.call();
+    this._parent.destroy.call();
 };
\ No newline at end of file
diff --git a/player/js/elements/canvasElements/CVImageElement.js b/player/js/elements/canvasElements/CVImageElement.js
index 7a90d0e..b6c4cc3 100644
--- a/player/js/elements/canvasElements/CVImageElement.js
+++ b/player/js/elements/canvasElements/CVImageElement.js
@@ -2,7 +2,7 @@
     this.animationItem = globalData.renderer.animationItem;
     this.assetData = this.animationItem.getAssetData(data.refId);
     this.path = this.animationItem.getPath();
-    this.parent.constructor.call(this,data, comp,globalData);
+    this._parent.constructor.call(this,data, comp,globalData);
     this.animationItem.pendingElements += 1;
 }
 createElement(CVBaseElement, CVImageElement);
@@ -24,7 +24,7 @@
     this.img.addEventListener('error', imageFailed, false);
     this.img.src = this.path+this.assetData.p;
 
-    this.parent.createElements.call(this);
+    this._parent.createElements.call(this);
 
 };
 
@@ -32,7 +32,7 @@
     if(this.failed){
         return;
     }
-    if(this.parent.renderFrame.call(this,parentMatrix)===false){
+    if(this._parent.renderFrame.call(this,parentMatrix)===false){
         return;
     }
     var ctx = this.canvasContext;
@@ -50,5 +50,5 @@
 CVImageElement.prototype.destroy = function(){
     this.img = null;
     this.animationItem = null;
-    this.parent.destroy.call();
+    this._parent.destroy.call();
 };
\ No newline at end of file
diff --git a/player/js/elements/canvasElements/CVShapeElement.js b/player/js/elements/canvasElements/CVShapeElement.js
index 11b35d3..a6f1ef6 100644
--- a/player/js/elements/canvasElements/CVShapeElement.js
+++ b/player/js/elements/canvasElements/CVShapeElement.js
@@ -4,7 +4,7 @@
     this.viewData = [];
     this.shapesData = data.shapes;
     this.firstFrame = true;
-    this.parent.constructor.call(this,data, comp,globalData);
+    this._parent.constructor.call(this,data, comp,globalData);
 }
 createElement(CVBaseElement, CVShapeElement);
 
@@ -25,7 +25,7 @@
 
 CVShapeElement.prototype.createElements = function(){
 
-    this.parent.createElements.call(this);
+    this._parent.createElements.call(this);
     this.searchShapes(this.shapesData,this.viewData,this.dynamicProperties,[]);
     this.buildExpressionInterface();
 };
@@ -137,7 +137,7 @@
 };
 
 CVShapeElement.prototype.renderFrame = function(parentMatrix){
-    if(this.parent.renderFrame.call(this, parentMatrix)===false){
+    if(this._parent.renderFrame.call(this, parentMatrix)===false){
         return;
     }
     this.transformHelper.mat.reset();
@@ -367,5 +367,6 @@
     this.canvasContext = null;
     this.stylesList.length = 0;
     this.viewData.length = 0;
-    this.parent.destroy.call();
-};
\ No newline at end of file
+    this._parent.destroy.call();
+};
+
diff --git a/player/js/elements/canvasElements/CVSolidElement.js b/player/js/elements/canvasElements/CVSolidElement.js
index f465d54..c62ba4e 100644
--- a/player/js/elements/canvasElements/CVSolidElement.js
+++ b/player/js/elements/canvasElements/CVSolidElement.js
@@ -1,10 +1,10 @@
 function CVSolidElement(data, comp,globalData){
-    this.parent.constructor.call(this,data, comp,globalData);
+    this._parent.constructor.call(this,data, comp,globalData);
 }
 createElement(CVBaseElement, CVSolidElement);
 
 CVSolidElement.prototype.renderFrame = function(parentMatrix){
-    if(this.parent.renderFrame.call(this, parentMatrix)===false){
+    if(this._parent.renderFrame.call(this, parentMatrix)===false){
         return;
     }
     var ctx = this.canvasContext;
diff --git a/player/js/elements/canvasElements/CVTextElement.js b/player/js/elements/canvasElements/CVTextElement.js
index b8987e8..d6c1903 100644
--- a/player/js/elements/canvasElements/CVTextElement.js
+++ b/player/js/elements/canvasElements/CVTextElement.js
@@ -15,7 +15,7 @@
         sWidth: 0,
         fValue: ''
     }
-    this.parent.constructor.call(this,data,comp, globalData);
+    this._parent.constructor.call(this,data,comp, globalData);
 }
 createElement(CVBaseElement, CVTextElement);
 
@@ -27,7 +27,7 @@
 
 CVTextElement.prototype.createElements = function(){
 
-    this.parent.createElements.call(this);
+    this._parent.createElements.call(this);
     //console.log('this.data: ',this.data);
     var documentData = this.data.t.d;
 
@@ -116,7 +116,7 @@
 };
 
 CVTextElement.prototype.renderFrame = function(parentMatrix){
-    if(this.parent.renderFrame.call(this, parentMatrix)===false){
+    if(this._parent.renderFrame.call(this, parentMatrix)===false){
         return;
     }
     var ctx = this.canvasContext;
diff --git a/player/js/elements/htmlElements/HCameraElement.js b/player/js/elements/htmlElements/HCameraElement.js
index c1e3396..0b77099 100644
--- a/player/js/elements/htmlElements/HCameraElement.js
+++ b/player/js/elements/htmlElements/HCameraElement.js
@@ -1,5 +1,5 @@
 function HCameraElement(data,parentContainer,globalData,comp, placeholder){
-    this.parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
+    this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
     this.pe = PropertyFactory.getProp(this,data.pe,0,0,this.dynamicProperties);
     if(data.ks.p.s){
         this.px = PropertyFactory.getProp(this,data.ks.p.x,1,0,this.dynamicProperties);
diff --git a/player/js/elements/htmlElements/HCompElement.js b/player/js/elements/htmlElements/HCompElement.js
index 0afb410..d2aa43c 100644
--- a/player/js/elements/htmlElements/HCompElement.js
+++ b/player/js/elements/htmlElements/HCompElement.js
@@ -1,5 +1,5 @@
 function HCompElement(data,parentContainer,globalData,comp, placeholder){
-    this.parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
+    this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
     this.layers = data.layers;
     this.isSvg = false;
     if(this.data.tm){
@@ -51,7 +51,7 @@
 HCompElement.prototype.destroy = ICompElement.prototype.destroy;
 
 HCompElement.prototype.renderFrame = function(parentMatrix){
-    var renderParent = this.parent.renderFrame.call(this,parentMatrix);
+    var renderParent = this._parent.renderFrame.call(this,parentMatrix);
     var i,len = this.layers.length;
     if(renderParent===false){
         this.hide();
diff --git a/player/js/elements/htmlElements/HImageElement.js b/player/js/elements/htmlElements/HImageElement.js
index 98a5f1b..1f84821 100644
--- a/player/js/elements/htmlElements/HImageElement.js
+++ b/player/js/elements/htmlElements/HImageElement.js
@@ -1,7 +1,7 @@
 function HImageElement(data,parentContainer,globalData,comp, placeholder){
     this.assetData = globalData.getAssetData(data.refId);
     this.path = globalData.getPath();
-    this.parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
+    this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
 }
 createElement(HBaseElement, HImageElement);
 
diff --git a/player/js/elements/htmlElements/HShapeElement.js b/player/js/elements/htmlElements/HShapeElement.js
index ceaf995..b6bac51 100644
--- a/player/js/elements/htmlElements/HShapeElement.js
+++ b/player/js/elements/htmlElements/HShapeElement.js
@@ -3,12 +3,12 @@
     this.shapesData = data.shapes;
     this.stylesList = [];
     this.viewData = [];
-    this.parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
+    this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
 }
 createElement(HBaseElement, HShapeElement);
-var parent = HShapeElement.prototype.parent;
+var parent = HShapeElement.prototype._parent;
 extendPrototype(IShapeElement, HShapeElement);
-HShapeElement.prototype.parent = parent;
+HShapeElement.prototype._parent = parent;
 
 HShapeElement.prototype.createElements = function(){
     var parent = document.createElement('div');
@@ -44,7 +44,7 @@
 };
 
 HShapeElement.prototype.renderFrame = function(parentMatrix){
-    var renderParent = this.parent.renderFrame.call(this,parentMatrix);
+    var renderParent = this._parent.renderFrame.call(this,parentMatrix);
     if(renderParent===false){
         this.hide();
         return;
diff --git a/player/js/elements/htmlElements/HSolidElement.js b/player/js/elements/htmlElements/HSolidElement.js
index b81766d..15b046a 100644
--- a/player/js/elements/htmlElements/HSolidElement.js
+++ b/player/js/elements/htmlElements/HSolidElement.js
@@ -1,5 +1,5 @@
 function HSolidElement(data,parentContainer,globalData,comp, placeholder){
-    this.parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
+    this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
 }
 createElement(HBaseElement, HSolidElement);
 
@@ -36,7 +36,7 @@
 };
 
 HSolidElement.prototype.renderFrame = function(parentMatrix){
-    var renderParent = this.parent.renderFrame.call(this,parentMatrix);
+    var renderParent = this._parent.renderFrame.call(this,parentMatrix);
     if(renderParent===false){
         this.hide();
         return;
@@ -51,6 +51,6 @@
 };
 
 HSolidElement.prototype.destroy = function(){
-    this.parent.destroy.call();
+    this._parent.destroy.call();
     this.innerElem =  null;
 };
\ No newline at end of file
diff --git a/player/js/elements/htmlElements/HTextElement.js b/player/js/elements/htmlElements/HTextElement.js
index ec3c0b2..ffe263b 100644
--- a/player/js/elements/htmlElements/HTextElement.js
+++ b/player/js/elements/htmlElements/HTextElement.js
@@ -9,7 +9,7 @@
     }
     this.renderType = 'svg';
     this.isMasked = false;
-    this.parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
+    this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
 
 }
 createElement(HBaseElement, HTextElement);
@@ -167,7 +167,7 @@
 
 HTextElement.prototype.renderFrame = function(parentMatrix){
 
-    var renderParent = this.parent.renderFrame.call(this,parentMatrix);
+    var renderParent = this._parent.renderFrame.call(this,parentMatrix);
     if(renderParent===false){
         this.hide();
         return;
diff --git a/player/js/elements/svgElements/SVGTextElement.js b/player/js/elements/svgElements/SVGTextElement.js
index ac71255..b046d5e 100644
--- a/player/js/elements/svgElements/SVGTextElement.js
+++ b/player/js/elements/svgElements/SVGTextElement.js
@@ -1,7 +1,7 @@
 function SVGTextElement(data,parentContainer,globalData,comp, placeholder){
     this.textSpans = [];
     this.renderType = 'svg';
-    this.parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
+    this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
 }
 createElement(SVGBaseElement, SVGTextElement);
 
@@ -11,7 +11,7 @@
 
 SVGTextElement.prototype.createElements = function(){
 
-    this.parent.createElements.call(this);
+    this._parent.createElements.call(this);
     var documentData = this.data.t.d;
 
     this.innerElem = document.createElementNS(svgNS,'g');
@@ -147,7 +147,7 @@
 
 SVGTextElement.prototype.renderFrame = function(parentMatrix){
 
-    var renderParent = this.parent.renderFrame.call(this,parentMatrix);
+    var renderParent = this._parent.renderFrame.call(this,parentMatrix);
     if(renderParent===false){
         this.hide();
         return;
@@ -204,6 +204,6 @@
 
 
 SVGTextElement.prototype.destroy = function(){
-    this.parent.destroy.call();
+    this._parent.destroy.call();
     this.innerElem =  null;
 };
\ No newline at end of file
diff --git a/player/js/renderers/SVGRenderer.js b/player/js/renderers/SVGRenderer.js
index 193bb18..105ce69 100644
--- a/player/js/renderers/SVGRenderer.js
+++ b/player/js/renderers/SVGRenderer.js
@@ -219,15 +219,15 @@
     }else{
         this.renderedFrame = num;
     }
-    //console.log('-------');
-    //console.log('FRAME ',num);
+    /*console.log('-------');
+    console.log('FRAME ',num);*/
     this.globalData.frameNum = num;
     this.globalData.frameId += 1;
     var i, len = this.layers.length;
-    for (i = 0; i < len; i++) {
+    for (i = len - 1; i >= 0; i--) {
         this.elements[i].prepareFrame(num - this.layers[i].st);
     }
-    for (i = 0; i < len; i++) {
+    for (i = len - 1; i >= 0; i--) {
         this.elements[i].renderFrame();
     }
 };
diff --git a/player/js/utils/PropertyFactory.js b/player/js/utils/PropertyFactory.js
index 1423e9b..9e68e2b 100644
--- a/player/js/utils/PropertyFactory.js
+++ b/player/js/utils/PropertyFactory.js
@@ -178,7 +178,6 @@
             return;
         }
         this.mdf = false;
-        this.frameId = this.elem.globalData.frameId;
         var frameNum = this.comp.renderedFrame - this.offsetTime;
         if(frameNum === this.lastFrame || (this.lastFrame !== initFrame && ((this.lastFrame >= this.keyframes[this.keyframes.length- 1].t-this.offsetTime && frameNum >= this.keyframes[this.keyframes.length- 1].t-this.offsetTime) || (this.lastFrame < this.keyframes[0].t-this.offsetTime && frameNum < this.keyframes[0].t-this.offsetTime)))){
 
@@ -353,6 +352,7 @@
             }
         }
         this.lastFrame = frameNum;
+        this.frameId = this.elem.globalData.frameId;
     }
 
     function interpolateShape() {
@@ -468,6 +468,7 @@
         this.mdf = false;
         this.comp = elem.comp;
         this.k = false;
+        this.frameId = -1;
         checkExpressions.bind(this)(elem,data);
         this.v = new Array(data.k.length);
         this.pv = new Array(data.k.length);
@@ -536,104 +537,79 @@
     var TransformProperty = (function(){
         function positionGetter(){
             if(this.p.k){
-                this.getValue();
+                this.p.getValue();
             }
-            return this.p.pv;
+            return this.p.v;
         }
         function anchorGetter(){
             if(this.a.k){
-                this.getValue();
+                this.a.getValue();
             }
-            return this.a.pv;
+            return this.a.v;
         }
         function orientationGetter(){
             if(this.or.k){
-                this.getValue();
+                this.or.getValue();
             }
-            return this.or.pv;
+            return this.or.v;
         }
         function rotationGetter(){
             if(this.r.k){
-                this.getValue();
+                this.r.getValue();
             }
-            return this.r.pv;
+            return this.r.v/degToRads;
         }
         function scaleGetter(){
             if(this.s.k){
-                this.getValue();
+                this.s.getValue();
             }
-            return this.s.pv;
+            return this.s.v;
         }
         function opacityGetter(){
             if(this.o.k){
                 this.o.getValue();
             }
-            return this.o.pv;
+            return this.o.v;
         }
         function skewGetter(){
             if(this.sk.k){
                 this.sk.getValue();
             }
-            return this.sk.pv;
+            return this.sk.v;
         }
         function skewAxisGetter(){
             if(this.sa.k){
                 this.sa.getValue();
             }
-            return this.sa.pv;
+            return this.sa.v;
         }
-        function applyToMatrix(mat, processExpressions){
+        function applyToMatrix(mat){
             var i, len = this.dynamicProperties.length;
-
-            if(processExpressions){
-                for(i=0;i<len;i+=1){
-                    this.dynamicProperties[i].getValue();
-                    if(this.dynamicProperties[i].mdf){
-                        this.mdf = true;
-                    }
+            for(i=0;i<len;i+=1){
+                this.dynamicProperties[i].getValue();
+                if(this.dynamicProperties[i].mdf){
+                    this.mdf = true;
                 }
-                if(this.a){
-                    mat.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]);
+            }
+            if(this.a){
+                mat.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]);
+            }
+            if(this.s){
+                mat.scale(this.s.v[0],this.s.v[1],this.s.v[2]);
+            }
+            if(this.r){
+                mat.rotate(-this.r.v);
+            }else{
+                mat.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]);
+            }
+            if(this.data.p.s){
+                if(this.data.p.z) {
+                    mat.translate(this.px.v, this.py.v, -this.pz.v);
+                } else {
+                    mat.translate(this.px.v, this.py.v, 0);
                 }
-                if(this.s){
-                    mat.scale(this.s.v[0],this.s.v[1],this.s.v[2]);
-                }
-                if(this.r){
-                    mat.rotate(-this.r.v);
-                }else{
-                    mat.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]);
-                }
-                if(this.data.p.s){
-                    if(this.data.p.z) {
-                        mat.translate(this.px.v, this.py.v, -this.pz.v);
-                    } else {
-                        mat.translate(this.px.v, this.py.v, 0);
-                    }
-                }else{
-                    mat.translate(this.p.v[0],this.p.v[1],-this.p.v[2]);
-                }
-            } else {
-
-                if(this.a){
-                    mat.translate(-this.a.pv[0],-this.a.pv[1],this.a.pv[2]);
-                }
-                if(this.s){
-                    mat.scale(this.s.pv[0],this.s.pv[1],this.s.pv[2]);
-                }
-                if(this.r){
-                    mat.rotate(-this.r.pv);
-                }else{
-                    mat.rotateZ(-this.rz.pv).rotateY(this.ry.pv).rotateX(this.rx.pv).rotateZ(-this.or.pv[2]).rotateY(this.or.pv[1]).rotateX(this.or.pv[0]);
-                }
-                if(this.data.p.s){
-                    if(this.data.p.z) {
-                        mat.translate(this.px.pv, this.py.pv, -this.pz.pv);
-                    } else {
-                        mat.translate(this.px.pv, this.py.pv, 0);
-                    }
-                }else{
-                    mat.translate(this.p.pv[0],this.p.pv[1],-this.p.pv[2]);
-                }
+            }else{
+                mat.translate(this.p.v[0],this.p.v[1],-this.p.v[2]);
             }
         }
         function processKeys(){
@@ -641,7 +617,6 @@
                 return;
             }
             this.mdf = false;
-            this.frameId = this.elem.globalData.frameId;
             var i, len = this.dynamicProperties.length;
 
             for(i=0;i<len;i+=1){
@@ -676,6 +651,7 @@
                     this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2]);
                 }
             }
+            this.frameId = this.elem.globalData.frameId;
         }
 
         function setInverted(){
diff --git a/player/js/utils/expressions/ExpressionManager.js b/player/js/utils/expressions/ExpressionManager.js
index 6f5947b..3688f72 100644
--- a/player/js/utils/expressions/ExpressionManager.js
+++ b/player/js/utils/expressions/ExpressionManager.js
@@ -1,6 +1,21 @@
 var ExpressionManager = (function(){
     var ob = {};
 
+    function duplicatePropertyValue(value){
+        if(typeof value === 'number'){
+            return value;
+        }else if(value.i){
+            return JSON.parse(JSON.stringify(value));
+        }else{
+            var arr = Array.apply(null,{length:value.length});
+            var i, len = value.length;
+            for(i=0;i<len;i+=1){
+                arr[i]=value[i];
+            }
+            return arr;
+        }
+    }
+
     function sum(a,b) {
         var tOfA = typeof a;
         var tOfB = typeof b;
@@ -128,7 +143,7 @@
     }
 
     function length(arr1,arr2){
-        var i,len = arr1.length;
+        var i,len = Math.min(arr1.length,arr2.length);
         var addedLength = 0;
         for(i=0;i<len;i+=1){
             addedLength += Math.pow(arr2[i]-arr1[i],2);
@@ -371,7 +386,18 @@
         }.bind(this);
 
         function effect(nm){
-            return elem.effectsManager.getEffect(nm);
+            return elem.effectsManager(nm);
+        }
+
+        function lookAt(elem1,elem2){
+            var fVec = [elem2[0]-elem1[0],elem2[1]-elem1[1],elem2[2]-elem1[2]];
+            var pitch = Math.atan2(fVec[0],Math.sqrt(fVec[1]*fVec[1]+fVec[2]*fVec[2]))/degToRads;
+            var yaw = -Math.atan2(fVec[1],fVec[2])/degToRads;
+            return [yaw,pitch,0];
+        }
+
+        function easeOut(t, val1, val2){
+            return -(val2-val1) * t*(t-2) + val1;
         }
 
         function nearestKey(time){
@@ -425,7 +451,14 @@
         var time, value,textIndex,textTotal,selectorValue, index = elem.data.ind + 1;
         var hasParent = !!(elem.hierarchy && elem.hierarchy.length);
         function execute(){
-            seedRandom(0);
+            //seedRandom(0);
+            if(this.frameExpressionId === elem.globalData.frameId){
+                return;
+            }
+            if(this.lock){
+                this.v = duplicatePropertyValue(this.pv);
+                return true;
+            }
             if(this.type === 'textSelector'){
                 textIndex = this.textIndex;
                 textTotal = this.textTotal;
@@ -437,20 +470,22 @@
             if(!content && elem.content){
                 content = elem.content.bind(elem);
             }
+            this.lock = true;
             if(this.getPreValue){
                 this.getPreValue();
             }
             value = this.pv;
             time = this.comp.renderedFrame/this.comp.globalData.frameRate;
             bindedFn();
+            this.frameExpressionId = elem.globalData.frameId;
             var i,len;
             if(this.mult){
                 if(typeof this.v === 'number'){
                     this.v *= this.mult;
                 }else{
-                    /*if(!this.v) {
-                        //console.log(val);
-                    }*/
+                    if(!this.v) {
+                        console.log(val);
+                    }
                     len = this.v.length;
                     if(value === this.v){
                         this.v = len === 2 ? [value[0],value[1]] : [value[0],value[1],value[2]];
@@ -479,6 +514,7 @@
                     }
                 }
             }
+            this.lock = false;
         }
         return execute;
     }
diff --git a/player/js/utils/expressions/LayerInterface.js b/player/js/utils/expressions/LayerInterface.js
index 074cedb..cb6dfce 100644
--- a/player/js/utils/expressions/LayerInterface.js
+++ b/player/js/utils/expressions/LayerInterface.js
@@ -1,22 +1,22 @@
 function LayerInterface(){}
 
 LayerInterface.prototype.toWorld = function(arr) {
+    var finalMat = new Matrix();
+    this.finalTransform.mProp.applyToMatrix(finalMat);
     if(this.hierarchy && this.hierarchy.length){
-        var finalMat = new Matrix();
         var i, len = this.hierarchy.length;
-        this.finalTransform.mProp.applyToMatrix(finalMat,false);
         for(i=0;i<len;i+=1){
-            this.hierarchy[i].finalTransform.mProp.applyToMatrix(finalMat,true);
+            this.hierarchy[i].finalTransform.mProp.applyToMatrix(finalMat);
         }
-        var retArr = finalMat.applyToPointArray(arr[0],arr[1],arr[2]||0);
-        return retArr;
+        return finalMat.applyToPointArray(arr[0],arr[1],arr[2]||0);
     }
-    return arr;
+    return finalMat.applyToPointArray(arr[0],arr[1],arr[2]||0);
 };
 
 LayerInterface.prototype.effect = function(num) {
+    console.log(this);
     console.log(this.effectsManager);
     console.log(num);
 }
 
-extendPrototype(LayerInterface,BaseElement);
\ No newline at end of file
+extendPrototype(LayerInterface,BaseElement);
diff --git a/player/js/utils/functionExtensions.js b/player/js/utils/functionExtensions.js
index c1763cb..c312b24 100644
--- a/player/js/utils/functionExtensions.js
+++ b/player/js/utils/functionExtensions.js
@@ -2,7 +2,7 @@
     if(child){
         child.prototype = Object.create(parent.prototype);
         child.prototype.constructor = child;
-        child.prototype.parent = parent.prototype;
+        child.prototype._parent = parent.prototype;
     }else{
         var instance = Object.create(parent.prototype,params);
         var getType = {};