diff --git a/impl/src/main/java/org/opencord/olt/driver/OltPipeline.java b/impl/src/main/java/org/opencord/olt/driver/OltPipeline.java
index 5232eb8..459526c 100644
--- a/impl/src/main/java/org/opencord/olt/driver/OltPipeline.java
+++ b/impl/src/main/java/org/opencord/olt/driver/OltPipeline.java
@@ -94,6 +94,10 @@
 import java.util.stream.Collectors;
 
 import static org.onosproject.core.CoreService.CORE_APP_NAME;
+import static org.opencord.olt.impl.OsgiPropertyConstants.DOWNSTREAM_OLT;
+import static org.opencord.olt.impl.OsgiPropertyConstants.DOWNSTREAM_ONU;
+import static org.opencord.olt.impl.OsgiPropertyConstants.UPSTREAM_OLT;
+import static org.opencord.olt.impl.OsgiPropertyConstants.UPSTREAM_ONU;
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -542,7 +546,7 @@
     private void installNoModificationRules(ForwardingObjective fwd) {
         Instructions.OutputInstruction output = (Instructions.OutputInstruction) fetchOutput(fwd, DOWNSTREAM);
         Instructions.MetadataInstruction writeMetadata = fetchWriteMetadata(fwd);
-        Instructions.MeterInstruction meter = (Instructions.MeterInstruction) fetchMeter(fwd);
+        Instructions.MeterInstruction meter = fwd.treatment().metered();
 
         TrafficSelector selector = fwd.selector();
 
@@ -627,6 +631,9 @@
     private void installDownstreamRulesForVlans(ForwardingObjective fwd, Instruction output,
                                                 TrafficSelector outerSelector, TrafficSelector innerSelector) {
 
+        Instruction onuDsMeter = fetchMeterById(fwd, fwd.annotations().value(DOWNSTREAM_ONU));
+        Instruction oltDsMeter = fetchMeterById(fwd, fwd.annotations().value(DOWNSTREAM_OLT));
+
         List<Pair<Instruction, Instruction>> vlanOps =
                 vlanOps(fwd,
                         L2ModificationInstruction.L2SubType.VLAN_POP);
@@ -640,11 +647,11 @@
         TrafficTreatment innerTreatment;
         VlanId setVlanId = ((L2ModificationInstruction.ModVlanIdInstruction) popAndRewrite.getRight()).vlanId();
         if (VlanId.NONE.equals(setVlanId)) {
-            innerTreatment = (buildTreatment(popAndRewrite.getLeft(), fetchMeter(fwd),
-                                             writeMetadataIncludingOnlyTp(fwd), output));
+            innerTreatment = (buildTreatment(popAndRewrite.getLeft(), onuDsMeter,
+                    writeMetadataIncludingOnlyTp(fwd), output));
         } else {
             innerTreatment = (buildTreatment(popAndRewrite.getRight(),
-                                             fetchMeter(fwd), writeMetadataIncludingOnlyTp(fwd), output));
+                    onuDsMeter, writeMetadataIncludingOnlyTp(fwd), output));
         }
 
         List<Instruction> setVlanPcps = findL2Instructions(L2ModificationInstruction.L2SubType.VLAN_PCP,
@@ -676,7 +683,7 @@
                 .withPriority(fwd.priority())
                 .withSelector(outerSelector)
                 .withTreatment(buildTreatment(popAndRewrite.getLeft(), modVlanId,
-                                              innerPbitSet, fetchMeter(fwd),
+                                              innerPbitSet, oltDsMeter,
                                               fetchWriteMetadata(fwd),
                                               Instructions.transition(QQ_TABLE)));
 
@@ -696,6 +703,9 @@
     private void installDownstreamRulesForAnyVlan(ForwardingObjective fwd, Instruction output,
                                                   TrafficSelector outerSelector, TrafficSelector innerSelector) {
 
+        Instruction onuDsMeter = fetchMeterById(fwd, fwd.annotations().value(DOWNSTREAM_ONU));
+        Instruction oltDsMeter = fetchMeterById(fwd, fwd.annotations().value(DOWNSTREAM_OLT));
+
         //match: in port (nni), s-tag
         //action: immediate: write metadata, pop vlan, meter and go to table 1
         FlowRule.Builder outer = DefaultFlowRule.builder()
@@ -704,7 +714,7 @@
                 .makePermanent()
                 .withPriority(fwd.priority())
                 .withSelector(outerSelector)
-                .withTreatment(buildTreatment(Instructions.popVlan(), fetchMeter(fwd),
+                .withTreatment(buildTreatment(Instructions.popVlan(), oltDsMeter,
                                               fetchWriteMetadata(fwd), Instructions.transition(QQ_TABLE)));
 
         //match: in port (nni) and s-tag
@@ -716,8 +726,7 @@
                 .makePermanent()
                 .withPriority(fwd.priority())
                 .withSelector(innerSelector)
-                .withTreatment(buildTreatment(fetchMeter(fwd),
-                                              writeMetadataIncludingOnlyTp(fwd), output));
+                .withTreatment(buildTreatment(onuDsMeter, writeMetadataIncludingOnlyTp(fwd), output));
 
         applyRules(fwd, inner, outer);
     }
@@ -755,6 +764,9 @@
                                               Pair<Instruction, Instruction> innerPair,
                                               Pair<Instruction, Instruction> outerPair, Boolean noneValueVlanStatus) {
 
+        Instruction onuUsMeter = fetchMeterById(fwd, fwd.annotations().value(UPSTREAM_ONU));
+        Instruction oltUsMeter = fetchMeterById(fwd, fwd.annotations().value(UPSTREAM_OLT));
+
         List<Instruction> setVlanPcps = findL2Instructions(L2ModificationInstruction.L2SubType.VLAN_PCP,
                                                            fwd.treatment().allInstructions());
 
@@ -768,11 +780,11 @@
 
         TrafficTreatment innerTreatment;
         if (noneValueVlanStatus) {
-            innerTreatment = buildTreatment(innerPair.getLeft(), innerPair.getRight(), fetchMeter(fwd),
+            innerTreatment = buildTreatment(innerPair.getLeft(), innerPair.getRight(), onuUsMeter,
                                             fetchWriteMetadata(fwd), innerPbitSet,
                                             Instructions.transition(QQ_TABLE));
         } else {
-            innerTreatment = buildTreatment(innerPair.getRight(), fetchMeter(fwd), fetchWriteMetadata(fwd),
+            innerTreatment = buildTreatment(innerPair.getRight(), onuUsMeter, fetchWriteMetadata(fwd),
                                             innerPbitSet, Instructions.transition(QQ_TABLE));
         }
 
@@ -803,8 +815,8 @@
                 .makePermanent()
                 .withPriority(fwd.priority())
                 .withTreatment(buildTreatment(outerPair.getLeft(), outerPair.getRight(),
-                                              fetchMeter(fwd), writeMetadataIncludingOnlyTp(fwd),
-                                              outerPbitSet, output));
+                        oltUsMeter, writeMetadataIncludingOnlyTp(fwd),
+                        outerPbitSet, output));
 
         if (innerPbitSet != null) {
             byte innerPbit = ((L2ModificationInstruction.ModVlanPcpInstruction)
@@ -821,6 +833,8 @@
                                                 Pair<Instruction, Instruction> outerPair) {
 
         log.debug("Installing upstream rules for any value vlan");
+        Instruction onuUsMeter = fetchMeterById(fwd, fwd.annotations().value(UPSTREAM_ONU));
+        Instruction oltUsMeter = fetchMeterById(fwd, fwd.annotations().value(UPSTREAM_OLT));
 
         //match: in port and any-vlan (coming from OLT app.)
         //action: write metadata, go to table 1 and meter
@@ -830,8 +844,7 @@
                 .makePermanent()
                 .withPriority(fwd.priority())
                 .withSelector(fwd.selector())
-                .withTreatment(buildTreatment(Instructions.transition(QQ_TABLE), fetchMeter(fwd),
-                                              fetchWriteMetadata(fwd)));
+                .withTreatment(buildTreatment(Instructions.transition(QQ_TABLE), onuUsMeter, fetchWriteMetadata(fwd)));
 
         //match: in port and any-vlan (coming from OLT app.)
         //action: immediate: push:QinQ, vlanId (s-tag), write metadata, meter and output
@@ -843,7 +856,7 @@
                 .withPriority(fwd.priority())
                 .withSelector(fwd.selector())
                 .withTreatment(buildTreatment(outerPair.getLeft(), outerPair.getRight(),
-                                              fetchMeter(fwd), writeMetadataIncludingOnlyTp(fwd), output));
+                        oltUsMeter, writeMetadataIncludingOnlyTp(fwd), output));
 
         applyRules(fwd, inner, outer);
     }
@@ -886,16 +899,15 @@
         return output;
     }
 
-    private Instruction fetchMeter(ForwardingObjective fwd) {
-        Instruction meter = fwd.treatment().metered();
-
-        if (meter == null) {
-            log.debug("Meter instruction is not found for the forwarding objective {}", fwd);
+    private Instruction fetchMeterById(ForwardingObjective fwd, String meterId) {
+        Optional<Instructions.MeterInstruction> meter = fwd.treatment().meters().stream()
+                .filter(meterInstruction -> meterInstruction.meterId().toString().equals(meterId)).findAny();
+        if (meter.isEmpty()) {
+            log.debug("Meter instruction is not found for the meterId: {} ", meterId);
             return null;
         }
-
-        log.debug("Meter instruction is found.");
-        return meter;
+        log.debug("Meter instruction is found for the meterId: {} ", meterId);
+        return meter.get();
     }
 
     private Instructions.MetadataInstruction fetchWriteMetadata(ForwardingObjective fwd) {
diff --git a/impl/src/main/java/org/opencord/olt/impl/Olt.java b/impl/src/main/java/org/opencord/olt/impl/Olt.java
index 70a3753..f11ac21 100644
--- a/impl/src/main/java/org/opencord/olt/impl/Olt.java
+++ b/impl/src/main/java/org/opencord/olt/impl/Olt.java
@@ -405,6 +405,7 @@
         pendingSubscribersForDevice.computeIfPresent(connectPoint.deviceId(), (id, infos) -> {
             for (SubscriberFlowInfo fi : infos) {
                 if (fi.getUniPort().equals(connectPoint.port())) {
+                    log.debug("Subscriber is already pending, {}", fi);
                     isPending.set(true);
                     break;
                 }
@@ -434,7 +435,7 @@
         public void run() {
             CompletableFuture<ObjectiveError> filterFuture = new CompletableFuture<>();
             oltFlowService.processEapolFilteringObjectives(subscriberPort,
-                                                     defaultBpId, filterFuture,
+                                                     defaultBpId, Optional.empty(), filterFuture,
                                                      VlanId.vlanId(EAPOL_DEFAULT_VLAN),
                                                      false);
             filterFuture.thenAcceptAsync(filterStatus -> {
@@ -511,14 +512,17 @@
             unprovisionVlans(uplinkPort, subscriberPort, uniTag);
 
             // remove eapol with subscriber bandwidth profile
+            Optional<String> upstreamOltBw = uniTag.getUpstreamOltBandwidthProfile() == null ?
+                    Optional.empty() : Optional.of(uniTag.getUpstreamOltBandwidthProfile());
             oltFlowService.processEapolFilteringObjectives(subscriberPort,
                                                            uniTag.getUpstreamBandwidthProfile(),
+                                                           upstreamOltBw,
                                                            null, uniTag.getPonCTag(), false);
 
             if (subscriberPort.port() != null && subscriberPort.isEnabled()) {
                 // reinstall eapol with default bandwidth profile
-                oltFlowService.processEapolFilteringObjectives(subscriberPort, defaultBpId,
-                                                               null, VlanId.vlanId(EAPOL_DEFAULT_VLAN), true);
+                oltFlowService.processEapolFilteringObjectives(subscriberPort, defaultBpId, Optional.empty(),
+                        null, VlanId.vlanId(EAPOL_DEFAULT_VLAN), true);
             } else {
                 log.debug("Port {} is no longer enabled or it's unavailable. Not "
                                   + "reprogramming default eapol flow", connectPoint);
@@ -556,8 +560,8 @@
             //wait until Eapol rule with defaultBpId is removed to install subscriber-based rules
             //install subscriber flows
             CompletableFuture<ObjectiveError> filterFuture = new CompletableFuture<>();
-            oltFlowService.processEapolFilteringObjectives(subscriberPort, defaultBpId,
-                                                           filterFuture, VlanId.vlanId(EAPOL_DEFAULT_VLAN), false);
+            oltFlowService.processEapolFilteringObjectives(subscriberPort, defaultBpId, Optional.empty(),
+                    filterFuture, VlanId.vlanId(EAPOL_DEFAULT_VLAN), false);
             filterFuture.thenAcceptAsync(filterStatus -> {
                 if (filterStatus == null) {
                     provisionUniTagInformation(uplinkPort, subscriberPort, cTag.get(), sTag.get(), tpId.get());
@@ -697,6 +701,10 @@
                 .getMeterIdFromBpMapping(deviceId, uniTag.getUpstreamBandwidthProfile());
         MeterId downstreamMeterId = oltMeterService
                 .getMeterIdFromBpMapping(deviceId, uniTag.getDownstreamBandwidthProfile());
+        MeterId upstreamOltMeterId = oltMeterService
+                .getMeterIdFromBpMapping(deviceId, uniTag.getUpstreamOltBandwidthProfile());
+        MeterId downstreamOltMeterId = oltMeterService
+                .getMeterIdFromBpMapping(deviceId, uniTag.getDownstreamOltBandwidthProfile());
 
         Optional<SubscriberFlowInfo> waitingMacSubFlowInfo =
                 getAndRemoveWaitingMacSubFlowInfoForCTag(new ConnectPoint(deviceId, subscriberPort.number()),
@@ -707,7 +715,7 @@
                     "waitingMacSubFlowInfo:{}", waitingMacSubFlowInfo.get());
             CompletableFuture<ObjectiveError> dhcpFuture = new CompletableFuture<>();
             oltFlowService.processDhcpFilteringObjectives(subscriberPort,
-                    upstreamMeterId, uniTag, false, true, Optional.of(dhcpFuture));
+                    upstreamMeterId, upstreamOltMeterId, uniTag, false, true, Optional.of(dhcpFuture));
             dhcpFuture.thenAcceptAsync(dhcpStatus -> {
                 AccessDeviceEvent.Type type;
                 if (dhcpStatus == null) {
@@ -731,16 +739,19 @@
         }
 
         ForwardingObjective.Builder upFwd =
-                oltFlowService.createUpBuilder(uplink, subscriberPort, upstreamMeterId, uniTag);
+                oltFlowService.createUpBuilder(uplink, subscriberPort, upstreamMeterId, upstreamOltMeterId, uniTag);
 
         Optional<MacAddress> macAddress = getMacAddress(deviceId, subscriberPort, uniTag);
         ForwardingObjective.Builder downFwd =
-                oltFlowService.createDownBuilder(uplink, subscriberPort, downstreamMeterId, uniTag, macAddress);
+                oltFlowService.createDownBuilder(uplink, subscriberPort, downstreamMeterId, downstreamOltMeterId,
+                        uniTag, macAddress);
 
-        oltFlowService.processIgmpFilteringObjectives(subscriberPort, upstreamMeterId, uniTag, false, true);
+        oltFlowService.processIgmpFilteringObjectives(subscriberPort, upstreamMeterId, upstreamOltMeterId, uniTag,
+                false, true);
         oltFlowService.processDhcpFilteringObjectives(subscriberPort,
-                upstreamMeterId, uniTag, false, true, Optional.empty());
-        oltFlowService.processPPPoEDFilteringObjectives(subscriberPort, upstreamMeterId, uniTag, false, true);
+                upstreamMeterId, upstreamOltMeterId, uniTag, false, true, Optional.empty());
+        oltFlowService.processPPPoEDFilteringObjectives(subscriberPort, upstreamMeterId, upstreamOltMeterId, uniTag,
+                false, true);
 
         flowObjectiveService.forward(deviceId, upFwd.remove(new ObjectiveContext() {
             @Override
@@ -885,6 +896,10 @@
                 getBandwidthProfileInformation(tagInfo.getUpstreamBandwidthProfile());
         BandwidthProfileInformation downstreamBpInfo =
                 getBandwidthProfileInformation(tagInfo.getDownstreamBandwidthProfile());
+        BandwidthProfileInformation upstreamOltBpInfo =
+                getBandwidthProfileInformation(tagInfo.getUpstreamOltBandwidthProfile());
+        BandwidthProfileInformation downstreamOltBpInfo =
+                getBandwidthProfileInformation(tagInfo.getDownstreamOltBandwidthProfile());
         if (upstreamBpInfo == null) {
             log.warn("No meter installed since no Upstream BW Profile definition found for "
                              + "ctag {} stag {} tpId {} on {}",
@@ -898,17 +913,45 @@
                      tagInfo.getTechnologyProfileId(), subscriberPort);
             return;
         }
+        if ((upstreamOltBpInfo != null && downstreamOltBpInfo == null) ||
+                (upstreamOltBpInfo == null && downstreamOltBpInfo != null)) {
+            log.warn("No meter installed since only one olt BW Profile definition found for "
+                            + "ctag {} stag {} tpId {} and Device/port: {}:{}",
+                    tagInfo.getPonCTag(), tagInfo.getPonSTag(),
+                    tagInfo.getTechnologyProfileId(), deviceId,
+                    subscriberPort);
+            return;
+        }
+
+        MeterId upOltMeterId = null;
+        MeterId downOltMeterId = null;
 
         // check for meterIds for the upstream and downstream bandwidth profiles
         MeterId upMeterId = oltMeterService
                 .getMeterIdFromBpMapping(deviceId, upstreamBpInfo.id());
         MeterId downMeterId = oltMeterService
                 .getMeterIdFromBpMapping(deviceId, downstreamBpInfo.id());
-        SubscriberFlowInfo fi = new SubscriberFlowInfo(uplinkPort, subscriberPort,
-                                                       tagInfo, downMeterId, upMeterId,
-                                                       downstreamBpInfo.id(), upstreamBpInfo.id());
 
-        if (upMeterId != null && downMeterId != null) {
+        if (upstreamOltBpInfo != null) {
+            // Multi UNI service
+            upOltMeterId = oltMeterService
+                    .getMeterIdFromBpMapping(deviceId, upstreamOltBpInfo.id());
+            downOltMeterId = oltMeterService
+                    .getMeterIdFromBpMapping(deviceId, downstreamOltBpInfo.id());
+        } else {
+            // NOT Multi UNI service
+            log.debug("OLT bandwidth profiles fields are set to ONU bandwidth profiles");
+            upstreamOltBpInfo = upstreamBpInfo;
+            downstreamOltBpInfo = downstreamBpInfo;
+            upOltMeterId = upMeterId;
+            downOltMeterId = downMeterId;
+        }
+        SubscriberFlowInfo fi = new SubscriberFlowInfo(uplinkPort, subscriberPort,
+                                                       tagInfo, downMeterId, upMeterId, downOltMeterId, upOltMeterId,
+                                                       downstreamBpInfo.id(), upstreamBpInfo.id(),
+                                                       downstreamOltBpInfo.id(), upstreamOltBpInfo.id());
+
+        if (upMeterId != null && downMeterId != null && upOltMeterId != null && downOltMeterId != null) {
             log.debug("Meters are existing for upstream {} and downstream {} on {}",
                     upstreamBpInfo.id(), downstreamBpInfo.id(), subscriberPort);
             handleSubFlowsWithMeters(fi);
@@ -925,21 +968,37 @@
                 return queue;
             });
 
+            List<BandwidthProfileInformation> bws = new ArrayList<>();
             // queue up the meters to be created
             if (upMeterId == null) {
                 log.debug("Missing meter for upstream {} on {}", upstreamBpInfo.id(), subscriberPort);
-                checkAndCreateDevMeter(deviceId, upstreamBpInfo);
+                bws.add(upstreamBpInfo);
             }
             if (downMeterId == null) {
                 log.debug("Missing meter for downstream {} on {}", downstreamBpInfo.id(), subscriberPort);
-                checkAndCreateDevMeter(deviceId, downstreamBpInfo);
+                bws.add(downstreamBpInfo);
             }
+            if (upOltMeterId == null) {
+                log.debug("Missing meter for upstreamOlt {} on {}", upstreamOltBpInfo.id(), subscriberPort);
+                bws.add(upstreamOltBpInfo);
+            }
+            if (downOltMeterId == null) {
+                log.debug("Missing meter for downstreamOlt {} on {}", downstreamOltBpInfo.id(), subscriberPort);
+                bws.add(downstreamOltBpInfo);
+            }
+            bws.stream().distinct().forEach(bw -> checkAndCreateDevMeter(deviceId, bw));
         }
     }
 
     private void checkAndCreateDevMeter(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
+        log.debug("Checking and Creating Meter with {} on {}", bwpInfo, deviceId);
+        if (bwpInfo == null) {
+            log.error("Can't create meter. Bandwidth profile is null for device : {}", deviceId);
+            return;
+        }
         //If false the meter is already being installed, skipping installation
         if (!oltMeterService.checkAndAddPendingMeter(deviceId, bwpInfo)) {
+            log.debug("Meter is already being installed on {} for {}", deviceId, bwpInfo);
             return;
         }
         createMeter(deviceId, bwpInfo);
@@ -953,52 +1012,69 @@
                                                       meterFuture);
 
         meterFuture.thenAcceptAsync(result -> {
-            BlockingQueue<SubscriberFlowInfo> queue = pendingSubscribersForDevice.get(deviceId);
-            // iterate through the subscribers on hold
-            if (queue != null) {
-                while (true) {
-                    //TODO this might return the reference and not the actual object so
-                    // it can be actually swapped underneath us.
-                    SubscriberFlowInfo fi = queue.peek();
-                    if (fi == null) {
-                        log.debug("No more subscribers pending on {}", deviceId);
-                        pendingSubscribersForDevice.replace(deviceId, queue);
-                        break;
-                    }
-                    if (result == null) {
-                        // meter install sent to device
-                        log.debug("Meter {} installed for bw {} on {}", meterId, bwpInfo, deviceId);
+            log.debug("Meter Future for {} has completed", meterId);
+            pendingSubscribersForDevice.compute(deviceId, (id, queue) -> {
+                // iterate through the subscribers on hold
+                if (queue != null && !queue.isEmpty()) {
+                    while (true) {
+                        //TODO this might return the reference and not the actual object so
+                        // it can be actually swapped underneath us.
+                        SubscriberFlowInfo fi = queue.peek();
+                        if (fi == null) {
+                            log.debug("No more subscribers pending on {}", deviceId);
+                            queue = new LinkedBlockingQueue<>();
+                            break;
+                        }
+                        if (result == null) {
+                            // meter install sent to device
+                            log.debug("Meter {} installed for bw {} on {}", meterId, bwpInfo, deviceId);
 
-                        MeterId upMeterId = oltMeterService
-                                .getMeterIdFromBpMapping(deviceId, fi.getUpBpInfo());
-                        MeterId downMeterId = oltMeterService
-                                .getMeterIdFromBpMapping(deviceId, fi.getDownBpInfo());
-                        if (upMeterId != null && downMeterId != null) {
-                            log.debug("Provisioning subscriber after meter {} " +
-                                              "installation and both meters are present " +
-                                              "upstream {} and downstream {} on {}",
-                                      meterId, upMeterId, downMeterId, fi.getUniPort());
-                            // put in the meterIds  because when fi was first
-                            // created there may or may not have been a meterId
-                            // depending on whether the meter was created or
-                            // not at that time.
-                            fi.setUpMeterId(upMeterId);
-                            fi.setDownMeterId(downMeterId);
-                            handleSubFlowsWithMeters(fi);
+                            MeterId upMeterId = oltMeterService
+                                    .getMeterIdFromBpMapping(deviceId, fi.getUpBpInfo());
+                            MeterId downMeterId = oltMeterService
+                                    .getMeterIdFromBpMapping(deviceId, fi.getDownBpInfo());
+                            MeterId upOltMeterId = oltMeterService
+                                    .getMeterIdFromBpMapping(deviceId, fi.getUpOltBpInfo());
+                            MeterId downOltMeterId = oltMeterService
+                                    .getMeterIdFromBpMapping(deviceId, fi.getDownOltBpInfo());
+                            if (upMeterId != null && downMeterId != null &&
+                                    upOltMeterId != null && downOltMeterId != null) {
+                                log.debug("Provisioning subscriber after meter {} " +
+                                                  "installation and all meters are present " +
+                                                  "upstream {} , downstream {} , oltUpstream {} " +
+                                                  "and oltDownstream {} on {}",
+                                          meterId, upMeterId, downMeterId, upOltMeterId,
+                                          downOltMeterId, fi.getUniPort());
+                                // put in the meterIds  because when fi was first
+                                // created there may or may not have been a meterId
+                                // depending on whether the meter was created or
+                                // not at that time.
+                                fi.setUpMeterId(upMeterId);
+                                fi.setDownMeterId(downMeterId);
+                                fi.setUpOltMeterId(upOltMeterId);
+                                fi.setDownOltMeterId(downOltMeterId);
+                                handleSubFlowsWithMeters(fi);
+                                queue.remove(fi);
+                            } else {
+                                log.debug("Not all meters for {} are yet installed up {}, " +
+                                                 "down {}, oltUp {}, oltDown {}", fi, upMeterId,
+                                         downMeterId, upOltMeterId, downOltMeterId);
+                            }
+                            oltMeterService.removeFromPendingMeters(deviceId, bwpInfo);
+                        } else {
+                            // meter install failed
+                            log.error("Addition of subscriber {} on {} failed due to meter " +
+                                              "{} with result {}", fi, fi.getUniPort(), meterId, result);
+                            oltMeterService.removeFromPendingMeters(deviceId, bwpInfo);
                             queue.remove(fi);
                         }
-                        oltMeterService.removeFromPendingMeters(deviceId, bwpInfo);
-                    } else {
-                        // meter install failed
-                        log.error("Addition of subscriber {} on {} failed due to meter " +
-                                          "{} with result {}", fi, fi.getUniPort(), meterId, result);
-                        queue.remove(fi);
-                        oltMeterService.removeFromPendingMeters(deviceId, bwpInfo);
                     }
+                } else {
+                    log.info("No pending subscribers on {}", deviceId);
+                    queue = new LinkedBlockingQueue<>();
                 }
-            } else {
-                log.info("No pending subscribers on {}", deviceId);
-            }
+                return queue;
+            });
         });
 
     }
@@ -1027,7 +1103,8 @@
 
                 CompletableFuture<ObjectiveError> dhcpFuture = new CompletableFuture<>();
                 oltFlowService.processDhcpFilteringObjectives(subscriberFlowInfo.getUniPort(),
-                        subscriberFlowInfo.getUpId(), tagInfo, true, true, Optional.of(dhcpFuture));
+                        subscriberFlowInfo.getUpId(), subscriberFlowInfo.getUpOltId(),
+                        tagInfo, true, true, Optional.of(dhcpFuture));
                 dhcpFuture.thenAcceptAsync(dhcpStatus -> {
                     if (dhcpStatus != null) {
                         log.error("Dhcp Objective failed for {}: {}", subscriberFlowInfo, dhcpStatus);
@@ -1063,8 +1140,8 @@
         CompletableFuture<ObjectiveError> downFuture = new CompletableFuture<>();
 
         ForwardingObjective.Builder upFwd =
-                oltFlowService.createUpBuilder(subscriberFlowInfo.getNniPort(), uniPort,
-                                               subscriberFlowInfo.getUpId(), subscriberFlowInfo.getTagInfo());
+                oltFlowService.createUpBuilder(subscriberFlowInfo.getNniPort(), uniPort, subscriberFlowInfo.getUpId(),
+                        subscriberFlowInfo.getUpOltId(), subscriberFlowInfo.getTagInfo());
         flowObjectiveService.forward(subscriberFlowInfo.getDevId(), upFwd.add(new ObjectiveContext() {
             @Override
             public void onSuccess(Objective objective) {
@@ -1080,7 +1157,8 @@
 
         ForwardingObjective.Builder downFwd =
                 oltFlowService.createDownBuilder(subscriberFlowInfo.getNniPort(), uniPort,
-                        subscriberFlowInfo.getDownId(), subscriberFlowInfo.getTagInfo(), macAddress);
+                        subscriberFlowInfo.getDownId(), subscriberFlowInfo.getDownOltId(),
+                        subscriberFlowInfo.getTagInfo(), macAddress);
         flowObjectiveService.forward(subscriberFlowInfo.getDevId(), downFwd.add(new ObjectiveContext() {
             @Override
             public void onSuccess(Objective objective) {
@@ -1106,20 +1184,23 @@
                 type = AccessDeviceEvent.Type.SUBSCRIBER_UNI_TAG_REGISTRATION_FAILED;
             } else {
                 log.debug("Upstream and downstream data plane flows are installed successfully on {}", uniPort);
+                Optional<String> upstreamOltBw = tagInfo.getUpstreamOltBandwidthProfile() == null ?
+                        Optional.empty() : Optional.of(tagInfo.getUpstreamOltBandwidthProfile());
                 oltFlowService.processEapolFilteringObjectives(uniPort, tagInfo.getUpstreamBandwidthProfile(),
-                                                               null, tagInfo.getPonCTag(), true);
-
+                                                               upstreamOltBw, null,
+                        tagInfo.getPonCTag(), true);
 
                 if (!tagInfo.getEnableMacLearning()) {
                     oltFlowService.processDhcpFilteringObjectives(uniPort, subscriberFlowInfo.getUpId(),
-                                                                  tagInfo, true, true, Optional.empty());
+                            subscriberFlowInfo.getUpOltId(), tagInfo, true, true, Optional.empty());
                 }
 
                 oltFlowService.processIgmpFilteringObjectives(uniPort, subscriberFlowInfo.getUpId(),
-                                                              tagInfo, true, true);
+                        subscriberFlowInfo.getUpOltId(), tagInfo, true, true);
 
                 oltFlowService.processPPPoEDFilteringObjectives(uniPort, subscriberFlowInfo.getUpId(),
-                                                                tagInfo, true, true);
+                        subscriberFlowInfo.getUpOltId(), tagInfo, true, true);
+
                 updateProgrammedSubscriber(uniPort, tagInfo, true);
             }
             post(new AccessDeviceEvent(type, subscriberFlowInfo.getDevId(), uniPort.port(),
@@ -1228,8 +1309,8 @@
                     AccessDevicePort port = new AccessDevicePort(p, AccessDevicePort.Type.UNI);
                     if (!programmedSubs.containsKey(new ConnectPoint(dev.id(), p.number()))) {
                         log.info("Creating Eapol on {}", port);
-                        oltFlowService.processEapolFilteringObjectives(port, defaultBpId, null,
-                                                                       VlanId.vlanId(EAPOL_DEFAULT_VLAN), true);
+                        oltFlowService.processEapolFilteringObjectives(port, defaultBpId, Optional.empty(),
+                                null, VlanId.vlanId(EAPOL_DEFAULT_VLAN), true);
                     } else {
                         log.debug("Subscriber Eapol on {} is already provisioned, not installing default", port);
                     }
@@ -1465,7 +1546,7 @@
 
                             if (port.isEnabled() && !port.number().equals(PortNumber.LOCAL)) {
                                 log.info("eapol will be sent for port added {}", port);
-                                oltFlowService.processEapolFilteringObjectives(port, defaultBpId,
+                                oltFlowService.processEapolFilteringObjectives(port, defaultBpId, Optional.empty(),
                                                                                null,
                                                                                VlanId.vlanId(EAPOL_DEFAULT_VLAN),
                                                                                true);
@@ -1487,9 +1568,8 @@
                             if (uniTagInformationSet == null || uniTagInformationSet.isEmpty()) {
                                 log.info("No subscriber provisioned on port {} in PORT_REMOVED event, " +
                                                  "removing default EAPOL flow", port);
-                                oltFlowService.processEapolFilteringObjectives(port, defaultBpId, null,
-                                                                               VlanId.vlanId(EAPOL_DEFAULT_VLAN),
-                                                                               false);
+                                oltFlowService.processEapolFilteringObjectives(port, defaultBpId, Optional.empty(),
+                                        null, VlanId.vlanId(EAPOL_DEFAULT_VLAN), false);
                             } else {
                                 removeSubscriber(port);
                             }
@@ -1516,17 +1596,17 @@
                             if (!port.number().equals(PortNumber.LOCAL)) {
                                 log.info("eapol will be {} updated for {} with default vlan {}",
                                          (port.isEnabled()) ? "added" : "removed", port, EAPOL_DEFAULT_VLAN);
-                                oltFlowService.processEapolFilteringObjectives(port, defaultBpId, null,
-                                                                               VlanId.vlanId(EAPOL_DEFAULT_VLAN),
-                                                                               port.isEnabled());
+                                oltFlowService.processEapolFilteringObjectives(port, defaultBpId, Optional.empty(),
+                                        null, VlanId.vlanId(EAPOL_DEFAULT_VLAN), port.isEnabled());
                             }
                         } else {
                             log.info("eapol will be {} updated for {}", (port.isEnabled()) ? "added" : "removed",
                                      port);
                             for (UniTagInformation uniTag : uniTagInformationSet) {
                                 oltFlowService.processEapolFilteringObjectives(port,
-                                        uniTag.getUpstreamBandwidthProfile(), null,
-                                        uniTag.getPonCTag(), port.isEnabled());
+                                        uniTag.getUpstreamBandwidthProfile(),
+                                        Optional.of(uniTag.getUpstreamOltBandwidthProfile()),
+                                        null, uniTag.getPonCTag(), port.isEnabled());
                             }
                         }
                         if (port.isEnabled()) {
diff --git a/impl/src/main/java/org/opencord/olt/impl/OltFlowService.java b/impl/src/main/java/org/opencord/olt/impl/OltFlowService.java
index 466d363..1868421 100644
--- a/impl/src/main/java/org/opencord/olt/impl/OltFlowService.java
+++ b/impl/src/main/java/org/opencord/olt/impl/OltFlowService.java
@@ -27,7 +27,9 @@
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.mastership.MastershipService;
+import org.onosproject.net.Annotations;
 import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DeviceService;
@@ -66,8 +68,11 @@
 import org.osgi.service.component.annotations.ReferencePolicy;
 import org.slf4j.Logger;
 
+import java.util.Arrays;
 import java.util.Dictionary;
+import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.Properties;
 import java.util.concurrent.BlockingQueue;
@@ -271,6 +276,7 @@
     @Override
     public void processDhcpFilteringObjectives(AccessDevicePort port,
                                                MeterId upstreamMeterId,
+                                               MeterId upstreamOltMeterId,
                                                UniTagInformation tagInformation,
                                                boolean install,
                                                boolean upstream,
@@ -306,8 +312,8 @@
             byte protocol = IPv4.PROTOCOL_UDP;
 
             addDhcpFilteringObjectives(port, udpSrc, udpDst, ethType,
-                    upstreamMeterId, techProfileId, protocol, cTag, unitagMatch,
-                                       vlanPcp, upstream, install, dhcpFuture);
+                    upstreamMeterId, upstreamOltMeterId, techProfileId, protocol, cTag, unitagMatch,
+                    vlanPcp, upstream, install, dhcpFuture);
         }
 
         if (enableDhcpV6) {
@@ -318,14 +324,14 @@
             byte protocol = IPv6.PROTOCOL_UDP;
 
             addDhcpFilteringObjectives(port, udpSrc, udpDst, ethType,
-                    upstreamMeterId, techProfileId, protocol, cTag, unitagMatch,
-                                       vlanPcp, upstream, install, dhcpFuture);
+                    upstreamMeterId, upstreamOltMeterId, techProfileId, protocol, cTag, unitagMatch,
+                    vlanPcp, upstream, install, dhcpFuture);
         }
     }
 
     private void addDhcpFilteringObjectives(AccessDevicePort port, int udpSrc, int udpDst,
-                                            EthType ethType, MeterId upstreamMeterId, int techProfileId, byte protocol,
-                                            VlanId cTag, VlanId unitagMatch,
+                                            EthType ethType, MeterId upstreamMeterId, MeterId upstreamOltMeterId,
+                                            int techProfileId, byte protocol, VlanId cTag, VlanId unitagMatch,
                                             Byte vlanPcp, boolean upstream,
                                             boolean install, Optional<CompletableFuture<ObjectiveError>> dhcpFuture) {
 
@@ -337,7 +343,7 @@
         }
 
         if (techProfileId != NONE_TP_ID) {
-            treatmentBuilder.writeMetadata(createTechProfValueForWm(unitagMatch, techProfileId), 0);
+            treatmentBuilder.writeMetadata(createTechProfValueForWm(unitagMatch, techProfileId, upstreamOltMeterId), 0);
         }
 
         FilteringObjective.Builder dhcpUpstreamBuilder = (install ? builder.permit() : builder.deny())
@@ -389,6 +395,7 @@
     @Override
     public void processPPPoEDFilteringObjectives(AccessDevicePort port,
                                                  MeterId upstreamMeterId,
+                                                 MeterId upstreamOltMeterId,
                                                  UniTagInformation tagInformation,
                                                  boolean install,
                                                  boolean upstream) {
@@ -420,7 +427,7 @@
         }
 
         if (techProfileId != NONE_TP_ID) {
-            treatmentBuilder.writeMetadata(createTechProfValueForWm(cTag, techProfileId), 0);
+            treatmentBuilder.writeMetadata(createTechProfValueForWm(cTag, techProfileId, upstreamOltMeterId), 0);
         }
 
         DefaultFilteringObjective.Builder pppoedBuilder = (install ? builder.permit() : builder.deny())
@@ -459,6 +466,7 @@
     @Override
     public void processIgmpFilteringObjectives(AccessDevicePort port,
                                                MeterId upstreamMeterId,
+                                               MeterId upstreamOltMeterId,
                                                UniTagInformation tagInformation,
                                                boolean install,
                                                boolean upstream) {
@@ -484,7 +492,7 @@
 
             if (tagInformation.getTechnologyProfileId() != NONE_TP_ID) {
                 treatmentBuilder.writeMetadata(createTechProfValueForWm(null,
-                        tagInformation.getTechnologyProfileId()), 0);
+                        tagInformation.getTechnologyProfileId(), upstreamOltMeterId), 0);
             }
 
 
@@ -532,7 +540,7 @@
     }
 
     @Override
-    public void processEapolFilteringObjectives(AccessDevicePort port, String bpId,
+    public void processEapolFilteringObjectives(AccessDevicePort port, String bpId, Optional<String> oltBpId,
                                                 CompletableFuture<ObjectiveError> filterFuture,
                                                 VlanId vlanId, boolean install) {
 
@@ -546,6 +554,12 @@
         }
         log.info("Processing EAPOL with Bandwidth profile {} on {}", bpId, port);
         BandwidthProfileInformation bpInfo = getBandwidthProfileInformation(bpId);
+        BandwidthProfileInformation oltBpInfo;
+        if (oltBpId.isPresent()) {
+            oltBpInfo = getBandwidthProfileInformation(oltBpId.get());
+        } else {
+            oltBpInfo = bpInfo;
+        }
         if (bpInfo == null) {
             log.warn("Bandwidth profile {} is not found. Authentication flow"
                     + " will not be installed on {}", bpId, port);
@@ -558,19 +572,22 @@
         ConnectPoint cp = new ConnectPoint(port.deviceId(), port.number());
         DefaultFilteringObjective.Builder filterBuilder = DefaultFilteringObjective.builder();
         TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder();
-        CompletableFuture<Object> meterFuture = new CompletableFuture<>();
         // check if meter exists and create it only for an install
         final MeterId meterId = oltMeterService.getMeterIdFromBpMapping(port.deviceId(), bpInfo.id());
-        log.info("Meter id {} for Bandwidth profile {} associated to EAPOL on {}",
-                meterId, bpInfo.id(), port.deviceId());
-        if (meterId == null) {
+        MeterId oltMeterId = null;
+        if (oltBpId.isPresent()) {
+            oltMeterId = oltBpId.map(id -> oltMeterService.getMeterIdFromBpMapping(port.deviceId(), id)).orElse(null);
+        }
+        log.info("Meter id {} for Bandwidth profile {} and OLT meter id {} for OLT Bandwidth profile {} " +
+                        "associated to EAPOL on {}", meterId, bpInfo.id(), oltMeterId, oltBpId, port.deviceId());
+        if (meterId == null || (oltBpId.isPresent() && oltMeterId == null)) {
             if (install) {
                 log.debug("Need to install meter for EAPOL with bwp {} on {}", bpInfo.id(), port);
                 SubscriberFlowInfo fi = new SubscriberFlowInfo(null, port,
-                                                               new UniTagInformation.Builder()
-                                                                       .setPonCTag(vlanId).build(),
-                                                               null, null,
-                                                               null, bpInfo.id());
+                                                            new UniTagInformation.Builder()
+                                                                    .setPonCTag(vlanId).build(),
+                                                        null, meterId, null, oltMeterId,
+                                                    null, bpInfo.id(), null, oltBpInfo.id());
                 pendingEapolForDevice.compute(port.deviceId(), (id, queue) -> {
                     if (queue == null) {
                         queue = new LinkedBlockingQueue<>();
@@ -580,11 +597,14 @@
                 });
 
                 //If false the meter is already being installed, skipping installation
-                if (!oltMeterService.checkAndAddPendingMeter(port.deviceId(), bpInfo)) {
+                if (!oltMeterService.checkAndAddPendingMeter(port.deviceId(), bpInfo) &&
+                        !oltMeterService.checkAndAddPendingMeter(port.deviceId(), oltBpInfo)) {
                     return;
                 }
-                MeterId innerMeterId = oltMeterService.createMeter(port.deviceId(), bpInfo, meterFuture);
-                fi.setUpMeterId(innerMeterId);
+                List<BandwidthProfileInformation> bwpList = Arrays.asList(bpInfo, oltBpInfo);
+                bwpList.stream().distinct().filter(Objects::nonNull)
+                        .forEach(bwp -> createMeterAndProceedEapol(port, bwp, filterFuture, install,
+                        cp, filterBuilder, treatmentBuilder));
             } else {
                 // this case should not happen as the request to remove an eapol
                 // flow should mean that the flow points to a meter that exists.
@@ -593,54 +613,75 @@
                 log.warn("Unknown meter id for bp {}, still proceeding with "
                         + "delete of eapol flow on {}", bpInfo.id(), port);
                 SubscriberFlowInfo fi = new SubscriberFlowInfo(null, port,
-                                                               new UniTagInformation.Builder()
-                                                                       .setPonCTag(vlanId).build(),
-                                                               null, meterId,
-                                                               null, bpInfo.id());
-                handleEapol(filterFuture, install, cp, filterBuilder, treatmentBuilder, fi, meterId);
+                        new UniTagInformation.Builder().setPonCTag(vlanId).build(),
+                        null, meterId, null, oltMeterId, null,
+                        bpInfo.id(), null, oltBpInfo.id());
+                handleEapol(filterFuture, install, cp, filterBuilder, treatmentBuilder, fi, meterId, oltMeterId);
             }
         } else {
             log.debug("Meter {} was previously created for bp {} on {}", meterId, bpInfo.id(), port);
             SubscriberFlowInfo fi = new SubscriberFlowInfo(null, port,
-                                                           new UniTagInformation.Builder()
-                                                                   .setPonCTag(vlanId).build(),
-                                                           null, meterId,
-                                                           null, bpInfo.id());
-            handleEapol(filterFuture, install, cp, filterBuilder, treatmentBuilder, fi, meterId);
+                    new UniTagInformation.Builder().setPonCTag(vlanId).build(),
+                    null, meterId, null, oltMeterId, null,
+                    bpInfo.id(), null, oltBpInfo.id());
+            handleEapol(filterFuture, install, cp, filterBuilder, treatmentBuilder, fi, meterId, oltMeterId);
             //No need for the future, meter is present.
             return;
         }
-        meterFuture.thenAcceptAsync(result -> {
+    }
+
+    private void createMeterAndProceedEapol(AccessDevicePort port, BandwidthProfileInformation bwpInfo,
+                                            CompletableFuture<ObjectiveError> filterFuture,
+                                            boolean install, ConnectPoint cp,
+                                            DefaultFilteringObjective.Builder filterBuilder,
+                                            TrafficTreatment.Builder treatmentBuilder) {
+        CompletableFuture<Object> meterFuture = new CompletableFuture<>();
+        MeterId meterId = oltMeterService.createMeter(port.deviceId(), bwpInfo, meterFuture);
+        DeviceId deviceId = port.deviceId();
+        meterFuture.thenAccept(result -> {
             //for each pending eapol flow we check if the meter is there.
-            BlockingQueue<SubscriberFlowInfo> queue = pendingEapolForDevice.get(port.deviceId());
-            if (queue != null) {
-                while (true) {
-                    SubscriberFlowInfo fi = queue.remove();
-                    if (fi == null) {
-                        pendingEapolForDevice.replace(port.deviceId(), queue);
-                        break;
-                    }
-                    //TODO this might return the reference and not the actual object
-                    // so it can be actually swapped underneath us.
-                    log.debug("handing pending eapol on {} for {}", fi.getUniPort(), fi);
-                    if (result == null) {
-                        MeterId mId = oltMeterService
-                                .getMeterIdFromBpMapping(port.deviceId(), fi.getUpBpInfo());
-                        if (mId != null) {
-                            log.debug("Meter installation completed for subscriber on {}, " +
-                                            "handling EAPOL trap flow", port);
-                            handleEapol(filterFuture, install, cp, filterBuilder, treatmentBuilder, fi, mId);
+            pendingEapolForDevice.compute(deviceId, (id, queue) -> {
+                if (queue != null && !queue.isEmpty()) {
+                    while (true) {
+                        //TODO this might return the reference and not the actual object
+                        // so it can be actually swapped underneath us.
+                        SubscriberFlowInfo fi = queue.peek();
+                        if (fi == null) {
+                            log.debug("No more subscribers eapol flows on {}", deviceId);
+                            queue = new LinkedBlockingQueue<>();
+                            break;
                         }
-                    } else {
-                        log.warn("Meter installation error while sending EAPOL trap flow to {}. " +
-                                         "Result {} and MeterId {}", port, result,
-                                meterId);
+                        log.debug("handing pending eapol on {} for {}", fi.getUniPort(), fi);
+                        if (result == null) {
+                            MeterId mId = oltMeterService
+                                    .getMeterIdFromBpMapping(port.deviceId(), fi.getUpBpInfo());
+                            MeterId oltMeterId = oltMeterService
+                                    .getMeterIdFromBpMapping(port.deviceId(), fi.getUpOltBpInfo());
+                            if (mId != null && oltMeterId != null) {
+                                log.debug("Meter installation completed for subscriber on {}, " +
+                                                  "handling EAPOL trap flow", port);
+                                fi.setUpMeterId(mId);
+                                fi.setUpOltMeterId(oltMeterId);
+                                handleEapol(filterFuture, install, cp, filterBuilder, treatmentBuilder, fi,
+                                            mId, oltMeterId);
+                                queue.remove(fi);
+                            } else {
+                                log.debug("Not all meters for {} are yet installed for EAPOL meterID {}, " +
+                                                  "oltMeterId {}", fi, meterId, oltMeterId);
+                            }
+                        } else {
+                            log.warn("Meter installation error while sending EAPOL trap flow to {}. " +
+                                             "Result {} and MeterId {}", port, result, meterId);
+                            queue.remove(fi);
+                        }
+                        oltMeterService.removeFromPendingMeters(port.deviceId(), bwpInfo);
                     }
-                    oltMeterService.removeFromPendingMeters(port.deviceId(), bpInfo);
+                } else {
+                    log.info("No pending EAPOLs on {}", port.deviceId());
+                    queue = new LinkedBlockingQueue<>();
                 }
-            } else {
-                log.info("No pending EAPOLs on {}", port.deviceId());
-            }
+                return queue;
+            });
         });
     }
 
@@ -648,7 +689,7 @@
                              boolean install, ConnectPoint cp,
                              DefaultFilteringObjective.Builder filterBuilder,
                              TrafficTreatment.Builder treatmentBuilder,
-                             SubscriberFlowInfo fi, MeterId mId) {
+                             SubscriberFlowInfo fi, MeterId mId, MeterId oltMeterId) {
         log.info("Meter {} for {} on {} exists. {} EAPOL trap flow",
                  mId, fi.getUpBpInfo(), fi.getUniPort(),
                  (install) ? "Installing" : "Removing");
@@ -664,7 +705,7 @@
                 .withMeta(treatmentBuilder
                                   .writeMetadata(createTechProfValueForWm(
                                           fi.getTagInfo().getPonCTag(),
-                                          techProfileId), 0)
+                                          techProfileId, oltMeterId), 0)
                                   .setOutput(PortNumber.CONTROLLER)
                                   .pushVlan()
                                   .setVlanId(fi.getTagInfo().getPonCTag())
@@ -707,9 +748,9 @@
         log.info("{} flows for NNI port {}",
                  install ? "Adding" : "Removing", nniPort);
         processLldpFilteringObjective(nniPort, install);
-        processDhcpFilteringObjectives(nniPort, null, null, install, false, Optional.empty());
-        processIgmpFilteringObjectives(nniPort, null, null, install, false);
-        processPPPoEDFilteringObjectives(nniPort, null, null, install, false);
+        processDhcpFilteringObjectives(nniPort, null, null, null, install, false, Optional.empty());
+        processIgmpFilteringObjectives(nniPort, null, null, null, install, false);
+        processPPPoEDFilteringObjectives(nniPort, null, null, null, install, false);
     }
 
 
@@ -765,13 +806,15 @@
                         upstream ? uplinkPort.number() : subscriberPort.number()), 0)
                 .build();
 
-        return createForwardingObjectiveBuilder(selector, treatment, MIN_PRIORITY);
+        return createForwardingObjectiveBuilder(selector, treatment, MIN_PRIORITY,
+                DefaultAnnotations.builder().build());
     }
 
     @Override
     public ForwardingObjective.Builder createUpBuilder(AccessDevicePort uplinkPort,
                                                        AccessDevicePort subscriberPort,
                                                        MeterId upstreamMeterId,
+                                                       MeterId upstreamOltMeterId,
                                                        UniTagInformation uniTagInformation) {
 
         TrafficSelector selector = DefaultTrafficSelector.builder()
@@ -801,17 +844,26 @@
                 .writeMetadata(createMetadata(uniTagInformation.getPonCTag(),
                         uniTagInformation.getTechnologyProfileId(), uplinkPort.number()), 0L);
 
+        DefaultAnnotations.Builder annotationBuilder = DefaultAnnotations.builder();
+
         if (upstreamMeterId != null) {
             treatmentBuilder.meter(upstreamMeterId);
+            annotationBuilder.set(UPSTREAM_ONU, upstreamMeterId.toString());
+        }
+        if (upstreamOltMeterId != null) {
+            treatmentBuilder.meter(upstreamOltMeterId);
+            annotationBuilder.set(UPSTREAM_OLT, upstreamOltMeterId.toString());
         }
 
-        return createForwardingObjectiveBuilder(selector, treatmentBuilder.build(), MIN_PRIORITY);
+        return createForwardingObjectiveBuilder(selector, treatmentBuilder.build(), MIN_PRIORITY,
+                annotationBuilder.build());
     }
 
     @Override
     public ForwardingObjective.Builder createDownBuilder(AccessDevicePort uplinkPort,
                                                          AccessDevicePort subscriberPort,
                                                          MeterId downstreamMeterId,
+                                                         MeterId downstreamOltMeterId,
                                                          UniTagInformation tagInformation,
                                                          Optional<MacAddress> macAddress) {
 
@@ -854,11 +906,20 @@
             treatmentBuilder.setVlanId(tagInformation.getUniTagMatch());
         }
 
+        DefaultAnnotations.Builder annotationBuilder = DefaultAnnotations.builder();
+
         if (downstreamMeterId != null) {
             treatmentBuilder.meter(downstreamMeterId);
+            annotationBuilder.set(DOWNSTREAM_ONU, downstreamMeterId.toString());
         }
 
-        return createForwardingObjectiveBuilder(selectorBuilder.build(), treatmentBuilder.build(), MIN_PRIORITY);
+        if (downstreamOltMeterId != null) {
+            treatmentBuilder.meter(downstreamOltMeterId);
+            annotationBuilder.set(DOWNSTREAM_OLT, downstreamOltMeterId.toString());
+        }
+
+        return createForwardingObjectiveBuilder(selectorBuilder.build(), treatmentBuilder.build(), MIN_PRIORITY,
+                annotationBuilder.build());
     }
 
     @Override
@@ -868,12 +929,14 @@
 
     private DefaultForwardingObjective.Builder createForwardingObjectiveBuilder(TrafficSelector selector,
                                                                                 TrafficTreatment treatment,
-                                                                                Integer priority) {
+                                                                                Integer priority,
+                                                                                Annotations annotations) {
         return DefaultForwardingObjective.builder()
                 .withFlag(ForwardingObjective.Flag.VERSATILE)
                 .withPriority(priority)
                 .makePermanent()
                 .withSelector(selector)
+                .withAnnotations(annotations)
                 .fromApp(appId)
                 .withTreatment(treatment);
     }
@@ -882,15 +945,24 @@
      * Returns the write metadata value including tech profile reference and innerVlan.
      * For param cVlan, null can be sent
      *
-     * @param cVlan         c (customer) tag of one subscriber
-     * @param techProfileId tech profile id of one subscriber
+     * @param cVlan                 c (customer) tag of one subscriber
+     * @param techProfileId         tech profile id of one subscriber
+     * @param upstreamOltMeterId    upstream meter id for OLT device.
      * @return the write metadata value including tech profile reference and innerVlan
      */
-    private Long createTechProfValueForWm(VlanId cVlan, int techProfileId) {
+    private Long createTechProfValueForWm(VlanId cVlan, int techProfileId, MeterId upstreamOltMeterId) {
+        Long writeMetadata;
+
         if (cVlan == null || VlanId.NONE.equals(cVlan)) {
-            return (long) techProfileId << 32;
+            writeMetadata = (long) techProfileId << 32;
+        } else {
+            writeMetadata = ((long) (cVlan.id()) << 48 | (long) techProfileId << 32);
         }
-        return ((long) (cVlan.id()) << 48 | (long) techProfileId << 32);
+        if (upstreamOltMeterId == null) {
+            return writeMetadata;
+        } else {
+            return writeMetadata | upstreamOltMeterId.id();
+        }
     }
 
     private BandwidthProfileInformation getBandwidthProfileInformation(String bandwidthProfile) {
diff --git a/impl/src/main/java/org/opencord/olt/impl/OltMeterService.java b/impl/src/main/java/org/opencord/olt/impl/OltMeterService.java
index 59aed0e..ab603b1 100644
--- a/impl/src/main/java/org/opencord/olt/impl/OltMeterService.java
+++ b/impl/src/main/java/org/opencord/olt/impl/OltMeterService.java
@@ -182,6 +182,15 @@
 
     @Override
     public MeterId getMeterIdFromBpMapping(DeviceId deviceId, String bandwidthProfile) {
+        if (bandwidthProfile == null) {
+            log.warn("Bandwidth Profile requested is null");
+            return null;
+        }
+        if (bpInfoToMeter.get(bandwidthProfile) == null) {
+            log.warn("Bandwidth Profile '{}' is not present in the map",
+                     bandwidthProfile);
+            return null;
+        }
         if (bpInfoToMeter.get(bandwidthProfile).value().isEmpty()) {
             log.warn("Bandwidth Profile '{}' is not currently mapped to a meter",
                     bandwidthProfile);
@@ -282,6 +291,10 @@
 
     @Override
     public synchronized boolean checkAndAddPendingMeter(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
+        if (bwpInfo == null) {
+            log.debug("Bandwidth profile is null for device: {}", deviceId);
+            return false;
+        }
         if (pendingMeters.containsKey(deviceId)
                 && pendingMeters.get(deviceId).contains(bwpInfo)) {
             log.debug("Meter is already pending on {} with bp {}",
diff --git a/impl/src/main/java/org/opencord/olt/impl/OsgiPropertyConstants.java b/impl/src/main/java/org/opencord/olt/impl/OsgiPropertyConstants.java
index 1db37e5..0e82f37 100644
--- a/impl/src/main/java/org/opencord/olt/impl/OsgiPropertyConstants.java
+++ b/impl/src/main/java/org/opencord/olt/impl/OsgiPropertyConstants.java
@@ -62,4 +62,9 @@
 
     public static final String REQUIRED_DRIVERS_PROPERTY_DELAY = "requiredDriversPropertyDelay";
     public static final int REQUIRED_DRIVERS_PROPERTY_DELAY_DEFAULT = 5;
+
+    public static final String UPSTREAM_ONU = "upstreamOnu";
+    public static final String UPSTREAM_OLT = "upstreamOlt";
+    public static final String DOWNSTREAM_ONU = "downstreamOnu";
+    public static final String DOWNSTREAM_OLT = "downstreamOlt";
 }
diff --git a/impl/src/main/java/org/opencord/olt/impl/SubscriberFlowInfo.java b/impl/src/main/java/org/opencord/olt/impl/SubscriberFlowInfo.java
index 444f45f..225e48f 100644
--- a/impl/src/main/java/org/opencord/olt/impl/SubscriberFlowInfo.java
+++ b/impl/src/main/java/org/opencord/olt/impl/SubscriberFlowInfo.java
@@ -32,30 +32,44 @@
     private final UniTagInformation tagInfo;
     private MeterId downId;
     private MeterId upId;
+    private MeterId downOltId;
+    private MeterId upOltId;
     private final String downBpInfo;
     private final String upBpInfo;
+    private final String downOltBpInfo;
+    private final String upOltBpInfo;
 
     /**
      * Builds the mapper of information.
-     * @param nniPort the nni port
-     * @param uniPort the uni port
-     * @param tagInfo the tag info
-     * @param downId the downstream meter id
-     * @param upId the upstream meter id
-     * @param downBpInfo the downstream bandwidth profile
-     * @param upBpInfo the upstream bandwidth profile
+     * @param nniPort       the nni port
+     * @param uniPort       the uni port
+     * @param tagInfo       the tag info
+     * @param downId        the downstream meter id
+     * @param upId          the upstream meter id
+     * @param downOltId     the downstream meter id of OLT device
+     * @param upOltId       the upstream meter id of OLT device
+     * @param downBpInfo    the downstream bandwidth profile
+     * @param upBpInfo      the upstream bandwidth profile
+     * @param downOltBpInfo the downstream bandwidth profile of OLT device
+     * @param upOltBpInfo   the upstream bandwidth profile of OLT device
      */
     SubscriberFlowInfo(AccessDevicePort nniPort, AccessDevicePort uniPort,
                        UniTagInformation tagInfo, MeterId downId, MeterId upId,
-                       String downBpInfo, String upBpInfo) {
+                       MeterId downOltId, MeterId upOltId,
+                       String downBpInfo, String upBpInfo,
+                       String downOltBpInfo, String upOltBpInfo) {
         this.devId = uniPort.deviceId();
         this.nniPort = nniPort;
         this.uniPort = uniPort;
         this.tagInfo = tagInfo;
         this.downId = downId;
         this.upId = upId;
+        this.downOltId = downOltId;
+        this.upOltId = upOltId;
         this.downBpInfo = downBpInfo;
         this.upBpInfo = upBpInfo;
+        this.downOltBpInfo = downOltBpInfo;
+        this.upOltBpInfo = upOltBpInfo;
     }
 
     /**
@@ -113,6 +127,24 @@
     }
 
     /**
+     * Gets the downstream meter id of this subscriber and flow information of OLT device.
+     *
+     * @return downstream olt meter id
+     */
+    MeterId getDownOltId() {
+        return downOltId;
+    }
+
+    /**
+     * Gets the upstream meter id of this subscriber and flow information of OLT device.
+     *
+     * @return upstream olt meter id
+     */
+    MeterId getUpOltId() {
+        return upOltId;
+    }
+
+    /**
      * Gets the downstream bandwidth profile of this subscriber and flow information.
      *
      * @return downstream bandwidth profile
@@ -131,7 +163,26 @@
     }
 
     /**
+     * Gets the downstream bandwidth profile of this subscriber and flow information of OLT device.
+     *
+     * @return downstream OLT bandwidth profile
+     */
+    String getDownOltBpInfo() {
+        return downOltBpInfo;
+    }
+
+    /**
+     * Gets the upstream bandwidth profile of this subscriber and flow information of OLT device.
+     *
+     * @return upstream OLT bandwidth profile.
+     */
+    String getUpOltBpInfo() {
+        return upOltBpInfo;
+    }
+
+    /**
      * Sets the upstream meter id.
+     *
      * @param upMeterId the upstream meter id
      */
     void setUpMeterId(MeterId upMeterId) {
@@ -140,12 +191,31 @@
 
     /**
      * Sets the downstream meter id.
+     *
      * @param downMeterId the downstream meter id
      */
     void setDownMeterId(MeterId downMeterId) {
         this.downId = downMeterId;
     }
 
+    /**
+     * Sets the upstream meter id of OLT.
+     *
+     * @param upOltMeterId the upstream meter id of OLT
+     */
+    void setUpOltMeterId(MeterId upOltMeterId) {
+        this.upOltId = upOltMeterId;
+    }
+
+    /**
+     * Sets the downstream meter id of OLT.
+     *
+     * @param downOltMeterId the downstream meter id of OLT
+     */
+    void setDownOltMeterId(MeterId downOltMeterId) {
+        this.downOltId = downOltMeterId;
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) {
@@ -160,12 +230,14 @@
                 uniPort.equals(flowInfo.uniPort) &&
                 tagInfo.equals(flowInfo.tagInfo) &&
                 downBpInfo.equals(flowInfo.downBpInfo) &&
-                upBpInfo.equals(flowInfo.upBpInfo);
+                upBpInfo.equals(flowInfo.upBpInfo) &&
+                Objects.equals(downOltBpInfo, flowInfo.downOltBpInfo) &&
+                Objects.equals(upOltBpInfo, flowInfo.upOltBpInfo);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(devId, nniPort, uniPort, tagInfo, downBpInfo, upBpInfo);
+        return Objects.hash(devId, nniPort, uniPort, tagInfo, downBpInfo, upBpInfo, downOltBpInfo, upOltBpInfo);
     }
 
     @Override
@@ -177,8 +249,12 @@
                 .add("tagInfo", tagInfo)
                 .add("downId", downId)
                 .add("upId", upId)
+                .add("downOltId", downOltId)
+                .add("upOltId", upOltId)
                 .add("downBpInfo", downBpInfo)
                 .add("upBpInfo", upBpInfo)
+                .add("downOltBpInfo", downOltBpInfo)
+                .add("upOltBpInfo", upOltBpInfo)
                 .toString();
     }
 }
diff --git a/impl/src/main/java/org/opencord/olt/internalapi/AccessDeviceFlowService.java b/impl/src/main/java/org/opencord/olt/internalapi/AccessDeviceFlowService.java
index 0012e28..9e46782 100644
--- a/impl/src/main/java/org/opencord/olt/internalapi/AccessDeviceFlowService.java
+++ b/impl/src/main/java/org/opencord/olt/internalapi/AccessDeviceFlowService.java
@@ -35,18 +35,22 @@
     /**
      * Provisions or removes trap-to-controller DHCP packets.
      *
-     * @param port            the uni port for which this trap flow is designated
-     * @param upstreamMeterId the upstream meter id that includes the upstream
-     *                        bandwidth profile values such as PIR,CIR. If no meter id needs to be referenced,
-     *                        null can be sent
-     * @param tagInformation  the uni tag (ctag, stag) information
-     * @param install         true to install the flow, false to remove the flow
-     * @param upstream        true if trapped packets are flowing upstream towards
-     *                        server, false if packets are flowing downstream towards client
-     * @param dhcpFuture      gets result of dhcp objective when complete
+     * @param port               the uni port for which this trap flow is designated
+     * @param upstreamMeterId    the upstream meter id that includes the upstream
+     *                           bandwidth profile values such as PIR,CIR. If no meter id needs to be referenced,
+     *                           null can be sent
+     * @param upstreamOltMeterId the upstream meter id of OLT device that includes the upstream
+     *                           bandwidth profile values such as PIR,CIR. If no meter id needs to be referenced,
+     *                           null can be sent
+     * @param tagInformation     the uni tag (ctag, stag) information
+     * @param install            true to install the flow, false to remove the flow
+     * @param upstream           true if trapped packets are flowing upstream towards
+     *                           server, false if packets are flowing downstream towards client
+     * @param dhcpFuture         gets result of dhcp objective when complete
      */
     void processDhcpFilteringObjectives(AccessDevicePort port,
                                         MeterId upstreamMeterId,
+                                        MeterId upstreamOltMeterId,
                                         UniTagInformation tagInformation,
                                         boolean install,
                                         boolean upstream,
@@ -55,14 +59,16 @@
     /**
      * Trap igmp packets to the controller.
      *
-     * @param port            Uni Port number
-     * @param upstreamMeterId upstream meter id that represents the upstream bandwidth profile
-     * @param tagInformation  the uni tag information of the subscriber
-     * @param install         the indicator to install or to remove the flow
-     * @param upstream        determines the direction of the flow
+     * @param port                  Uni Port number
+     * @param upstreamMeterId       upstream meter id that represents the upstream bandwidth profile
+     * @param upstreamOltMeterId    upstream meter id of OLT device that represents the upstream bandwidth profile
+     * @param tagInformation        the uni tag information of the subscriber
+     * @param install               the indicator to install or to remove the flow
+     * @param upstream              determines the direction of the flow
      */
     void processIgmpFilteringObjectives(AccessDevicePort port,
                                         MeterId upstreamMeterId,
+                                        MeterId upstreamOltMeterId,
                                         UniTagInformation tagInformation,
                                         boolean install,
                                         boolean upstream);
@@ -72,29 +78,39 @@
      *
      * @param port         the port for which this trap flow is designated
      * @param bpId         bandwidth profile id to add the related meter to the flow
+     * @param oltBpId      bandwidth profile id of OLT device to add the related meter to the flow
      * @param filterFuture completable future for this filtering objective operation
      * @param vlanId       the default or customer tag for a subscriber
      * @param install      true to install the flow, false to remove the flow
      */
-    void processEapolFilteringObjectives(AccessDevicePort port, String bpId,
+    void processEapolFilteringObjectives(AccessDevicePort port,
+                                         String bpId,
+                                         Optional<String> oltBpId,
                                          CompletableFuture<ObjectiveError> filterFuture,
-                                         VlanId vlanId, boolean install);
+                                         VlanId vlanId,
+                                         boolean install);
 
     /**
      * Trap PPPoE discovery packets to the controller.
      *
-     * @param port            the uni port for which this trap flow is designated
-     * @param upstreamMeterId the upstream meter id that includes the upstream
-     *                        bandwidth profile values such as PIR,CIR. If no meter id needs to be referenced,
-     *                        null can be sent
-     * @param tagInformation  the uni tag (ctag, stag) information
-     * @param install         true to install the flow, false to remove the flow
-     * @param upstream        true if trapped packets are flowing upstream towards
-     *                        server, false if packets are flowing downstream towards client
+     * @param port               the uni port for which this trap flow is designated
+     * @param upstreamMeterId    the upstream meter id that includes the upstream
+     *                           bandwidth profile values such as PIR,CIR. If no meter id needs to be referenced,
+     *                           null can be sent
+     * @param upstreamOltMeterId the upstream meter id of OLT device that includes the upstream
+     *                           bandwidth profile values such as PIR,CIR. If no meter id needs to be referenced,
+     *                           null can be sent
+     * @param tagInformation     the uni tag (ctag, stag) information
+     * @param install            true to install the flow, false to remove the flow
+     * @param upstream           true if trapped packets are flowing upstream towards
+     *                           server, false if packets are flowing downstream towards client
      **/
     void processPPPoEDFilteringObjectives(AccessDevicePort port,
-                                          MeterId upstreamMeterId, UniTagInformation tagInformation,
-                                          boolean install, boolean upstream);
+                                          MeterId upstreamMeterId,
+                                          MeterId upstreamOltMeterId,
+                                          UniTagInformation tagInformation,
+                                          boolean install,
+                                          boolean upstream);
 
     /**
      * Trap lldp packets to the controller.
@@ -135,31 +151,35 @@
      * Creates a ForwardingObjective builder for the upstream flows.
      * The treatment will contain push action
      *
-     * @param uplinkPort the nni port
-     * @param subscriberPort the uni port
-     * @param upstreamMeterId the meter id that is assigned to upstream flows
-     * @param uniTagInformation the uni tag information
+     * @param uplinkPort         the nni port
+     * @param subscriberPort     the uni port
+     * @param upstreamMeterId    the meter id that is assigned to upstream flows
+     * @param upstreamOltMeterId the meter id that is assigned to upstream flows for OLT device
+     * @param uniTagInformation  the uni tag information
      * @return ForwardingObjective.Builder
      */
     ForwardingObjective.Builder createUpBuilder(AccessDevicePort uplinkPort,
                                                 AccessDevicePort subscriberPort,
                                                 MeterId upstreamMeterId,
+                                                MeterId upstreamOltMeterId,
                                                 UniTagInformation uniTagInformation);
 
     /**
      * Creates a ForwardingObjective builder for the downstream flows.
      * The treatment will contain pop action
      *
-     * @param uplinkPort the nni port
-     * @param subscriberPort the uni port
-     * @param downstreamMeterId the meter id that is assigned to downstream flows
-     * @param tagInformation the uni tag information
-     * @param macAddress the mac address
+     * @param uplinkPort           the nni port
+     * @param subscriberPort       the uni port
+     * @param downstreamMeterId    the meter id that is assigned to downstream flows
+     * @param downstreamOltMeterId the meter id that is assigned to downstream flows
+     * @param tagInformation       the uni tag information
+     * @param macAddress           the mac address
      * @return ForwardingObjective.Builder
      */
     ForwardingObjective.Builder createDownBuilder(AccessDevicePort uplinkPort,
                                                   AccessDevicePort subscriberPort,
                                                   MeterId downstreamMeterId,
+                                                  MeterId downstreamOltMeterId,
                                                   UniTagInformation tagInformation,
                                                   Optional<MacAddress> macAddress);
 
diff --git a/impl/src/test/java/org/opencord/olt/impl/OltFlowTest.java b/impl/src/test/java/org/opencord/olt/impl/OltFlowTest.java
index 7ae3c8c..752e44d 100644
--- a/impl/src/test/java/org/opencord/olt/impl/OltFlowTest.java
+++ b/impl/src/test/java/org/opencord/olt/impl/OltFlowTest.java
@@ -139,55 +139,55 @@
         oltFlowService.flowObjectiveService.clearQueue();
         // ensure upstream dhcp traps can be added and removed
         oltFlowService.processDhcpFilteringObjectives(uniPort1,
-                usMeterId, uniTagInfo,
+                usMeterId, null, uniTagInfo,
                 true, true, Optional.empty());
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 1;
         oltFlowService.processDhcpFilteringObjectives(uniPort1,
-                usMeterId, uniTagInfo,
+                usMeterId, null, uniTagInfo,
                 false, true, Optional.empty());
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 2;
 
         // Ensure upstream flow has no pcp unless properly specified.
         oltFlowService.processDhcpFilteringObjectives(uniPort2,
-                usMeterId, uniTagInfoNoPcp,
+                usMeterId, null, uniTagInfoNoPcp,
                 true, true, Optional.empty());
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 3;
 
         // ensure upstream flows are not added if uniTagInfo is missing dhcp requirement
         oltFlowService.processDhcpFilteringObjectives(uniPort1,
-                usMeterId, uniTagInfoNoDhcpNoIgmp,
+                usMeterId, null, uniTagInfoNoDhcpNoIgmp,
                 true, true, Optional.empty());
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 3;
 
         // ensure downstream traps don't succeed without global config for nni ports
         oltFlowService.processDhcpFilteringObjectives(nniPort,
-                null, null,
+                null, null, null,
                 true, false, Optional.empty());
         oltFlowService.processDhcpFilteringObjectives(nniPort,
-                null, null,
+                null, null, null,
                 false, false, Optional.empty());
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 3;
         // do global config for nni ports and now it should succeed
         oltFlowService.enableDhcpOnNni = true;
         oltFlowService.processDhcpFilteringObjectives(nniPort,
-                null, null,
+                null, null, null,
                 true, false, Optional.empty());
         oltFlowService.processDhcpFilteringObjectives(nniPort,
-                null, null,
+                null, null, null,
                 false, false, Optional.empty());
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 5;
 
         // turn on DHCPv6 and we should get 2 flows
         oltFlowService.enableDhcpV6 = true;
         oltFlowService.processDhcpFilteringObjectives(uniPort1,
-                usMeterId, uniTagInfo,
+                usMeterId, null, uniTagInfo,
                 true, true, Optional.empty());
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 7;
 
         // turn off DHCPv4 and it's only v6
         oltFlowService.enableDhcpV4 = false;
         oltFlowService.processDhcpFilteringObjectives(uniPort1,
-                usMeterId, uniTagInfo,
+                usMeterId, null, uniTagInfo,
                 true, true, Optional.empty());
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 8;
 
@@ -204,28 +204,28 @@
         // ensure pppoed traps are not added if global config is off.
         oltFlowService.enablePppoe = false;
         oltFlowService.processPPPoEDFilteringObjectives(uniPort1,
-                usMeterId, uniTagInfo,
+                usMeterId, null, uniTagInfo,
                 true, true);
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 0;
 
         // ensure upstream pppoed traps can be added and removed
         oltFlowService.enablePppoe = true;
         oltFlowService.processPPPoEDFilteringObjectives(uniPort1,
-                usMeterId, uniTagInfo,
+                usMeterId, null, uniTagInfo,
                 true, true);
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 1;
         oltFlowService.processPPPoEDFilteringObjectives(uniPort1,
-                usMeterId, uniTagInfo,
+                usMeterId, null, uniTagInfo,
                 false, true);
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 2;
 
         // ensure downstream pppoed traps can be added and removed
         oltFlowService.processPPPoEDFilteringObjectives(nniPort,
-                null, null,
+                null, null, null,
                 true, false);
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 3;
         oltFlowService.processPPPoEDFilteringObjectives(nniPort,
-                null, null,
+                null, null, null,
                 false, false);
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 4;
 
@@ -239,30 +239,30 @@
 
         // ensure igmp flows can be added and removed
         oltFlowService.processIgmpFilteringObjectives(uniPort1,
-                usMeterId, uniTagInfo,
+                usMeterId, null, uniTagInfo,
                 true, true);
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 1;
         oltFlowService.processIgmpFilteringObjectives(uniPort1, usMeterId,
-                uniTagInfo,
+                null, uniTagInfo,
                 false, true);
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 2;
 
         // ensure igmp flow is not added if uniTag has no igmp requirement
         oltFlowService.processIgmpFilteringObjectives(uniPort1,
-                usMeterId, uniTagInfoNoDhcpNoIgmp,
+                usMeterId, null, uniTagInfoNoDhcpNoIgmp,
                 true, true);
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 2;
 
         //ensure igmp flow on NNI fails without global setting
         oltFlowService.processIgmpFilteringObjectives(nniPort,
-                null, null,
+                null, null, null,
                 true, false);
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 2;
 
         // igmp trap on NNI should succeed with global config
         oltFlowService.enableIgmpOnNni = true;
         oltFlowService.processIgmpFilteringObjectives(nniPort,
-                null, null,
+                null, null, null,
                 true, false);
         assert oltFlowService.flowObjectiveService.getPendingFlowObjectives().size() == 3;
         // cleanup
@@ -277,12 +277,12 @@
 
         //will install
         oltFlowService.processEapolFilteringObjectives(uniPort1,
-                uniTagInfo.getUpstreamBandwidthProfile(), new CompletableFuture<>(),
+                uniTagInfo.getUpstreamBandwidthProfile(), Optional.empty(), new CompletableFuture<>(),
                 uniTagInfo.getUniTagMatch(), true);
 
         //bp profile doesn't exist
         oltFlowService.processEapolFilteringObjectives(uniPort1,
-                uniTagInfo.getDownstreamBandwidthProfile(), new CompletableFuture<>(),
+                uniTagInfo.getDownstreamBandwidthProfile(), Optional.empty(), new CompletableFuture<>(),
                 uniTagInfo.getUniTagMatch(), true);
     }
 
@@ -309,14 +309,14 @@
     @Test
     public void testUpBuilder() {
         ForwardingObjective objective =
-                oltFlowService.createUpBuilder(nniPort, uniPort1, usMeterId, uniTagInfo).add();
+                oltFlowService.createUpBuilder(nniPort, uniPort1, usMeterId, usMeterId, uniTagInfo).add();
         checkObjective(objective, true);
     }
 
     @Test
     public void testDownBuilder() {
         ForwardingObjective objective =
-                oltFlowService.createDownBuilder(nniPort, uniPort1, dsMeterId, uniTagInfo,
+                oltFlowService.createDownBuilder(nniPort, uniPort1, dsMeterId, dsMeterId, uniTagInfo,
                         Optional.of(macAddress)).remove();
         checkObjective(objective, false);
     }
diff --git a/impl/src/test/java/org/opencord/olt/impl/TestBase.java b/impl/src/test/java/org/opencord/olt/impl/TestBase.java
index 47507fb..87db5d1 100644
--- a/impl/src/test/java/org/opencord/olt/impl/TestBase.java
+++ b/impl/src/test/java/org/opencord/olt/impl/TestBase.java
@@ -54,6 +54,8 @@
     protected static final DeviceId DEVICE_ID_1 = DeviceId.deviceId(OLT_DEV_ID);
     protected MeterId usMeterId = MeterId.meterId(1);
     protected MeterId dsMeterId = MeterId.meterId(2);
+    protected MeterId usOltMeterId = MeterId.meterId(3);
+    protected MeterId dsOltMeterId = MeterId.meterId(4);
     protected String usBpId = "HSIA-US";
     protected String dsBpId = "HSIA-DS";
     protected DefaultApplicationId appId = new DefaultApplicationId(1, "OltServices");
