diff --git a/include/DoocsHelper.h b/include/DoocsHelper.h
index fa5e1ba548c4b8678f53e0b3d3217a7e95f45f4e..a6c85ac7b626d218a33185c26d399df7885d046b 100644
--- a/include/DoocsHelper.h
+++ b/include/DoocsHelper.h
@@ -17,6 +17,11 @@
 
 #include "eq_fct.h"
 #include "eq_client.h"
+#include <boost/shared_ptr.hpp>
+
+
+
+#include "ConsattApp/LogFileWorker.h"
 
 class DoocsHelper {
 private:
@@ -34,33 +39,15 @@ public:
     void update();
     
 private:
-    D_int _cmd;
+     D_int _cmd;
 
-    
-     D_text _logFileTail;
-     D_int _logFileTailLineNumber;
-     D_int _logFileTailLineNumberAutoUpdate;
-     int _autoupdateCnt;
-     
-     D_int _logFileFilterStart;
-     D_int _logFileFilterEnd;
-    
-     //truncate file size
-     D_int _logFileMaxSizeKb;
-     D_int _logFileCurrentSize;
-     D_float _logFileTruncateFactor; 
-     void trimLogFile();
-     void trimLogFileCore();
-     
-     int fileSize(const std::string file);
-     int fileLinesNo(const std::string file);
-     
-     time_t getTimeFromMarker(const char* theTime, const char* format = "%Y-%m-%dT%H:%M:%S");
-     
-    void loadLogFileTail();    
-    void loadLogFileWithTimeFilter();    
+    D_int _logFileTailAutoUpdate;
+    int _autoupdateCnt;
+   
     
     uint32_t _updateCnt;
+    
+    LogFileWorker _logFileWorker;
 };
 
 #endif /* DOOCSHELPER_H */
diff --git a/include/EqCsaLSynchFmc20.h b/include/EqCsaLSynchFmc20.h
index 19f0392de1084f90a4aa39e37e2b6f5d2ac1c333..0fe9ae8e5711b2f477f2f914c74509851a6de449 100644
--- a/include/EqCsaLSynchFmc20.h
+++ b/include/EqCsaLSynchFmc20.h
@@ -33,7 +33,7 @@ protected: //filds
     //D_zmqstring sig_usr1_name_zmq;
     //D_int _triggerSource;
     
-    DoocsHelper _helper;
+    boost::shared_ptr <DoocsHelper>  _helper;
     
 public:
 
diff --git a/include/EqLinkLockCtrlFMC25RapidXServer.h b/include/EqLinkLockCtrlFMC25RapidXServer.h
index fe3657b76190697a318dc2c8fe64d80c34a054cb..93f35484548f9c5cec11d97e55bc5e6a65e8e373 100644
--- a/include/EqLinkLockCtrlFMC25RapidXServer.h
+++ b/include/EqLinkLockCtrlFMC25RapidXServer.h
@@ -34,7 +34,7 @@ protected: //filds
     //D_zmqstring sig_usr1_name_zmq;
     //D_int _triggerSource;
     
-    DoocsHelper _helper;
+    boost::shared_ptr <DoocsHelper>  _helper;
     
 public:
 
diff --git a/include/EqLinkLockCtrlFMC25VhdlServer.h b/include/EqLinkLockCtrlFMC25VhdlServer.h
index 755b2dd28bce3a2c29f45989110afe17df21000b..33c993a7b4886d838d9135a4035820471f9c43d3 100644
--- a/include/EqLinkLockCtrlFMC25VhdlServer.h
+++ b/include/EqLinkLockCtrlFMC25VhdlServer.h
@@ -34,7 +34,7 @@ protected: //filds
     //D_zmqstring sig_usr1_name_zmq;
     //D_int _triggerSource;
     
-    DoocsHelper _helper;
+    boost::shared_ptr <DoocsHelper>  _helper;
     
 public:
 
