diff --git a/monitoring/pom.xml b/monitoring/pom.xml
index 5c045df996..7f9e6c3369 100644
--- a/monitoring/pom.xml
+++ b/monitoring/pom.xml
@@ -21,12 +21,11 @@
     4.0.0
     
         org.thingsboard
-        3.4.2-SNAPSHOT
+        3.4.3-SNAPSHOT
         thingsboard
     
 
     monitoring
-    3.4.2-SNAPSHOT
     ThingsBoard Monitoring Service
     jar
 
@@ -96,20 +95,9 @@
             Java-WebSocket
             compile
         
-        
-            org.seleniumhq.selenium
-            selenium-java
-            4.6.0
-        
         
             com.google.guava
             guava
-            31.1-jre
-        
-        
-            io.github.bonigarcia
-            webdrivermanager
-            5.3.1
         
         
             org.apache.commons
diff --git a/monitoring/src/main/conf/tb-monitoring.conf b/monitoring/src/main/conf/tb-monitoring.conf
index 83287286bb..6c6b191176 100644
--- a/monitoring/src/main/conf/tb-monitoring.conf
+++ b/monitoring/src/main/conf/tb-monitoring.conf
@@ -14,9 +14,9 @@
 # limitations under the License.
 #
 
-export JAVA_OPTS="$JAVA_OPTS -Xlog:gc*,heap*,age*,safepoint=debug:file=@pkg.logFolder@/gc.log:time,uptime,level,tags:filecount=10,filesize=10M"
+export JAVA_OPTS="$JAVA_OPTS -Xlog:gc*,heap*,age*,safepoint=debug:file=/var/log/tb-monitoring/gc.log:time,uptime,level,tags:filecount=10,filesize=10M"
 export JAVA_OPTS="$JAVA_OPTS -XX:+IgnoreUnrecognizedVMOptions -XX:+HeapDumpOnOutOfMemoryError"
 export JAVA_OPTS="$JAVA_OPTS -XX:-UseBiasedLocking -XX:+UseTLAB -XX:+ResizeTLAB -XX:+PerfDisableSharedMem -XX:+UseCondCardMark"
 export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=500 -XX:+UseStringDeduplication -XX:+ParallelRefProcEnabled -XX:MaxTenuringThreshold=10"
-export LOG_FILENAME=${pkg.name}.out
-export LOADER_PATH=${pkg.installFolder}/conf
+export LOG_FILENAME=tb-monitoring.out
+export LOADER_PATH=/usr/share/tb-monitoring/conf
diff --git a/monitoring/src/main/java/org/thingsboard/monitoring/data/Latency.java b/monitoring/src/main/java/org/thingsboard/monitoring/data/Latency.java
index acfa49b1fc..90914f09e1 100644
--- a/monitoring/src/main/java/org/thingsboard/monitoring/data/Latency.java
+++ b/monitoring/src/main/java/org/thingsboard/monitoring/data/Latency.java
@@ -36,6 +36,10 @@ public class Latency {
         return latencySum.get() / counter.get();
     }
 
