partial
diff --git a/parser/CompConverter.js b/parser/CompConverter.js
index e064ef6..98dca68 100644
--- a/parser/CompConverter.js
+++ b/parser/CompConverter.js
@@ -79,7 +79,7 @@
     }
 
     function start(){
-        UI.setExportText('Starting export');
+        UI.setState('start');
         LayerConverter.convertComposition(mainComp);
     }
 
@@ -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/DOMAnimationManager.js b/parser/DOMAnimationManager.js
index b6b666d..b30b973 100644
--- a/parser/DOMAnimationManager.js
+++ b/parser/DOMAnimationManager.js
@@ -547,6 +547,7 @@
          callback.apply();*/
         // END TO TRAVERSE LAYER BY LAYER. NEEDED FOR TIME REMAP?
         totalLayers = pendingLayers.length;
+        UI.setState('processing');
         extrasInstance.setTimeout(analyzeNextLayer,100);
     }
 
diff --git a/parser/LayerConverter.js b/parser/LayerConverter.js
index 58f94ea..a3119ab 100644
--- a/parser/LayerConverter.js
+++ b/parser/LayerConverter.js
@@ -16,6 +16,7 @@
     function convertComposition(comp){
         helperFolder = helperFootage.item(2);
         AssetsManager.reset();
+        UI.setState('duplicating',comp.name);
         duplicateMainComp = comp.duplicate();
         //duplicateMainComp.openInViewer() ;
         duplicateMainComp.parentFolder = helperFolder;
@@ -30,10 +31,19 @@
         }
     };
 
+    function changeSourceToLayers(){
+        var i, len = duplicatedSources.length;
+        for(i=0;i<len;i+=1){
+            duplicatedSources[i].l.replaceSource(duplicatedSources[i].c,false);
+            //layerInfo.replaceSource(copy, false);
+        }
+    }
+
     function iterateNextComposition(){
         if(currentCompositionNum == pendingComps.length){
             //TODO dar acceso externo a main comp
             //TODO despachar evento de fin
+            changeSourceToLayers();
             callback.apply(null,[duplicateMainComp]);
             return;
         }
@@ -64,10 +74,9 @@
                 }
             }else{
                 if(lType=='PreCompLayer'){
-                    var copy = searchCompositionDuplicate(layerInfo);
-                    layerInfo.replaceSource(copy, false);
-                    pendingComps.push(copy);
-                    copy.parentFolder = helperFolder;
+                    searchCompositionDuplicate(layerInfo);
+                    //layerInfo.replaceSource(copy, false);
+                    pendingComps.push(layerInfo.source);
                 }
                 currentLayerNum++;
                 extrasInstance.setTimeout(verifyNextItem,100);
@@ -80,16 +89,29 @@
 
     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){
-                return duplicatedSources[i].c;
+                $.writeln('is found');
+                duplicatedSources.push({c:duplicatedSources[i].c,l:layerInfo});
+                return;
             }
             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});
-        return copy;
+        duplicatedSources.push({s:layerInfo.source,c:copy,l:layerInfo});
+        return;
     }
 
     function searchConvertedSource(source){
diff --git a/parser/UI.js b/parser/UI.js
index 225b202..92eae11 100644
--- a/parser/UI.js
+++ b/parser/UI.js
@@ -10,8 +10,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'}
+    };
     var availableCompositions = [];
     var bodyMovinPanel;
     var settingsGroup;
@@ -108,9 +108,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);
@@ -456,6 +456,24 @@
         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;
+            default:
+                bodyMovinPanel.mainGroup.renderGroup.componentText.text = 'default: '+state;
+                break;
+        }
+    }
+
     myScript_buildUI(bodymovinWindow);
     if (bodyMovinPanel != null && bodyMovinPanel instanceof Window){
         bodyMovinPanel.center();
@@ -465,6 +483,7 @@
     var ob ={};
     ob.setExportText = setExportText;
     ob.setProgress = setProgress;
+    ob.setState = setState;
 
     UI = ob;
 
diff --git a/parser/extras.js b/parser/extras.js
index 6b0adda..c9dcf5f 100644
--- a/parser/extras.js
+++ b/parser/extras.js
@@ -461,7 +461,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;
diff --git a/player/index.html b/player/index.html
index 2824f52..004c0ba 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/letters/d_reduced" data-bm-type="svg" 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/multicomp" data-bm-type="canvas" data-bm-loop="true" data-bm-prerender="true"></div>
 </body>
 </html>