Index: data/LibsDB/OscadaLibs.sql
===================================================================
--- data/LibsDB/OscadaLibs.sql	(revision 3052)
+++ data/LibsDB/OscadaLibs.sql	(working copy)
@@ -4585,7 +4585,7 @@
 else if(destUp < 0 || destUp > 16383)
 	t_err = "2:"+tr("Upper HDLC destination address ''%1'' out of range [0...16383].").replace("%1",destUp.toString());
 else if(destLow < 0 || destLow > 16383)
-	t_err = "2:"+tr("Lower HDLC destination address ''%1'' out of range [0...16383].").replace("%1",destUp.toString());
+	t_err = "2:"+tr("Lower HDLC destination address ''%1'' out of range [0...16383].").replace("%1",destLow.toString());
 else if(src < 0 || src > 127)
 	t_err = "2:"+tr("Source address ''%1'' out of range [0...127].").replace("%1",src.toString());
 else if(!tr.start()) {
@@ -9258,7 +9258,7 @@
   - the field "CustomAlarms" — redefinition of the standard alarm levels of the alarm messages in the form "CustomAlarms: {ConErr};{BrdAlarm};{BrdWarn}".
 
 Author: Roman Savochenko <roman@oscada.org>
-Version: 2.4.2
+Version: 2.4.3
 License: GPLv2','Загальний, представницький та уніфікований шаблон обробки аналогових вхідних сигналів. Шаблон формує структуру складного аналогового параметру (тегу) який може бути легко підключений до більшості віджетів та кадрів бібліотеки основних елементів інтерфейсу користувача просто вказавши об''єкт параметру.
 
 Функції:
@@ -9299,7 +9299,7 @@
   - поле "CustomAlarms" — перевизначення стандартних рівнів порушень для повідомлень порушень у формі "CustomAlarms: {ConErr};{BrdAlarm};{BrdWarn}".
 
 Автор: Роман Савоченко <roman@oscada.org>
-Версія: 2.4.2
+Версія: 2.4.3
 Ліцензія: GPLv2','',10,0,'JavaLikeCalc.JavaScript
 function custAlarm(lev) {
 	rez = 0;
@@ -9378,13 +9378,13 @@
 	else if(subMode == 2) var = subVar;
 }
 else if(in > (max(pMax,pMin)+plcExcess*abs(pMax-pMin)/100)) {
-	tErr = "1:"+tr("The signal exceed to upper hardware border"); levErr = -custAlarm(0);
+	tErr = "1:"+tr("The signal exceed to upper hardware border")+" ("+in+")"; levErr = -custAlarm(0);
 	var = EVAL_REAL;
 	if(subMode == 1) var = prevVar.isEVal() ? max+plcExcess*(max-min)/100 : prevVar;
 	else if(subMode == 2) var = subVar;
 }
 else if(in < (min(pMax,pMin)-plcExcess*abs(pMax-pMin)/100)) {
-	tErr = "2:"+tr("The signal exceed to bottom hardware border"); levErr = -custAlarm(0);
+	tErr = "2:"+tr("The signal exceed to bottom hardware border")+" ("+in+")"; levErr = -custAlarm(0);
 	var = EVAL_REAL;
 	if(subMode == 1) var = prevVar.isEVal() ? min-plcExcess*(max-min)/100 : prevVar;
 	else if(subMode == 2) var = subVar;
@@ -9430,7 +9430,7 @@
 	else	this.alarmSet(DESCR.parseLine(0)+((tVl=DESCR.match("^CustomFlds: *(.+?) *$","m")).length?" [["+tVl[1]+"]]":"")+": "+tr("NORM"), 1, firstNorm);
 	f_err = tErr;
 	alDelay_ = 0; firstNorm = false;
-}','','',1686917407);
+}','','',1768981464);
 INSERT INTO tmplib_base VALUES('digitBlockUnif','Discrete block, unified','Блок дискретних, уніфікований','Блок дискретных, унифицированный','Common, representative and unified template of the block for union of Discrete parameters for the common control device. The template forms a structure of discrete parameter-block (complex tag) which can be easily connected to most widgets and cadres of the main elements library of the user interface just pointing the parameter object.
 
 The representative structure of discrete parameters (complex tags) is a latch object with two characteristic states and three commands, which in the final representation may have a different meaning and name:
@@ -10406,12 +10406,12 @@
 
 Author: Roman Savochenko <roman@oscada.org>
 Sponsored by: DIYA LTD
-Version: 2.1.2
+Version: 2.2.0
 License: GPLv2','Об''єднання даних Джерела Безперебійного Живлення у комплексному об''єкті атрибуту "Всі елементи". Шаблон розроблено для використання із модулем джерела даних "Система" у частині "ДБЖ" та представлення цих даних кадром "Властивості об''єкту" як комплексний об''єкт із властивостями, сигналізацією за окремими границями та записом.
 
 Автор: Роман Савоченко <roman@oscada.org>
 Спонсоровано: ТОВ "ДІЯ"
-Версія: 2.1.2
+Версія: 2.2.0
 Ліцензія: GPLv2','',10,0,'JavaLikeCalc.JavaScript
 //Source types:
 //null - Unknown/Disabled
@@ -10488,8 +10488,24 @@
 	itemsO.set = EVAL;
 }
 
-if(f_start)	{ items = new Object(); alDelay_ = 0; srcAddr_ = srcAddr; defs_ = ""; }
+function alarm(val, brdId, dir)
+{
+	var brdAlarms;
+	if(brdAlarms == null)	brdAlarms = new Object();
+	if(brdAlarms[brdId] == null)	brdAlarms[brdId] = false;
 
+	//Entry to the alarm
+	if(dir*(val-arguments[brdId]) > 0)
+		brdAlarms[brdId] = true;
+	//Exiting the alarm with the hysteresis
+	else if(brdAlarms[brdId] && dir*(val-arguments[brdId]*(1-dir*hyst/100)) < 0)
+		brdAlarms[brdId] = false;
+
+	return brdAlarms[brdId];
+}
+
+if(f_start)	{ items = new Object(); alDelay_ = 0; srcAddr_ = srcAddr; defs_ = ""; brdAlarms = new Array(); }
+
 alLev = 0;
 tErr = "";
 
@@ -10653,26 +10669,27 @@
 	//Processing the alarms and marks
 	varS = "ups_status";
 	if((tP=items[varS]) != null && (tVl=tP.val) != null) {
-		if(tVl == "OB")		{ tP.alarm = 1; tErr += tr("Status")+" \""+tr("On battery")+"\"; "; }
-		else if(tVl == "LB"){ tP.alarm = 2; tErr += tr("Status")+" \""+tr("Low battery")+"\"; "; }
-		else if(tVl == "SD"){ tP.alarm = 2; tErr += tr("Status")+" \""+tr("Shutdown load")+"\"; "; }
+		if(tVl == "OB")			{ tP.alarm = 1; tErr += tr("Status")+" \""+tr("On battery")+"\"; "; }
+		else if(tVl == "LB")	{ tP.alarm = 2; tErr += tr("Status")+" \""+tr("Low battery")+"\"; "; }
+		else if(tVl == "SD")	{ tP.alarm = 2; tErr += tr("Status")+" \""+tr("Shutdown load")+"\"; "; }
 		else if(tVl.indexOf("ALARM") != -1) { tP.alarm = 2; tErr += tr("Status")+" \""+tr("ALARM")+"\"; "; }
 		else tP.alarm = 0;
 	}
 	varS = "battery_packs";
 	if((tP=items[varS]) != null && (tVl=tP.val) != null) {
-		if(tVl.toInt() == 0){ tP.alarm = 2; tErr += tr("None of good battery present")+"; "; }
+		if(tVl.toInt() == 0)	{ tP.alarm = 2; tErr += tr("None of good battery present")+"; "; }
 		else tP.alarm = 0;
 	}
 	varS = "battery_charge";
 	if((tP=items[varS]) != null && (tVl=tP.val) != null) {
-		if(tVl.toReal() < bChL) { tP.alarm = 1; tErr += tr("Battery charge low")+"; "; }
-		else if(tVl.toReal() < bChLL) { tP.alarm = 2; tErr += tr("Battery charge critical")+"; "; }
+		tVl = tVl.toReal();
+		if(alarm(tVl,"bChL",-1))			{ tP.alarm = 1; tErr += tr("Battery charge low")+"; "; }
+		else if(alarm(tVl,"bChLL",-1))	{ tP.alarm = 2; tErr += tr("Battery charge critical")+"; "; }
 		else tP.alarm = 0;
 	}
 	varS = "battery_packs_bad";
 	if((tP=items[varS]) != null && (tVl=tP.val) != null) {
-		if(tVl.toInt())	{ tP.alarm = 1; tErr += tr("Bad %1 batteries present").replace("%1",tVl); }
+		if(tVl.toInt())			{ tP.alarm = 1; tErr += tr("Bad %1 batteries present").replace("%1",tVl); }
 		else tP.alarm = 0;
 	}
 	noPower = false;
@@ -10679,9 +10696,9 @@
 	varS = "input_voltage";
 	if((tP=items[varS]) != null && (tVl=tP.val) != null) {
 		tVl = tVl.toReal();
-		if(tVl < 0.1*inVL)	{ tP.alarm = 2; tErr += tr("No powernet")+"; "; noPower = true; }
-		else if(tVl < inVL)	{ tP.alarm = 1; tErr += tr("Input voltage low")+"; "; }
-		else if(tVl > inVH)	{ tP.alarm = 1; tErr += tr("Input voltage high")+"; "; }
+		if(tVl < 0.1*inVL)				{ tP.alarm = 2; tErr += tr("No powernet")+"; "; noPower = true; }
+		else if(alarm(tVl,"inVL",-1)){ tP.alarm = 1; tErr += tr("Input voltage low")+"; "; }
+		else if(alarm(tVl,"inVH",1))	{ tP.alarm = 1; tErr += tr("Input voltage high")+"; "; }
 		else tP.alarm = 0;
 	}
 	varS = "input_frequency";
@@ -10688,22 +10705,24 @@
 	if((tP=items[varS]) != null && (tVl=tP.val) != null) {
 		tVl = tVl.toReal();
 		if(tVl < 0.1*inFLL)	{ tP.alarm = 2; if(!noPower) tErr += tr("No powernet")+"; "; }
-		else if(tVl < inFLL){ tP.alarm = 2; tErr += tr("Input frequency too low")+"; "; }
-		else if(tVl > inFHH){ tP.alarm = 2; tErr += tr("Input frequency too high")+"; "; }
-		else if(tVl < inFL)	{ tP.alarm = 1; tErr += tr("Input frequency low")+"; "; }
-		else if(tVl > inFH)	{ tP.alarm = 1; tErr += tr("Input frequency high")+"; "; }
+		else if(alarm(tVl,"inFLL",-1))	{ tP.alarm = 2; tErr += tr("Input frequency too low")+"; "; }
+		else if(alarm(tVl,"inFHH",1))	{ tP.alarm = 2; tErr += tr("Input frequency too high")+"; "; }
+		else if(alarm(tVl,"inFL",-1))	{ tP.alarm = 1; tErr += tr("Input frequency low")+"; "; }
+		else if(alarm(tVl,"inFH",1))		{ tP.alarm = 1; tErr += tr("Input frequency high")+"; "; }
 		else tP.alarm = 0;
 	}
 	varS = "ups_load";
 	if((tP=items[varS]) != null && (tVl=tP.val) != null) {
-		if(tVl.toReal() > loadHH)		{ items[varS].alarm = 2; tErr += tr("UPS overloaded")+"; "; }
-		else if(tVl.toReal() > loadH){ tP.alarm = 1; tErr += tr("UPS load high")+"; "; }
+		tVl = tVl.toReal();
+		if(alarm(tVl,"loadHH",1))		{ tP.alarm = 2; tErr += tr("UPS overloaded")+"; "; }
+		else if(alarm(tVl,"loadH",1)){ tP.alarm = 1; tErr += tr("UPS load high")+"; "; }
 		else tP.alarm = 0;
 	}
 	varS = "ups_temperature";
 	if((tP=items[varS]) != null && (tVl=tP.val) != null) {
-		if(tVl.toReal() > tHH) 	{ tP.alarm = 2; tErr += tr("UPS overheated")+"; "; }
-		else if(tVl.toReal() > tH){ tP.alarm = 1; tErr += tr("Temperature high")+"; "; }
+		tVl = tVl.toReal();
+		if(alarm(tVl,"tHH",1)) 	{ tP.alarm = 2; tErr += tr("UPS overheated")+"; "; }
+		else if(alarm(tVl,"tH",1)){ tP.alarm = 1; tErr += tr("Temperature high")+"; "; }
 		else tP.alarm = 0;
 	}
 
@@ -10734,7 +10753,7 @@
 	else	this.alarmSet(DESCR+": "+tr("NORM"), 1);
 	f_err = tErr;
 	alDelay_ = 0;
-}','','',1760962537);
+}','','',1768979418);
 INSERT INTO tmplib_base VALUES('initConAssociateTrs','Initiative connections processing for the associated output transports','Опрацювання ініціативних підключень щодо асоційованих вихідних транспортів','Обработка инициативных подключений на предмет ассоциированных выходных транспортов','
 The template of processing input initiative connections was created to provide the last link of implementation and support for conception of data acquisition in the passive mode and the initiative connection, that is — the control of associative connections, created by the input transport at each connection.
 
@@ -11202,7 +11221,7 @@
 The aggregated data in DAQ.GAQGate can be lifted to up, or used in derivative DAQ objects, or whether directly on custom frames, or in future on a Dynamic Frame, which scheduled to implement; and without any additional action you will get notification about violations on the hosts.
 
 Author: Roman Savochenko <roman@oscada.org>
-Version: 1.1.5
+Version: 1.1.6
 License: GPLv2','Шаблон опрацювання вхідних ініціативних підключень розширює попередній шаблон опрацювання ініціативних підключень щодо асоційованих вихідних транспортів повним представлення даних віддалених хостів OpenSCADA на деякому агрегувальному сервері, чим завершуючи концепцію збору даних у пасивному режимі та ініціативного підключення.
 
 Шаблон загалом здійснює:
@@ -11230,7 +11249,7 @@
 Агреговані дані у DAQ.GAQGate можуть бути підняті на гору, або використані у похідних DAQ об''єктах, або прямо на користувацьких кадрах, або у майбутньому на Динамічному Кадрі, який заплановано до реалізації; та без жодних додаткових дій ви отримаєте сповіщення про порушення на хостах.
 
 Автор: Роман Савоченко <roman@oscada.org>
-Версія: 1.1.5
+Версія: 1.1.6
 Ліцензія: GPLv2','',60,0,'JavaLikeCalc.JavaScript
 function prmAdd(req, path, pId, pNm, pTp, pSrc, pLogLnk) {
 	req.childAdd("add").setAttr("path",path+"/%2fbr%2fprm_").setAttr("id",pId).setText(pNm);
@@ -11290,7 +11309,11 @@
 				delete prcCon[stNm];
 			}
 		}
