diff --git a/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwarding.java b/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwarding.java
index a8ffed2..4b7ce67 100644
--- a/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwarding.java
+++ b/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwarding.java
@@ -468,8 +468,8 @@
 
             HostId id = HostId.hostId(ethPkt.getDestinationMAC());
 
-            // Do not process link-local addresses in any way.
-            if (id.mac().isLinkLocal()) {
+            // Do not process LLDP MAC address in any way.
+            if (id.mac().isLldp()) {
                 droppedPacket(macMetrics);
                 return;
             }
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 811baac..9cdf90e 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
@@ -29,6 +29,7 @@
 import org.junit.Test;
 import org.onlab.packet.ChassisId;
 import org.onlab.packet.Ethernet;
+import org.onlab.packet.MacAddress;
 import org.onlab.packet.ONOSLLDP;
 import org.onosproject.cfg.ComponentConfigAdapter;
 import org.onosproject.cluster.ClusterMetadataServiceAdapter;
@@ -658,7 +659,7 @@
 
             Ethernet ethPacket = new Ethernet();
             ethPacket.setEtherType(Ethernet.TYPE_LLDP);
-            ethPacket.setDestinationMACAddress(ONOSLLDP.LLDP_ONLAB);
+            ethPacket.setDestinationMACAddress(MacAddress.ONOS_LLDP);
             ethPacket.setPayload(lldp);
             ethPacket.setPad(true);
 
diff --git a/providers/lldpcommon/src/main/java/org/onosproject/provider/lldpcommon/LinkDiscovery.java b/providers/lldpcommon/src/main/java/org/onosproject/provider/lldpcommon/LinkDiscovery.java
index b012d28..f4e2231 100644
--- a/providers/lldpcommon/src/main/java/org/onosproject/provider/lldpcommon/LinkDiscovery.java
+++ b/providers/lldpcommon/src/main/java/org/onosproject/provider/lldpcommon/LinkDiscovery.java
@@ -20,6 +20,7 @@
 import org.jboss.netty.util.Timeout;
 import org.jboss.netty.util.TimerTask;
 import org.onlab.packet.Ethernet;
+import org.onlab.packet.MacAddress;
 import org.onlab.packet.ONOSLLDP;
 import org.onlab.util.Timer;
 import org.onosproject.net.ConnectPoint;
@@ -82,12 +83,12 @@
 
         ethPacket = new Ethernet();
         ethPacket.setEtherType(Ethernet.TYPE_LLDP);
-        ethPacket.setDestinationMACAddress(ONOSLLDP.LLDP_ONLAB);
+        ethPacket.setDestinationMACAddress(MacAddress.ONOS_LLDP);
         ethPacket.setPad(true);
 
         bddpEth = new Ethernet();
         bddpEth.setEtherType(Ethernet.TYPE_BSN);
-        bddpEth.setDestinationMACAddress(ONOSLLDP.BDDP_MULTICAST);
+        bddpEth.setDestinationMACAddress(MacAddress.BROADCAST);
         bddpEth.setPad(true);
 
         isStopped = true;
diff --git a/providers/netcfglinks/src/test/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProviderTest.java b/providers/netcfglinks/src/test/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProviderTest.java
index ce33f22..c98c481 100644
--- a/providers/netcfglinks/src/test/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProviderTest.java
+++ b/providers/netcfglinks/src/test/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProviderTest.java
@@ -21,6 +21,7 @@
 import org.junit.Test;
 import org.onlab.packet.ChassisId;
 import org.onlab.packet.Ethernet;
+import org.onlab.packet.MacAddress;
 import org.onlab.packet.ONOSLLDP;
 import org.onosproject.cluster.ClusterMetadataServiceAdapter;
 import org.onosproject.core.CoreServiceAdapter;
@@ -152,7 +153,7 @@
 
             Ethernet ethPacket = new Ethernet();
             ethPacket.setEtherType(Ethernet.TYPE_LLDP);
-            ethPacket.setDestinationMACAddress(ONOSLLDP.LLDP_ONLAB);
+            ethPacket.setDestinationMACAddress(MacAddress.ONOS_LLDP);
             ethPacket.setPayload(lldp);
             ethPacket.setPad(true);
 
diff --git a/utils/misc/src/main/java/org/onlab/packet/MacAddress.java b/utils/misc/src/main/java/org/onlab/packet/MacAddress.java
index 0fe46ab..a040b69 100644
--- a/utils/misc/src/main/java/org/onlab/packet/MacAddress.java
+++ b/utils/misc/src/main/java/org/onlab/packet/MacAddress.java
@@ -15,7 +15,10 @@
  */
 package org.onlab.packet;
 
+import com.google.common.collect.Sets;
+
 import java.util.Arrays;
+import java.util.Set;
 
 /**
  * The class representing MAC address.
@@ -24,8 +27,17 @@
 
     /**
      * Dummy MAC address.
+     * We use the first MAC address in ONOS OUI range as a dummy MAC address.
      */
-    public static final MacAddress NONE = valueOf("a4:23:05:00:00:00");
+    public static final MacAddress NONE = MacAddress.ONOS;
+    /**
+     * First MAC address in ONOS OUI range.
+     */
+    public static final MacAddress ONOS = valueOf("a4:23:05:00:00:00");
+    /**
+     * ONOS LLDP MAC address with multicast bit set.
+     */
+    public static final MacAddress ONOS_LLDP = valueOf("a5:23:05:00:00:01");
     /**
      * All-zero MAC address.
      */
@@ -42,11 +54,13 @@
      * IPv4 multicast MAC mask.
      */
     public static final MacAddress IPV4_MULTICAST_MASK = valueOf("ff:ff:ff:80:00:00");
-
-    private static final byte[] LL = new byte[]{
-            0x01, (byte) 0x80, (byte) 0xc2, 0x00, 0x00,
-            0x00, 0x0e, 0x03
-    };
+    /**
+     * A set of LLDP MAC addresses.
+     */
+    public static final Set<MacAddress> LLDP = Sets.newHashSet(
+            MacAddress.valueOf("01:80:c2:00:00:00"),
+            MacAddress.valueOf("01:80:c2:00:00:03"),
+            MacAddress.valueOf("01:80:c2:00:00:0e"));
 
     public static final int MAC_ADDRESS_LENGTH = 6;
     private byte[] address = new byte[MacAddress.MAC_ADDRESS_LENGTH];
@@ -183,11 +197,40 @@
      * Returns true if this MAC address is link local.
      *
      * @return true if link local
+     * @deprecated in Kingfisher release. Link local is not a correct description for
+     *             this MAC address. Replaced with {@link #isLldp()}
      */
+    @Deprecated
     public boolean isLinkLocal() {
-        return LL[0] == address[0] && LL[1] == address[1] && LL[2] == address[2] &&
-                LL[3] == address[3] && LL[4] == address[4] &&
-                (LL[5] == address[5] || LL[6] == address[5] || LL[7] == address[5]);
+        return isLldp();
+    }
+
+    /**
+     * Returns true if this MAC address is used by link layer discovery protocol.
+     *
+     * @return true if this MAC is LLDP MAC.
+     */
+    public boolean isLldp() {
+        return LLDP.contains(this);
+    }
+
+    /**
+     * Returns true if the Organizationally Unique Identifier (OUI) of this MAC
+     * address matches ONOS OUI.
+     *
+     * @return true if the OUI of this MAC address matches ONOS OUI.
+     */
+    public boolean isOnos() {
+        return Arrays.equals(this.oui(), ONOS.oui());
+    }
+
+    /**
+     * Returns the Organizationally Unique Identifier (OUI) of this MAC address.
+     *
+     * @return the OUI of this MAC address.
+     */
+    public byte[] oui() {
+        return Arrays.copyOfRange(this.address, 0, 3);
     }
 
     @Override
diff --git a/utils/misc/src/main/java/org/onlab/packet/ONOSLLDP.java b/utils/misc/src/main/java/org/onlab/packet/ONOSLLDP.java
index 40e99d4..d94a7ba 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ONOSLLDP.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ONOSLLDP.java
@@ -30,13 +30,31 @@
  *  ONOS LLDP containing organizational TLV for ONOS device discovery.
  */
 public class ONOSLLDP extends LLDP {
-
+    /**
+     * ONOS OUI.
+     *
+     * @deprecated in Kingfisher. Use MacAddress.ONOS.oui() instead.
+     */
+    @Deprecated
     public static final byte[] ONLAB_OUI = {(byte) 0xa4, 0x23, 0x05};
+
     public static final String DEFAULT_DEVICE = "INVALID";
     public static final String DEFAULT_NAME = "ONOS Discovery";
 
-    // ON.Lab OUI (a42305) with multicast bit set
+    /**
+     * ONOS LLDP multicast MAC address.
+     *
+     * @deprecated in Kingfisher. Use MacAddress.ONOS_LLDP instead.
+     */
+    @Deprecated
     public static final byte[] LLDP_ONLAB = {(byte) 0xa5, 0x23, 0x05, 0x00, 0x00, 0x01};
+
+    /**
+     * ONOS BDDP broadcast MAC address.
+     *
+     * @deprecated in Kingfisher. Use MacAddress.BROADCASAT instead.
+     */
+    @Deprecated
     public static final byte[] BDDP_MULTICAST = {(byte) 0xff, (byte) 0xff,
             (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};
 
@@ -95,7 +113,7 @@
         nametlv.setLength((short) (name.length() + NAME_LENGTH));
         nametlv.setInfoString(name);
         nametlv.setSubType(NAME_SUBTYPE);
-        nametlv.setOUI(ONLAB_OUI);
+        nametlv.setOUI(MacAddress.ONOS.oui());
     }
 
     public void setDevice(String device) {
@@ -103,7 +121,7 @@
         devicetlv.setInfoString(device);
         devicetlv.setLength((short) (device.length() + DEVICE_LENGTH));
         devicetlv.setSubType(DEVICE_SUBTYPE);
-        devicetlv.setOUI(ONLAB_OUI);
+        devicetlv.setOUI(MacAddress.ONOS.oui());
     }
 
     public void setDomainInfo(String domainId) {
@@ -115,7 +133,7 @@
         domaintlv.setInfoString(domainId);
         domaintlv.setLength((short) (domainId.length() + DOMAIN_LENGTH));
         domaintlv.setSubType(DOMAIN_SUBTYPE);
-        domaintlv.setOUI(ONLAB_OUI);
+        domaintlv.setOUI(MacAddress.ONOS.oui());
     }
 
     public void setChassisId(final ChassisId chassisId) {
diff --git a/utils/misc/src/test/java/org/onlab/packet/MacAddressTest.java b/utils/misc/src/test/java/org/onlab/packet/MacAddressTest.java
new file mode 100644
index 0000000..38a3b43
--- /dev/null
+++ b/utils/misc/src/test/java/org/onlab/packet/MacAddressTest.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2017-present 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.onlab.packet;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests for class {@link MacAddress}.
+ */
+public class MacAddressTest {
+    private static final MacAddress MAC_NORMAL = MacAddress.valueOf("00:00:00:00:00:01");
+    private static final MacAddress MAC_BCAST = MacAddress.valueOf("ff:ff:ff:ff:ff:ff");
+    private static final MacAddress MAC_MCAST = MacAddress.valueOf("01:00:5e:00:00:00");
+    private static final MacAddress MAC_MCAST_2 = MacAddress.valueOf("01:00:0c:cc:cc:cc");
+    private static final MacAddress MAC_LLDP = MacAddress.valueOf("01:80:c2:00:00:00");
+    private static final MacAddress MAC_LLDP_2 = MacAddress.valueOf("01:80:c2:00:00:03");
+    private static final MacAddress MAC_LLDP_3 = MacAddress.valueOf("01:80:c2:00:00:0e");
+    private static final MacAddress MAC_ONOS = MacAddress.valueOf("a4:23:05:01:02:03");
+    private static final MacAddress MAC_ONOS_EQUAL = MacAddress.valueOf("a4:23:05:01:02:03");
+
+    private static final byte[] OUI_ONOS = {(byte) 0xa4, (byte) 0x23, (byte) 0x05};
+    private static final byte[] MAC_ONOS_BYTE = {
+            (byte) 0xa4, (byte) 0x23, (byte) 0x05, (byte) 0x01, (byte) 0x02, (byte) 0x03
+    };
+    private static final long MAC_ONOS_LONG = 180470314762755L;
+    private static final String MAC_ONOS_STR = "A4:23:05:01:02:03";
+    private static final String MAC_ONOS_STR_NO_COLON = "A42305010203";
+
+    private static final int LENGTH = 6;
+
+    private static final String INVALID_STR = "invalid";
+    private static final byte[] INVALID_BYTE = {(byte) 0xaa};
+
+    @Test
+    public void testValueOfString() throws Exception {
+        assertArrayEquals(MAC_ONOS_BYTE, MacAddress.valueOf(MAC_ONOS_STR).toBytes());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testValueOfInvalidString() throws Exception {
+        MacAddress.valueOf(INVALID_STR);
+    }
+
+    @Test
+    public void testValueOfByte() throws Exception {
+        assertArrayEquals(MAC_ONOS_BYTE, MacAddress.valueOf(MAC_ONOS_BYTE).toBytes());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testValueOfInvalidByte() throws Exception {
+        MacAddress.valueOf(INVALID_BYTE);
+    }
+
+    @Test
+    public void testValueOfLong() throws Exception {
+        assertArrayEquals(MAC_ONOS_BYTE, MacAddress.valueOf(MAC_ONOS_LONG).toBytes());
+    }
+
+    @Test
+    public void testLength() throws Exception {
+        assertEquals(LENGTH, MAC_NORMAL.length());
+    }
+
+    @Test
+    public void testToBytes() throws Exception {
+        assertArrayEquals(MAC_ONOS_BYTE, MAC_ONOS.toBytes());
+    }
+
+    @Test
+    public void testToLong() throws Exception {
+        assertEquals(MAC_ONOS_LONG, MAC_ONOS.toLong());
+    }
+
+    @Test
+    public void testIsBroadcast() throws Exception {
+        assertFalse(MAC_NORMAL.isBroadcast());
+        assertTrue(MAC_BCAST.isBroadcast());
+        assertFalse(MAC_MCAST.isBroadcast());
+        assertFalse(MAC_MCAST_2.isBroadcast());
+        assertFalse(MAC_LLDP.isBroadcast());
+        assertFalse(MAC_LLDP_2.isBroadcast());
+        assertFalse(MAC_LLDP_3.isBroadcast());
+        assertFalse(MAC_ONOS.isBroadcast());
+    }
+
+    @Test
+    public void testIsMulticast() throws Exception {
+        // Note: LLDP MACs are also a multicast MACs
+        assertFalse(MAC_NORMAL.isMulticast());
+        assertFalse(MAC_BCAST.isMulticast());
+        assertTrue(MAC_MCAST.isMulticast());
+        assertTrue(MAC_MCAST_2.isMulticast());
+        assertTrue(MAC_LLDP.isMulticast());
+        assertTrue(MAC_LLDP_2.isMulticast());
+        assertTrue(MAC_LLDP_3.isMulticast());
+        assertFalse(MAC_ONOS.isMulticast());
+    }
+
+    @Test
+    @Deprecated
+    public void testIsLinkLocal() throws Exception {
+        assertFalse(MAC_NORMAL.isLinkLocal());
+        assertFalse(MAC_BCAST.isLinkLocal());
+        assertFalse(MAC_MCAST.isLinkLocal());
+        assertFalse(MAC_MCAST_2.isLinkLocal());
+        assertTrue(MAC_LLDP.isLinkLocal());
+        assertTrue(MAC_LLDP_2.isLinkLocal());
+        assertTrue(MAC_LLDP_3.isLinkLocal());
+        assertFalse(MAC_ONOS.isLinkLocal());
+    }
+
+
+    @Test
+    public void testIsLldp() throws Exception {
+        assertFalse(MAC_NORMAL.isLldp());
+        assertFalse(MAC_BCAST.isLldp());
+        assertFalse(MAC_MCAST.isLldp());
+        assertFalse(MAC_MCAST_2.isLldp());
+        assertTrue(MAC_LLDP.isLldp());
+        assertTrue(MAC_LLDP_2.isLldp());
+        assertTrue(MAC_LLDP_3.isLldp());
+        assertFalse(MAC_ONOS.isLldp());
+    }
+
+    @Test
+    public void testIsOnos() throws Exception {
+        assertFalse(MAC_NORMAL.isOnos());
+        assertFalse(MAC_BCAST.isOnos());
+        assertFalse(MAC_MCAST.isOnos());
+        assertFalse(MAC_MCAST_2.isOnos());
+        assertFalse(MAC_LLDP.isOnos());
+        assertFalse(MAC_LLDP_2.isOnos());
+        assertFalse(MAC_LLDP_3.isOnos());
+        assertTrue(MAC_ONOS.isOnos());
+    }
+
+    @Test
+    public void testOui() throws Exception {
+        assertArrayEquals(MAC_ONOS.oui(), OUI_ONOS);
+    }
+
+    @Test
+    public void testEquals() throws Exception {
+        assertTrue(MAC_ONOS.equals(MAC_ONOS));
+        assertFalse(MAC_ONOS.equals(MAC_ONOS_STR));
+        assertTrue(MAC_ONOS.equals(MAC_ONOS_EQUAL));
+        assertFalse(MAC_ONOS.equals(MAC_NORMAL));
+        assertFalse(MAC_ONOS.equals(MAC_BCAST));
+        assertFalse(MAC_ONOS.equals(MAC_MCAST));
+        assertFalse(MAC_ONOS.equals(MAC_MCAST_2));
+        assertFalse(MAC_ONOS.equals(MAC_LLDP));
+        assertFalse(MAC_ONOS.equals(MAC_LLDP_2));
+        assertFalse(MAC_ONOS.equals(MAC_LLDP_3));
+    }
+
+    @Test
+    public void testHashCode() throws Exception {
+        assertEquals(Long.hashCode(MAC_ONOS_LONG), MAC_ONOS.hashCode());
+    }
+
+    @Test
+    public void testToString() throws Exception {
+        assertEquals(MAC_ONOS_STR, MAC_ONOS.toString());
+    }
+
+    @Test
+    public void testToStringNoColon() throws Exception {
+        assertEquals(MAC_ONOS_STR_NO_COLON, MAC_ONOS.toStringNoColon());
+    }
+
+}
\ No newline at end of file
