Index: data/oscada_plc.xml
===================================================================
--- data/oscada_plc.xml	(revision 3042)
+++ data/oscada_plc.xml	(working copy)
@@ -8,7 +8,7 @@
 	Description of the internal parameters of the station.
 	The station is the OpenSCADA program.
 	-->
-	<prm id="StName">PLC station</prm>
+	<prm id="StName">PLC</prm>
 	<!--<prm id="WorkDB">SQLite.GenDB</prm>-->
 	<prm id="LogTarget">10</prm>
 	<prm id="SaveAtExit">0</prm>
Index: data/oscada_server.xml
===================================================================
--- data/oscada_server.xml	(revision 3042)
+++ data/oscada_server.xml	(working copy)
@@ -8,7 +8,7 @@
 	Description of the internal parameters of the station.
 	The station is the OpenSCADA program.
 	-->
-	<prm id="StName">Server station</prm>
+	<prm id="StName">Server</prm>
 	<!--<prm id="WorkDB">SQLite.GenDB</prm>-->
 	<prm id="LogTarget">10</prm>
 	<prm id="SaveAtExit">0</prm>
Index: src/moduls/daq/LogicLev/logiclev.cpp
===================================================================
--- src/moduls/daq/LogicLev/logiclev.cpp	(revision 3042)
+++ src/moduls/daq/LogicLev/logiclev.cpp	(working copy)
@@ -733,11 +733,11 @@
     else if((a_path == "/prm/cfg/prmp_lst" || a_path == "/prm/cfg/prmpLst") && ctrChkNode3(opt,"get",R_R_R_,SEC_RD))
 	SYS->daq().at().ctrListPrmAttr(opt, cfg("PSRC").getS(), true, '.');
     else if(isStd() && tmpl->func() && tmpl->TPrmTempl::Impl::cntrCmdProc(opt)) {
-	if(owner().period()) opt->setAttr("updTm", r2s(1.5e-9*owner().period()));
+	if(owner().period() && a_path != "/prm/cfg/attr_only") opt->setAttr("updTm", r2s(1.5e-9*owner().period()));
     }
     else {
 	TParamContr::cntrCmdProc(opt);
-	if(a_path.find("/val/") == 0 && owner().period())
+	if(a_path.starts_with("/val/") && owner().period())
 	    opt->setAttr("updTm", r2s(1.5e-9*owner().period()));
     }
 }
Index: src/moduls/daq/ModBus/modbus_daq.cpp
===================================================================
--- src/moduls/daq/ModBus/modbus_daq.cpp	(revision 3042)
+++ src/moduls/daq/ModBus/modbus_daq.cpp	(working copy)
@@ -144,7 +144,8 @@
 	    int errCode = TError::Tr_Connect;
 	    if(addr().empty())	{ val += TSYS::strMess(_("No transport. ")); errCode = TError::Tr_ErrTransport; }
 	    else try {
-		    AutoHD<TTransportOut> tr = SYS->transport().at().at(TSYS::strParse(addr(),0,".")).at().outAt(TSYS::strParse(addr(),1,"."));
+		    AutoHD<TTransportOut> tr = SYS->transport().at().outAt(addr());
+			//SYS->transport().at().at(TSYS::strParse(addr(),0,".")).at().outAt(TSYS::strParse(addr(),1,"."));
 		    if(tr.at().addr().empty()) { val += TSYS::strMess(_("Empty transport. ")); errCode = TError::Tr_ErrTransport; }
 		} catch(TError&) { val += TSYS::strMess(_("Error the transport. ")); errCode = TError::Tr_ErrTransport; }
 	    if(errCode == TError::Tr_Connect)	val += TSYS::strMess(_("Error the connection. "));
@@ -1564,11 +1565,11 @@
 	modif();
     }
     else if(isLogic() && enableStat() && lCtx->func() && lCtx->cntrCmdProc(opt)) {
-	if(owner().period()) opt->setAttr("updTm", r2s(1.5e-9*owner().period()));
+	if(owner().period() && a_path != "/prm/cfg/attr_only") opt->setAttr("updTm", r2s(1.5e-9*owner().period()));
     }
     else {
 	TParamContr::cntrCmdProc(opt);
-	if(a_path.find("/val/") == 0 && owner().period())
+	if(a_path.starts_with("/val/") && owner().period())
 	    opt->setAttr("updTm", r2s(1.5e-9*owner().period()));
     }
 }
Index: src/moduls/daq/OPC_UA/mod_daq.cpp
===================================================================
--- src/moduls/daq/OPC_UA/mod_daq.cpp	(revision 3042)
+++ src/moduls/daq/OPC_UA/mod_daq.cpp	(working copy)
@@ -1387,11 +1387,11 @@
 	modif();
     }
     else if(isLogic() && enableStat() && lCtx->func() && lCtx->cntrCmdProc(opt)) {
-	if(owner().period()) opt->setAttr("updTm", r2s(1.5e-9*owner().period()));
+	if(owner().period() && a_path != "/prm/cfg/attr_only") opt->setAttr("updTm", r2s(1.5e-9*owner().period()));
     }
     else {
 	TParamContr::cntrCmdProc(opt);
-	if(a_path.find("/val/") == 0 && owner().period())
+	if(a_path.starts_with("/val/") && owner().period())
 	    opt->setAttr("updTm", r2s(1.5e-9*owner().period()));
     }
 }
