diff --git a/providers/lldp/app.xml b/providers/lldp/app.xml
new file mode 100644
index 0000000..509bcca
--- /dev/null
+++ b/providers/lldp/app.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 20166 Open Networking Laboratory
+  ~
+  ~ 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.
+  -->
+<app name="org.onosproject.lldpprovider" origin="ON.Lab" version="${project.version}"
+     category="default" url="http://onosproject.org"
+     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
+     features="${project.artifactId}">
+    <description>${project.description}</description>
+    <artifact>mvn:${project.groupId}/onos-lldp-provider/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-lldp-provider-common/${project.version}</artifact>
+
+</app>
diff --git a/providers/lldp/features.xml b/providers/lldp/features.xml
new file mode 100644
index 0000000..e4d4721
--- /dev/null
+++ b/providers/lldp/features.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  ~ Copyright 2016 Open Networking Laboratory
+  ~
+  ~ 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.
+  --><features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
+    <feature name="${project.artifactId}" version="${project.version}"
+             description="${project.description}">
+        <feature>onos-api</feature>
+        <bundle>mvn:${project.groupId}/onos-lldp-provider/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-lldp-provider-common/${project.version}</bundle>
+    </feature>
+</features>
+
diff --git a/providers/lldp/pom.xml b/providers/lldp/pom.xml
index 03f945d..65afe07 100644
--- a/providers/lldp/pom.xml
+++ b/providers/lldp/pom.xml
@@ -48,6 +48,12 @@
 
         <dependency>
             <groupId>org.onosproject</groupId>
+            <artifactId>onos-lldp-provider-common</artifactId>
+            <version>1.5.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
             <artifactId>onos-api</artifactId>
             <classifier>tests</classifier>
             <scope>test</scope>
