diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/PortNotifier.kt b/android/TerminalApp/java/com/android/virtualization/terminal/PortNotifier.kt
index ed6e02e..dd58e0a 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/PortNotifier.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/PortNotifier.kt
@@ -23,7 +23,7 @@
 import android.content.Intent
 import android.content.IntentFilter
 import android.graphics.drawable.Icon
-import java.util.HashSet
+import com.android.virtualization.terminal.MainActivity.TAG
 import java.util.Locale
 
 /**
@@ -32,7 +32,7 @@
  */
 internal class PortNotifier(val context: Context) {
     private val notificationManager: NotificationManager =
-        context.getSystemService<NotificationManager?>(NotificationManager::class.java)
+        context.getSystemService<NotificationManager>(NotificationManager::class.java)
     private val receiver: BroadcastReceiver =
         PortForwardingRequestReceiver().also {
             val intentFilter = IntentFilter(ACTION_PORT_FORWARDING)
@@ -41,15 +41,10 @@
     private val portsStateListener: PortsStateManager.Listener =
         object : PortsStateManager.Listener {
             override fun onPortsStateUpdated(oldActivePorts: Set<Int>, newActivePorts: Set<Int>) {
-                val union: MutableSet<Int> = HashSet<Int>(oldActivePorts)
-                union.addAll(newActivePorts)
-                for (port in union) {
-                    if (!oldActivePorts.contains(port)) {
-                        showNotificationFor(port)
-                    } else if (!newActivePorts.contains(port)) {
-                        discardNotificationFor(port)
-                    }
-                }
+                // added active ports
+                (newActivePorts - oldActivePorts).forEach { showNotificationFor(it) }
+                // removed active ports
+                (oldActivePorts - newActivePorts).forEach { discardNotificationFor(it) }
             }
         }
     private val portsStateManager: PortsStateManager =
@@ -64,7 +59,7 @@
         return context.getString(resId)
     }
 
-    private fun getPendingIntentFor(port: Int, enabled: Boolean): PendingIntent? {
+    private fun getPendingIntentFor(port: Int, enabled: Boolean): PendingIntent {
         val intent = Intent(ACTION_PORT_FORWARDING)
         intent.setPackage(context.getPackageName())
         intent.setIdentifier(String.format(Locale.ROOT, "%d_%b", port, enabled))
@@ -109,11 +104,11 @@
                 .addAction(acceptAction)
                 .addAction(denyAction)
                 .build()
-        notificationManager.notify(MainActivity.TAG, port, notification)
+        notificationManager.notify(TAG, port, notification)
     }
 
     private fun discardNotificationFor(port: Int) {
-        notificationManager.cancel(MainActivity.TAG, port)
+        notificationManager.cancel(TAG, port)
     }
 
     private inner class PortForwardingRequestReceiver : BroadcastReceiver() {
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/PortsStateManager.kt b/android/TerminalApp/java/com/android/virtualization/terminal/PortsStateManager.kt
index 736176a..7e53cce 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/PortsStateManager.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/PortsStateManager.kt
@@ -27,7 +27,7 @@
 class PortsStateManager private constructor(private val sharedPref: SharedPreferences) {
     private val lock = Any()
 
-    @GuardedBy("lock") private var activePorts: MutableSet<Int> = hashSetOf()
+    @GuardedBy("lock") private val activePorts: MutableSet<Int> = hashSetOf()
 
     @GuardedBy("lock")
     private val enabledPorts: MutableSet<Int> =
@@ -42,29 +42,28 @@
 
     @GuardedBy("lock") private val listeners: MutableSet<Listener> = hashSetOf()
 
-    fun getActivePorts(): MutableSet<Int> {
+    fun getActivePorts(): Set<Int> {
         synchronized(lock) {
             return HashSet<Int>(activePorts)
         }
     }
 
-    fun getEnabledPorts(): MutableSet<Int> {
+    fun getEnabledPorts(): Set<Int> {
         synchronized(lock) {
             return HashSet<Int>(enabledPorts)
         }
     }
 
-    fun updateActivePorts(ports: MutableSet<Int>) {
-        var oldPorts: MutableSet<Int>
+    fun updateActivePorts(ports: Set<Int>) {
         synchronized(lock) {
-            oldPorts = activePorts
-            activePorts = ports
+            val oldPorts = getActivePorts()
+            activePorts.clear()
+            activePorts.addAll(ports)
+            notifyPortsStateUpdated(oldPorts, getActivePorts())
         }
-        notifyPortsStateUpdated(oldPorts, ports)
     }
 
     fun updateEnabledPort(port: Int, enabled: Boolean) {
-        var activePorts: MutableSet<Int>
         synchronized(lock) {
             val editor = sharedPref.edit()
             editor.putInt(port.toString(), if (enabled) FLAG_ENABLED else 0)
@@ -74,21 +73,18 @@
             } else {
                 enabledPorts.remove(port)
             }
-            activePorts = this@PortsStateManager.activePorts
         }
-        notifyPortsStateUpdated(activePorts, activePorts)
+        notifyPortsStateUpdated(getActivePorts(), getActivePorts())
     }
 
     fun clearEnabledPorts() {
-        var activePorts: MutableSet<Int>
         synchronized(lock) {
             val editor = sharedPref.edit()
             editor.clear()
             editor.apply()
             enabledPorts.clear()
-            activePorts = this@PortsStateManager.activePorts
         }
-        notifyPortsStateUpdated(activePorts, activePorts)
+        notifyPortsStateUpdated(getActivePorts(), getActivePorts())
     }
 
     fun registerListener(listener: Listener) {
@@ -99,15 +95,13 @@
         synchronized(lock) { listeners.remove(listener) }
     }
 
-    private fun notifyPortsStateUpdated(
-        oldActivePorts: MutableSet<Int>,
-        newActivePorts: MutableSet<Int>,
-    ) {
-        var listeners: MutableSet<Listener>
-        synchronized(lock) { listeners = HashSet<Listener>(this@PortsStateManager.listeners) }
-        for (listener in listeners) {
-            listener.onPortsStateUpdated(HashSet<Int>(oldActivePorts), HashSet<Int>(newActivePorts))
-        }
+    // TODO: it notifies when both enabledPort and activePort are changed, but doesn't provide
+    // enabledPort's value change. Make this callback provide that information as well.
+    private fun notifyPortsStateUpdated(oldActivePorts: Set<Int>, newActivePorts: Set<Int>) {
+        synchronized(lock) { HashSet<Listener>(this@PortsStateManager.listeners) }
+            .forEach {
+                it.onPortsStateUpdated(HashSet<Int>(oldActivePorts), HashSet<Int>(newActivePorts))
+            }
     }
 
     interface Listener {