Index: src/moduls/daq/Siemens/siemens.cpp
===================================================================
--- src/moduls/daq/Siemens/siemens.cpp	(revision 3043)
+++ src/moduls/daq/Siemens/siemens.cpp	(working copy)
@@ -482,11 +482,15 @@
 
 string TMdContr::getStatus( )
 {
-    string rez = TController::getStatus( );
+    string rez = TController::getStatus();
     if(startStat() && !redntUse()) {
 	if(!prcSt) rez += TSYS::strMess(_("Task terminated! "));
 	if(tmDelay > -1) {
 	    rez += (conErr.getVal().size()?conErr.getVal():string(_("Error connecting."))) + " ";
+	    /*if(conErr.getVal().size()) {
+		int codeOff = 0; TSYS::strParse(conErr.getVal(),0,":",&codeOff);
+    	    	rez += (codeOff<conErr.getVal().size()?conErr.getVal().substr(codeOff):conErr.getVal()) + " ";
+	    } else rez += string(_("Error connecting.")) + " ";*/
 	    if(tmDelay) rez += TSYS::strMess(_("Restoring in %.6g s. "), tmDelay);
 	    rez.replace(0, 1, i2s(TError::Tr_Connect));
 	}
@@ -685,6 +689,8 @@
 
 void TMdContr::connectRemotePLC( bool initOnly )
 {
+    try {
+
     switch(mType) {
 	case CIF_PB:
 	    if(!(owner().cif_devs[0].present||owner().cif_devs[1].present||owner().cif_devs[2].present||owner().cif_devs[3].present))
@@ -718,7 +724,8 @@
 	}
 	case ADS:
 	case SELF_ISO_TCP:
-	    tr = SYS->transport().at().at(TSYS::strParse(addrTr(),0,".")).at().outAt(TSYS::strParse(addrTr(),1,"."));
+	    tr = SYS->transport().at().outAt(addrTr());
+            //SYS->transport().at().at(TSYS::strParse(addrTr(),0,".")).at().outAt(TSYS::strParse(addrTr(),1,"."));
 	    //try { tr.at().start(); }
 	    //catch(TError &err) { throw TError(nodePath(), _("Error connecting.")); }
 	    reset();
@@ -725,6 +732,8 @@
 	    break;
 	default: throw TError(nodePath().c_str(), _("The connection type '%d' is not supported."), mType);
     }
+
+    } catch(TError &er) { er.cod = TError::Tr_Connect; throw er; }
 }
 
 void TMdContr::disconnectRemotePLC( )
@@ -827,13 +836,13 @@
 	    }
 	    case ISO_TCP:
 	    case ISO_TCP243: {
-		//Reconnect for lost connection
-		if(!dc || tmDelay >= 0) connectRemotePLC();
+		if(!dc || tmDelay >= 0) connectRemotePLC();	//Reconnect for lost connection
+
 		int rez;
 		MtxAlloc res1(reqAPIRes, true);
 		ResAlloc res2(mod->resAPI, false);
 		if((rez=daveReadBytes(dc,((n_db>=0)?daveDB:-n_db),((n_db>=0)?n_db:0),offset,buffer.size(),NULL))) {
-		    if(rez == daveResTimeout) throw TError("ReadDB", _("Error connecting."));
+		    if(rez == daveResTimeout) throw TError(TError::Tr_Connect, "ReadDB", _("Error connecting."));
 		    if(messLev() == TMess::Debug) mess_debug(nodePath().c_str(), _("Error reading the block %d: %s."), n_db, daveStrerror(rez));
 		    throw TError(TError::EXT+1, "ReadDB", _("Error the DB %d: %s."), n_db, daveStrerror(rez));
 		}
@@ -903,7 +912,8 @@
 		req.setAttr("id", "read")->setAttr("db", i2s(n_db))->setAttr("off", i2s(offset))->setAttr("size", i2s(buffer.size()));
 		reqService(req);
 		if(req.attr("err").size()) throw TError(s2i(req.attr("errCod")), "", req.attr("err"));
-		if(req.text().size() != buffer.size()) throw TError("read", _("Size of the response data block %d != %d."), req.text().size(), buffer.size());
+		if(req.text().size() != buffer.size())
+		throw TError("read", _("Size of the response data block %d != %d."), req.text().size(), buffer.size());
 		buffer.replace(0, buffer.size(), req.text());	//!!!! But assign() temporary the block size changes
 		break;
 	    }
@@ -910,10 +920,10 @@
 	}
 	numR += buffer.size();
     } catch(TError &er) {
-	if(er.cat.size()) er.mess = er.cat + ":" + er.mess;
-	if(!er.cod) er.cod = TError::Tr_Connect;
+	//if(er.cat.size()) er.mess = er.cat + ":" + er.mess;
+	//if(!er.cod) er.cod = TError::Tr_Connect;
 	//if(er.cod == TError::Tr_Connect) setCntrDelay(er.mess);
-	er.mess = i2s(er.cod) + ":" + er.mess;
+	//er.mess = i2s(er.cod) + ":" + er.mess;
 	if(messLev() == TMess::Debug) mess_debug(nodePath().c_str(), "%s", er.mess.c_str());
 	throw er;
     }
@@ -978,13 +988,13 @@
 	    }
 	    case ISO_TCP:
 	    case ISO_TCP243: {
-		//Reconnect for lost connection
-		if(!dc || tmDelay >= 0) connectRemotePLC();
+		if(!dc || tmDelay >= 0) connectRemotePLC();	//Reconnect for lost connection
+
 		int rez;
 		MtxAlloc res1(reqAPIRes, true);
 		ResAlloc res2(mod->resAPI, false);
 		if((rez=daveWriteBytes(dc,((n_db>=0)?daveDB:-n_db),((n_db>=0)?n_db:0),offset,buffer.size(),(char*)buffer.c_str()))) {
-		    if(rez == daveResTimeout) throw TError("WriteDB", _("Error connecting."));
+		    if(rez == daveResTimeout) throw TError(TError::Tr_Connect, "WriteDB", _("Error connecting."));
 		    if(messLev() == TMess::Debug) mess_debug(nodePath().c_str(), _("Error writing the block %d: %s."), n_db, daveStrerror(rez));
 		    throw TError(TError::EXT+1, "WriteDB", _("Error the DB %d: %s."), n_db, daveStrerror(rez));
 		}
@@ -1055,10 +1065,10 @@
 	}
 	numW += buffer.size();
     } catch(TError &er) {
-	if(er.cat.size()) er.mess = er.cat + ":" + er.mess;
-	if(!er.cod) er.cod = TError::Tr_Connect;
+	//if(er.cat.size()) er.mess = er.cat + ":" + er.mess;
+	//if(!er.cod) er.cod = TError::Tr_Connect;
 	//if(er.cod == TError::Tr_Connect) setCntrDelay(er.mess);
-	er.mess = i2s(er.cod) + ":" + er.mess;
+	//er.mess = i2s(er.cod) + ":" + er.mess;
 	if(messLev() == TMess::Debug) mess_debug(nodePath().c_str(), "%s", er.mess.c_str());
 	throw er;
     }
