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 c98b69c..2a8c6e8 100644
--- a/app/src/main/java/org/opencord/olt/impl/Olt.java
+++ b/app/src/main/java/org/opencord/olt/impl/Olt.java
@@ -684,10 +684,14 @@
     private void provisionUniTagList(ConnectPoint connectPoint, PortNumber uplinkPort,
                                      SubscriberAndDeviceInformation sub) {
 
-        log.debug("Provisioning vlans for subscriber {} on dev/port: {}", sub, connectPoint);
+        log.debug("Provisioning vlans for subscriber on dev/port: {}", connectPoint.toString());
+        if (log.isTraceEnabled()) {
+            log.trace("Subscriber informations {}", sub);
+        }
 
         if (sub.uniTagList() == null || sub.uniTagList().isEmpty()) {
-            log.warn("Unitaglist doesn't exist for the subscriber {}", sub.id());
+            log.warn("Unitaglist doesn't exist for the subscriber {} on dev/port {}",
+                    sub.id(), connectPoint.toString());
             return;
         }
 
@@ -744,7 +748,8 @@
     private void handleSubscriberFlows(DeviceId deviceId, PortNumber uplinkPort, PortNumber subscriberPort,
                                        UniTagInformation tagInfo) {
 
-        log.debug("Provisioning vlan-based flows for the uniTagInformation {}", tagInfo);
+        log.debug("Provisioning vlan-based flows for the uniTagInformation {} on dev/port {}/{}",
+                tagInfo, deviceId, subscriberPort);
 
         Port port = deviceService.getPort(deviceId, subscriberPort);
 
@@ -763,7 +768,7 @@
                 getBandwidthProfileInformation(tagInfo.getDownstreamBandwidthProfile());
         if (upstreamBpInfo == null) {
             log.warn("No meter installed since no Upstream BW Profile definition found for "
-                             + "ctag {} stag {} tpId {} and Device/port: {}:{}",
+                             + "ctag {} stag {} tpId {} and dev/port: {}/{}",
                      tagInfo.getPonCTag(), tagInfo.getPonSTag(),
                      tagInfo.getTechnologyProfileId(), deviceId,
                      subscriberPort);
@@ -771,7 +776,7 @@
         }
         if (downstreamBpInfo == null) {
             log.warn("No meter installed since no Downstream BW Profile definition found for "
-                             + "ctag {} stag {} tpId {} and Device/port: {}:{}",
+                             + "ctag {} stag {} tpId {} and dev/port: {}/{}",
                      tagInfo.getPonCTag(), tagInfo.getPonSTag(),
                      tagInfo.getTechnologyProfileId(), deviceId,
                      subscriberPort);
@@ -788,22 +793,22 @@
                                                        downstreamBpInfo.id(), upstreamBpInfo.id());
 
         if (upMeterId != null && downMeterId != null) {
-            log.debug("Meters are existing for upstream {} and downstream {}",
-                     upstreamBpInfo.id(), downstreamBpInfo.id());
+            log.debug("Meters are existing for upstream {} and downstream {} on dev/port {}/{}",
+                     upstreamBpInfo.id(), downstreamBpInfo.id(), deviceId, subscriberPort);
             handleSubFlowsWithMeters(fi);
         } else {
-            log.debug("Adding {} to pending subs", fi);
+            log.debug("Adding {} on {}/{} to pending subs", fi, deviceId, subscriberPort);
             // one or both meters are not ready. It's possible they are in the process of being
             // created for other subscribers that share the same bandwidth profile.
             pendingSubscribers.add(fi);
 
             // queue up the meters to be created
             if (upMeterId == null) {
-                log.debug("Missing meter for upstream {}", upstreamBpInfo.id());
+                log.debug("Missing meter for upstream {} on {}/{}", upstreamBpInfo.id(), deviceId, subscriberPort);
                 checkAndCreateDevMeter(deviceId, upstreamBpInfo);
             }
             if (downMeterId == null) {
-                log.debug("Missing meter for downstream {}", downstreamBpInfo.id());
+                log.debug("Missing meter for downstream {} on {}/{}", downstreamBpInfo.id(), deviceId, subscriberPort);
                 checkAndCreateDevMeter(deviceId, downstreamBpInfo);
             }
         }
@@ -817,7 +822,7 @@
     }
 
     private void createMeter(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
-        log.debug("Creating Meter with {} on {} for subscriber", bwpInfo, deviceId);
+        log.debug("Creating Meter with {} on {}", bwpInfo, deviceId);
         CompletableFuture<Object> meterFuture = new CompletableFuture<>();
 
         MeterId meterId = oltMeterService.createMeter(deviceId, bwpInfo,
@@ -837,10 +842,10 @@
                     MeterId downMeterId = oltMeterService
                             .getMeterIdFromBpMapping(deviceId, fi.getDownBpInfo());
                     if (upMeterId != null && downMeterId != null) {
-                        log.debug("Provisioning subscriber after meter {}" +
+                        log.debug("Provisioning subscriber after meter {} " +
                                           "installation and both meters are present " +
-                                          "upstream {} and downstream {}",
-                                  meterId, upMeterId, downMeterId);
+                                          "upstream {} and downstream {} on {}/{}",
+                                  meterId, upMeterId, downMeterId, deviceId, 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
@@ -853,8 +858,8 @@
                     oltMeterService.removeFromPendingMeters(deviceId, bwpInfo);
                 } else {
                     // meter install failed
-                    log.error("Addition of subscriber {} failed due to meter " +
-                                      "{} with result {}", fi, meterId, result);
+                    log.error("Addition of subscriber {} on {}/{} failed due to meter " +
+                                      "{} with result {}", fi, deviceId, fi.getUniPort(), meterId, result);
                     subsIterator.remove();
                     oltMeterService.removeFromPendingMeters(deviceId, bwpInfo);
                 }
@@ -868,7 +873,8 @@
      * @param subscriberFlowInfo relevant information for subscriber
      */
     private void handleSubFlowsWithMeters(SubscriberFlowInfo subscriberFlowInfo) {
-        log.debug("Provisioning subscriber flows based on {}", subscriberFlowInfo);
+        log.debug("Provisioning subscriber flows on {}/{} based on {}",
+                  subscriberFlowInfo.getDevId(), subscriberFlowInfo.getUniPort(), subscriberFlowInfo);
         UniTagInformation tagInfo = subscriberFlowInfo.getTagInfo();
         CompletableFuture<ObjectiveError> upFuture = new CompletableFuture<>();
         CompletableFuture<ObjectiveError> downFuture = new CompletableFuture<>();
@@ -879,7 +885,8 @@
         flowObjectiveService.forward(subscriberFlowInfo.getDevId(), upFwd.add(new ObjectiveContext() {
             @Override
             public void onSuccess(Objective objective) {
-                log.debug("Upstream flow installed successfully {}", subscriberFlowInfo);
+                log.debug("Upstream HSIA flow {} installed successfully on {}/{}",
+                        subscriberFlowInfo, subscriberFlowInfo.getDevId(), subscriberFlowInfo.getUniPort());
                 upFuture.complete(null);
             }
 
@@ -895,7 +902,8 @@
         flowObjectiveService.forward(subscriberFlowInfo.getDevId(), downFwd.add(new ObjectiveContext() {
             @Override
             public void onSuccess(Objective objective) {
-                log.debug("Downstream flow installed successfully {}", subscriberFlowInfo);
+                log.debug("Downstream HSIA flow {} installed successfully on {}/{}",
+                        subscriberFlowInfo, subscriberFlowInfo.getDevId(), subscriberFlowInfo.getUniPort());
                 downFuture.complete(null);
             }
 
@@ -908,20 +916,18 @@
         upFuture.thenAcceptBothAsync(downFuture, (upStatus, downStatus) -> {
             AccessDeviceEvent.Type type = AccessDeviceEvent.Type.SUBSCRIBER_UNI_TAG_REGISTERED;
             if (downStatus != null) {
-                log.error("Flow with innervlan {} and outerVlan {} on device {} " +
-                                  "on port {} failed downstream installation: {}",
+                log.error("Flow with innervlan {} and outerVlan {} on {}/{} failed downstream installation: {}",
                           tagInfo.getPonCTag(), tagInfo.getPonSTag(), subscriberFlowInfo.getDevId(),
                           subscriberFlowInfo.getUniPort(), downStatus);
                 type = AccessDeviceEvent.Type.SUBSCRIBER_UNI_TAG_REGISTRATION_FAILED;
             } else if (upStatus != null) {
-                log.error("Flow with innerVlan {} and outerVlan {} on device {} " +
-                                  "on port {} failed upstream installation: {}",
+                log.error("Flow with innervlan {} and outerVlan {} on {}/{} failed downstream installation: {}",
                           tagInfo.getPonCTag(), tagInfo.getPonSTag(), subscriberFlowInfo.getDevId(),
                           subscriberFlowInfo.getUniPort(), upStatus);
                 type = AccessDeviceEvent.Type.SUBSCRIBER_UNI_TAG_REGISTRATION_FAILED;
             } else {
                 log.debug("Upstream and downstream data plane flows are installed successfully " +
-                                 "for {}", subscriberFlowInfo);
+                                 "for {}/{}", subscriberFlowInfo.getDevId(), subscriberFlowInfo.getUniPort());
                 oltFlowService.processEapolFilteringObjectives(subscriberFlowInfo.getDevId(),
                                                                subscriberFlowInfo.getUniPort(),
                                                                tagInfo.getUpstreamBandwidthProfile(),
@@ -960,17 +966,17 @@
      */
     private Optional<UniTagInformation> getUniTagInformation(ConnectPoint cp, VlanId innerVlan, VlanId outerVlan,
                                                              int tpId) {
-        log.info("Getting uni tag information for cp: {}, innerVlan: {}, outerVlan: {}, tpId: {}", cp, innerVlan,
-                 outerVlan, tpId);
+        log.debug("Getting uni tag information for cp: {}, innerVlan: {}, outerVlan: {}, tpId: {}",
+                cp.toString(), innerVlan, outerVlan, tpId);
         SubscriberAndDeviceInformation subInfo = getSubscriber(cp);
         if (subInfo == null) {
-            log.warn("Subscriber information doesn't exist for the connect point {}", cp);
+            log.warn("Subscriber information doesn't exist for the connect point {}", cp.toString());
             return Optional.empty();
         }
 
         List<UniTagInformation> uniTagList = subInfo.uniTagList();
         if (uniTagList == null) {
-            log.warn("Uni tag list is not found for the subscriber {}", subInfo.id());
+            log.warn("Uni tag list is not found for the subscriber {} on {}", subInfo.id(), cp.toString());
             return Optional.empty();
         }
 
@@ -984,8 +990,8 @@
         }
 
         if (service == null) {
-            log.warn("SADIS doesn't include the service with ponCtag {} ponStag {} and tpId {}",
-                     innerVlan, outerVlan, tpId);
+            log.warn("SADIS doesn't include the service with ponCtag {} ponStag {} and tpId {} on {}",
+                     innerVlan, outerVlan, tpId, cp.toString());
             return Optional.empty();
         }
 
@@ -1011,12 +1017,12 @@
                 }
                 if (isUniPort(dev, p)) {
                     if (!programmedSubs.containsKey(new ConnectPoint(dev.id(), p.number()))) {
-                        log.info("Creating Eapol for the uni {}", p);
+                        log.info("Creating Eapol on {}/{}", dev.id(), p.number());
                         oltFlowService.processEapolFilteringObjectives(dev.id(), p.number(), defaultBpId, null,
                                                                        VlanId.vlanId(EAPOL_DEFAULT_VLAN), true);
                     } else {
-                        log.debug("Subscriber Eapol for UNI port {} on device {} is already " +
-                                          "provisioned, not installing default", p.number(), dev.id());
+                        log.debug("Subscriber Eapol on {}/{} is already provisioned, not installing default",
+                                dev.id(), p.number());
                     }
                 } else {
                     oltFlowService.processNniFilteringObjectives(dev.id(), p.number(), true);
@@ -1163,7 +1169,7 @@
                     return;
                 }
 
-                log.debug("OLT got {} event for {} {}", eventType, event.subject(), event.port());
+                log.debug("OLT got {} event for {}/{}", eventType, event.subject(), event.port());
 
                 if (getOltInfo(dev) == null) {
                     // it's possible that we got an event for a previously
@@ -1188,7 +1194,7 @@
                             post(new AccessDeviceEvent(AccessDeviceEvent.Type.UNI_ADDED, devId, port));
 
                             if (port.isEnabled() && !port.number().equals(PortNumber.LOCAL)) {
-                                log.info("eapol will be sent for port added {}", port);
+                                log.info("eapol will be sent for port added {}/{}", devId, port);
                                 oltFlowService.processEapolFilteringObjectives(devId, port.number(), defaultBpId,
                                                                                null,
                                                                                VlanId.vlanId(EAPOL_DEFAULT_VLAN),
@@ -1209,8 +1215,8 @@
                             Collection<? extends UniTagInformation> uniTagInformationSet =
                                     programmedSubs.get(new ConnectPoint(port.element().id(), port.number())).value();
                             if (uniTagInformationSet == null || uniTagInformationSet.isEmpty()) {
-                                log.info("No subscriber provisioned on port {} in PORT_REMOVED event, " +
-                                                 "removing default EAPOL flow", port);
+                                log.info("No subscriber provisioned on port {}/{} in PORT_REMOVED event, " +
+                                                 "removing default EAPOL flow", devId, port);
                                 oltFlowService.processEapolFilteringObjectives(devId, port.number(), defaultBpId,
                                                                                null,
                                                                                VlanId.vlanId(EAPOL_DEFAULT_VLAN),
diff --git a/app/src/main/java/org/opencord/olt/impl/OltFlowService.java b/app/src/main/java/org/opencord/olt/impl/OltFlowService.java
index 6ae705a..58344e6 100644
--- a/app/src/main/java/org/opencord/olt/impl/OltFlowService.java
+++ b/app/src/main/java/org/opencord/olt/impl/OltFlowService.java
@@ -167,7 +167,6 @@
     protected ApplicationId appId;
     protected BaseInformationService<BandwidthProfileInformation> bpService;
     protected BaseInformationService<SubscriberAndDeviceInformation> subsService;
-    private Set<ConnectPoint> pendingAddEapol = Sets.newConcurrentHashSet();
     private Set<SubscriberFlowInfo> pendingEapolForMeters = Sets.newConcurrentHashSet();;
 
     @Activate
@@ -324,14 +323,14 @@
         FilteringObjective dhcpUpstream = dhcpUpstreamBuilder.add(new ObjectiveContext() {
             @Override
             public void onSuccess(Objective objective) {
-                log.info("DHCP {} filter for device {} on port {} {}.",
+                log.info("DHCP {} filter for dev/port {}/{} {}.",
                         (ethType.equals(EthType.EtherType.IPV4.ethType())) ? V4 : V6,
                         devId, port, (install) ? INSTALLED : REMOVED);
             }
 
             @Override
             public void onError(Objective objective, ObjectiveError error) {
-                log.info("DHCP {} filter for device {} on port {} failed {} because {}",
+                log.error("DHCP {} filter for dev/port {}/{} failed {} because {}",
                         (ethType.equals(EthType.EtherType.IPV4.ethType())) ? V4 : V6,
                         devId, port, (install) ? INSTALLATION : REMOVAL,
                         error);
@@ -406,13 +405,13 @@
                 .add(new ObjectiveContext() {
                     @Override
                     public void onSuccess(Objective objective) {
-                        log.info("Igmp filter for {} on {} {}.",
+                        log.info("Igmp filter for dev/port {}/{} {}.",
                                 devId, port, (install) ? INSTALLED : REMOVED);
                     }
 
                     @Override
                     public void onError(Objective objective, ObjectiveError error) {
-                        log.info("Igmp filter for {} on {} failed {} because {}.",
+                        log.error("Igmp filter for dev/port {}/{} failed {} because {}.",
                                 devId, port, (install) ? INSTALLATION : REMOVAL,
                                 error);
                     }
@@ -433,11 +432,12 @@
             }
             return;
         }
-
+        log.info("Processing EAPOL with Bandwidth profile {} on {}/{}", bpId,
+                 devId, portNumber);
         BandwidthProfileInformation bpInfo = getBandwidthProfileInformation(bpId);
         if (bpInfo == null) {
             log.warn("Bandwidth profile {} is not found. Authentication flow"
-                    + " will not be installed", bpId);
+                    + " will not be installed on {}/{}", bpId, devId, portNumber);
             if (filterFuture != null) {
                 filterFuture.complete(ObjectiveError.BADPARAMS);
             }
@@ -445,27 +445,15 @@
         }
 
         ConnectPoint cp = new ConnectPoint(devId, portNumber);
-        if (install) {
-            boolean added = pendingAddEapol.add(cp);
-            if (!added) {
-                if (filterFuture != null) {
-                    log.warn("The eapol flow is processing for the port {}. Ignoring this request", portNumber);
-                    filterFuture.complete(null);
-                }
-                return;
-            }
-            log.info("connectPoint added to pendingAddEapol map {}", cp.toString());
-        }
-
         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(devId, bpInfo.id());
+        log.info("Meter id {} for Bandwidth profile {} associated to EAPOL on {}", meterId, bpInfo.id(), devId);
         if (meterId == null) {
             if (install) {
-                log.debug("Need to install meter for EAPOL with bwp {}", bpInfo.id());
+                log.debug("Need to install meter for EAPOL with bwp {} on dev/port {}", bpInfo.id(), cp.toString());
                 SubscriberFlowInfo fi = new SubscriberFlowInfo(devId, null, cp.port(),
                                                                new UniTagInformation.Builder()
                                                                        .setPonCTag(vlanId).build(),
@@ -486,7 +474,7 @@
                 // Nevertheless we can still delete the flow as we only need the
                 // correct 'match' to do so.
                 log.warn("Unknown meter id for bp {}, still proceeding with "
-                        + "delete of eapol flow for {}/{}", bpInfo.id(), devId, portNumber);
+                        + "delete of eapol flow for {}", bpInfo.id(), cp.toString());
                 SubscriberFlowInfo fi = new SubscriberFlowInfo(devId, null, cp.port(),
                                                                new UniTagInformation.Builder()
                                                                        .setPonCTag(vlanId).build(),
@@ -495,7 +483,7 @@
                 handleEapol(filterFuture, install, cp, filterBuilder, treatmentBuilder, fi, meterId);
             }
         } else {
-            log.debug("Meter {} was previously created for bp {}", meterId, bpInfo.id());
+            log.debug("Meter {} was previously created for bp {} on {}", meterId, bpInfo.id(), cp.toString());
             SubscriberFlowInfo fi = new SubscriberFlowInfo(devId, null, cp.port(),
                                                            new UniTagInformation.Builder()
                                                                    .setPonCTag(vlanId).build(),
@@ -507,19 +495,24 @@
         }
         meterFuture.thenAcceptAsync(result -> {
             //for each pending eapol flow we check if the meter is there.
+            //TODO possibly the iterator gets taken at time t0, while the sub is added at time t1
+            // and thus never considered
             Iterator<SubscriberFlowInfo> eapIterator = pendingEapolForMeters.iterator();
             while (eapIterator.hasNext()) {
                 SubscriberFlowInfo fi = eapIterator.next();
+                log.debug("handing pending eapol on {}/{} for {}", fi.getDevId(), fi.getUniPort(), fi);
                 if (result == null) {
                     MeterId mId = oltMeterService
                             .getMeterIdFromBpMapping(devId, fi.getUpBpInfo());
                     if (mId != null) {
+                        log.debug("Meter installation completed for subscriber on {}, handling EAPOL trap flow",
+                                cp.toString());
                         handleEapol(filterFuture, install, cp, filterBuilder, treatmentBuilder, fi, mId);
                         eapIterator.remove();
                     }
                 } else {
-                    log.warn("Meter installation error while sending eapol trap flow. " +
-                                     "Result {} and MeterId {}", result, meterId);
+                    log.warn("Meter installation error while sending EAPOL trap flow to {}. " +
+                                     "Result {} and MeterId {}", cp.toString(), result, meterId);
                     eapIterator.remove();
                 }
                 oltMeterService.removeFromPendingMeters(devId, bpInfo);
@@ -557,18 +550,17 @@
                 .add(new ObjectiveContext() {
                     @Override
                     public void onSuccess(Objective objective) {
-                        log.info("Eapol filter {} for {} on {} {} with meter {}.",
+                        log.info("Eapol filter {} for {} on {}/{} with meter {}.",
                                  objective.id(), fi.getDevId(), fi.getUniPort(),
                                  (install) ? INSTALLED : REMOVED, mId);
                         if (filterFuture != null) {
                             filterFuture.complete(null);
                         }
-                        pendingAddEapol.remove(cp);
                     }
 
                     @Override
                     public void onError(Objective objective, ObjectiveError error) {
-                        log.error("Eapol filter {} for {} on {} with meter {} " +
+                        log.error("Eapol filter {} for {}/{} with meter {} " +
                                          "failed {} because {}", objective.id(),
                                  fi.getDevId(), fi.getUniPort(), mId,
                                  (install) ? INSTALLATION : REMOVAL,
@@ -576,7 +568,6 @@
                         if (filterFuture != null) {
                             filterFuture.complete(error);
                         }
-                        pendingAddEapol.remove(cp);
                     }
                 });
         flowObjectiveService.filter(fi.getDevId(), eapol);
@@ -614,13 +605,13 @@
                 .add(new ObjectiveContext() {
                     @Override
                     public void onSuccess(Objective objective) {
-                        log.info("LLDP filter for device {} on port {} {}.",
+                        log.info("LLDP filter for dev/port {}/{} {}.",
                                 devId, port, (install) ? INSTALLED : REMOVED);
                     }
 
                     @Override
                     public void onError(Objective objective, ObjectiveError error) {
-                        log.info("LLDP filter for device {} on port {} failed {} because {}",
+                        log.error("LLDP filter for dev/port {}/{} failed {} because {}",
                                 devId, port, (install) ? INSTALLATION : REMOVAL,
                                 error);
                     }
@@ -751,8 +742,6 @@
     @Override
     public void clearDeviceState(DeviceId deviceId) {
         pendingEapolForMeters.removeIf(fi -> fi.getDevId().equals(deviceId));
-        pendingAddEapol.removeIf(connectPoint -> connectPoint.deviceId().equals(deviceId));
-
     }
 
     private DefaultForwardingObjective.Builder createForwardingObjectiveBuilder(TrafficSelector selector,
diff --git a/app/src/main/java/org/opencord/olt/impl/OltMeterService.java b/app/src/main/java/org/opencord/olt/impl/OltMeterService.java
index 478e280..d57f3c1 100644
--- a/app/src/main/java/org/opencord/olt/impl/OltMeterService.java
+++ b/app/src/main/java/org/opencord/olt/impl/OltMeterService.java
@@ -166,10 +166,10 @@
                         ImmutableMap::copyOf));
     }
 
-    void addMeterIdToBpMapping(DeviceId deviceId, MeterId meterId, String bandwidthProfile) {
+    boolean addMeterIdToBpMapping(DeviceId deviceId, MeterId meterId, String bandwidthProfile) {
         log.debug("adding bp {} to meter {} mapping for device {}",
                  bandwidthProfile, meterId, deviceId);
-        bpInfoToMeter.put(bandwidthProfile, MeterKey.key(deviceId, meterId));
+        return bpInfoToMeter.put(bandwidthProfile, MeterKey.key(deviceId, meterId));
     }
 
     @Override
@@ -185,12 +185,12 @@
                 .filter(meterKey -> meterKey.deviceId().equals(deviceId))
                 .findFirst();
         if (meterKeyForDevice.isPresent()) {
-            log.debug("Found meter {} for bandwidth profile {}",
-                    meterKeyForDevice.get().meterId(), bandwidthProfile);
+            log.debug("Found meter {} for bandwidth profile {} on {}",
+                    meterKeyForDevice.get().meterId(), bandwidthProfile, deviceId);
             return meterKeyForDevice.get().meterId();
         } else {
-            log.warn("Bandwidth Profile '{}' is not currently mapped to a meter in {}",
-                     bandwidthProfile, bpInfoToMeter.get(bandwidthProfile).value());
+            log.warn("Bandwidth Profile '{}' is not currently mapped to a meter on {} , {}",
+                     bandwidthProfile, deviceId, bpInfoToMeter.get(bandwidthProfile).value());
             return null;
         }
     }
@@ -207,7 +207,7 @@
                                CompletableFuture<Object> meterFuture) {
         log.debug("Creating meter on {} for {}", deviceId, bpInfo);
         if (bpInfo == null) {
-            log.warn("Requested bandwidth profile information is NULL");
+            log.warn("Requested bandwidth profile on {} information is NULL", deviceId);
             meterFuture.complete(ObjectiveError.BADPARAMS);
             return null;
         }
@@ -228,10 +228,16 @@
                 .withContext(new MeterContext() {
                     @Override
                     public void onSuccess(MeterRequest op) {
-                        log.debug("Meter {} is installed on the device {}",
-                                 meterIdRef.get(), deviceId);
-                        addMeterIdToBpMapping(deviceId, meterIdRef.get(), bpInfo.id());
-                        meterFuture.complete(null);
+                        log.debug("Meter {} for {} is installed on the device {}",
+                                  meterIdRef.get(), bpInfo.id(), deviceId);
+                        boolean added = addMeterIdToBpMapping(deviceId, meterIdRef.get(), bpInfo.id());
+                        if (added) {
+                            meterFuture.complete(null);
+                        } else {
+                            log.error("Failed to add Meter {} for {} on {} to the meter-bandwidth mapping",
+                                      meterIdRef.get(), bpInfo.id(), deviceId);
+                            meterFuture.complete(ObjectiveError.UNKNOWN);
+                        }
                     }
 
                     @Override
@@ -270,7 +276,7 @@
     public synchronized boolean checkAndAddPendingMeter(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
         if (pendingMeters.containsKey(deviceId)
                 && pendingMeters.get(deviceId).contains(bwpInfo)) {
-            log.debug("Meter is already pending for EAPOL on {} with bp {}",
+            log.debug("Meter is already pending on {} with bp {}",
                       deviceId, bwpInfo);
             return false;
         }
