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 fe2675e..1f3634b 100644
--- a/app/src/main/java/org/opencord/olt/impl/Olt.java
+++ b/app/src/main/java/org/opencord/olt/impl/Olt.java
@@ -83,7 +83,6 @@
 import org.opencord.olt.AccessSubscriberId;
 import org.opencord.olt.internalapi.AccessDeviceFlowService;
 import org.opencord.olt.internalapi.AccessDeviceMeterService;
-import org.opencord.olt.internalapi.DeviceBandwidthProfile;
 import org.opencord.sadis.BandwidthProfileInformation;
 import org.opencord.sadis.BaseInformationService;
 import org.opencord.sadis.SadisService;
@@ -695,28 +694,28 @@
             // queue up the meters to be created
             if (upMeterId == null) {
                 log.debug("Missing meter for upstream {}", upstreamBpInfo.id());
-                checkAndCreateDevMeter(new DeviceBandwidthProfile(deviceId, upstreamBpInfo));
+                checkAndCreateDevMeter(deviceId, upstreamBpInfo);
             }
             if (downMeterId == null) {
                 log.debug("Missing meter for downstream {}", downstreamBpInfo.id());
-                checkAndCreateDevMeter(new DeviceBandwidthProfile(deviceId, downstreamBpInfo));
+                checkAndCreateDevMeter(deviceId, downstreamBpInfo);
             }
         }
     }