@@ -1069,23 +1079,25 @@
     MtxAlloc res(reqAPIRes, true);
     try {
 	//Reconnect for lost connection
-	if(tmDelay >= 0) connectRemotePLC();
-	if(!tr.at().startStat()) tr.at().start(enableStat() ? 0 : 1000);
+	try {
+	    if(tmDelay >= 0) connectRemotePLC();
+	    if(!tr.at().startStat()) tr.at().start(enableStat() ? 0 : 1000);
+	} catch(TError &er) { er.cod = TError::Tr_Connect; throw er; }
 
 	io.setAttr("err", "");
 	if(!isInitiated) {
 	    XMLNode req("ISO-TCP"); req.setAttr("id", "connect");
 	    protIO(req);
-	    if(!req.attr("err").empty()) throw TError(req.attr("id"), req.attr("err"));
+	    //if(!req.attr("err").empty()) throw TError(req.attr("id"), req.attr("err"));
 
 	    req.clear()->setAttr("id", "OpenS7Connection");
 	    protIO(req);
-	    if(!req.attr("err").empty()) throw TError(req.attr("id"), req.attr("err"));
+	    //if(!req.attr("err").empty()) throw TError(req.attr("id"), req.attr("err"));
 
 	    isInitiated = true;
 	}
 	protIO(io);
-    } catch(TError &er) { io.setAttr("err", (er.cat.empty()?"":er.cat+":")+er.mess)->setAttr("errCod", i2s(er.cod)); }
+    } catch(TError &er) { io.setAttr("err", er.mess)->setAttr("errCod", i2s(er.cod)); }
 }
 
 void TMdContr::protIO( XMLNode &io )
@@ -1095,7 +1107,7 @@
     char buf[1000];
 
     MtxAlloc resN(tr.at().reqRes(), true);
-    try {
+    //try {
 	if(io.name() != "ISO-TCP")	throw TError("", _("Unknown target protocol '%s'."), io.name().c_str());
 
 						//>TPKT (RFC-1006)
@@ -1197,13 +1209,16 @@
 	oN(tpkt, tpkt.size(), 2, tpktLenOff);			//>TPTK real length
 
 	//Send request and wait respond
-	int resp_len = messIO(tpkt.data(), tpkt.size(), buf, sizeof(buf));
-	tpkt.assign(buf, resp_len);
 	int off = 2;
-	for( ; tpkt.size() < 4 || tpkt.size() < iN(tpkt,off,2); off = 2) {
-	    if(!(resp_len=messIO(NULL,0,buf,sizeof(buf)))) throw TError("", _("Not full response."));
-	    tpkt.append(buf, resp_len);
-	}
+	try {
+	    int resp_len = messIO(tpkt.data(), tpkt.size(), buf, sizeof(buf));
+	
+	    tpkt.assign(buf, resp_len);
+	    for( ; tpkt.size() < 4 || tpkt.size() < iN(tpkt,off,2); off = 2) {
+		if(!(resp_len=messIO(NULL,0,buf,sizeof(buf)))) throw TError("", _("Not full response."));
+		tpkt.append(buf, resp_len);
+	    }
+	} catch(TError &er) { er.cod = TError::Tr_Connect; throw er; }
 
 	off = 2;
 	if(tpkt.size() < 4 || iN(tpkt,off,2) != tpkt.size())	//<TPKT length
@@ -1282,11 +1297,14 @@
 		    // Data part
 		    uint8_t iDErr = iN(tpkt, off, 1);
 		    if(iDErr != 0xFF) {
-			if(iDErr == 3)		throw TError(TError::EXT+2, io.attr("id").c_str(), _("An attempt to access outside the DB '%s' (200 family), %s(%s)."),
-					io.attr("db").c_str(), io.attr("off").c_str(), io.attr("size").c_str());
-			else if(iDErr == 5)	throw TError(TError::EXT+2, io.attr("id").c_str(), _("An attempt to access outside the DB '%s', %s(%s)."),
-					io.attr("db").c_str(), io.attr("off").c_str(), io.attr("size").c_str());
-			else if(iDErr == 10)	throw TError(TError::EXT+1, io.attr("id").c_str(), _("The DB '%s' doesn't exist."), io.attr("db").c_str());
+			if(iDErr == 3) throw TError(TError::EXT+2, io.attr("id").c_str(),
+			   			_("An attempt to access outside the DB '%s' (200 family), %s(%s)."),
+						io.attr("db").c_str(), io.attr("off").c_str(), io.attr("size").c_str());
+			else if(iDErr == 5) throw TError(TError::EXT+2, io.attr("id").c_str(),
+						_("An attempt to access outside the DB '%s', %s(%s)."),
+						io.attr("db").c_str(), io.attr("off").c_str(), io.attr("size").c_str());
+			else if(iDErr == 10) throw TError(TError::EXT+1, io.attr("id").c_str(),
+						_("The DB '%s' doesn't exist."), io.attr("db").c_str());
 			else throw TError(TError::EXT+3, io.attr("id").c_str(), _("Unknown error accessing to DB, %xh."), iDErr);
 		    }
 		    char iDLenTp = iN(tpkt, off, 1);
@@ -1296,8 +1314,8 @@
 		    else if(iDLenTp == 3) ;		//len is in bits, but there is a byte per result bit, ok
 		    else throw TError(TError::EXT+4, io.attr("id").c_str(), _("Unknown data encoding type, %d."), iDLenTp);
 		    if((off+iDLen) != (int)tpkt.size())
-			throw TError(TError::EXT+5, io.attr("id").c_str(), _("Inconsistency in the size of the data block to the response size, %d(%d)."),
-								    (off+iDLen), tpkt.size());
+			throw TError(TError::EXT+5, io.attr("id").c_str(),
+				     _("Inconsistency in the size of the data block to the response size, %d(%d)."), (off+iDLen), tpkt.size());
 		    io.setText(tpkt.substr(off));
 		    break;
 		}
