-class PING : public PLUGIN {
-friend class CHG_CURRIP_NOTIFIER_PING;
-friend class CHG_IPS_NOTIFIER_PING;
-public:
-    PING();
-    virtual ~PING();
-
-    void SetUsers(USERS * u);
-    void SetTariffs(TARIFFS *) {}
-    void SetAdmins(ADMINS *) {}
-    void SetTraffcounter(TRAFFCOUNTER *) {}
-    void SetStore(STORE *) {}
-    void SetStgSettings(const SETTINGS *) {}
-    void SetSettings(const MODULE_SETTINGS & s);
-    int ParseSettings();
-
-    int Start();
-    int Stop();
-    int Reload() { return 0; }
-    bool IsRunning();
-
-    const std::string & GetStrError() const;
-    const std::string GetVersion() const;
-    uint16_t GetStartPosition() const;
-    uint16_t GetStopPosition() const;
-
-    void AddUser(USER_PTR u);
-    void DelUser(USER_PTR u);
-
-private:
-    void GetUsers();
-    void SetUserNotifiers(USER_PTR u);
-    void UnSetUserNotifiers(USER_PTR u);
-    static void * Run(void * d);
-
-    mutable std::string errorStr;
-    PING_SETTINGS pingSettings;
-    MODULE_SETTINGS settings;
-    USERS * users;
-    std::list<USER_PTR> usersList;
-
-    /*
-    ÍÙ ÄÏÌÖÎÙ ÐÅÒÅÐÒÏ×ÅÒÉÔØ ×ÏÚÍÏÖÎÏÓÔØ ÐÉÎÇÏ×ÁÎÉÑ ÀÚÅÒÁ ÐÒÉ ÉÚÍÅÎÅÎÉÉ
-    ÓÌÅÄÕÀÝÉÈ ÅÇÏ ÐÁÒÁÍÅÔÒÏ×:
-    - currIP
-    - ips
-    */
-    pthread_t thread;
-    pthread_mutex_t mutex;
-    bool nonstop;
-    bool isRunning;
-    mutable STG_PINGER pinger;
-
-    std::list<CHG_CURRIP_NOTIFIER_PING> ChgCurrIPNotifierList;
-    std::list<CHG_IPS_NOTIFIER_PING> ChgIPNotifierList;
-
-    ADD_USER_NONIFIER_PING onAddUserNotifier;
-    DEL_USER_NONIFIER_PING onDelUserNotifier;
+class PING : public Plugin
+{
+    public:
+        PING();
+
+        void SetUsers(Users * u) override { users = u; }
+        void SetSettings(const ModuleSettings & s) override { settings = s; }
+        int ParseSettings() override;
+
+        int Start() override;
+        int Stop() override;
+        int Reload(const ModuleSettings & /*ms*/) override { return 0; }
+        bool IsRunning() override;
+
+        const std::string & GetStrError() const override { return errorStr; }
+        std::string GetVersion() const override { return "Pinger v.1.01"; }
+        uint16_t GetStartPosition() const override { return 10; }
+        uint16_t GetStopPosition() const override { return 10; }
+
+        void AddUser(UserPtr u);
+        void DelUser(UserPtr u);
+
+    private:
+        explicit PING(const PING & rvalue);
+        PING & operator=(const PING & rvalue);
+
+        void GetUsers();
+        void SetUserNotifiers(UserPtr u);
+        void UnSetUserNotifiers(UserPtr u);
+        void Run(std::stop_token token);
+
+        mutable std::string errorStr;
+        PING_SETTINGS pingSettings;
+        ModuleSettings settings;
+        Users * users;
+        std::list<UserPtr> usersList;
+
+        std::jthread m_thread;
+        std::mutex m_mutex;
+        bool isRunning;
+        mutable STG_PINGER pinger;
+
+        void updateCurrIP(uint32_t oldVal, uint32_t newVal);
+        void updateIPs(const UserIPs& oldVal, const UserIPs& newVal);
+
+        ScopedConnection m_onAddUserConn;
+        ScopedConnection m_onDelUserConn;
+
+        using ConnHolder = std::tuple<int, ScopedConnection, ScopedConnection>;
+        std::vector<ConnHolder> m_conns;
+
+        PluginLogger logger;