diff --git a/src/main/java/net/onrc/onos/core/linkdiscovery/ILinkDiscoveryService.java b/src/main/java/net/onrc/onos/core/linkdiscovery/ILinkDiscoveryService.java
index fb2de2b..8f232b1 100644
--- a/src/main/java/net/onrc/onos/core/linkdiscovery/ILinkDiscoveryService.java
+++ b/src/main/java/net/onrc/onos/core/linkdiscovery/ILinkDiscoveryService.java
@@ -65,21 +65,4 @@
      * Removes a switch port from suppress lldp set.
      */
     public void removeFromSuppressLLDPs(long sw, short port);
-
-    /**
-     * Get the set of quarantined ports on a switch.
-     */
-    public Set<Short> getQuarantinedPorts(long sw);
-
-    /**
-     * Get the status of auto port fast feature.
-     */
-    public boolean isAutoPortFastFeature();
-
-    /**
-     * Set the state for auto port fast feature.
-     *
-     * @param autoPortFastFeature
-     */
-    public void setAutoPortFastFeature(boolean autoPortFastFeature);
 }
diff --git a/src/main/java/net/onrc/onos/core/linkdiscovery/LinkInfo.java b/src/main/java/net/onrc/onos/core/linkdiscovery/LinkInfo.java
index f757360..9d8481a 100644
--- a/src/main/java/net/onrc/onos/core/linkdiscovery/LinkInfo.java
+++ b/src/main/java/net/onrc/onos/core/linkdiscovery/LinkInfo.java
@@ -23,7 +23,6 @@
 
     public LinkInfo(Long firstSeenTime,
                     Long lastLldpReceivedTime,
-                    Long lastBddpReceivedTime,
                     int srcPortState,
                     int dstPortState) {
         super();
@@ -31,14 +30,12 @@
         this.dstPortState = dstPortState;
         this.firstSeenTime = firstSeenTime;
         this.lastLldpReceivedTime = lastLldpReceivedTime;
-        this.lastBddpReceivedTime = lastBddpReceivedTime;
     }
 
     protected Integer srcPortState;
     protected Integer dstPortState;
     protected Long firstSeenTime;
     protected Long lastLldpReceivedTime; /* Standard LLLDP received time */
-    protected Long lastBddpReceivedTime; /* Modified LLDP received time  */
 
     /**
      * The port states stored here are topology's last knowledge of
@@ -73,14 +70,6 @@
         this.lastLldpReceivedTime = unicastValidTime;
     }
 
-    public Long getMulticastValidTime() {
-        return lastBddpReceivedTime;
-    }
-
-    public void setMulticastValidTime(Long multicastValidTime) {
-        this.lastBddpReceivedTime = multicastValidTime;
-    }
-
     public Integer getSrcPortState() {
         return srcPortState;
     }
@@ -100,8 +89,6 @@
     public LinkType getLinkType() {
         if (lastLldpReceivedTime != null) {
             return LinkType.DIRECT_LINK;
-        } else if (lastBddpReceivedTime != null) {
-            return LinkType.MULTIHOP_LINK;
         }
         return LinkType.INVALID_LINK;
     }
@@ -115,7 +102,6 @@
         int result = 1;
         result = prime * result + ((firstSeenTime == null) ? 0 : firstSeenTime.hashCode());
         result = prime * result + ((lastLldpReceivedTime == null) ? 0 : lastLldpReceivedTime.hashCode());
-        result = prime * result + ((lastBddpReceivedTime == null) ? 0 : lastBddpReceivedTime.hashCode());
         result = prime * result + ((srcPortState == null) ? 0 : srcPortState.hashCode());
         result = prime * result + ((dstPortState == null) ? 0 : dstPortState.hashCode());
         return result;
@@ -153,14 +139,6 @@
             return false;
         }
 
-        if (lastBddpReceivedTime == null) {
-            if (other.lastBddpReceivedTime != null) {
-                return false;
-            }
-        } else if (!lastBddpReceivedTime.equals(other.lastBddpReceivedTime)) {
-            return false;
-        }
-
         if (srcPortState == null) {
             if (other.srcPortState != null) {
                 return false;
@@ -187,7 +165,6 @@
     @Override
     public String toString() {
         return "LinkInfo [unicastValidTime=" + ((lastLldpReceivedTime == null) ? "null" : lastLldpReceivedTime)
-                + ", multicastValidTime=" + ((lastBddpReceivedTime == null) ? "null" : lastBddpReceivedTime)
                 + ", srcPortState=" + ((srcPortState == null) ? "null" : srcPortState)
                 + ", dstPortState=" + ((dstPortState == null) ? "null" : srcPortState)
                 + "]";
diff --git a/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java b/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java
index 33dbf57..22baf58 100644
--- a/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java
+++ b/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java
@@ -18,9 +18,6 @@
 package net.onrc.onos.core.linkdiscovery.internal;
 
 import java.io.IOException;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -32,7 +29,6 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -45,7 +41,6 @@
 import net.floodlightcontroller.core.annotations.LogMessageCategory;
 import net.floodlightcontroller.core.annotations.LogMessageDoc;
 import net.floodlightcontroller.core.annotations.LogMessageDocs;
-import net.floodlightcontroller.core.internal.OFSwitchImpl;
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.floodlightcontroller.core.module.FloodlightModuleException;
 import net.floodlightcontroller.core.module.IFloodlightModule;
@@ -62,12 +57,8 @@
 import net.onrc.onos.core.linkdiscovery.LinkInfo;
 import net.onrc.onos.core.linkdiscovery.NodePortTuple;
 import net.onrc.onos.core.linkdiscovery.web.LinkDiscoveryWebRoutable;
-import net.onrc.onos.core.main.IOnosRemoteSwitch;
-import net.onrc.onos.core.packet.BSN;
 import net.onrc.onos.core.packet.Ethernet;
-import net.onrc.onos.core.packet.IPv4;
 import net.onrc.onos.core.packet.LLDP;
-import net.onrc.onos.core.packet.LLDPTLV;
 import net.onrc.onos.core.packet.OnosLldp;
 import net.onrc.onos.core.registry.IControllerRegistryService;
 import net.onrc.onos.core.util.SwitchPort;
@@ -124,35 +115,12 @@
     protected IControllerRegistryService registryService;
 
 
-    // LLDP and BDDP fields
+    // LLDP fields
     private static final byte[] LLDP_STANDARD_DST_MAC_STRING =
             HexString.fromHexString("01:80:c2:00:00:0e");
     private static final long LINK_LOCAL_MASK = 0xfffffffffff0L;
     private static final long LINK_LOCAL_VALUE = 0x0180c2000000L;
 
-    // BigSwitch OUI is 5C:16:C7, so 5D:16:C7 is the multicast version
-    // private static final String LLDP_BSN_DST_MAC_STRING = "5d:16:c7:00:00:01";
-    private static final String LLDP_BSN_DST_MAC_STRING = "ff:ff:ff:ff:ff:ff";
-
-
-    // Direction TLVs are used to indicate if the LLDPs were sent
-    // periodically or in response to a recieved LLDP
-    private static final byte TLV_DIRECTION_TYPE = 0x73;
-    private static final short TLV_DIRECTION_LENGTH = 1;  // 1 byte
-    private static final byte[] TLV_DIRECTION_VALUE_FORWARD = {0x01};
-    private static final byte[] TLV_DIRECTION_VALUE_REVERSE = {0x02};
-    private static final LLDPTLV FORWARD_TLV
-            = new LLDPTLV().
-            setType(TLV_DIRECTION_TYPE).
-            setLength(TLV_DIRECTION_LENGTH).
-            setValue(TLV_DIRECTION_VALUE_FORWARD);
-
-    private static final LLDPTLV REVERSE_TLV
-            = new LLDPTLV().
-            setType(TLV_DIRECTION_TYPE).
-            setLength(TLV_DIRECTION_LENGTH).
-            setValue(TLV_DIRECTION_VALUE_REVERSE);
-
     // Link discovery task details.
     protected SingletonTask discoveryTask;
     protected static final int DISCOVERY_TASK_INTERVAL = 1;
@@ -164,23 +132,10 @@
     // value to a small number, say 1 or 2 sec.
     protected static final int LLDP_TO_KNOWN_INTERVAL = 20; // LLDP frequency for known links
 
-    protected LLDPTLV controllerTLV;
     protected ReentrantReadWriteLock lock;
     int lldpTimeCount = 0;
 
     /**
-     * Flag to indicate if automatic port fast is enabled or not.
-     * Default is set to false -- Initialized in the init method as well.
-     */
-    boolean autoPortFastFeature = false;
-
-    /**
-     * Map of remote switches that are not connected to this controller. This
-     * is used to learn remote switches in a distributed controller ONOS.
-     */
-    protected Map<Long, IOnosRemoteSwitch> remoteSwitches;
-
-    /**
      * Map from link to the most recent time it was verified functioning.
      */
     protected Map<Link, LinkInfo> links;
