diff --git a/simulator2d.js b/simulator2d.js
index 911e5fd67483004dd5b3b442838136ef2d0ecec9..5319edef28676187526429cf84720367bf76f7fe 100644
--- a/simulator2d.js
+++ b/simulator2d.js
@@ -21,27 +21,33 @@
 	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 simulatorDataHor = [];
+	let simulatorDataVer = [];
 	let scaleHor;
-	let scaleSaturated = false;
 	let scaleVer;
 	let simulatorBuffer = false;
 	let logScaleHor = false;
 	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;
-	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 scaleSteps = 10;
+	function myreference(param) {
+		const dir = param.split('_')[0];
+		const action = param.split('_')[1];
+		if (action=='set') localStorage.setItem('reference'+dir, JSON.stringify(dir=='hor'? simulatorDataHor: simulatorDataVer));
+		if (action=='clear') localStorage.removeItem('reference'+dir);
+	}
+	function elapseHor(step, up) {
+		// console.log('elapseHor()',step,scaleHor.$fill.style.width, (scaleSteps-step)/scaleSteps*90);
+		if (up) {
+			if (step<scaleSteps) {const pc = Math.round((scaleSteps-step)/scaleSteps*90); scaleHor.$fill.style.width=pc+"%";setTimeout(elapseHor, 20, step+1, up); 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;}
+		else {
+			if (step<scaleSteps) {const pc = Math.round(step/scaleSteps*10); scaleHor.$fill.style.width=pc+"%";setTimeout(elapseHor, 20, step+1, up); return;}
 			const buf = scaleHor._max/10; 
 			scaleHor.max(buf); 
 			scaleHor.min(buf/100);
@@ -50,39 +56,43 @@
 		scaleHor.$fill.style.width="10%";
 		scaleHor.$fill.style.borderColor = '#2cc9ff';
 	}
-	function elapseVer(step) {
-		scaleSaturated = false;
-		if (scaleVer.$fill.style.width=="100%") {
+	function elapseVer(step, up) {
+		if (up) {
+			if (step<scaleSteps) {const pc = Math.round(100 - (scaleSteps-step)/scaleSteps*90); scaleVer.$fill.style.width=pc+"%";setTimeout(elapseVer, 200, step+1, up); return;}
 			const buf = scaleVer._max; 
 			scaleVer.max(buf*10); 
 			scaleVer.min(buf/10); 
 			scaleVer.step(buf/100);
-			// 
 		}
-		else if (scaleVer.$fill.style.width=="0%") {
+		else {
+			if (step<scaleSteps) {const pc = Math.round(step/scaleSteps*10); scaleVer.$fill.style.width=pc+"%";setTimeout(elapseVer, 200, step+1, up); return;}
 			const buf = scaleVer._max/10; 
 			scaleVer.max(buf); 
 			scaleVer.min(buf/100);
 			scaleVer.step(buf/1000);
 		}
 		scaleVer.$fill.style.width="10%";
+		scaleVer.$fill.style.borderColor = '#2cc9ff';
 	}
 	function finishHor() {
-		console.log('finishHor()', scaleHor.$fill.style.width);
+		// 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);
+			setTimeout(elapseHor, 200, 1, scaleHor.$fill.style.width=="100%");
 		}
 	}
 	function finishVer() {
-		console.log('finishHor()', scaleHor.$fill.style.width);
-		if (scaleSaturated) setTimeout(elapseVer, 100, 1);
+		if (scaleVer.$fill.style.width=="100%" || scaleVer.$fill.style.width=="0%") {
+			setTimeout(elapseVer, 200, 1, scaleVer.$fill.style.width=="100%");
+		}
 	}
 	function factorHor(v) {
-		scaleHor.$fill.style.borderColor =  (scaleHor.$fill.style.width=="100%" || scaleHor.$fill.style.width=="0%")? 'yellow': '#2cc9ff';
+		// console.log('factorHor(v)', v, scaleHor.$fill.style.width);
+		scaleHor.$fill.style.borderColor = (scaleHor.$fill.style.width=="100%" || scaleHor.$fill.style.width=="0%")? 'yellow': '#2cc9ff';
 		simulatorFactorHor = v * 1000;
 	}
 	function factorVer(v) {
+		scaleVer.$fill.style.borderColor = (scaleVer.$fill.style.width=="100%" || scaleVer.$fill.style.width=="0%")? 'yellow': '#2cc9ff';
 		simulatorFactorVer = v * 1000;
 	}
 	function logscale(dirNum) {
@@ -100,7 +110,7 @@
 	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.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) {
@@ -121,10 +131,10 @@
 		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);}).onFinishChange(function() {finishHor(gui);});
-			// guiscale(gui, 'scaleh');
+			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');
+			guiscale(gui, 'scalev');
 		}
 		else {
 			const controllerOption = $('.controller.option');
@@ -178,7 +188,9 @@
 							);
 						}
 						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+"_simulatorreferencehor", class: "simulatorhor trajectory "+facility, visibility:visibility, name:"simulatorreferencehor", fill: "none", "stroke-width":"150", "stroke":"darkred", "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');