diff --git a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/DiscoveryContext.java b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/DiscoveryContext.java
deleted file mode 100644
index 74732ea..0000000
--- a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/DiscoveryContext.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * 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.onosproject.provider.lldp.impl;
-
-import org.onosproject.mastership.MastershipService;
-import org.onosproject.net.LinkKey;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.link.LinkProviderService;
-import org.onosproject.net.packet.PacketService;
-
-/**
- * Shared context for use by link discovery.
- */
-interface DiscoveryContext {
-
-    /**
-     * Returns the shared mastership service reference.
-     *
-     * @return mastership service
-     */
-    MastershipService mastershipService();
-
-    /**
-     * Returns the shared link provider service reference.
-     *
-     * @return link provider service
-     */
-    LinkProviderService providerService();
-
-    /**
-     * Returns the shared packet service reference.
-     *
-     * @return packet service
-     */
-    PacketService packetService();
-
-    /**
-     * Returns the DeviceService reference.
-     *
-     * @return the device service interface
-     */
-    DeviceService deviceService();
-
-    /**
-     * Returns the probe rate in millis.
-     *
-     * @return probe rate
-     */
-    long probeRate();
-
-    /**
-     * Indicates whether to emit BDDP.
-     *
-     * @return true to emit BDDP
-     */
-    boolean useBddp();
-
-    /**
-     * Touches the link identified by the given key to indicate that it's active.
-     *
-     * @param key link key
-     */
-    void touchLink(LinkKey key);
-
-    /**
-     * Returns the cluster-wide unique identifier.
-     *
-     * @return the cluster identifier
-     */
-    String fingerprint();
-}
diff --git a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LinkDiscovery.java b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LinkDiscovery.java
deleted file mode 100644
index c0a50f9..0000000
--- a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LinkDiscovery.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Copyright 2014-2015 Open Networking Laboratory
- *
- * 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.onosproject.provider.lldp.impl;
-
-import com.google.common.collect.Sets;
-
-import org.jboss.netty.util.Timeout;
-import org.jboss.netty.util.TimerTask;
-import org.onlab.packet.Ethernet;
-import org.onlab.packet.ONOSLLDP;
-import org.onlab.util.Timer;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Link.Type;
-import org.onosproject.net.LinkKey;
-import org.onosproject.net.Port;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.link.DefaultLinkDescription;
-import org.onosproject.net.link.LinkDescription;
-import org.onosproject.net.packet.DefaultOutboundPacket;
-import org.onosproject.net.packet.OutboundPacket;
-import org.onosproject.net.packet.PacketContext;
-import org.slf4j.Logger;
-
-import java.nio.ByteBuffer;
-import java.util.Set;
-
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static org.onosproject.net.PortNumber.portNumber;
-import static org.onosproject.net.flow.DefaultTrafficTreatment.builder;
-import static org.slf4j.LoggerFactory.getLogger;
-import static org.onosproject.cluster.ClusterMetadata.NO_NAME;
-
-/**
- * Run discovery process from a physical switch. Ports are initially labeled as
- * slow ports. When an LLDP is successfully received, label the remote port as
- * fast. Every probeRate milliseconds, loop over all fast ports and send an
- * LLDP, send an LLDP for a single slow port. Based on FlowVisor topology
- * discovery implementation.
- */
-class LinkDiscovery implements TimerTask {
-
-    private final Logger log = getLogger(getClass());
-
-    private static final String SRC_MAC = "DE:AD:BE:EF:BA:11";
-
-    private final Device device;
-    private final DiscoveryContext context;
-
-    private final Ethernet ethPacket;
-    private final Ethernet bddpEth;
-
-    private Timeout timeout;
-    private volatile boolean isStopped;
-    // This LinkDiscovery can handle remote link probes (default false).
-    private volatile boolean fingerprinted;
-    // Set of ports to be probed
-    private final Set<Long> ports = Sets.newConcurrentHashSet();
-
-    /**
-     * Instantiates discovery manager for the given physical switch. Creates a
-     * generic LLDP packet that will be customized for the port it is sent out on.
-     * Starts the the timer for the discovery process.
-     *
-     * @param device  the physical switch
-     * @param context discovery context
-     */
-    LinkDiscovery(Device device, DiscoveryContext context) {
-        this.device = device;
-        this.context = context;
-
-        ethPacket = new Ethernet();
-        ethPacket.setEtherType(Ethernet.TYPE_LLDP);
-        ethPacket.setDestinationMACAddress(ONOSLLDP.LLDP_NICIRA);
-        ethPacket.setPad(true);
-
-        bddpEth = new Ethernet();
-        bddpEth.setEtherType(Ethernet.TYPE_BSN);
-        bddpEth.setDestinationMACAddress(ONOSLLDP.BDDP_MULTICAST);
-        bddpEth.setPad(true);
-
-        fingerprinted = false;
-        isStopped = true;
-        start();
-        log.debug("Started discovery manager for switch {}", device.id());
-
-    }
-
-    synchronized void stop() {
-        if (!isStopped) {
-            isStopped = true;
-            timeout.cancel();
-        } else {
-            log.warn("LinkDiscovery stopped multiple times?");
-        }
-    }
-
-    synchronized void start() {
-        if (isStopped) {
-            isStopped = false;
-            timeout = Timer.getTimer().newTimeout(this, 0, MILLISECONDS);
-        } else {
-            log.warn("LinkDiscovery started multiple times?");
-        }
-    }
-
-    synchronized boolean isStopped() {
-        return isStopped || timeout.isCancelled();
-    }
-
-    /**
-     * Add physical port to discovery process.
-     * Send out initial LLDP and label it as slow port.
-     *
-     * @param port the port
-     */
-    void addPort(Port port) {
-        boolean newPort = ports.add(port.number().toLong());
-        boolean isMaster = context.mastershipService().isLocalMaster(device.id());
-        if (newPort && isMaster) {
-            log.debug("Sending initial probe to port {}@{}", port.number().toLong(), device.id());
-            sendProbes(port.number().toLong());
-        }
-    }
-
-    /**
-     * removed physical port from discovery process.
-     * @param port the port number
-     */
-    void removePort(PortNumber port) {
-        ports.remove(port.toLong());
-    }
-
-    /**
-     * Handles an incoming LLDP packet. Creates link in topology and adds the
-     * link for staleness tracking.
-     *
-     * @param packetContext packet context
-     * @return true if handled
-     */
-    boolean handleLldp(PacketContext packetContext) {
-        Ethernet eth = packetContext.inPacket().parsed();
-        if (eth == null) {
-            return false;
-        }
-
-        ONOSLLDP onoslldp = ONOSLLDP.parseONOSLLDP(eth);
-        if (onoslldp != null) {
-            if (notMy(onoslldp)) {
-                return true;
-            }
-
-            PortNumber srcPort = portNumber(onoslldp.getPort());
-            PortNumber dstPort = packetContext.inPacket().receivedFrom().port();
-            DeviceId srcDeviceId = DeviceId.deviceId(onoslldp.getDeviceString());
-            DeviceId dstDeviceId = packetContext.inPacket().receivedFrom().deviceId();
-
-            ConnectPoint src = new ConnectPoint(srcDeviceId, srcPort);
-            ConnectPoint dst = new ConnectPoint(dstDeviceId, dstPort);
-
-            LinkDescription ld = eth.getEtherType() == Ethernet.TYPE_LLDP ?
-                    new DefaultLinkDescription(src, dst, Type.DIRECT) :
-                    new DefaultLinkDescription(src, dst, Type.INDIRECT);
-
-            try {
-                context.providerService().linkDetected(ld);
-                context.touchLink(LinkKey.linkKey(src, dst));
-            } catch (IllegalStateException e) {
-                return true;
-            }
-            return true;
-        }
-        return false;
-    }
-
-    // true if *NOT* this cluster's own probe.
-    private boolean notMy(ONOSLLDP onoslldp) {
-        if (onoslldp.getDomainTLV() == null) {
-            // not finger-printed - but we can check the source
-            DeviceId src = DeviceId.deviceId(onoslldp.getDeviceString());
-            if (context.deviceService().getDevice(src) == null) {
-                return true;
-            }
-            return false;
-        }
-
-        String us = context.fingerprint();
-        String them = onoslldp.getDomainString();
-        // if: Our and/or their MetadataService in poorly state, conservative 'yes'
-        if (NO_NAME.equals(us) || NO_NAME.equals(them)) {
-            return true;
-        } else {
-            return !us.equals(them);
-        }
-    }
-
-    /**
-     * Execute this method every t milliseconds. Loops over all ports
-     * labeled as fast and sends out an LLDP. Send out an LLDP on a single slow
-     * port.
-     *
-     * @param t timeout
-     */
-    @Override
-    public void run(Timeout t) {
-        if (isStopped()) {
-            return;
-        }
-
-        if (context.mastershipService().isLocalMaster(device.id())) {
-            log.trace("Sending probes from {}", device.id());
-            ports.forEach(this::sendProbes);
-        }
-
-        if (!isStopped()) {
-            timeout = Timer.getTimer().newTimeout(this, context.probeRate(), MILLISECONDS);
-        }
-    }
-
-    /**
-     * Creates packet_out LLDP for specified output port.
-     *
-     * @param port the port
-     * @return Packet_out message with LLDP data
-     */
-    private OutboundPacket createOutBoundLldp(Long port) {
-        if (port == null) {
-            return null;
-        }
-        ONOSLLDP lldp = getLinkProbe(port);
-        ethPacket.setSourceMACAddress(SRC_MAC).setPayload(lldp);
-        return new DefaultOutboundPacket(device.id(),
-                                         builder().setOutput(portNumber(port)).build(),
-                                         ByteBuffer.wrap(ethPacket.serialize()));
-    }
-
-    /**
-     * Creates packet_out BDDP for specified output port.
-     *
-     * @param port the port
-     * @return Packet_out message with LLDP data
-     */
-    private OutboundPacket createOutBoundBddp(Long port) {
-        if (port == null) {
-            return null;
-        }
-        ONOSLLDP lldp = getLinkProbe(port);
-        bddpEth.setSourceMACAddress(SRC_MAC).setPayload(lldp);
-        return new DefaultOutboundPacket(device.id(),
-                                         builder().setOutput(portNumber(port)).build(),
-                                         ByteBuffer.wrap(bddpEth.serialize()));
-    }
-
-    private ONOSLLDP getLinkProbe(Long port) {
-        return fingerprinted
-                ? ONOSLLDP.fingerprintedLLDP(device.id().toString(), device.chassisId(),
-                                             port.intValue(), context.fingerprint())
-                : ONOSLLDP.onosLLDP(device.id().toString(), device.chassisId(),
-                                    port.intValue());
-    }
-
-    private void sendProbes(Long portNumber) {
-        log.trace("Sending probes out to {}@{}", portNumber, device.id());
-        OutboundPacket pkt = createOutBoundLldp(portNumber);
-        context.packetService().emit(pkt);
-        if (context.useBddp()) {
-            OutboundPacket bpkt = createOutBoundBddp(portNumber);
-            context.packetService().emit(bpkt);
-        }
-    }
-
-    boolean containsPort(long portNumber) {
-        return ports.contains(portNumber);
-    }
-
-    protected void enableFingerprint() {
-        fingerprinted = true;
-    }
-
-    protected void disableFingerprint() {
-        fingerprinted = false;
-    }
-}
diff --git a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java
index 3a6b7e3..23f67d1 100644
--- a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java
+++ b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java
@@ -62,6 +62,8 @@
 import org.onosproject.net.packet.PacketService;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
