diff --git a/build/parser/bodymovin_parser.jsx b/build/parser/bodymovin_parser.jsx
index a5ac8d7..9fa9c46 100644
--- a/build/parser/bodymovin_parser.jsx
+++ b/build/parser/bodymovin_parser.jsx
@@ -956,6 +956,7 @@
          callback.apply();*/
         // END TO TRAVERSE LAYER BY LAYER. NEEDED FOR TIME REMAP?
         totalLayers = pendingLayers.length;
+        UI.setState('processing');
         extrasInstance.setTimeout(analyzeNextLayer,100);
     }
 
@@ -1678,7 +1679,6 @@
                     case PropertyValueType.ThreeD_SPATIAL:
                     case PropertyValueType.TwoD_SPATIAL:
                         bezierIn.x = 1 - key.easeIn.influence / 100;
-                        $.writeln('bezierIn.x: ',bezierIn.x);
                         bezierOut.x = lastKey.easeOut.influence / 100;
                         averageSpeed = getCurveLength(lastKey.value,key.value, lastKey.to, key.ti)/duration;
                         break;
@@ -1997,6 +1997,7 @@
 /****** END rqManager ******/
 /****** INIT LayerConverter ******/
 (function(){
+    var compsIndexes;
     var pendingComps = [];
     var convertedSources = [];
     var duplicatedSources = [];
@@ -2005,14 +2006,16 @@
     var currentCompositionNum = 0;
     var totalLayers;
     var tempConverterComp;
-    var currentComposition;
+    var currentCompositionData;
     var currentSource;
     var currentLayerInfo;
     var duplicateMainComp;
+    var positions;
     var callback;
     function convertComposition(comp){
         helperFolder = helperFootage.item(2);
         AssetsManager.reset();
+        UI.setState('duplicating',comp.name);
         duplicateMainComp = comp.duplicate();
         //duplicateMainComp.openInViewer() ;
         duplicateMainComp.parentFolder = helperFolder;
@@ -2021,28 +2024,43 @@
         pendingComps = [];
         convertedSources = [];
         duplicatedSources = [];
-        pendingComps.push(duplicateMainComp);
+        compsIndexes = [];
+        positions = [];
+        pendingComps.push({comp:duplicateMainComp,items:compsIndexes});
         if(pendingComps.length == 1){
             extrasInstance.setTimeout(iterateNextComposition,100);
         }
     };
 
+    function changeSourceToLayers(comp,indexes){
+        var i, len = indexes.length;
+        for(i=0;i<len;i+=1){
+            var layerInfo = comp.layers[indexes[i].index];
+            layerInfo.replaceSource(indexes[i].src,false);
+            if(indexes[i].items.length>0){
+                changeSourceToLayers(layerInfo.source,indexes[i].items);
+            }
+        }
+    }
+
     function iterateNextComposition(){
         if(currentCompositionNum == pendingComps.length){
             //TODO dar acceso externo a main comp
             //TODO despachar evento de fin
+            UI.setState('sourcing');
+            changeSourceToLayers(duplicateMainComp,compsIndexes);
             callback.apply(null,[duplicateMainComp]);
             return;
         }
-        currentComposition = pendingComps[currentCompositionNum];
+        currentCompositionData = pendingComps[currentCompositionNum];
         currentLayerNum = 0;
-        totalLayers = currentComposition.layers.length;
+        totalLayers = currentCompositionData.comp.layers.length;
         extrasInstance.setTimeout(verifyNextItem,100);
     }
 
     function verifyNextItem(){
         if(currentLayerNum<totalLayers){
-            var layerInfo = currentComposition.layers[currentLayerNum+1];
+            var layerInfo = currentCompositionData.comp.layers[currentLayerNum+1];
             var lType = extrasInstance.layerType(layerInfo);
             if(lType == 'StillLayer' && layerInfo.enabled){
                 currentSource = layerInfo.source;
@@ -2061,10 +2079,11 @@
                 }
             }else{
                 if(lType=='PreCompLayer'){
-                    var copy = searchCompositionDuplicate(layerInfo);
-                    layerInfo.replaceSource(copy, false);
-                    pendingComps.push(copy);
-                    copy.parentFolder = helperFolder;
+                    var src = searchCompositionDuplicate(layerInfo);
+                    //layerInfo.replaceSource(copy, false);
+                    var indexes = [];
+                    currentCompositionData.items.push({index:currentLayerNum+1,src:src,items:indexes});
+                    pendingComps.push({comp:layerInfo.source,items:indexes});
                 }
                 currentLayerNum++;
                 extrasInstance.setTimeout(verifyNextItem,100);
@@ -2083,7 +2102,10 @@
             }
             i++;
         }
+        UI.setState('duplicating',layerInfo.source.name);
         var copy = layerInfo.source.duplicate();
+        copy.parentFolder = helperFolder;
+        copy.parentFolder = helperFolder;
         //copy.openInViewer() ;
         duplicatedSources.push({s:layerInfo.source,c:copy});
         return copy;
@@ -2118,7 +2140,7 @@
     }
 
     function replaceCurrentLayerSource(source){
-        var layerInfo = currentComposition.layers[currentLayerNum+1];
+        var layerInfo = currentCompositionData.comp.layers[currentLayerNum+1];
         layerInfo.replaceSource(source, false);
     }
 
@@ -2402,7 +2424,6 @@
                 extrasInstance.convertToBezierValues(prop.property('Opacity'), frameRate, ob,'o');
                 extrasInstance.convertToBezierValues(prop.property('Stroke Width'), frameRate, ob,'w');
                 var j, jLen = prop.property('Dashes').numProperties;
-                extrasInstance.iterateProperty(prop.property('Dashes').property(1));
                 var dashesData = [];
                 var changed = false;
                 for(j=0;j<jLen;j+=1){
@@ -2586,7 +2607,7 @@
     }
 
     function start(){
-        UI.setExportText('Starting export');
+        UI.setState('start');
         LayerConverter.convertComposition(mainComp);
     }
 
@@ -2666,8 +2687,8 @@
         compsColumns : {name:'Name',queue:'In Queue',destination:'Destination Path'},
         imagesButtons : {refresh:'Refresh', exportTxt:'Export', notExportTxt:'Do not export'},
         imagesColumns : {name:'Name',exportTxt:'Export'},
-        renderTexts : {cancel:'Cancel Render'}
-    }
+        renderTexts : {cancel:'Cancel Render',start:'Starting export',duplicating:'Duplicating Comp: ',processing:'Processing layers',sourcing:'Changing sources'}
+    };
     var availableCompositions = [];
     var bodyMovinPanel;
     var settingsGroup;
