diff --git a/app/src/main/java/org/opencord/olt/impl/Olt.java b/app/src/main/java/org/opencord/olt/impl/Olt.java
index 87a9b96..345ef47 100644
--- a/app/src/main/java/org/opencord/olt/impl/Olt.java
+++ b/app/src/main/java/org/opencord/olt/impl/Olt.java
@@ -171,7 +171,7 @@
         // UNI ports
         Iterable<Device> devices = deviceService.getDevices();
         for (Device d : devices) {
-            checkAndCreateEapolFlows(d);
+            checkAndCreateDeviceFlows(d);
         }
 
         deviceService.addListener(deviceListener);
@@ -526,6 +526,50 @@
 
     }
 
+    /**
+     * Installs trap filtering objectives for particular traffic types on an
+     * NNI port.
+     *
+     * @param devId device ID
+     * @param port port number
+     * @param install true to install, false to remove
+     */
+    private void processNniFilteringObjectives(DeviceId devId, PortNumber port, boolean install) {
+        processLldpFilteringObjective(devId, port, install);
+        processDhcpFilteringObjectives(devId, port, install);
+    }
+
+    private void processLldpFilteringObjective(DeviceId devId, PortNumber port, boolean install) {
+        if (!mastershipService.isLocalMaster(devId)) {
+            return;
+        }
+        DefaultFilteringObjective.Builder builder = DefaultFilteringObjective.builder();
+
+        FilteringObjective lldp = (install ? builder.permit() : builder.deny())
+                .withKey(Criteria.matchInPort(port))
+                .addCondition(Criteria.matchEthType(EthType.EtherType.LLDP.ethType()))
+                .withMeta(DefaultTrafficTreatment.builder()
+                        .setOutput(PortNumber.CONTROLLER).build())
+                .fromApp(appId)
+                .withPriority(10000)
+                .add(new ObjectiveContext() {
+                    @Override
+                    public void onSuccess(Objective objective) {
+                        log.info("LLDP filter for {} on {} installed.",
+                                devId, port);
+                    }
+
+                    @Override
+                    public void onError(Objective objective, ObjectiveError error) {
+                        log.info("LLDP filter for {} on {} failed because {}",
+                                devId, port, error);
+                    }
+                });
+
+        flowObjectiveService.filter(devId, lldp);
+
+    }
+
     private void processDhcpFilteringObjectives(DeviceId devId, PortNumber port, boolean install) {
         if (!mastershipService.isLocalMaster(devId)) {
             return;
@@ -594,12 +638,12 @@
     }
 
     /**
-     * Creates EAPOL flows on the UNIs, if device is
-     * present in Sadis config.
+     * Creates trap flows for device, including DHCP and LLDP trap on NNI and
+     * EAPOL trap on the UNIs, if device is present in Sadis config.
      *
      * @param dev Device to look for
      */
-    private void checkAndCreateEapolFlows(Device dev) {
+    private void checkAndCreateDeviceFlows(Device dev) {
         // we create only for the ones we are master of
         if (!mastershipService.isLocalMaster(dev.id())) {
                 return;
@@ -607,19 +651,21 @@
         // check if this device is provisioned in Sadis
         String devSerialNo = dev.serialNumber();
         SubscriberAndDeviceInformation deviceInfo = subsService.get(devSerialNo);
-        log.debug("checkAndCreateEapolFlows: deviceInfo {}", deviceInfo);
+        log.debug("checkAndCreateDeviceFlows: deviceInfo {}", deviceInfo);
 
         if (deviceInfo != null) {
-            // This is an OLT device as per Sadis, we need to create EAPOL flows
-            // on all it's UNIs
+            // This is an OLT device as per Sadis, we create flows for UNI and NNI ports
             for (Port p : deviceService.getPorts(dev.id())) {
                 if (isUniPort(dev, p)) {
                     processFilteringObjectives(dev.id(), p.number(), true);
+                } else {
+                    processNniFilteringObjectives(dev.id(), p.number(), true);
                 }
             }
         }
     }
 
+
     /**
      * Get the uplink for of the OLT device.
      *
@@ -726,7 +772,7 @@
                             .forEach(p -> post(new AccessDeviceEvent(
                                     AccessDeviceEvent.Type.UNI_ADDED, devId, p)));
 
-                    checkAndCreateEapolFlows(dev);
+                    checkAndCreateDeviceFlows(dev);
                     break;
                 case DEVICE_REMOVED:
                     deviceService.getPorts(devId).stream()
@@ -743,6 +789,7 @@
                         post(new AccessDeviceEvent(
                                 AccessDeviceEvent.Type.DEVICE_CONNECTED, devId,
                                 null, null));
+                        checkAndCreateDeviceFlows(dev);
                     } else {
                         post(new AccessDeviceEvent(
                                 AccessDeviceEvent.Type.DEVICE_DISCONNECTED, devId,
