diff --git a/Patronum/src/IPController.cpp b/Patronum/src/IPController.cpp
index 7017084..75ea730 100644
--- a/Patronum/src/IPController.cpp
+++ b/Patronum/src/IPController.cpp
@@ -9,17 +9,24 @@
 
 QString Patronum::IController::errorToString(Patronum::ControllerError error) const {
     switch (error) {
-    case Patronum::ControllerError::ServiceUnavailable: return "Service is unavailable. Try send start comand or restart the service manually.";
+    case Patronum::ControllerError::ServiceUnavailable:
+        return QObject::tr("Service is unavailable. Try send start comand or restart the service manually.");
 
-    case Patronum::ControllerError::InvalidPackage: return "Invalid package received";
+    case Patronum::ControllerError::InvalidPackage:
+        return QObject::tr("Invalid package received");
 
-    case Patronum::ControllerError::WrongCommand: return "Library unsupported command received";
+    case Patronum::ControllerError::WrongCommand:
+        return QObject::tr("Library unsupported command received");
 
-    case Patronum::ControllerError::SystemError: return "Internal error of the work of the Patronum library."
-                                                        " Contact the developers and provide them with an error report."
-                                                        " https://github.com/QuasarApp/Patronum/issues";
+    case Patronum::ControllerError::SystemError:
+        return QObject::tr("Internal error of the work of the Patronum library."
+                           " Contact the developers and provide them with an error report."
+                           " https://github.com/QuasarApp/Patronum/issues");
+
+    case Patronum::ControllerError::TimeOutError:
+        return QObject::tr("Timeout error. service unavailable or not started.");
 
     default:
-        return "Unknown error";
+        return QObject::tr("Unknown error");
     }
 }
diff --git a/Patronum/src/IPController.h b/Patronum/src/IPController.h
index 98f8454..fe86bed 100644
--- a/Patronum/src/IPController.h
+++ b/Patronum/src/IPController.h
@@ -28,12 +28,16 @@ enum class ControllerError {
     InvalidPackage,
     /// Library unsupported command received.
     WrongCommand,
+    /// Timeout error. service unavailable or not started.
+    TimeOutError,
     /// Internal error of the work of the Patronum library. Contact the developers and provide them with an error report. https://github.com/QuasarApp/Patronum/issues
     SystemError
+
 };
 
 /**
- * @brief The IController class
+ * @brief The IController class This is base interface for the handling network events.
+ *
  */
 class PATRONUM_LIBRARYSHARED_EXPORT IController
 {
@@ -43,14 +47,36 @@ public:
 
     /**
      * @brief errorToString This method convert the ControllerError to QString.
-     * @param error - Error id.
+     * @param error This is error id.
      * @return return text of error.
      */
     QString errorToString(ControllerError error) const;
 
+    /**
+     * @brief handleFeatures This method should be handle all Command::Features resuests.
+     *  This method will invoked when controller receive commands list for execute (features) from controller or terminal.
+     * @param features This is list of the requests (@a features)
+     */
     virtual void handleFeatures(const QList<Feature>& features) = 0;
-    virtual void handleResponce(const QVariantMap& feature) = 0;
-    virtual void handleError(ControllerError) = 0;
+
+    /**
+     * @brief handleResponce This method should be handle all responces of the service.
+     *  This method will invoked when controller receive responce from service.
+     * @param responce This is responce message.
+     */
+    virtual void handleResponce(const QVariantMap& responce) = 0;
+
+    /**
+     * @brief handleError This method shold be handle all error messages.
+     * This method will invoked when a controlee receive a error responce from a service.
+     * @param errorCode This is code of a error.
+     */
+    virtual void handleError(ControllerError errorCode) = 0;
+
+    /**
+     * @brief finished This method ivoked when controler received Command::CloseConnection from the server.
+     */
+    virtual void finished() = 0;
 
 };
 }