@@ -2764,9 +2785,9 @@
 
         /**** RENDER GROUP ****/
         var renderGroupRes = "group{orientation:'column',alignment:['fill','fill'],alignChildren:['fill',fill'],\
-            componentText:StaticText{text:'Rendering Composition ',alignment:['left','top']},\
+            componentText:StaticText{text:'Rendering Composition ',alignment:['fill','top']},\
             infoText:StaticText{text:'Exporting images ',alignment:['left','top']},\
-            progress:Progressbar{value:50,alignment:['fill','top']},\
+            progress:Progressbar{value:0,alignment:['fill','top']},\
             cancelButton: Button{text:'"+UITextsData.renderTexts.cancel+"',alignment:['center','top']},\
          }";
         bodyMovinPanel.mainGroup.renderGroup = bodyMovinPanel.mainGroup.add(renderGroupRes);
@@ -3112,6 +3133,27 @@
         bodyMovinPanel.mainGroup.renderGroup.infoText.text = text;
     }
 
+    function setState(state,compName){
+        switch(state){
+            case 'start':
+                bodyMovinPanel.mainGroup.renderGroup.componentText.text = UITextsData.renderTexts.start;
+                setProgress(1);
+                break;
+            case 'duplicating':
+                bodyMovinPanel.mainGroup.renderGroup.componentText.text = UITextsData.renderTexts.duplicating + compName;
+                break;
+            case 'processing':
+                bodyMovinPanel.mainGroup.renderGroup.componentText.text = UITextsData.renderTexts.processing;
+                break;
+            case 'sourcing':
+                bodyMovinPanel.mainGroup.renderGroup.componentText.text = UITextsData.renderTexts.sourcing;
+                break;
+            default:
+                bodyMovinPanel.mainGroup.renderGroup.componentText.text = 'default: '+state;
+                break;
+        }
+    }
+
     myScript_buildUI(bodymovinWindow);
     if (bodyMovinPanel != null && bodyMovinPanel instanceof Window){
         bodyMovinPanel.center();
@@ -3121,6 +3163,7 @@
     var ob ={};
     ob.setExportText = setExportText;
     ob.setProgress = setProgress;
+    ob.setState = setState;
 
     UI = ob;
 
diff --git a/parser/CompConverter.js b/parser/CompConverter.js
index 98dca68..c8f72b5 100644
--- a/parser/CompConverter.js
+++ b/parser/CompConverter.js
@@ -105,7 +105,7 @@
             }
         }
         //If it gets here there are no more compositions to render and callback is executed
