diff --git a/impl/src/main/java/org/opencord/olt/cli/OltUniPortCompleter.java b/impl/src/main/java/org/opencord/olt/cli/OltUniPortCompleter.java
index 98301db..bda36b6 100644
--- a/impl/src/main/java/org/opencord/olt/cli/OltUniPortCompleter.java
+++ b/impl/src/main/java/org/opencord/olt/cli/OltUniPortCompleter.java
@@ -22,7 +22,7 @@
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.device.DeviceService;
-import org.opencord.olt.impl.OltDeviceServiceInterface;
+import org.opencord.olt.OltDeviceServiceInterface;
 
 import java.util.Collections;
 import java.util.List;
diff --git a/impl/src/main/java/org/opencord/olt/cli/ShowMeterMappings.java b/impl/src/main/java/org/opencord/olt/cli/ShowMeterMappings.java
index 7e2175d..9d0e2ad 100644
--- a/impl/src/main/java/org/opencord/olt/cli/ShowMeterMappings.java
+++ b/impl/src/main/java/org/opencord/olt/cli/ShowMeterMappings.java
@@ -20,8 +20,8 @@
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
-import org.opencord.olt.impl.MeterData;
-import org.opencord.olt.impl.OltMeterServiceInterface;
+import org.opencord.olt.MeterData;
+import org.opencord.olt.OltMeterServiceInterface;
 
 import java.util.Map;
 /**
diff --git a/impl/src/main/java/org/opencord/olt/cli/ShowPortStatus.java b/impl/src/main/java/org/opencord/olt/cli/ShowPortStatus.java
index f3b35a0..d82ec33 100644
--- a/impl/src/main/java/org/opencord/olt/cli/ShowPortStatus.java
+++ b/impl/src/main/java/org/opencord/olt/cli/ShowPortStatus.java
@@ -25,9 +25,9 @@
 import org.onosproject.cli.net.PortNumberCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
-import org.opencord.olt.impl.OltFlowServiceInterface;
-import org.opencord.olt.impl.OltPortStatus;
-import org.opencord.olt.impl.ServiceKey;
+import org.opencord.olt.OltFlowServiceInterface;
+import org.opencord.olt.OltPortStatus;
+import org.opencord.olt.ServiceKey;
 import org.opencord.sadis.UniTagInformation;
 
 import java.util.HashMap;
diff --git a/impl/src/main/java/org/opencord/olt/cli/ShowProgrammedMeters.java b/impl/src/main/java/org/opencord/olt/cli/ShowProgrammedMeters.java
index da2307e..dbb390e 100644
--- a/impl/src/main/java/org/opencord/olt/cli/ShowProgrammedMeters.java
+++ b/impl/src/main/java/org/opencord/olt/cli/ShowProgrammedMeters.java
@@ -20,8 +20,8 @@
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
-import org.opencord.olt.impl.MeterData;
-import org.opencord.olt.impl.OltMeterServiceInterface;
+import org.opencord.olt.MeterData;
+import org.opencord.olt.OltMeterServiceInterface;
 
 import java.util.Map;
 /**
diff --git a/impl/src/main/java/org/opencord/olt/cli/ShowProgrammedSubscribersCommand.java b/impl/src/main/java/org/opencord/olt/cli/ShowProgrammedSubscribersCommand.java
index ac8d00d..a32fcc3 100644
--- a/impl/src/main/java/org/opencord/olt/cli/ShowProgrammedSubscribersCommand.java
+++ b/impl/src/main/java/org/opencord/olt/cli/ShowProgrammedSubscribersCommand.java
@@ -24,8 +24,8 @@
 import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
-import org.opencord.olt.impl.OltFlowServiceInterface;
-import org.opencord.olt.impl.ServiceKey;
+import org.opencord.olt.OltFlowServiceInterface;
+import org.opencord.olt.ServiceKey;
 import org.opencord.sadis.UniTagInformation;
 
 import java.util.Map;
diff --git a/impl/src/main/java/org/opencord/olt/cli/ShowRequestedSubscribersCommand.java b/impl/src/main/java/org/opencord/olt/cli/ShowRequestedSubscribersCommand.java
index 37ef532..067bc18 100644
--- a/impl/src/main/java/org/opencord/olt/cli/ShowRequestedSubscribersCommand.java
+++ b/impl/src/main/java/org/opencord/olt/cli/ShowRequestedSubscribersCommand.java
@@ -24,8 +24,8 @@
 import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
-import org.opencord.olt.impl.OltFlowServiceInterface;
-import org.opencord.olt.impl.ServiceKey;
+import org.opencord.olt.OltFlowServiceInterface;
+import org.opencord.olt.ServiceKey;
 
 import java.util.Map;
 import java.util.Set;
diff --git a/impl/src/main/java/org/opencord/olt/impl/AccessDevicePort.java b/impl/src/main/java/org/opencord/olt/impl/AccessDevicePort.java
deleted file mode 100644
index b6d2213..0000000
--- a/impl/src/main/java/org/opencord/olt/impl/AccessDevicePort.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright 2021-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.impl;
-
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Port;
-
-import java.util.Objects;
-
-/**
- * OLT device port.
- */
-public class AccessDevicePort {
-
-    private ConnectPoint cp;
-    private String name;
-
-    /**
-     * Creates an AccessDevicePort with given ONOS port.
-     *
-     * @param port ONOS port
-     */
-    public AccessDevicePort(Port port) {
-        this.cp = ConnectPoint.deviceConnectPoint(port.element().id() + "/" + port.number().toLong());
-        this.name = OltUtils.getPortName(port);
-    }
-
-    /**
-     * Creates an AccessDevicePort with given ONOS connectPoint and name.
-     *
-     * @param cp ONOS connect point
-     * @param name OLT port name
-     */
-    public AccessDevicePort(ConnectPoint cp, String name) {
-        this.cp = cp;
-        this.name = name;
-    }
-
-    /**
-     * Get ONOS ConnectPoint object.
-     *
-     * @return ONOS connect point
-     */
-    public ConnectPoint connectPoint() {
-        return this.cp;
-    }
-
-    /**
-     * Get OLT port name which is combination of serial number and uni index.
-     *
-     * @return OLT port name (ex: BBSM00010001-1)
-     */
-    public String name() {
-        return this.name;
-    }
-
-    @Override
-    public String toString() {
-        return cp.toString() + '[' + name + ']';
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        AccessDevicePort that = (AccessDevicePort) o;
-        return Objects.equals(cp, that.cp) &&
-                Objects.equals(name, that.name);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(cp, name);
-    }
-}
diff --git a/impl/src/main/java/org/opencord/olt/impl/DiscoveredSubscriber.java b/impl/src/main/java/org/opencord/olt/impl/DiscoveredSubscriber.java
deleted file mode 100644
index 226f1b5..0000000
--- a/impl/src/main/java/org/opencord/olt/impl/DiscoveredSubscriber.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright 2021-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.impl;
-
-import org.onosproject.net.Device;
-import org.onosproject.net.Port;
-import org.opencord.sadis.SubscriberAndDeviceInformation;
-
-import java.util.Objects;
-
-import static org.opencord.olt.impl.OltUtils.portWithName;
-
-/**
- * Contains a subscriber's information and status for a specific device and port.
- */
-public class DiscoveredSubscriber {
-
-    /**
-     * Describe whether the subscriber needs to be added or removed.
-     */
-    public enum Status {
-        ADDED,
-        REMOVED,
-        // Used for the remove subscriber calls from REST/CLI
-        ADMIN_REMOVED,
-    }
-
-    public Port port;
-    public Device device;
-    public Enum<Status> status;
-    public boolean hasSubscriber;
-    public SubscriberAndDeviceInformation subscriberAndDeviceInformation;
-
-    /**
-     * Creates the class with the proper information.
-     *
-     * @param device        the device of the subscriber
-     * @param port          the port
-     * @param status        the status for this specific subscriber
-     * @param hasSubscriber is the subscriber present
-     * @param si            the information about the tags/dhcp and other info.
-     */
-    public DiscoveredSubscriber(Device device, Port port, Status status, boolean hasSubscriber,
-                                SubscriberAndDeviceInformation si) {
-        this.device = device;
-        this.port = port;
-        this.status = status;
-        this.hasSubscriber = hasSubscriber;
-        subscriberAndDeviceInformation = si;
-    }
-
-    /**
-     * Returns the port name for the subscriber.
-     *
-     * @return the port name.
-     */
-    public String portName() {
-        return OltUtils.getPortName(port);
-    }
-
-    @Override
-    public String toString() {
-
-        return String.format("%s (status: %s, provisionSubscriber: %s)",
-                portWithName(this.port),
-                this.status, this.hasSubscriber
-        );
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        DiscoveredSubscriber that = (DiscoveredSubscriber) o;
-        return hasSubscriber == that.hasSubscriber &&
-                port.equals(that.port) &&
-                device.equals(that.device) &&
-                status.equals(that.status);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(port, device, status, hasSubscriber, subscriberAndDeviceInformation);
-    }
-}
diff --git a/impl/src/main/java/org/opencord/olt/impl/MeterData.java b/impl/src/main/java/org/opencord/olt/impl/MeterData.java
deleted file mode 100644
index 208383d..0000000
--- a/impl/src/main/java/org/opencord/olt/impl/MeterData.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 2021-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.impl;
-
-import org.onosproject.net.meter.MeterCellId;
-import org.onosproject.net.meter.MeterId;
-import org.onosproject.net.meter.MeterState;
-
-import java.util.Objects;
-
-/**
- * Class containing Meter Data.
- */
-public class MeterData {
-    private MeterCellId meterCellId;
-    private MeterState meterStatus;
-    private String bandwidthProfileName;
-
-    public MeterData(MeterCellId meterCellId, MeterState meterStatus, String bandwidthProfile) {
-        this.meterCellId = meterCellId;
-        this.meterStatus = meterStatus;
-        this.bandwidthProfileName = bandwidthProfile;
-    }
-
-    public void setMeterCellId(MeterCellId meterCellId) {
-        this.meterCellId = meterCellId;
-    }
-
-    public void setMeterStatus(MeterState meterStatus) {
-        this.meterStatus = meterStatus;
-    }
-
-    public MeterId getMeterId() {
-        return (MeterId) meterCellId;
-    }
-
-    public MeterCellId getMeterCellId() {
-        return meterCellId;
-    }
-
-    public MeterState getMeterStatus() {
-        return meterStatus;
-    }
-
-    public String getBandwidthProfileName() {
-        return bandwidthProfileName;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        MeterData meterData = (MeterData) o;
-        return Objects.equals(meterCellId, meterData.meterCellId) &&
-                meterStatus == meterData.meterStatus &&
-                Objects.equals(bandwidthProfileName, meterData.bandwidthProfileName);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(meterCellId, meterStatus, bandwidthProfileName);
-    }
-
-    @Override
-    public String toString() {
-        return "MeterData{" +
-                "meterCellId=" + meterCellId +
-                ", meterStatus=" + meterStatus +
-                ", bandwidthProfile='" + bandwidthProfileName + '\'' +
-                '}';
-    }
-}
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 7b9dc75..d744c1e 100644
--- a/impl/src/main/java/org/opencord/olt/impl/Olt.java
+++ b/impl/src/main/java/org/opencord/olt/impl/Olt.java
@@ -38,7 +38,14 @@
 import org.onosproject.store.service.StorageService;
 import org.opencord.olt.AccessDeviceEvent;
 import org.opencord.olt.AccessDeviceListener;
