diff --git a/js/app/controllers/DownloadModule.js b/js/app/controllers/DownloadModule.js
index 17725bf..12f5cc4 100644
--- a/js/app/controllers/DownloadModule.js
+++ b/js/app/controllers/DownloadModule.js
@@ -22,7 +22,6 @@ Ext.define('amdaDesktop.DownloadModule', {
      * @cfg {String} data models
      * @required
      */
-    objectDataModel : 'amdaModel.Download',
     nodeDataModel : 'amdaModel.DownloadNode',
     
     /**
@@ -30,21 +29,11 @@ Ext.define('amdaDesktop.DownloadModule', {
      * @required
      */
     width: 600, 
-    height: 600,
+    height: 620,
     uiType : 'panelDownload',
     helpTitle : 'Help on Download Module',
     helpFile : 'downloadHelp',
         
-    /**
-    * @override
-    */
-    createWindow : function() {
-        if (!this.linkedNode){
-            this.setLinkedNode(amdaModel.DownloadNode);
-        }
-        this.callParent(arguments);
-    },
-        
     saveState: function() {
             var uiContent = this.getUiContent();               
             var form = uiContent.down('form').getForm();
@@ -56,5 +45,20 @@ Ext.define('amdaDesktop.DownloadModule', {
     getState : function() {            
         //   return Ext.state.Manager.get(this.id + '_form'); 
         return Ext.state.Manager.get('timeinterval'); 
+    },
+
+    addParameter: function(paramNode) {
+        var me = this;
+        var desktop = this.app.getDesktop();
+        var win = desktop.getWindow(this.id);
+        if (win) {
+            me.getUiContent().addParameter(paramNode, false);
+            win.show();
+        }
+        else {
+            this.createWindow(function () {
+                me.getUiContent().addParameter(paramNode, true);
+            });
+        } 
     }
-});
\ No newline at end of file
+});
diff --git a/js/app/models/BkgJobNode.js b/js/app/models/BkgJobNode.js
index 460785e..8e3e2c7 100644
--- a/js/app/models/BkgJobNode.js
+++ b/js/app/models/BkgJobNode.js
@@ -395,97 +395,5 @@ Ext.define('amdaModel.BkgJobNode', {
 				this.set('rootNode',this.myGetOwnerTree().getRootNode().findChild( 'id', rootNodeId, true));
 			}
 			return this.get('rootNode');
-		},
-    
-		/**
-		* @override amdaModel.ExecutableNode.execute  PNG (interactive session only!!!)
-		*/
-		execute : function(arguments) 
-		{
-			// Not needed to send the whole request
-			//  var jsonObj = this.get('object').getJsonValues(true);
-			//TODO append jsonObj.action at server side => history!!!
-			var jsonObj = {};
-			var isMulti =  arguments[0];	
-			jsonObj.action = {name:arguments[1],arg1:arguments[2],arg2:arguments[3]};
-			//AKKA replace resultID by folderId
-			jsonObj.folderId =  this.get('object').get('folderId');
-			//jsonObj.resultId =  this.get('object').get('resultFolder');
-	
-			this.action = jsonObj.action.name;
-	
-			//   this.set('tabId', jsonObj.tabId);
-	
-			// Node exists already, interactive Session 
-			var isInteractive = true;
-			var isNewTab = false; 
-        
-			loadMask.show(this.get('object').get('tabId'));
-			AmdaAction.execute({nodeType : this.get('nodeType')}, jsonObj, function(res,e)
-			{       
-				loadMask.hide();            
-				//AKKA - Rework of the result treatment for the integration with the new kernel
-				if (!e.status)
-				{
-					myDesktopApp.errorMsg('Internal error during request');
-					return;
-				}     	   
-				if (!res.success)
-				{
-					myDesktopApp.errorMsg(res.message);
-					return;
-				}            
-				// NO background jobs for PNG !!!!! Timeout KILL
-				if (res.status == amdaModel.BkgJobNode.STATUS_LIST.DONE) 
-				{
-					this.updateNode(res);	  		              		 
-					this.updateObject(res);
-					this.editNode(isNewTab, isInteractive);
-				}
-				else 
-				{
-					myDesktopApp.warningMsg(res.message);                    
-					// keep this for case of Background Job
-					/* var id = res.id;
-						var text = 'job_' + res.pid;
-						var status = amdaModel.BkgJobNode.STATUS_LIST.IN_PROGRESS; 
-						var newobj = Ext.create('amdaModel.Plot',  
-										{ resultId : id, name : res.rawname, resultId: res.rawname});
-										var newNode = Ext.create(this.$className, { id : id, pid : res.pid, text : text, jobType : 'request',
-																	leaf : true, status : status, rawname : res.rawname, object : newobj});
-						newNode.createJobNode(false);
-					*/
-				}
-			}, this);
-		},
-        
-		updateNode : function(res) 
-		{    
-			var windowId = 'plot' + this.get('tabId')+'-win';		  
-			var win = myDesktopApp.getDesktop().getWindow(windowId); 
-			//TODO if it is possible to close window before getting result?	    
-			if (!win) 
-				myDesktopApp.errorMsg('You have closed window!!!');
-			else 
-			{
-				var panelResult = win.items.items[0];
-				panelResult.setObjectIntoNode();
-			}
-		},
-       
-		updateObject : function(res) 
-		{
-			var object =  this.get('object');
-			object.set('outputName', res.name);
-			object.set('resultId', res.result);
-			object.set('startDate', res.startDate);
-			object.set('stopDate', res.stopDate);
-
-			if (object.get('timesrc') == amdaModel.AmdaTimeObject.inputTimeSrc[0] && this.action != 'zoom') 
-			{
-				object.set('intervalN', res.intervalN); 
-				object.set('totalN', res.totalN);
-				object.set('ttName', res.tableName); 
-			}  
-		}    
+		}
 });