@@ -1308,9 +1326,12 @@
 		    // Data part
 		    uint8_t iDErr = iN(tpkt, off, 1);
 		    if(iDErr != 0xFF) {
-			if(iDErr == 5) throw TError(TError::EXT+2, io.attr("id").c_str(), _("An attempt to access outside the DB '%s', %s(%s)."),
+			if(iDErr == 5)
+			    throw TError(TError::EXT+2, io.attr("id").c_str(),
+					 _("An attempt to access outside the DB '%s', %s(%s)."),
 					io.attr("db").c_str(), io.attr("off").c_str(), io.attr("size").c_str());
-			else if(iDErr == 10) throw TError(TError::EXT+1, io.attr("id").c_str(), _("The DB '%s' doesn't exist."), io.attr("db").c_str());
+			else if(iDErr == 10)
+			    throw TError(TError::EXT+1, io.attr("id").c_str(), _("The DB '%s' doesn't exist."), io.attr("db").c_str());
 			else throw TError(TError::EXT+3, io.attr("id").c_str(), _("Unknown error accessing to DB, %xh."), iDErr);
 		    }
 		    break;
@@ -1317,7 +1338,7 @@
 		}
 	    }
 	}
-    } catch(TError &er) { io.setAttr("err", (er.cat.empty()?"":er.cat+":")+er.mess)->setAttr("errCod", i2s(er.cod)); }
+    //} catch(TError &er) { io.setAttr("err", er.mess)->setAttr("errCod", i2s(er.cod)); }
 }
 
 int TMdContr::messIO( const char *oBuf, int oLen, char *iBuf, int iLen )
@@ -1327,6 +1348,8 @@
 
 void TMdContr::reset( )
 {
+    if(!tr.freeStat())	tr.at().stop();	//!!!! At some errors we need to disconnect
+
     isInitiated = false;
     mInvokeID = -1;
 }
@@ -1334,8 +1357,7 @@
 TVariant TMdContr::getVal( const string &iaddr, MtxString &err )
 {
     if(tmDelay > 0) {
-	if(err.getVal().empty())
-	    err = TSYS::strMess("%d:%s", TError::Tr_Connect, conErr.getVal().c_str());
+	if(err.getVal().empty()) err = conErr; //TSYS::strMess("%d:%s", TError::Tr_Connect, conErr.getVal().c_str());
 	return EVAL_REAL;
     }
 
@@ -1393,7 +1415,7 @@
 bool TMdContr::setVal( const TVariant &ivl, const string &iaddr, MtxString &err )
 {
     if(tmDelay > 0) {
-	if(err.getVal().empty()) err = TSYS::strMess("%d:%s", TError::Tr_Connect, conErr.getVal().c_str());
+	if(err.getVal().empty()) err = conErr;	//TSYS::strMess("%d:%s", TError::Tr_Connect, conErr.getVal().c_str());
 	return false;
     }
     if(ivl.isEVal())	return true;
@@ -1645,9 +1667,16 @@
 		     "    AMSNetId - network identifier, writes in view of six digits 0-255, for example: \"192.168.0.1.1.1\";\n"
 		     "    AMSPort - port, writes in view of one digit 0-65535."));
 	else ctrRemoveNode(opt, "/cntr/cfg/ADDR");
-	if(type() == ADS || type() == SELF_ISO_TCP)
-	    ctrMkNode3("fld",opt,-1,"/cntr/cfg/ADDR_TR",EVAL_STR,SEC_RD|SEC_WR, "dest","select", "select","/cntr/cfg/trLst",
-		"help",_("OpenSCADA output transport for the protocol ADS (port 48898, 801 for AMS) and ISO_TCP (port 102) for sending requests."));
+    	if(type() == ADS || type() == SELF_ISO_TCP) {
+	    string outHelp, tVl;
+	    if((tVl=TSYS::strParse(addrTr(),1,".")).size() && tVl.find(STR_IN_PREF) != 0 &&
+		    SYS->transport().at().modPresent((tVl=TSYS::strParse(addrTr(),0,"."))))
+		outHelp = SYS->transport().at().at(tVl).at().outAddrHelp();
+	    ctrMkNode3("fld",opt,-1,"/cntr/cfg/ADDR_TR",EVAL_STR,SEC_RD|SEC_WR, "dest","sel_ed", "select","/cntr/cfg/trLst",
+		"help",(TMess::labStdOutTrs()+(outHelp.size()?"\n\n"+outHelp+"\n\n"+
+		        _("OpenSCADA output transport for the protocol ADS (port 48898, 801 for AMS) and "
+		          "ISO_TCP (port 102) for sending requests.")+"\n":"")).c_str());
+	}
 	else ctrRemoveNode(opt, "/cntr/cfg/ADDR_TR");
 	ctrMkNode3("fld",opt,-1,"/cntr/cfg/MAX_BLKSZ",EVAL_STR,SEC_RD|(startStat()?0:SEC_WR));
 	return;
@@ -1672,11 +1701,37 @@
 	start();
     }
     else if(a_path == "/cntr/cfg/trLst" && ctrChkNode3(opt,"get",R_R_R_,SEC_RD)) {
-	vector<string> sls;
-	SYS->transport().at().outTrList(sls);
-	for(unsigned iS = 0; iS < sls.size(); iS++)
-	    opt->childAdd("el")->setText(sls[iS]);
-    } else TController::cntrCmdProc(opt);
+        int cLv = 0;
+        string  cPath = "", cEl, pAddr = TSYS::strParse(addrTr(), 0, ":");
+        vector<string> list;
+        for(int cOff = 0; (cEl=TSYS::strParse(pAddr,0,".",&cOff)).size(); ++cLv) {
+            cPath += cLv ? "."+cEl : cEl;
+            opt->childAdd("el")->setText(cPath);
+        }
+
+        switch(cLv) {
+            case 0:
+                SYS->transport().at().modList(list);
+                for(unsigned iS = 0; iS < list.size(); iS++)
+                    opt->childAdd("el")->setText(list[iS]);
+                break;
+            case 1:
+                if(!SYS->transport().at().modPresent(cEl=TSYS::strParse(pAddr,0,"."))) break;
+                SYS->transport().at().at(cEl).at().outList(list);
+                for(unsigned iS = 0; iS < list.size(); iS++)
+                    opt->childAdd("el")->setText(cPath+"."+list[iS]);
+                SYS->transport().at().at(cEl).at().inList(list);
+                for(unsigned iS = 0; iS < list.size(); iS++)
+                    opt->childAdd("el")->setText(cPath+"."+STR_IN_PREF+list[iS]);
+                break;
+            case 2:
+                if(TSYS::strParse(pAddr,1,".").find(STR_IN_PREF) == 0)
+                    opt->childAdd("el")->setText(cPath+":RemConId");
+                //else ?!?!
+                break;
+        }
+    }
+    else TController::cntrCmdProc(opt);
 }
 
 const char *TMdContr::iVal( const string &rb, int &off, char vSz )