@@ -196,14 +151,6 @@
     protected Map<NodePortTuple, Set<Link>> portLinks;
 
     /**
-     * Set of link tuples over which multicast LLDPs are received
-     * and unicast LLDPs are not received.
-     */
-    protected Map<NodePortTuple, Set<Link>> portBroadcastDomainLinks;
-
-    protected volatile boolean shuttingDown = false;
-
-    /**
      * Topology aware components are called in the order they were added to the
      * the array.
      */
@@ -251,14 +198,8 @@
      * them.  Data traffic from these ports are not allowed until the ports
      * are released from quarantine.
      */
-    protected LinkedBlockingQueue<NodePortTuple> quarantineQueue;
-    protected LinkedBlockingQueue<NodePortTuple> maintenanceQueue;
-    /**
-     * Quarantine task.
-     */
-    //protected SingletonTask bddpTask;
-    protected static final int BDDP_TASK_INTERVAL = 100; // 100 ms.
-    protected static final int BDDP_TASK_SIZE = 5;       // # of ports per iteration
+    //protected LinkedBlockingQueue<NodePortTuple> quarantineQueue;
+    //protected LinkedBlockingQueue<NodePortTuple> maintenanceQueue;
 
     /**
      * Map of broadcast domain ports and the last time a BDDP was either
@@ -315,20 +256,10 @@
         discover(npt);
     }
 
-    public boolean isShuttingDown() {
-        return shuttingDown;
-    }
-
-    public boolean isFastPort(long sw, short port) {
-        return false;
-    }
-
     @Override
     public ILinkDiscovery.LinkType getLinkType(Link lt, LinkInfo info) {
         if (info.getUnicastValidTime() != null) {
             return ILinkDiscovery.LinkType.DIRECT_LINK;
-        } else if (info.getMulticastValidTime() != null) {
-            return ILinkDiscovery.LinkType.MULTIHOP_LINK;
         }
         return ILinkDiscovery.LinkType.INVALID_LINK;
     }
@@ -352,155 +283,6 @@
         }
     }
 
-
-    /**
-     * Quarantine Ports.
-     */
-    /*
-    protected class QuarantineWorker implements Runnable {
-        @Override
-        public void run() {
-            try {
-                processBDDPLists();
-            } catch (Exception e) {
-                log.error("Error in quarantine worker thread", e);
-            } finally {
-                bddpTask.reschedule(BDDP_TASK_INTERVAL,
-                        TimeUnit.MILLISECONDS);
-            }
-        }
-    }
-    */
-
-    /**
-     * Add a switch port to the quarantine queue. Schedule the
-     * quarantine task if the quarantine queue was empty before adding
-     * this switch port.
-     *
-     * @param npt
-     */
-    protected void addToQuarantineQueue(NodePortTuple npt) {
-        if (!quarantineQueue.contains(npt)) {
-            quarantineQueue.add(npt);
-        }
-    }
-
-    /**
-     * Remove a switch port from the quarantine queue.
-     */
-    protected void removeFromQuarantineQueue(NodePortTuple npt) {
-        // Remove all occurrences of the node port tuple from the list.
-        boolean removedSomething;
-
-        do {
-            removedSomething = quarantineQueue.remove(npt);
-        } while (removedSomething);
-    }
-
-    /**
-     * Add a switch port to maintenance queue.
-     *
-     * @param npt
-     */
-    protected void addToMaintenanceQueue(NodePortTuple npt) {
-        // TODO We are not checking if the switch port tuple is already
-        // in the maintenance list or not.  This will be an issue for
-        // really large number of switch ports in the network.
-        if (!maintenanceQueue.contains(npt)) {
-            maintenanceQueue.add(npt);
-        }
-    }
-
-    /**
-     * Remove a switch port from maintenance queue.
-     *
-     * @param npt
-     */
-    protected void removeFromMaintenanceQueue(NodePortTuple npt) {
-        // Remove all occurrences of the node port tuple from the queue.
-        boolean removedSomething;
-        do {
-            removedSomething = maintenanceQueue.remove(npt);
-        } while (removedSomething);
-    }
-
-    /**
-     * This method processes the quarantine list in bursts.  The task is
-     * at most once per BDDP_TASK_INTERVAL.
-     * One each call, BDDP_TASK_SIZE number of switch ports are processed.
-     * Once the BDDP packets are sent out through the switch ports, the ports
-     * are removed from the quarantine list.
-     */
-
-    protected void processBDDPLists() {
-        int count = 0;
-        Set<NodePortTuple> nptList = new HashSet<NodePortTuple>();
-
-        while (count < BDDP_TASK_SIZE && quarantineQueue.peek() != null) {
-            NodePortTuple npt;
-            npt = quarantineQueue.remove();
-            sendDiscoveryMessage(npt.getNodeId(), npt.getPortId(), false, false);
-            nptList.add(npt);
-            count++;
-        }
-
-        count = 0;
-        while (count < BDDP_TASK_SIZE && maintenanceQueue.peek() != null) {
-            NodePortTuple npt;
-            npt = maintenanceQueue.remove();
-            sendDiscoveryMessage(npt.getNodeId(), npt.getPortId(), false, false);
-            count++;
-        }
-
-        for (NodePortTuple npt : nptList) {
-            generateSwitchPortStatusUpdate(npt.getNodeId(), npt.getPortId());
-        }
-    }
-
-    @Override
-    public Set<Short> getQuarantinedPorts(long sw) {
-        Set<Short> qPorts = new HashSet<Short>();
-
-        Iterator<NodePortTuple> iter = quarantineQueue.iterator();
-        while (iter.hasNext()) {
-            NodePortTuple npt = iter.next();
-            if (npt.getNodeId() == sw) {
-                qPorts.add(npt.getPortId());
-            }
-        }
-        return qPorts;
-    }
-
-    private void generateSwitchPortStatusUpdate(long sw, short port) {
-        UpdateOperation operation;
-
-        IOFSwitch iofSwitch = floodlightProvider.getSwitches().get(sw);
-        if (iofSwitch == null) {
-            return;
-        }
-
-        OFPhysicalPort ofp = iofSwitch.getPort(port);
-        if (ofp == null) {
-            return;
-        }
-
-        int srcPortState = ofp.getState();
-        boolean portUp = ((srcPortState &
-                OFPortState.OFPPS_STP_MASK.getValue()) !=
-                OFPortState.OFPPS_STP_BLOCK.getValue());
-
-        if (portUp) {
-            operation = UpdateOperation.PORT_UP;
-        } else {
-            operation = UpdateOperation.PORT_DOWN;
-        }
-
-        LinkUpdate update = new LinkUpdate(new LDUpdate(sw, port, operation));
-
-
-        controller.publishUpdate(update);
-    }
-
     /**
      * Send LLDP on known ports.
      */