+						appendSvg("path", {id:facility+"_simulatorreferencever", class: "simulatorver trajectory "+facility, visibility:visibility, name:"simulatorreferencever", fill: "none", "stroke-width":"150", "stroke":"darkgreen", "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'});
 					}
 				}
@@ -204,12 +216,14 @@
 	}
 	function simulatorSwitch(simulatorData, params) {
 		console.log('simulatorSwitch()',simulatorData, params, params.simulator);
+		scaleHor.$fill.style.width = "50%";
+		scaleVer.$fill.style.width = "50%";
 		if (simulatorData.reader !== false) {
 			clearInterval(simulatorData.reader);
 		}
 		simulatorData.reader = false;
 		if (params.simulator=='position') {
-			$('#application').show();	
+			$('#application').show();
 			$('#applicationFrame').attr("src", $('#applicationFrame').attr("data-src"));
 		}
 		else {
@@ -226,8 +240,10 @@
 			$('.simulatorgauge').hide();
 			$('#scaleh').hide();
 			$('#scalev').hide();
+			$('#applicationReference').hide();
 		} 
 		else {
+			$('#applicationReference').show();
 			$('#scaleh').show();
 			$('#scalev').show();
 			for (let facility in simulatorData) {
@@ -277,8 +293,8 @@
 	}
 	function simulatorRender(facility, val, simulator) {
 		// console.log('simulatorRender(), val', val, simulator, compData[facility]);
-		const dhor = [];
-		const dver = [];
+		simulatorDataHor = [];
+		simulatorDataVer = [];
 		if (val.Hor) {
 			for (i=0; i<val.Hor.length; i++) {
 				if (typeof compData[facility].map[i] == 'undefined') continue;
@@ -291,18 +307,18 @@
 				const valHor = logScaleHor? Math.sign(val.Hor[i])*Math.log10(1+ Math.abs(val.Hor[i]*Math.LN10)): val.Hor[i];
 				const valVer = logScaleVer? Math.sign(val.Ver[i])*Math.log10(1+ Math.abs(val.Ver[i]*Math.LN10)): val.Ver[i];
 				// if (i<20) console.log('i', i, 'pos',pos, 'dir', compData[facility].dir[i], 'facility', facility, beta, Math.cos(beta), Math.sin(beta));
-				dhor.push((dhor.length==0?'M':'L')+ 
+				simulatorDataHor.push((simulatorDataHor.length==0?'M':'L')+ 
 					Math.round(pos[0] - valHor*simulatorFactorHor*Math.sin(beta)) + ' ' + 
 					Math.round(pos[1] + valHor*simulatorFactorHor*Math.cos(beta))
 				);
-				dver.push((dver.length==0?'M':'L')+ 
+				simulatorDataVer.push((simulatorDataVer.length==0?'M':'L')+ 
 					Math.round(pos[0] - valVer*simulatorFactorVer*Math.sin(beta)) + ' ' + 
 					Math.round(pos[1] + valVer*simulatorFactorVer*Math.cos(beta))
 				);
 			}
-			// console.log('Hor', dhor.join(' ')+(lattice[facility].sections[0].chamber?' Z':''));
-			$('#'+facility+"_simulatorhor").attr('d', dhor.join(' ')+(lattice[facility].sections[0].chamber?' Z':''));
-			$('#'+facility+"_simulatorver").attr('d', dver.join(' ')+(lattice[facility].sections[0].chamber?' Z':''));
+			// console.log('Hor', simulatorDataHor.join(' ')+(lattice[facility].sections[0].chamber?' Z':''));
+			$('#'+facility+"_simulatorhor").attr('d', simulatorDataHor.join(' ')+(lattice[facility].sections[0].chamber?' Z':''));
+			$('#'+facility+"_simulatorver").attr('d', simulatorDataVer.join(' ')+(lattice[facility].sections[0].chamber?' Z':''));
 		}
 	}
 	function simulatorDisplay(params) {