+import org.opencord.olt.AccessDevicePort;
 import org.opencord.olt.AccessDeviceService;
+import org.opencord.olt.DiscoveredSubscriber;
+import org.opencord.olt.OltDeviceServiceInterface;
+import org.opencord.olt.OltFlowServiceInterface;
+import org.opencord.olt.OltMeterServiceInterface;
+import org.opencord.olt.ServiceKey;
+import org.opencord.olt.FlowOperation;
 import org.opencord.sadis.BaseInformationService;
 import org.opencord.sadis.SadisService;
 import org.opencord.sadis.SubscriberAndDeviceInformation;
@@ -879,7 +886,7 @@
 
             if (port.isEnabled()) {
                 if (isNni) {
-                    OltFlowService.FlowOperation action = OltFlowService.FlowOperation.ADD;
+                    FlowOperation action = FlowOperation.ADD;
                     // NOTE the NNI is only disabled if the OLT shuts down (reboot or failure).
                     // In that case the flows are purged anyway, so there's no need to deal with them,
                     // it would actually be counter-productive as the openflow connection is severed and they won't
diff --git a/impl/src/main/java/org/opencord/olt/impl/OltDeviceService.java b/impl/src/main/java/org/opencord/olt/impl/OltDeviceService.java
index b336c28..6b11802 100644
--- a/impl/src/main/java/org/opencord/olt/impl/OltDeviceService.java
+++ b/impl/src/main/java/org/opencord/olt/impl/OltDeviceService.java
@@ -25,6 +25,7 @@
 import org.onosproject.net.Port;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DeviceService;
+import org.opencord.olt.OltDeviceServiceInterface;
 import org.opencord.sadis.BaseInformationService;
 import org.opencord.sadis.SadisService;
 import org.opencord.sadis.SubscriberAndDeviceInformation;
diff --git a/impl/src/main/java/org/opencord/olt/impl/OltDeviceServiceInterface.java b/impl/src/main/java/org/opencord/olt/impl/OltDeviceServiceInterface.java
deleted file mode 100644
index e8fcccb..0000000
--- a/impl/src/main/java/org/opencord/olt/impl/OltDeviceServiceInterface.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2021-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.impl;
-
-import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Port;
-import org.onosproject.net.PortNumber;
-
-import java.util.Optional;
-
-/**
- * Service for olt device handling.
- */
-public interface OltDeviceServiceInterface {
-    /**
-     * Returns true if the device is a known OLT to sadis/config.
-     * @param device the device
-     * @return true if a configured olt
-     */
-    boolean isOlt(Device device);
-
-    /**
-     * Returns true if the port is an NNI port of the OLT device.
-     * @param device the device
-     * @param port the port
-     * @return true if an NNI port of that OLT
-     */
-    boolean isNniPort(Device device, PortNumber port);
-
-    /**
-     * Returns the NNi port fo the OLT device if present.
-     * @param device the device
-     * @return the nni Port, if present
-     */
-    Optional<Port> getNniPort(Device device);
-
-    /**
-     * Returns true if the instance is leader for the OLT device.
-     * @param deviceId the device
-     * @return true if master, false otherwise.
-     */
-    boolean isLocalLeader(DeviceId deviceId);
-}
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 ebe0505..04ea492 100644
--- a/impl/src/main/java/org/opencord/olt/impl/OltFlowService.java
+++ b/impl/src/main/java/org/opencord/olt/impl/OltFlowService.java
@@ -64,6 +64,16 @@
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+import org.opencord.olt.AccessDevicePort;
+import org.opencord.olt.DiscoveredSubscriber;
+import org.opencord.olt.OltDeviceServiceInterface;
+import org.opencord.olt.OltFlowServiceInterface;
+import org.opencord.olt.OltMeterServiceInterface;
+import org.opencord.olt.OltPortStatus;
+import org.opencord.olt.ServiceKey;
+import org.opencord.olt.OltFlowsStatus;
+import org.opencord.olt.FlowDirection;
+import org.opencord.olt.FlowOperation;
 import org.opencord.olt.impl.fttb.FttbUtils;
 import org.opencord.sadis.BandwidthProfileInformation;
 import org.opencord.sadis.BaseInformationService;
@@ -262,31 +272,6 @@
 
     protected boolean waitForRemoval = WAIT_FOR_REMOVAL_DEFAULT;
 
-    public enum FlowOperation {
-        ADD,
-        REMOVE;
-
-
-        @Override
-        public String toString() {
-            return super.toString().toLowerCase();
-        }
-    }
-
-    public enum FlowDirection {
-        UPSTREAM,
-        DOWNSTREAM,
-    }
-
-    public enum OltFlowsStatus {
-        NONE,
-        PENDING_ADD,
-        ADDED,
-        PENDING_REMOVE,
-        REMOVED,
-        ERROR
-    }
-
     protected InternalFlowListener internalFlowListener;
 
     @Activate
diff --git a/impl/src/main/java/org/opencord/olt/impl/OltFlowServiceInterface.java b/impl/src/main/java/org/opencord/olt/impl/OltFlowServiceInterface.java
deleted file mode 100644
index b00594f..0000000
--- a/impl/src/main/java/org/opencord/olt/impl/OltFlowServiceInterface.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 2021-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.impl;
-
-import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Port;
-import org.opencord.sadis.UniTagInformation;
-
-import java.util.Map;
-
-/**
- * Interface for flow installation/removal methods for different types of traffic.
- */
-public interface OltFlowServiceInterface {
-    /**
-     * Installs or removes default flows for the port to trap to controller.
-     * @param sub the information about the port
-     * @param defaultBpId the default bandwidth profile
-     * @param oltBandwidthProfile the olt bandwidth profile.
-     * @return true if successful
-     */
-    boolean handleBasicPortFlows(
-            DiscoveredSubscriber sub, String defaultBpId, String oltBandwidthProfile);
-
-    /**
-     * Installs or removes subscriber specific flows.
-     * @param sub the information about the subscriber
-     * @param defaultBpId the default bandwidth profile
-     * @param multicastServiceName the multicast service name.
-     * @return true if successful
-     */
-    boolean handleSubscriberFlows(DiscoveredSubscriber sub, String defaultBpId, String multicastServiceName);
-
-    /**
-     * Installs or removes flows on the NNI port.
-     * @param device the OLT
-     * @param port the NNI port
-     * @param action the operatio, ADD or REMOVE.
-     */
-    void handleNniFlows(Device device, Port port, OltFlowService.FlowOperation action);
-
-    /**
-     * Checks if the default eapol flow is already installed.
-     * @param port the port
-     * @return true if installed, false otherwise.
-     */
-    boolean hasDefaultEapol(Port port);
-
-    /**
-     * Checks if the dhcp flows are installed.
-     * @param port the port
-     * @param uti the UniTagInformation to check for
-     * @return true if installed, false otherwise.
-     */
-    boolean hasDhcpFlows(Port port, UniTagInformation uti);
-
-    /**
-     * Checks if the pppoe flows are installed.
-     * @param port the port
-     * @param uti the UniTagInformation to check for
-     * @return true if installed, false otherwise.
-     */
-    boolean hasPppoeFlows(Port port, UniTagInformation uti);
-
-    /**
-     * Checks if the subscriber flows are installed.
-     * @param port the port
-     * @param uti the UniTagInformation to check for
-     * @return true if installed, false otherwise.
-     */
-    boolean hasSubscriberFlows(Port port, UniTagInformation uti);
-
-    /**
-     * Removes all device flows.
-     * @param deviceId the olt.
-     */
-    void purgeDeviceFlows(DeviceId deviceId);
-
-    /**
-     * Return the status of installation on the connect points.
-     * @return the status map
-     */
-    Map<ServiceKey, OltPortStatus> getConnectPointStatus();
-
-    /**
-     * Returns all the programmed subscribers.
-     * @return the subscribers
-     */
-    Map<ServiceKey, UniTagInformation> getProgrammedSubscribers();
-
-    /**
-     * Returns the list of requested subscribers to be installed with status.
-     * @return the list
-     */
-    Map<ServiceKey, Boolean> getRequestedSubscribers();
-
-    /**
-     * Returns if a subscriber on a port is provisioned or not.
-     * @param cp the port
-     * @return true if any service on that port is provisioned, false otherwise
-     */
-    boolean isSubscriberServiceProvisioned(AccessDevicePort cp);
-
-    /**
-     * Returns if a subscriber on a port is provisioned or not.
-     * @param sk the SubscriberKey
-     * @return true if provisioned, false otherwise
-     */
-    boolean isSubscriberServiceProvisioned(ServiceKey sk);
-
-    /**
-     * Updates the subscriber provisioning status.
-     * @param sk the SubscriberKey
-     * @param status the next status
-     */
-    void updateProvisionedSubscriberStatus(ServiceKey sk, Boolean status);
-}
diff --git a/impl/src/main/java/org/opencord/olt/impl/OltFlowServiceUtils.java b/impl/src/main/java/org/opencord/olt/impl/OltFlowServiceUtils.java
index 7099b1b..883c198 100644
--- a/impl/src/main/java/org/opencord/olt/impl/OltFlowServiceUtils.java
+++ b/impl/src/main/java/org/opencord/olt/impl/OltFlowServiceUtils.java
@@ -30,6 +30,7 @@
 import org.onosproject.net.flow.criteria.UdpPortCriterion;
 import org.onosproject.net.flow.instructions.L2ModificationInstruction;
 import org.onosproject.net.meter.MeterId;
+import org.opencord.olt.OltFlowsStatus;
 import org.opencord.sadis.UniTagInformation;
 
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -78,18 +79,18 @@
      * @param type FlowRuleEvent type
      * @return OltFlowService.OltFlowsStatus
      */
-    public static OltFlowService.OltFlowsStatus flowRuleStatusToOltFlowStatus(FlowRuleEvent.Type type) {
+    public static OltFlowsStatus flowRuleStatusToOltFlowStatus(FlowRuleEvent.Type type) {
         switch (type) {
             case RULE_ADD_REQUESTED:
-                return OltFlowService.OltFlowsStatus.PENDING_ADD;
+                return OltFlowsStatus.PENDING_ADD;
             case RULE_ADDED:
-                return OltFlowService.OltFlowsStatus.ADDED;
+                return OltFlowsStatus.ADDED;
             case RULE_REMOVE_REQUESTED:
-                return OltFlowService.OltFlowsStatus.PENDING_REMOVE;
+                return OltFlowsStatus.PENDING_REMOVE;
             case RULE_REMOVED:
-                return OltFlowService.OltFlowsStatus.REMOVED;
+                return OltFlowsStatus.REMOVED;
             default:
-                return OltFlowService.OltFlowsStatus.NONE;
+                return OltFlowsStatus.NONE;
         }
     }
 
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 3c7410b..c6f2709 100644
--- a/impl/src/main/java/org/opencord/olt/impl/OltMeterService.java
+++ b/impl/src/main/java/org/opencord/olt/impl/OltMeterService.java
@@ -39,6 +39,9 @@
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+import org.opencord.olt.MeterData;
+import org.opencord.olt.OltDeviceServiceInterface;
+import org.opencord.olt.OltMeterServiceInterface;
 import org.opencord.sadis.BandwidthProfileInformation;
 import org.opencord.sadis.BaseInformationService;
 import org.opencord.sadis.SadisService;
diff --git a/impl/src/main/java/org/opencord/olt/impl/OltMeterServiceInterface.java b/impl/src/main/java/org/opencord/olt/impl/OltMeterServiceInterface.java
deleted file mode 100644
index 16d78ef..0000000
--- a/impl/src/main/java/org/opencord/olt/impl/OltMeterServiceInterface.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2021-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.impl;
-
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.meter.MeterId;
-import org.opencord.sadis.SubscriberAndDeviceInformation;
-
-import java.util.Map;
-
-/**
- * Interface for meter installation/removal methods
- * for different types of bandwidth profiles.
- */
-public interface OltMeterServiceInterface {
-    /**
-     * Checks for a meter, if not present it will create it and return false.
-     * @param deviceId DeviceId
-     * @param bandwidthProfile Bandwidth Profile Id
-     * @return boolean
-     */
-    boolean createMeter(DeviceId deviceId, String bandwidthProfile);
-
-    /**
-     * Checks for all the meters specified in the sadis uniTagList,
-     * if not present it will create them and return false.
-     * @param deviceId DeviceId
-     * @param si SubscriberAndDeviceInformation
-     * @param multicastServiceName The multicast service name
-     * @return boolean
-     */
-    boolean createMeters(DeviceId deviceId, SubscriberAndDeviceInformation si, String multicastServiceName);
-
-    /**
-     * Checks if a meter for the specified bandwidthProfile exists
-     * and is in ADDED state.
-     * @param deviceId DeviceId
-     * @param bandwidthProfileId bandwidth profile id
-     * @return true if present and in ADDED state
-     */
-    boolean hasMeterByBandwidthProfile(DeviceId deviceId, String bandwidthProfileId);
-
-    /**
-     * Checks if a meter for the specified bandwidthProfile exists
-     * and is in PENDING_ADD state.
-     * @param deviceId DeviceId
-     * @param bandwidthProfileId bandwidth profile id
-     * @return true if present and in PENDING_ADD state
-     */
-    boolean hasPendingMeterByBandwidthProfile(DeviceId deviceId, String bandwidthProfileId);
-
-    /**
-     * Creates a meter on a device for the given BandwidthProfile Id.
-     * @param deviceId the device id
-     * @param bandwidthProfileId the bandwidth profile Id
-     */
-    void createMeterForBp(DeviceId deviceId, String bandwidthProfileId);
-
-    /**
-     * Returns the meter Id for a given bandwidth profile Id.
-     * @param deviceId the device id
-     * @param bandwidthProfileId the bandwidth profile Id
-     * @return the meter Id
-     */
-    MeterId getMeterIdForBandwidthProfile(DeviceId deviceId, String bandwidthProfileId);
-
-    /**
-     * Purges all the meters on a device.
-     * @param deviceId the device
-     */
-    void purgeDeviceMeters(DeviceId deviceId);
-
-    /**
-     * Return all programmed meters for all OLTs controlled by this ONOS cluster.
-     * @return a map, with the device keys, and entry of map with bp Id and corresponding meter
-     */
-    Map<DeviceId, Map<String, MeterData>> getProgrammedMeters();
-
-}
diff --git a/impl/src/main/java/org/opencord/olt/impl/OltPortStatus.java b/impl/src/main/java/org/opencord/olt/impl/OltPortStatus.java
deleted file mode 100644
index 3ef348a..0000000
--- a/impl/src/main/java/org/opencord/olt/impl/OltPortStatus.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2021-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.impl;
-
-import java.util.Objects;
-
-/**
- * OltPortStatus is used to keep track of the flow status for a subscriber service.
- */
-public class OltPortStatus {
-    // TODO consider adding a lastUpdated field, it may help with debugging
-    public OltFlowService.OltFlowsStatus defaultEapolStatus;
-    public OltFlowService.OltFlowsStatus subscriberEapolStatus;
-    public OltFlowService.OltFlowsStatus subscriberFlowsStatus;
-    // NOTE we need to keep track of the DHCP status as that is installed before the other flows
-    // if macLearning is enabled (DHCP is needed to learn the MacAddress from the host)
-    public OltFlowService.OltFlowsStatus dhcpStatus;
-    public OltFlowService.OltFlowsStatus pppoeStatus;
-
-    public OltPortStatus(OltFlowService.OltFlowsStatus defaultEapolStatus,
-                         OltFlowService.OltFlowsStatus subscriberEapolStatus,
-                         OltFlowService.OltFlowsStatus subscriberFlowsStatus,
-                         OltFlowService.OltFlowsStatus dhcpStatus,
-                         OltFlowService.OltFlowsStatus pppoeStatus) {
-        this.defaultEapolStatus = defaultEapolStatus;
-        this.subscriberEapolStatus = subscriberEapolStatus;
-        this.subscriberFlowsStatus = subscriberFlowsStatus;
-        this.dhcpStatus = dhcpStatus;
-        this.pppoeStatus = pppoeStatus;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        OltPortStatus that = (OltPortStatus) o;
-        return defaultEapolStatus == that.defaultEapolStatus
-                && subscriberEapolStatus == that.subscriberEapolStatus
-                && subscriberFlowsStatus == that.subscriberFlowsStatus
-                && dhcpStatus == that.dhcpStatus;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(defaultEapolStatus, subscriberEapolStatus,
-                            subscriberFlowsStatus, dhcpStatus);
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder("OltPortStatus{");
-        sb.append("defaultEapolStatus=").append(defaultEapolStatus);
-        sb.append(", subscriberEapolStatus=").append(subscriberEapolStatus);
-        sb.append(", subscriberFlowsStatus=").append(subscriberFlowsStatus);
-        sb.append(", dhcpStatus=").append(dhcpStatus);
-        sb.append('}');
-        return sb.toString();
-    }
-}
diff --git a/impl/src/main/java/org/opencord/olt/impl/OltUtils.java b/impl/src/main/java/org/opencord/olt/impl/OltUtils.java
index 869a01d..45d684e 100644
--- a/impl/src/main/java/org/opencord/olt/impl/OltUtils.java
+++ b/impl/src/main/java/org/opencord/olt/impl/OltUtils.java
@@ -19,15 +19,14 @@
 import org.onlab.packet.VlanId;
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.Port;
+import org.opencord.olt.FlowOperation;
 import org.opencord.sadis.SubscriberAndDeviceInformation;
 import org.opencord.sadis.UniTagInformation;
 
-import static org.opencord.olt.impl.OltFlowService.FlowOperation.ADD;
-
 /**
  * Utility class for OLT app.
  */
-final class OltUtils {
+public final class OltUtils {
 
     private OltUtils() {
     }
@@ -37,7 +36,7 @@
      * @param port the port
      * @return the annotated port name
      */
-    static String getPortName(Port port) {
+    public static String getPortName(Port port) {
         String name = port.annotations().value(AnnotationKeys.PORT_NAME);
         return name == null ? "" : name;
     }
@@ -47,18 +46,18 @@
      * @param port the port
      * @return the formatted string
      */
-    static String portWithName(Port port) {
+    public static String portWithName(Port port) {
         return port.element().id().toString() + '/' +
                 port.number() + '[' +
                 getPortName(port) + ']';
     }
 
-    static String flowOpToString(OltFlowService.FlowOperation op) {
-        return op == ADD ? "Adding" : "Removing";
+    public static String flowOpToString(FlowOperation op) {
+        return op == FlowOperation.ADD ? "Adding" : "Removing";
     }
 
-    static String completeFlowOpToString(OltFlowService.FlowOperation op) {
-        return op == ADD ? "Added" : "Removed";
+    public static String completeFlowOpToString(FlowOperation op) {
+        return op == FlowOperation.ADD ? "Added" : "Removed";
     }
 
     /**
@@ -72,7 +71,7 @@
      * @param tpId          Techprofile Id
      * @return UniTagInformation
      */
-    static UniTagInformation getUniTagInformation(SubscriberAndDeviceInformation subInfo, VlanId innerVlan,
+    public static UniTagInformation getUniTagInformation(SubscriberAndDeviceInformation subInfo, VlanId innerVlan,
                                                   VlanId outerVlan, int tpId) {
         UniTagInformation service = null;
         for (UniTagInformation tagInfo : subInfo.uniTagList()) {
diff --git a/impl/src/main/java/org/opencord/olt/impl/ServiceKey.java b/impl/src/main/java/org/opencord/olt/impl/ServiceKey.java
deleted file mode 100644
index c878062..0000000
--- a/impl/src/main/java/org/opencord/olt/impl/ServiceKey.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2021-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.impl;
-
-import org.opencord.sadis.UniTagInformation;
-
-import java.util.Objects;
-
-/**
- * SubscriberKey is used to identify the combination of a subscriber and a service.
- */
-public class ServiceKey {
-    private AccessDevicePort port;
-    private UniTagInformation service;
-
-    public ServiceKey(AccessDevicePort port, UniTagInformation service) {
-        this.port = port;
-        this.service = service;
-    }
-
-    public AccessDevicePort getPort() {
-        return port;
-    }
-
-    public void setPort(AccessDevicePort port) {
-        this.port = port;
-    }
-
-    public UniTagInformation getService() {
-        return service;
-    }
-
-    public void setService(UniTagInformation service) {
-        this.service = service;
-    }
-
-    @Override
-    public String toString() {
-        return this.port.toString() + " - " + this.service.getServiceName();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        ServiceKey that = (ServiceKey) o;
-        boolean isPortEqual = Objects.equals(port, that.port);
-        boolean isServiceEqual = Objects.equals(service, that.service);
-
-        return isPortEqual && isServiceEqual;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(port, service);
-    }
-}
diff --git a/impl/src/main/java/org/opencord/olt/impl/ServiceKeySerializer.java b/impl/src/main/java/org/opencord/olt/impl/ServiceKeySerializer.java
index 4035bdd..6e0c85b 100644
--- a/impl/src/main/java/org/opencord/olt/impl/ServiceKeySerializer.java
+++ b/impl/src/main/java/org/opencord/olt/impl/ServiceKeySerializer.java
@@ -23,6 +23,8 @@
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
+import org.opencord.olt.AccessDevicePort;
+import org.opencord.olt.ServiceKey;
 import org.opencord.sadis.UniTagInformation;
 
 /**