+import org.onosproject.provider.lldpcommon.LinkDiscoveryContext;
+import org.onosproject.provider.lldpcommon.LinkDiscovery;
 import org.onosproject.store.service.ConsistentMapException;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
@@ -169,7 +171,7 @@
             label = "Number of millis beyond which links will be considered stale")
     private int staleLinkAge = DEFAULT_STALE_LINK_AGE;
 
-    private final DiscoveryContext context = new InternalDiscoveryContext();
+    private final LinkDiscoveryContext context = new InternalDiscoveryContext();
     private final InternalRoleListener roleListener = new InternalRoleListener();
     private final InternalDeviceListener deviceListener = new InternalDeviceListener();
     private final InternalPacketProcessor packetProcessor = new InternalPacketProcessor();
@@ -718,7 +720,7 @@
     /**
      * Provides processing context for the device link discovery helpers.
      */
-    private class InternalDiscoveryContext implements DiscoveryContext {
+    private class InternalDiscoveryContext implements LinkDiscoveryContext {
         @Override
         public MastershipService mastershipService() {
             return masterService;
diff --git a/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LldpLinkProviderTest.java b/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LldpLinkProviderTest.java
index 20d615a..8b47f44 100644
--- a/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LldpLinkProviderTest.java
+++ b/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LldpLinkProviderTest.java
@@ -76,6 +76,7 @@
 import org.onosproject.net.packet.PacketProcessor;
 import org.onosproject.net.packet.PacketServiceAdapter;
 import org.onosproject.net.provider.ProviderId;
+import org.onosproject.provider.lldpcommon.LinkDiscovery;
 
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableList;
