diff --git a/simulator2d.js b/simulator2d.js
index 32032fe3bc61caab724b42f697cf94efc847a433..911e5fd67483004dd5b3b442838136ef2d0ecec9 100644
--- a/simulator2d.js
+++ b/simulator2d.js
@@ -17,6 +17,8 @@
 		factorsVer = {"": 1000, "position": 5000, 'beta': 0.25, 'eta': 100, 'mu': 0.2, 'sigma': 5000000};
 	}
 	const simulator = document.location.search.indexOf('simulator=')>-1? document.location.search.split('simulator=')[1].split('&')[0]: '';
+	const readerPeriod = document.location.search.indexOf('readerPeriod=')>-1? document.location.search.split('readerPeriod=')[1].split('&')[0]: 200;
+	const displayerPeriod = document.location.search.indexOf('displayerPeriod=')>-1? document.location.search.split('displayerPeriod=')[1].split('&')[0]: 200;
 	const visibility = simulator==''? 'hidden': 'visible';
 	const scaleType = 'slider';
 	let scaleHor;
@@ -27,25 +29,85 @@
 	let logScaleVer = false;
 	let simulatorFactorHor = document.location.search.indexOf('simulatorFactorHor=')>-1? document.location.search.split('simulatorFactorHor=')[1].split('&')[0]*1000*(simulator=='sigma'? 1000000: 1): factorsHor[simulator]*1000;
 	let simulatorFactorVer = document.location.search.indexOf('simulatorFactorVer=')>-1? document.location.search.split('simulatorFactorVer=')[1].split('&')[0]*1000*(simulator=='sigma'? 1000000: 1): factorsVer[simulator]*1000;
-	function elapseSaturated() {scaleSaturated = false;}
+	const scaleSteps = 5;
+	function elapseHor(step) {
+		console.log('elapseHor()',step,scaleHor.$fill.style.width, 100 - (scaleSteps-step)/scaleSteps*90);
+		scaleSaturated = false;
+		if (scaleHor.$fill.style.width=="100%") {
+			if (step<scaleSteps) {const pc = Math.round(100 - (scaleSteps-step)/scaleSteps*90); scaleHor.$fill.style.width=pc+"%";setTimeout(elapseHor, 1000, step+1); return;}
+			const buf = scaleHor._max; 
+			scaleHor.max(buf*10); 
+			scaleHor.min(buf/10); 
+			scaleHor.step(buf/100);
+		}
+		else if (scaleHor.$fill.style.width=="0%") {
+			if (step<scaleSteps) {const pc = Math.round(step/scaleSteps*10); scaleHor.$fill.style.width=pc+"%";setTimeout(elapseHor, 200, step+1); return;}
+			const buf = scaleHor._max/10; 
+			scaleHor.max(buf); 
+			scaleHor.min(buf/100);
+			scaleHor.step(buf/1000);
+		}
+		scaleHor.$fill.style.width="10%";
+		scaleHor.$fill.style.borderColor = '#2cc9ff';
+	}
+	function elapseVer(step) {
+		scaleSaturated = false;
+		if (scaleVer.$fill.style.width=="100%") {
+			const buf = scaleVer._max; 
+			scaleVer.max(buf*10); 
+			scaleVer.min(buf/10); 
+			scaleVer.step(buf/100);
+			// 
+		}
+		else if (scaleVer.$fill.style.width=="0%") {
+			const buf = scaleVer._max/10; 
+			scaleVer.max(buf); 
+			scaleVer.min(buf/100);
+			scaleVer.step(buf/1000);
+		}
+		scaleVer.$fill.style.width="10%";
+	}
+	function finishHor() {
+		console.log('finishHor()', scaleHor.$fill.style.width);
+		if (scaleHor.$fill.style.width=="100%" || scaleHor.$fill.style.width=="0%") {
+			// scaleHor.$fill.style.borderColor = 'yellow';
+			setTimeout(elapseHor, 200, 1);
+		}
+	}
+	function finishVer() {
+		console.log('finishHor()', scaleHor.$fill.style.width);
+		if (scaleSaturated) setTimeout(elapseVer, 100, 1);
+	}
 	function factorHor(v) {
-		console.log('factorHor()', v);
-		if (scaleHor._max*1000000 == v*1000000 && v<1000000000000 && !scaleSaturated) {scaleSaturated = true; setTimeout(elapseSaturated, 3000); const buf = scaleHor._max; scaleHor.max(buf*10); scaleHor.min(buf/10); scaleHor.step(buf/100);}
-		else if (scaleHor._min*1000000 == v*1000000 && v>0.000000000001 && !scaleSaturated) {scaleSaturated = true; setTimeout(elapseSaturated, 3000); const buf = scaleHor._max/10; scaleHor.max(buf); scaleHor.min(buf/100);scaleHor.step(buf/1000);}
+		scaleHor.$fill.style.borderColor =  (scaleHor.$fill.style.width=="100%" || scaleHor.$fill.style.width=="0%")? 'yellow': '#2cc9ff';
 		simulatorFactorHor = v * 1000;
 	}
 	function factorVer(v) {
-		console.log('factorVer()', v);
-		if (scaleVer._max == v && v<1000000000000 && !scaleSaturated) {scaleSaturated = true; setTimeout(elapseSaturated, 3000); const buf = scaleVer._max; scaleVer.max(buf*10); scaleVer.min(buf/10); scaleVer.step(buf/100);}
-		else if (scaleVer._min == v && v>0.000000000001 && !scaleSaturated) {scaleSaturated = true; setTimeout(elapseSaturated, 3000); const buf = scaleVer._max/10; scaleVer.max(buf); scaleVer.min(buf/100);scaleVer.step(buf/1000);}
 		simulatorFactorVer = v * 1000;
 	}
 	function logscale(dirNum) {
 		if (dirNum==0) logScaleHor = $('#logHor').attr('checked')=='checked';
 		else logScaleVer = $('#logVer').attr('checked')=='checked';
 	}