@@ -520,37 +302,7 @@
     }
 
     protected void discover(long sw, short port) {
-        sendDiscoveryMessage(sw, port, true, false);
-    }
-
-    /**
-     * Learn remote switches when running as a distributed controller ONOS.
-     */
-    protected IOFSwitch addRemoteSwitch(long sw, short port) {
-        IOnosRemoteSwitch remotesw = null;
-
-        // add a switch if we have not seen it before
-        remotesw = remoteSwitches.get(sw);
-
-        if (remotesw == null) {
-            remotesw = new OFSwitchImpl();
-            remotesw.setupRemoteSwitch(sw);
-            remoteSwitches.put(remotesw.getId(), remotesw);
-            log.debug("addRemoteSwitch(): added fake remote sw {}", remotesw);
-        }
-
-        // add the port if we have not seen it before
-        if (remotesw.getPort(port) == null) {
-            OFPhysicalPort remoteport = new OFPhysicalPort();
-            remoteport.setPortNumber(port);
-            remoteport.setName("fake_" + port);
-            remoteport.setConfig(0);
-            remoteport.setState(0);
-            remotesw.setPort(remoteport);
-            log.debug("addRemoteSwitch(): added fake remote port {} to sw {}", remoteport, remotesw.getId());
-        }
-
-        return remotesw;
+        sendDiscoveryMessage(sw, port, false);
     }
 
     /**
@@ -572,7 +324,6 @@
                     "to the switch.",
             recommendation = LogMessageDoc.CHECK_SWITCH)
     protected void sendDiscoveryMessage(long sw, short port,
-                                        boolean isStandard,
                                         boolean isReverse) {
 
         IOFSwitch iofSwitch = floodlightProvider.getSwitches().get(sw);
@@ -600,11 +351,6 @@
             return;
         }
 
-        // For fast ports, do not send forward LLDPs or BDDPs.
-        if (!isReverse && autoPortFastFeature && isFastPort(sw, port)) {
-            return;
-        }
-
         if (log.isTraceEnabled()) {
             log.trace("Sending LLDP packet out of swich: {}, port: {}",
                     sw, port);
@@ -685,62 +431,14 @@
                     if (isLinkDiscoverySuppressed(sw, ofp.getPortNumber())) {
                         continue;
                     }
-                    if (autoPortFastFeature && isFastPort(sw, ofp.getPortNumber())) {
-                        continue;
-                    }
 
                     // sends forward LLDP only non-fastports.
-                    sendDiscoveryMessage(sw, ofp.getPortNumber(), true, false);
-
-                    // If the switch port is not alreayd in the maintenance
-                    // queue, add it.
-                    //NodePortTuple npt = new NodePortTuple(sw, ofp.getPortNumber());
-                    //addToMaintenanceQueue(npt);
+                    sendDiscoveryMessage(sw, ofp.getPortNumber(), false);
                 }
             }
         }
     }
 
-    protected void setControllerTLV() {
-        //Setting the controllerTLVValue based on current nano time,
-        //controller's IP address, and the network interface object hash
-        //the corresponding IP address.
-
-        final int prime = 7867;
-        InetAddress localIPAddress = null;
-        NetworkInterface localInterface = null;
-
-        byte[] controllerTLVValue = new byte[]{0, 0, 0, 0, 0, 0, 0, 0};  // 8 byte value.
-        ByteBuffer bb = ByteBuffer.allocate(10);
-
-        try {
-            localIPAddress = java.net.InetAddress.getLocalHost();
-            localInterface = NetworkInterface.getByInetAddress(localIPAddress);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        long result = System.nanoTime();
-        if (localIPAddress != null) {
-            result = result * prime + IPv4.toIPv4Address(localIPAddress.getHostAddress());
-        }
-        if (localInterface != null) {
-            result = result * prime + localInterface.hashCode();
-        }
-        // set the first 4 bits to 0.
-        result = result & (0x0fffffffffffffffL);
-
-        bb.putLong(result);
-
-        bb.rewind();
-        bb.get(controllerTLVValue, 0, 8);
-
-        this.controllerTLV = new LLDPTLV()
-                                .setType((byte) 0x0c)
-                                .setLength((short) controllerTLVValue.length)
-                                .setValue(controllerTLVValue);
-    }
-
     @Override
     public String getName() {
         return "linkdiscovery";
@@ -766,7 +464,7 @@
         return Command.CONTINUE;
     }
 
-    private Command handleLldp(LLDP lldp, long sw, OFPacketIn pi, boolean isStandard, FloodlightContext cntx) {
+    private Command handleLldp(LLDP lldp, long sw, OFPacketIn pi) {
         // If LLDP is suppressed on this port, ignore received packet as well
         IOFSwitch iofSwitch = floodlightProvider.getSwitches().get(sw);
         if (iofSwitch == null) {
@@ -783,35 +481,6 @@
         }
 
         // Verify this LLDP packet matches what we're looking for
-        /*
-        for (LLDPTLV lldptlv : lldp.getOptionalTLVList()) {
-            if (lldptlv.getType() == 127 && lldptlv.getLength() == 12 &&
-                    lldptlv.getValue()[0] == 0x0 && lldptlv.getValue()[1] == 0x26 &&
-                    lldptlv.getValue()[2] == (byte) 0xe1 && lldptlv.getValue()[3] == 0x0) {
-                ByteBuffer dpidBB = ByteBuffer.wrap(lldptlv.getValue());
-                remoteSwitch = floodlightProvider.getSwitches().get(dpidBB.getLong(4));
-                if (remoteSwitch == null) {
-                    // Added by ONOS
-                    // floodlight LLDP coming from a remote switch connected to a different controller
-                    // add it to our cache of unconnected remote switches
-                    remoteSwitch = addRemoteSwitch(dpidBB.getLong(4), remotePort);
-                }
-            } else if (lldptlv.getType() == 12 && lldptlv.getLength() == 8) {
-                otherId = ByteBuffer.wrap(lldptlv.getValue()).getLong();
-                if (myId == otherId) {
-                    myLLDP = true;
-                }
-            } else if (lldptlv.getType() == TLV_DIRECTION_TYPE &&
-                    lldptlv.getLength() == TLV_DIRECTION_LENGTH) {
-                if (lldptlv.getValue()[0] == TLV_DIRECTION_VALUE_FORWARD[0]) {
-                    isReverse = false;
-                } else if (lldptlv.getValue()[0] == TLV_DIRECTION_VALUE_REVERSE[0]) {
-                    isReverse = true;
-                }
-            }
-        }
-        */
-
         byte[] packetData = pi.getPacketData();
         if (!OnosLldp.isOnosLldp(packetData)) {
             log.trace("Dropping LLDP that wasn't sent by ONOS");
@@ -856,20 +525,12 @@
         // Store the time of update to this link, and push it out to routingEngine
         Link lt = new Link(remoteDpid, remotePort, iofSwitch.getId(), pi.getInPort());
 
-
-        Long lastLldpTime = null;
-        Long lastBddpTime = null;
-
         Long firstSeenTime = System.currentTimeMillis();
 
-        if (isStandard) {
-            lastLldpTime = System.currentTimeMillis();
-        } else {
-            lastBddpTime = System.currentTimeMillis();
-        }
+        Long lastLldpTime = System.currentTimeMillis();
 
         LinkInfo newLinkInfo =
-                new LinkInfo(firstSeenTime, lastLldpTime, lastBddpTime,
+                new LinkInfo(firstSeenTime, lastLldpTime,
                         srcPortState, dstPortState);
 
         addOrUpdateLink(lt, newLinkInfo);
@@ -882,14 +543,14 @@
         boolean isReverse = OnosLldp.isReverse(lldp);
 
         newLinkInfo = links.get(lt);
-        if (newLinkInfo != null && isStandard && !isReverse) {
+        if (newLinkInfo != null && !isReverse) {
             Link reverseLink = new Link(lt.getDst(), lt.getDstPort(),
                     lt.getSrc(), lt.getSrcPort());
             LinkInfo reverseInfo = links.get(reverseLink);
             if (reverseInfo == null) {
                 // the reverse link does not exist.
                 if (newLinkInfo.getFirstSeenTime() > System.currentTimeMillis() - LINK_TIMEOUT) {
-                    this.sendDiscoveryMessage(lt.getDst(), lt.getDstPort(), isStandard, true);
+                    this.sendDiscoveryMessage(lt.getDst(), lt.getDstPort(), true);
                 }
             }
         }
@@ -904,22 +565,8 @@
                 IFloodlightProviderService.bcStore.get(cntx,
                         IFloodlightProviderService.CONTEXT_PI_PAYLOAD);
 
-        if (eth.getEtherType() == Ethernet.TYPE_BSN) {
-            BSN bsn = (BSN) eth.getPayload();
-            if (bsn == null) {
-                return Command.STOP;
-            }
-            if (bsn.getPayload() == null) {
-                return Command.STOP;
-            }
-            // It could be a packet other than BSN LLDP, therefore
-            // continue with the regular processing.
-            if (!(bsn.getPayload() instanceof LLDP)) {
-                return Command.CONTINUE;
-            }
-            return handleLldp((LLDP) bsn.getPayload(), sw, pi, false, cntx);
-        } else if (eth.getEtherType() == Ethernet.TYPE_LLDP) {
-            return handleLldp((LLDP) eth.getPayload(), sw, pi, true, cntx);
+        if (eth.getEtherType() == Ethernet.TYPE_LLDP) {
+            return handleLldp((LLDP) eth.getPayload(), sw, pi);
         } else if (eth.getEtherType() < 1500) {
             long destMac = eth.getDestinationMAC().toLong();
             if ((destMac & LINK_LOCAL_MASK) == LINK_LOCAL_VALUE) {
@@ -931,12 +578,6 @@
             }
         }
 
-        // If packet-in is from a quarantine port, stop processing.
-        NodePortTuple npt = new NodePortTuple(sw, pi.getInPort());
-        if (quarantineQueue.contains(npt)) {
-            return Command.STOP;
-        }
-
         return Command.CONTINUE;
     }
 
@@ -984,9 +625,7 @@
             }
 
             if (log.isTraceEnabled()) {
-                log.trace("addOrUpdateLink: {} {}",
-                        lt,
-                        (newInfo.getMulticastValidTime() != null) ? "multicast" : "unicast");
+                log.trace("addOrUpdateLink: {}", lt);
             }
 
             UpdateOperation updateOperation = null;
@@ -1019,11 +658,6 @@
                 }
                 portLinks.get(dstNpt).add(lt);
 
-                // Add to portNOFLinks if the unicast valid time is null
-                if (newInfo.getUnicastValidTime() == null) {
-                    addLinkToBroadcastDomain(lt);
-                }
-
                 // ONOS: Distinguish added event separately from updated event
                 updateOperation = UpdateOperation.LINK_ADDED;
                 linkChanged = true;
@@ -1037,12 +671,6 @@
                     if (oldInfo.getUnicastValidTime() != null) {
                         newInfo.setUnicastValidTime(oldInfo.getUnicastValidTime());
                     }
-                } else if (newInfo.getMulticastValidTime() == null) {
-                    // This is due to a unicast LLDP, so copy the old multicast
-                    // value.
-                    if (oldInfo.getMulticastValidTime() != null) {
-                        newInfo.setMulticastValidTime(oldInfo.getMulticastValidTime());
-                    }
                 }
 
                 Long oldTime = oldInfo.getUnicastValidTime();