-		if(rez.toInt() || !req.childGet(0).text().length || noAccess[stNm] != null) { oTrO.start(false); continue; }
+		if(rez.toInt() || !req.childGet(0).text().length || noAccess[stNm] != null) {
+			oTrO.start(false);
+			delete req;
+			continue;
+		}
 
 		stSrcKey = rand(255).toString(16, 2);
 		isSrcInited = isHostReqPresent = false;
@@ -11353,6 +11376,7 @@
 											.replace("%1",stNm).replace("%2",req.childGet(0).text())));
 
 				oTrO.start(false);
+				delete req;
 				continue;
 			}
 
@@ -11451,6 +11475,8 @@
 				req.childAdd("del").setAttr("path","/Transport/%2fsub%2fehost").setAttr("key_id",daqID);
 				req.childAdd("save").setAttr("path","/Transport/%2fobj");
 				SYS.cntrReq(req);
+
+				delete req;
 			}
 		delete daqO;
 	}
@@ -11463,7 +11489,7 @@
 
 //Error set
 if(tErr.length)	f_err = tErr;
-else f_err = "0";','','',1741452855);
+else f_err = "0";','','',1768489977);
 CREATE TABLE IF NOT EXISTS 'flb_Controller' ("ID" TEXT DEFAULT '' ,"NAME" TEXT DEFAULT '' ,"ru#NAME" TEXT DEFAULT '' ,"uk#NAME" TEXT DEFAULT '' ,"DESCR" TEXT DEFAULT '' ,"ru#DESCR" TEXT DEFAULT '' ,"uk#DESCR" TEXT DEFAULT '' ,"START" INTEGER DEFAULT '1' ,"MAXCALCTM" INTEGER DEFAULT '10' ,"PR_TR" INTEGER DEFAULT '1' ,"FORMULA" TEXT DEFAULT '' ,"ru#FORMULA" TEXT DEFAULT '' ,"uk#FORMULA" TEXT DEFAULT '' ,"TIMESTAMP" INTEGER DEFAULT '' , PRIMARY KEY ("ID"));
 INSERT INTO flb_Controller VALUES('prescr','Prescriptions manager (moved)','','','!!!!: Moved and replaced by the template PrescrTempl.manager. Will be removed soon
 Prescriptions manager and controller. Used in addition with user interface''s cadre "Prescription: editing" and "Prescription: runtime" for which into a parameter of the controller you must pass that parameters: "mode", "prog", "startTm", "curCom", "comLs", "work".
@@ -17062,10 +17088,10 @@
 INSERT INTO tmplib_base_io VALUES('UPS','loadHH','Load too high',2,32,'100',14,'Навантаження дуже високе','','Нагрузка очень высокая','','');
 INSERT INTO tmplib_base_io VALUES('UPS','tH','Temperature high',2,32,'50',15,'Висока температура','','Высокая температура','','');
 INSERT INTO tmplib_base_io VALUES('UPS','tHH','Temperature too high',2,32,'70',16,'Температура дуже висока','','Температура очень высокая','','');
-INSERT INTO tmplib_base_io VALUES('UPS','this','Object',4,0,'',17,'Об''єкт','','Объект','','');
-INSERT INTO tmplib_base_io VALUES('UPS','SHIFR','Code',0,0,'',18,'Шифр','','Шифр','','');
-INSERT INTO tmplib_base_io VALUES('UPS','NAME','Name',0,4096,'',19,'Ім''я','','Имя','','Име');
-INSERT INTO tmplib_base_io VALUES('UPS','DESCR','Description',0,4100,'',20,'Опис','','Описание','','Опис');
+INSERT INTO tmplib_base_io VALUES('UPS','this','Object',4,0,'',18,'Об''єкт','','Объект','','');
+INSERT INTO tmplib_base_io VALUES('UPS','SHIFR','Code',0,0,'',19,'Шифр','','Шифр','','');
+INSERT INTO tmplib_base_io VALUES('UPS','NAME','Name',0,4096,'',20,'Ім''я','','Имя','','Име');
+INSERT INTO tmplib_base_io VALUES('UPS','DESCR','Description',0,4100,'',21,'Опис','','Описание','','Опис');
 INSERT INTO tmplib_base_io VALUES('initConAssociateTrs','inTransport','Input transport',0,64,'InitiateCons',0,'Вхідний транспорт','','Входной транспорт','','');
 INSERT INTO tmplib_base_io VALUES('initConAssociateTrs','outTrTm','Output transport timeouts',0,64,'10:0.1',1,'Таймаути вихідних транспортів','','Таймауты выходных транспортов','','');
 INSERT INTO tmplib_base_io VALUES('initConAssociateTrs','prcTr','Processed transports',4,17,'',3,'Опрацьовані транспорти','','Обработанные транспорты','','');
@@ -17103,6 +17129,7 @@
 INSERT INTO tmplib_base_io VALUES('DiskSMART','items','All items',4,33,'',2,'Всі елементи','','Все элементы','','');
 INSERT INTO tmplib_base_io VALUES('DiskSMART','defs','Item definitions',0,36,'160:Uncorrectable sectors count when read/write (160)
 161:Number of Valid Spare Blocks (161)
+162:Uncorrectable Sector Count (162)
 163:Number of Initial Invalid Blocks (163)
 164:Total Erase Count (164)
 165:Block Erase Count (165)
@@ -17157,6 +17184,7 @@
 In form of lines - "{id}:{toAttr}:{descr}"',0,37,'',4,'Визначення елементів
 У формі рядків - "{id}:{toAttr}:{descr}"','','','','');
 INSERT INTO tmplib_base_io VALUES('DiskSMART','inProc','Input processing procedure',0,68,'',1,'Вхідна процедура обробки','','Входная процедура обработки','','');
+INSERT INTO tmplib_base_io VALUES('UPS','hyst','Hysteresis of borders, %',2,32,'5',17,'','','','','');
 CREATE TABLE IF NOT EXISTS 'tmplib_DevLib_io' ("TMPL_ID" TEXT DEFAULT '' ,"ID" TEXT DEFAULT '' ,"NAME" TEXT DEFAULT '' ,"TYPE" INTEGER DEFAULT '' ,"FLAGS" INTEGER DEFAULT '' ,"VALUE" TEXT DEFAULT '' ,"POS" INTEGER DEFAULT '' ,"ru#NAME" TEXT DEFAULT '' ,"ru#VALUE" TEXT DEFAULT '' ,"uk#NAME" TEXT DEFAULT '' ,"uk#VALUE" TEXT DEFAULT '' ,"sr#NAME" TEXT DEFAULT '' , PRIMARY KEY ("TMPL_ID","ID"));
 INSERT INTO tmplib_DevLib_io VALUES('SCU750','transport','Transport',0,64,'SCU750',0,'Транспорт','','Транспорт','','');
 INSERT INTO tmplib_DevLib_io VALUES('SCU750','addr','Device address (-1...255)',1,64,'1',1,'Адрес устройства (-1...255)','','Адреса пристрою (-1...255)','','');
@@ -17683,7 +17711,7 @@
 INSERT INTO tmplib_DevLib_io VALUES('IEC62056','dest','Destination "{UHDLC}[:{LHDLC}]", [0...16383]',0,64,'17:6168',1,'Назначение "{UHDLC}[:{LHDLC}]", [0...16383]','','Призначення "{UHDLC}[:{LHDLC}]", [0...16383]','','');
 INSERT INTO tmplib_DevLib_io VALUES('IEC62056','src','Source [0...127]',1,64,'1',2,'Источник [0...127]','','Джерело [0...127]','','');
 INSERT INTO tmplib_DevLib_io VALUES('IEC62056','tmRetr','Retry connection time, seconds',2,64,'10',4,'Время восстановления подключения, секунд','','Час відновлення підключення, секунд','','');
-INSERT INTO tmplib_DevLib_io VALUES('IEC62056','itemsSet','Items set by: "{ClassId}-{OBIS}-{attr}"',0,36,'',6,'Набор элементов по: "{OBIS}-{attr}"','','Набір елементів за: "{OBIS}-{attr}"','','');
+INSERT INTO tmplib_DevLib_io VALUES('IEC62056','itemsSet','Items set by: "{ClassId}-{OBIS}-{attr}"',0,36,'',6,'Набор элементов по: "{ClassId}-{OBIS}-{attr}"','','Набір елементів за: "{ClassId}-{OBIS}-{attr}"','','');
 INSERT INTO tmplib_DevLib_io VALUES('IEC62056','items','All items',4,33,'',7,'Все элементы','','Всі елементи','','');
 INSERT INTO tmplib_DevLib_io VALUES('IEC62056','tr','Output transport',4,0,'',8,'Выходной транспорт','','Вихідний транспорт','','');
 INSERT INTO tmplib_DevLib_io VALUES('IEC62056','ctx','IO context',4,0,'',9,'Контекст ВВ','','Контекст ВВ','','');
Index: data/LibsDB/vcaBase.sql
===================================================================
--- data/LibsDB/vcaBase.sql	(revision 3054)
+++ data/LibsDB/vcaBase.sql	(working copy)
@@ -14635,9 +14635,81 @@
 oMYB1DiAGgdQ4wBqHECNA6hxADUOoMYB1DiAGlZVVZYl9TOWOvZTmt+dzxFiZy2maZplGe2zlhNj
 iCo5n2MMpxA3+0d2G59vr97Pl0/n3D8LqJ5efnonpUi1mb1PkgSHYei6jvphSzVTP0WYvQcQMQRE
 /AXQVVbxbbsSbAAAAABJRU5ErkJggg==','/wlb_originals/wdg_Box',0,'JavaLikeCalc.JavaScript
-var termPanel;				//Terminator panel, used to control complex fields
+/*TODO:
+  - ComboBox Add: present visual items with attributes after first for attributes
+  - ComboBox Del:
+    - present visual items with attributes when more one
+    - add and call fItDel():
+  - fItApply():
+    - linking
+    - call in the start for present items
+  - Position and size:
+    - adding the position parameter with reposition by keyboard for selected item in the table
+    - adding the size parameter with control through the scale
+    - adding the default scale for the visual item, from which recalculate size
+  - Labels to the visual items
+  - Automatic layouting:
+    - reading the actual primitive size
+    - create profiles of source types through extending rules (empty vId) of visual items
+    - trace the sources and fill from top-left to bottom by columns
+*/
+
+var termPanel;		//Terminator panel, used to control complex fields
+var visualElsO;		//Object of the visual elements
 var showAttrsOfPrms;	//The status of showing attributes for parameters
+var isModified;		//Modification mark for saving into the session
 
+//Applying to the source <src> for the visual element <vEl>
+function fItApply(isrc, ivEl)
+{
+	// Parsing the source address
+	src = isrc, src_attr = "";
+	off = src.length;
+	isPrm = ((tVl=src.parseEnd(0,".",off)).indexOf("prm_") == 0);
+	if(!isPrm) src_attr = tVl, src = src.slice(0, off+1);
+
+	// Parsing the visual element ID
+	vEl = ivEl, vEl_attr = vEl.parse(2);
+	if(vEl_attr.length) vEl = vEl.parse(0)+"."+vEl.parse(1);
+
+	this.messInfo("TEST 00: "+src+" < "+vEl+": vEl_attr="+vEl_attr+", src_attr="+src_attr);
+
+	if((visualElO=visualElsO.getElementBy(vEl)) == null) return false;
+
+	this.messInfo("TEST 01: "+src+" < "+vEl+": "+visualElO.attr("id"));
+
+	//Adding new item
+	if(visualElO.getElementBy(src) == null) {
+		vIt = visualElsO.getAttr("vId").toInt()+1;
+		visualElsO.setAttr("vId", vIt);
+		vIt = "vIt"+vIt;
+
+		srcO = visualElO.childAdd("src");
+		srcO.setAttr("id", src).setAttr("sAttr",src_attr).setAttr("vIt","vIt"+vIt).setAttr("vAttr",vEl_attr);
+
+		nwlO = this.wdgAdd(vIt, "", "/wlb_"+visualElO.attr("id").replace(".","/wdg_"));
+		//nwlO.attrSet("geomY",itEdPanelOff).attrSet("geomW",itEdPanelW).attrSet("geomH",itEdPanelH)
+		//    .attrSet("active",1).attrSet("perm",0666).attrSet("elType",4).attrSet("value",tr("<Add>"));
+	}
+
+	//for(iEl = 1; this["wdg_"+visualElId+iEl] != null; iEl++) ;
+	//visualElId += iEl;
+
+	/*off = 0; items_value.parse(1,off); srcId = items_value.slice(off);
+	signalPrmsO[srcId] = tVl = new Object();
+	tVl.showIn = new Array();
+	//.{aId}:{x}-{y}:{w}-{h}[:{addAttr1}[:{addAttr2}[:{addAttrN}]]]"
+	tVl.showIn.push(termPanel.fItAdd.attr("value")+"."+iEl+"."+);
+	//tVl.type = visualElO.attr("id");
+
+	visualElId = SYS.strEncode(visualElId,"OscdID");
+	for(iEl = 1; this["wdg_"+visualElId+iEl.toString()] != null; iEl++) ;
+	visualElId += iEl.toString();*/
+
+	isModified = true;
+}
+
+
 if(f_start) {
 	//List of the visualisation elements, with actual ones on the screen as the subtags
 	//  lnkAttrs - list of the generic attributes (through '';'') for linking as data source in the form "{vis}[-{src}]"
@@ -14645,17 +14717,20 @@
 	//    src - ID of the source attribute, it is the same as visual one at missing
 	//  lnkAttrsAdd - list of the additional attributes (through '';'') for specifying manually in the form "{vis}[-[{src}]]"
 	//    src - ID of the source attribute, it is the same as visual one at missing and that is a constant at missing even the symbol ''-''
-	visualEls = "<vEls>"
+	/*visualEls = "<vEls>"
 		"<el id=''Main.anShow'' geom=''100-40'' scale=''1'' lnkAttrs=''pVal-var'' lnkAttrsAdd=''pName-NAME;pPrec-prec;pErr-err;pDscr-DESCR;pModeA-auto;pModeC-casc;spName;redEVAL''/>"
 		"<el id=''Main.anShow1'' geom=''100-23'' scale=''1'' lnkAttrs=''pVal-var'' lnkAttrsAdd=''pNAME-NAME;prec-;pErr-err;pDscr-DESCR;spName;pName;pNameSz'' />"
 		"<el id=''Main.anShow1s'' geom=''65-23'' scale=''1'' lnkAttrs=''pVal-var'' lnkAttrsAdd=''pNAME-NAME;prec-;pErr-err;pDscr-DESCR;spName;pName;pNameSz'' />"
-		"<el id=''Main.TextLab'' geom=''60-22'' scale=''1'' lnkAttrs=''st_open;st_close;st_text;com;close;com_text'' lnkAttrs=''digStts-;digComs-;NAME-;err-;DESCR-'' />"
-		"</vEls>";
-	visualElsO = SYS.XMLNode(); visualElsO.load(visualEls);
+		"<el id=''Main.TextLab'' geom=''60-22'' scale=''1'' lnkAttrs=''st_open;st_close;st_text;com;close;com_text'' lnkAttrsAdd=''digStts-;digComs-;NAME-;err-;DESCR-'' />"
+		"</vEls>";*/
+	visualElsO = SYS.XMLNode();
+	visualElsO.load(this.attr("visualEls",true));
+	if(!visualElsO.childSize()) visualElsO.load(visualEls);
 
 	//Storing parameters at the source identifier, without container, and with properties
 	//  showIn - array of the visualisations in the form "{vId}.{aId}:{x}-{y}:{w}-{h}[:{addAttr1}[:{addAttr2}[:{addAttrN}]]]"
-	signalPrmsO = this.attr("signalPrmsO", true);	//Loading from the session context
+	//???? Maybe store in visualEls
+	//signalPrmsO = this.attr("signalPrmsO", true);	//Loading from the session context
 
 	//Loading the source(s) from srcDAQ with support RE in controllers, and to selCntr_items
 	//1 — list for select
@@ -14683,11 +14758,16 @@
 	btEdit_value = false;
 
 	toUpdate = true;
+
+	isModified = false;
 }
 
 if(f_stop) {
-	this.attrSet("signalPrmsO", signalPrmsO, true);	//Saving to the session context
+	//???? Uncoment in production
+	//if(isModified)	this.attrSet("visualEls", visualElsO.save(), true);
 
+	//this.attrSet("signalPrmsO", signalPrmsO, true);	//Saving to the session context
+
 	if(termPanel != null) {
 		termPanel.wdg_Text1.attrSet("en", 1);
 
@@ -14706,7 +14786,7 @@
 
 for(offEv = 0; (evCur=event.parse(0,"\n",offEv)).length; )
 	if(evCur == "ws_CombChange:/selCntr")	prcCntrs[0] = selCntr_value, showAttrsOfPrms = new Object(), toUpdate = true;
-	else if(evCur == "ws_BtToggleChange:/btEdit")	toUpdate = true;
+	else if(evCur == "ws_BtToggleChange:/btEdit") toUpdate = true;
 	else if(evCur == "ws_TableChangeSel:/items") {
 		if(termPanel == null) {
 			this.ownerSess().uiCmd("open", "/pg_control/pg_terminator", this.attr("path"));	//With the page address for receiving events from the panel
@@ -14720,69 +14800,30 @@
 			itEdPanelW = termPanel.attr("geomW");
 			nwlO = termPanel.wdgAdd("fItAdd", "", "/wlb_originals/wdg_FormEl");
 			nwlO.attrSet("geomY",itEdPanelOff).attrSet("geomW",itEdPanelW).attrSet("geomH",itEdPanelH)
-				 .attrSet("active",1).attrSet("perm",0666).attrSet("elType",4).attrSet("value",tr("<Add>"));
+			    .attrSet("active",1).attrSet("perm",0666).attrSet("elType",4).attrSet("value",tr("<Add>"));
 			itEdPanelOff += itEdPanelH;
 			nwlO = termPanel.wdgAdd("fItDel", "", "/wlb_originals/wdg_FormEl");
 			nwlO.attrSet("geomY",itEdPanelOff).attrSet("geomW",itEdPanelW).attrSet("geomH",itEdPanelH)
-				 .attrSet("active",1).attrSet("perm",0666).attrSet("elType",4).attrSet("value",tr("<Remove>"));
+			    .attrSet("active",1).attrSet("perm",0666).attrSet("elType",4).attrSet("value",tr("<Remove>"));
 			itEdPanelOff += itEdPanelH;
 			nwlO = termPanel.wdgAdd("fItShowAttr", "", "/wlb_originals/wdg_FormEl");
 			nwlO.attrSet("geomY",itEdPanelOff).attrSet("geomW",itEdPanelW).attrSet("geomH",itEdPanelH)
-				 .attrSet("active",1).attrSet("perm",0666).attrSet("elType",2).attrSet("name","Show attributes");
+			    .attrSet("active",1).attrSet("perm",0666).attrSet("elType",2).attrSet("name","Show attributes");
 
 			delete nwlO;
 		}
-
-		//????
-		isPrm = (items_value.parseEnd(0).indexOf("prm_") == 0);
-		// Dynamic of adding selected item to the visualisation
-		for(toAddPrms = "", iV = 0; iV < visualElsO.childSize(); iV++) {
-			visualEl = visualElsO.childGet(iV);
-			if(!isPrm)	toAddPrms += (toAddPrms.length?"\n":"") + visualEl.attr("id");
-			else {
-				CntrCurO = SYS.DAQ.nodeAt(items_value,".");
-				availAttrs = CntrCurO.nodeList("a_");
-
-				for(iEl = 0, lnAOffPresent = false; !lnAOffPresent && iEl < availAttrs.length; iEl++)
-					for(lnAOff = 0; !lnAOffPresent && (lnkAttr=visualEl.attr("lnkAttrs").parse(0,";",lnAOff)).length; )
-						lnAOffPresent = availAttrs[iEl].slice(2) == ((tVl=lnkAttr.parse(1,"-")).length?tVl:lnkAttr.parse(0,"-"));
-				if(lnAOffPresent)	toAddPrms += (toAddPrms.length?"\n":"") + visualEl.attr("id");
-			}
-		}
-		termPanel.fItAdd.attrSet("value",tr("<Add>"));
-		if(toAddPrms.length) termPanel.fItAdd.attrSet("active", 1).attrSet("items",toAddPrms);
-		else termPanel.fItAdd.attrSet("active", 0);
-
-		// Dynamic of the attributes show
-		termPanel.fItShowAttr.attrSet("en", isPrm);
+		toUpdate = true;
 	}
 	else if(evCur.match("ws_ChkChange:/.+/pg_control/pg_terminator/fItShowAttr").length) {
 		showAttrsOfPrms[items_value] = termPanel.fItShowAttr.attr("value");
 		toUpdate = true;
 	}
-	else if(evCur.match("ws_CombChange:/.+/pg_control/pg_terminator/fItAdd").length &&
-		(visualElO=visualElsO.getElementBy(termPanel.fItAdd.attr("value"))) != null)
-	{
-		visualElId = SYS.strEncode(termPanel.fItAdd.attr("value"),"OscdID");
-		for(iEl = 1; this["wdg_"+visualElId+iEl] != null; iEl++) ;
-		visualElId += iEl;
-
-		/*off = 0; items_value.parse(1,off); srcId = items_value.slice(off);
-		signalPrmsO[srcId] = tVl = new Object();
-		tVl.showIn = new Array();
-		//.{aId}:{x}-{y}:{w}-{h}[:{addAttr1}[:{addAttr2}[:{addAttrN}]]]"
-		tVl.showIn.push(termPanel.fItAdd.attr("value")+"."+iEl+"."+);
-		//tVl.type = visualElO.attr("id");
-
-
-		visualElId = SYS.strEncode(visualElId,"OscdID");
-		for(iEl = 1; this["wdg_"+visualElId+iEl.toString()] != null; iEl++) ;
-		visualElId += iEl.toString();*/
-
-		//????
-		//this.messInfo("TEST 00: "+visualElO);
+	else if(evCur.match("ws_CombChange:/.+/pg_control/pg_terminator/fItAdd").length) {
+		fItApply(items_value, termPanel.fItAdd.attr("value"));
+		termPanel.fItAdd.attrSet("value",tr("<Add>"));
+		toUpdate = true;
 	}
-	else this.messInfo("Event: "+evCur);
+	//else this.messInfo("Event: "+evCur);
 
 if(toUpdate) {
 	toUpdate = false;
@@ -14791,14 +14832,14 @@
 
 	if(!titleFIX.length && srcTitle_en) srcTitle_text = "";
 
-	if(items_en)
-		items_items = "<tbl sel=''row'' colsWdthFit=''1'' hHdrVis=''1'' vHdrVis=''1''>\n"
-							"<h><s width=''0''>ID</s><s width=''"+((prcCntrs.length>1)?"":"0")+"''>"+tr("Container")+"</s><s>"+tr("Source")+"</s>"
-								"<s align=''center''>"+tr("Type")+"</s><s edit=''1''>"+tr("Show in")+"</s></h>\n";
+	//Form the source items table
+	if(items_en) items_items = "<tbl sel=''row'' colsWdthFit=''1'' hHdrVis=''1'' vHdrVis=''1''>\n"
+			"<h><s width=''0''>ID</s><s width=''"+((prcCntrs.length>1)?"":"0")+"''>"+tr("Container")+"</s><s>"+tr("Source")+"</s>"
+			"<s align=''center''>"+tr("Type")+"</s><s edit=''1''>"+tr("Show in")+"</s></h>\n";
 	else showAttrsOfPrms = new Object();
 
 	for(iCntr = 0; iCntr < prcCntrs.length; iCntr++) {
-		if(!(CntrO=SYS.DAQ.nodeAt(prcCntrs[iCntr],".")))	continue;
+		if(!(CntrO=SYS.DAQ.nodeAt(prcCntrs[iCntr],"."))) continue;
 
 		//Update the title
 		if(!titleFIX.length && srcTitle_en)
@@ -14809,10 +14850,10 @@
 			// Ascend at the hierarchy
 			while(iPrm >= availPrms.length && CntrStack.length) {
 				tVl = CntrStack.pop();
-				iPrm = tVl.i;	availPrms = tVl.lst;
+				iPrm = tVl.i, availPrms = tVl.lst;
 				CntrO = CntrO.nodePrev();
 			}
-			if(iPrm >= availPrms.length)	break;
+			if(iPrm >= availPrms.length) break;
 
 			CntrCurO = CntrO[availPrms[iPrm]];
 			for(SrcPath = availPrms[iPrm], iEl = 0; iEl < CntrStack.length; iEl++)
@@ -14833,9 +14874,9 @@
 				//   Attributes
 				if(!isComplex || showAttrsOfPrms[prcCntrs[iCntr]+"."+SrcPath] == true)
 					for(iEl = 0; iEl < availAttrs.length; iEl++) {
-						if((tVl=availAttrs[iEl].slice(2)) == "SHIFR" || tVl == "NAME" || tVl == "DESCR"  || tVl == "err")	continue;
-						items_items += "<r><s>"+prcCntrs[iCntr]+"."+SrcPath+".a_"+tVl+"</s><s>"+prcCntrs[iCntr]+"</s><s>"+SrcPath+".a_"+tVl+"</s>"
-												"<s>"+typeof(CntrCurO[availAttrs[iEl]].get())+"</s><t></t></r>\n";
+						if((tVl=availAttrs[iEl].slice(2)) == "SHIFR" || tVl == "NAME" || tVl == "DESCR"  || tVl == "err") continue;
+						items_items +=	"<r><s>"+prcCntrs[iCntr]+"."+SrcPath+".a_"+tVl+"</s><s>"+prcCntrs[iCntr]+"</s><s>"+SrcPath+".a_"+tVl+"</s>"
+								"<s>"+typeof(CntrCurO[availAttrs[iEl]].get())+"</s><t></t></r>\n";
 					}
 			}
 
@@ -14842,9 +14883,9 @@
 			// Descend at the hierarchy
 			if((chldPrms=CntrCurO.nodeList("prm_")).length) {
 				CntrStack.push(tVl=new Object());
-				tVl.i = iPrm+1; tVl.lst = availPrms; tVl.prm = availPrms[iPrm];
+				tVl.i = iPrm+1, tVl.lst = availPrms, tVl.prm = availPrms[iPrm];
 				CntrO = CntrCurO;
-				iPrm = 0; availPrms = chldPrms;
+				iPrm = 0, availPrms = chldPrms;
 			} else iPrm++;
 		}
 
@@ -14852,7 +14893,73 @@
 		//????
 	}
 	if(items_en) items_items += "</tbl>";
-}','','',-1,'owner;perm;name;geomX;geomY;geomW;geomH;geomZ;pgOpenSrc;pgGrp;backColor;bordWidth;bordColor;',1747027893);
+
+	//Update items of the terminal panel
+	if(termPanel != null && items_value.length) {
+		//????
+		//isPrm = (items_value.parseEnd(0).indexOf("prm_") == 0);
+
+		src = items_value, src_attr = "";
+		off = src.length;
+		isPrm = ((tVl=src.parseEnd(0,".",off)).indexOf("prm_") == 0);
+		if(!isPrm) src_attr = tVl, src = src.slice(0, off+1);
+
+		// Dynamic of adding selected item to the visualisation
+		for(toAddPrms = "", toDelPrms = "", iV = 0; iV < visualElsO.childSize(); iV++) {
+			visualEl = visualElsO.childGet(iV);
+
+			//  Search for presence such item
+			thatSrcs = visualEl.getElementsBy("src", src);
+			for(iSrc = 0, isPresent = false; !isPresent && iSrc < thatSrcs.length; iSrc++)
+				if((isPresent=(thatSrcs[iSrc].attr("sAttr")==src_attr)))
+					toDelPrms += (toDelPrms.length?"\n":"") + thatSrcs[iSrc].attr("vIt")+((tVl=thatSrcs[iSrc].attr("vAttr")).length?"."+tVl:"");
+			delete thatSrcs;
+			if(isPresent) continue;
+
+			if(!isPrm) {
+				//  Prepairing list with several attributes
+				for(lnAOff = 0, toAddPrms_ = "", iAttr = 0; (lnkAttr=visualEl.attr("lnkAttrs").parse(0,";",lnAOff)).length; iAttr++)
+					toAddPrms_ += (toAddPrms_.length?"\n":"") + visualEl.attr("id")+"."+lnkAttr.parse(0,"-");
+				toAddPrms += (toAddPrms.length?"\n":"") + ((iAttr > 1) ? toAddPrms_ : visualEl.attr("id"));
+
+				//  Prepairing list of free attributes to link of the present visual items
+				vItsUse = new Object();
+				for(iSrc = 0; iSrc < visualEl.childSize(); iSrc++) {
+					visualElIt = visualEl.childGet(iSrc);
+					if(!(vIt=visualElIt.attr("vIt")).length) continue;
+					if(vItsUse[vIt] == null) vItsUse[vIt] = new Object();
+					vItsUse[vIt][visualElIt.attr("vAttr")] = true;
+				}
+				for(var iSrc in vItsUse) {
+					for(lnAOff = 0, toAddPrms_ = "", iAttr = 0; (lnkAttr=visualEl.attr("lnkAttrs").parse(0,";",lnAOff)).length; iAttr++)
+						if(vItsUse[iSrc][lnkAttr] == null) toAddPrms_ += (toAddPrms_.length?"\n":"") + iSrc+"."+lnkAttr;
+					if(iAttr > 1) toAddPrms += (toAddPrms.length?"\n":"") + toAddPrms_;
+				}
+				delete vItsUse;
+			}
+			else {
+				CntrCurO = SYS.DAQ.nodeAt(items_value,".");
+				availAttrs = CntrCurO.nodeList("a_");
+
+				//  Checking for presence at least one linking attribute
+				for(iEl = 0, lnAOffPresent = false; !lnAOffPresent && iEl < availAttrs.length; iEl++)
+					for(lnAOff = 0; !lnAOffPresent && (lnkAttr=visualEl.attr("lnkAttrs").parse(0,";",lnAOff)).length; )
+						lnAOffPresent = availAttrs[iEl].slice(2) == ((tVl=lnkAttr.parse(1,"-")).length?tVl:lnkAttr.parse(0,"-"));
+				if(lnAOffPresent) toAddPrms += (toAddPrms.length?"\n":"") + visualEl.attr("id");
+			}
+		}
+		termPanel.fItAdd.attrSet("value",tr("<Add>"));
+		if(toAddPrms.length) termPanel.fItAdd.attrSet("active", 1).attrSet("items",toAddPrms);
+		else termPanel.fItAdd.attrSet("active", 0);
+
+		termPanel.fItDel.attrSet("value",tr("<Remove>"));
+		if(toDelPrms.length) termPanel.fItDel.attrSet("active", 1).attrSet("items",toDelPrms);
+		else termPanel.fItDel.attrSet("active", 0);
+
+		// Dynamic of the attributes show
+		termPanel.fItShowAttr.attrSet("en", isPrm);
+	}
+}','','',-1,'owner;perm;name;geomX;geomY;geomW;geomH;geomZ;pgOpenSrc;pgGrp;backColor;bordWidth;bordColor;',1770471346);
 CREATE TABLE IF NOT EXISTS 'wlb_mnEls' ("ID" TEXT DEFAULT '' ,"ICO" TEXT DEFAULT '' ,"PARENT" TEXT DEFAULT '' ,"PR_TR" INTEGER DEFAULT '1' ,"PROC" TEXT DEFAULT '' ,"uk#PROC" TEXT DEFAULT '' ,"ru#PROC" TEXT DEFAULT '' ,"PROC_PER" INTEGER DEFAULT '-1' ,"ATTRS" TEXT DEFAULT '*' ,"TIMESTAMP" INTEGER DEFAULT '' , PRIMARY KEY ("ID"));
 INSERT INTO wlb_mnEls VALUES('El_round_square1','iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
 AAAOxAAADsQBlSsOGwAABaBJREFUeJztm11MU1cAx/+tZVB0027ysctqN2SYKDoEP8aD05XE6hQB
@@ -29853,6 +29960,12 @@
 INSERT INTO wlb_Main_uio VALUES('ElCadr','prmNotPID','Parameter: Force disable PID
 Use when you want to disable PID representing for parameters with SP.',131072,'0',10,'<page>|notPID','','','Параметр: Примусово вимкнути ПІД
 Використати за бажання вимкнути представлення ПІД для параметрів із завданням.','','','','','','','','','');
+INSERT INTO wlb_Main_uio VALUES('dynFrame','visualEls','Visual elements',131205,'<vEls>
+	<el id=''Main.anShow'' lnkAttrs=''pVal-var'' lnkAttrsAdd=''pName-NAME;pPrec-prec;pErr-err;pDscr-DESCR;pModeA-auto;pModeC-casc;spName;redEVAL'' />
+	<el id=''Main.anShow1'' lnkAttrs=''pVal-var'' lnkAttrsAdd=''pNAME-NAME;prec-;pErr-err;pDscr-DESCR;spName;pName;pNameSz'' />
+	<el id=''Main.anShow1s'' lnkAttrs=''pVal-var'' lnkAttrsAdd=''pNAME-NAME;prec-;pErr-err;pDscr-DESCR;spName;pName;pNameSz'' />
+	<el id=''Main.TextLab'' lnkAttrs=''st_open;st_close;st_text;com;close;com_text'' lnkAttrsAdd=''digStts-;digComs-;NAME-;err-;DESCR-'' />
+</vEls>',8,'','','','','','','','','','','','','');
 CREATE TABLE IF NOT EXISTS 'wlb_doc_io' ("IDW" TEXT DEFAULT '' ,"ID" TEXT DEFAULT '' ,"IO_VAL" TEXT DEFAULT '' ,"SELF_FLG" INTEGER DEFAULT '' ,"CFG_TMPL" TEXT DEFAULT '' ,"CFG_VAL" TEXT DEFAULT '' ,"IDC" TEXT DEFAULT '' ,"uk#IO_VAL" TEXT DEFAULT '' ,"uk#CFG_TMPL" TEXT DEFAULT '' ,"ru#IO_VAL" TEXT DEFAULT '' ,"ru#CFG_TMPL" TEXT DEFAULT '' ,"ru#CFG_VAL" TEXT DEFAULT '' ,"uk#CFG_VAL" TEXT DEFAULT '' ,"sr#IO_VAL" TEXT DEFAULT '' , PRIMARY KEY ("IDW","ID","IDC"));
 INSERT INTO wlb_doc_io VALUES('docRepDay','name','Day report of the hour-averaged values',32,'','','','Добовий звіт середніх за годину значень','','Суточный отчёт среднечасовых значений','','','','');
 INSERT INTO wlb_doc_io VALUES('docRepDay','geomZ','1',32,'','','doc','','','','','','','');
Index: src/moduls/daq/JavaLikeCalc/freefunc.cpp
===================================================================
--- src/moduls/daq/JavaLikeCalc/freefunc.cpp	(revision 3052)
+++ src/moduls/daq/JavaLikeCalc/freefunc.cpp	(working copy)
@@ -1634,7 +1634,11 @@
 		// string path2sep( string sep = "." ) - convert path in this string to separated by <sep> string.
 		//  sep - item separator
 		if(prop == "path2sep")
-		    return TSYS::path2sepstr(vl.getS(), (prms.size() && prms[0].getS().size()) ? prms[0].getS()[0] : '.');
+		    return TSYS::path2sepstr(vl.getS(), (prms.size() && prms[0].getS().size())?prms[0].getS()[0]:'.');
+		// string sep2path( string sep = "." ) - convert eparated by <sep> string to path.
+		//  sep - item separator
+		if(prop == "sep2path")
+		    return TSYS::sepstr2path(vl.getS(), (prms.size() && prms[0].getS().size())?prms[0].getS()[0]:'.');
 		// string trim( string cfg = " \n\t\r" ) - string trimming at begin and end for symbols <cfg>.
 		//  cfg - trimming symbols
 		if(prop == "trim") return sTrm(vl.getS(), prms.size() ? prms[0].getS() : " \n\t\r");
Index: src/moduls/daq/JavaLikeCalc/virtual.cpp
===================================================================
--- src/moduls/daq/JavaLikeCalc/virtual.cpp	(revision 3052)
+++ src/moduls/daq/JavaLikeCalc/virtual.cpp	(working copy)
@@ -201,8 +201,10 @@
 {
     if(lang == "JavaScript") {
 	shgl.setAttr("font",SYS->ui().at().fontSnthHglCode());
-	//shgl.childAdd("rule")->setAttr("expr","(\"\"|\".*[^\\\\](|\\\\{2}|\\\\{4}|\\\\{6}|\\\\{8})\")")->setAttr("min","1")->setAttr("color","darkgreen")->
-	shgl.childAdd("rule")->setAttr("expr","(\"(|\\\\{2}|\\\\{4}|\\\\{6}|\\\\{8})\"|\".*[^\\\\](|\\\\{2}|\\\\{4}|\\\\{6}|\\\\{8})\")")->setAttr("min","1")->setAttr("color","darkgreen")->
+	//shgl.childAdd("rule")->setAttr("expr","(\"(|\\\\{2}|\\\\{4}|\\\\{6}|\\\\{8})\"|\".*[^\\\\](|\\\\{2}|\\\\{4}|\\\\{6}|\\\\{8})\")")->setAttr("min","1")->setAttr("color","darkgreen")->
+	shgl.childAdd("rule")->setAttr("expr","(\"(|\\\\{2}|\\\\{4}|\\\\{6}|\\\\{8})\"|\".*?[^\\\\](|\\\\{2}|\\\\{4}|\\\\{6}|\\\\{8})\")")
+			     ->setAttr("exprOld","(\"(|\\\\{2}|\\\\{4}|\\\\{6}|\\\\{8})\"|\".*[^\\\\](|\\\\{2}|\\\\{4}|\\\\{6}|\\\\{8})\")")
+			     ->setAttr("color","darkgreen")->
 	     childAdd("rule")->setAttr("expr","\\\\([xX][a-zA-Z0-9]{2}|[0-7]{3}|.{1})")->setAttr("color","green")->setAttr("font_weight","1");
 	shgl.childAdd("blk")->setAttr("beg","/\\*")->setAttr("end","\\*/")->setAttr("color","gray")->setAttr("font_italic","1");
 	shgl.childAdd("rule")->setAttr("expr","//.*$")->setAttr("color","gray")->setAttr("font_italic","1");
Index: src/moduls/daq/ModBus/modbus_daq.cpp
===================================================================
--- src/moduls/daq/ModBus/modbus_daq.cpp	(revision 3054)
+++ src/moduls/daq/ModBus/modbus_daq.cpp	(working copy)
@@ -1049,7 +1049,7 @@
 	ctrMkNode3("fld",opt,-1,"/cntr/st/runSt",EVAL_STR,SEC_RD|SEC_WR,
 	    "help",_("Manual restart of the enabled controller object causes the force reformation of the acquisition blocks.\n"
 		    "Restart to apply the removed PLC links in run."));
-	ctrMkNode3("fld",opt,-1,"/cntr/cfg/PROT",EVAL_STR,SEC_RD|(startStat()?0:SEC_WR));
+	ctrMkNode3("fld",opt,-1,"/cntr/cfg/PROT",EVAL_STR,SEC_RD|SEC_WR);
 	string outHelp, tVl;
 	if((tVl=TSYS::strParse(addr(),1,".")).size() && tVl.find(STR_IN_PREF) != 0 &&
 		SYS->transport().at().modPresent((tVl=TSYS::strParse(addr(),0,"."))))
Index: src/moduls/daq/ModBus/modbus_prt.cpp
===================================================================
--- src/moduls/daq/ModBus/modbus_prt.cpp	(revision 3052)
+++ src/moduls/daq/ModBus/modbus_prt.cpp	(working copy)
@@ -855,8 +855,10 @@
 	    cfg.cfg("POS").setI(iIO);
 	    cfg.cfg("VALUE").setNoTransl(f->io(iIO)->type() != IO::String || (f->io(iIO)->flg()&TPrmTempl::CfgLink));
 	    cfg.cfg("VALUE").setView(true);
-	    if(f->io(iIO)->flg()&TPrmTempl::CfgLink)	//f->io(iIO)->rez());
-	    { data ? cfg.cfg("VALUE").setS(data->lnkAddr(iIO)) : cfg.cfg("VALUE").setView(false); }
+	    if(f->io(iIO)->flg()&TPrmTempl::CfgLink) {	//f->io(iIO)->rez());
+		if(!data) cfg.cfg("VALUE").setView(false);
+		else cfg.cfg("VALUE").setS(data->lnkAddr(iIO));
+	    }
 	    else if(data && data->func()) cfg.cfg("VALUE").setS(data->getS(iIO));
 	    else cfg.cfg("VALUE").setS(f->io(iIO)->def());
 	    TBDS::dataSet(fullDB()+"_io", owner().nodePath()+tbl()+"_io", cfg);
@@ -1486,7 +1488,7 @@
 	if(ctrChkNode(opt,"get",RWRWR_,"root",SPRT_ID,SEC_RD))	opt->setText(progLang());
 	if(ctrChkNode(opt,"set",RWRWR_,"root",SPRT_ID,SEC_WR))	setProgLang(opt->text());
     }
-    else if(a_path.find("/nd/cfg") == 0) TConfig::cntrCmdProc(this, opt, TSYS::pathLev(a_path,2), "root", SPRT_ID, RWRWR_);
+    else if(a_path.starts_with("/nd/cfg")) TConfig::cntrCmdProc(this, opt, TSYS::pathLev(a_path,2), "root", SPRT_ID, RWRWR_);
     else if(a_path == "/plang/list") {
 	vector<string> lls, ls;
 	//Templates
@@ -1498,7 +1500,7 @@
 	}
 	TCntrNode::cntrCmdProc(opt);
     }
-    else if(a_path.find("/dt") == 0 || a_path.find("/cfg") == 0) {
+    else if(a_path.starts_with("/dt") || a_path.starts_with("/cfg")) {
 	ResAlloc res(nRes, false);
 	if(a_path == "/dt/io") {
 	    TFunction *f = data && data->func() ? data->func() : this;
Index: src/moduls/daq/ModBus/modbus_prt.h
===================================================================
--- src/moduls/daq/ModBus/modbus_prt.h	(revision 3052)
+++ src/moduls/daq/ModBus/modbus_prt.h	(working copy)
@@ -154,9 +154,14 @@
 	};
 	class SData : public TPrmTempl::Impl {
 	    public:
-		SData( TCntrNode *iobj, string name_c ) : TPrmTempl::Impl(iobj, name_c.c_str()),
+		SData( Node *iobj, string name_c ) : TPrmTempl::Impl(iobj, name_c.c_str()),
 		    rReg(0), wReg(0), rCoil(0), wCoil(0), rCoilI(0), rRegI(0), chkLnkNeed(false) { }
 
+		bool lnkInit( int num, bool toRecnt = false ) {
+		    ((Node*)obj)->io(num)->setRez(lnkAddr(num));	//Due to the links are loaded from here at enabling
+		    return TPrmTempl::Impl::lnkInit(num, toRecnt);
+		}
+
 		map<int,SIO> regR, regW, coilR, coilW, coilI, regI;
 		float	rReg, wReg, rCoil, wCoil, rCoilI, rRegI;
 		bool	chkLnkNeed;	//Check lnk need flag
Index: src/moduls/ui/QTCfg/selfwidg.cpp
===================================================================
--- src/moduls/ui/QTCfg/selfwidg.cpp	(revision 3052)
+++ src/moduls/ui/QTCfg/selfwidg.cpp	(working copy)
@@ -368,11 +368,6 @@
     edFld->setStyle(new QCommonStyle());	//Force style set for resize allow everywhere
 #endif*/
     edFld->setContextMenuPolicy(Qt::CustomContextMenu);
-#if QT_VERSION >= 0x050A00
-    edFld->setTabStopDistance(20);
-#else
-    edFld->setTabStopWidth(20);
-#endif
     edFld->setAcceptRichText(false);
     connect(edFld, SIGNAL(textChanged()), this, SLOT(changed()));
     connect(edFld, SIGNAL(cursorPositionChanged()), this, SLOT(curPosChange()));
@@ -439,6 +434,13 @@
     edFld->document()->setModified(false);
     isInit = false;
     changed();
+
+    int tabW = QFontMetrics(edFld->document()->defaultFont()).size(Qt::TextSingleLine,"00000000").width();
+#if QT_VERSION >= 0x050A00
+    edFld->setTabStopDistance(tabW);
+#else
+    edFld->setTabStopWidth(tabW);
+#endif
 }
 
 void TextEdit::setSnthHgl( XMLNode nd )
Index: src/moduls/ui/QTStarter/lib_qtgen.cpp
===================================================================
--- src/moduls/ui/QTStarter/lib_qtgen.cpp	(revision 3052)
+++ src/moduls/ui/QTStarter/lib_qtgen.cpp	(working copy)
@@ -329,11 +329,9 @@
 void SnthHgl::rule( XMLNode *irl, const QString &text, int off, char lev )
 {
     XMLNode *rl;
-    vector<int> rul_pos(irl->childSize(),-1);
-    vector<int> matchedLength(irl->childSize(), 0);
-    int minPos = -1, minRule, endIndex, startBlk, sizeBlk;
+    int minPos = -1, minRule, minSz, sizeBlk, rulPos, matchedLength;;
     QTextCharFormat kForm;
-    TRegExp expr("", "", TRegExp::MD_WCHAR);	//Richer and faster in 5 times !!!!
+    TRegExp expr("", "", TRegExp::MD_WCHAR);	//!!!! Richer and faster in 5 times
     bool useQT = (expr.mode() == TRegExp::MD_8);
     std::wstring textW = text.toStdWString(), patW;
 #if QT_VERSION < 0x060000
@@ -341,6 +339,7 @@
     if(useQT) exprQ.setPatternSyntax(QRegExp::RegExp2);
 #else
     QRegularExpression exprQ;
+
 #endif
 
     if(lev > 3) return;
@@ -350,14 +349,10 @@
 
     //Stream process by rules
     for(int iT = 0; iT < text.length(); ) {
-	if(curBlk && !iT) { minRule = curBlk-1; minPos = 0; }
-	else minRule = -1;
+	minRule = -1, minPos = -1, minSz = 0;
+	if(curBlk && !iT) minRule = curBlk-1, minPos = 0;
 
-	for(int iCh = 0; iT != minPos && iCh < (int)irl->childSize(); iCh++) {
-	    if(!(minPos < iT || rul_pos[iCh] < iT || rul_pos[iCh] < minPos)) continue;
-	    if(rul_pos[iCh] >= iT && rul_pos[iCh] < minPos)	{ minPos = rul_pos[iCh]; minRule = iCh; continue; }
-	    if(rul_pos[iCh] == iT && rul_pos[iCh] == minPos)	{ minRule = iCh; break; }
-
+	for(int iCh = 0; iCh < (int)irl->childSize(); iCh++) {
 	    //Call rule
 	    rl = irl->childGet(iCh);
 	    if(rl->name() == "rule") {
@@ -369,31 +364,33 @@
 	    else if(rl->name() == "blk") {
 		if(!useQT) {
 		    patW = QString(rl->attr("beg").c_str()).toStdWString();
-		    expr.setPattern(string((const char*)patW.data(),patW.size()*sizeof(wchar_t)), s2i(rl->attr("min"))?"U":"");
+		    expr.setPattern(string((const char*)patW.data(),patW.size()*sizeof(wchar_t)));
 		} else exprQ.setPattern(rl->attr("beg").c_str());
 	    }
 	    else continue;
 
 	    if(!useQT)
-		rul_pos[iCh] = expr.search(string((const char*)textW.data(),textW.size()*sizeof(wchar_t)), iT, &matchedLength[iCh]);
+		rulPos = expr.search(string((const char*)textW.data(),textW.size()*sizeof(wchar_t)), iT, &matchedLength);
 	    else {
 #if QT_VERSION < 0x060000
-		exprQ.setMinimal(s2i(rl->attr("min")));
-		rul_pos[iCh] = exprQ.indexIn(text, iT); matchedLength[iCh] = exprQ.matchedLength();
+		//The "min" and "exprOld" attributes about a problem in control greedy/lazy in old QRegExp,
+		//  and due to missing control of that by default in RegExp of JavaScript at "min",
+		//  so we have to place the old rules only for QRegExp into "exprOld".
+		exprQ.setMinimal(s2i(rl->attr("min")) || rl->attr("exprOld").size());
+		if(rl->attr("exprOld").size()) exprQ.setPattern(rl->attr("exprOld").c_str());
+		rulPos = exprQ.indexIn(text, iT); matchedLength = exprQ.matchedLength();
 #else
+		if(s2i(rl->attr("min"))) exprQ.setPatternOptions(QRegularExpression::InvertedGreedinessOption);
 		QRegularExpressionMatch m = exprQ.match(text, iT);
-		rul_pos[iCh] = m.capturedStart(), matchedLength[iCh] = m.capturedLength();
+		rulPos = m.capturedStart(), matchedLength = m.capturedLength();
 #endif
 	    }
-
-	    if(matchedLength[iCh] <= 0) continue;
-
-	    if(rul_pos[iCh] < 0) rul_pos[iCh] = text.length();
-	    if(minPos < iT || rul_pos[iCh] < minPos) { minPos = rul_pos[iCh]; minRule = iCh; }
+	    if(matchedLength <= 0) continue;
+	    if(minPos < iT || rulPos < minPos) minPos = rulPos, minRule = iCh, minSz = matchedLength;
 	}
 	if(minRule < 0) break;
 
-	//Process minimal rule
+	//Processing the minimal rule
 	rl = irl->childGet(minRule);
 	kForm.setForeground(colorAdjToBack(rl->attr("color").c_str(),qApp->palette().color(QPalette::Base)));
 	kForm.setFontWeight(s2i(rl->attr("font_weight")) ? QFont::Bold : QFont::Normal);
@@ -400,47 +397,42 @@
 	kForm.setFontItalic(s2i(rl->attr("font_italic")));
 
 	if(rl->name() == "rule") {
-	    setFormat(rul_pos[minRule]+off, matchedLength[minRule], kForm);
+	    setFormat(minPos+off, minSz, kForm);
 
-	    //Call include rules
-	    if(rl->childSize()) rule(rl, text.mid(rul_pos[minRule],matchedLength[minRule]), rul_pos[minRule]+off, lev+1);
-	    iT = rul_pos[minRule] + matchedLength[minRule];
+	    if(rl->childSize()) rule(rl, text.mid(minPos,minSz), minPos+off, lev+1);	//Call included rules
+	    iT = minPos + minSz;
 	}
 	else if(rl->name() == "blk") {
-	    if(curBlk) rul_pos[minRule] = curBlk = startBlk = 0;
-	    else startBlk = rul_pos[minRule] + matchedLength[minRule];
+	    if(curBlk) minPos = curBlk = 0;
 
 	    if(!useQT) {
 		patW = QString(rl->attr("end").c_str()).toStdWString();
-		expr.setPattern(string((const char*)patW.data(),patW.size()*sizeof(wchar_t)), s2i(rl->attr("min"))?"U":"");
-		endIndex = expr.search(string((const char*)textW.data(),textW.size()*sizeof(wchar_t)), startBlk, &matchedLength[minRule]);
+		expr.setPattern(string((const char*)patW.data(),patW.size()*sizeof(wchar_t)));
+		sizeBlk = expr.search(string((const char*)textW.data(),textW.size()*sizeof(wchar_t)), minPos, &matchedLength);
 	    }
 	    else {
 		exprQ.setPattern(rl->attr("end").c_str());
 #if QT_VERSION < 0x060000
-		exprQ.setMinimal(s2i(rl->attr("min")));
-		endIndex = exprQ.indexIn(text, startBlk); matchedLength[minRule] = exprQ.matchedLength();
+		sizeBlk = exprQ.indexIn(text, minPos), matchedLength = exprQ.matchedLength();
 #else
-		QRegularExpressionMatch m = exprQ.match(text, startBlk);
-		endIndex = m.capturedStart(), matchedLength[minRule] = m.capturedLength();
+		QRegularExpressionMatch m = exprQ.match(text, minPos);
+		sizeBlk = m.capturedStart(), matchedLength = m.capturedLength();
 #endif
 	    }
-
-	    if(endIndex == -1 || matchedLength[minRule] <= 0) {
-		setFormat(rul_pos[minRule]+off, (text.length()-rul_pos[minRule]), kForm);
-		sizeBlk = text.length()-startBlk;
-		iT = text.length();
+	    if(sizeBlk != -1 && matchedLength > 0) {
+		sizeBlk += matchedLength;
+		setCurrentBlockState(currentBlockState()& ~(0xFFFFFFFF<<(lev*8)));
 	    }
 	    else {
-		setFormat(rul_pos[minRule]+off, (endIndex-rul_pos[minRule]+matchedLength[minRule]), kForm);
-		sizeBlk = endIndex-startBlk;
-		iT = endIndex + matchedLength[minRule];
+		sizeBlk = text.length();
+		setCurrentBlockState(((minRule+1)<<(lev*8))|currentBlockState());
 	    }
-	    //Call include rules
-	    if(rl->childSize()) rule(rl, text.mid(startBlk,sizeBlk), startBlk+off, lev+1);
-	    if(endIndex == -1 || matchedLength[minRule] <= 0)
-		setCurrentBlockState(((minRule+1)<<(lev*8))|currentBlockState());
-	    else setCurrentBlockState(currentBlockState()& ~(0xFFFFFFFF<<(lev*8)));
+	    iT = sizeBlk;
+	    sizeBlk -= minPos;
+
+	    setFormat(minPos+off, sizeBlk, kForm);
+
+	    if(rl->childSize()) rule(rl, text.mid(minPos,sizeBlk), minPos+off, lev+1);	//Call include rules
 	}
     }
 }
Index: src/moduls/ui/VCAEngine/libwidg.cpp
===================================================================
--- src/moduls/ui/VCAEngine/libwidg.cpp	(revision 3052)
+++ src/moduls/ui/VCAEngine/libwidg.cpp	(working copy)
@@ -35,7 +35,7 @@
 //* WidgetLib: Widgets library                   *
 //************************************************
 WidgetLib::WidgetLib( const string &id, const string &name, const string &lib_db ) :
-    TConfig(&mod->elWdgLib()), mId(cfg("ID")), mDB(lib_db), mEnable(false), passAutoEn(false)
+    TConfig(&mod->elWdgLib()), mId(cfg("ID")), mDB(lib_db), mEnable(false), passAutoEn(false), mJustCreated(true)
 {
     mId = id;
     cfg("NAME").setS(name);
@@ -191,6 +191,7 @@
     } catch(TError&) { }
 
     passAutoEn = false;
+    mJustCreated = false;
 }
 
 void WidgetLib::save_( )
@@ -199,6 +200,8 @@
 
     TBDS::dataSet(DB()+"."+mod->wlbTable(), mod->nodePath()+"LIB", *this);
 
+    mJustCreated = false;
+
     //Resources copy
     if(mDB_MimeSrc.size() || DB(true).size()) {
 	if(mDB_MimeSrc.empty()) mDB_MimeSrc = DB(true);
@@ -511,7 +514,8 @@
 //* LWidget: Library stored widget               *
 //************************************************
 LWidget::LWidget( const string &iid, const string &isrcwdg ) : Widget(iid), TConfig(&mod->elWdg()),
-    enableByNeed(false), mProcPer(cfg("PROC_PER").getId()), mTimeStamp(cfg("TIMESTAMP").getId()), mFuncM(true)
+    enableByNeed(false), mProcPer(cfg("PROC_PER").getId()), mTimeStamp(cfg("TIMESTAMP").getId()),
+    mFuncM(true), mJustCreated(true)
 {
     cfg("ID").setS(id());
 
@@ -712,6 +716,8 @@
 
     //Load all other attributes
     loadIO();
+
+    mJustCreated = false;
 }
 
 void LWidget::loadIO( bool onlyIO )
@@ -789,6 +795,8 @@
     //Save widget's attributes
     if(enable()) mod->attrsSave(*this, ownerLib().DB()+"."+ownerLib().tbl(), id(), "", false, &errors, &warnings);
 
+    mJustCreated = false;
+
     //Updation/saving here the removing mark "<deleted>" of the included widgets since the storage can be changed
     if(!parent().freeStat()) {
 	TConfig cEl(&mod->elInclWdg());
@@ -808,6 +816,9 @@
 
     if(errors.size())		throw TError(TError::Core_CntrError, nodePath(), errors);
     else if(warnings.size())	throw TError(TError::Core_CntrWarning, nodePath(), warnings);
+
+    //Control of saving-storing the containers
+    if(ownerLib().justCreated()) ownerLib().save();
 }
 
 void LWidget::wClear( )
Index: src/moduls/ui/VCAEngine/libwidg.h
===================================================================
--- src/moduls/ui/VCAEngine/libwidg.h	(revision 3052)
+++ src/moduls/ui/VCAEngine/libwidg.h	(working copy)
@@ -79,6 +79,8 @@
 	void add( LWidget *iwdg );
 	void del( const string &id, bool full = false )	{ chldDel(mWdg, id, -1, full?NodeRemove:NodeNoFlg); }
 
+	bool justCreated( )	{ return mJustCreated; }
+
     protected:
 	//Methods
 	const char *nodeName( ) const	{ return mId.getSd(); }
@@ -106,7 +108,8 @@
 	string	mDB,
 		mDB_MimeSrc;	//After the copy mostly
 	bool	mEnable;
-	bool	passAutoEn;
+	unsigned passAutoEn  : 1;
+	unsigned mJustCreated: 1;
 };
 
 //************************************************
@@ -169,6 +172,8 @@
 
 	TVariant stlReq( Attr &a, const TVariant &vl, bool wr );
 
+	bool justCreated( )	{ return mJustCreated; }
+
     protected:
 	//Methods
 	void postDisable( int flag );
@@ -189,6 +194,8 @@
 		&mTimeStamp;
 	string	mParentAddrPrev;//Previous parent name after successful enable
 	ResMtx	mFuncM;
+
+	unsigned mJustCreated: 1;
 };
 
 //************************************************
Index: src/moduls/ui/VCAEngine/project.cpp
===================================================================
--- src/moduls/ui/VCAEngine/project.cpp	(revision 3052)
+++ src/moduls/ui/VCAEngine/project.cpp	(working copy)
@@ -37,7 +37,7 @@
 Project::Project( const string &id, const string &name, const string &lib_db ) :
     TConfig(&mod->elProject()), enableByNeed(false), mId(cfg("ID")), mDB(lib_db), mPermit(cfg("PERMIT").getId()),
     mPer(cfg("PER").getId())/*, mFlgs(cfg("FLGS").getId())*/, mStyleIdW(cfg("STYLE").getId()), mWrToStl(cfg("WR_TO_STYLE").getBd()),
-    mEnable(false), mFuncM(true)
+    mEnable(false), mFuncM(true), mJustCreated(true)
 {
     mId = id;
     cfg("NAME").setS(name);
@@ -231,6 +231,8 @@
 	    mStProp[cStl.cfg("ID").getS()] = vlst;
 	}
     }
+
+    mJustCreated = false;
 }
 
 void Project::save_( )
@@ -239,6 +241,8 @@
 
     TBDS::dataSet(DB()+"."+mod->prjTable(), mod->nodePath()+"PRJ", *this);
 
+    mJustCreated = false;
+
     //Resources copy
     if(mDB_MimeSrc.size() || DB(true).size()) {
 	if(mDB_MimeSrc.empty()) mDB_MimeSrc = DB(true);
@@ -936,7 +940,8 @@
 //* Page: Project's page                         *
 //************************************************
 Page::Page( const string &iid, const string &isrcwdg ) : Widget(iid), TConfig(&mod->elPage()), manCrt(false),
-    mFlgs(cfg("FLGS").getId()), mProcPer(cfg("PROC_PER").getId()), mTimeStamp(cfg("TIMESTAMP").getId())
+    mFlgs(cfg("FLGS").getId()), mProcPer(cfg("PROC_PER").getId()), mTimeStamp(cfg("TIMESTAMP").getId()),
+    mJustCreated(true)
 {
     cfg("ID").setS(id());
 
@@ -1246,6 +1251,8 @@
     loadIO();
 
     setStlLock(false);
+
+    mJustCreated = false;
 }
 
 void Page::loadIO( bool onlyIO )
@@ -1320,6 +1327,8 @@
     //Save widget's attributes
     if(enable()) mod->attrsSave(*this, ownerProj()->DB()+"."+ownerProj()->tbl(), addr(), "", false, &errors, &warnings);
 
+    mJustCreated = false;
+
     //Updation/saving here the removing mark "<deleted>" of the included widgets since the storage can be changed
     if(!parent().freeStat()) {
 	TConfig cEl(&mod->elInclWdg());
@@ -1339,6 +1348,10 @@
 
     if(errors.size())		throw TError(TError::Core_CntrError, nodePath(), errors);
     else if(warnings.size())	throw TError(TError::Core_CntrWarning, nodePath(), warnings);
+
+    //Control of saving-storing the containers
+    if(ownerPage() && ownerPage()->justCreated()) ownerPage()->save();
+    else if(!ownerPage() && ownerProj()->justCreated()) ownerProj()->save();
 }
 
 void Page::wClear( )
Index: src/moduls/ui/VCAEngine/project.h
===================================================================
--- src/moduls/ui/VCAEngine/project.h	(revision 3052)
+++ src/moduls/ui/VCAEngine/project.h	(working copy)
@@ -124,9 +124,12 @@
 	void heritUnreg( Session *s );	//Unregister the heritator
 	void pageEnable( const string &pg, bool vl );	//Process for the page <pg> enabling for herit sessions
 
+	ResMtx &funcM( )		{ return mFuncM; }
+
+	bool justCreated( )		{ return mJustCreated; }
+
 	//Attributes
 	bool	enableByNeed;	//Load and enable by need
-	ResMtx &funcM( )		{ return mFuncM; }
 
     protected:
 	//Methods
@@ -166,6 +169,8 @@
 	ResMtx	mFuncM, mHeritRes;
 
 	vector< AutoHD<Session> > mHerit;	//Heritators
+
+	unsigned mJustCreated: 1;
 };
 
 //************************************************
@@ -245,6 +250,8 @@
 
 	TVariant stlReq( Attr &a, const TVariant &vl, bool wr );
 
+	bool justCreated( )	{ return mJustCreated; }
+
     public:
 	//Attributes
 	bool	manCrt;		//Manual created, mostly for child widget's modification clear after it's inheritance
@@ -275,6 +282,8 @@
 		&mProcPer,	//Process period
 		&mTimeStamp;
 	string	mParentAddrPrev;//Previous parent name after successful enable
+
+	unsigned mJustCreated: 1;
 };
 
 //************************************************
Index: src/moduls/ui/Vision/vis_widgs.cpp
===================================================================
--- src/moduls/ui/Vision/vis_widgs.cpp	(revision 3052)
+++ src/moduls/ui/Vision/vis_widgs.cpp	(working copy)
@@ -858,11 +858,6 @@
 
     edFld = new QTextEdit(this);
     edFld->setContextMenuPolicy(Qt::CustomContextMenu);
-#if QT_VERSION >= 0x050A00
-    edFld->setTabStopDistance(20);
-#else
-    edFld->setTabStopWidth(20);
-#endif
     edFld->setAcceptRichText(false);
     edFld->setLineWrapMode(QTextEdit::NoWrap);
     setFocusProxy(edFld);
@@ -934,6 +929,13 @@
     isInit = false;
 
     mText = itext;
+
+    int tabW = QFontMetrics(edFld->document()->defaultFont()).size(Qt::TextSingleLine,"00000000").width();
+#if QT_VERSION >= 0x050A00
+    edFld->setTabStopDistance(tabW);
+#else
+    edFld->setTabStopWidth(tabW);
+#endif
 }
 
 void TextEdit::setSnthHgl( XMLNode nd )
Index: src/moduls/ui/WebCfgD/WebCfgDVCA.html
===================================================================
--- src/moduls/ui/WebCfgD/WebCfgDVCA.html	(revision 3052)
+++ src/moduls/ui/WebCfgD/WebCfgDVCA.html	(working copy)
@@ -44,8 +44,13 @@
     #gen-pnl-right td.content div.elem span { padding-right: 5px; }
     #gen-pnl-right td.content div.elem span.label { white-space: nowrap; }
     #gen-pnl-right td.content div.elem span.const { font-weight: bold; white-space: normal; }
-    #gen-pnl-right td.content div.elem textarea { width: 98%; }
-    #gen-pnl-right td.content div.elem textarea + div { padding-left: 10px; }
+    #gen-pnl-right td.content div.elem textarea { width: 98%; font: 15px 'Open Sans', monospace; }
+    #gen-pnl-right td.content div.elem div.TA_Cntr + div { padding-left: 10px; }
+    #gen-pnl-right td.content div.elem div.TA_Cntr { width: 98%; text-indent: 0; }
+    #gen-pnl-right td.content div.elem div.TA_Cntr textarea { display: block; white-space: pre; position: absolute; margin: 0; border-radius: 0; border: 2px solid #685972; padding: 2px; background-color: transparent; resize: none; caret-color: black; }
+    #gen-pnl-right td.content div.elem div.TA_Cntr div.TA_BD { display: block; position: absolute; overflow: auto; background-color: #fff; border: 2px solid #685972; padding: 2px; }
+    #gen-pnl-right td.content div.elem div.TA_Cntr div.TA_HGLs { white-space: pre; word-wrap: break-word; /*color: transparent;*/ font: 15px 'Open Sans', monospace; }
+    #gen-pnl-right td.content div.elem div.TA_Cntr div.TA_HGLs span { padding: 0; }
     #gen-pnl-right td.content fieldset.elem { margin : 0px; margin-bottom: 2px; padding: 3px; }
     #gen-pnl-right td.content div.table { width: 800px; border: 1px solid gray; height: 200px; background-color: white; overflow: auto; padding: 2px; }
     #gen-pnl-right td.content table.elem { border: 1px solid black; border-collapse: collapse; empty-cells: show; text-indent: 0px; }
Index: src/moduls/ui/WebCfgD/WebCfgDVCA.js
===================================================================
--- src/moduls/ui/WebCfgD/WebCfgDVCA.js	(revision 3052)
+++ src/moduls/ui/WebCfgD/WebCfgDVCA.js	(working copy)
@@ -42,6 +42,8 @@
 var limShowOp = 10;	//Limit for items shown in the group operation dialogue
 var Er_NoError = 0;	//Error code of no error
 var Er_Core_CntrWarning = 1; //Error code of warning the Control Interface
+var snthHglObj = null;	//Syntax highlight object to update
+var snthHglTmID = null;	//Syntax highlight timer to update
 
 //Browser type detect
 var isNN = navigator.appName.indexOf('Netscape') != -1;
@@ -188,6 +190,29 @@
 }
 
 /***************************************************
+ * getFont( fStr ) - Parse font                    *
+ ***************************************************/
+function getFont( fStr, defSz, defFnt )
+{
+    var rez = '';
+    if(fStr) {
+	var compStl = getComputedStyle(document.body, null);
+	if(!defSz)  defSz = compStl.getPropertyValue('font-size');
+	if(!defFnt) defFnt = compStl.getPropertyValue('font-family');
+
+	var allFnt = fStr.split(' ');
+	if(allFnt.length >= 4 && parseInt(allFnt[3])) rez += (rez.length?' ':'') + 'italic';
+	if(allFnt.length >= 3 && parseInt(allFnt[2])) rez += (rez.length?' ':'') + 'bold';
+	rez += (rez.length?' ':'') + ((allFnt.length >= 2) ? allFnt[1]+'px' : defSz);
+	if(allFnt.length >= 1) rez += (rez.length?' ':'') + ((allFnt.length >= 1) ? "'"+allFnt[0].replace(/_/g,' ')+"'" : defFnt);
+	/*if(allFnt.length >= 5 && parseInt(allFnt[4])) rez += 'text-decoration: underline; ';
+	else if(allFnt.length >= 6 && parseInt(allFnt[5])) rez += 'text-decoration: line-through; ';*/
+    }
+
+    return rez;
+}
+
+/***************************************************
  * servGet - XML get request to server             *
  ***************************************************/
 function servGet( adr, prm )
@@ -677,6 +702,7 @@
 			if(sclIts[iScN].scrollHeight <= sclIts[iScN].clientHeight) continue;
 			sclIt = sclIts[iScN];
 			sclIt.style.height = (sclIt.offsetHeight-((sclIt.nodeName=="SELECT")?0:getSpareHeight(sclIt))+fitStp)+'px';
+			if(sclIt.applySize) sclIt.applySize();
 			sclFitSz -= fitStp;
 		    }
 		    if(!sclIt && sclFromBeg) break;
@@ -1286,7 +1312,7 @@
 					    if(this.nodeName == "TEXTAREA" && e.ctrlKey) {	//NewLine insertion
 						var selStart = this.selectionStart;
 						this.value = this.value.slice(0, selStart) + "\n" + this.value.slice(this.selectionEnd);
-						this.setSelectionRange(selStart + 1, selStart + 1);
+						this.setSelectionRange(selStart+1, selStart+1);
 						this.blur(); this.focus();
 						return true;
 					    }
@@ -1534,8 +1560,118 @@
 	    var lab = null; var edit = null;
 	    if(cBlk) {
 		dBlk = document.createElement('div'); dBlk.className = 'elem';
+		cBlk.appendChild(dBlk);
 		lab = document.createElement('span'); lab.className = 'label';
+		dBlk.appendChild(lab);
+		dBlk.appendChild(document.createElement('br'));
 		edit = document.createElement('textarea');
+
+		// Preparing extended part for syntax highlight
+		TA_Cntr = document.createElement('div'); TA_Cntr.className = 'TA_Cntr';
+		TA_Cntr.innerHTML = '<div class="TA_BD"><div class="TA_HGLs"/></div>';
+		dBlk.appendChild(TA_Cntr);
+		dBlk = TA_Cntr;
+
+		edit.oninput = function() {	//Delayed or immediate call the highlihgting
+		    if(this.prcTm && this.prcTm > 100) {	//More 100ms
+			//Disabling the highlighting
+			this.parentNode.childNodes[0].childNodes[0].innerHTML = "";
+			this.style.color = "";
+
+			//Setting update at a timeout
+			snthHglObj = this;
+			if(snthHglTmID) clearTimeout(snthHglTmID);
+			snthHglTmID = setTimeout(snthHglUpd, 3000);
+		    } else this.applySnthHgl();
+		}
+		edit.onscroll = function() {
+		    this.parentNode.childNodes[0].scrollTop = this.scrollTop;
+		    this.parentNode.childNodes[0].scrollLeft = this.scrollLeft;
+		}
+		edit.applySnthHgl = function(irl, text, lev) {
+		    if(irl == null) {
+			if(this.snthHglRules == null) { this.style.color = ''; return; }	//No highlight
+			irl = this.snthHglRules;
+			if((tVl=irl.getAttribute("font"))) {
+			    var compStl = getComputedStyle(this, null);
+			    this.style.font = this.parentNode.childNodes[0].childNodes[0].style.font = getFont(tVl, compStl.getPropertyValue('font-size'), compStl.getPropertyValue('font-family'));
+			}
+			this.snthHglText = "";
+			this.prcTm = (new Date()).getTime();
+		    }
+		    if(text == null) text = this.value;
+		    if(lev == null)  lev = 0;
+
+		    for(var iT = 0; iT < text.length; ) {
+			var minRule = -1, minPos = -1, minSz = 0, rl, expr;
+
+			for(var iCh = 0; iCh < irl.childNodes.length; iCh++) {
+			    rl =  irl.childNodes[iCh];
+			    if(rl.nodeName == "rule")	expr = new RegExp(rl.getAttribute("expr"),'m');
+			    else if(rl.nodeName == "blk") expr = new RegExp(rl.getAttribute("beg"),'m');
+			    else continue;
+
+			    var mRes = expr.exec(text.slice(iT));
+			    if(!mRes || !mRes[0].length) continue;
+
+			    if(minPos < iT || (iT+mRes.index) < minPos) minPos = iT+mRes.index, minRule = iCh, minSz = mRes[0].length;
+			}
+			if(minRule < 0) { this.snthHglText += text.slice(iT).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;'); break; }
+
+			//Processing the minimal rule
+			rl = irl.childNodes[minRule];
+			var hglStl = "";
+			if((tVl=rl.getAttribute("color")) && tVl.length)		hglStl += "color: "+tVl+"; ";
+			if((tVl=rl.getAttribute("font_weight")) && parseInt(tVl))	hglStl += "font-weight: bold; ";
+			if((tVl=rl.getAttribute("font_italic")) && parseInt(tVl))	hglStl += "font-style: italic; ";
+
+			if(iT < minPos)
+			    this.snthHglText += text.slice(iT,minPos).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
+			if(hglStl.length) this.snthHglText += "<span style='"+hglStl+"'>";
+
+			if(rl.nodeName == "rule") {
+			    iT = minPos + minSz;
+
+			    if(rl.childNodes.length) this.applySnthHgl(rl, text.slice(minPos,iT), lev+1);
+			    else this.snthHglText += text.slice(minPos,iT).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
+			}
+			else if(rl.nodeName == "blk") {
+			    expr = new RegExp(rl.getAttribute("end"),'m');
+			    var mRes = expr.exec(text.slice(minPos));
+			    var sizeBlk = (mRes && mRes[0].length) ? mRes.index + mRes[0].length : text.length - minPos;
+			    iT = minPos + sizeBlk;
+
+			    if(rl.childNodes.length) this.applySnthHgl(rl, text.slice(minPos,minPos+sizeBlk), lev+1);
+			    else this.snthHglText += text.slice(minPos,minPos+sizeBlk).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
+			}
+			if(hglStl.length) this.snthHglText += "</span>";
+		    }
+
+		    if(lev == 0) {
+			this.parentNode.childNodes[0].childNodes[0].innerHTML = this.snthHglText+' ';
+			this.snthHglText = null;
+			this.style.color = "transparent";
+			this.prcTm = (new Date()).getTime() - this.prcTm;
+		    }
+		}
+		edit.applySize = function() {
+		    this.parentNode.style.height = this.offsetHeight+'px';
+		    this.parentNode.childNodes[0].style.height = (this.offsetHeight-getSpareHeight(this.parentNode.childNodes[0]))+'px';
+		    this.style.width = this.parentNode.childNodes[0].style.width = this.parentNode.clientWidth+'px';
+		}
+		edit.setVal = function(val) {
+		    this.value = this.defaultValue = val;
+
+		    //  Try load from value
+		    if(this.snthHglRules == null && (tVl=val.match("<SnthHgl\\b.*>.*<\\/ *SnthHgl>","gm")) && tVl.length)
+			this.snthHglRules = (new DOMParser()).parseFromString(tVl[0],"text/xml").children[0];
+
+		    this.applySnthHgl();
+		    this.applySize();
+		}
+
+		// Preparing common part
+		dBlk.appendChild(edit);
 		edit.itPath = selPath+'/'+brPath;
 		edit.srcNode = t_s;
 		edit.itComm = comm;
@@ -1543,9 +1679,20 @@
 		if(t_s.getAttribute('cols')) edit.setAttribute('cols', parseInt(t_s.getAttribute('cols')));
 		else edit.setAttribute('wrap', 'off');
 		edit.setAttribute('rows',parseInt(t_s.getAttribute('rows')) ? parseInt(t_s.getAttribute('rows')):5);
+		edit.onkeydown = function(e) {	//Inserting the tab symbol
+		    if(e.keyCode == 9) {
+			e.preventDefault();
+			var selStart = this.selectionStart;
+			this.value = this.value.slice(0, selStart) + "\t" + this.value.slice(this.selectionEnd);
+			this.setSelectionRange(selStart+1, selStart+1);
+			this.blur(); this.focus();
+			this.oninput(e);
+			return true;
+		    }
+		}
 		edit.onkeyup = function(e) {
-		    if(this.isChanged && e.keyCode == 13 && e.ctrlKey) { this.parentNode.childNodes[3].childNodes[0].onclick(); return true; }
-		    if(this.isChanged && e.keyCode == 27) { this.parentNode.children[3].children[1].onclick(); return true; }
+		    if(this.isChanged && e.keyCode == 13 && e.ctrlKey) { this.parentNode.parentNode.childNodes[3].childNodes[0].onclick(); return true; }
+		    if(this.isChanged && e.keyCode == 27) { this.parentNode.parentNode.children[3].children[1].onclick(); return true; }
 
 		    if(this.itComm) this.srcNode.textContent = this.value;
 		    else if(!this.isChanged && this.value != this.defaultValue) {
@@ -1553,45 +1700,50 @@
 			var btApply = document.createElement('input'); btApply.type = 'button'; btApply.value = 'Apply';
 			btApply.onclick = function( ) {
 			    var wEl = this.parentNode.parentNode;
+			    var edit = wEl.childNodes[2].childNodes[1];
 			    var updTm = pgRefrTmDef;
-			    var rez = servSet(wEl.childNodes[2].itPath, 'com=com', '<set>'+strEncode(wEl.childNodes[2].value,'html')+'</set>', true);
+			    var rez = servSet(edit.itPath, 'com=com', '<set>'+strEncode(edit.value,'html')+'</set>', true);
 			    if(rez && parseInt(rez.getAttribute('rez')) != Er_NoError) alertCntr(rez);
 			    else {
-				wEl.childNodes[2].defaultValue = wEl.childNodes[2].value;
+				edit.defaultValue = edit.value;
 				if(rez.getAttribute('updTm'))
 				    updTm = Math.min(pgRefrTmMax,parseFloat(rez.getAttribute('updTm'))*1000);
 			    }
 			    pageRefresh(updTm);
 			    wEl.removeChild(this.parentNode);
-			    wEl.childNodes[2].isChanged = false;
+			    edit.isChanged = false;
 			    return false;
 			}
 			var btCancel = document.createElement('input'); btCancel.type = 'button'; btCancel.value = 'Cancel';
 			btCancel.onclick = function( ) {
 			    var wEl = this.parentNode.parentNode;
-			    wEl.childNodes[2].value = wEl.childNodes[2].defaultValue;
+			    var edit = wEl.childNodes[2].childNodes[1];
+			    edit.setVal(edit.defaultValue);
 			    wEl.removeChild(this.parentNode);
-			    wEl.childNodes[2].isChanged = false;
+			    edit.isChanged = false;
 			    return false;
 			}
-			btBlk.appendChild(btApply); btBlk.appendChild(btCancel); this.parentNode.appendChild(btBlk);
+			btBlk.appendChild(btApply); btBlk.appendChild(btCancel); this.parentNode.parentNode.appendChild(btBlk);
 			this.isChanged = true;
 		    }
-		    else if(this.isChanged && this.value == this.defaultValue && this.parentNode.childNodes[3])
-		    { this.parentNode.removeChild(this.parentNode.childNodes[3]); this.isChanged = false; }
+		    else if(this.isChanged && this.value == this.defaultValue && this.parentNode.parentNode.childNodes[3])
+		    { this.parentNode.parentNode.removeChild(this.parentNode.parentNode.childNodes[3]); this.isChanged = false; }
 		    return true;
 		}
 		edit.StatusTip = selPath + '/' + brPath;
 		edit.onmouseover = function() { setStatus(this.StatusTip,10000); }
-		dBlk.appendChild(lab); dBlk.appendChild(document.createElement('br')); dBlk.appendChild(edit); cBlk.appendChild(dBlk);
 		t_s.addr_lab = lab; t_s.addr_edit = edit;
 	    }
 	    else { lab = t_s.addr_lab; edit = t_s.addr_edit; }
-	    // Fill Edit
+
+	    // Filling the value
 	    if(lab) lab.innerText = t_s.getAttribute('dscr') + ':';
 	    if(edit && !edit.isChanged) {
 		edit.title = (tVl=t_s.getAttribute('help')) ? tVl : "";
-		edit.value = edit.defaultValue = dataReq.textContent;
+
+		if(t_s.getAttribute('SnthHgl') != '1' || !(edit.snthHglRules=servGet(brPath,'com=SnthHgl')) || typeof(edit.snthHglRules) != 'object')
+		    edit.snthHglRules = null;
+		edit.setVal(dataReq.textContent);
 	    }
 	}
 	//View Data-Time fields
@@ -2399,6 +2551,16 @@
 
     return window;
 }
+/************************************************************************
+ * snthHglUpd - Updating the pointed textarea for the syntax highlight. *
+ ***********************************************************************/
+function snthHglUpd( )
+{
+    if(snthHglObj != null) {
+	snthHglObj.applySnthHgl();
+	snthHglObj.onscroll();
+    }
+}
 
 //First start data init
 if(genPnlLeft=document.getElementById('gen-pnl-left')) {
Index: src/moduls/ui/WebVision/vca_sess.cpp
===================================================================
--- src/moduls/ui/WebVision/vca_sess.cpp	(revision 3052)
+++ src/moduls/ui/WebVision/vca_sess.cpp	(working copy)
@@ -44,7 +44,7 @@
 //* VCASess					  *
 //*************************************************
 VCASess::VCASess( const string &iid ) :
-    toRemoveSelf(false), fStatusOrder(false), fStatusText(dataRes()), mId(iid), mUser(dataRes())
+    toRemoveSelf(false), fStatusOrder(false), fStatusText(dataRes()), mId(iid), mUser(dataRes()), mUserLast(dataRes())
 {
     open_ses = lst_ses_req	= time(NULL);
     id_objs	= grpAdd("obj_");
Index: src/moduls/ui/WebVision/vca_sess.h
===================================================================
--- src/moduls/ui/WebVision/vca_sess.h	(revision 3052)
+++ src/moduls/ui/WebVision/vca_sess.h	(working copy)
@@ -462,6 +462,7 @@
 	string id( )			{ return mId; }
 	string proj( )			{ return mProj; }
 	string user( )			{ return mUser; }
+	string userLast( )		{ return mUserLast; }
 	const string &sender( )		{ return mSender; }
 	const string &userAgent( )	{ return mUserAgent; }
 	time_t openTm( )		{ return open_ses; }
@@ -469,6 +470,7 @@
 
 	void projSet( const string &val )	{ mProj = val; }
 	void userSet( const string &val )	{ mUser = val; }
+	void userLastSet( const string &val )	{ mUserLast = val; }
 	void senderSet( const string &val )	{ mSender = val; }
 	void userAgentSet( const string &val )	{ mUserAgent = val; }
 
@@ -524,7 +526,7 @@
 	const string		mId;
 	int			id_objs;	//Primitive object's container identifier
 	time_t			open_ses, lst_ses_req;
-	MtxString		mUser;
+	MtxString		mUser, mUserLast; //The last user for detection of reconnection to a running project with last changed user
 	string			mProj, mSender, mUserAgent;
 
 	deque<pair<time_t,string> > mCachePg;	//Pages cache
Index: src/moduls/ui/WebVision/web_vision.cpp
===================================================================
--- src/moduls/ui/WebVision/web_vision.cpp	(revision 3052)
+++ src/moduls/ui/WebVision/web_vision.cpp	(working copy)
@@ -317,8 +317,11 @@
 	vector<string> list;
 	vcaSesList(list);
 	for(unsigned iS = 0; iS < list.size(); iS++)
-	    if(cur_tm > vcaSesAt(list[iS]).at().lstReq()+sessTime()*60)
+	    if(cur_tm > (vcaSesAt(list[iS]).at().lstReq()+sessTime()*60)) {
 		vcaSesDel(list[iS]);
+
+		mess_debug(nodePath().c_str(), _("Deleting the WEB-session '%s' by inactivity."), list[iS].c_str());
+	    }
     } catch(TError &err) { mess_err(err.cat.c_str(),"%s",err.mess.c_str()); }
 }
 
@@ -356,7 +359,7 @@
     try {
 	string zero_lev = TSYS::pathLev(ses.url, 0);
 	//Get the icon and the global image of the module
-	if(zero_lev == "ico" || zero_lev.find("img_") == 0) {
+	if(zero_lev == "ico" || zero_lev.starts_with("img_")) {
 	    string itp = "png";
 	    //Session's and project's icons request processing
 	    map<string,string>::iterator prmEl = ses.prm.find("it");
@@ -462,7 +465,7 @@
 		page = pgCreator(iprt, page, "200 OK", "", "", "", ses.lang);
 	    }
 	    //New session create
-	    else if(zero_lev.find("prj_") == 0) {
+	    else if(zero_lev.starts_with("prj_")) {
 		string sName;
 		// Find for early created session for the user and the sender
 		XMLNode req("get");
@@ -475,7 +478,7 @@
 		    if(req.childGet(iCh)->attr("user") == ses.user && req.childGet(iCh)->attr("proj") == zero_lev.substr(4) &&
 			vcaSesPresent(req.childGet(iCh)->text()) &&
 			(vs=vcaSesAt(req.childGet(iCh)->text())).at().sender() == sender &&
-			vs.at().user() == ses.user)
+			(ses.user == vs.at().user() || ses.user == vs.at().userLast()))	//????
 		    { sName = req.childGet(iCh)->text(); break; }
 		vs.free();
 		if(sName.empty()) {
@@ -498,13 +501,13 @@
 			}
 		    }
 		}
-		if(!sName.empty())
+		if(sName.size())
 		    page = pgCreator(iprt, TSYS::strMess(_("Going to the session '%s' for the project '%s' ..."),sName.c_str(),zero_lev.substr(4).c_str()),
 			"200 OK", "", "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=/" MOD_ID "/ses_"+sName+"/"+ses.gPrms+"'/>", "", ses.lang);
 		else page = pgCreator(iprt, page, "200 OK", "", "", "", ses.lang);
 	    }
 	    //Main session page data prepare
-	    else if(zero_lev.find("ses_") == 0) {
+	    else if(zero_lev.starts_with("ses_")) {
 		ses.url = Mess->codeConvIn("UTF-8", ses.url);	//Internal data in UTF-8
 		string sesnm = zero_lev.substr(4);
 
@@ -511,7 +514,12 @@
 		AutoHD<VCASess> vs;
 		try {
 		    vs = vcaSesAt(sesnm);
-		    if(vs.at().toRemoveSelf) { vs.free(); vcaSesDel(sesnm); }
+		    if(vs.at().toRemoveSelf) {
+			vs.free();
+			vcaSesDel(sesnm);
+
+			mess_debug(nodePath().c_str(), _("Deleting the WEB-session '%s' by missing the VCA-Session."), sesnm.c_str());
+		    }
 		} catch(TError&) { }
 
 		map<string,string>::iterator cntEl;
@@ -526,7 +534,7 @@
 			    "401 Unauthorized", "", "", "", ses.lang);
 		}
 		// Checking for the internal session presence
-		else if(!vs.freeStat() && (!(ses.user == vs.at().user() || ses.userPrev == vs.at().user()) ||
+		else if(!vs.freeStat() && (!(ses.user == vs.at().user() || ses.userPrev == vs.at().user() || ses.user == vs.at().userLast()) ||	//?????
 			    sender != vs.at().sender()) &&
 			!SYS->security().at().access(ses.user,SEC_WR,"root","root",RWRWR_))
 		    page = pgCreator(iprt, _("Going to the different session ..."),
@@ -572,8 +580,7 @@
 		    // Same request
 		    if(!vs.freeStat()) {
 			ResAlloc sesRes(mSesRes, false);
-			//vs.at().userSet(ses.user, true);	//!!!! Change the initial user of the registered session
-								//     only at the creation for preventing the message flooding
+			vs.at().userLastSet(ses.user);
 			vs.at().getReq(ses);
 			page = ses.page;
 		    } else HTTP_GET("", page, vars, user, iprt);
@@ -601,7 +608,7 @@
     try {
 	ses.url = Mess->codeConvIn("UTF-8", ses.url);	//Internal data in UTF-8
 	//To control interface request
-	if((cntEl=ses.prm.find("com"))!=ses.prm.end() && cntEl->second == "com") {
+	if((cntEl=ses.prm.find("com")) != ses.prm.end() && cntEl->second == "com") {
 	    XMLNode req(""); req.load(ses.content); req.setAttr("path", ses.url);
 	    cntrIfCmd(req, ses, false);
 	    page = pgCreator(iprt, req.save(XMLNode::BinShield), "200 OK", "Content-Type: text/xml;charset=UTF-8");
@@ -610,7 +617,7 @@
 
 	//Post command to the session
 	string sesnm = TSYS::pathLev(ses.url, 0);
-	if(sesnm.size() <= 4 || sesnm.find("ses_") != 0)
+	if(sesnm.size() <= 4 || !sesnm.starts_with("ses_"))
 	    throw TError(nodePath(), TSYS::strMess(_("Wrong session '%s'."),sesnm.c_str()));
 	else {
 	    ResAlloc sesRes(mSesRes, false);
Index: src/tarchives.cpp
===================================================================
--- src/tarchives.cpp	(revision 3053)
+++ src/tarchives.cpp	(working copy)
@@ -1280,7 +1280,7 @@
 		for(unsigned iC = 0; iC < cls.size(); iC++) {
 		    arh = at(mls[iM]).at().messAt(cls[iC]);
 		    if(nId)	nId->childAdd("el")->setText(mls[iM]+"."+cls[iC]);
-		    if(nNm)	nNm->childAdd("el")->setText(arh.at().name());
+		    if(nNm)	nNm->childAdd("el")->setText(trD(arh.at().name()));
 		    if(nStart)	nStart->childAdd("el")->setText(arh.at().startStat()?"1":"0");
 		    if(nRdndt)	nRdndt->childAdd("el")->setText(i2s(arh.at().redntMode()));
 		    if(nPrefRun)nPrefRun->childAdd("el")->setText(arh.at().redntRun());
Index: src/tcontroller.cpp
===================================================================
--- src/tcontroller.cpp	(revision 3052)
+++ src/tcontroller.cpp	(working copy)
@@ -34,7 +34,7 @@
 TController::TController( const string &id_c, const string &daq_db, TElem *cfgelem ) :
     TConfig(cfgelem), enSt(false), runSt(false),
     mId(cfg("ID")), mMessLev(cfg("MESS_LEV")), mAEn(cfg("ENABLE").getBd()), mAStart(cfg("START").getBd()),
-    mDB(daq_db), mRdSt(dataRes()), mRdUse(true), mRdFirst(true)
+    mDB(daq_db), mRdSt(dataRes()), mRdUse(true), mRdFirst(true), mJustCreated(true)
 {
     mId = id_c;
     mPrm = grpAdd("prm_");
@@ -180,6 +180,8 @@
 
     LoadParmCfg();
 
+    mJustCreated = false;
+
     if(!enSt && enSt_prev)	enable();
     if(!runSt && runSt_prev)	start();
 }
@@ -191,6 +193,8 @@
     //Update type controller bd record
     TBDS::dataSet(fullDB(), owner().nodePath()+"DAQ", *this);
     setDB(DB(), true);
+
+    mJustCreated = false;
 }
 
 void TController::start( )
Index: src/tcontroller.h
===================================================================
--- src/tcontroller.h	(revision 3052)
+++ src/tcontroller.h	(working copy)
@@ -123,6 +123,8 @@
 
 	TTypeDAQ &owner( ) const;
 
+	bool justCreated( )	{ return mJustCreated; }
+
     protected:
 	//Methods
 	// User methods
@@ -164,6 +166,7 @@
 	unsigned mPrm	 : 2;
 	unsigned mRdUse	 : 1;
 	unsigned mRdFirst: 1;
+	unsigned mJustCreated: 1;
 };
 
 }
Index: src/tdaqs.cpp
===================================================================
--- src/tdaqs.cpp	(revision 3052)
+++ src/tdaqs.cpp	(working copy)
@@ -715,7 +715,7 @@
 		for(unsigned iC = 0; iC < cls.size(); iC++) {
 		    cntr = at(mls[iM]).at().at(cls[iC]);
 		    if(nId)		nId->childAdd("el")->setText(mls[iM]+"."+cls[iC]);
-		    if(nNm)		nNm->childAdd("el")->setText(cntr.at().name());
+		    if(nNm)		nNm->childAdd("el")->setText(trD(cntr.at().name()));
 		    if(nStart)		nStart->childAdd("el")->setText(cntr.at().startStat()?"1":"0");
 		    if(nRdndt)		nRdndt->childAdd("el")->setText(i2s(cntr.at().redntMode()));
 		    if(nPrefRun)	nPrefRun->childAdd("el")->setText(cntr.at().redntRun());
Index: src/tparamcontr.cpp
===================================================================
--- src/tparamcontr.cpp	(revision 3053)
+++ src/tparamcontr.cpp	(working copy)
@@ -32,7 +32,8 @@
 //*************************************************
 //* TParamContr                                   *
 //*************************************************
-TParamContr::TParamContr( const string &name, TTypeParam *tpprm ) : TConfig(tpprm), mRdPrcTm(0), mPrm(-1), mEn(false), tpParm(tpprm)
+TParamContr::TParamContr( const string &name, TTypeParam *tpprm ) :
+    TConfig(tpprm), mRdPrcTm(0), mPrm(-1), mEn(false), tpParm(tpprm), mJustCreated(true)
 {
     cfg("SHIFR") = mId = name;	//!! To prevent the ID location changing on the parameter type change
 
@@ -297,6 +298,8 @@
     }
 
     LoadParmCfg();
+
+    mJustCreated = false;
 }
 
 void TParamContr::save_( )
@@ -306,6 +309,8 @@
     TBDS::dataSet(owner().DB()+"."+owner().tbl(type()), owner().owner().nodePath()+owner().tbl(type()), *this);
     if(SYS->cfgCtx(true)) SYS->cfgCtx(true)->setAttr("prmTp", type().name);
 
+    mJustCreated = false;
+
     //Save archives
     vector<string> aLs;
     vlList(aLs);
@@ -312,6 +317,11 @@
     for(unsigned iA = 0; iA < aLs.size(); iA++)
 	if(!vlAt(aLs[iA]).at().arch().freeStat())
 	    vlAt(aLs[iA]).at().arch().at().save();
+
+    //Control of saving-storing the containers
+    TParamContr *ownPrm = dynamic_cast<TParamContr*>(nodePrev());
+    if(ownPrm && ownPrm->justCreated())	ownPrm->save();
+    else if(!ownPrm && owner().justCreated())	owner().save();
 }
 
 bool TParamContr::cfgChange( TCfg &co, const TVariant &pc )
Index: src/tparamcontr.h
===================================================================
--- src/tparamcontr.h	(revision 3053)
+++ src/tparamcontr.h	(working copy)
@@ -86,6 +86,8 @@
 
 	TController &owner( ) const;
 
+	bool justCreated( )	{ return mJustCreated; }
+
 	//Attributes
 	time_t	mRdPrcTm;	//Redundancy processing time, mostly for the dynamic DAQ attributes
 
@@ -123,6 +125,8 @@
 	string	mId;
 
 	TTypeParam	*tpParm;
+
+	unsigned mJustCreated: 1;
 };
 
 }
Index: src/tsys.cpp
===================================================================
--- src/tsys.cpp	(revision 3053)
+++ src/tsys.cpp	(working copy)
@@ -2958,13 +2958,10 @@
     // int fileWrite( string file, string str, bool append = false ) - writes <str> to <file>, removes presented or <append>.
     //	  Return wrote bytes count.
     if(iid == "fileWrite" && prms.size() >= 2) {
-	int wflags = O_WRONLY|O_CREAT|O_TRUNC;
 	int64_t wcnt = 0;
-	string val = prms[1].getS();
-	if(prms.size() >= 3 && prms[2].getB()) wflags = O_WRONLY|O_CREAT|O_APPEND;
-	int hd = open(prms[0].getS().c_str(), wflags, permCrtFiles());
+	int hd = open(prms[0].getS().c_str(), O_WRONLY|O_CREAT|((prms.size()>=3 && prms[2].getB())?O_APPEND:O_TRUNC), permCrtFiles());
 	if(hd >= 0) {
-	    wcnt = write(hd, val.data(), val.size());
+	    wcnt = write(hd, prms[1].getS().data(), prms[1].getS().size());
 	    if(close(hd) != 0)
 		mess_warning(nodePath().c_str(), _("Closing the file %d error '%s (%d)'!"), hd, strerror(errno), errno);
 	}
Index: src/tvariant.cpp
===================================================================
--- src/tvariant.cpp	(revision 3052)
+++ src/tvariant.cpp	(working copy)
@@ -307,7 +307,7 @@
 		if(ivl.size() > 30000000)	throw TError("TVariant", _("Very large string for non STL string (> 30 MB)!"));
 		if(mStdString) { delete val.s; mStdString = false; }
 		if(mSize < sizeof(val.sMini))	val.sPtr = (char*)malloc(ivl.size()+1);
-		else if(ivl.size() != mSize)	{
+		else if(ivl.size() != mSize) {
 		    char *sPtrTmp = val.sPtr;
 		    val.sPtr = (char*)realloc(val.sPtr, ivl.size()+1);
 		    if(sPtrTmp && !val.sPtr) free(sPtrTmp);
@@ -1256,6 +1256,19 @@
     dataM.unlock();
 }
 
+void XMLNodeObj::childDel( AutoHD<XMLNodeObj> nd )
+{
+    if(nd.at().parent != this) throw TError("XMLNodeObj", _("Error deleting not child."));
+    dataM.lock();
+    for(unsigned iCh = 0; iCh < mChilds.size(); ++iCh)
+	if(&mChilds[iCh].at() == &nd.at()) {
+	    mChilds[iCh].at().parent = NULL;
+	    mChilds.erase(mChilds.begin()+iCh);
+	    break;
+	}
+    dataM.unlock();
+}
+
 AutoHD<XMLNodeObj> XMLNodeObj::childGet( unsigned id )
 {
     if(/*id < 0 || */id >= mChilds.size()) throw TError("XMLNodeObj", _("Child '%d' is not allowed."), id);
@@ -1329,10 +1342,10 @@
     // XMLNodeObj setText(string vl) - set node text
     //  vl - value for node text
     if(id == "setText" && prms.size())	{ setText(prms[0].getS()); return this; }
-    // XMLNodeObj setAttr(string id, string vl) - set attribute to value
+    // XMLNodeObj {setAttr,attrSet}(string id, string vl) - set attribute to value
     //  id - attribute identifier
     //  vl - value for attribute
-    if(id == "setAttr" && prms.size() >= 2)	{ propSet(prms[0].getS(), prms[1].getS()); return this; }
+    if((id == "setAttr" || id == "attrSet") && prms.size() >= 2) { propSet(prms[0].getS(), prms[1].getS()); return this; }
     // XMLNodeObj clear( bool full = false ) - clear the node for the childs remove, text and attributes for <full>.
     //  full - full clear include attributes.
     if(id == "clear") {
@@ -1367,8 +1380,16 @@
 	return AutoHD<TVarObj>(no);
     }
     // XMLNodeObj childDel(int id) - remove child node from position <id>
+    // XMLNodeObj childDel(ElTp no) - remove child node <no>
     //  id - child node position
-    if(id == "childDel" && prms.size())	{ childDel(prms[0].getI()); return this; }
+    //  no - node object
+    if(id == "childDel" && prms.size()) {
+	AutoHD<XMLNodeObj> no;
+	if(prms[0].type() == TVariant::Object && !(no=prms[0].getO()).freeStat())
+	    childDel(no);
+	else childDel(prms[0].getI());
+	return this;
+    }
     // XMLNodeObj childGet(int id) - get node from position <id>
     // XMLNodeObj childGet(string name, int num = 0) - get node by name <name> and number <num>
     //  id - child node position;
Index: src/tvariant.h
===================================================================
--- src/tvariant.h	(revision 3052)
+++ src/tvariant.h	(working copy)
@@ -311,6 +311,7 @@
 	void childAdd( AutoHD<XMLNodeObj> nd );
 	void childIns( unsigned id, AutoHD<XMLNodeObj> nd );
 	void childDel( unsigned id );
+	void childDel( AutoHD<XMLNodeObj> nd );
 
 	string getStrXML( const string &oid = "" );
 	static AutoHD<TVarObj> parseStrXML( XMLNode *nd = NULL );