@@ -2151,11 +2206,11 @@
 	modif();
     }
     else if(isLogic() && enableStat() && lCtx->cntrCmdProc(opt)) {
-	if(owner().period()) opt->setAttr("updTm", r2s(1.5e-9*owner().period()));
+	if(owner().period() && a_path != "/prm/cfg/attr_only") opt->setAttr("updTm", r2s(1.5e-9*owner().period()));
     }
     else {
 	TParamContr::cntrCmdProc(opt);
-	if(a_path.find("/val/") == 0 && owner().period())
+	if(a_path.starts_with("/val/") && owner().period())
 	    opt->setAttr("updTm", r2s(1.5e-9*owner().period()));
     }
 }
@@ -2177,7 +2232,8 @@
     map<int,SLnk>::iterator it = lnks.find(num);
     if(it == lnks.end() || it->second.addrSpec.size())	return false;
 
-    if(mess_lev() == TMess::Debug) mess_debug(((TMdPrm*)obj)->owner().nodePath().c_str(), "Requesting the link %d for value '%s'", num, it->second.addr.c_str());
+    if(mess_lev() == TMess::Debug)
+	mess_debug(((TMdPrm*)obj)->owner().nodePath().c_str(), "Requesting the link %d for value '%s'", num, it->second.addr.c_str());
 
     it->second.addrSpec = "";
     int rez = 0, db = -1, off = -1;
@@ -2189,7 +2245,8 @@
     else return false;
     if(off < 0)	return false;
 
-    if(mess_lev() == TMess::Debug) mess_debug(((TMdPrm*)obj)->owner().nodePath().c_str(), "Initiation the link %d value '%s'", num, it->second.addr.c_str());
+    if(mess_lev() == TMess::Debug)
+	mess_debug(((TMdPrm*)obj)->owner().nodePath().c_str(), "Initiation the link %d value '%s'", num, it->second.addr.c_str());
 
     string stp = isShort ? TSYS::strParse(TSYS::strLine(func()->io(num)->def(),0),2,"|") : tp;
     if(stp.empty() || isdigit(stp[0]))
Index: src/moduls/daq/System/da_smart.cpp
===================================================================
--- src/moduls/daq/System/da_smart.cpp	(revision 3042)
+++ src/moduls/daq/System/da_smart.cpp	(working copy)
@@ -30,10 +30,13 @@
 #include "da_smart.h"
 
 #define SCSI_MAJOR 8
+#define NVME_MAJOR 259
 
 using namespace SystemCntr;
 
-const char *HddSmart::smartval_cmd = "smartctl -A -v N,raw48 %s 2> /dev/null";
+const char *HddSmart::smartval_cmd = "smartctl -A %s 2> /dev/null",	// "smartctl -A -v N,raw48 %s 2> /dev/null";
+	*HddSmart::stdRE_str = "^\\s*(\\d+)\\s+([^\\s]+)\\s+0x\\d\\d\\d\\d\\s+\\d\\d\\d\\s+\\d\\d\\d\\s+\\d\\d\\d\\s+[^\\s]+\\s+[^\\s]+\\s+[^\\s]+\\s+([^\\n]+)",
+	*HddSmart::logRE_str = "^(.+):\\s+([^\\n]+)";
 
 //*************************************************
 //* HddSmart                                      *