@@ -1052,12 +680,12 @@
                 if (oldTime != null & newTime == null) {
                     // openflow -> non-openflow transition
                     // we need to add the link tuple to the portNOFLinks
-                    addLinkToBroadcastDomain(lt);
+                    //addLinkToBroadcastDomain(lt);
                     linkChanged = true;
                 } else if (oldTime == null & newTime != null) {
                     // non-openflow -> openflow transition
                     // we need to remove the link from the portNOFLinks
-                    removeLinkFromBroadcastDomain(lt);
+                    //removeLinkFromBroadcastDomain(lt);
                     linkChanged = true;
                 }
 
@@ -1290,20 +918,8 @@
         if (isLinkDiscoverySuppressed(sw, p)) {
             // Do nothing as link discovery is suppressed.
             return;
-        } else if (autoPortFastFeature && isFastPort(sw, p)) {
-            // Do nothing as the port is a fast port.
-            return;
         } else {
-            NodePortTuple npt = new NodePortTuple(sw, p);
             discover(sw, p);
-            // if it is not a fast port, add it to quarantine.
-            if (!isFastPort(sw, p)) {
-                addToQuarantineQueue(npt);
-            } else {
-                // Add to maintenance queue to ensure that BDDP packets
-                // are sent out.
-                addToMaintenanceQueue(npt);
-            }
         }
     }
 