+	function decademinus(id) {
+		const buf = scaleHor._max/10; scaleHor.max(buf); scaleHor.min(buf/100);scaleHor.step(buf/1000);
+		console.log(id, scaleHor._max);
+	}
+	function decadeplus(id) {
+		const buf = scaleHor._max; scaleHor.max(buf*10); scaleHor.min(buf/10); scaleHor.step(buf/100);
+		console.log(id, scaleHor._max);
+	}
+	function guiscale(gui, id) {
+		const i = gui.children.length - 1;
+		gui.children[i].domElement.style.display = 'none';
+		gui.children[i].domElement.children[0].innerHTML = '<span style="padding: 5px;" onClick="decademinus(\''+id+'\')">-</span> '+ gui.children[i].domElement.children[0].innerHTML + ' <span style="padding: 3px;" onClick="decadeplus(\''+id+'\')">+</span>';
+		gui.children[i].domElement.setAttribute('id', id);
+	}
 	function simulatorMenu(lattice, facilities, params) {
-		console.log('simulatorMenu',lattice, facilities, params);
+		console.log('simulatorMenu',lattice, facilities, params, gui);
+		if (['elettra2', 'esrf', 'soleil'].indexOf(machine)>-1) for (let i=0; i<gui.children.length; i++) {
+			if (['vlv', 'ps', 'bpm', 'blm'].indexOf(gui.children[i].property)>-1) gui.children[i].domElement.style.display = 'none';
+		}
 		// params.simulator = false;
 		$('.simulatorhor').css('display', 'none');
 		$('.simulatorver').css('display', 'none');
@@ -58,9 +120,11 @@
 		const maxHor = Math.pow(10, Math.floor(Math.log10(simulatorFactorHor/1000))+2);
 		if (scaleType == 'slider') {
 			menuParams['scale H'] = simulatorFactorHor/1000;
-			scaleHor = gui.add(menuParams, 'scale H', maxVer/100, maxVer, Math.round(maxVer/1000)).onChange(function() {factorHor(menuParams['scale H'], gui);});
+			scaleHor = gui.add(menuParams, 'scale H', maxVer/100, maxVer, Math.round(maxVer/1000)).onChange(function() {factorHor(menuParams['scale H'], gui);}).onFinishChange(function() {finishHor(gui);});
+			// guiscale(gui, 'scaleh');
 			menuParams['scale V'] = simulatorFactorHor/1000;
 			scaleVer = gui.add(menuParams, 'scale V', maxHor/100, maxHor, Math.round(maxHor/1000)).onChange(function() {factorVer(menuParams['scale V'], gui);});
+			// guiscale(gui, 'scalev');
 		}
 		else {
 			const controllerOption = $('.controller.option');
@@ -113,8 +177,8 @@
 								  Math.round(compData[facility].pos[i][1] + f*1.05*Math.cos(beta))
 							);
 						}