diff --git a/Patronum/src/IPService.h b/Patronum/src/IPService.h
index f56f420..511a7ed 100644
--- a/Patronum/src/IPService.h
+++ b/Patronum/src/IPService.h
@@ -26,14 +26,14 @@ public:
 
     /**
      * @brief handleReceiveData This method get all received commnads and process its.
-     * For each command will invoke the handleReceive method.
-     * @param data
+     *  For each command will invoke the IService::handleReceive method.
+     * @param data This is array of the incomming requests (commands)
      */
     virtual void handleReceiveData(const QSet<Feature>& data) = 0;
 
     /**
      * @brief handleReceive This method invoked when service receive a request from terminal.
-     *  Override this method for work service.
+     *  Override this method for work your service.
      * @param data This is input data.
      * @return This method should be return true if the @a data command is supported and processed successful.
      * IF you return false then a negative message will be sent to a terminal app.
@@ -41,7 +41,8 @@ public:
     virtual bool handleReceive(const Feature &data) = 0;
 
     /**
-     * @brief supportedFeatures Override this method for add your features for the service.
+     * @brief supportedFeatures This method should be return the list of the supported fetures.
+     *  Override this method for add your features for the service.
      * @return should be return a set of supported features.
      */
     virtual QSet<Feature> supportedFeatures() = 0;
diff --git a/Patronum/src/PController.cpp b/Patronum/src/PController.cpp
index 001bfdd..68ec8db 100644
--- a/Patronum/src/PController.cpp
+++ b/Patronum/src/PController.cpp
@@ -12,6 +12,7 @@
 #include <QVariantMap>
 #include <quasarapp.h>
 #include <QCoreApplication>