@@ -1410,14 +1026,14 @@
                         (info.getUnicastValidTime() + (1000L * LINK_TIMEOUT) < curTime)) {
                     info.setUnicastValidTime(null);
 
-                    if (info.getMulticastValidTime() != null) {
-                        addLinkToBroadcastDomain(lt);
-                    }
+                    //if (info.getMulticastValidTime() != null) {
+                        //addLinkToBroadcastDomain(lt);
+                    //}
                     // Note that even if mTime becomes null later on,
                     // the link would be deleted, which would trigger updateClusters().
                     linkChanged = true;
                 }
-                if ((info.getMulticastValidTime() != null) &&
+                /*if ((info.getMulticastValidTime() != null) &&
                         (info.getMulticastValidTime() + (1000L * LINK_TIMEOUT) < curTime)) {
                     info.setMulticastValidTime(null);
                     // if uTime is not null, then link will remain as openflow
@@ -1425,11 +1041,11 @@
                     // don't care about linkChanged flag here.
                     removeLinkFromBroadcastDomain(lt);
                     linkChanged = true;
-                }
+                }*/
                 // Add to the erase list only if the unicast
                 // time is null.
-                if (info.getUnicastValidTime() == null &&
-                        info.getMulticastValidTime() == null) {
+                if (info.getUnicastValidTime() == null) { //&&
+                        //info.getMulticastValidTime() == null) {
                     eraseList.add(entry.getKey());
                 } else if (linkChanged) {
                     UpdateOperation operation;
@@ -1468,10 +1084,6 @@
         return true;
     }
 
-    public Map<NodePortTuple, Set<Link>> getPortBroadcastDomainLinks() {
-        return portBroadcastDomainLinks;
-    }
-
     @Override
     public Map<Link, LinkInfo> getLinks() {
         lock.readLock().lock();
@@ -1484,44 +1096,6 @@
         return result;
     }
 
-    protected void addLinkToBroadcastDomain(Link lt) {
-
-        NodePortTuple srcNpt, dstNpt;
-        srcNpt = new NodePortTuple(lt.getSrc(), lt.getSrcPort());
-        dstNpt = new NodePortTuple(lt.getDst(), lt.getDstPort());
-
-        if (!portBroadcastDomainLinks.containsKey(srcNpt)) {
-            portBroadcastDomainLinks.put(srcNpt, new HashSet<Link>());
-        }
-        portBroadcastDomainLinks.get(srcNpt).add(lt);
-
-        if (!portBroadcastDomainLinks.containsKey(dstNpt)) {
-            portBroadcastDomainLinks.put(dstNpt, new HashSet<Link>());
-        }
-        portBroadcastDomainLinks.get(dstNpt).add(lt);
-    }
-
-    protected void removeLinkFromBroadcastDomain(Link lt) {
-
-        NodePortTuple srcNpt, dstNpt;
-        srcNpt = new NodePortTuple(lt.getSrc(), lt.getSrcPort());
-        dstNpt = new NodePortTuple(lt.getDst(), lt.getDstPort());
-
-        if (portBroadcastDomainLinks.containsKey(srcNpt)) {
-            portBroadcastDomainLinks.get(srcNpt).remove(lt);
-            if (portBroadcastDomainLinks.get(srcNpt).isEmpty()) {
-                portBroadcastDomainLinks.remove(srcNpt);
-            }
-        }
-
-        if (portBroadcastDomainLinks.containsKey(dstNpt)) {
-            portBroadcastDomainLinks.get(dstNpt).remove(lt);
-            if (portBroadcastDomainLinks.get(dstNpt).isEmpty()) {
-                portBroadcastDomainLinks.remove(dstNpt);
-            }
-        }
-    }
-
     @Override
     public void addListener(ILinkDiscoveryListener listener) {
         linkDiscoveryAware.add(listener);
@@ -1564,7 +1138,6 @@
         Collection<Class<? extends IFloodlightService>> l =
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(ILinkDiscoveryService.class);
-        //l.add(ITopologyService.class);
         return l;
     }
 
@@ -1601,9 +1174,6 @@
         // Added by ONOS
         registryService = context.getServiceImpl(IControllerRegistryService.class);
 
-        // Set the autoportfast feature to false.
-        this.autoPortFastFeature = false;
-
         // We create this here because there is no ordering guarantee
         this.linkDiscoveryAware = new ArrayList<ILinkDiscoveryListener>();
         this.lock = new ReentrantReadWriteLock();
@@ -1611,12 +1181,7 @@
         this.portLinks = new HashMap<NodePortTuple, Set<Link>>();
         this.suppressLinkDiscovery =
                 Collections.synchronizedSet(new HashSet<NodePortTuple>());
-        this.portBroadcastDomainLinks = new HashMap<NodePortTuple, Set<Link>>();
         this.switchLinks = new HashMap<Long, Set<Link>>();
-        this.quarantineQueue = new LinkedBlockingQueue<NodePortTuple>();
-        this.maintenanceQueue = new LinkedBlockingQueue<NodePortTuple>();
-        // Added by ONOS
-        this.remoteSwitches = new HashMap<Long, IOnosRemoteSwitch>();
     }
 
     @Override
@@ -1657,13 +1222,9 @@
                 } catch (Exception e) {
                     log.error("Exception in LLDP send timer.", e);
                 } finally {
-                    if (!shuttingDown) {
-                        // Always reschedule link discovery if we're not
-                        // shutting down (no chance of SLAVE role now)
-                        log.trace("Rescheduling discovery task");
-                        discoveryTask.reschedule(DISCOVERY_TASK_INTERVAL,
-                                TimeUnit.SECONDS);
-                    }
+                    log.trace("Rescheduling discovery task");
+                    discoveryTask.reschedule(DISCOVERY_TASK_INTERVAL,
+                            TimeUnit.SECONDS);
                 }
             }
         });