diff --git a/js/app/models/DownloadNode.js b/js/app/models/DownloadNode.js
index 82217c9..6231c5d 100644
--- a/js/app/models/DownloadNode.js
+++ b/js/app/models/DownloadNode.js
@@ -2,7 +2,7 @@
  * Project  : AMDA-NG4
  * Name     : DownloadNode.js
  * @class   amdaModel.DownloadNode
- * @extends Ext.data.Model
+ * @extends amdaModel.ExecutableNode
  * @brief   Basic Model of Node corresponding to a download request
  * @author  Myriam
  * @version $Id: DownloadNode.js 2949 2015-06-23 10:25:59Z elena $
@@ -10,70 +10,23 @@
 
 Ext.define('amdaModel.DownloadNode', {
 
-	extend: 'Ext.data.Model',	
-	singleton: true,
+    extend: 'amdaModel.ExecutableNode',	
+
+    statics: {
+        nodeType: 'download'
+    },
         
-	fields:[{name : 'downloadType', type : 'string'},
-		{name: 'object', type: 'object'},
-		{name: 'realLinkedNode', type: 'amdaModel.AmdaNode'},
-		{name: 'moduleId', type: 'string', defaultValue:'down-win'},
-		{name: 'nodeType', type: 'string', defaultValue: 'download'},
-		{name: 'objectDataModel', type: 'string', defaultValue:'amdaModel.Download'},
-		{name: 'jobNode', type: 'string', defaultValue: 'amdaModel.BkgJobNode'}
-	], 
-    
-	isExecutable: function(){
-		return true;
-	},
-      
-	getObjectCallback : function(result,remoteEvent){  
-		var t = remoteEvent.getTransaction();
-		if (result) {            
-			var paramObj = Ext.create(this.get('objectDataModel'), result);
-			// set parameter into node
-			this.set('object', paramObj);
-			var downObject = amdaModel.DownloadNode.decodeObject();
-			// Edition	 ;
-			amdaModel.DownloadNode.set('object',Ext.create('amdaModel.Download',downObject));
-			amdaModel.DownloadNode.editInModule();              
-		} 
-		else {
-			myDesktopApp.errorMsg(t.action + "." + t.method + " : No parameter '"
-				+this.get('name')+"' found!");
-			 // EXCEPTION : parameter not found !?			 
-		}
-	},
-      
-	editInModule : function () {
-		var me = this;
-		myDesktopApp.getLoadedModule(this.get('moduleId'), true, function (module) {
-			// If the node to edit is not already linked to this module
-			if (module.getLinkedNode() != me) {
-				// set relative node into parameter Module
-				module.setLinkedNode(me);        	
-			}
-			else {// the node to edit is already edited
-				//TODO: TBD : message to user
-				//Sol1: msg alert: "warning this node is already edited! If you want to get the original, please press the 'reset' button"->'OK'
-				//Sol2: msg with user choice: "warning this node is already edited! Would you confirm this action and lost your modification?"->'Confirm','Cancel'
-			}
-			// Opening parameter window         
-			module.createWindow();
-		});
-	},
+    constructor : function(config) {
+        this.callParent(arguments);
+        this.set('moduleId',myDesktopApp.dynamicModules.download.id);
+        this.set('objectDataModel',amdaModel.Download.$className);
+    },
     
     decodeObject: function(obj) {
         var myValues  = new Object(); 		
         myValues.list=[];
 
-        if (!obj) {
-            var fullObject = this.get('realLinkedNode').get('object');	      
-        }
-        else {
-            var fullObject = obj;
-        }
-
-        fullObject.panels().each(function (panel) {
+        obj.panels().each(function (panel) {
             panel.params().each(function (param) {
                 var myParam = new Object();
                 myParam.paramid =  param.get('paramid');
@@ -98,13 +51,13 @@ Ext.define('amdaModel.DownloadNode', {
                     alert('Parameter '+ myParam.paramid + ' is PlotOnly');						
             });
         });				
-        myValues.timesrc = fullObject.get('timesrc');
+        myValues.timesrc = obj.get('timesrc');
         // if there's at least one timeTable name into 'timeTables' collection
         if (myValues.timesrc == amdaModel.AmdaTimeObject.inputTimeSrc[0]
-            && fullObject.get('timeTables')
-            && fullObject.get('timeTables').length){
+            && obj.get('timeTables')
+            && obj.get('timeTables').length){
             // get complete timeTables collection
-            var timeTables =  fullObject.get('timeTables');	    
+            var timeTables =  obj.get('timeTables');	    
             // init an empty array for timeTables
             myValues.timeTables=[];
             // for each interval record
@@ -119,150 +72,15 @@ Ext.define('amdaModel.DownloadNode', {
             });            
         }
         else {
-            myValues.startDate = fullObject.get('startDate');
-            myValues.stopDate = fullObject.get('stopDate');
-            myValues.durationDay = fullObject.get('durationDay');
-            myValues.durationHour = fullObject.get('durationHour');
-            myValues.durationMin = fullObject.get('durationMin');
-            myValues.durationSec = fullObject.get('durationSec');
+            myValues.startDate = obj.get('startDate');
+            myValues.stopDate = obj.get('stopDate');
+            myValues.durationDay = obj.get('durationDay');
+            myValues.durationHour = obj.get('durationHour');
+            myValues.durationMin = obj.get('durationMin');
+            myValues.durationSec = obj.get('durationSec');
         }
 
-        myValues.name = fullObject.get('name');
+        myValues.name = obj.get('name');
         return myValues;
-    },
-      
-	encodeObject: function() {
-	},
-  
-	loadJobTree : function(sendToSamp, clientId) {   
-		//TBD - BRE - fix code duplication with ExecutableNode if possible
-		var rootNode = Ext.getCmp(amdaUI.ExplorerUI.JOB_TAB.TREE_ID).getRootNode();
-		var me = this;
-		amdaModel.InteractiveNode.preloadNodes(rootNode,
-			function()
-			{
-				amdaModel.InteractiveNode.jobTreeLoaded = true;
-				me.realExecute(sendToSamp, clientId); 
-			});
-	},   
-    	   
-	execute : function(sendToSamp, clientId) {
-	
-		if (!amdaModel.ExecutableNode.jobTreeLoaded) this.loadJobTree(sendToSamp, clientId);
-		else this.realExecute(sendToSamp, clientId); 		
-	},
-       
-/**
-* Method to execute this node 
-*/
-	realExecute : function(sendToSamp, clientId) {
-		var jsonObject = this.get('object').getJsonValues();
-		if (!jsonObject.list && !jsonObject.images) {
-			myDesktopApp.warningMsg('Please select at least one Parameter (Get Data) or one Time Table (Get Time Table)');
-			return;
-		}
-
-		if (sendToSamp) {
-			jsonObject.sendToSamp = true;
-		}
-	
-		loadMask.show(); 
-		AmdaAction.execute({nodeType : this.get('nodeType')}, jsonObject, function(res,e)
-		{
-			loadMask.hide();
-
-			//AKKA - Rework of the result treatment for the integration with the new kernel
-			if (!e.status)
-			{
-				myDesktopApp.errorMsg('Internal error during download request');
-				return;
-			}
-			
-			if (!res.success)
-			{ 
-				myDesktopApp.errorMsg(res.message);
-				return;
-			}
-			//TBD if such condition is OK ?
-			if (!res.id && res.download) {
-				if (res.sendToSamp) {
-					myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) {
-						Ext.Array.each(res.download, function(download) {
-							module.sendVOTable(download, clientId ? clientId : 'hub');
-						});
-					});
-					return;
-				} else if (res.compression) {					
-					window.location.href = res.download;
-				}
-				else {
-					window.open(res.download, '_blank');
-				}
-				return;
-			}
-
-			if (logExecTime && res.exectime && (res.exectime != 0)) {
-				console.log("CMD EXEC TIME FOR "+res.id+" = "+res.exectime+"ms");
-			}
-			
-			var newobj = this.createJobObject(res);
-			var newNode = Ext.create(this.get('jobNode'), 
-			{
-				id : res.id,
-				info : res.info,
-				jobType : this.get('nodeType'),
-				processId : res.id,
-				text : res.name,
-				status : res.status,
-				stop : res.stop,
-				leaf : true,
-				object : newobj
-				
-			});
-			
-			// new Tab
-			switch (res.status)
-			{
-				case amdaModel.BkgJobNode.STATUS_LIST.DONE :
-					if (!res.sendToSamp) {
-						// New tab, non-interactive session
-						var isInteractive = false;
-						var isNewTab = true; 
-						newNode.createJobNode(true);
-						newNode.editNode(isNewTab, isInteractive);
-					}
-					else {
-						var files = res.result.split(",");
-						Ext.each(files, function(file) {
-							var href = 'data/'+sessionID+'/RES/'+ res.folder + '/' + file;
-							myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) {
-								module.sendVOTable(href, clientId ? clientId : 'hub');
-							});
-						});
-					}
-					break;
-				case amdaModel.BkgJobNode.STATUS_LIST.IN_PROGRESS :
-					newNode.createJobNode(false);
-					break;
-				default:
-					newNode.createJobNode(true);
-			}
-		}, this );
-	},  
-
-	createJobObject: function(res) {
-      
-		var obj =  this.get('object').getJsonValues();		    
-		//TODO text, name, outputName - if all is needed        
-		//new object to attach to new bkgJobNode	
-		//TODO Ext.clone()	
-		    
-		var newobj = Ext.copyTo({}, obj, this.get('object').propertiesToCopy);
-		newobj.id        = res.id;	
-		newobj.resultId  = res.result;	
-		newobj.folderId  = res.folder;
-		newobj = Ext.create(this.get('object').$className, newobj);
-		
-		return   newobj;  
-	}
+    }
 });