-    private void checkAndCreateDevMeter(DeviceBandwidthProfile dm) {
-        if (oltMeterService.isMeterPending(dm)) {
-            log.debug("Meter is already pending {}", dm);
+    private void checkAndCreateDevMeter(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
+        if (oltMeterService.isMeterPending(deviceId, bwpInfo)) {
+            log.debug("Meter is already pending {} on device {}", bwpInfo, deviceId);
             return;
         }
-        oltMeterService.addToPendingMeters(dm);
-        createMeter(dm);
+        oltMeterService.addToPendingMeters(deviceId, bwpInfo);
+        createMeter(deviceId, bwpInfo);
     }
 
-    private void createMeter(DeviceBandwidthProfile dm) {
-        log.debug("Creating Meter {} from queue for subscriber", dm);
+    private void createMeter(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
+        log.debug("Creating Meter with {} on {} for subscriber", bwpInfo, deviceId);
         CompletableFuture<Object> meterFuture = new CompletableFuture<>();
 
-        MeterId meterId = oltMeterService.createMeter(dm.getDevId(), dm.getBwInfo(),
+        MeterId meterId = oltMeterService.createMeter(deviceId, bwpInfo,
                                                       meterFuture);
 
         meterFuture.thenAcceptAsync(result -> {
@@ -726,12 +725,12 @@
                 SubscriberFlowInfo fi = subsIterator.next();
                 if (result == null) {
                     // meter install sent to device
-                    log.debug("Meter {} installed for bw {}", meterId, dm.getBwInfo());
+                    log.debug("Meter {} installed for bw {} on {}", meterId, bwpInfo, deviceId);
 
                     MeterId upMeterId = oltMeterService
-                            .getMeterIdFromBpMapping(dm.getDevId(), fi.getUpBpInfo());
+                            .getMeterIdFromBpMapping(deviceId, fi.getUpBpInfo());
                     MeterId downMeterId = oltMeterService
-                            .getMeterIdFromBpMapping(dm.getDevId(), fi.getDownBpInfo());
+                            .getMeterIdFromBpMapping(deviceId, fi.getDownBpInfo());
                     if (upMeterId != null && downMeterId != null) {
                         log.debug("Provisioning subscriber after meter {}" +
                                           "installation and both meters are present " +
@@ -746,13 +745,13 @@
                         handleSubFlowsWithMeters(fi);
                         subsIterator.remove();
                     }
-                    oltMeterService.removeFromPendingMeters(new DeviceBandwidthProfile(dm.getDevId(), dm.getBwInfo()));
+                    oltMeterService.removeFromPendingMeters(deviceId, bwpInfo);
                 } else {
                     // meter install failed
                     log.error("Addition of subscriber {} failed due to meter " +
                                       "{} with result {}", fi, meterId, result);
                     subsIterator.remove();
-                    oltMeterService.removeFromPendingMeters(new DeviceBandwidthProfile(dm.getDevId(), dm.getBwInfo()));
+                    oltMeterService.removeFromPendingMeters(deviceId, bwpInfo);
                 }
             }
         });
@@ -1054,6 +1053,8 @@
                     // on every instance, see how it's done in the InternalDeviceListener
                     // in FlowRuleManager: no mastership check for purgeOnDisconnection
                     flowRuleService.purgeFlowRules(devId);
+                    oltFlowService.clearDeviceState(devId);
+                    oltMeterService.clearDeviceState(devId);
                     return;
                 } else if (!isLocalLeader) {
                     log.debug("Not handling event because instance is not leader for {}", devId);
@@ -1180,6 +1181,11 @@
         private void handleDeviceDisconnection(Device device, boolean sendUniEvent) {
             programmedDevices.remove(device.id());
             removeAllSubscribers(device.id());
+            //Handle case where OLT disconnects during subscriber provisioning
+            pendingSubscribers.removeIf(fi -> fi.getDevId().equals(device.id()));
+            oltFlowService.clearDeviceState(device.id());
+
+            //Complete meter and flow purge
             flowRuleService.purgeFlowRules(device.id());
             oltMeterService.clearMeters(device.id());
             post(new AccessDeviceEvent(
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 b4dca74..a53e019 100644
--- a/app/src/main/java/org/opencord/olt/impl/OltFlowService.java
+++ b/app/src/main/java/org/opencord/olt/impl/OltFlowService.java
@@ -49,7 +49,6 @@
 import org.onosproject.net.meter.MeterId;
 import org.opencord.olt.internalapi.AccessDeviceFlowService;
 import org.opencord.olt.internalapi.AccessDeviceMeterService;
-import org.opencord.olt.internalapi.DeviceBandwidthProfile;
 import org.opencord.sadis.BandwidthProfileInformation;
 import org.opencord.sadis.BaseInformationService;
 import org.opencord.sadis.SadisService;
@@ -423,7 +422,6 @@
 
         // check if meter exists and create it only for an install
         final MeterId meterId = oltMeterService.getMeterIdFromBpMapping(devId, bpInfo.id());
-        DeviceBandwidthProfile dm = new DeviceBandwidthProfile(devId, bpInfo);
         if (meterId == null) {
             if (install) {
                 log.debug("Need to install meter for EAPOL with bwp {}", bpInfo.id());
@@ -434,11 +432,12 @@
                                                                null, bpInfo.id());
                 pendingEapolForMeters.add(fi);
 
-                if (oltMeterService.isMeterPending(dm)) {
-                    log.debug("Meter {} is already pending for EAPOL", dm);
+                if (oltMeterService.isMeterPending(devId, bpInfo)) {
+                    log.debug("Meter is already pending for EAPOL on {} with bp {}",
+                              devId, bpInfo);
                     return;
                 }
-                oltMeterService.addToPendingMeters(dm);
+                oltMeterService.addToPendingMeters(devId, bpInfo);
                 MeterId innerMeterId = oltMeterService.createMeter(devId, bpInfo,
                                                                    meterFuture);
                 fi.setUpMeterId(innerMeterId);
@@ -474,7 +473,7 @@
                 SubscriberFlowInfo fi = eapIterator.next();
                 if (result == null) {
                     MeterId mId = oltMeterService
-                            .getMeterIdFromBpMapping(dm.getDevId(), fi.getUpBpInfo());
+                            .getMeterIdFromBpMapping(devId, fi.getUpBpInfo());
                     if (mId != null) {
                         handleEapol(filterFuture, install, cp, builder, treatmentBuilder, fi, mId);
                         eapIterator.remove();
@@ -484,8 +483,7 @@
                                      "Result {} and MeterId {}", result, meterId);
                     eapIterator.remove();
                 }
-                oltMeterService.removeFromPendingMeters(new DeviceBandwidthProfile(
-                        dm.getDevId(), dm.getBwInfo()));
+                oltMeterService.removeFromPendingMeters(devId, bpInfo);
             }
         });
     }
@@ -518,8 +516,8 @@
                 .add(new ObjectiveContext() {
                     @Override
                     public void onSuccess(Objective objective) {
-                        log.info("Eapol filter for {} on {} {} with meter {}.",
-                                 fi.getDevId(), fi.getUniPort(),
+                        log.info("Eapol filter {} for {} on {} {} with meter {}.",
+                                 objective.id(), fi.getDevId(), fi.getUniPort(),
                                  (install) ? INSTALLED : REMOVED, mId);
                         if (filterFuture != null) {
                             filterFuture.complete(null);
@@ -529,8 +527,8 @@
 
                     @Override
                     public void onError(Objective objective, ObjectiveError error) {
-                        log.error("Eapol filter for {} on {} with meter {} " +
-                                         "failed {} because {}",
+                        log.error("Eapol filter {} for {} on {} with meter {} " +
+                                         "failed {} because {}", objective.id(),
                                  fi.getDevId(), fi.getUniPort(), mId,
                                  (install) ? INSTALLATION : REMOVAL,
                                  error);
@@ -708,6 +706,13 @@
         return createForwardingObjectiveBuilder(selectorBuilder.build(), treatmentBuilder.build(), MIN_PRIORITY);
     }
 
+    @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,
                                                                                 TrafficTreatment treatment,
                                                                                 Integer priority) {
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 3cbdbd7..fc56066 100644
--- a/app/src/main/java/org/opencord/olt/impl/OltMeterService.java
+++ b/app/src/main/java/org/opencord/olt/impl/OltMeterService.java
@@ -42,7 +42,6 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 import org.opencord.olt.internalapi.AccessDeviceMeterService;
-import org.opencord.olt.internalapi.DeviceBandwidthProfile;
 import org.opencord.sadis.BandwidthProfileInformation;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.component.annotations.Activate;
@@ -56,13 +55,14 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -100,8 +100,6 @@
 
     protected boolean deleteMeters = true;
 
-    ConsistentMultimap<String, MeterKey> bpInfoToMeter;
-
     private ApplicationId appId;
     private static final String APP_NAME = "org.opencord.olt";
 
@@ -111,7 +109,9 @@
 
     protected ExecutorService eventExecutor;
 
-    private Set<DeviceBandwidthProfile> pendingMeters;
+    private Map<DeviceId, Set<BandwidthProfileInformation>> pendingMeters;
+    private Map<DeviceId, Map<MeterKey, AtomicInteger>> pendingRemoveMeters;
+    ConsistentMultimap<String, MeterKey> bpInfoToMeter;
 
     @Activate
     public void activate(ComponentContext context) {
@@ -133,7 +133,8 @@
 
         meterService.addListener(meterListener);
         componentConfigService.registerProperties(getClass());
-        pendingMeters = ConcurrentHashMap.newKeySet();
+        pendingMeters = Maps.newConcurrentMap();
+        pendingRemoveMeters = Maps.newConcurrentMap();
         log.info("Olt Meter service started");
     }
 
@@ -250,26 +251,54 @@
     }
 
     @Override
-    public void addToPendingMeters(DeviceBandwidthProfile deviceBandwidthProfile) {
-        pendingMeters.add(deviceBandwidthProfile);
+    public void addToPendingMeters(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
+        if (deviceId == null) {
+            return;
+        }
+        pendingMeters.compute(deviceId, (id, bwps) -> {
+            if (bwps == null) {
+                bwps = new HashSet<>();
+            }
+            bwps.add(bwpInfo);
+            return bwps;
+        });
     }
 
     @Override
-    public void removeFromPendingMeters(DeviceBandwidthProfile deviceBandwidthProfile) {
-        pendingMeters.remove(deviceBandwidthProfile);
+    public void removeFromPendingMeters(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
+        if (deviceId == null) {
+            return;
+        }
+        pendingMeters.computeIfPresent(deviceId, (id, bwps) -> {
+            bwps.remove(bwpInfo);
+            return bwps;
+        });
     }
 
     @Override
-    public boolean isMeterPending(DeviceBandwidthProfile deviceBandwidthProfile) {
-        return pendingMeters.contains(deviceBandwidthProfile);
+    public boolean isMeterPending(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
+        if (!pendingMeters.containsKey(deviceId)) {
+            return false;
+        }
+        return pendingMeters.get(deviceId).contains(bwpInfo);
     }
 
     @Override
     public void clearMeters(DeviceId deviceId) {
         log.debug("Removing all meters for device {}", deviceId);
+        clearDeviceState(deviceId);
         meterService.purgeMeters(deviceId);
     }
 
+    @Override
+    public void clearDeviceState(DeviceId deviceId) {
+        log.info("Clearing local device state for {}", deviceId);
+        pendingRemoveMeters.remove(deviceId);
+        removeMetersFromBpMapping(deviceId);
+        //Following call handles cornercase of OLT delete during meter provisioning
+        pendingMeters.remove(deviceId);
+    }
+
     private List<Band> createMeterBands(BandwidthProfileInformation bpInfo) {
         List<Band> meterBands = new ArrayList<>();
 
@@ -288,9 +317,23 @@
                 .build();
     }
 
-    private class InternalMeterListener implements MeterListener {
+    private void removeMeterFromBpMapping(MeterKey meterKey) {
+        List<Map.Entry<String, MeterKey>> meters = bpInfoToMeter.stream()
+                .filter(e -> e.getValue().equals(meterKey))
+                .collect(Collectors.toList());
 
-        Map<MeterKey, AtomicInteger> pendingRemoveMeters = Maps.newConcurrentMap();
+        meters.forEach(e -> bpInfoToMeter.remove(e.getKey(), e.getValue()));
+    }
+
+    private void removeMetersFromBpMapping(DeviceId deviceId) {
+        List<Map.Entry<String, MeterKey>> meters = bpInfoToMeter.stream()
+                .filter(e -> e.getValue().deviceId().equals(deviceId))
+                .collect(Collectors.toList());
+
+        meters.forEach(e -> bpInfoToMeter.remove(e.getKey(), e.getValue()));
+    }
+
+    private class InternalMeterListener implements MeterListener {
 
         @Override
         public void event(MeterEvent meterEvent) {
@@ -302,33 +345,50 @@
                 }
                 MeterKey key = MeterKey.key(meter.deviceId(), meter.id());
                 if (deleteMeters && MeterEvent.Type.METER_REFERENCE_COUNT_ZERO.equals(meterEvent.type())) {
-                    log.info("Zero Count Meter Event is received. Meter is {}", meter.id());
-                    incrementMeterCount(key);
+                    log.info("Zero Count Meter Event is received. Meter is {} on {}",
+                             meter.id(), meter.deviceId());
+                    incrementMeterCount(meter.deviceId(), key);
 
-                    if (appId.equals(meter.appId()) && pendingRemoveMeters.get(key).get() == 3) {
-                        log.info("Deleting unreferenced, no longer programmed Meter {}", meter.id());
+                    if (appId.equals(meter.appId()) && pendingRemoveMeters.get(meter.deviceId())
+                            .get(key).get() == 3) {
+                        log.info("Deleting unreferenced, no longer programmed Meter {} on {}",
+                                 meter.id(), meter.deviceId());
                         deleteMeter(meter.deviceId(), meter.id());
                     }
                 }
                 if (MeterEvent.Type.METER_REMOVED.equals(meterEvent.type())) {
-                    log.info("Meter Removed Event is received for {}", meter.id());
-                    pendingRemoveMeters.remove(key);
+                    log.info("Meter Removed Event is received for {} on {}",
+                             meter.id(), meter.deviceId());
+                    pendingRemoveMeters.computeIfPresent(meter.deviceId(),
+                                                (id, meters) -> {
+                                                    if (meters.get(key) == null) {
+                                                        log.info("Meters is not pending " +
+                                                                         "{} on {}", key, id);
+                                                        return meters;
+                                                    }
+                                                    meters.remove(key);
+                                                    return meters;
+                                                });
                     removeMeterFromBpMapping(key);
                 }
             });
         }
 
-        private void incrementMeterCount(MeterKey key) {
+        private void incrementMeterCount(DeviceId deviceId, MeterKey key) {
             if (key == null) {
                 return;
             }
-            pendingRemoveMeters.compute(key,
-                    (k, v) -> {
-                        if (v == null) {
-                            return new AtomicInteger(1);
+            pendingRemoveMeters.compute(deviceId,
+                    (id, meters) -> {
+                        if (meters == null) {
+                            meters = new HashMap<>();
+
                         }
-                        v.addAndGet(1);
-                        return v;
+                        if (meters.get(key) == null) {
+                            meters.put(key, new AtomicInteger(1));
+                        }
+                        meters.get(key).addAndGet(1);
+                        return meters;
                     });
         }
 
@@ -346,13 +406,5 @@
                 meterService.withdraw(meterRequest, meterId);
             }
         }
-
-        private void removeMeterFromBpMapping(MeterKey meterKey) {
-            List<Map.Entry<String, MeterKey>> meters = bpInfoToMeter.stream()
-                    .filter(e -> e.getValue().equals(meterKey))
-                    .collect(Collectors.toList());
-
-            meters.forEach(e -> bpInfoToMeter.remove(e.getKey(), e.getValue()));
-        }
     }
 }
diff --git a/app/src/main/java/org/opencord/olt/internalapi/AccessDeviceFlowService.java b/app/src/main/java/org/opencord/olt/internalapi/AccessDeviceFlowService.java
index 362b154..d4cc09f 100644
--- a/app/src/main/java/org/opencord/olt/internalapi/AccessDeviceFlowService.java
+++ b/app/src/main/java/org/opencord/olt/internalapi/AccessDeviceFlowService.java
@@ -145,4 +145,10 @@
                                                   PortNumber subscriberPort,
                                                   MeterId downstreamMeterId,
                                                   UniTagInformation tagInformation);
+
+    /**
+     * Clears pending mappings and state for device.
+     * @param deviceId the device id
+     */
+    void clearDeviceState(DeviceId deviceId);
 }
diff --git a/app/src/main/java/org/opencord/olt/internalapi/AccessDeviceMeterService.java b/app/src/main/java/org/opencord/olt/internalapi/AccessDeviceMeterService.java
index bad2e5b..4b921fb 100644
--- a/app/src/main/java/org/opencord/olt/internalapi/AccessDeviceMeterService.java
+++ b/app/src/main/java/org/opencord/olt/internalapi/AccessDeviceMeterService.java
@@ -70,31 +70,41 @@
     /**
      * Adds the DeviceBandwidthProfile to the pendingMeters.
      *
-     * @param deviceBandwidthProfile the device to bandwidth profile mapping
+     * @param deviceId the device
+     * @param bwpInfo the bandwidth profile info
      */
-    void addToPendingMeters(DeviceBandwidthProfile deviceBandwidthProfile);
+    void addToPendingMeters(DeviceId deviceId, BandwidthProfileInformation bwpInfo);
 
     /**
      * Removes the DeviceBandwidthProfile from the pendingMeters.
      *
-     * @param deviceBandwidthProfile the device to bandwidth profile mapping
+     * @param deviceId the device
+     * @param bwpInfo the bandwidth profile info
      *
      */
-    void removeFromPendingMeters(DeviceBandwidthProfile deviceBandwidthProfile);
+    void removeFromPendingMeters(DeviceId deviceId, BandwidthProfileInformation bwpInfo);
 
     /**
      * Checks if DeviceBandwidthProfile is pending.
      *
-     * @param deviceBandwidthProfile the device to bandwidth profile mapping
+     * @param deviceId the device
+     * @param bwpInfo the bandwidth profile info
      *
      * @return true if pending.
      */
-    boolean isMeterPending(DeviceBandwidthProfile deviceBandwidthProfile);
+    boolean isMeterPending(DeviceId deviceId, BandwidthProfileInformation bwpInfo);
 
     /**
-     * Clears out bandwidth profile to meter mappings for the given device.
+     * Clears out meters for the given device.
      *
      * @param deviceId device ID
      */
     void clearMeters(DeviceId deviceId);
+
+    /**
+     * Clears out local state for the given device.
+     *
+     * @param deviceId device ID
+     */
+    void clearDeviceState(DeviceId deviceId);
 }
diff --git a/app/src/main/java/org/opencord/olt/internalapi/DeviceBandwidthProfile.java b/app/src/main/java/org/opencord/olt/internalapi/DeviceBandwidthProfile.java
deleted file mode 100644
index 8f676ec..0000000
--- a/app/src/main/java/org/opencord/olt/internalapi/DeviceBandwidthProfile.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2020-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.opencord.olt.internalapi;
-
-import org.onosproject.net.DeviceId;
-import org.opencord.sadis.BandwidthProfileInformation;
-
-import java.util.Objects;
-
-/**
- * Class containing a mapping of DeviceId to BandwidthProfileInformation.
- */
-public class DeviceBandwidthProfile {
-    private final DeviceId devId;
-    private BandwidthProfileInformation bwInfo;
-
-    /**
-     * Creates the Mapping.
-     *
-     * @param devId  the device id
-     * @param bwInfo the bandwidth profile information
-     */
-    public DeviceBandwidthProfile(DeviceId devId, BandwidthProfileInformation bwInfo) {
-        this.devId = devId;
-        this.bwInfo = bwInfo;
-    }
-
-    /**
-     * Returns the device id.
-     *
-     * @return device id.
-     */
-    public DeviceId getDevId() {
-        return devId;
-    }
-
-    /**
-     * Returns the Bandwidth profile for this device.
-     *
-     * @return bandwidth profile information
-     */
-    public BandwidthProfileInformation getBwInfo() {
-        return bwInfo;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        DeviceBandwidthProfile that = (DeviceBandwidthProfile) o;
-        return devId.equals(that.devId)
-                && bwInfo.equals(that.bwInfo);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(devId, bwInfo);
-    }
-
-    @Override
-    public String toString() {
-        return com.google.common.base.MoreObjects.toStringHelper(this)
-                .add("devId", devId)
-                .add("bwInfo", bwInfo)
-                .toString();
-    }
-}
diff --git a/app/src/test/java/org/opencord/olt/impl/OltFlowTest.java b/app/src/test/java/org/opencord/olt/impl/OltFlowTest.java
index f259e6f..25bc87a 100644
--- a/app/src/test/java/org/opencord/olt/impl/OltFlowTest.java
+++ b/app/src/test/java/org/opencord/olt/impl/OltFlowTest.java
@@ -48,7 +48,6 @@
 import org.onosproject.net.flowobjective.Objective;
 import org.onosproject.net.meter.MeterId;
 import org.onosproject.net.meter.MeterKey;
-import org.opencord.olt.internalapi.DeviceBandwidthProfile;
 import org.opencord.sadis.BandwidthProfileInformation;
 import org.opencord.sadis.UniTagInformation;
 
@@ -206,22 +205,29 @@
         }
 
         @Override
-        public void addToPendingMeters(DeviceBandwidthProfile deviceBandwidthProfile) {
+        public void addToPendingMeters(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
 
         }
 
         @Override
-        public void removeFromPendingMeters(DeviceBandwidthProfile deviceBandwidthProfile) {
+        public void removeFromPendingMeters(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
+
         }
 
         @Override
-        public boolean isMeterPending(DeviceBandwidthProfile deviceBandwidthProfile) {
+        public boolean isMeterPending(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
             return false;
         }
 
+
         @Override
         public void clearMeters(DeviceId deviceId) {
         }
+
+        @Override
+        public void clearDeviceState(DeviceId deviceId) {
+
+        }
     }
 
     private class MockOltFlowObjectiveService implements org.onosproject.net.flowobjective.FlowObjectiveService {