@@ -1671,30 +1232,11 @@
         // Always reschedule link discovery as we are never in SLAVE role now
         discoveryTask.reschedule(DISCOVERY_TASK_INTERVAL, TimeUnit.SECONDS);
 
-        // Setup the BDDP task.  It is invoked whenever switch port tuples
-        // are added to the quarantine list.
-        //bddpTask = new SingletonTask(ses, new QuarantineWorker());
-        //bddpTask.reschedule(BDDP_TASK_INTERVAL, TimeUnit.MILLISECONDS);
-
-
         // Register for the OpenFlow messages we want to receive
         floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
         floodlightProvider.addOFMessageListener(OFType.PORT_STATUS, this);
         // Register for switch updates
         floodlightProvider.addOFSwitchListener(this);
-        if (restApi != null) {
-            restApi.addRestletRoutable(new LinkDiscoveryWebRoutable());
-        }
-        setControllerTLV();
-    }
-
-    @Override
-    public boolean isAutoPortFastFeature() {
-        return autoPortFastFeature;
-    }
-
-    @Override
-    public void setAutoPortFastFeature(boolean autoPortFastFeature) {
-        this.autoPortFastFeature = autoPortFastFeature;
+        restApi.addRestletRoutable(new LinkDiscoveryWebRoutable());
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/linkdiscovery/web/AutoPortFast.java b/src/main/java/net/onrc/onos/core/linkdiscovery/web/AutoPortFast.java
deleted file mode 100644
index a13116f..0000000
--- a/src/main/java/net/onrc/onos/core/linkdiscovery/web/AutoPortFast.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package net.onrc.onos.core.linkdiscovery.web;
-
-import net.onrc.onos.core.linkdiscovery.ILinkDiscoveryService;
-
-import org.restlet.data.Status;
-import org.restlet.resource.Get;
-import org.restlet.resource.ServerResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class AutoPortFast extends ServerResource {
-    private static final Logger log = LoggerFactory.getLogger(AutoPortFast.class);
-
-    @Get("json")
-    public String retrieve() {
-        ILinkDiscoveryService linkDiscovery;
-        linkDiscovery = (ILinkDiscoveryService) getContext().getAttributes().
-                get(ILinkDiscoveryService.class.getCanonicalName());
-
-        String param = ((String) getRequestAttributes().get("state")).toLowerCase();
-        if (param.equals("enable") || param.equals("true")) {
-            linkDiscovery.setAutoPortFastFeature(true);
-        } else if (param.equals("disable") || param.equals("false")) {
-            linkDiscovery.setAutoPortFastFeature(false);
-        }
-        setStatus(Status.SUCCESS_OK, "OK");
-        if (linkDiscovery.isAutoPortFastFeature()) {
-            return "enabled";
-        } else {
-            return "disabled";
-        }
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/linkdiscovery/web/LinkDiscoveryWebRoutable.java b/src/main/java/net/onrc/onos/core/linkdiscovery/web/LinkDiscoveryWebRoutable.java
index 39ecbfa..bf223c7 100644
--- a/src/main/java/net/onrc/onos/core/linkdiscovery/web/LinkDiscoveryWebRoutable.java
+++ b/src/main/java/net/onrc/onos/core/linkdiscovery/web/LinkDiscoveryWebRoutable.java
@@ -13,7 +13,6 @@
     public Router getRestlet(Context context) {
         Router router = new Router(context);
         router.attach("/links/json", LinksResource.class);
-        router.attach("/autoportfast/{state}/json", AutoPortFast.class); // enable/true or disable/false
         return router;
     }
 
diff --git a/src/test/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManagerTest.java b/src/test/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManagerTest.java
index 4cebdaa..dd748ac 100644
--- a/src/test/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManagerTest.java
+++ b/src/test/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManagerTest.java
@@ -121,8 +121,7 @@
 
         Link lt = new Link(1L, 2, 2L, 1);
         LinkInfo info = new LinkInfo(System.currentTimeMillis(),
-                System.currentTimeMillis(), null,
-                0, 0);
+                System.currentTimeMillis(), 0, 0);
         topology.addOrUpdateLink(lt, info);
 
 
@@ -145,8 +144,7 @@
 
         Link lt = new Link(1L, 2, 2L, 1);
         LinkInfo info = new LinkInfo(System.currentTimeMillis(),
-                System.currentTimeMillis(), null,
-                0, 0);
+                System.currentTimeMillis(), 0, 0);
         topology.addOrUpdateLink(lt, info);
         topology.deleteLinks(Collections.singletonList(lt), "Test");
 
@@ -167,8 +165,7 @@
         NodePortTuple dstNpt = new NodePortTuple(2L, 3);
 
         LinkInfo info = new LinkInfo(System.currentTimeMillis(),
-                System.currentTimeMillis(), null,
-                0, 0);
+                System.currentTimeMillis(), 0, 0);
         topology.addOrUpdateLink(lt, info);
 
         // check invariants hold
