diff --git a/app/src/main/java/org/opencord/aaa/impl/AaaManager.java b/app/src/main/java/org/opencord/aaa/impl/AaaManager.java
index ee339e4..c2e62eb 100644
--- a/app/src/main/java/org/opencord/aaa/impl/AaaManager.java
+++ b/app/src/main/java/org/opencord/aaa/impl/AaaManager.java
@@ -1056,37 +1056,26 @@
     private class InternalDeviceListener implements DeviceListener {
         @Override
         public void event(DeviceEvent event) {
-
+            DeviceId deviceId = event.subject().id();
             switch (event.type()) {
                 case PORT_REMOVED:
-                    DeviceId devId = event.subject().id();
                     PortNumber portNumber = event.port().number();
-                    String sessionId = devId.toString() + portNumber.toString();
-
+                    String sessionId = deviceId.toString() + portNumber.toString();
                     log.debug("Received PORT_REMOVED event. Clearing AAA Session with Id {}", sessionId);
                     flushStateMachineSession(sessionId,
                             StateMachine.SessionTerminationReasons.PORT_REMOVED.getReason());
 
                     break;
-
+                case DEVICE_AVAILABILITY_CHANGED:
+                    if (!deviceService.isAvailable(deviceId)) {
+                        log.debug("Received DEVICE_AVAILABILITY_CHANGED event for {}, " +
+                                          "went available to un-available", deviceId);
+                        clearAllSessionStateForDevice(deviceId);
+                    }
+                    break;
                 case DEVICE_REMOVED:
-                    DeviceId deviceId = event.subject().id();
                     log.debug("Received DEVICE_REMOVED event for {}", deviceId);
-
-                    Set<String> associatedSessions = Sets.newHashSet();
-                    for (Entry<String, StateMachine> stateMachineEntry : stateMachines.entrySet()) {
-                        ConnectPoint cp = stateMachineEntry.getValue().supplicantConnectpoint();
-                        if (cp != null && cp.deviceId().toString().equals(deviceId.toString())) {
-                            associatedSessions.add(stateMachineEntry.getKey());
-                        }
-                    }
-
-                    for (String session : associatedSessions) {
-                        log.debug("Clearing AAA Session {} associated with Removed Device", session);
-                        flushStateMachineSession(session,
-                               StateMachine.SessionTerminationReasons.DEVICE_REMOVED.getReason());
-                    }
-
+                    clearAllSessionStateForDevice(deviceId);
                     break;
 
                 default:
@@ -1094,6 +1083,22 @@
             }
         }
 
+        private void clearAllSessionStateForDevice(DeviceId deviceId) {
+            Set<String> associatedSessions = Sets.newHashSet();
+            for (Entry<String, StateMachine> stateMachineEntry : stateMachines.entrySet()) {
+                ConnectPoint cp = stateMachineEntry.getValue().supplicantConnectpoint();
+                if (cp != null && cp.deviceId().toString().equals(deviceId.toString())) {
+                    associatedSessions.add(stateMachineEntry.getKey());
+                }
+            }
+
+            for (String session : associatedSessions) {
+                log.debug("Clearing AAA Session {} associated with Removed Device", session);
+                flushStateMachineSession(session,
+                       StateMachine.SessionTerminationReasons.DEVICE_REMOVED.getReason());
+            }
+        }
+
         private void flushStateMachineSession(String sessionId, String terminationReason) {
             StateMachine stateMachine = stateMachines.get(sessionId);
             if (stateMachine != null) {
