diff --git a/player/index.html b/player/index.html
index 0a741a6..3b6808f 100644
--- a/player/index.html
+++ b/player/index.html
@@ -166,6 +166,8 @@
     <script src="js/elements/pixiElements/PIXIShapeElement.js" data-light-skip="true"></script>
     <script src="js/elements/pixiElements/PIXICompElement.js" data-light-skip="true"></script>
     <script src="js/elements/pixiElements/PIXIMask.js" data-light-skip="true"></script>
+    <script src="js/elements/pixiElements/PIXIEffects.js"></script>
+    <script src="js/elements/pixiElements/effects/PIXIGaussianBlurEffect.js"></script>
     <script src="js/animation/AnimationManager.js"></script>
     <script src="js/animation/AnimationItem.js"></script>
     <!-- Expressions -->
@@ -195,6 +197,13 @@
 <body>
 <div id="lottie"></div>
 
+<script id="shader" type="shader">
+
+void main(){
+   gl_FragColor = vec4(1.0,1.0,1.0,1.0);
+}
+</script>
+
 <script>
     var anim;
     var elem = document.getElementById('lottie');
@@ -202,7 +211,7 @@
     var animData = {
         container: elem,
         renderer: 'pixi',
-        loop: false,
+        loop: true,
         autoplay: true,
         rendererSettings: {
             progressiveLoad:false,
diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js
index 74ae6af..f09eb50 100644
--- a/player/js/animation/AnimationItem.js
+++ b/player/js/animation/AnimationItem.js
@@ -544,6 +544,7 @@
 
 AnimationItem.prototype.getAssetsPath = function (assetData) {
     var path = '';
+    console.log('getAssetsPath')
     if(this.assetsPath){
         var imagePath = assetData.p;
         if(imagePath.indexOf('images/') !== -1){
diff --git a/player/js/elements/pixiElements/PIXIBaseElement.js b/player/js/elements/pixiElements/PIXIBaseElement.js
index 1c54fa6..e2bd947 100644
--- a/player/js/elements/pixiElements/PIXIBaseElement.js
+++ b/player/js/elements/pixiElements/PIXIBaseElement.js
@@ -14,7 +14,6 @@
         this.layerElement = new PIXI.DisplayObjectContainer();
     },
     createContainerElements: function(){
-        this.matteElement = createNS('g');
         this.transformedElement = this.layerElement;
         this.maskedElement = this.layerElement;
         this._sizeChanged = false;
@@ -23,93 +22,17 @@
         var filId, fil, gg;
         if (this.data.td) {
             if (this.data.td == 3 || this.data.td == 1) {
-                var masker = createNS('mask');
-                masker.setAttribute('id', this.layerId);
-                masker.setAttribute('mask-type', this.data.td == 3 ? 'luminance' : 'alpha');
-                masker.appendChild(this.layerElement);
-                layerElementParent = masker;
-                this.globalData.defs.appendChild(masker);
-                // This is only for IE and Edge when mask if of type alpha
-                if (!featureSupport.maskType && this.data.td == 1) {
-                    masker.setAttribute('mask-type', 'luminance');
-                    filId = randomString(10);
-                    fil = filtersFactory.createFilter(filId);
-                    this.globalData.defs.appendChild(fil);
-                    fil.appendChild(filtersFactory.createAlphaToLuminanceFilter());
-                    gg = createNS('g');
-                    gg.appendChild(this.layerElement);
-                    layerElementParent = gg;
-                    masker.appendChild(gg);
-                    gg.setAttribute('filter','url(' + locationHref + '#' + filId + ')');
-                }
             } else if(this.data.td == 2) {
-                var maskGroup = createNS('mask');
-                maskGroup.setAttribute('id', this.layerId);
-                maskGroup.setAttribute('mask-type','alpha');
-                var maskGrouper = createNS('g');
-                maskGroup.appendChild(maskGrouper);
-                filId = randomString(10);
-                fil = filtersFactory.createFilter(filId);
-                ////
-
-                var feColorMatrix = createNS('feColorMatrix');
-                feColorMatrix.setAttribute('type', 'matrix');
-                feColorMatrix.setAttribute('color-interpolation-filters', 'sRGB');
-                feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1');
-                fil.appendChild(feColorMatrix);
-
-                this.globalData.defs.appendChild(fil);
-                var alphaRect = createNS('rect');
-                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');
-                alphaRect.setAttribute('opacity','0');
-                maskGrouper.setAttribute('filter', 'url(' + locationHref + '#'+filId+')');
-                maskGrouper.appendChild(alphaRect);
-                maskGrouper.appendChild(this.layerElement);
-                layerElementParent = maskGrouper;
-                if (!featureSupport.maskType) {
-                    maskGroup.setAttribute('mask-type', 'luminance');
-                    fil.appendChild(filtersFactory.createAlphaToLuminanceFilter());
-                    gg = createNS('g');
-                    maskGrouper.appendChild(alphaRect);
-                    gg.appendChild(this.layerElement);
-                    layerElementParent = gg;
-                    maskGrouper.appendChild(gg);
-                }
-                this.globalData.defs.appendChild(maskGroup);
             }
         } else if (this.data.tt) {
-            this.matteElement.appendChild(this.layerElement);
-            layerElementParent = this.matteElement;
-            this.baseElement = this.matteElement;
         } else {
             this.baseElement = this.layerElement;
-            this.PBaseElement = this.PLayerElement;
-        }
-        if (this.data.ln) {
-            this.layerElement.setAttribute('id', this.data.ln);
-        }
-        if (this.data.cl) {
-            this.layerElement.setAttribute('class', this.data.cl);
         }
         //Clipping compositions to hide content that exceeds boundaries. If collapsed transformations is on, component should not be clipped
         if (this.data.ty === 0 && !this.data.hd) {
-            var cp = createNS( 'clipPath');
-            var pt = createNS('path');
-            pt.setAttribute('d','M0,0 L' + this.data.w + ',0' + ' L' + this.data.w + ',' + this.data.h + ' L0,' + this.data.h + 'z');
-            var clipId = 'cp_'+randomString(8);
-            cp.setAttribute('id',clipId);
-            cp.appendChild(pt);
-            this.globalData.defs.appendChild(cp);
+            //Todo Clip compositions
 
             if (this.checkMasks()) {
-                var cpGroup = createNS('g');
-                cpGroup.setAttribute('clip-path','url(' + locationHref + '#'+clipId + ')');
-                cpGroup.appendChild(this.layerElement);
-                this.transformedElement = cpGroup;
                 if (layerElementParent) {
                     layerElementParent.appendChild(this.transformedElement);
                 } else {
@@ -121,9 +44,9 @@
             
         }
         if (this.data.bm !== 0) {
-            this.setBlendMode();
+            //this.setBlendMode();
         }
-        this.renderableEffectsManager = new SVGEffects(this);
+        this.renderableEffectsManager = new PIXIEffects(this);
     },
     renderInnerContent: function() {},
     renderFrame: function() {
@@ -169,7 +92,7 @@
 };
 
 PIXIBaseElement.prototype.getBaseElement = function(){
-    return this.PBaseElement;
+    return this.baseElement;
 };
 PIXIBaseElement.prototype.addMasks = function(){
     this.maskManager = new PIXIMaskElement(this.data, this, this.globalData);
@@ -182,27 +105,17 @@
     this.matteElement.setAttribute("mask", "url(#" + id + ")");
 };
 
-PIXIBaseElement.prototype.setMatte = function(id){
-    if(!this.matteElement){
-        return;
-    }
-    this.matteElement.setAttribute("mask", "url(#" + id + ")");
-};
-
 PIXIBaseElement.prototype.show = function(){
     if (this.isInRange && !this.isTransparent){
         this.hidden = false;
         this._isFirstFrame = true;
+        this.layerElement.visible = true;
     }
 };
 
 PIXIBaseElement.prototype.hide = function(){
-
-};
-
-PIXIBaseElement.prototype.prepareFrame = function(num){
-    this._mdf = false;
-    this.prepareRenderableFrame(num);
-    this.prepareProperties(num, this.isInRange);
-    this.checkTransparency();
+    if (!this.hidden && (!this.isInRange || this.isTransparent)) {
+        this.layerElement.visible = false;
+        this.hidden = true;
+    }
 };
\ No newline at end of file
diff --git a/player/js/elements/pixiElements/PIXICompElement.js b/player/js/elements/pixiElements/PIXICompElement.js
index 35e7e85..e0ee205 100644
--- a/player/js/elements/pixiElements/PIXICompElement.js
+++ b/player/js/elements/pixiElements/PIXICompElement.js
@@ -7,4 +7,13 @@
     this.tm = data.tm ? PropertyFactory.getProp(this,data.tm,0,globalData.frameRate, this) : {_placeholder:true};
 }
 
-extendPrototype([PIXIRenderer, ICompElement, PIXIBaseElement], PIXICompElement);
\ No newline at end of file
+extendPrototype([PIXIRenderer, ICompElement, PIXIBaseElement], PIXICompElement);
+
+PIXICompElement.prototype.renderInnerContent = function() {
+    var i,len = this.layers.length;
+    for( i = len - 1; i >= 0; i -= 1 ){
+        if(this.completeLayers || this.elements[i]){
+            this.elements[i].renderFrame();
+        }
+    }
+};
\ No newline at end of file
diff --git a/player/js/elements/pixiElements/PIXIEffects.js b/player/js/elements/pixiElements/PIXIEffects.js
new file mode 100644
index 0000000..cb1e5ac
--- /dev/null
+++ b/player/js/elements/pixiElements/PIXIEffects.js
@@ -0,0 +1,31 @@
+function PIXIEffects(elem){
+    var i, len = elem.data.ef ? elem.data.ef.length : 0;
+    var count = 0;
+    this.filters = [];
+    var filterManager;
+    for(i = 0; i < len; i += 1) {
+        filterManager = null;
+        if (elem.data.ef[i].ty === 29) {
+            filterManager = new PIXIGaussianBlurEffect(elem.effectsManager.effectElements[i]);
+        }
+        if (filterManager) {
+            this.filters.push(filterManager);
+        }
+    }
+    if (this.filters.length) {
+        var i, len = this.filters.length;
+        var pixiFilters = [];
+        for(i = 0; i < len ; i += 1) {
+            pixiFilters.push(this.filters[i].pixiFilter);
+        }
+        elem.layerElement.filters = pixiFilters;
+        elem.addRenderableComponent(this);
+    }
+}
+
+PIXIEffects.prototype.renderFrame = function(_isFirstFrame){
+    var i, len = this.filters.length;
+    for(i=0;i<len;i+=1){
+        this.filters[i].renderFrame(_isFirstFrame);
+    }
+};
\ No newline at end of file
diff --git a/player/js/elements/pixiElements/PIXIImageElement.js b/player/js/elements/pixiElements/PIXIImageElement.js
index 9fe6832..e4da173 100644
--- a/player/js/elements/pixiElements/PIXIImageElement.js
+++ b/player/js/elements/pixiElements/PIXIImageElement.js
@@ -1,60 +1,28 @@
-function PIXIImageElement(data,parentContainer,globalData,comp,placeholder){
+function PIXIImageElement(data,globalData,comp){
     this.assetData = globalData.getAssetData(data.refId);
-    this._parent.constructor.call(this,data,parentContainer,globalData,comp,placeholder);
+    this.initElement(data,globalData,comp);
 }
 extendPrototype([BaseElement, TransformElement, PIXIBaseElement, HierarchyElement, FrameElement, RenderableElement], PIXIImageElement);
 
-PIXIImageElement.prototype.createElements = function(){
-
+PIXIImageElement.prototype.createContent = function(){
     var assetPath = this.globalData.getAssetsPath(this.assetData);
-
-    this._parent.createElements.call(this);
-
-    this.innerElem = document.createElementNS(svgNS,'image');
-    this.innerElem.setAttribute('width',this.assetData.w+"px");
-    this.innerElem.setAttribute('height',this.assetData.h+"px");
-    this.innerElem.setAttribute('preserveAspectRatio','xMidYMid slice');
-    this.innerElem.setAttributeNS('http://www.w3.org/1999/xlink','href',assetPath);
-    this.maskedElement = this.innerElem;
-    this.layerElement.appendChild(this.innerElem);
-    if(this.data.ln){
-        this.innerElem.setAttribute('id',this.data.ln);
-    }
-    if(this.data.cl){
-        this.innerElem.setAttribute('class',this.data.cl);
-    }
-
     var texture = PIXI.Texture.fromImage(assetPath);
-    this.PInnerElem = new PIXI.Sprite(texture);
-    this.PLayerElement.addChild(this.PInnerElem);
+    this.innerElem = new PIXI.Sprite(texture);
+    this.layerElement.addChild(this.innerElem);
 
 };
 
-PIXIImageElement.prototype.hide = function(){
-    if(!this.hidden){
-        this.innerElem.style.display = 'none';
-        this.PLayerElement.visible = false;
-        this.hidden = true;
-    }
-};
+PIXIImageElement.prototype.initElement = function(data,globalData,comp) {
+    this.initFrame();
+    this.initBaseData(data, globalData, comp);
+    this.initTransform(data, globalData, comp);
+    this.initHierarchy();
+    this.initRenderable();
+    this.initRendererElement();
+    this.createContainerElements();
+    this.addMasks();
+    this.createContent();
+    this.hide();
+}
 
-PIXIImageElement.prototype.renderFrame = function(parentMatrix){
-    var renderParent = this._parent.renderFrame.call(this,parentMatrix);
-    if(renderParent===false){
-        this.hide();
-        return;
-    }
-    if(this.hidden){
-        this.hidden = false;
-        this.innerElem.style.display = 'block';
-        this.PLayerElement.visible = true;
-    }
-    if(this.firstFrame){
-        this.firstFrame = false;
-    }
-};
-
-PIXIImageElement.prototype.destroy = function(){
-    this._parent.destroy.call();
-    this.innerElem =  null;
-};
\ No newline at end of file
+PIXIImageElement.prototype.prepareFrame = IImageElement.prototype.prepareFrame;
\ No newline at end of file
diff --git a/player/js/elements/pixiElements/PIXIMask.js b/player/js/elements/pixiElements/PIXIMask.js
index 1e69d83..695d99d 100644
--- a/player/js/elements/pixiElements/PIXIMask.js
+++ b/player/js/elements/pixiElements/PIXIMask.js
@@ -146,9 +146,8 @@
     }
 
     if(count > 0){
-        this.element.maskedElement.setAttribute(maskRef, "url(#" + layerId + ")");
-        this.element.PMaskedElement.mask = currentPMasks[0];
-        this.element.PMaskedElement.addChild(currentPMasks[0]);
+        this.element.maskedElement.mask = currentPMasks[0];
+        this.element.maskedElement.addChild(currentPMasks[0]);
     }
     if (this.viewData.length) {
         this.element.addRenderableComponent(this);
diff --git a/player/js/elements/pixiElements/PIXIShapeElement.js b/player/js/elements/pixiElements/PIXIShapeElement.js
index 3b8329e..9cf2369 100644
--- a/player/js/elements/pixiElements/PIXIShapeElement.js
+++ b/player/js/elements/pixiElements/PIXIShapeElement.js
@@ -44,7 +44,7 @@
 PIXIShapeElement.prototype.buildExpressionInterface = function(){};
 
 PIXIShapeElement.prototype.createContent = function(){
-    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.PLayerElement, 0, [], true);
+    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement, 0, [], true);
     this.filterUniqueShapes();
 };
 
diff --git a/player/js/elements/pixiElements/PIXISolidElement.js b/player/js/elements/pixiElements/PIXISolidElement.js
index 9b6af4b..0317beb 100644
--- a/player/js/elements/pixiElements/PIXISolidElement.js
+++ b/player/js/elements/pixiElements/PIXISolidElement.js
@@ -21,4 +21,6 @@
     this.addMasks();
     this.createContent();
     this.hide();
-}
\ No newline at end of file
+}
+
+PIXISolidElement.prototype.prepareFrame = IImageElement.prototype.prepareFrame;
\ No newline at end of file
diff --git a/player/js/elements/pixiElements/effects/PIXIGaussianBlurEffect.js b/player/js/elements/pixiElements/effects/PIXIGaussianBlurEffect.js
new file mode 100644
index 0000000..28019d7
--- /dev/null
+++ b/player/js/elements/pixiElements/effects/PIXIGaussianBlurEffect.js
@@ -0,0 +1,26 @@
+function PIXIGaussianBlurEffect(filterManager){
+    this.filterManager = filterManager;
+    this.pixiFilter = new PIXI.filters.BlurFilter(0, 10, 1, 5);
+}
+
+PIXIGaussianBlurEffect.prototype.renderFrame = function(forceRender){
+    if(forceRender || this.filterManager._mdf){
+        if(forceRender || this.filterManager.effectElements[0]._mdf || this.filterManager.effectElements[1]._mdf) {
+            var blurStrength = this.filterManager.effectElements[0].p.v;
+            switch(this.filterManager.effectElements[1].p.v) {
+                case 1:
+                    this.pixiFilter.blurX = blurStrength;
+                    this.pixiFilter.blurY = blurStrength;
+                    break;
+                case 2:
+                    this.pixiFilter.blurX = blurStrength;
+                    this.pixiFilter.blurY = 0;
+                    break;
+                case 3:
+                    this.pixiFilter.blurX = 0;
+                    this.pixiFilter.blurY = blurStrength;
+                    break;
+            }
+        }
+    }
+};
\ No newline at end of file
diff --git a/player/js/renderers/PIXIRenderer.js b/player/js/renderers/PIXIRenderer.js
index 8c1f3a6..aa1388b 100644
--- a/player/js/renderers/PIXIRenderer.js
+++ b/player/js/renderers/PIXIRenderer.js
@@ -36,7 +36,6 @@
 
 PIXIRenderer.prototype.createComp = function (data) {
     return new PIXICompElement(data,this.globalData,this);
-
 };
 
 PIXIRenderer.prototype.createSolid = function (data) {
@@ -64,20 +63,19 @@
     //this.animationItem.wrapper.appendChild(this.layerElement);
     ///
     this.renderer = new PIXI.WebGLRenderer(animData.w, animData.h,{antialias:true,transparent:true});
-    //this.renderer.view.style.transform = 'scale(0.5,0.5)';
+    this.renderer.view.style.transform = 'scale(0.5,0.5)';
     this.renderer.view.style.transformOrigin = '0 0';
     this.animationItem.wrapper.appendChild(this.renderer.view);
     this.stage = new PIXI.Container();
-    this.PLayerElement = this.stage;
+    this.layerElement = this.stage;
 
     ///
     //Mask animation
     var defs = document.createElementNS(svgNS, 'defs');
     this.globalData.defs = defs;
-    this.layerElement.appendChild(defs);
     this.globalData.getAssetData = this.animationItem.getAssetData.bind(this.animationItem);
     this.globalData.getAssetsPath = this.animationItem.getAssetsPath.bind(this.animationItem);
-    this.globalData.progressiveLoad = this.renderConfig.progressiveLoad;
+    this.globalData.renderConfig = this.renderConfig;
     this.globalData.frameId = 0;
     this.globalData.compSize = {
         w: animData.w,
@@ -85,7 +83,9 @@
     };
     this.data = animData;
     this.globalData.frameRate = animData.fr;
-    var maskElement = document.createElementNS(svgNS, 'clipPath');
+
+    //Todo mask main container and remove this block of code
+    /*var maskElement = document.createElementNS(svgNS, 'clipPath');
     var rect = document.createElementNS(svgNS,'rect');
     rect.setAttribute('width',animData.w);
     rect.setAttribute('height',animData.h);
@@ -98,7 +98,8 @@
     maskedElement.setAttribute("clip-path", "url(#"+maskId+")");
     this.layerElement.appendChild(maskedElement);
     defs.appendChild(maskElement);
-    this.layerElement = maskedElement;
+    this.layerElement = maskedElement;*/
+
     this.layers = animData.layers;
     this.globalData.fontManager = new FontManager();
     this.globalData.fontManager.addChars(animData.chars);
@@ -198,10 +199,10 @@
         i += 1;
     }
     if(nextElement){
-        var index = this.PLayerElement.getChildIndex(nextElement);
-        this.PLayerElement.addChildAt(newElement,index);
+        var index = this.layerElement.getChildIndex(nextElement);
+        this.layerElement.addChildAt(newElement,index);
     } else {
-        this.PLayerElement.addChild(newElement);
+        this.layerElement.addChild(newElement);
     }
 };
 
diff --git a/player/js/utils/shapes/shapePathBuilder.js b/player/js/utils/shapes/shapePathBuilder.js
index 67ff949..c68e21a 100644
--- a/player/js/utils/shapes/shapePathBuilder.js
+++ b/player/js/utils/shapes/shapePathBuilder.js
@@ -41,5 +41,19 @@
             c:mat.applyToPointArray(_o[i - 1][0], _o[i - 1][1], 0).concat(mat.applyToPointArray(_i[0][0], _i[0][1], 0)).concat(mat.applyToPointArray(_v[0][0], _v[0][1], 0))
         })
     }
+
+    //Fix for shapes with no length.
+    //Todo: search a better solution. AE draws a point on this cases so the shape can't be removed.
+    if(_PIXIcommands.length === 2 
+        && _PIXIcommands[0].c[0] === _PIXIcommands[1].c[0]
+        && _PIXIcommands[0].c[1] === _PIXIcommands[1].c[1]
+        && _PIXIcommands[0].c[0] === _PIXIcommands[1].c[3]
+        && _PIXIcommands[0].c[1] === _PIXIcommands[1].c[4]
+        && _PIXIcommands[0].c[0] === _PIXIcommands[1].c[6]
+        && _PIXIcommands[0].c[1] === _PIXIcommands[1].c[7]
+        ) {
+        _PIXIcommands[1].c[6] += 0.5;
+        _PIXIcommands[1].c[7] += 0.5;
+    }
     return _PIXIcommands;
 };
\ No newline at end of file