@@ -190,8 +187,7 @@
         NodePortTuple dstNpt = new NodePortTuple(2L, 3);
 
         LinkInfo info = new LinkInfo(System.currentTimeMillis(),
-                System.currentTimeMillis(), null,
-                0, 0);
+                System.currentTimeMillis(), 0, 0);
         topology.addOrUpdateLink(lt, info);
         topology.deleteLinks(Collections.singletonList(lt), "Test to self");
 
@@ -211,8 +207,7 @@
         NodePortTuple srcNpt = new NodePortTuple(1L, 2);
         NodePortTuple dstNpt = new NodePortTuple(2L, 1);
         LinkInfo info = new LinkInfo(System.currentTimeMillis(),
-                System.currentTimeMillis(), null,
-                0, 0);
+                System.currentTimeMillis(), 0, 0);
         topology.addOrUpdateLink(lt, info);
 
         IOFSwitch sw1 = getMockFloodlightProvider().getSwitches().get(1L);
@@ -236,8 +231,7 @@
         replay(sw1);
         Link lt = new Link(1L, 2, 1L, 3);
         LinkInfo info = new LinkInfo(System.currentTimeMillis(),
-                System.currentTimeMillis(), null,
-                0, 0);
+                System.currentTimeMillis(), 0, 0);
         topology.addOrUpdateLink(lt, info);
 
         // Mock up our expected behavior