-						appendSvg("path", {id:facility+"_simulatorhor", class: "simulatorhor "+facility, visibility:visibility, name:"simulatorhor", fill: "none", "stroke-width":"150", "stroke":"red", "stroke-opacity":"0.8", d: dhor.join(' ')+(lattice[facility].sections[0].chamber?' Z':'')}, false, false, false, '.svg-pan-zoom_viewport');
-						appendSvg("path", {id:facility+"_simulatorver", class: "simulatorver "+facility, visibility:visibility, name:"simulatorver", fill: "none", "stroke-width":"150", "stroke":"green", "stroke-opacity":"0.8", d: dver.join(' ')+(lattice[facility].sections[0].chamber?' Z':'')}, false, false, false, '.svg-pan-zoom_viewport');
+						appendSvg("path", {id:facility+"_simulatorhor", class: "simulatorhor trajectory "+facility, visibility:visibility, name:"simulatorhor", fill: "none", "stroke-width":"150", "stroke":"red", "stroke-opacity":"0.8", d: dhor.join(' ')+(lattice[facility].sections[0].chamber?' Z':'')}, simulator_clicked_hor, false, false, '.svg-pan-zoom_viewport');
+						appendSvg("path", {id:facility+"_simulatorver", class: "simulatorver trajectory "+facility, visibility:visibility, name:"simulatorver", fill: "none", "stroke-width":"150", "stroke":"green", "stroke-opacity":"0.8", d: dver.join(' ')+(lattice[facility].sections[0].chamber?' Z':'')}, simulator_clicked_ver, false, false, '.svg-pan-zoom_viewport');
 						// console.log("path", {id:facility+"_simulatorhor", name:"simulatorhor", d: dver.join(' ')+' Z'});
 					}
 				}
@@ -124,6 +188,14 @@
 	}
 	// const threshold = document.location.search.indexOf('threshold=')>-1? document.location.search.split('threshold=')[1].split('&')[0]: 1000;
 	// const f = document.location.search.indexOf('factor=')>-1? document.location.search.split('factor=')[1].split('&')[0]: 3000;
+	function simulator_clicked_hor(event) {
+		// console.log('simulator hor', event);
+		openTooltip('trajectory hor '+event.clientX+' '+event.clientY);
+	}
+	function simulator_clicked_ver(lattice, params) {
+		// console.log('simulator ver');
+		openTooltip('trajectory ver'+event.clientX+' '+event.clientY);
+	}
 	function simulator2d(lattice, params) {
 		console.log('simulator2d',lattice, params);
 		const facilities = [];
@@ -136,6 +208,14 @@
 			clearInterval(simulatorData.reader);
 		}
 		simulatorData.reader = false;
+		if (params.simulator=='position') {
+			$('#application').show();	
+			$('#applicationFrame').attr("src", $('#applicationFrame').attr("data-src"));
+		}
+		else {
+			$('#application').hide();
+			$('#applicationFrame').removeAttr("src");
+		}
 		if (params.simulator=='') {
 			for (let facility in simulatorData) {
 				if (typeof $('#'+facility+"_simulatorhor").attr('visibility') != 'undefined') {
@@ -143,11 +223,13 @@
 					$('#'+facility+"_simulatorver").attr('visibility', "hidden");
 				}
 			}
-			$('#application').hide();
-			$('#applicationFrame').removeAttr("src");
 			$('.simulatorgauge').hide();
+			$('#scaleh').hide();
+			$('#scalev').hide();
 		} 
 		else {
+			$('#scaleh').show();
+			$('#scalev').show();
 			for (let facility in simulatorData) {
 				if (typeof $('#'+facility+"_simulatorhor").attr('visibility') != 'undefined') {
 					$('#'+facility+"_simulatorhor").attr('visibility', "visible");
@@ -158,9 +240,8 @@
 				simulatorData.oldIndex = facility;
 				simulatorRead(simulatorData, params);
 			}
-			displayer = setInterval(simulatorDisplay, 200, params);
-			simulatorData.reader = setInterval(simulatorRead, 200, simulatorData, params);
-			$('#application').show();	
+			displayer = setInterval(simulatorDisplay, displayerPeriod, params);
+			simulatorData.reader = setInterval(simulatorRead, readerPeriod, simulatorData, params);
 			$('.simulatorhor').css('display', 'block');
 			$('.simulatorver').css('display', 'block');
 			simulatorFactorHor = factorsHor[menuParams.simulator]*1000;