diff --git a/common/transport/mqtt/pom.xml b/common/transport/mqtt/pom.xml
index 676593804e..b6ceb13951 100644
--- a/common/transport/mqtt/pom.xml
+++ b/common/transport/mqtt/pom.xml
@@ -88,6 +88,11 @@
             junit
             test
         
+        
+            org.awaitility
+            awaitility
+            test
+        
         
             org.mockito
             mockito-core
diff --git a/common/transport/mqtt/src/test/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionHandlerTest.java b/common/transport/mqtt/src/test/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionHandlerTest.java
new file mode 100644
index 0000000000..c75f7b2a23
--- /dev/null
+++ b/common/transport/mqtt/src/test/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionHandlerTest.java
@@ -0,0 +1,46 @@
+package org.thingsboard.server.transport.mqtt.session;
+
+import org.junit.Test;
+
+import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import static org.awaitility.Awaitility.await;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.BDDMockito.willCallRealMethod;
+import static org.mockito.Mockito.mock;
+
+public class GatewaySessionHandlerTest {
+
+    @Test
+    public void givenWeakHashMap_WhenGC_thenMapIsEmpty() {
+        WeakHashMap map = new WeakHashMap<>();
+
+        String deviceName = new String("device"); //constants are static and doesn't affected by GC, so use new instead
+        map.put(deviceName, new ReentrantLock());
+        assertTrue(map.containsKey(deviceName));
+
+        deviceName = null;
+        System.gc();
+
+        await().atMost(10, TimeUnit.SECONDS).until(() -> !map.containsKey("device"));
+    }
+
+    @Test
+    public void givenConcurrentReferenceHashMap_WhenGC_thenMapIsEmpty() {
+        GatewaySessionHandler gsh = mock(GatewaySessionHandler.class);
+        willCallRealMethod().given(gsh).createWeakMap();
+
+        ConcurrentMap map = gsh.createWeakMap();
+        map.put("device", new ReentrantLock());
+        assertTrue(map.containsKey("device"));
+
+        System.gc();
+
+        await().atMost(10, TimeUnit.SECONDS).until(() -> !map.containsKey("device"));
+    }
+
+}
\ No newline at end of file