diff --git a/core/net/src/main/java/org/onosproject/net/link/impl/LinkManager.java b/core/net/src/main/java/org/onosproject/net/link/impl/LinkManager.java
index e6fa300..b1316f6 100644
--- a/core/net/src/main/java/org/onosproject/net/link/impl/LinkManager.java
+++ b/core/net/src/main/java/org/onosproject/net/link/impl/LinkManager.java
@@ -24,9 +24,8 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
+import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.core.Permission;
-import org.onosproject.event.EventDeliveryService;
-import org.onosproject.event.ListenerRegistry;
 import org.onosproject.incubator.net.config.NetworkConfigEvent;
 import org.onosproject.incubator.net.config.NetworkConfigListener;
 import org.onosproject.incubator.net.config.NetworkConfigService;
@@ -53,7 +52,6 @@
 import org.onosproject.net.link.LinkService;
 import org.onosproject.net.link.LinkStore;
 import org.onosproject.net.link.LinkStoreDelegate;
-import org.onosproject.net.provider.AbstractProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
 import org.slf4j.Logger;
 
@@ -63,8 +61,8 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static org.onosproject.net.LinkKey.linkKey;
-import static org.slf4j.LoggerFactory.getLogger;
 import static org.onosproject.security.AppGuard.checkPermission;
+import static org.slf4j.LoggerFactory.getLogger;
 
 
 /**
@@ -73,7 +71,7 @@
 @Component(immediate = true)
 @Service
 public class LinkManager
-        extends AbstractProviderRegistry<LinkProvider, LinkProviderService>
+        extends AbstractListenerProviderRegistry<LinkEvent, LinkListener, LinkProvider, LinkProviderService>
         implements LinkService, LinkAdminService, LinkProviderRegistry {
 
     private static final String DEVICE_ID_NULL = "Device ID cannot be null";
@@ -82,9 +80,6 @@
 
     private final Logger log = getLogger(getClass());
 
-    protected final ListenerRegistry<LinkEvent, LinkListener>
-            listenerRegistry = new ListenerRegistry<>();
-
     private final LinkStoreDelegate delegate = new InternalStoreDelegate();
 
     private final DeviceListener deviceListener = new InternalDeviceListener();
@@ -98,9 +93,6 @@
     protected DeviceService deviceService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected EventDeliveryService eventDispatcher;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected NetworkConfigService networkConfigService;
 
     @Activate
@@ -124,21 +116,18 @@
     @Override
     public int getLinkCount() {
         checkPermission(Permission.LINK_READ);
-
         return store.getLinkCount();
     }
 
     @Override
     public Iterable<Link> getLinks() {
         checkPermission(Permission.LINK_READ);
-
         return store.getLinks();
     }
 
     @Override
     public Iterable<Link> getActiveLinks() {
         checkPermission(Permission.LINK_READ);
-
         return FluentIterable.from(getLinks())
                 .filter(new Predicate<Link>() {
 
@@ -152,7 +141,6 @@
     @Override
     public Set<Link> getDeviceLinks(DeviceId deviceId) {
         checkPermission(Permission.LINK_READ);
-
         checkNotNull(deviceId, DEVICE_ID_NULL);
         return Sets.union(store.getDeviceEgressLinks(deviceId),
                           store.getDeviceIngressLinks(deviceId));
@@ -161,7 +149,6 @@
     @Override
     public Set<Link> getDeviceEgressLinks(DeviceId deviceId) {
         checkPermission(Permission.LINK_READ);
-
         checkNotNull(deviceId, DEVICE_ID_NULL);
         return store.getDeviceEgressLinks(deviceId);
     }
@@ -169,7 +156,6 @@
     @Override
     public Set<Link> getDeviceIngressLinks(DeviceId deviceId) {
         checkPermission(Permission.LINK_READ);
-
         checkNotNull(deviceId, DEVICE_ID_NULL);
         return store.getDeviceIngressLinks(deviceId);
     }
@@ -177,7 +163,6 @@
     @Override
     public Set<Link> getLinks(ConnectPoint connectPoint) {
         checkPermission(Permission.LINK_READ);
-
         checkNotNull(connectPoint, CONNECT_POINT_NULL);
         return Sets.union(store.getEgressLinks(connectPoint),
                           store.getIngressLinks(connectPoint));
@@ -186,7 +171,6 @@
     @Override
     public Set<Link> getEgressLinks(ConnectPoint connectPoint) {
         checkPermission(Permission.LINK_READ);
-
         checkNotNull(connectPoint, CONNECT_POINT_NULL);
         return store.getEgressLinks(connectPoint);
     }
@@ -194,7 +178,6 @@
     @Override
     public Set<Link> getIngressLinks(ConnectPoint connectPoint) {
         checkPermission(Permission.LINK_READ);
-
         checkNotNull(connectPoint, CONNECT_POINT_NULL);
         return store.getIngressLinks(connectPoint);
     }
@@ -202,7 +185,6 @@
     @Override
     public Link getLink(ConnectPoint src, ConnectPoint dst) {
         checkPermission(Permission.LINK_READ);
-
         checkNotNull(src, CONNECT_POINT_NULL);
         checkNotNull(dst, CONNECT_POINT_NULL);
         return store.getLink(src, dst);
@@ -228,18 +210,6 @@
         post(store.removeLink(src, dst));
     }
 
-    @Override
-    public void addListener(LinkListener listener) {
-        checkPermission(Permission.LINK_EVENT);
-        listenerRegistry.addListener(listener);
-    }
-
-    @Override
-    public void removeListener(LinkListener listener) {
-        checkPermission(Permission.LINK_EVENT);
-        listenerRegistry.removeListener(listener);
-    }
-
     // Auxiliary interceptor for device remove events to prune links that
     // are associated with the removed device or its port.
     private class InternalDeviceListener implements DeviceListener {
@@ -376,13 +346,6 @@
         }
     }
 
-    // Posts the specified event to the local event dispatcher.
-    private void post(LinkEvent event) {
-        if (event != null) {
-            eventDispatcher.post(event);
-        }
-    }
-
     // Store delegate to re-post events emitted from the store.
     private class InternalStoreDelegate implements LinkStoreDelegate {
         @Override
