diff --git a/src/main/java/org/opencord/igmpproxy/IgmpManager.java b/src/main/java/org/opencord/igmpproxy/IgmpManager.java
index 1cdb55b..bb134d5 100644
--- a/src/main/java/org/opencord/igmpproxy/IgmpManager.java
+++ b/src/main/java/org/opencord/igmpproxy/IgmpManager.java
@@ -75,7 +75,6 @@
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
@@ -480,10 +479,13 @@
                     }
 
                     IGMP igmp = (IGMP) ipv4Pkt.getPayload();
+
+                    Optional<PortNumber> deviceUpLinkOpt = getDeviceUplink(deviceId);
+                    PortNumber upLinkPort =  deviceUpLinkOpt.isPresent() ? deviceUpLinkOpt.get() : null;
                     switch (igmp.getIgmpType()) {
                         case IGMP.TYPE_IGMPV3_MEMBERSHIP_QUERY:
                             //Discard Query from OLT’s non-uplink port’s
-                            if (!pkt.receivedFrom().port().equals(getDeviceUplink(deviceId))) {
+                            if (!pkt.receivedFrom().port().equals(upLinkPort)) {
                                 if (isConnectPoint(deviceId, pkt.receivedFrom().port())) {
                                     log.info("IGMP Picked up query from connectPoint");
                                     //OK to process packet
@@ -493,7 +495,7 @@
                                     break;
                                 } else {
                                     //Not OK to process packet
-                                    log.warn("IGMP Picked up query from non-uplink port");
+                                    log.warn("IGMP Picked up query from non-uplink port {}", upLinkPort);
                                     return;
                                 }
                             }
@@ -508,7 +510,7 @@
                         case IGMP.TYPE_IGMPV2_MEMBERSHIP_REPORT:
                         case IGMP.TYPE_IGMPV2_LEAVE_GROUP:
                             //Discard join/leave from OLT’s uplink port’s
-                            if (pkt.receivedFrom().port().equals(getDeviceUplink(deviceId)) ||
+                            if (pkt.receivedFrom().port().equals(upLinkPort) ||
                                     isConnectPoint(deviceId, pkt.receivedFrom().port())) {
                                 log.info("IGMP Picked up join/leave from uplink/connectPoint port");
                                 return;
@@ -625,8 +627,13 @@
             //port is not discovered by ONOS; so cannot validate it.
             return false;
         }
-        return port.annotations().value(AnnotationKeys.PORT_NAME) != null &&
+        boolean isValid = port.annotations().value(AnnotationKeys.PORT_NAME) != null &&
                 port.annotations().value(AnnotationKeys.PORT_NAME).startsWith(NNI_PREFIX);
+        if (!isValid) {
+            log.warn("Port cannot be validated; it is not configured as an NNI port." +
+                    "Device/port: {}/{}", deviceId, portNumber);
+        }
+        return isValid;
     }
 
     public static boolean isIgmpOnPodBasis() {
@@ -680,7 +687,11 @@
     }
 
     private boolean isUplink(DeviceId device, PortNumber port) {
-        return ((!connectPointMode) && getDeviceUplink(device).equals(port));
+        if (connectPointMode) {
+            return false;
+        }
+        Optional<PortNumber> upLinkPort = getDeviceUplink(device);
+        return upLinkPort.isPresent() && upLinkPort.get().equals(port);
     }
 
     /**
@@ -894,14 +905,6 @@
         }
     }
 
-    private void provisionDefaultFlows(DeviceId deviceId) {
-        List<Port> ports = deviceService.getPorts(deviceId);
-
-        ports.stream()
-                .filter(p -> (!getDeviceUplink(((Device) p.element()).id()).equals(p.number()) && p.isEnabled()))
-                .forEach(p -> processFilterObjective((DeviceId) p.element().id(), p.number(), false));
-    }
-
     private void provisionUplinkFlows(DeviceId deviceId) {
         if (connectPointMode) {
             return;