diff --git a/js/app/models/ExecutableNode.js b/js/app/models/ExecutableNode.js
index d00b5a2..e5335eb 100644
--- a/js/app/models/ExecutableNode.js
+++ b/js/app/models/ExecutableNode.js
@@ -22,35 +22,40 @@ Ext.define('amdaModel.ExecutableNode', {
 		this.set('jobNode', 'amdaModel.BkgJobNode');		 
 	},
     
-	loadJobTree : function() 
+	loadJobTree : function(opts) 
 	{            
 		var rootNode = Ext.getCmp(amdaUI.ExplorerUI.JOB_TAB.TREE_ID).getRootNode();	
 		var me = this;
 		amdaModel.InteractiveNode.preloadNodes(rootNode, function(){
 			amdaModel.ExecutableNode.jobTreeLoaded = true;
-			me.realExecute(); 
+			me.realExecute(opts); 
 		});
 	},   
    
-	execute : function(isDirty) 
+	execute : function(opts) 
 	{     
 		if (!amdaModel.ExecutableNode.jobTreeLoaded) 
-			this.loadJobTree();
+			this.loadJobTree(opts);
 		else 
-			this.realExecute();    
+			this.realExecute(opts); 
 	},
    
 	/**
 	* Method to execute this node 
 	*/
-	realExecute : function() 
+	realExecute : function(opts) 
 	{  
 		var isInteractivePlot = (this.get('nodeType') == 'request') && (this.get('object').get('file-output') == 'INTERACTIVE') || (this.get('nodeType') == 'multiplot'); 
+
+		var jsonObject = this.get('object').getJsonValues();
+		if (opts && opts.sendToSamp) {
+			opts.sendToSamp = true;
+		}
        
 		if (!loadMask.isMasked())
 			loadMask.show(isInteractivePlot);
         
-		AmdaAction.execute({nodeType : this.get('nodeType')}, this.get('object').getJsonValues(true), 
+		AmdaAction.execute({nodeType : this.get('nodeType')}, jsonObject, 
 			function(res,e)
 			{    
 				loadMask.hide();
@@ -75,6 +80,15 @@ Ext.define('amdaModel.ExecutableNode', {
 					});
 				}
 				else {
+					/*if (res.sendToSamp) {
+						myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) {
+							Ext.Array.each(res.download, function(download) {
+								module.sendVOTable(download, clientId ? clientId : 'hub');
+							});
+						});
+						return;
+					}*/
+
 					if (logExecTime && res.exectime && (res.exectime != 0)) {
 						console.log("CMD EXEC TIME FOR "+res.id+" = "+res.exectime+"ms");
 					}
@@ -96,7 +110,7 @@ Ext.define('amdaModel.ExecutableNode', {
      	    
 					newNode.get('object').on('execute', function() {
 							// Then call the node creation method
-							this.execute(arguments);
+							this.execute(opts);
 						}, newNode);
      	    
 					switch (res.status)
diff --git a/js/app/models/InteractiveNode.js b/js/app/models/InteractiveNode.js
index 6e678f6..e0d0118 100644
--- a/js/app/models/InteractiveNode.js
+++ b/js/app/models/InteractiveNode.js
@@ -487,78 +487,7 @@ Ext.define('amdaModel.InteractiveNode', {
 	createDownload: function(node)
 	{
 		myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.download.id, true, function (module) {
-			if (!myDesktopApp.desktop.getWindow(myDesktopApp.dynamicModules.download.id)) {
-				var request = Ext.create(amdaModel.Download.$className);
-				amdaModel.DownloadNode.set('object',request);
-				// singleton!
-				amdaModel.DownloadNode.editInModule();
-				if ((node.get('globalStart') != null) && (node.get('globalStop') != null) && node.get('globalStart') != 'depending on mission' &&  node.get('isParameter')) {
-					module.getUiContent().setTimeFromData(node.getTimeFromNode(node));
-				}
-			}
-				var paramName;
-				var components = null;
-				switch (node.$className) {
-					case 'amdaModel.AliasNode'        :
-						paramName = "#"+node.get('text');
-						break;
-                                                                                                    case 'amdaModel.DerivedParamComponentNode' :
-                                                                                                                                                            
-                                                                                                    paramId = node.get('text');
-                                                                                                    var parentId = paramId.substr(0, paramId.length - 3);
-                                                                                                    paramName= "ws_" + parentId;
-                                                                                                    var regExp = /\(([\d]+)\)/;
-                                                                                                     var component_index = regExp.exec(paramId);
-                                                                                                      if (component_index)
-                                                                                                      {
-                                                                                                        components = [];
-                                                                                                        components['index1'] = component_index[1];
-                                                                                                        }
-                                                                                                    break;
-                                                                                                    case 'amdaModel.MyDataParamComponentNode' : 
-                                                                                                      paramId = node.get('text');
-                                                                                                    var parentId = paramId.substr(0, paramId.length - 3);
-                                                                                                    paramName= "wsd_" + parentId;
-                                                                                                    var regExp = /\(([\d]+)\)/;
-                                                                                                     var component_index = regExp.exec(paramId);
-                                                                                                      if (component_index)
-                                                                                                      {
-                                                                                                        components = [];
-                                                                                                        components['index1'] = component_index[1];
-                                                                                                        }
-                                                                                                    break;
-					case 'amdaModel.DerivedParamNode' :
-						paramName = "ws_"+node.get('text');
-						break;
-					case 'amdaModel.MyDataParamNode' :
-						paramName = 'wsd_'+node.get('text');
-						break;
-					default :
-						if (node.get('alias')!= "" )
-							paramName = "#"+node.get('alias');
-						else
-							paramName = node.get('id');
-				}
- 				var component_info = node.get('component_info');
-				var predefinedArgs = node.get('predefinedArgs');
- 				if (component_info && component_info.parentId) {
- 					//It's a component
- 					paramName = component_info.parentId;
- 					components = [];
- 					if (component_info.index1)
- 						components['index1'] = component_info.index1;
- 					if (component_info.index2)
- 						components['index2'] = component_info.index2;
-					predefinedArgs = node.parentNode.get('predefinedArgs');
- 				}
-				if (predefinedArgs) {
-					module.parseTemplatedParam(paramName, function(param_info) {
-						module.addParam(param_info.paramid, true, node.get('needsArgs'), components, param_info.template_args);
-					});
-				}
-				else {
-					module.addParam(paramName,true,node.get('needsArgs'),components);
-				}
+			module.addParameter(node);
 		});
 	},
 
diff --git a/js/app/models/StatisticsNode.js b/js/app/models/StatisticsNode.js
index 89a12c7..41d7e0b 100644
--- a/js/app/models/StatisticsNode.js
+++ b/js/app/models/StatisticsNode.js
@@ -14,9 +14,7 @@ Ext.define('amdaModel.StatisticsNode', {
 	singleton: true,
         
 	fields: [ 
-		{name: 'downloadType', type : 'string'},
 		{name: 'object', type: 'object'},
-		{name: 'realLinkedNode', type: 'amdaModel.AmdaNode'},
 		{name: 'moduleId', type: 'string', defaultValue:'statistics-win'},
 		{name: 'nodeType', type: 'string', defaultValue: 'statistics'},
 		{name: 'objectDataModel', type: 'string', defaultValue:'amdaModel.Stats'},
diff --git a/js/app/views/DownloadUI.js b/js/app/views/DownloadUI.js
index e8ca84e..2ed0cc9 100644
--- a/js/app/views/DownloadUI.js
+++ b/js/app/views/DownloadUI.js
@@ -92,6 +92,12 @@ Ext.define('amdaUI.DownloadUI', {
         this.timeSelector.intervalSel.updateDuration();
     },
 
+    addParameter: function(paramNode, updateTime)
+    {
+        //this.paramGrid.dropTarget.notifyOver(paramNode,null,'append');
+        //this.paramGrid.dropTarget.notifyDrop(paramNode,null,'append');
+    },
+
     addParam: function (paramId, isLeaf, needArgs, components, predefined_args)
     {
         // adding the parameter to the  paramGrid	
@@ -299,7 +305,7 @@ Ext.define('amdaUI.DownloadUI', {
     doDownload: function (sendToSamp, clientId) {
         var downloadModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.download.id);
         if (downloadModule)
-            downloadModule.linkedNode.execute(sendToSamp, clientId);
+            downloadModule.linkedNode.execute({'sendToSamp': (sendToSamp == true), 'clientId': clientId});
     },
 
     actionItem: function (grid, cell, cellIndex, record, row, recordIndex, e) {
@@ -355,6 +361,11 @@ Ext.define('amdaUI.DownloadUI', {
         }
     },
 
+    doParamDrop: function(paramNode)
+    {
+        
+    },
+
     /**
      * Check if changes were made before closing window 
      * @return false
@@ -401,7 +412,7 @@ Ext.define('amdaUI.DownloadUI', {
                         {
                             var me = this;
                             var el = me.body.dom;
-                            var dropTarget = Ext.create('Ext.dd.DropTarget', el, {
+                            me.dropTarget = Ext.create('Ext.dd.DropTarget', el, {
                                 ddGroup: 'explorerTree',
                                 notifyEnter: function (ddSource, e, data) { },
                                 notifyOver: function (ddSource, e, data)
--
libgit2 0.21.2