@@ -45,23 +48,56 @@
 void HddSmart::getVal( TMdPrm *prm )
 {
     int id;
-    unsigned long val;
     char buf[256];
-    char name[31];
+    TRegExp stdRE(stdRE_str), logRE(logRE_str), replRE(",", "g");
 
     string dev = prm->cfg("SUBT").getS();
 
     //SMART attributes
     vector<string> als;
-    string cmd = TSYS::strMess(smartval_cmd,("/dev/"+dev+((dev.size()&&dev[0]=='s')?" -d ata":"")).c_str());
+    string cmd = TSYS::strMess(smartval_cmd,("/dev/"+dev+((dev.size()&&dev[0]=='s')?" -d ata":"")).c_str()),
+	sId, sName, sVal;
     FILE *fp = popen(cmd.c_str(),"r");
+    TArrayObj *stdEntr = NULL, *logEntr = NULL;
     while(fp && fgets(buf,sizeof(buf),fp) != NULL) {
-	if(sscanf(buf,"%d %30s %*x %*d %*d %*d %*s %*s %*s %lu\n",&id,name,&val) != 3) continue;
-	string sId = i2s(id);
-	if(!prm->vlPresent(sId))
-	    ((TElem*)prm->daData)->fldAdd(new TFld(sId.c_str(),(string(name)+" ("+sId+")").c_str(),TFld::Integer,TFld::NoWrite));
-	prm->vlAt(sId).at().setI(val, 0, true);
-	als.push_back(sId);
+	stdEntr = logEntr = NULL;
+	if(((stdEntr=stdRE.match(buf)) && stdEntr->arSize() >= 3) ||	// Typical mode
+	    ((logEntr=logRE.match(buf)) && logEntr->arSize() >= 2))	// NVMe Log and other log entries
+	{
+	    if(stdEntr && stdEntr->arSize() >= 3) {
+		sId = stdEntr->arGet(1).getS();
+		sName = stdEntr->arGet(2).getS()+" ("+sId+")";
+		sVal = stdEntr->arGet(3).getS();
+	    }
+	    else if(logEntr && logEntr->arSize() >= 2) {
+		sName = logEntr->arGet(1).getS();
+		sId = TSYS::strEncode(sName, TSYS::oscdID);
+		sVal = logEntr->arGet(2).getS();
+	    }
+	    if(!prm->vlPresent(sId)) {
+		//Checking for no number symbols presence
+		unsigned iCh = 0;
+		for( ; iCh < sVal.size(); ++iCh) {
+		    switch(sVal[iCh]) {
+			case ',': case '0' ... '9': case 'x': case 'X': continue;
+		    }
+		    break;
+		}
+		((TElem*)prm->daData)->fldAdd(new TFld(sId.c_str(),sName.c_str(),
+					(iCh<sVal.size())?TFld::String:TFld::Integer,TFld::NoWrite));
+	    }
+
+	    sVal = replRE.replace(sVal, "");
+
+	    if(prm->vlAt(sId).at().fld().type() == TFld::Integer)
+		prm->vlAt(sId).at().setI(strtoll(sVal.c_str(),NULL,0), 0, true);
+	    else prm->vlAt(sId).at().setS(sVal, 0, true);
+
+	    als.push_back(sId);
+	}
+
+	if(stdEntr) delete stdEntr;
+	if(logEntr) delete logEntr;
     }
     if(fp && pclose(fp) == -1)
 	mess_warning(prm->nodePath().c_str(), _("Closing the pipe %p error '%s (%d)'!"), fp, strerror(errno), errno);
@@ -90,6 +126,7 @@
     int major, minor;
     char name[11];
     char buf[256];
+    TRegExp stdRE(stdRE_str), logRE(logRE_str);
 
     FILE *f = fopen("/proc/partitions","r");
     if(f == NULL) return;
@@ -96,22 +133,23 @@
 
     while(fgets(buf,sizeof(buf),f) != NULL) {
 	if(sscanf(buf,"%d %d %*d %10s",&major,&minor,name) != 3) continue;
-	if(/*!part &&*/ ((major != SCSI_MAJOR && minor != 0) || (major == SCSI_MAJOR && (minor%16)) || !strncmp(name,"md",2)))
-	    continue;
+	if((major != SCSI_MAJOR && major != NVME_MAJOR) || (minor%16)) continue;
 
 	string cmd = TSYS::strMess(smartval_cmd,(string("/dev/")+name+((major==SCSI_MAJOR)?" -d ata":"")).c_str());
-	FILE *fp = popen(cmd.c_str(),"r");
+	FILE *fp = popen(cmd.c_str(), "r");
 	if(fp) {
 	    int val;
 	    bool access_true = false;
 	    while(fgets(buf,sizeof(buf),fp) != NULL) {
-		if(sscanf(buf,"%*d %*s %*x %*d %*d %*d %*s %*s %*s %d\n",&val) != 1) continue;
+		if(!stdRE.test(buf) && !logRE.test(buf)) continue;
 		access_true = true;
 		break;
 	    }
-	    if(pclose(fp) == -1) mess_warning(mod->nodePath().c_str(), _("Closing the pipe %p error '%s (%d)'!"), fp, strerror(errno), errno);
+	    if(pclose(fp) == -1)
+		mess_warning(mod->nodePath().c_str(), _("Closing the pipe %p error '%s (%d)'!"), fp, strerror(errno), errno);
 	    if(access_true) list.push_back(name);
 	}
     }
-    if(fclose(f) != 0) mess_warning(mod->nodePath().c_str(), _("Closing the file %p error '%s (%d)'!"), f, strerror(errno), errno);
+    if(fclose(f) != 0)
+	mess_warning(mod->nodePath().c_str(), _("Closing the file %p error '%s (%d)'!"), f, strerror(errno), errno);
 }
Index: src/moduls/daq/System/da_smart.h
===================================================================
--- src/moduls/daq/System/da_smart.h	(revision 3042)
+++ src/moduls/daq/System/da_smart.h	(working copy)
@@ -52,7 +52,7 @@
 	void dList( vector<string> &list, TMdPrm *prm = NULL );
 
 	//Attributes
-	static const char *smartval_cmd;
+	static const char *smartval_cmd, *stdRE_str, *logRE_str;
 };
 
 } //End namespace
Index: src/moduls/daq/System/da_ups.cpp
===================================================================
--- src/moduls/daq/System/da_ups.cpp	(revision 3042)
+++ src/moduls/daq/System/da_ups.cpp	(working copy)
@@ -220,7 +220,7 @@
     else tr = SYS->transport().at().at(tTr).at().outAt(nTr);
 
     MtxAlloc resN(tr.at().reqRes(), true);
-    if(tr.at().addr() != host) tr.at().setAddr(host);
+    if(tr.at().addr() != host) { tr.at().setAddr(host); tr.at().modifClr(); }
     if(!tr.at().startStat()) tr.at().start();
 
     if(debCat.size()) mess_debug(debCat.c_str(), _("REQ -> '%s'"), req.c_str());
Index: src/moduls/daq/System/os_contr.cpp
===================================================================
--- src/moduls/daq/System/os_contr.cpp	(revision 3042)
+++ src/moduls/daq/System/os_contr.cpp	(working copy)
@@ -133,7 +133,8 @@
 			"0;1;2;3",trS("Manual;Fast sources;Slow sources;All sources")));
     fldAdd(new TFld("PRM_BD",trS("Table of system parameters"),TFld::String,TFld::NoFlag,"30","system"));	//????[v1.0] Remove
     fldAdd(new TFld("SCHEDULE",trS("Acquisition schedule"),TFld::String,TFld::NoFlag,"100","1"));
-    fldAdd(new TFld("PRIOR",trS("Priority of the acquisition task"),TFld::Integer,TFld::NoFlag,"2","0","-1;199"));
+    fldAdd(new TFld("PRIOR",trS("Priority of the acquisition task"),TFld::Integer,TFld::NoFlag,"3","0","-1;199"));
+    fldAdd(new TFld("IN_CYCLE_SLOW",trS("In cycle call for slow sources"),TFld::Integer,TFld::NoFlag,"3","10","1;100"));
 
     //Parameter type bd structure
     int t_prm = tpParmAdd("std", "PRM_BD", _("Standard"));