diff --git a/include/EqLinkLockServer.h b/include/EqLinkLockServer.h
index 8be55b61ceb37da9808c3a7c88da516249360e6d..c7514600f1f29d900e2eebf2069334deb44ee1a6 100644
--- a/include/EqLinkLockServer.h
+++ b/include/EqLinkLockServer.h
@@ -31,10 +31,7 @@ void sig_usr1_zmq_cb_for_laser_lock_server(void *, EqData *, dmsg_info_t *);
 class EqLinkLockServer : public EqFct {
 protected: //filds
 
-    //ZMQ communication for X2timer
-    //D_zmqstring sig_usr1_name_zmq;
-    //D_int _triggerSource;
-    DoocsHelper _helper;
+    boost::shared_ptr <DoocsHelper>  _helper;
     
 public:
 
diff --git a/include/EqLinkLockStatusServer.h b/include/EqLinkLockStatusServer.h
index e78c8708ca7db586db6390d0315e9eb7a1fbb995..1888c189bd5972c80ebde152c940899ba2219eb5 100644
--- a/include/EqLinkLockStatusServer.h
+++ b/include/EqLinkLockStatusServer.h
@@ -29,10 +29,7 @@ void sig_usr1_zmq_cb_for_link_lock_status_server(void *, EqData *, dmsg_info_t *
 class EqLinkLockStatusServer : public EqFct {
 protected: //filds
 
-    //ZMQ communication for X2timer
-    //D_zmqstring sig_usr1_name_zmq;
-    //D_int _triggerSource;
-    DoocsHelper _helper;
+    boost::shared_ptr <DoocsHelper>  _helper;
     uint32_t _locationType;
     
 public:
diff --git a/src/DoocsHelper.cc b/src/DoocsHelper.cc
index 9219c0d94ca47ced496022e9fd8ab31cfa4665e1..4bc6ca64e3530675738de81031a4822c5980fec2 100644
--- a/src/DoocsHelper.cc
+++ b/src/DoocsHelper.cc
@@ -9,245 +9,71 @@
 #include <chrono>
 #include <thread>
 
+
+
 extern char *__progname;
 
 DoocsHelper::DoocsHelper(EqFct* parent) :
 _parent(parent),
+_logFileWorker(std::string("HELPER.")),
 interruptAddressZmq("ZMQ_SIG_USR1_INT_STRING", parent),
 watchdogAddress("DOOCS_WATCHDOG_ADDRESS", parent),
 x2timerAddress("DOOCS_X2TIMER_ADDRESS", parent),
 mchAddress("DOOCS_MCH_ADDRESS", parent),
 triggerSource("MAIN_LOOP_TRIGGER_SOURCE", parent),
-
-_logFileTail("HELPER.LOG_FILE_TAIL", parent),
-_logFileTailLineNumber("HELPER.LOG_FILE_TAIL_LINES_NO", parent),
-_logFileTailLineNumberAutoUpdate("HELPER.LOG_FILE_TAIL_AUTOUPDATE_ON", parent),
-_logFileFilterStart("HELPER.LOG_FILE_FILT_START_TIME", parent),
-_logFileFilterEnd("HELPER.LOG_FILE_FILT_END_TIME", parent),
-
-_logFileMaxSizeKb("HELPER.LOG_FILE_MAX_SIZE_KB", parent),
-_logFileCurrentSize("HELPER.LOG_FILE_SIZE_KB", parent),
-_logFileTruncateFactor("HELPER.LOG_TRIM_FACTOR", parent),     
-     
-        
+_logFileTailAutoUpdate("HELPER.LOG_FILE_TAIL_AUTOUPDATE_ON", parent),
 _autoupdateCnt(0),
-
-_cmd("HELPER.CMD", parent){
+_cmd("HELPER.CMD", parent) {
+    std::string filePath = std::string(__progname) + ".log";
+   _logFileWorker.init(filePath);
 }
 
-
 void DoocsHelper::update() {
     auto cmd = _cmd.value();
-    _cmd.set_value(0);
-    
+     _cmd.set_value(0);
+
     if (cmd == 1) {
-        loadLogFileTail();
+        _logFileWorker.loadLogFileTail();
         _autoupdateCnt = 0;
     }
 
     if (cmd == 2) {
-        loadLogFileWithTimeFilter();   
+        _logFileWorker.loadLogFileWithTimeFilter();
         _autoupdateCnt = 0;
     }
+
+    if (cmd == 3) {
+        _logFileWorker.trimLogFile();
+    }
     
-    
-    if (_logFileTailLineNumberAutoUpdate.value()) {
+
+    if (_logFileTailAutoUpdate.value()) {
         _autoupdateCnt++;
         if (_autoupdateCnt == 20) {
-            loadLogFileTail();
+            _logFileWorker.loadLogFileTail();
             _autoupdateCnt = 0;
         }
     }
-    
-    if (_updateCnt%50==0) {
-        trimLogFile();
+
+    if ((_updateCnt % 50 == 0)) {
+        _logFileWorker.checkSizeAndTrimLogFile();
     }
-    
+
     _updateCnt++;
 }
 
-int DoocsHelper::fileSize(const std::string file) {
-    //auto time_start = std::chrono::high_resolution_clock::now();
-    std::ifstream logFile;
-    logFile.open(file.c_str(), ios_base::binary);
-    if (logFile.is_open()) {
-        logFile.seekg(0, ios_base::end);
-        int size = logFile.tellg();
-        logFile.close();
-        //std::cout << "DoocsHelper::fileLinesNo::Size measure took[ms]: " << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - time_start).count() << std::endl;
-        return (size / 1024);
-    }
-    return 0;
-}
 
-int DoocsHelper::fileLinesNo(const std::string file) {
-    //auto time_start = std::chrono::high_resolution_clock::now();
-    std::ifstream logFile(file.c_str());
-    std::string line;
-    if (logFile.is_open()) {
-        int i = 0;
-        for (i = 0; std::getline(logFile, line); ++i);
-        logFile.close();
-        //std::cout << "DoocsHelper::fileLinesNo::Line cnt took[ms]: " << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - time_start).count() << std::endl;
-        return i;
-    }
-    return 0;
-}
 
-void DoocsHelper::trimLogFile() {
-    //set default
-    if (_logFileMaxSizeKb.value()==0)
-        _logFileMaxSizeKb.set_value(102400); // 100MB (100*1024kB)
-    if (_logFileTruncateFactor.value()==0)
-        _logFileTruncateFactor.set_value(0.7);
-  
-    //check currnet file size and number of lines
-    std::string logFileName = std::string(__progname) + ".log";
-    _logFileCurrentSize.set_value(fileSize(logFileName));
-
-    //if max size is 0 or lower trimming is OFF
-    if (_logFileMaxSizeKb.value() > 0) {
-        //only file biger that 1024 (1MB) can be trimmed
-        if (_logFileMaxSizeKb.value() < 1024)
-            _logFileMaxSizeKb.set_value(1024);
-
-        if (_logFileTruncateFactor.value() > 0.9)
-            _logFileTruncateFactor.set_value(0.9);
-        else if (_logFileTruncateFactor.value() < 0.1)
-            _logFileTruncateFactor.set_value(0.1);
-
-        if (_logFileCurrentSize.value() > _logFileMaxSizeKb.value()) {
-            std::thread t1(std::thread(&DoocsHelper::trimLogFileCore, this));
-            t1.detach();
-        }
-    }
-}
 
-void DoocsHelper::trimLogFileCore() {
-    auto time_start = std::chrono::high_resolution_clock::now();
-    
 
-    std::string logFileName = std::string(__progname) + ".log";
-    std::string tempFileName(logFileName + std::string(".tmp"));
-    std::fstream logFile(logFileName.c_str(), std::fstream::in);
-    std::fstream logFileTemp(tempFileName.c_str(), std::fstream::out | std::fstream::app);
-        
-    
-    int oldSizeKb = _logFileCurrentSize.value();
-    int oldLinesNo = fileLinesNo(logFileName);
-    std::cout << "DoocsHelper::trimLogFileCore: Current size [kB]: " << _logFileCurrentSize.value() << " Max size [kB]: " << _logFileMaxSizeKb.value() << ", trim factor: " << _logFileTruncateFactor.value() << std::endl;
-
-    int newLinesNo = oldLinesNo * _logFileTruncateFactor.value();
-    int newLinesNoCnt = 0;
-
-    std::string line;
-    if (logFile.is_open() && logFileTemp.is_open()) {
-        for (int i = 0; std::getline(logFile, line); ++i) {
-            if (i > (oldLinesNo - newLinesNo)) {
-                newLinesNoCnt++;
-                logFileTemp << line << std::endl;
-            }
-        }
 
-      
-        //close both files
-        logFile.close();
-        logFileTemp.close();
-        //reopen files in different mode
-        std::fstream logFile(logFileName.c_str(), std::fstream::out | std::fstream::trunc);
-        std::fstream logFileTemp(tempFileName.c_str(), std::fstream::in );
-
-        //rewrite temporary file to log file
-        if (logFile.is_open() && logFileTemp.is_open())
-            while (std::getline(logFileTemp, line))
-                logFile << line << std::endl;
-        //close them again
-        logFile.close();
-        logFileTemp.close();        
-        //remove temp file
-        if (remove(tempFileName.c_str()) != 0)
-            std::cout << "DoocsHelper::trimLogFileCore: Error deleting temporary file: " << tempFileName << std::endl;
-        
-        std::cout << "DoocsHelper::trimLogFileCore: Old log file size[kb]: " << oldSizeKb << " , new file size[kb]: " << fileSize(logFileName) << std::endl;
-        std::cout << "DoocsHelper::trimLogFileCore: Old log file lines: " << oldLinesNo << " , new file lines: " << newLinesNoCnt << std::endl;
-        std::cout << "DoocsHelper::trimLogFileCore: Truncation took[ms]: " << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - time_start).count() << std::endl << std::endl;
 
-    }
-}
 
 
-void DoocsHelper::loadLogFileTail() {
-    auto time_start = std::chrono::high_resolution_clock::now();
-    std::ostringstream ss;
-    if (_logFileTailLineNumber.value() > 4000)
-        _logFileTailLineNumber.set_value(4000);
-    else if (_logFileTailLineNumber.value() < 50)
-        _logFileTailLineNumber.set_value(50);
 
-    
-    ss << _logFileTailLineNumber.value();
-    
-    std::string command = "tail -" + ss.str() + " " + std::string(__progname) + ".log > temp.log.txt";
-    auto result = std::system(command.c_str());
-    if (result == 0) {        
-        //std::cout << "Command is: " << command << ", command result: " << result << std::endl;             
-        ss.str("");
-        ss << std::ifstream("temp.log.txt").rdbuf();
-        _logFileTail.set_value(ss.str());      
-        std::system("rm -f ./temp.log.txt");
-    } else {
-        std::cout << "Command: " << command << " failed, command result: " << result << std::endl;
-    }
-    
-    auto readTimeMs = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - time_start).count();
-    if (readTimeMs > 20)
-        std::cout << "DoocsHelper::loadLogFileTail: Warning. Loading " << _logFileTailLineNumber.value() << " lines took[ms]: " << readTimeMs << std::endl;
-    
-}
 
-void DoocsHelper::loadLogFileWithTimeFilter() {
-    std::ifstream file;
-    std::string filePath = std::string(__progname) + ".log";
-    file.open(filePath.c_str(), std::ios::in);
-
-    if (file.is_open()) {
-        time_t startTime = _logFileFilterStart.value();
-        time_t stopTime  = _logFileFilterEnd.value();
-        
-        std::string currentLine("");
-        std::string logNewText("");
-        int matchedLineCnt = 0;
-        int maxLines = _logFileTailLineNumber.value();
-        if (maxLines == 0 || maxLines > 5000) {
-            maxLines = 5000;
-        }
-        int lineCnt = 0;
-        int lineCnt1 = 0;
-        std::cout << "startTime: " << startTime << " , endTime: " << stopTime << std::endl;
-        
-        while (matchedLineCnt < _logFileTailLineNumber.value() && std::getline(file, currentLine)) {
-            if (currentLine.length() > 20) {
-                time_t currentMarkerTime = getTimeFromMarker(currentLine.substr(0, 19).c_str());
-                if (currentMarkerTime >= startTime && currentMarkerTime <= stopTime) {
-                    logNewText += (currentLine + "\n");
-                    matchedLineCnt++;
-                }
-                lineCnt1++;
-            }
-            lineCnt++;
-        }
-        _logFileTail.set_value(logNewText);      
-        file.close();
-        
-        
-        std::cout << "Logfile line cnt: " << lineCnt << " ,  longer than 20 chars: " << lineCnt1 << " , matched lines" << matchedLineCnt <<"\n";
-    }
 
-}
 
-time_t DoocsHelper::getTimeFromMarker(const char* theTime, const char* format) {
-      std::tm tmTime;
-      memset(&tmTime, 0, sizeof(tmTime));
-      strptime(theTime, format, &tmTime);
-      return mktime(&tmTime);
-}
\ No newline at end of file
+
+
+
diff --git a/src/EqCsaLSynchFmc20.cc b/src/EqCsaLSynchFmc20.cc
index 8a20f2db589d9be5ebcbaa7eabf34418a43202b0..e0ba18bd17263c3211438c1329489f23696ce397 100644
--- a/src/EqCsaLSynchFmc20.cc
+++ b/src/EqCsaLSynchFmc20.cc
@@ -8,15 +8,12 @@ int EqCsaLSynchFmc20::fct_code() {
 
 
 EqCsaLSynchFmc20::EqCsaLSynchFmc20() :
-EqFct("NAME = location"),
-_helper(this)
-//sig_usr1_name_zmq("ZMQ_SIG_USR1_INT_STRING", this),
-//_triggerSource("MAIN_LOOP_TRIGGER_SOURCE", this) 
-{
+EqFct("NAME = location") {
     printftostderr("EqCsaLSynchFmc20::EqCsaLSynchFmc20()", "Location: %s, Start of DOOCS server constructor.", EqFct::name().c_str());
     Doocs_CsaAdapter::getInstance().setParent(this);
     appManager = Doocs_CsaAdapter::getInstance().createApplicationManager( new CsaLSynchFmc20(std::string(EqFct::name())) ); 
     appManager->create();
+    _helper.reset(new DoocsHelper(this));
     printftostderr("EqCsaLSynchFmc20::EqCsaLSynchFmc20()", "Location: %s, End of DOOCS server constructor.", EqFct::name().c_str());
 }
 
@@ -28,10 +25,10 @@ void EqCsaLSynchFmc20::init() {
 }
 
 void EqCsaLSynchFmc20::update() {
-    if (_helper.triggerSource.value() != 0) {        
+    if (_helper->triggerSource.value() != 0) {        
         Doocs_CsaAdapter::getInstance().setCurrentTimeStampStructure();
         appManager->execute();
-        _helper.update();
+        _helper->update();
     }
     g_sts_.error(0);
 
@@ -41,10 +38,10 @@ void EqCsaLSynchFmc20::update() {
 }
 
 void EqCsaLSynchFmc20::interrupt_usr1_core(dmsg_info_t *msginfo) {
-    if (_helper.triggerSource.value() == 0) {
+    if (_helper->triggerSource.value() == 0) {
         Doocs_CsaAdapter::getInstance().setCurrentTimeStampStructure(msginfo);
         appManager->execute();
-        _helper.update();
+        _helper->update();
     }
 }
 
@@ -74,7 +71,7 @@ void sig_usr1_zmq_cb_for_lbsynch_fmc20_server(void *pp, EqData *dp, dmsg_info_t
 void EqCsaLSynchFmc20::post_init(void) {
     printftostderr("EqCsaLSynchFmc20::post_init()", "Location: %s.", name_.value());
     printftostderr("EqCsaLSynchFmc20::post_init()", "Location: %s, Attach to ZMQ system for x2timer.", name_.value());
-    _helper.interruptAddressZmq.attach(sig_usr1_zmq_cb_for_lbsynch_fmc20_server);
+    _helper->interruptAddressZmq.attach(sig_usr1_zmq_cb_for_lbsynch_fmc20_server);
     
     std::ostringstream doocsParrentUniqueId;
     doocsParrentUniqueId << this;
diff --git a/src/EqLinkLockCtrlFMC25RapidXServer.cc b/src/EqLinkLockCtrlFMC25RapidXServer.cc
index 2bd4ff1a152afbf923cfbb7f02da1c3e6bff5860..1339e0273753a32a876aefa394d10d7e4dc2fafc 100644
--- a/src/EqLinkLockCtrlFMC25RapidXServer.cc
+++ b/src/EqLinkLockCtrlFMC25RapidXServer.cc
@@ -8,15 +8,12 @@ int EqLinkLockCtrlFMC25RapidXServer::fct_code() {
 
 
 EqLinkLockCtrlFMC25RapidXServer::EqLinkLockCtrlFMC25RapidXServer() :
-EqFct("NAME = location"),
-_helper(this)
-//sig_usr1_name_zmq("ZMQ_SIG_USR1_INT_STRING", this),
-//_triggerSource("MAIN_LOOP_TRIGGER_SOURCE", this)
-{
+EqFct("NAME = location") {
     printftostderr("EqLinkLockCtrlFMC25RapidXServer::EqLinkLockCtrlFMC25RapidXServer()", "Location: %s, Start of DOOCS server constructor.", EqFct::name().c_str());
     Doocs_CsaAdapter::getInstance().setParent(this);
     appManager = Doocs_CsaAdapter::getInstance().createApplicationManager( new CsaLinkLockCtrlFMC25RapidX(std::string(EqFct::name())) ); 
     appManager->create();
+    _helper.reset(new DoocsHelper(this));
    printftostderr("EqLinkLockCtrlFMC25RapidXServer::EqLinkLockCtrlFMC25RapidXServer()", "Location: %s, End of DOOCS server constructor.", EqFct::name().c_str());
 }
 
@@ -31,10 +28,10 @@ void EqLinkLockCtrlFMC25RapidXServer::update() {
     //std::cout << "EqLinkLockCtrlFMC25RapidXServer::update(): Return from update" << std::endl;
     //return;
     
-    if (_helper.triggerSource.value() != 0) {        
+    if (_helper->triggerSource.value() != 0) {        
         Doocs_CsaAdapter::getInstance().setCurrentTimeStampStructure();
         appManager->execute();
-        _helper.update();
+        _helper->update();
     }
     
     
@@ -49,10 +46,10 @@ void EqLinkLockCtrlFMC25RapidXServer::interrupt_usr1_core(dmsg_info_t *msginfo)
     //std::cout << "EqLinkLockCtrlFMC25RapidXServer::interrupt_usr1_core(): Return from interupt" << std::endl;
     //return;
     
-    if (_helper.triggerSource.value() == 0) {
+    if (_helper->triggerSource.value() == 0) {
         Doocs_CsaAdapter::getInstance().setCurrentTimeStampStructure(msginfo);
         appManager->execute();
-        _helper.update();
+        _helper->update();
     }
 }
 
@@ -82,7 +79,7 @@ void EqLinkLockCtrlFMC25RapidXServer::post_init(void) {
     printftostderr("EqLinkLockCtrlFMC25RapidXServer::post_init()", "Location: %s.", name_.value());    
     printftostderr("EqLinkLockCtrlFMC25RapidXServer::post_init()", "Location: %s, Attach to ZMQ system for x2timer.", name_.value());
     //sig_usr1_name_zmq.attach(sig_usr1_zmq_cb_for_link_lock_ctrl_rapidx_fmc25_server);
-    _helper.interruptAddressZmq.attach(sig_usr1_zmq_cb_for_link_lock_ctrl_rapidx_fmc25_server);
+    _helper->interruptAddressZmq.attach(sig_usr1_zmq_cb_for_link_lock_ctrl_rapidx_fmc25_server);
     
     std::ostringstream doocsParrentUniqueId;
     doocsParrentUniqueId << this;
diff --git a/src/EqLinkLockCtrlFMC25VhdlServer.cc b/src/EqLinkLockCtrlFMC25VhdlServer.cc
index 9c869117342020282e97cdff44f023ed1e5fc7b5..41f0addab6797980ca67731aa399eed289444177 100644
--- a/src/EqLinkLockCtrlFMC25VhdlServer.cc
+++ b/src/EqLinkLockCtrlFMC25VhdlServer.cc
@@ -8,15 +8,12 @@ int EqLinkLockCtrlFMC25VhdlServer::fct_code() {
 }
 
 EqLinkLockCtrlFMC25VhdlServer::EqLinkLockCtrlFMC25VhdlServer() :
-EqFct("NAME = location"),
-_helper(this)
-//sig_usr1_name_zmq("ZMQ_SIG_USR1_INT_STRING", this),
-//_triggerSource("MAIN_LOOP_TRIGGER_SOURCE", this)
-{
+EqFct("NAME = location") {
     printftostderr("EqLinkLockCtrlFMC25VhdlServer::EqLinkLockCtrlFMC25VhdlServer()", "Location: %s, Start of DOOCS server constructor.", EqFct::name().c_str());
     Doocs_CsaAdapter::getInstance().setParent(this);
     appManager = Doocs_CsaAdapter::getInstance().createApplicationManager(new CsaLinkLockCtrlFMC25Vhdl(std::string(EqFct::name())));
     appManager->create();
+    _helper.reset(new DoocsHelper(this));
     printftostderr("EqLinkLockCtrlFMC25VhdlServer::EqLinkLockCtrlFMC25VhdlServer()", "Location: %s, End of DOOCS server constructor.", EqFct::name().c_str());
 }
 
@@ -31,10 +28,10 @@ void EqLinkLockCtrlFMC25VhdlServer::update() {
     //std::cout << "EqLinkLockCtrlFMC25VhdlServer::update(): Return from update" << std::endl;
     //return;
     
-    if (_helper.triggerSource.value() != 0) {        
+    if (_helper->triggerSource.value() != 0) {        
         Doocs_CsaAdapter::getInstance().setCurrentTimeStampStructure();
         appManager->execute();
-        _helper.update();
+        _helper->update();
     }
     
     
@@ -49,10 +46,10 @@ void EqLinkLockCtrlFMC25VhdlServer::interrupt_usr1_core(dmsg_info_t *msginfo) {
     //std::cout << "EqLinkLockCtrlFMC25VhdlServer::interrupt_usr1_core(): Return from interupt" << std::endl;
     //return;
     
-    if (_helper.triggerSource.value() == 0) {
+    if (_helper->triggerSource.value() == 0) {
         Doocs_CsaAdapter::getInstance().setCurrentTimeStampStructure(msginfo);
         appManager->execute();
-        _helper.update();
+        _helper->update();
     }
 }
 
@@ -82,7 +79,7 @@ void EqLinkLockCtrlFMC25VhdlServer::post_init(void) {
     printftostderr("EqLinkLockCtrlFMC25VhdlServer::post_init()", "Location: %s.", name_.value());    
     printftostderr("EqLinkLockCtrlFMC25VhdlServer::post_init()", "Location: %s, Attach to ZMQ system for x2timer.", name_.value());
     //sig_usr1_name_zmq.attach(sig_usr1_zmq_cb_for_link_lock_ctrl_rapidx_fmc25_server);
-    _helper.interruptAddressZmq.attach(sig_usr1_zmq_cb_for_link_lock_ctrl_vhdl_fmc25_server);
+    _helper->interruptAddressZmq.attach(sig_usr1_zmq_cb_for_link_lock_ctrl_vhdl_fmc25_server);
     
     std::ostringstream doocsParrentUniqueId;
     doocsParrentUniqueId << this;
diff --git a/src/EqLinkLockServer.cc b/src/EqLinkLockServer.cc
index 34464627794fbd78ea6e07c0cf507db0b4073a64..da82807801588baac2e1015354d084057eb035a6 100644
--- a/src/EqLinkLockServer.cc
+++ b/src/EqLinkLockServer.cc
@@ -7,15 +7,13 @@ int EqLinkLockServer::fct_code() {
 }
 
 EqLinkLockServer::EqLinkLockServer() :
-EqFct("NAME = location"),
-_helper(this)
-//sig_usr1_name_zmq("ZMQ_SIG_USR1_INT_STRING", this),
-//_triggerSource("MAIN_LOOP_TRIGGER_SOURCE", this) 
+EqFct("NAME = location")
 {
     printftostderr("EqLinkLockServer::EqLinkLockServer()", "Location: %s, Start of DOOCS server constructor.", EqFct::name().c_str());
     Doocs_CsaAdapter::getInstance().setParent(this);
     appManager = Doocs_CsaAdapter::getInstance().createApplicationManager(new CsaLinkLock(std::string(EqFct::name())));
     appManager->create();
+    _helper.reset(new DoocsHelper(this));
     printftostderr("EqLinkLockServer::EqLinkLockServer()", "Location: %s, End of DOOCS server constructor.", EqFct::name().c_str());
 }
 
@@ -30,10 +28,10 @@ void EqLinkLockServer::update() {
     //std::cout << "EqLinkLockServer::update(): Return from update" << std::endl;
     //return;
     
-    if (_helper.triggerSource.value() != 0) {        
+    if (_helper->triggerSource.value() != 0) {        
         Doocs_CsaAdapter::getInstance().setCurrentTimeStampStructure();
         appManager->execute();
-        _helper.update();
+        _helper->update();
     }
     
     
@@ -48,10 +46,10 @@ void EqLinkLockServer::interrupt_usr1_core(dmsg_info_t *msginfo) {
     //std::cout << "EqLinkLockServer::interrupt_usr1_core(): Return from interupt" << std::endl;
     //return;
     
-    if (_helper.triggerSource.value() == 0) {
+    if (_helper->triggerSource.value() == 0) {
         Doocs_CsaAdapter::getInstance().setCurrentTimeStampStructure(msginfo);
         appManager->execute();
-        _helper.update();
+        _helper->update();
     }
 }
 
@@ -80,7 +78,7 @@ void sig_usr1_zmq_cb_for_link_lock_server(void *pp, EqData *dp, dmsg_info_t *ip)
 void EqLinkLockServer::post_init(void) {
     printftostderr("EqLinkLockServer::post_init()", "Location: %s.", name_.value());    
     printftostderr("EqLinkLockServer::post_init()", "Location: %s, Attach to ZMQ system for x2timer.", name_.value());
-    _helper.interruptAddressZmq.attach(sig_usr1_zmq_cb_for_link_lock_server);
+    _helper->interruptAddressZmq.attach(sig_usr1_zmq_cb_for_link_lock_server);
     
     std::ostringstream doocsParrentUniqueId;
     doocsParrentUniqueId << this;
diff --git a/src/EqLinkLockStatusServer.cc b/src/EqLinkLockStatusServer.cc
index 4abd2031b2eb6bfda9582b442c496f428250dffe..4f08b704abffed4b9c347ff7ff9ab9df139f967a 100644
--- a/src/EqLinkLockStatusServer.cc
+++ b/src/EqLinkLockStatusServer.cc
@@ -7,13 +7,13 @@ int EqLinkLockStatusServer::fct_code() {
 }
 
 EqLinkLockStatusServer::EqLinkLockStatusServer() :
-EqFct("NAME = location"),
-_helper(this)
+EqFct("NAME = location")
 {
     printftostderr("EqLinkLockStatusServer::EqLinkLockStatusServer()", "Location: %s, Start of DOOCS server constructor.", EqFct::name().c_str());
     Doocs_CsaAdapter::getInstance().setParent(this);
     appManager = Doocs_CsaAdapter::getInstance().createApplicationManager(new CsaLinkLockStatusValidator(std::string(EqFct::name())));
     appManager->create();
+    _helper.reset(new DoocsHelper(this));
     printftostderr("EqLinkLockStatusServer::EqLinkLockStatusServer()", "Location: %s, End of DOOCS server constructor.", EqFct::name().c_str());
 }
 
@@ -28,10 +28,10 @@ void EqLinkLockStatusServer::update() {
     //std::cout << "EqLinkLockStatusServer::update(): Return from update" << std::endl;
     //return;
     
-    if (_helper.triggerSource.value() != 0) {        
+    if (_helper->triggerSource.value() != 0) {        
         Doocs_CsaAdapter::getInstance().setCurrentTimeStampStructure();
         appManager->execute();
-        _helper.update();
+        _helper->update();
     }
     
     
@@ -46,10 +46,10 @@ void EqLinkLockStatusServer::interrupt_usr1_core(dmsg_info_t *msginfo) {
     //std::cout << "EqLinkLockStatusServer::interrupt_usr1_core(): Return from interupt" << std::endl;
     //return;
     
-    if (_helper.triggerSource.value() == 0) {
+    if (_helper->triggerSource.value() == 0) {
         Doocs_CsaAdapter::getInstance().setCurrentTimeStampStructure(msginfo);
         appManager->execute();
-        _helper.update();
+        _helper->update();
     }
 }
 
@@ -78,7 +78,7 @@ void sig_usr1_zmq_cb_for_link_lock_status_server(void *pp, EqData *dp, dmsg_info
 void EqLinkLockStatusServer::post_init(void) {
     printftostderr("EqLinkLockStatusServer::post_init()", "Location: %s.", name_.value());    
     printftostderr("EqLinkLockStatusServer::post_init()", "Location: %s, Attach to ZMQ system for x2timer.", name_.value());
-    _helper.interruptAddressZmq.attach(sig_usr1_zmq_cb_for_link_lock_status_server);
+    _helper->interruptAddressZmq.attach(sig_usr1_zmq_cb_for_link_lock_status_server);
     
     std::ostringstream doocsParrentUniqueId;
     doocsParrentUniqueId << this;