+#include <QTimer>
 
 namespace Patronum {
 
@@ -33,15 +34,11 @@ bool Controller::send(int argc, char **argv) {
 
 bool Controller::send() {
 
-    if (QuasarAppUtils::Params::isEndable("start")) {
-        return !d_ptr->start();
-    }
-
-    if (QuasarAppUtils::Params::isEndable("install")) {
+    if (QuasarAppUtils::Params::isEndable("install") || QuasarAppUtils::Params::isEndable("i")) {
         return d_ptr->install();
     }
 
-    if (QuasarAppUtils::Params::isEndable("uninstall")) {
+    if (QuasarAppUtils::Params::isEndable("uninstall") || QuasarAppUtils::Params::isEndable("u")) {
         return d_ptr->uninstall();
     }
 
@@ -86,16 +83,43 @@ bool Controller::send() {
         sendData.insert(Feature{val.key(), val.value()});
     }
 
-    return d_ptr->sendCmd(sendData);
+
+    if (!d_ptr->sendCmd(sendData)) {
+        return false;
+    }
+
+    QTimer::singleShot(1000, nullptr, [this]() {
+        QuasarAppUtils::Params::log(errorToString(ControllerError::TimeOutError), QuasarAppUtils::Error);
+        QCoreApplication::exit(static_cast<int>(ControllerError::TimeOutError));
+    });
+
+    return true;
 }
 
 int Controller::startDetached() const {
     return d_ptr->start();
 }
 
-bool Controller::waitForResponce(int msec) {
+QuasarAppUtils::Help::Section Controller::help() const {
+    QuasarAppUtils::Help::Section help {
+        {QObject::tr("Options that available after start"), {
+                {"stop",            QObject::tr("Stop a service")},
+                {"pause",           QObject::tr("Pause a service")},
+                {"resume",          QObject::tr("Resume a service")},
+                {"uninstall / u",   QObject::tr("Uninstall a service")}
 
-    return d_ptr->waitForResponce(msec);
+            }
+        },
+        {QObject::tr("Options that available after instalation"),
+            {
+                {"uninstall / u",   QObject::tr("Uninstall a service")},
+                {"start / s",       QObject::tr("Start a service as a daemon")},
+
+            }
+        }
+    };
+
+    return help;
 }
 
 void Controller::handleError(ControllerError error) {
@@ -125,7 +149,6 @@ void Controller::handleFeatures(const QList<Feature> &features) {
     }
 
     QuasarAppUtils::Help::print(options);
-    QCoreApplication::exit(0);
 }
 
 void Controller::handleResponce(const QVariantMap &responce) {
@@ -136,6 +159,9 @@ void Controller::handleResponce(const QVariantMap &responce) {
     }
 
     QuasarAppUtils::Help::print(options);
+}
+
+void Controller::finished() {
     QCoreApplication::exit(0);
 }
 
@@ -146,17 +172,7 @@ QList<Feature> Controller::features() {
 void Controller::printDefaultHelp() const {
 
     auto quasarappHelp = QuasarAppUtils::Params::getParamsHelp();
-
-    QuasarAppUtils::Help::Charters help{{"General options of this controller",{
-                {"start",       QObject::tr("Start a service")},
-                {"stop",        QObject::tr("Stop a service")},
-                {"pause",       QObject::tr("Pause a service")},
-                {"resume",      QObject::tr("Resume a service")},
-                {"install",     QObject::tr("Install a service")},
-                {"uninstall",   QObject::tr("Uninstall a service")}
-            }}};
-
-    QuasarAppUtils::Help::print(quasarappHelp.unite(help));
+    QuasarAppUtils::Help::print(quasarappHelp.unite(help()));
 }
 
 }
diff --git a/Patronum/src/PController.h b/Patronum/src/PController.h
index 12ff38f..e3bbe5e 100644
--- a/Patronum/src/PController.h
+++ b/Patronum/src/PController.h
@@ -10,6 +10,7 @@
 #include "Patronum_global.h"
 #include <IPController.h>
 #include "PFeature.h"
+#include <quasarapp.h>
 
 namespace Patronum {
 
@@ -29,21 +30,23 @@ public:
     /**
      * @brief Controller - Base constructor.
      * @param name - Name of you service.
-     * @param servicePath - Path to service executable. @note If servicePath argument well be empty then 'start' commnad not working
+     * @param servicePath - Path to service executable.
+     * @note If servicePath argument will set to empty then 'start' and install commands will not working
      */
     Controller(const QString& name, const QString& servicePath = "");
     ~Controller() override;
 
     /**
-     * @brief send - This method send request to service.
-     * @param argc - Count of arguments.
-     * @param argv - Arguments list.
+     * @brief send This method send request to service.
+     * @param argc This is count of arguments.
+     * @param argv This is arguments list.
      * @return true if all sendet successful.
      */
     bool send(int argc, char **argv);
 
     /**
-     * @brief send - This method send request to service. @warning Invoke this method if you invoked QuasarAppUtils::Params::parse() before invoke this method else use send(int argc, char **argv).
+     * @brief send - This method send request to service.
+     * @warning Invoke this method if you invoked QuasarAppUtils::Params::parse() before invoke this method else use send(int argc, char **argv).
      * @return true if all sendet successful.
      */
     bool send();
@@ -55,11 +58,10 @@ public:
     int startDetached() const;
 
     /**
-     * @brief waitForResponce - Wait for get a responce from servece.
-     * @param msec Timeout in msec.
-     * @return true if all seccussful.
+     * @brief help This method return help of the Controller.
+     * @return Available otions list.
      */
-    bool waitForResponce(int msec = 10000);
+    QuasarAppUtils::Help::Section help() const;
 
     // IControler interface
 protected:
@@ -85,6 +87,13 @@ protected:
      */
     void handleResponce(const QVariantMap &responce) override;
 
+    /**
+     * @brief finished This method invoked when controler receive from service the Command::CloseConnection command
+     * This implementation invoke he exit method of the QCoreApplication and finished application.
+     *  If do not want to stop application after receive Command::CloseConnection then override this method.
+     */
+    void finished() override;
+
     /**
      * @brief features - This method return current features of connected service.
      * @note If Respond from service not received then return empty list.
@@ -97,8 +106,6 @@ private:
     ControllerPrivate *d_ptr = nullptr;
 
     void printDefaultHelp() const;
-
-
 };
 }
 #endif // CONTROLLER_H
diff --git a/Patronum/src/PServiceBase.cpp b/Patronum/src/PServiceBase.cpp
index 73b21a9..5fbf897 100644
--- a/Patronum/src/PServiceBase.cpp
+++ b/Patronum/src/PServiceBase.cpp
@@ -94,23 +94,52 @@ Controller *ServiceBase::controller() {
         return _controller;
 
     _controller = new Controller(_serviceName,
-                               QuasarAppUtils::Params::getCurrentExecutable());
+                                 QuasarAppUtils::Params::getCurrentExecutable());
 
     return _controller;
 }
 
+void ServiceBase::printDefaultHelp() {
+    auto serviceHelp = controller()->help();
+    serviceHelp.unite(QuasarAppUtils::Params::getParamsHelp());
+
+    serviceHelp.unite({{QObject::tr("Options that available befor install"),{
+                            {"start / s",       QObject::tr("Start a service in console")},
+                            {"daemon / d",      QObject::tr("Start a service as a daemon")},
+                            {"install / i",     QObject::tr("Install a service")},
+                        }}});
+
+    const auto features = supportedFeatures();
+    QuasarAppUtils::Help::Options optionsList;
+    for (const auto& cmd : features) {
+        optionsList.insert(cmd.cmd(), cmd.description());
+    }
+
+    serviceHelp.unite({{"Available commands of the service:", optionsList}});
+
+    QuasarAppUtils::Help::print(serviceHelp);
+
+}
+
 int ServiceBase::exec() {
     if (!_core) {
         createApplication();
     }
 
-    bool fExec = QuasarAppUtils::Params::isEndable("exec") || QuasarAppUtils::Params::isDebugBuild();
-
-    if (!(QuasarAppUtils::Params::size() || fExec)) {
-        return controller()->startDetached();
+    if (!QuasarAppUtils::Params::size()) {
+        printDefaultHelp();
+        return 0;
     }
 
-    if (fExec) {
+    bool fStart = QuasarAppUtils::Params::isEndable("start") || QuasarAppUtils::Params::isEndable("s");
+    bool fDaemon = QuasarAppUtils::Params::isEndable("daemon") || QuasarAppUtils::Params::isEndable("d");
+
+    if (fStart || fDaemon) {
+
+        if (fDaemon) {
+            return controller()->startDetached();
+        }
+
         QTimer::singleShot(0, nullptr, [this](){
             onStart();
             d_ptr->listen();
diff --git a/Patronum/src/PServiceBase.h b/Patronum/src/PServiceBase.h
index 3218f3b..300aa19 100644
--- a/Patronum/src/PServiceBase.h
+++ b/Patronum/src/PServiceBase.h
@@ -35,7 +35,7 @@ public:
     // IService interface
 
     /**
-     * @brief exec
+     * @brief exec This is main method of the service. Use this like a QCoreApplication::exec.
      * @return Result of work application.
      */
     virtual int exec();
@@ -108,6 +108,7 @@ protected:
     QCoreApplication *_core = nullptr;
 private:
 
+    void printDefaultHelp();
 
     ServicePrivate *d_ptr = nullptr;
     Controller *_controller = nullptr;
diff --git a/Patronum/src/Private/SystemD/service.service b/Patronum/src/Private/SystemD/service.service
index 2c49e3b..c194408 100644
--- a/Patronum/src/Private/SystemD/service.service
+++ b/Patronum/src/Private/SystemD/service.service
@@ -5,7 +5,7 @@ Description=Automatet generated service of %0
 Type=forking
 User=root
 Group=root
-ExecStart=%0
+ExecStart=%0 start
 ExecStop=%0 stop
 
 [Install]
diff --git a/Patronum/src/Private/baseinstaller.cpp b/Patronum/src/Private/baseinstaller.cpp
index 412d1b6..bbe0795 100644
--- a/Patronum/src/Private/baseinstaller.cpp
+++ b/Patronum/src/Private/baseinstaller.cpp
@@ -6,33 +6,42 @@
 */
 
 #include "baseinstaller.h"
+#include <QFile>
 #include <QSettings>
 #include <quasarapp.h>
 
 namespace Patronum {
 
 BaseInstaller::BaseInstaller(const QString &name):
-    Installer(name)
-{
+    Installer(name) {
 
 }
 
 bool BaseInstaller::install(const QString &executable) {
+    if (!QFile::exists(executable)) {
+        QuasarAppUtils::Params::log(QObject::tr("The service executable file is not exists %0\n").arg(executable),
+                                    QuasarAppUtils::Error);
+        return false;
+    }
+
     _executable = executable;
 
     if (isInstalled()) {
-        QuasarAppUtils::Params::log(QString("the service %0 alredy installed \n").
+        QuasarAppUtils::Params::log(QObject::tr("the service %0 alredy installed \n").
                                     arg(serviceName()),
                                     QuasarAppUtils::Info);
         return true;
     }
 
-    return false;
+    savePath();
+
+
+    return true;
 }
 
 bool BaseInstaller::uninstall() {
     if (!isInstalled()) {
-        QuasarAppUtils::Params::log(QString("the service %0 alredy uninstalled \n").
+        QuasarAppUtils::Params::log(QObject::tr("the service %0 alredy uninstalled \n").
                                     arg(serviceName()),
                                     QuasarAppUtils::Info);
         return true;
@@ -43,7 +52,7 @@ bool BaseInstaller::uninstall() {
 
 bool BaseInstaller::enable() {
     if (!isInstalled()) {
-        QuasarAppUtils::Params::log(QString("Cannot enabled the service %0 not installed, run install command befor enable. \n").
+        QuasarAppUtils::Params::log(QObject::tr("Cannot enabled the service %0 not installed, run install command befor enable. \n").
                                     arg(serviceName()),
                                     QuasarAppUtils::Info);
         return false;
@@ -54,7 +63,7 @@ bool BaseInstaller::enable() {
 
 bool BaseInstaller::disable() {
     if (!isInstalled()) {
-        QuasarAppUtils::Params::log(QString("Cannot disabled the service %0 not installed, run install command befor enable. \n").
+        QuasarAppUtils::Params::log(QObject::tr("Cannot disabled the service %0 not installed, run install command befor enable. \n").
                                     arg(serviceName()),
                                     QuasarAppUtils::Info);
         return false;
diff --git a/Patronum/src/Private/controllerprivate.cpp b/Patronum/src/Private/controllerprivate.cpp
index bf525f5..b91108b 100644
--- a/Patronum/src/Private/controllerprivate.cpp
+++ b/Patronum/src/Private/controllerprivate.cpp
@@ -10,6 +10,7 @@
 #include "localsocket.h"
 #include <QCoreApplication>
 #include <QDateTime>
+#include <QFile>
 #include <QProcess>
 #include <quasarapp.h>
 #include "package.h"
@@ -63,7 +64,6 @@ bool ControllerPrivate::sendCmd(const QSet<Feature> &result) {
     }
 
     if (_socket->send(_parser->createPackage(Command::Feature, result))) {
-        _responce = false;
         return true;
     }
 
@@ -73,12 +73,9 @@ bool ControllerPrivate::sendCmd(const QSet<Feature> &result) {
 int ControllerPrivate::start() const {
 
     QProcess proc;
-    proc.setProgram(_serviceExe);
-    if (_installer && _installer->isInstalled() && _installer->getExecutable().size()) {
-        proc.setProgram(_installer->getExecutable());
-    }
+    proc.setProgram(getExecutable());
 
-    proc.setArguments({"exec"});
+    proc.setArguments({"d"});
     proc.setProcessEnvironment(QProcessEnvironment::systemEnvironment());
     proc.setProcessChannelMode(QProcess::SeparateChannels);
 
@@ -104,7 +101,7 @@ bool ControllerPrivate::install() const {
         return false;
     }
 
-    if (!_installer->install(_serviceExe)) {
+    if (!_installer->install(getExecutable())) {
         return false;
     }
 
@@ -126,7 +123,7 @@ bool ControllerPrivate::uninstall() const {
 
     _controller->handleResponce({{"Result", "Uninstall service successful"}});
 
-    return _installer->uninstall();
+    return true;
 }
 
 bool ControllerPrivate::pause() {
@@ -137,24 +134,6 @@ bool ControllerPrivate::resume() {
     return sendCmd({Feature("resume")});
 }
 
-bool Patronum::ControllerPrivate::waitForResponce(int msec) {
-    if (!dynamic_cast<QCoreApplication*>(QCoreApplication::instance())) {
-        QuasarAppUtils::Params::log("Before run the waitForResponce method you need run a exec method of your QApplication class.",
-                                    QuasarAppUtils::Warning);
-
-        return false;
-    }
-
-    qint64 waitFor = QDateTime::currentMSecsSinceEpoch() + msec;
-
-    while (!_responce && QDateTime::currentMSecsSinceEpoch() < waitFor) {
-        QCoreApplication::processEvents();
-    }
-    QCoreApplication::processEvents();
-
-    return _responce;
-}
-
 QList<Feature> ControllerPrivate::features() const {
     return _features;
 }
@@ -221,7 +200,7 @@ void ControllerPrivate::handleReceve(QByteArray data) {
         }
 
         case Command::CloseConnection: {
-            _responce = true;
+            _controller->finished();
             break;
         }
 
@@ -249,4 +228,16 @@ void ControllerPrivate::handleReceve(QByteArray data) {
     }
 
 }
+
+QString ControllerPrivate::getExecutable() const {
+    if (QFile::exists(_serviceExe)) {
+        return _serviceExe;
+    }
+
+    if (!_installer) {
+        return "";
+    }
+
+    return _installer->getExecutable();
+}
 }
diff --git a/Patronum/src/Private/controllerprivate.h b/Patronum/src/Private/controllerprivate.h
index c107558..e53163c 100644
--- a/Patronum/src/Private/controllerprivate.h
+++ b/Patronum/src/Private/controllerprivate.h
@@ -33,8 +33,6 @@ public:
     bool pause();
     bool resume();
 
-    bool waitForResponce(int msec);
-
     QList<Feature> features() const;
 
     bool isConnected() const;
@@ -44,18 +42,21 @@ public:
 signals:
     void sigListFeatures(QList<Feature>);
 
+private slots:
+    void handleReceve(QByteArray data);
+
+
 private:
 
+    QString getExecutable() const;
+
     LocalSocket *_socket = nullptr;
     IController *_controller = nullptr;
-    bool _responce = false;
     QList<Feature> _features;
     QString _serviceExe = "";
     Installer *_installer = nullptr;
     Parser * _parser;
 
-private slots:
-    void handleReceve(QByteArray data);
 };
 
 }
diff --git a/Patronum/src/Private/installersystemd.cpp b/Patronum/src/Private/installersystemd.cpp
index ad20bbc..c6a8667 100644
--- a/Patronum/src/Private/installersystemd.cpp
+++ b/Patronum/src/Private/installersystemd.cpp
@@ -12,7 +12,7 @@
 #include <QProcess>
 namespace Patronum {
 
-const QString systemDPath = "/etc/systemd/system/";
+#define SYSTEMD_PATH "/etc/systemd/system/"
 
 InstallerSystemD::InstallerSystemD(const QString& name):
     BaseInstaller(name) {
@@ -106,7 +106,7 @@ bool InstallerSystemD::isInstalled() const {
 }
 
 QString InstallerSystemD::absaluteServicePath() const {
-    return systemDPath + serviceName() + ".service";
+    return SYSTEMD_PATH + serviceName() + ".service";
 }
 
 }
diff --git a/Patronum/src/patronum.h b/Patronum/src/patronum.h
index a8d26d5..4c05042 100644
--- a/Patronum/src/patronum.h
+++ b/Patronum/src/patronum.h
@@ -13,6 +13,39 @@
 
 /**
  * @brief The Patronum namespace - It is main name space of Patronum Library.
+ * The Patronum library support the two work mode
+ *  1. Single executable mode.
+ *  2. Service-terminal mode.
+ *
+ *  ## Single executable mode
+ *  In this case you have a service with single executable file. All service operations (instalation deinstalation, send commnad and another) will sends from the one executable.
+ *
+ *  Fits one you need to start service executable as a daemon.
+ *  @code{bash}
+ *    myservice daemon
+ *  @endcode
+ *
+ *  For send any command to service use the service command.
+ *
+ *  @code{bash}
+ *    myservice myCommand
+ *  @endcode
+ *
+ *  ## Service-terminal mode.
+ *  In this mode you create two executable file.
+ *  1. Service is Patronum::Service
+ *  2. Terminal is Patronum::Controller
+ *
+ *  Fits one you need to start service executable as a daemon.
+ *  @code{bash}
+ *    myservice daemon
+ *  @endcode
+ *
+ *  For send any command to service use the terminal executable.
+ *
+ *  @code{bash}
+ *    terminal myCommand
+ *  @endcode
  */
 namespace Patronum {}
 #endif // PATRONUM_H
diff --git a/README.md b/README.md
index a9ef5af..ba6f90e 100644
--- a/README.md
+++ b/README.md
@@ -61,7 +61,7 @@ public:
     QList<Feature> supportedFeatures() {
 
         QList<Feature> res;
-        Feature Ping = {"Ping", ""}
+        Feature Ping = {"Ping", "This is description of the ping command"}
         return res << Ping;
     }
 };
@@ -87,6 +87,8 @@ public:
 };
 
 int main(int argc, char **argv) {
+    QCoreApplication::setApplicationName("MyServiceName"); // <--
+    QCoreApplication::setOrganizationName("MyCompany"); // <--
     QCoreApplcication app
     MyControllerApp controller;
     controller.send(argc, argv);
diff --git a/Tests/defaultcontroller.cpp b/Tests/defaultcontroller.cpp
index d289624..70d3a17 100644
--- a/Tests/defaultcontroller.cpp
+++ b/Tests/defaultcontroller.cpp
@@ -9,6 +9,14 @@ QVariantMap DefaultController::getResponce() {
     return _receiveData;
 }
 
+bool DefaultController::isFinished() const {
+    return _finished;
+}
+
 void DefaultController::handleResponce(const QVariantMap &feature) {
     _receiveData = feature;
 }
+
+void DefaultController::finished() {
+    _finished = true;
+}
diff --git a/Tests/defaultcontroller.h b/Tests/defaultcontroller.h
index 6f41c7d..224eb83 100644
--- a/Tests/defaultcontroller.h
+++ b/Tests/defaultcontroller.h
@@ -7,13 +7,15 @@ class DefaultController : public Patronum::Controller
 public:
     DefaultController();
     QVariantMap getResponce();
+    bool isFinished() const;
 
 protected:
     void handleResponce(const QVariantMap &feature);
+    void finished();
 
 private:
     QVariantMap _receiveData;
-
+    bool _finished = false;
 
 };
 
diff --git a/Tests/testutils.cpp b/Tests/testutils.cpp
index 81db1f2..451d09c 100644
--- a/Tests/testutils.cpp
+++ b/Tests/testutils.cpp
@@ -18,3 +18,12 @@ bool TestUtils::wait(const bool &forWait, int msec) {
     return forWait;
 }
 
+
+bool TestUtils::wait(std::function<bool ()> forWait, int msec) {
+    auto curmsec = QDateTime::currentMSecsSinceEpoch() + msec;
+    while (curmsec > QDateTime::currentMSecsSinceEpoch() && !forWait()) {
+        QCoreApplication::processEvents();
+    }
+    QCoreApplication::processEvents();
+    return forWait();
+}
diff --git a/Tests/testutils.h b/Tests/testutils.h
index 9fd27d3..e06bd4b 100644
--- a/Tests/testutils.h
+++ b/Tests/testutils.h
@@ -8,6 +8,7 @@ class TestUtils
 public:
     TestUtils();
     static bool wait(const bool &forWait, int msec);
+    static bool wait(std::function<bool ()> forWait, int msec);
 
 };
 
diff --git a/Tests/tst_unittests.cpp b/Tests/tst_unittests.cpp
index 7a7f03f..560581a 100644
--- a/Tests/tst_unittests.cpp
+++ b/Tests/tst_unittests.cpp
@@ -39,6 +39,8 @@ testPatronum::testPatronum() {
 }
 
 void testPatronum::testPing() {
+    TestUtils utils;
+
     const char* arg[] = {
         "/",
         "ping"
@@ -46,11 +48,13 @@ void testPatronum::testPing() {
     DefaultController cli;
     QuasarAppUtils::Params::clearParsedData();
     QVERIFY(cli.send(2 , const_cast<char**>(arg)));
-    QVERIFY(cli.waitForResponce(1000));
+    QVERIFY(utils.wait([&cli](){return cli.isFinished();}, 1000));
     QVERIFY(cli.getResponce().value("Result") == "pong");
 }
 
 void testPatronum::testRandomCommad() {
+    TestUtils utils;
+
     const char* arg[] = {
         "/",
         "fd"
@@ -59,7 +63,7 @@ void testPatronum::testRandomCommad() {
     QuasarAppUtils::Params::clearParsedData();
 
     QVERIFY(cli.send(2 , const_cast<char**>(arg)));
-    QVERIFY(cli.waitForResponce(1000));
+    QVERIFY(utils.wait([&cli](){return cli.isFinished();}, 1000));
     QVERIFY(cli.getResponce().contains("Error"));
 }
 
@@ -74,6 +78,8 @@ void testPatronum::connectTest() {
         QCoreApplication::exit(0);
     });
 
+    QuasarAppUtils::Params::parseParams({"s"});
+
     QVERIFY(serv.exec() == 0);
 
 }