@@ -275,7 +276,7 @@
 
     mod->daList(daL);
 
-    while(!cntr.endrunReq) {
+    for(unsigned cycle = 0; !cntr.endrunReq; ++cycle) {
 	if(!cntr.redntUse()) {
 	    //Generic update the Data Sources
 	    for(unsigned iLs = 0; iLs < daL.size(); iLs++)
@@ -285,8 +286,12 @@
 	    cntr.enRes.resRequestR();
 	    cntr.callSt = true;
 	    for(unsigned iP = 0; iP < cntr.pHd.size(); iP++)
-		try { cntr.pHd[iP].at().getVal(); }
-		catch(TError &err) { mess_err(err.cat.c_str(), "%s", err.mess.c_str()); }
+		try {
+		    if(cntr.period() && cntr.inCycleSlow() > 1 && cntr.pHd[iP].at().isSlow() &&
+				     cycle && (cycle%cntr.inCycleSlow()))
+			continue;
+		    cntr.pHd[iP].at().getVal();
+		} catch(TError &err) { mess_err(err.cat.c_str(), "%s", err.mess.c_str()); }
 	    cntr.callSt = false;
 	    cntr.enRes.resRelease();
 	}
@@ -305,7 +310,7 @@
     if(opt->name() == "info") {
 	TController::cntrCmdProc(opt);
 	ctrRemoveNode(opt,"/cntr/cfg/PERIOD");
-	ctrMkNode3("fld",opt,-1,"/cntr/cfg/SCHEDULE",EVAL_STR,SEC_RD|(startStat()?0:SEC_WR),
+	ctrMkNode3("fld",opt,-1,"/cntr/cfg/SCHEDULE",EVAL_STR,SEC_RD|SEC_WR,
 	    "dest","sel_ed", "sel_list",TMess::labSecCRONsel().c_str(), "help",TMess::labSecCRON().c_str());
 	ctrMkNode3("fld",opt,-1,"/cntr/cfg/PRIOR",EVAL_STR,SEC_RD|(startStat()?0:SEC_WR), "help",TMess::labTaskPrior().c_str());
 	return;
@@ -436,7 +441,9 @@
 
     if(val.arch().freeStat()) return;
     val.arch().at().setSrcMode(TVArchive::DAQAttr);
-    val.arch().at().setPeriod(owner().period() ? (int64_t)owner().period()/1000 : 1000000);
+    val.arch().at().setPeriod(owner().period()
+	    ? (int64_t)owner().period()*(isSlow()?owner().inCycleSlow():1)/1000
+	    : 1000000);
     val.arch().at().setHardGrid(true);
     val.arch().at().setHighResTm(true);
 }
@@ -517,7 +524,8 @@
 	if(mDA) mDA->init(this, true);
 	TParamContr::cntrCmdProc(opt);
 	ctrRemoveNode(opt,"/prm/cfg/ADD_PRMS");
-	ctrMkNode3("fld",opt,-1,"/prm/cfg/TYPE",EVAL_STR,SEC_RD|SEC_WR, "tp","str", "dest","select", "select","/prm/cfg/lsTYPE");
+	ctrMkNode3("fld",opt,-1,"/prm/cfg/TYPE",EVAL_STR,SEC_RD|SEC_WR,
+		   "tp","str", "dest","select", "select","/prm/cfg/lsTYPE");
 	if(mDA) mDA->cntrCmdProc(this, opt);
 	return;
     }
Index: src/moduls/daq/System/os_contr.h
===================================================================
--- src/moduls/daq/System/os_contr.h	(revision 3042)
+++ src/moduls/daq/System/os_contr.h	(working copy)
@@ -55,6 +55,8 @@
 	TMdPrm( string name, TTypeParam *tp_prm );
 	~TMdPrm( );
 
+	bool isSlow( )	{ return mDA->isSlow(); }
+
 	void enable( );
 	void disable( );
 
@@ -113,6 +115,7 @@
 	double period( ){ return mPer; }
 	string cron( )	{ return cfg("SCHEDULE").getS(); }
 	int64_t prior( ){ return mPrior; }
+	int inCycleSlow( ) { return cfg("IN_CYCLE_SLOW").getI(); }
 
 	AutoHD<TMdPrm> at( const string &nm )	{ return TController::at(nm); }
 
Index: src/moduls/ui/Vision/vis_widgs.cpp
===================================================================
--- src/moduls/ui/Vision/vis_widgs.cpp	(revision 3042)
+++ src/moduls/ui/Vision/vis_widgs.cpp	(working copy)
@@ -376,8 +376,11 @@
 
 bool UserStBar::event( QEvent *event )
 {
-    if(event->type() == QEvent::MouseButtonDblClick)	userSel();
-    else if(event->type() == QEvent::PaletteChange) setUser(user());
+    //!!!!: Can change user only at local or direct connection
+    if(event->type() == QEvent::MouseButtonDblClick && VCAStation().find(".") == string::npos)
+	userSel();
+    else if(event->type() == QEvent::PaletteChange)
+	setUser(user());
 
     return QLabel::event(event);
 }
Index: src/tcntrnode.cpp
===================================================================
--- src/tcntrnode.cpp	(revision 3043)
+++ src/tcntrnode.cpp	(working copy)
@@ -544,10 +544,12 @@
 	else brReq.setText(dEl);
 	dstN.at().cntrCmd(&brReq);
 	if(s2i(brReq.attr("rez")))	throw TError(brReq.attr("mcat"), brReq.text());
+	else dEl = idm ? brReq.attr("id") : brReq.text();
     }
 
     //Same copy call
-    dstN.at().chldAt(iB, dEl).at() = srcN.at();
+    if(dstN.at().chldAt(iB,dEl).at().nodePath() != srcN.at().nodePath())
+	dstN.at().chldAt(iB, dEl).at() = srcN.at();
 }
 
 unsigned TCntrNode::grpAdd( const string &iid, bool iordered )
