diff --git a/extension/jsx/utils/textHelper.jsx b/extension/jsx/utils/textHelper.jsx
index f1cdffa..c5afbe8 100644
--- a/extension/jsx/utils/textHelper.jsx
+++ b/extension/jsx/utils/textHelper.jsx
@@ -23,49 +23,70 @@
         }
     }
     
-    function exportTextDocumentData(layerInfo, ob) {
-        
-        var textDocument = layerInfo.property("Source Text").value;
-        if (textDocument.boxText) {
-            ob.sz = textDocument.boxTextSize;
-            ob.ps = textDocument.boxTextPos;
+    function exportTextDocumentData(layerInfo, data, frameRate) {
+
+        var sourceTextProp = layerInfo.property("Source Text");
+        bm_expressionHelper.checkExpression(sourceTextProp, data);
+        var arr = [];
+        data.k = arr;
+        var numKeys = sourceTextProp.numKeys;
+        var j, jLen = numKeys ? numKeys : 1;
+        if(jLen === 0){
+            jLen = 1;
         }
-        var i, len;
-        ob.s = textDocument.fontSize;
-        ob.f = textDocument.font;
-        bm_sourceHelper.addFont(textDocument.font, textDocument.fontFamily, textDocument.fontStyle);
-        if(textDocument.allCaps){
-            ob.t = textDocument.text.toUpperCase();
-        } else {
-            ob.t = textDocument.text;
-        }
-        len = ob.t.length;
-        bm_textShapeHelper.addTextLayer(layerInfo);
-        ob.j = getJustification(textDocument.justification);
-        ob.tr = textDocument.tracking;
-        if(textDocument.baselineLocs && textDocument.baselineLocs.length > 5){
-            ob.lh = textDocument.baselineLocs[5] - textDocument.baselineLocs[1];
-        } else {
-            ob.lh = ob.s*1.2;
-        }
-        if (textDocument.applyFill) {
-            len = textDocument.fillColor.length;
-            ob.fc = [];
-            for (i = 0; i < len; i += 1) {
-                ob.fc[i] = Math.round(100*textDocument.fillColor[i])/100;
+        for(j=0;j<jLen;j+=1){
+            var ob = {};
+            var textDocument, time;
+            if(numKeys === 0){
+                time = 0;
+                textDocument = sourceTextProp.value;
+            } else {
+                time = sourceTextProp.keyTime(j + 1);
+                textDocument = sourceTextProp.keyValue(j + 1);
             }
-        }
-        if (textDocument.applyStroke) {
-            len = textDocument.strokeColor.length;
-            ob.sc = [];
-            for (i = 0; i < len; i += 1) {
-                ob.sc[i] = Math.round(100*textDocument.strokeColor[i])/100;
+            if (textDocument.boxText) {
+                ob.sz = textDocument.boxTextSize;
+                ob.ps = textDocument.boxTextPos;
             }
-            ob.sw = textDocument.strokeWidth;
+            var i, len;
+            ob.s = textDocument.fontSize;
+            ob.f = textDocument.font;
+            bm_sourceHelper.addFont(textDocument.font, textDocument.fontFamily, textDocument.fontStyle);
+            if(textDocument.allCaps){
+                ob.t = textDocument.text.toUpperCase();
+            } else {
+                ob.t = textDocument.text;
+            }
+            len = ob.t.length;
+            ob.j = getJustification(textDocument.justification);
+            ob.tr = textDocument.tracking;
+            if(textDocument.baselineLocs && textDocument.baselineLocs.length > 5){
+                ob.lh = textDocument.baselineLocs[5] - textDocument.baselineLocs[1];
+            } else {
+                ob.lh = ob.s*1.2;
+            }
             if (textDocument.applyFill) {
-                ob.of = textDocument.strokeOverFill;
+                len = textDocument.fillColor.length;
+                ob.fc = [];
+                for (i = 0; i < len; i += 1) {
+                    ob.fc[i] = Math.round(100*textDocument.fillColor[i])/100;
+                }
             }
+            if (textDocument.applyStroke) {
+                len = textDocument.strokeColor.length;
+                ob.sc = [];
+                for (i = 0; i < len; i += 1) {
+                    ob.sc[i] = Math.round(100*textDocument.strokeColor[i])/100;
+                }
+                ob.sw = textDocument.strokeWidth;
+                if (textDocument.applyFill) {
+                    ob.of = textDocument.strokeOverFill;
+                }
+            }
+            arr.push({s:ob,t:time*frameRate});
         }
+        bm_textShapeHelper.addTextLayer(layerInfo);
+
     }
     
     function exportTextPathData(pathOptions, ob, masksProperties, frameRate) {
@@ -103,7 +124,7 @@
             p: {},
             m: {}
         };
-        exportTextDocumentData(layerInfo, layerOb.t.d);
+        exportTextDocumentData(layerInfo, layerOb.t.d, frameRate);
         var textProperty = layerInfo.property("Text");
         
         var i, len = textProperty.numProperties;
diff --git a/extension/jsx/utils/textShapeHelper.jsx b/extension/jsx/utils/textShapeHelper.jsx
index 48be63d..1d27bb4 100644
--- a/extension/jsx/utils/textShapeHelper.jsx
+++ b/extension/jsx/utils/textShapeHelper.jsx
@@ -94,7 +94,7 @@
         resetProp(textLayer.transform.rotation, 0);
     }
     
-    function createNewChar(layerInfo, ch, charData) {
+    function createNewChar(layerInfo, originalTextDocument, ch, charData) {
             //"allCaps","applyFill","applyStroke","baselineLocs","baselineShift","boxText","boxTextPos","boxTextSize","fauxBold","fauxItalic","fillColor","font","fontFamily","fontLocation","fontSize","fontStyle","horizontalScale","justification","pointText","resetCharStyle","resetParagraphStyle","smallCaps","strokeColor","strokeOverFill","strokeWidth","subscript","superscript","text","tracking","tsume","verticalScale"
         if (ch.charCodeAt(0) === 13) {
             return;
@@ -103,7 +103,6 @@
         var l, lLen;
         var cmdID = bm_projectManager.getCommandID('shapesFromText');
         layerInfo.copyToComp(comp);
-        var originalTextDocument = layerInfo.property('Source Text').value;
         //var dupl = comp.layers[1];
         //var dupl = comp.layers.addText();
         //removeLayerAnimators(dupl);
@@ -162,40 +161,54 @@
     function exportChars(fonts) {
         
         comp.openInViewer();
-        var layerCollection = comp.layers;
         var i, len = layers.length, layerInfo;
+        var k, kLen;
         for (i = 0; i < len; i += 1) {
             layerInfo = layers[i];
             var textProp = layerInfo.property("Source Text");
-            var textDocument = textProp.value;
-            var font = textDocument.font;
-            var fontFamily = textDocument.fontFamily;
-            var fontStyle = textDocument.fontStyle;
-            var fontSize = textDocument.fontSize;
-            var text = textDocument.allCaps ? textDocument.text.toUpperCase() : textDocument.text;
-            var j, jLen = text.length;
-            
-            if (currentFont !== font) {
-                currentFont = font;
-                createNewChar(layerInfo, '[]', {});
+            kLen = textProp.numKeys;
+            var keysFlag = true;
+            if(kLen === 0){
+                kLen = 1;
+                keysFlag = false;
             }
-            var l, lLen;
-            for (j = 0; j < jLen; j += 1) {
-                var ch = text.substr(j, 1);
-                var charData = addChar(ch, fontSize, font, fontStyle);
-                if (charData !== false) {
-                    createNewChar(layerInfo, ch, charData);
-                    l = 0;
-                    lLen = fonts.list.length;
-                    while (l < lLen) {
-                        if (fonts.list[l].fName === charData.font) {
-                            charData.fFamily = fonts.list[l].fFamily;
-                            break;
+            var textDocument;
+            for(k=0;k<kLen;k+=1){
+                if(!keysFlag){
+                    textDocument = textProp.value;
+                } else {
+                    textDocument = textProp.keyValue(k + 1);
+                }
+                var font = textDocument.font;
+                var fontFamily = textDocument.fontFamily;
+                var fontStyle = textDocument.fontStyle;
+                var fontSize = textDocument.fontSize;
+                var text = textDocument.allCaps ? textDocument.text.toUpperCase() : textDocument.text;
+                var j, jLen = text.length;
+
+                if (currentFont !== font) {
+                    currentFont = font;
+                    createNewChar(layerInfo, textDocument, '[]', {});
+                }
+                var l, lLen;
+                for (j = 0; j < jLen; j += 1) {
+                    var ch = text.substr(j, 1);
+                    var charData = addChar(ch, fontSize, font, fontStyle);
+                    if (charData !== false) {
+                        createNewChar(layerInfo, textDocument, ch, charData);
+                        l = 0;
+                        lLen = fonts.list.length;
+                        while (l < lLen) {
+                            if (fonts.list[l].fName === charData.font) {
+                                charData.fFamily = fonts.list[l].fFamily;
+                                break;
+                            }
+                            l += 1;
                         }
-                        l += 1;
                     }
                 }
             }
+
         }
         
         bm_renderManager.setChars(chars);
diff --git a/player/index.html b/player/index.html
index 325ce15..0fb968d 100644
--- a/player/index.html
+++ b/player/index.html
@@ -11,9 +11,9 @@
         }
 
         #bodymovin{
-            background-color:#000;
-            width:100%;
-            height:100%;
+            background-color:#fff;
+            width:970px;
+            height:250px;
             /*width:800px;
             height:500px;*/
             display:block;
@@ -103,11 +103,11 @@
     var animData = {
         container: document.getElementById('bodymovin'),
         renderer: 'svg',
-        loop: false,
+        loop: true,
         autoplay: true,
         autoloadSegments: true,
         rendererSettings: {
-            progressiveLoad:true
+            progressiveLoad:false
         },
         path: 'exports/render/data.json'
     };
diff --git a/player/js/elements/TextElement.js b/player/js/elements/TextElement.js
index 647b1f3..a47cdf5 100644
--- a/player/js/elements/TextElement.js
+++ b/player/js/elements/TextElement.js
@@ -2,9 +2,10 @@
 }
 ITextElement.prototype.init = function(){
     this._parent.init.call(this);
+
     this.lettersChangedFlag = false;
+    this.currentTextDocumentData = {};
     var data = this.data;
-    this.renderedLetters = Array.apply(null,{length:data.t.d.l ? data.t.d.l.length : 0});
     this.viewData = {
         m:{
             a: PropertyFactory.getProp(this,data.t.m.a,1,0,this.dynamicProperties)
@@ -87,6 +88,25 @@
         this.maskPath = false;
     }
 };
+ITextElement.prototype.prepareFrame = function(num) {
+    var i = 0, len = this.data.t.d.k.length;
+    var textDocumentData = this.data.t.d.k[i].s;
+    i += 1;
+    while(i<len){
+        if(this.data.t.d.k[i].t > num){
+            break;
+        }
+        textDocumentData = this.data.t.d.k[i].s;
+        i += 1;
+    }
+    this.lettersChangedFlag = false;
+    if(textDocumentData !== this.currentTextDocumentData){
+        this.currentTextDocumentData = textDocumentData;
+        this.lettersChangedFlag = true;
+        this.buildNewText();
+    }
+    this._parent.prepareFrame.call(this, num);
+}
 
 ITextElement.prototype.createPathShape = function(matrixHelper, shapes) {
     var j,jLen = shapes.length;
@@ -114,7 +134,7 @@
     var data = this.data;
     var xPos,yPos;
     var i, len;
-    var documentData = data.t.d;
+    var documentData = this.currentTextDocumentData;
     var letters = documentData.l;
     if(this.maskPath) {
         var mask = this.viewData.p.m;
@@ -191,12 +211,11 @@
     len = letters.length;
     xPos = 0;
     yPos = 0;
-    var yOff = data.t.d.s*1.2*.714;
+    var yOff = documentData.s*1.2*.714;
     var firstLine = true;
     var renderedData = this.viewData, animatorProps, animatorSelector;
     var j, jLen;
     var lettersValue = Array.apply(null,{length:len}), letterValue;
-    this.lettersChangedFlag = false;
 
     jLen = renderedData.a.length;
     var lastLetter;
@@ -329,17 +348,17 @@
             }
             lineLength += letters[i].l/2;
             if(documentData.strokeWidthAnim) {
-                sw = data.t.d.sw || 0;
+                sw = documentData.sw || 0;
             }
             if(documentData.strokeColorAnim) {
-                if(data.t.d.sc){
-                    sc = [data.t.d.sc[0], data.t.d.sc[1], data.t.d.sc[2]];
+                if(documentData.sc){
+                    sc = [documentData.sc[0], documentData.sc[1], documentData.sc[2]];
                 }else{
                     sc = [0,0,0];
                 }
             }
             if(documentData.fillColorAnim) {
-                fc = [data.t.d.fc[0], data.t.d.fc[1], data.t.d.fc[2]];
+                fc = [documentData.fc[0], documentData.fc[1], documentData.fc[2]];
             }
             for(j=0;j<jLen;j+=1){
                 animatorProps = renderedData.a[j].a;
@@ -504,7 +523,7 @@
                 currentLength -= renderedData.m.a.v[0]*letters[i].an/200;
                 if(letters[i+1] && ind !== letters[i+1].ind){
                     currentLength += letters[i].an / 2;
-                    currentLength += documentData.tr/1000*data.t.d.s;
+                    currentLength += documentData.tr/1000*documentData.s;
                 }
             }else{
 
@@ -524,7 +543,7 @@
                 }
                 matrixHelper.translate(offf,0,0);
                 matrixHelper.translate(renderedData.m.a.v[0]*letters[i].an/200,renderedData.m.a.v[1]*yOff/100,0);
-                xPos += letters[i].l + documentData.tr/1000*data.t.d.s;
+                xPos += letters[i].l + documentData.tr/1000*documentData.s;
             }
             if(renderType === 'html'){
                 letterM = matrixHelper.toCSS();
@@ -550,7 +569,6 @@
                     letterValue = lastLetter;
                 }
             }
-
             this.renderedLetters[i] = letterValue;
         }
     }
diff --git a/player/js/elements/canvasElements/CVTextElement.js b/player/js/elements/canvasElements/CVTextElement.js
index 7a4947a..bdcf4fa 100644
--- a/player/js/elements/canvasElements/CVTextElement.js
+++ b/player/js/elements/canvasElements/CVTextElement.js
@@ -22,6 +22,7 @@
 CVTextElement.prototype.init = ITextElement.prototype.init;
 CVTextElement.prototype.getMeasures = ITextElement.prototype.getMeasures;
 CVTextElement.prototype.getMult = ITextElement.prototype.getMult;
+CVTextElement.prototype.prepareFrame = ITextElement.prototype.prepareFrame;
 
 CVTextElement.prototype.tHelper = document.createElement('canvas').getContext('2d');
 
@@ -29,7 +30,12 @@
 
     this._parent.createElements.call(this);
     //console.log('this.data: ',this.data);
-    var documentData = this.data.t.d;
+
+};
+
+CVTextElement.prototype.buildNewText = function(){
+    var documentData = this.currentTextDocumentData;
+    this.renderedLetters = Array.apply(null,{length:this.currentTextDocumentData.l ? this.currentTextDocumentData.l.length : 0});
 
     var hasFill = false;
     if(documentData.fc) {
@@ -57,6 +63,7 @@
     if (singleShape) {
         var xPos = 0, yPos = 0, lineWidths = documentData.lineWidths, boxWidth = documentData.boxWidth, firstLine = true;
     }
+    var cnt = 0;
     for (i = 0;i < len ;i += 1) {
         charData = this.globalData.fontManager.getCharData(documentData.t.charAt(i), fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily);
         var shapeData;
@@ -111,9 +118,14 @@
         if(singleShape){
             xPos += letters[i].l;
         }
-        this.textSpans.push({elem: commands});
+        if(this.textSpans[cnt]){
+            this.textSpans[cnt].elem = commands;
+        } else {
+            this.textSpans[cnt] = {elem: commands};
+        }
+        cnt +=1;
     }
-};
+}
 
 CVTextElement.prototype.renderFrame = function(parentMatrix){
     if(this._parent.renderFrame.call(this, parentMatrix)===false){
@@ -136,7 +148,7 @@
     var  i,len, j, jLen, k, kLen;
     var renderedLetters = this.renderedLetters;
 
-    var letters = this.data.t.d.l;
+    var letters = this.currentTextDocumentData.l;
 
     len = letters.length;
     var renderedLetter;
diff --git a/player/js/elements/htmlElements/HShapeElement.js b/player/js/elements/htmlElements/HShapeElement.js
index 7fad36d..3f5fcce 100644
--- a/player/js/elements/htmlElements/HShapeElement.js
+++ b/player/js/elements/htmlElements/HShapeElement.js
@@ -75,15 +75,18 @@
 
     if(this.isVisible && (this.elemMdf || this.firstFrame)){
         var boundingBox = this.shapeCont.getBBox();
+        var changed = false;
         if(this.currentBBox.w !== boundingBox.width){
             this.currentBBox.w = boundingBox.width;
             this.shapeCont.setAttribute('width',boundingBox.width);
+            changed = true;
         }
         if(this.currentBBox.h !== boundingBox.height){
             this.currentBBox.h = boundingBox.height;
             this.shapeCont.setAttribute('height',boundingBox.height);
+            changed = true;
         }
-        if(this.currentBBox.w !== boundingBox.width || this.currentBBox.h !== boundingBox.height  || this.currentBBox.x !== boundingBox.x  || this.currentBBox.y !== boundingBox.y){
+        if(changed  || this.currentBBox.x !== boundingBox.x  || this.currentBBox.y !== boundingBox.y){
             this.currentBBox.w = boundingBox.width;
             this.currentBBox.h = boundingBox.height;
             this.currentBBox.x = boundingBox.x;
diff --git a/player/js/elements/htmlElements/HTextElement.js b/player/js/elements/htmlElements/HTextElement.js
index f249baf..d215057 100644
--- a/player/js/elements/htmlElements/HTextElement.js
+++ b/player/js/elements/htmlElements/HTextElement.js
@@ -17,10 +17,10 @@
 HTextElement.prototype.init = ITextElement.prototype.init;
 HTextElement.prototype.getMeasures = ITextElement.prototype.getMeasures;
 HTextElement.prototype.createPathShape = ITextElement.prototype.createPathShape;
+HTextElement.prototype.prepareFrame = ITextElement.prototype.prepareFrame;
 
 HTextElement.prototype.createElements = function(){
     this.isMasked = this.checkMasks();
-    var documentData = this.data.t.d;
     var parent = document.createElement('div');
     styleDiv(parent);
     this.layerElement = parent;
@@ -43,6 +43,12 @@
     }
     this.baseElement = parent;
 
+
+};
+
+HTextElement.prototype.buildNewText = function(){
+    var documentData = this.currentTextDocumentData;
+    this.renderedLetters = Array.apply(null,{length:this.currentTextDocumentData.l ? this.currentTextDocumentData.l.length : 0});
     if(documentData.fc) {
         this.innerElem.style.color = this.innerElem.style.fill = 'rgb(' + Math.round(documentData.fc[0]*255) + ',' + Math.round(documentData.fc[1]*255) + ',' + Math.round(documentData.fc[2]*255) + ')';
         ////this.innerElem.setAttribute('fill', 'rgb(' + documentData.fc[0] + ',' + documentData.fc[1] + ',' + documentData.fc[2] + ')');
@@ -75,34 +81,48 @@
     }
     var i, len;
 
-
-
     var letters = documentData.l;
     len = letters.length;
     var tSpan,tParent,tCont;
     var matrixHelper = this.mHelper;
     var shapes, shapeStr = '';
+    var cnt = 0;
     for (i = 0;i < len ;i += 1) {
         if(this.globalData.fontManager.chars){
-            tSpan = document.createElementNS(svgNS,'path');
-            if(!this.isMasked){
-                tParent = document.createElement('div');
-                tCont = document.createElementNS(svgNS,'svg');
-                tCont.appendChild(tSpan);
-                styleDiv(tParent);
+            if(!this.textPaths[cnt]){
+                tSpan = document.createElementNS(svgNS,'path');
+                tSpan.setAttribute('stroke-linecap', 'butt');
+                tSpan.setAttribute('stroke-linejoin','round');
+                tSpan.setAttribute('stroke-miterlimit','4');
+            } else {
+                tSpan = this.textPaths[cnt];
             }
-            tSpan.setAttribute('stroke-linecap', 'butt');
-            tSpan.setAttribute('stroke-linejoin','round');
-            tSpan.setAttribute('stroke-miterlimit','4');
+            if(!this.isMasked){
+                if(this.textSpans[cnt]){
+                    tParent = this.textSpans[cnt];
+                    tCont = tParent.children()[0];
+                } else {
+
+                    tParent = document.createElement('div');
+                    tCont = document.createElementNS(svgNS,'svg');
+                    tCont.appendChild(tSpan);
+                    styleDiv(tParent);
+                }
+            }
         }else{
             if(!this.isMasked){
-                tParent = document.createElement('span');
-                styleDiv(tParent);
-                tSpan = document.createElement('span');
-                styleDiv(tSpan);
-                tParent.appendChild(tSpan);
+                if(this.textSpans[cnt]){
+                    tParent = this.textSpans[cnt];
+                    tSpan = this.textPaths[cnt];
+                } else {
+                    tParent = document.createElement('span');
+                    styleDiv(tParent);
+                    tSpan = document.createElement('span');
+                    styleDiv(tSpan);
+                    tParent.appendChild(tSpan);
+                }
             } else {
-                tSpan = document.createElementNS(svgNS,'text');
+                tSpan = this.textPaths[cnt] ? this.textPaths[cnt] : document.createElementNS(svgNS,'text');
             }
         }
         //tSpan.setAttribute('visibility', 'hidden');
@@ -135,16 +155,6 @@
                     letters[i].yOffset = boundingBox.y;
                     tParent.appendChild(tCont);
 
-
-                    /*var rBound = Math.ceil(shapeData.bounds.r*scale);
-                    var tBound = Math.floor(shapeData.bounds.t*scale);
-                    var lBound = Math.floor(shapeData.bounds.l*scale);
-                    var bBound = Math.ceil(shapeData.bounds.b*scale);
-                    tCont.setAttribute('width',rBound - lBound);
-                    tCont.setAttribute('height',bBound - tBound);
-                    tCont.setAttribute('viewBox',lBound+' '+tBound+' '+(rBound - lBound)+' '+(bBound - tBound));
-                    tCont.style.transform = tCont.style.webkitTransform = 'translate('+lBound+'px,'+ tBound+'px)';
-                    letters[i].yOffset = tBound;*/
                 } else{
                     tCont.setAttribute('width',1);
                     tCont.setAttribute('height',1);
@@ -165,13 +175,18 @@
         }
         //
         if(!this.isMasked){
-            this.textSpans.push(tParent);
+            this.textSpans[cnt] = tParent;
         }else{
-            this.textSpans.push(tSpan);
+            this.textSpans[cnt] = tSpan;
         }
-        this.textPaths.push(tSpan);
+        this.textPaths[cnt] = tSpan;
+        cnt += 1;
     }
-};
+    while(cnt < this.textSpans.length){
+        this.textSpans[cnt].style.display = 'none';
+        cnt += 1;
+    }
+}
 
 HTextElement.prototype.hide = SVGTextElement.prototype.hide;
 
@@ -185,10 +200,11 @@
     if(this.hidden){
         this.hidden = false;
         this.innerElem.style.display = 'block';
+        this.layerElement.style.display = 'block';
     }
 
     if(this.data.singleShape){
-        if(!this.firstFrame){
+        if(!this.firstFrame && !this.lettersChangedFlag){
             return;
         } else {
             // Todo Benchmark if using this is better than getBBox
@@ -206,7 +222,7 @@
     var  i,len;
     var renderedLetters = this.renderedLetters;
 
-    var letters = this.data.t.d.l;
+    var letters = this.currentTextDocumentData.l;
 
     len = letters.length;
     var renderedLetter;
diff --git a/player/js/elements/svgElements/SVGTextElement.js b/player/js/elements/svgElements/SVGTextElement.js
index 4f3a47e..e63c50c 100644
--- a/player/js/elements/svgElements/SVGTextElement.js
+++ b/player/js/elements/svgElements/SVGTextElement.js
@@ -8,12 +8,26 @@
 SVGTextElement.prototype.init = ITextElement.prototype.init;
 SVGTextElement.prototype.createPathShape = ITextElement.prototype.createPathShape;
 SVGTextElement.prototype.getMeasures = ITextElement.prototype.getMeasures;
+SVGTextElement.prototype.prepareFrame = ITextElement.prototype.prepareFrame;
 
 SVGTextElement.prototype.createElements = function(){
 
     this._parent.createElements.call(this);
-    var documentData = this.data.t.d;
 
+
+    if(this.data.ln){
+        this.layerElement.setAttribute('id',this.data.ln);
+    }
+    if(this.data.cl){
+        this.layerElement.setAttribute('class',this.data.cl);
+    }
+};
+
+SVGTextElement.prototype.buildNewText = function(){
+    var i, len;
+
+    var documentData = this.currentTextDocumentData;
+    this.renderedLetters = Array.apply(null,{length:this.currentTextDocumentData.l ? this.currentTextDocumentData.l.length : 0});
     if(documentData.fc) {
         this.layerElement.setAttribute('fill', 'rgb(' + Math.round(documentData.fc[0]*255) + ',' + Math.round(documentData.fc[1]*255) + ',' + Math.round(documentData.fc[2]*255) + ')');
     }else{
@@ -33,7 +47,6 @@
         this.layerElement.setAttribute('font-style', fStyle);
         this.layerElement.setAttribute('font-weight', fWeight);
     }
-    var i, len;
 
 
 
@@ -48,14 +61,16 @@
     if (singleShape) {
         var xPos = 0, yPos = 0, lineWidths = documentData.lineWidths, boxWidth = documentData.boxWidth, firstLine = true;
     }
+    var cnt = 0;
     for (i = 0;i < len ;i += 1) {
         if(this.globalData.fontManager.chars){
             if(!singleShape || i === 0){
-                tSpan = document.createElementNS(svgNS,'path');
+                tSpan = this.textSpans[cnt] ? this.textSpans[cnt] : document.createElementNS(svgNS,'path');
             }
         }else{
-            tSpan = document.createElementNS(svgNS,'text');
+            tSpan = this.textSpans[cnt] ? this.textSpans[cnt] : document.createElementNS(svgNS,'text');
         }
+        tSpan.style.display = 'inherit';
         tSpan.setAttribute('stroke-linecap', 'butt');
         tSpan.setAttribute('stroke-linejoin','round');
         tSpan.setAttribute('stroke-miterlimit','4');
@@ -118,19 +133,18 @@
             xPos += letters[i].l;
         }
         //
-        this.textSpans.push(tSpan);
+        this.textSpans[cnt] = tSpan;
+        cnt += 1;
     }
-    if(this.data.ln){
-        this.layerElement.setAttribute('id',this.data.ln);
-    }
-    if(this.data.cl){
-        this.layerElement.setAttribute('class',this.data.cl);
+    while(cnt < this.textSpans.length){
+        this.textSpans[cnt].style.display = 'none';
+        cnt += 1;
     }
     if(singleShape && this.globalData.fontManager.chars){
         tSpan.setAttribute('d',shapeStr);
         this.layerElement.appendChild(tSpan);
     }
-};
+}
 
 SVGTextElement.prototype.hide = function(){
     if(!this.hidden){
@@ -154,7 +168,6 @@
     if(this.data.singleShape){
         return;
     }
-
     this.getMeasures();
     if(!this.lettersChangedFlag){
         return;
@@ -162,7 +175,7 @@
     var  i,len;
     var renderedLetters = this.renderedLetters;
 
-    var letters = this.data.t.d.l;
+    var letters = this.currentTextDocumentData.l;
 
     len = letters.length;
     var renderedLetter;
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index f60d44c..07e0b6e 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -125,6 +125,46 @@
         }
     }
 
+    var checkText = (function(){
+        var minimumVersion = [4,4,14];
+
+        function updateTextLayer(textLayer){
+            var documentData = textLayer.t.d;
+            textLayer.t.d = {
+                k: [
+                    {
+                        s:documentData,
+                        t:0
+                    }
+                ]
+            }
+        }
+
+        function iterateLayers(layers){
+            var i, len = layers.length;
+            for(i=0;i<len;i+=1){
+                if(layers[i].ty === 5){
+                    updateTextLayer(layers[i]);
+                }
+            }
+        }
+
+        return function (animationData){
+            if(checkVersion(minimumVersion,animationData.v)){
+                iterateLayers(animationData.layers);
+                if(animationData.assets){
+                    var i, len = animationData.assets.length;
+                    for(i=0;i<len;i+=1){
+                        if(animationData.assets[i].layers){
+                            iterateLayers(animationData.assets[i].layers);
+
+                        }
+                    }
+                }
+            }
+        }
+    }())
+
     var checkColors = (function(){
         var minimumVersion = [4,1,9];
 
@@ -342,206 +382,213 @@
             return;
         }
         checkColors(animationData);
+        checkText(animationData);
         completeLayers(animationData.layers, animationData.assets, fontManager);
         animationData.__complete = true;
         //blitAnimation(animationData, animationData.assets, fontManager);
     }
 
     function completeText(data, fontManager){
-        var letters = [];
-        var documentData = data.t.d;
-        var i, len;
-        var newLineFlag, index = 0, val;
-        var anchorGrouping = data.t.m.g;
-        var currentSize = 0, currentPos = 0, currentLine = 0, lineWidths = [];
-        var lineWidth = 0;
-        var maxLineWidth = 0;
-        var j, jLen;
-        var fontData = fontManager.getFontByName(documentData.f);
-        var charData, cLength = 0;
-        var styles = fontData.fStyle.split(' ');
+        var letters;
+        var keys = data.t.d.k;
+        var k, kLen = keys.length;
+        for(k=0;k<kLen;k+=1){
+            var documentData = data.t.d.k[k].s;
+            letters = [];
+            var i, len;
+            var newLineFlag, index = 0, val;
+            var anchorGrouping = data.t.m.g;
+            var currentSize = 0, currentPos = 0, currentLine = 0, lineWidths = [];
+            var lineWidth = 0;
+            var maxLineWidth = 0;
+            var j, jLen;
+            var fontData = fontManager.getFontByName(documentData.f);
+            var charData, cLength = 0;
+            var styles = fontData.fStyle.split(' ');
 
-        var fWeight = 'normal', fStyle = 'normal';
-        len = styles.length;
-        for(i=0;i<len;i+=1){
-            if (styles[i].toLowerCase() === 'italic') {
-                fStyle = 'italic';
-            }else if (styles[i].toLowerCase() === 'bold') {
-                fWeight = '700';
-            } else if (styles[i].toLowerCase() === 'black') {
-                fWeight = '900';
-            } else if (styles[i].toLowerCase() === 'medium') {
-                fWeight = '500';
-            } else if (styles[i].toLowerCase() === 'regular' || styles[i].toLowerCase() === 'normal') {
-                fWeight = '400';
-            } else if (styles[i].toLowerCase() === 'light' || styles[i].toLowerCase() === 'thin') {
-                fWeight = '200';
-            }
-        }
-        documentData.fWeight = fWeight;
-        documentData.fStyle = fStyle;
-        len = documentData.t.length;
-        if(documentData.sz){
-            var boxWidth = documentData.sz[0];
-            var lastSpaceIndex = -1;
+            var fWeight = 'normal', fStyle = 'normal';
+            len = styles.length;
             for(i=0;i<len;i+=1){
+                if (styles[i].toLowerCase() === 'italic') {
+                    fStyle = 'italic';
+                }else if (styles[i].toLowerCase() === 'bold') {
+                    fWeight = '700';
+                } else if (styles[i].toLowerCase() === 'black') {
+                    fWeight = '900';
+                } else if (styles[i].toLowerCase() === 'medium') {
+                    fWeight = '500';
+                } else if (styles[i].toLowerCase() === 'regular' || styles[i].toLowerCase() === 'normal') {
+                    fWeight = '400';
+                } else if (styles[i].toLowerCase() === 'light' || styles[i].toLowerCase() === 'thin') {
+                    fWeight = '200';
+                }
+            }
+            documentData.fWeight = fWeight;
+            documentData.fStyle = fStyle;
+            len = documentData.t.length;
+            if(documentData.sz){
+                var boxWidth = documentData.sz[0];
+                var lastSpaceIndex = -1;
+                for(i=0;i<len;i+=1){
+                    newLineFlag = false;
+                    if(documentData.t.charAt(i) === ' '){
+                        lastSpaceIndex = i;
+                    }else if(documentData.t.charCodeAt(i) === 13){
+                        lineWidth = 0;
+                        newLineFlag = true;
+                    }
+                    if(fontManager.chars){
+                        charData = fontManager.getCharData(documentData.t.charAt(i), fontData.fStyle, fontData.fFamily);
+                        cLength = newLineFlag ? 0 : charData.w*documentData.s/100;
+                    }else{
+                        //tCanvasHelper.font = documentData.s + 'px '+ fontData.fFamily;
+                        cLength = fontManager.measureText(documentData.t.charAt(i), documentData.f, documentData.s);
+                    }
+                    if(lineWidth + cLength > boxWidth){
+                        if(lastSpaceIndex === -1){
+                            //i -= 1;
+                            documentData.t = documentData.t.substr(0,i) + "\r" + documentData.t.substr(i);
+                            len += 1;
+                        } else {
+                            i = lastSpaceIndex;
+                            documentData.t = documentData.t.substr(0,i) + "\r" + documentData.t.substr(i+1);
+                        }
+                        lastSpaceIndex = -1;
+                        lineWidth = 0;
+                    }else {
+                        lineWidth += cLength;
+                    }
+                }
+                len = documentData.t.length;
+            }
+            lineWidth = 0;
+            cLength = 0;
+            for (i = 0;i < len ;i += 1) {
                 newLineFlag = false;
                 if(documentData.t.charAt(i) === ' '){
-                    lastSpaceIndex = i;
+                    val = '\u00A0';
                 }else if(documentData.t.charCodeAt(i) === 13){
+                    lineWidths.push(lineWidth);
+                    maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth;
                     lineWidth = 0;
+                    val = '';
                     newLineFlag = true;
+                    currentLine += 1;
+                }else{
+                    val = documentData.t.charAt(i);
                 }
                 if(fontManager.chars){
-                    charData = fontManager.getCharData(documentData.t.charAt(i), fontData.fStyle, fontData.fFamily);
+                    charData = fontManager.getCharData(documentData.t.charAt(i), fontData.fStyle, fontManager.getFontByName(documentData.f).fFamily);
                     cLength = newLineFlag ? 0 : charData.w*documentData.s/100;
                 }else{
-                    //tCanvasHelper.font = documentData.s + 'px '+ fontData.fFamily;
-                    cLength = fontManager.measureText(documentData.t.charAt(i), documentData.f, documentData.s);
+                    //var charWidth = fontManager.measureText(val, documentData.f, documentData.s);
+                    //tCanvasHelper.font = documentData.s + 'px '+ fontManager.getFontByName(documentData.f).fFamily;
+                    cLength = fontManager.measureText(val, documentData.f, documentData.s);
                 }
-                if(lineWidth + cLength > boxWidth){
-                    if(lastSpaceIndex === -1){
-                       //i -= 1;
-                        documentData.t = documentData.t.substr(0,i) + "\r" + documentData.t.substr(i);
-                        len += 1;
-                    } else {
-                        i = lastSpaceIndex;
-                        documentData.t = documentData.t.substr(0,i) + "\r" + documentData.t.substr(i+1);
-                    }
-                    lastSpaceIndex = -1;
-                    lineWidth = 0;
-                }else {
-                    lineWidth += cLength;
-                }
-            }
-            len = documentData.t.length;
-        }
-        lineWidth = 0;
-        cLength = 0;
-        for (i = 0;i < len ;i += 1) {
-            newLineFlag = false;
-            if(documentData.t.charAt(i) === ' '){
-                val = '\u00A0';
-            }else if(documentData.t.charCodeAt(i) === 13){
-                lineWidths.push(lineWidth);
-                maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth;
-                lineWidth = 0;
-                val = '';
-                newLineFlag = true;
-                currentLine += 1;
-            }else{
-                val = documentData.t.charAt(i);
-            }
-            if(fontManager.chars){
-                charData = fontManager.getCharData(documentData.t.charAt(i), fontData.fStyle, fontManager.getFontByName(documentData.f).fFamily);
-                cLength = newLineFlag ? 0 : charData.w*documentData.s/100;
-            }else{
-                //var charWidth = fontManager.measureText(val, documentData.f, documentData.s);
-                //tCanvasHelper.font = documentData.s + 'px '+ fontManager.getFontByName(documentData.f).fFamily;
-                cLength = fontManager.measureText(val, documentData.f, documentData.s);
-            }
 
-            //
-            lineWidth += cLength;
-            letters.push({l:cLength,an:cLength,add:currentSize,n:newLineFlag, anIndexes:[], val: val, line: currentLine});
-            if(anchorGrouping == 2){
-                currentSize += cLength;
-                if(val == '' || val == '\u00A0' || i == len - 1){
-                    if(val == '' || val == '\u00A0'){
-                        currentSize -= cLength;
+                //
+                lineWidth += cLength;
+                letters.push({l:cLength,an:cLength,add:currentSize,n:newLineFlag, anIndexes:[], val: val, line: currentLine});
+                if(anchorGrouping == 2){
+                    currentSize += cLength;
+                    if(val == '' || val == '\u00A0' || i == len - 1){
+                        if(val == '' || val == '\u00A0'){
+                            currentSize -= cLength;
+                        }
+                        while(currentPos<=i){
+                            letters[currentPos].an = currentSize;
+                            letters[currentPos].ind = index;
+                            letters[currentPos].extra = cLength;
+                            currentPos += 1;
+                        }
+                        index += 1;
+                        currentSize = 0;
                     }
-                    while(currentPos<=i){
-                        letters[currentPos].an = currentSize;
-                        letters[currentPos].ind = index;
-                        letters[currentPos].extra = cLength;
-                        currentPos += 1;
+                }else if(anchorGrouping == 3){
+                    currentSize += cLength;
+                    if(val == '' || i == len - 1){
+                        if(val == ''){
+                            currentSize -= cLength;
+                        }
+                        while(currentPos<=i){
+                            letters[currentPos].an = currentSize;
+                            letters[currentPos].ind = index;
+                            letters[currentPos].extra = cLength;
+                            currentPos += 1;
+                        }
+                        currentSize = 0;
+                        index += 1;
                     }
-                    index += 1;
-                    currentSize = 0;
-                }
-            }else if(anchorGrouping == 3){
-                currentSize += cLength;
-                if(val == '' || i == len - 1){
-                    if(val == ''){
-                        currentSize -= cLength;
-                    }
-                    while(currentPos<=i){
-                        letters[currentPos].an = currentSize;
-                        letters[currentPos].ind = index;
-                        letters[currentPos].extra = cLength;
-                        currentPos += 1;
-                    }
-                    currentSize = 0;
+                }else{
+                    letters[index].ind = index;
+                    letters[index].extra = 0;
                     index += 1;
                 }
+            }
+            documentData.l = letters;
+            maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth;
+            lineWidths.push(lineWidth);
+            if(documentData.sz){
+                documentData.boxWidth = documentData.sz[0];
+                documentData.justifyOffset = 0;
             }else{
-                letters[index].ind = index;
-                letters[index].extra = 0;
-                index += 1;
+                documentData.boxWidth = maxLineWidth;
+                switch(documentData.j){
+                    case 1:
+                        documentData.justifyOffset = - documentData.boxWidth;
+                        break;
+                    case 2:
+                        documentData.justifyOffset = - documentData.boxWidth/2;
+                        break;
+                    default:
+                        documentData.justifyOffset = 0;
+                }
             }
-        }
-        documentData.l = letters;
-        maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth;
-        lineWidths.push(lineWidth);
-        if(documentData.sz){
-            documentData.boxWidth = documentData.sz[0];
-            data.t.d.justifyOffset = 0;
-        }else{
-            documentData.boxWidth = maxLineWidth;
-            switch(documentData.j){
-                case 1:
-                    data.t.d.justifyOffset = - documentData.boxWidth;
-                    break;
-                case 2:
-                    data.t.d.justifyOffset = - documentData.boxWidth/2;
-                    break;
-                default:
-                    data.t.d.justifyOffset = 0;
-            }
-        }
-        documentData.lineWidths = lineWidths;
+            documentData.lineWidths = lineWidths;
 
-        var animators = data.t.a;
-        jLen = animators.length;
-        var based, ind, indexes = [];
-        for(j=0;j<jLen;j+=1){
-            if(animators[j].a.sc){
-                documentData.strokeColorAnim = true;
-            }
-            if(animators[j].a.sw){
-                documentData.strokeWidthAnim = true;
-            }
-            if(animators[j].a.fc || animators[j].a.fh || animators[j].a.fs || animators[j].a.fb){
-                documentData.fillColorAnim = true;
-            }
-            ind = 0;
-            based = animators[j].s.b;
-            for(i=0;i<len;i+=1){
-                letters[i].anIndexes[j] = ind;
-                if((based == 1 && letters[i].val != '') || (based == 2 && letters[i].val != '' && letters[i].val != '\u00A0') || (based == 3 && (letters[i].n || letters[i].val == '\u00A0' || i == len - 1)) || (based == 4 && (letters[i].n || i == len - 1))){
-                    if(animators[j].s.rn === 1){
-                        indexes.push(ind);
+            var animators = data.t.a;
+            jLen = animators.length;
+            var based, ind, indexes = [];
+            for(j=0;j<jLen;j+=1){
+                if(animators[j].a.sc){
+                    documentData.strokeColorAnim = true;
+                }
+                if(animators[j].a.sw){
+                    documentData.strokeWidthAnim = true;
+                }
+                if(animators[j].a.fc || animators[j].a.fh || animators[j].a.fs || animators[j].a.fb){
+                    documentData.fillColorAnim = true;
+                }
+                ind = 0;
+                based = animators[j].s.b;
+                for(i=0;i<len;i+=1){
+                    letters[i].anIndexes[j] = ind;
+                    if((based == 1 && letters[i].val != '') || (based == 2 && letters[i].val != '' && letters[i].val != '\u00A0') || (based == 3 && (letters[i].n || letters[i].val == '\u00A0' || i == len - 1)) || (based == 4 && (letters[i].n || i == len - 1))){
+                        if(animators[j].s.rn === 1){
+                            indexes.push(ind);
+                        }
+                        ind += 1;
                     }
-                    ind += 1;
+                }
+                data.t.a[j].s.totalChars = ind;
+                var currentInd = -1, newInd;
+                if(animators[j].s.rn === 1){
+                    for(i = 0; i < len; i += 1){
+                        if(currentInd != letters[i].anIndexes[j]){
+                            currentInd = letters[i].anIndexes[j];
+                            newInd = indexes.splice(Math.floor(Math.random()*indexes.length),1)[0];
+                        }
+                        letters[i].anIndexes[j] = newInd;
+                    }
                 }
             }
-            data.t.a[j].s.totalChars = ind;
-            var currentInd = -1, newInd;
-            if(animators[j].s.rn === 1){
-                for(i = 0; i < len; i += 1){
-                    if(currentInd != letters[i].anIndexes[j]){
-                        currentInd = letters[i].anIndexes[j];
-                        newInd = indexes.splice(Math.floor(Math.random()*indexes.length),1)[0];
-                    }
-                    letters[i].anIndexes[j] = newInd;
-                }
+            if(jLen === 0 && !('m' in data.t.p)){
+                data.singleShape = true;
             }
+            documentData.yOffset = documentData.lh || documentData.s*1.2;
+            documentData.ascent = fontData.ascent*documentData.s/100;
         }
-        if(jLen === 0 && !('m' in data.t.p)){
-            data.singleShape = true;
-        }
-        documentData.yOffset = documentData.lh || documentData.s*1.2;
-        documentData.ascent = fontData.ascent*documentData.s/100;
+
     }
 
     var moduleOb = {};
diff --git a/player/js/utils/PropertyFactory.js b/player/js/utils/PropertyFactory.js
index 33a6d82..52894a0 100644
--- a/player/js/utils/PropertyFactory.js
+++ b/player/js/utils/PropertyFactory.js
@@ -758,23 +758,35 @@
                     if(mult<.5){
                         mult *= 2;
                     }else{
-                        mult = 1 - mult;
+                        mult = 1 - 2*(mult-0.5);
                     }
                 }
+                mult = easer(mult);
             }else if(type == 5){
                 if(e === s){
                     mult = ind >= e ? 0 : 1;
                 }else{
                     var tot = e - s;
-
-                    mult = -4/(tot*tot)*(ind*ind)+(4/tot)*ind;
+                    /*ind += 0.5;
+                    mult = -4/(tot*tot)*(ind*ind)+(4/tot)*ind;*/
+                    ind = min(max(0,ind+0.5-s),e-s);
+                    var x = -tot/2+ind;
+                    var a = tot/2;
+                    mult = Math.sqrt(1 - (x*x)/(a*a));
                 }
+                mult = easer(mult);
             }else if(type == 6){
                 if(e === s){
                     mult = ind >= e ? 0 : 1;
                 }else{
-                    mult = (1+(Math.cos(Math.PI+Math.PI*2*(ind-s)/(e-s))+0))/2;
+                    ind = min(max(0,ind+0.5-s),e-s);
+                    mult = (1+(Math.cos((Math.PI+Math.PI*2*(ind)/(e-s)))))/2;
+                    /*
+                     ind = Math.min(Math.max(s,ind),e-1);
+                     mult = (1+(Math.cos((Math.PI+Math.PI*2*(ind-s)/(e-1-s)))))/2;
+                     mult = Math.max(mult,(1/(e-1-s))/(e-1-s));*/
                 }
+                mult = easer(mult);
             }else {
                 if(ind >= floor(s)){
                     if(ind-s < 0){
@@ -783,6 +795,7 @@
                         mult = max(0,min(e-ind,1));
                     }
                 }
+                mult = easer(mult);
             }
             return mult*this.a.v;
         }
diff --git a/player/js/utils/common.js b/player/js/utils/common.js
index 90741a7..1a7090b 100644
--- a/player/js/utils/common.js
+++ b/player/js/utils/common.js
@@ -1,4 +1,4 @@
-var subframeEnabled = true;
+var subframeEnabled = false;
 var expressionsPlugin;
 var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
 var cachedColors = {};
diff --git a/player/js/utils/expressions/ShapeInterface.js b/player/js/utils/expressions/ShapeInterface.js
index f237fe7..17f0093 100644
--- a/player/js/utils/expressions/ShapeInterface.js
+++ b/player/js/utils/expressions/ShapeInterface.js
@@ -605,7 +605,6 @@
             prop.r.setGroupProperty(_propertyGroup);
 
             function interfaceFunction(value){
-                console.log(value);
                 if(shape.p.ix === value){
                     return interfaceFunction.position;
                 }