@@ -262,8 +256,7 @@
         LinkInfo info;
 
         info = new LinkInfo(System.currentTimeMillis() - 40000,
-                System.currentTimeMillis() - 40000, null,
-                0, 0);
+                System.currentTimeMillis() - 40000, 0, 0);
         topology.addOrUpdateLink(lt, info);
 
         // check invariants hold
@@ -274,116 +267,29 @@
         assertNotNull(topology.portLinks.get(dstNpt));
         assertTrue(topology.portLinks.get(dstNpt).contains(lt));
         assertTrue(topology.links.containsKey(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
 
         topology.timeoutLinks();
 
 
         info = new LinkInfo(System.currentTimeMillis(), /* firstseen */
-                null, /* unicast */
-                System.currentTimeMillis(), 0, 0);
+                null, /* unicast */0, 0);
         topology.addOrUpdateLink(lt, info);
         assertTrue(topology.links.get(lt).getUnicastValidTime() == null);
-        assertTrue(topology.links.get(lt).getMulticastValidTime() != null);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
 
 
-        // Add a link info based on info that woudld be obtained from unicast LLDP
+        // Add a link info based on info that would be obtained from unicast LLDP
         // Setting the unicast LLDP reception time to be 40 seconds old, so we can use
         // this to test timeout after this test.  Although the info is initialized
         // with LT_OPENFLOW_LINK, the link property should be changed to LT_NON_OPENFLOW
         // by the addOrUpdateLink method.
         info = new LinkInfo(System.currentTimeMillis() - 40000,
-                System.currentTimeMillis() - 40000, null, 0, 0);
+                System.currentTimeMillis() - 40000, 0, 0);
         topology.addOrUpdateLink(lt, info);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
 
         // Expect to timeout the unicast Valid Time, but not the multicast Valid time
         // So the link type should go back to non-openflow link.
         topology.timeoutLinks();
-        assertTrue(topology.links.get(lt).getUnicastValidTime() == null);
-        assertTrue(topology.links.get(lt).getMulticastValidTime() != null);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
-
-        // Set the multicastValidTime to be old and see if that also times out.
-        info = new LinkInfo(System.currentTimeMillis() - 40000,
-                null, System.currentTimeMillis() - 40000, 0, 0);
-        topology.addOrUpdateLink(lt, info);
-        topology.timeoutLinks();
         assertTrue(topology.links.get(lt) == null);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
-
-
-        // Test again only with multicast LLDP
-        info = new LinkInfo(System.currentTimeMillis() - 40000,
-                null, System.currentTimeMillis() - 40000, 0, 0);
-        topology.addOrUpdateLink(lt, info);
-        assertTrue(topology.links.get(lt).getUnicastValidTime() == null);
-        assertTrue(topology.links.get(lt).getMulticastValidTime() != null);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
-
-        // Call timeout and check if link is no longer present.
-        topology.timeoutLinks();
-        assertTrue(topology.links.get(lt) == null);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
-
-        // Start clean and see if loops are also added.
-        lt = new Link(1L, 1, 1L, 2);
-        srcNpt = new NodePortTuple(1L, 1);
-        dstNpt = new NodePortTuple(1L, 2);
-        info = new LinkInfo(System.currentTimeMillis() - 40000,
-                null, System.currentTimeMillis() - 40000, 0, 0);
-        topology.addOrUpdateLink(lt, info);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
-
-
-        // Start clean and see if loops are also added.
-        lt = new Link(1L, 1, 1L, 3);
-        srcNpt = new NodePortTuple(1L, 1);
-        dstNpt = new NodePortTuple(1L, 3);
-        info = new LinkInfo(System.currentTimeMillis() - 40000,
-                null, System.currentTimeMillis() - 40000, 0, 0);
-        topology.addOrUpdateLink(lt, info);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
-
-
-        // Start clean and see if loops are also added.
-        lt = new Link(1L, 4, 1L, 5);
-        srcNpt = new NodePortTuple(1L, 4);
-        dstNpt = new NodePortTuple(1L, 5);
-        info = new LinkInfo(System.currentTimeMillis() - 40000,
-                null, System.currentTimeMillis() - 40000, 0, 0);
-        topology.addOrUpdateLink(lt, info);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
-
-
-        // Start clean and see if loops are also added.
-        lt = new Link(1L, 3, 1L, 5);
-        srcNpt = new NodePortTuple(1L, 3);
-        dstNpt = new NodePortTuple(1L, 5);
-        info = new LinkInfo(System.currentTimeMillis() - 40000,
-                null, System.currentTimeMillis() - 40000, 0, 0);
-        topology.addOrUpdateLink(lt, info);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
     }
 
     /**
@@ -421,7 +327,7 @@
         EasyMock.expectLastCall().once();
         replay(swTest);
 
-        topology.sendDiscoveryMessage(3L, portNum, true, false);
+        topology.sendDiscoveryMessage(3L, portNum, false);
 
         verify(swTest);
     }