Index: src/tprmtmpl.cpp
===================================================================
--- src/tprmtmpl.cpp	(revision 3042)
+++ src/tprmtmpl.cpp	(working copy)
@@ -385,7 +385,7 @@
 		case 3:	io(row)->setFlg(io(row)->flg()^((io(row)->flg()^s2i(opt->text()))&(IO::Output|IO::Return)));		break;
 		case 4:	io(row)->setFlg(io(row)->flg()^((io(row)->flg()^s2i(opt->text()))&(TPrmTempl::AttrRead|TPrmTempl::AttrFull)));		break;
 		case 5:	io(row)->setFlg(io(row)->flg()^((io(row)->flg()^s2i(opt->text()))&(TPrmTempl::CfgConst|TPrmTempl::CfgLink)));	break;
-		case 6: io(row)->setDef(((io(row)->type()==IO::String && io(row)->flg()&IO::TransltText) ||
+		case 6:	io(row)->setDef(((io(row)->type()==IO::String && io(row)->flg()&IO::TransltText) ||
 					    io(row)->flg()&(TPrmTempl::CfgLink|IO::Selectable)) ? trDSet(io(row)->def(),sTrm(opt->text())) : opt->text());
 		    setStart(false);
 		    break;
@@ -725,7 +725,7 @@
 		// Check the selected param
 		bool is_lnk = func()->io(iIO)->flg()&TPrmTempl::CfgLink;
 		if(is_lnk && TSYS::strLine(func()->io(iIO)->def(),0).size() &&
-		    !s2i(TBDS::genPrmGet(obj->nodePath()+"onlAttr",DEF_onlAttr,opt->attr("user"))))
+		    !s2i(TBDS::genPrmGet(((TParamContr*)obj)->owner().nodePath()+"onlAttr",DEF_onlAttr,opt->attr("user"))))
 		{
 		    string nprm = TSYS::strLine(TSYS::strSepParse(TSYS::strLine(trD(func()->io(iIO)->def()),0),0,'|'), 0);
 
@@ -771,9 +771,9 @@
     a_path = a_path.substr(pref.size());
     if(a_path == "/attr_only") {
 	if(obj->ctrChkNode2(opt,"get",SEC_RD))
-	    opt->setText(TBDS::genPrmGet(obj->nodePath()+"onlAttr",DEF_onlAttr,opt->attr("user")));
+	    opt->setText(TBDS::genPrmGet(((TParamContr*)obj)->owner().nodePath()+"onlAttr",DEF_onlAttr,opt->attr("user")));
 	if(obj->ctrChkNode2(opt,"set",SEC_WR))
-	    TBDS::genPrmSet(obj->nodePath()+"onlAttr",opt->text(),opt->attr("user"));
+	    TBDS::genPrmSet(((TParamContr*)obj)->owner().nodePath()+"onlAttr",opt->text(),opt->attr("user"));
     }
     else if(a_path.find("/prm/pr_") == 0) {
 	if(obj->ctrChkNode2(opt,"get",SEC_RD)) {
Index: src/tsys.h
===================================================================
--- src/tsys.h	(revision 3042)
+++ src/tsys.h	(working copy)
@@ -123,7 +123,8 @@
 
     public:
 	//Data
-	enum Code	{ PathEl, HttpURL, Html, JavaSc, SQL, Custom, base64, FormatPrint, oscdID, Bin, Reverse, ToLower, Limit, ShieldSymb, ShieldBin };
+	enum Code	{ PathEl, HttpURL, Html, JavaSc, SQL, Custom, base64, FormatPrint, oscdID,
+			  Bin, Reverse, ToLower, Limit, ShieldSymb, ShieldBin };
 	enum IntView	{ Dec, Oct, Hex };
 
 	// Task structure
Index: src/ttransports.cpp
===================================================================
--- src/ttransports.cpp	(revision 3042)
+++ src/ttransports.cpp	(working copy)
@@ -599,6 +599,8 @@
     //Connection to the transport
     off = 0;
     string user = TSYS::strLine(iuser, 0, &off), rqUser = TSYS::strLine(iuser, 0, &off), rqPass = TSYS::strLine(iuser, 0, &off);
+    if(node.attr("reforwardHost").size()) user = rqUser = rqPass = "";	//!!!!: Ignore any custom authentication at reforwarding,
+									//      due to that performing in cascade by remote transports
     TTransportS::ExtHost host = extHostGet((user.empty()?"*":user), station);
     bool rqDir = (rqUser.size() && rqUser != host.user) || (rqUser == host.user && rqPass.size());
     node./*setAttr("rqDir", i2s(rqDir))->*/setAttr("rqUser", (rqDir?rqUser:host.user))->setAttr("rqPass", rqDir?rqPass:host.pass);
Index: src/xml.cpp
===================================================================
--- src/xml.cpp	(revision 3042)
+++ src/xml.cpp	(working copy)
@@ -496,13 +496,15 @@
     // Pass spaces
     while(isSpace(ctx.vl[pos])) pos++;
     if(sep) {
-	if(ctx.vl[pos] != sep) throw TError("XMLNode", _("Unfinished attribute. Pos: %d"), bpos);
+	if(ctx.vl[pos] != sep)
+	    throw TError("XMLNode", _("Unfinished attribute '%s'. Pos: %d"), ctx.vl.substr(bpos,pos-bpos).c_str(), bpos);
 	pos++;
     }
     //Get symbol "'" or '"'
     // Pass spaces
     while(isSpace(ctx.vl[pos])) pos++;
-    if(ctx.vl[pos] != '\'' && ctx.vl[pos] != '"') throw TError("XMLNode", _("Unfinished attribute. Pos: %d"), bpos);
+    if(ctx.vl[pos] != '\'' && ctx.vl[pos] != '"')
+	throw TError("XMLNode", _("Unfinished attribute '%s'. Pos: %d"), ctx.vl.substr(bpos,pos-bpos).c_str(), bpos);
     char brc = ctx.vl[pos];
     //Get value
     ctx.aVl.clear();