-        //helperFootage.remove();
+        helperFootage.remove();
         endCallback.apply();
     }
 
diff --git a/parser/LayerConverter.js b/parser/LayerConverter.js
index a3119ab..c3a160c 100644
--- a/parser/LayerConverter.js
+++ b/parser/LayerConverter.js
@@ -1,5 +1,6 @@
 /****** INIT LayerConverter ******/
 (function(){
+    var compsIndexes;
     var pendingComps = [];
     var convertedSources = [];
     var duplicatedSources = [];
@@ -8,10 +9,11 @@
     var currentCompositionNum = 0;
     var totalLayers;
     var tempConverterComp;
-    var currentComposition;
+    var currentCompositionData;
     var currentSource;
     var currentLayerInfo;
     var duplicateMainComp;
+    var positions;
     var callback;
     function convertComposition(comp){
         helperFolder = helperFootage.item(2);
@@ -25,17 +27,22 @@
         pendingComps = [];
         convertedSources = [];
         duplicatedSources = [];
-        pendingComps.push(duplicateMainComp);
+        compsIndexes = [];
+        positions = [];
+        pendingComps.push({comp:duplicateMainComp,items:compsIndexes});
         if(pendingComps.length == 1){
             extrasInstance.setTimeout(iterateNextComposition,100);
         }
     };
 
-    function changeSourceToLayers(){
-        var i, len = duplicatedSources.length;
+    function changeSourceToLayers(comp,indexes){
+        var i, len = indexes.length;
         for(i=0;i<len;i+=1){
-            duplicatedSources[i].l.replaceSource(duplicatedSources[i].c,false);
-            //layerInfo.replaceSource(copy, false);
+            var layerInfo = comp.layers[indexes[i].index];
+            layerInfo.replaceSource(indexes[i].src,false);
+            if(indexes[i].items.length>0){
+                changeSourceToLayers(layerInfo.source,indexes[i].items);
+            }
         }
     }
 
@@ -43,19 +50,20 @@
         if(currentCompositionNum == pendingComps.length){
             //TODO dar acceso externo a main comp
             //TODO despachar evento de fin
-            changeSourceToLayers();
+            UI.setState('sourcing');
+            changeSourceToLayers(duplicateMainComp,compsIndexes);
             callback.apply(null,[duplicateMainComp]);
             return;
         }
-        currentComposition = pendingComps[currentCompositionNum];
+        currentCompositionData = pendingComps[currentCompositionNum];
         currentLayerNum = 0;
-        totalLayers = currentComposition.layers.length;
+        totalLayers = currentCompositionData.comp.layers.length;
         extrasInstance.setTimeout(verifyNextItem,100);
     }
 
     function verifyNextItem(){
         if(currentLayerNum<totalLayers){
-            var layerInfo = currentComposition.layers[currentLayerNum+1];
+            var layerInfo = currentCompositionData.comp.layers[currentLayerNum+1];
             var lType = extrasInstance.layerType(layerInfo);
             if(lType == 'StillLayer' && layerInfo.enabled){
                 currentSource = layerInfo.source;
@@ -74,9 +82,11 @@
                 }
             }else{
                 if(lType=='PreCompLayer'){
-                    searchCompositionDuplicate(layerInfo);
+                    var src = searchCompositionDuplicate(layerInfo);
                     //layerInfo.replaceSource(copy, false);
-                    pendingComps.push(layerInfo.source);
+                    var indexes = [];
+                    currentCompositionData.items.push({index:currentLayerNum+1,src:src,items:indexes});
+                    pendingComps.push({comp:layerInfo.source,items:indexes});
                 }
                 currentLayerNum++;
                 extrasInstance.setTimeout(verifyNextItem,100);
@@ -89,29 +99,19 @@
 
     function searchCompositionDuplicate(layerInfo){
         var i=0,len = duplicatedSources.length;
-        $.writeln('--- new ---');
         while(i<len){
-            //$.writeln('duplicatedSources[i].s.source: ',duplicatedSources[i].s);
-            //$.writeln('layerInfo.source: ',layerInfo.source);
-            //$.writeln('layerInfo.source.name: ',layerInfo.source.name);
-            /*$.writeln('duplicatedSources[i].s.source.name: ',duplicatedSources[i].s.name);
-            $.writeln('layerInfo.source: ',layerInfo.source);
-            $.writeln('layerInfo.source.name: ',layerInfo.source.name);*/
             if(duplicatedSources[i].s == layerInfo.source){
-                $.writeln('is found');
-                duplicatedSources.push({c:duplicatedSources[i].c,l:layerInfo});
-                return;
+                return duplicatedSources[i].c;
             }
             i++;
         }
-        $.writeln('not found');
         UI.setState('duplicating',layerInfo.source.name);
         var copy = layerInfo.source.duplicate();
         copy.parentFolder = helperFolder;
         copy.parentFolder = helperFolder;
         //copy.openInViewer() ;
-        duplicatedSources.push({s:layerInfo.source,c:copy,l:layerInfo});
-        return;
+        duplicatedSources.push({s:layerInfo.source,c:copy});
+        return copy;
     }
 
     function searchConvertedSource(source){
@@ -143,7 +143,7 @@
     }
 
     function replaceCurrentLayerSource(source){
-        var layerInfo = currentComposition.layers[currentLayerNum+1];
+        var layerInfo = currentCompositionData.comp.layers[currentLayerNum+1];
         layerInfo.replaceSource(source, false);
     }
 
diff --git a/parser/ShapesParser.js b/parser/ShapesParser.js
index b8f2bd7..9be185a 100644
--- a/parser/ShapesParser.js
+++ b/parser/ShapesParser.js
@@ -253,7 +253,6 @@
                 extrasInstance.convertToBezierValues(prop.property('Opacity'), frameRate, ob,'o');
                 extrasInstance.convertToBezierValues(prop.property('Stroke Width'), frameRate, ob,'w');
                 var j, jLen = prop.property('Dashes').numProperties;
-                extrasInstance.iterateProperty(prop.property('Dashes').property(1));
                 var dashesData = [];
                 var changed = false;
                 for(j=0;j<jLen;j+=1){
diff --git a/parser/UI.js b/parser/UI.js
index 92eae11..4ac290a 100644
--- a/parser/UI.js
+++ b/parser/UI.js
@@ -10,7 +10,7 @@
         compsColumns : {name:'Name',queue:'In Queue',destination:'Destination Path'},
         imagesButtons : {refresh:'Refresh', exportTxt:'Export', notExportTxt:'Do not export'},
         imagesColumns : {name:'Name',exportTxt:'Export'},
-        renderTexts : {cancel:'Cancel Render',start:'Starting export',duplicating:'Duplicating Comp: ',processing:'Processing layers'}
+        renderTexts : {cancel:'Cancel Render',start:'Starting export',duplicating:'Duplicating Comp: ',processing:'Processing layers',sourcing:'Changing sources'}
     };
     var availableCompositions = [];
     var bodyMovinPanel;
@@ -468,6 +468,9 @@
             case 'processing':
                 bodyMovinPanel.mainGroup.renderGroup.componentText.text = UITextsData.renderTexts.processing;
                 break;
+            case 'sourcing':
+                bodyMovinPanel.mainGroup.renderGroup.componentText.text = UITextsData.renderTexts.sourcing;
+                break;
             default:
                 bodyMovinPanel.mainGroup.renderGroup.componentText.text = 'default: '+state;
                 break;
diff --git a/player/index.html b/player/index.html
index 004c0ba..166bae6 100644
--- a/player/index.html
+++ b/player/index.html
@@ -36,6 +36,6 @@
     <!-- endbuild -->
 </head>
 <body style="background-color:#666; margin: 0px;height: 100%; font-family: sans-serif;font-size: 10px">
-<div style="width:100%;height:100%;background-color:#000;display:inline-block" class="bodymovin" data-bm-path="exports/multicomp" data-bm-type="canvas" data-bm-loop="true" data-bm-prerender="true"></div>
+<div style="width:100%;height:100%;background-color:#000;display:inline-block" class="bodymovin" data-bm-path="exports/letters/full" data-bm-type="canvas" data-bm-loop="true" data-bm-prerender="true"></div>
 </body>
 </html>