+    public boolean isNotEmpty() {
+        return counter.get() > 0;
+    }
+
     public synchronized void reset() {
         latencySum.set(0.0);
         counter.set(0);
diff --git a/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringReporter.java b/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringReporter.java
index ee8b173152..963f93d2e1 100644
--- a/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringReporter.java
+++ b/monitoring/src/main/java/org/thingsboard/monitoring/service/MonitoringReporter.java
@@ -73,7 +73,9 @@ public class MonitoringReporter {
                 return;
             }
             log.info("Latencies:\n{}", latencies.values());
-            if (latencies.values().stream().anyMatch(latency -> latency.getAvg() >= (double) latencyThresholdMs)) {
+            if (latencies.values().stream()
+                    .filter(Latency::isNotEmpty)
+                    .anyMatch(latency -> latency.getAvg() >= (double) latencyThresholdMs)) {
                 HighLatencyNotification highLatencyNotification = new HighLatencyNotification(latencies.values(), latencyThresholdMs);
                 notificationService.sendNotification(highLatencyNotification);
             }
@@ -89,9 +91,11 @@ public class MonitoringReporter {
                     tbClient.logIn();
                     ObjectNode msg = JacksonUtil.newObjectNode();
                     latencies.forEach((key, latency) -> {
-                        msg.set(key, new DoubleNode(latency.getAvg()));
+                        if (latency.isNotEmpty()) {
+                            msg.set(key, new DoubleNode(latency.getAvg()));
+                            latency.reset();
+                        }
                     });
-                    latencies.clear();
                     tbClient.saveEntityTelemetry(entityId, "time", msg);
                 } catch (Exception e) {
                     log.error("Failed to report latencies: {}", e.getMessage());
diff --git a/monitoring/src/main/java/org/thingsboard/monitoring/service/TransportMonitoringService.java b/monitoring/src/main/java/org/thingsboard/monitoring/service/TransportMonitoringService.java
index 2030e01a44..e27002449e 100644
--- a/monitoring/src/main/java/org/thingsboard/monitoring/service/TransportMonitoringService.java
+++ b/monitoring/src/main/java/org/thingsboard/monitoring/service/TransportMonitoringService.java
@@ -143,7 +143,7 @@ public abstract class TransportMonitoringService {
-            RemoteWebDriver driver = null;
-            try {
-                driver = createDriver();
-                WebDriverWait wait = createDriverWait(driver);
-                driver.manage().window().maximize();
-                driver.get(url + "/login");
-
-                try {
-                    stopWatch.start();
-                    wait.until(elementToBeClickable(xpath(EMAIL_FIELD))).sendKeys(username);
-                    wait.until(elementToBeClickable(xpath(PASSWORD_FIELD))).sendKeys(password);
-                    wait.until(elementToBeClickable(xpath(SUBMIT_BTN))).click();
-                    monitoringReporter.reportLatency(Latencies.WEB_UI_LOAD, stopWatch.getTime());
-
-                    wait.until(urlContains("/home"));
-                    wait.until(elementToBeClickable(xpath(DEVICES_BTN))).click();
-                } catch (Exception e) {
-                    throw new RuntimeException("Expected web UI elements were not displayed", e);
-                }
-
-                monitoringReporter.serviceIsOk(MonitoredServiceKey.WEB_UI);
-            } catch (Exception e) {
-                monitoringReporter.serviceFailure(MonitoredServiceKey.WEB_UI, e);
-            } finally {
-                if (driver != null) driver.quit();
-            }
-        }, 0, monitoringRateSec, TimeUnit.SECONDS);
-    }
-
-    private RemoteWebDriver createDriver() throws MalformedURLException {
-        ChromeOptions options = new ChromeOptions();
-        options.setPageLoadTimeout(Duration.ofMillis(timeoutMs));
-        return new RemoteWebDriver(new URL(remoteWebdriverUrl + "/wd/hub"), options);
-    }
-
-    private WebDriverWait createDriverWait(WebDriver driver) {
-        return new WebDriverWait(driver, Duration.ofMillis(timeoutMs));
-    }
-
-}
diff --git a/monitoring/src/main/java/org/thingsboard/monitoring/service/impl/MqttTransportMonitoringService.java b/monitoring/src/main/java/org/thingsboard/monitoring/service/impl/MqttTransportMonitoringService.java
index 037463783c..5e6542d29e 100644
--- a/monitoring/src/main/java/org/thingsboard/monitoring/service/impl/MqttTransportMonitoringService.java
+++ b/monitoring/src/main/java/org/thingsboard/monitoring/service/impl/MqttTransportMonitoringService.java
@@ -15,7 +15,9 @@
  */
 package org.thingsboard.monitoring.service.impl;
 
+import org.eclipse.paho.client.mqttv3.IMqttToken;
 import org.eclipse.paho.client.mqttv3.MqttAsyncClient;
+import org.eclipse.paho.client.mqttv3.MqttClient;
 import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
 import org.eclipse.paho.client.mqttv3.MqttMessage;
 import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
@@ -31,7 +33,7 @@ import org.thingsboard.monitoring.service.TransportMonitoringService;
 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
 public class MqttTransportMonitoringService extends TransportMonitoringService {
 
-    private MqttAsyncClient mqttClient;
+    private MqttClient mqttClient;
 
     private static final String DEVICE_TELEMETRY_TOPIC = "v1/devices/me/telemetry";
 
@@ -44,11 +46,16 @@ public class MqttTransportMonitoringService extends TransportMonitoringService4.0.0
     
         org.thingsboard
-        3.4.2-SNAPSHOT
+        3.4.3-SNAPSHOT
         msa