diff --git a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/LspEventConsumer.java b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/LspEventConsumer.java
index 98586f0..bfede6d 100644
--- a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/LspEventConsumer.java
+++ b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/LspEventConsumer.java
@@ -45,8 +45,6 @@
 public class LspEventConsumer implements Runnable {
     private static final Logger log = LoggerFactory.getLogger(LspEventConsumer.class);
     public static List<LsPdu> lsPdus = new ArrayList<>();
-    private String lspAdded = "LSP_ADDED";
-    private String lspRemoved = "LSP_REMOVED";
     private BlockingQueue queue = null;
     private Controller controller = null;
     private TopologyForDeviceAndLinkImpl deviceAndLink = new TopologyForDeviceAndLinkImpl();
@@ -64,24 +62,21 @@
 
     @Override
     public void run() {
-        log.debug("LspsForProvider:run...!!!");
         try {
             while (true) {
                 if (!queue.isEmpty()) {
                     LspWrapper wrapper = (LspWrapper) queue.take();
                     LsPdu lsPdu = (LsPdu) wrapper.lsPdu();
-                    for (IsisTlv isisTlv : lsPdu.tlvs()) {
-                        if ((isisTlv instanceof IpExtendedReachabilityTlv) ||
-                                (isisTlv instanceof IsExtendedReachability)) {
-                            lsPdus.add(lsPdu);
-                            if (wrapper.lspProcessing().equals(lspAdded)) {
+                    if (wrapper.lspProcessing().equals(IsisConstants.LSPREMOVED)) {
+                        callTopologyToRemoveInfo(lsPdu);
+                    } else if (wrapper.lspProcessing().equals(IsisConstants.LSPADDED)) {
+                        for (IsisTlv isisTlv : lsPdu.tlvs()) {
+                            if ((isisTlv instanceof IpExtendedReachabilityTlv) ||
+                                    (isisTlv instanceof IsExtendedReachability)) {
                                 callTopologyToSendInfo(lsPdu, wrapper.isisInterface().networkType(),
                                         wrapper.isisInterface().systemId() + ".00");
+                                break;
                             }
-                            if (wrapper.lspProcessing().equals(lspRemoved)) {
-                                callTopologyToRemoveInfo(lsPdu);
-                            }
-                            break;
                         }
                     }
                 }
@@ -99,6 +94,9 @@
      */
     private void callTopologyToSendInfo(LsPdu lsPdu, IsisNetworkType isisNetworkType,
                                         String ownSystemId) {
+        if ((lsPdu.lspId().equals(ownSystemId + "-00"))) {
+            return;
+        }
         if (isisNetworkType.equals(IsisNetworkType.BROADCAST)) {
             sendDeviceInfo(lsPdu);
             boolean isDis = IsisUtil.checkIsDis(lsPdu.lspId());
@@ -106,9 +104,7 @@
                 sendLinkInfo(lsPdu, ownSystemId);
             }
         } else if (isisNetworkType.equals(IsisNetworkType.P2P)) {
-
             sendDeviceInfo(lsPdu);
-
             for (LsPdu wrapper : lsPdus) {
                 LsPdu lsPduStored = wrapper;
                 List<String> neStringList = neighborList(lsPduStored, ownSystemId);
@@ -117,7 +113,6 @@
                     sendLinkInfo(lsPduStored, ownSystemId);
                 }
             }
-
             List<String> neStringList = neighborList(lsPdu, ownSystemId);
             Map<String, IsisRouter> routerPresence = deviceAndLink.isisDeviceList();
             for (String neighbor : neStringList) {
@@ -137,7 +132,8 @@
      * @param lsPdu ls pdu instance
      */
     private void callTopologyToRemoveInfo(LsPdu lsPdu) {
-        removeDeviceInfo(lsPdu);
+        IsisRouter isisRouter = deviceAndLink.isisRouter(lsPdu.lspId());
+        removeDeviceInfo(isisRouter);
         removeLinkInfo(lsPdu);
     }
 
@@ -195,13 +191,13 @@
     /**
      * Removes the device information from topology provider.
      *
-     * @param lsPdu ls pdu instance
+     * @param isisRouter ISIS router instance
      */
-    private void removeDeviceInfo(LsPdu lsPdu) {
-        IsisRouter isisRouter = deviceAndLink.removeDeviceAndLinkInfo(lsPdu);
+    private void removeDeviceInfo(IsisRouter isisRouter) {
         if (isisRouter.systemId() != null) {
             controller.removeDeviceDetails(isisRouter);
         }
+        deviceAndLink.removeRouter(isisRouter.systemId());
     }
 
     /**
@@ -228,7 +224,7 @@
      * @param lsPdu ls pdu instance
      */
     private void removeLinkInfo(LsPdu lsPdu) {
-        Map<String, LinkInformation> linkInformationList = deviceAndLink.removeLinkInfo(lsPdu);
+        Map<String, LinkInformation> linkInformationList = deviceAndLink.removeLinkInfo(lsPdu.lspId());
         for (String key : linkInformationList.keySet()) {
             LinkInformation linkInformation = linkInformationList.get(key);
             controller.removeLinkDetails(createIsisLink(linkInformation, lsPdu));
diff --git a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/topology/TopologyForDeviceAndLinkImpl.java b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/topology/TopologyForDeviceAndLinkImpl.java
index 75427b4..8682a4a 100644
--- a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/topology/TopologyForDeviceAndLinkImpl.java
+++ b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/topology/TopologyForDeviceAndLinkImpl.java
@@ -22,21 +22,24 @@
 import org.onosproject.isis.controller.topology.TopologyForDeviceAndLink;
 import org.onosproject.isis.controller.topology.IsisLinkTed;
 import org.onosproject.isis.io.isispacket.pdu.LsPdu;
-import org.onosproject.isis.io.isispacket.tlv.IpExtendedReachabilityTlv;
 import org.onosproject.isis.io.isispacket.tlv.IsExtendedReachability;
 import org.onosproject.isis.io.isispacket.tlv.IsisTlv;
 import org.onosproject.isis.io.isispacket.tlv.NeighborForExtendedIs;
-import org.onosproject.isis.io.isispacket.tlv.subtlv.AdministrativeGroup;
+
 import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringSubTlv;
 import org.onosproject.isis.io.isispacket.tlv.subtlv.InterfaceIpAddress;
 import org.onosproject.isis.io.isispacket.tlv.subtlv.NeighborIpAddress;
+import org.onosproject.isis.io.isispacket.tlv.subtlv.AdministrativeGroup;
 import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringMetric;
+import org.onosproject.isis.io.isispacket.tlv.subtlv.UnreservedBandwidth;
 import org.onosproject.isis.io.isispacket.tlv.subtlv.MaximumReservableBandwidth;
+import org.onosproject.isis.io.isispacket.tlv.subtlv.MaximumBandwidth;
 import org.onosproject.isis.io.util.IsisConstants;
 import org.onosproject.isis.io.util.IsisUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -52,7 +55,6 @@
     private Map<String, DeviceInformation> deviceInformationMapForPointToPoint = new LinkedHashMap<>();
     private Map<String, DeviceInformation> deviceInformationMapToDelete = new LinkedHashMap<>();
     private Map<String, LinkInformation> addedLinkInformationMap = new LinkedHashMap<>();
-    private Map<String, LinkInformation> removeLinkInformationMap = new LinkedHashMap<>();
 
     /**
      * Gets device information.
@@ -226,11 +228,33 @@
     }
 
     /**
-     * Creates Device and Link instance.
+     * Returns the ISIS router instance.
      *
-     * @param lsPdu ISIS LSPDU instance
-     *
+     * @param systemId system ID to get router details
+     * @return ISIS router instance
      */
+    public IsisRouter isisRouter(String systemId) {
+        String routerId = IsisUtil.removeTailingZeros(systemId);
+        IsisRouter isisRouter = isisRouterDetails.get(routerId);
+        if (isisRouter != null) {
+            return isisRouter;
+        } else {
+            log.debug("IsisRouter is not available");
+            IsisRouter isisRouterCheck = new DefaultIsisRouter();
+            isisRouterCheck.setSystemId(routerId);
+            return isisRouterCheck;
+        }
+    }
+
+    /**
+     * Removes the ISIS router instance from map.
+     *
+     * @param systemId system ID to remove router details
+     */
+    public void removeRouter(String systemId) {
+        String routerId = IsisUtil.removeTailingZeros(systemId);
+        isisRouterDetails.remove(systemId);
+    }
 
     /**
      * Creates Device instance.
@@ -249,18 +273,18 @@
             }
         }
         return isisRouter;
-    }
+    }/*
 
-    /**
+    *//**
      * Removes Device and Link instance.
      *
      * @param lsPdu ISIS LSPDU instance
      * @return isisRouter isisRouter instance
-     */
+     *//*
     public IsisRouter removeDeviceAndLinkInfo(LsPdu lsPdu) {
         IsisRouter isisRouter = createIsisRouter(lsPdu);
         return isisRouter;
-    }
+    }*/
 
     /**
      * Creates link information.
@@ -302,13 +326,14 @@
     /**
      * Removes link information.
      *
-     * @param lsPdu ls pdu instance
+     * @param systemId system ID to remove link information
      * @return updated link information
      */
-    public Map<String, LinkInformation> removeLinkInfo(LsPdu lsPdu) {
-        String lspId = lsPdu.lspId();
+    public Map<String, LinkInformation> removeLinkInfo(String systemId) {
+        String routerId = IsisUtil.removeTailingZeros(systemId);
+        Map<String, LinkInformation> removeLinkInformationMap = new LinkedHashMap<>();
         for (String key : addedLinkInformationMap.keySet()) {
-            if (key.contains(lspId)) {
+            if (key.contains(routerId)) {
                 removeLinkInformationMap.put(key, addedLinkInformationMap.get(key));
             }
         }
@@ -328,22 +353,24 @@
         LinkInformation linkInformation = new DefaultIsisLinkInformation();
         IsisRouter isisRouter = isisRouterDetails.get(neighborId);
         for (IsisTlv isisTlv : lsPdu.tlvs()) {
-            if (isisTlv instanceof IpExtendedReachabilityTlv) {
-                IpExtendedReachabilityTlv ipExtendedReachabilityTlv = (IpExtendedReachabilityTlv) isisTlv;
-                List<TrafficEngineeringSubTlv> trafEnginSubTlv = ipExtendedReachabilityTlv.teTlvs();
-                for (TrafficEngineeringSubTlv teTlv : trafEnginSubTlv) {
-                    if (teTlv instanceof InterfaceIpAddress) {
-                        InterfaceIpAddress localIpAddress = (InterfaceIpAddress) isisTlv;
-                        linkInformation.setInterfaceIp(localIpAddress.localInterfaceIPAddress());
-                    }
+            if (isisTlv instanceof IsExtendedReachability) {
+                IsExtendedReachability isExtendedReachability = (IsExtendedReachability) isisTlv;
+                List<NeighborForExtendedIs> neighbours = isExtendedReachability.neighbours();
+                for (NeighborForExtendedIs teTlv : neighbours) {
+                    List<TrafficEngineeringSubTlv> teSubTlvs = teTlv.teSubTlv();
+                    for (TrafficEngineeringSubTlv teSubTlv : teSubTlvs) {
+                        if (teSubTlv instanceof InterfaceIpAddress) {
+                            InterfaceIpAddress localIpAddress = (InterfaceIpAddress) teSubTlv;
+                            linkInformation.setInterfaceIp(localIpAddress.localInterfaceIPAddress());
+                        } else if (teSubTlv instanceof NeighborIpAddress) {
+                            NeighborIpAddress neighborIpAddress = (NeighborIpAddress) teSubTlv;
+                            linkInformation.setNeighborIp(neighborIpAddress.neighborIPAddress());
+                        }
 
+                    }
                 }
-            } else {
-                linkInformation.setInterfaceIp(IsisConstants.DEFAULTIP);
-                linkInformation.setNeighborIp(IsisConstants.DEFAULTIP);
             }
         }
-        linkInformation.setNeighborIp(IsisConstants.DEFAULTIP);
         linkInformation.setLinkId(linkId);
         linkInformation.setAlreadyCreated(false);
         linkInformation.setLinkDestinationId(neighborId);
@@ -366,21 +393,22 @@
         }
         isisRouter.setSystemId(IsisUtil.removeTailingZeros(lsPdu.lspId()));
         for (IsisTlv isisTlv : lsPdu.tlvs()) {
-            if (isisTlv instanceof IpExtendedReachabilityTlv) {
-                IpExtendedReachabilityTlv ipExtendedReachabilityTlv = (IpExtendedReachabilityTlv) isisTlv;
-                List<TrafficEngineeringSubTlv> trafEnginSubTlv = ipExtendedReachabilityTlv.teTlvs();
-                for (TrafficEngineeringSubTlv teTlv : trafEnginSubTlv) {
-                    if (teTlv instanceof InterfaceIpAddress) {
-                        InterfaceIpAddress localIpAddress = (InterfaceIpAddress) isisTlv;
-                        isisRouter.setInterfaceId(localIpAddress.localInterfaceIPAddress());
-                    }
-                    if (teTlv instanceof NeighborIpAddress) {
-                        NeighborIpAddress neighborIpAddress = (NeighborIpAddress) isisTlv;
-                        isisRouter.setNeighborRouterId(neighborIpAddress.neighborIPAddress());
+            if (isisTlv instanceof IsExtendedReachability) {
+                IsExtendedReachability isExtendedReachability = (IsExtendedReachability) isisTlv;
+                List<NeighborForExtendedIs> neighbours = isExtendedReachability.neighbours();
+                for (NeighborForExtendedIs teTlv : neighbours) {
+                    List<TrafficEngineeringSubTlv> teSubTlvs = teTlv.teSubTlv();
+                    for (TrafficEngineeringSubTlv teSubTlv : teSubTlvs) {
+                        if (teSubTlv instanceof InterfaceIpAddress) {
+                            InterfaceIpAddress localIpAddress = (InterfaceIpAddress) teSubTlv;
+                            isisRouter.setInterfaceId(localIpAddress.localInterfaceIPAddress());
+                        } else if (teSubTlv instanceof NeighborIpAddress) {
+                            NeighborIpAddress neighborIpAddress = (NeighborIpAddress) teSubTlv;
+                            isisRouter.setNeighborRouterId(neighborIpAddress.neighborIPAddress());
+                        }
+
                     }
                 }
-            } else {
-                log.info("Invalid TLV");
             }
         }
         return isisRouter;
@@ -398,6 +426,7 @@
         isisRouter.setDis(false);
         isisRouter.setInterfaceId(IsisConstants.DEFAULTIP);
         isisRouter.setNeighborRouterId(IsisConstants.DEFAULTIP);
+
         return isisRouter;
     }
 
@@ -410,26 +439,50 @@
     public IsisLinkTed createIsisLinkTedInfo(LsPdu lsPdu) {
         IsisLinkTed isisLinkTed = new DefaultIsisLinkTed();
         for (IsisTlv isisTlv : lsPdu.tlvs()) {
-            if (isisTlv instanceof IpExtendedReachabilityTlv) {
-                IpExtendedReachabilityTlv ipExtendedReachabilityTlv = (IpExtendedReachabilityTlv) isisTlv;
-                List<TrafficEngineeringSubTlv> trafficEngSubTlv = ipExtendedReachabilityTlv.teTlvs();
-                for (TrafficEngineeringSubTlv teTlv : trafficEngSubTlv) {
-                    if (teTlv instanceof AdministrativeGroup) {
-                        AdministrativeGroup ag = (AdministrativeGroup) isisTlv;
-                        isisLinkTed.setAdministrativeGroup(ag.administrativeGroup());
-                    }
-                    if (teTlv instanceof TrafficEngineeringMetric) {
-                        TrafficEngineeringMetric teM = (TrafficEngineeringMetric) isisTlv;
-                        isisLinkTed.setTeDefaultMetric(teM.getTrafficEngineeringMetricValue());
-                    }
-                    if (teTlv instanceof MaximumReservableBandwidth) {
-                        MaximumReservableBandwidth reservableBw = (MaximumReservableBandwidth) isisTlv;
-                        isisLinkTed.setMaximumReservableLinkBandwidth(
-                                Bandwidth.bps(reservableBw.getMaximumBandwidthValue()));
+            if (isisTlv instanceof IsExtendedReachability) {
+                IsExtendedReachability isExtendedReachability = (IsExtendedReachability) isisTlv;
+                List<NeighborForExtendedIs> neighbours = isExtendedReachability.neighbours();
+                for (NeighborForExtendedIs teTlv : neighbours) {
+                    List<TrafficEngineeringSubTlv> teSubTlvs = teTlv.teSubTlv();
+                    for (TrafficEngineeringSubTlv teSubTlv : teSubTlvs) {
+                        if (teSubTlv instanceof AdministrativeGroup) {
+                            AdministrativeGroup ag = (AdministrativeGroup) teSubTlv;
+                            isisLinkTed.setAdministrativeGroup(ag.administrativeGroup());
+                        }
+                        if (teSubTlv instanceof InterfaceIpAddress) {
+                            InterfaceIpAddress localIpAddress = (InterfaceIpAddress) teSubTlv;
+                            isisLinkTed.setIpv4InterfaceAddress(localIpAddress.localInterfaceIPAddress());
+                        }
+                        if (teSubTlv instanceof NeighborIpAddress) {
+                            NeighborIpAddress neighborIpAddress = (NeighborIpAddress) teSubTlv;
+                            isisLinkTed.setIpv4NeighborAddress(neighborIpAddress.neighborIPAddress());
+                        }
+                        if (teSubTlv instanceof TrafficEngineeringMetric) {
+                            TrafficEngineeringMetric teM = (TrafficEngineeringMetric) teSubTlv;
+                            isisLinkTed.setTeDefaultMetric(teM.getTrafficEngineeringMetricValue());
+                        }
+                        if (teSubTlv instanceof MaximumBandwidth) {
+                            MaximumBandwidth maxLinkBandwidth = (MaximumBandwidth) teSubTlv;
+                            isisLinkTed.setMaximumLinkBandwidth(
+                                    Bandwidth.bps(maxLinkBandwidth.getMaximumBandwidthValue()));
+                        }
+                        if (teSubTlv instanceof MaximumReservableBandwidth) {
+                            MaximumReservableBandwidth maxReservableBw = (MaximumReservableBandwidth) teSubTlv;
+                            isisLinkTed.setMaximumReservableLinkBandwidth(
+                                    Bandwidth.bps(maxReservableBw.getMaximumBandwidthValue()));
+                        }
+                        if (teSubTlv instanceof UnreservedBandwidth) {
+                            UnreservedBandwidth unReservedBandwidth = (UnreservedBandwidth) teSubTlv;
+                            List<Bandwidth> bandwidthList = new ArrayList<>();
+                            List<Float> unReservedBandwidthList = unReservedBandwidth.unReservedBandwidthValue();
+                            for (Float unReservedBandwidthFloatValue : unReservedBandwidthList) {
+                                Bandwidth bandwidth = Bandwidth.bps(unReservedBandwidthFloatValue);
+                                bandwidthList.add(bandwidth);
+                            }
+                            isisLinkTed.setUnreservedBandwidth(bandwidthList);
+                        }
                     }
                 }
-            } else {
-                log.debug("TLV type not supported");
             }
         }
         return isisLinkTed;
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java
index 0bc57b4..f5cd03b 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java
@@ -46,6 +46,15 @@
     }
 
     /**
+     * Returns list of sub tlvs.
+     *
+     * @return teSubTlv list of sub tlvs
+     */
+    public List<TrafficEngineeringSubTlv> teSubTlv() {
+        return teSubTlv;
+    }
+
+    /**
      * Sets neighbor ID.
      *
      * @param neighborId neighbor ID
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinder.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinder.java
index b18f69c..bb3dfaf 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinder.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinder.java
@@ -67,10 +67,15 @@
                 subTlv = unreservedBandwidth;
                 break;
             case INTERFACEADDRESS:
-                NeighborIpAddress ipInterfaceAddressTlv = new NeighborIpAddress(tlvHeader);
+                InterfaceIpAddress ipInterfaceAddressTlv = new InterfaceIpAddress(tlvHeader);
                 ipInterfaceAddressTlv.readFrom(channelBuffer);
                 subTlv = ipInterfaceAddressTlv;
                 break;
+            case NEIGHBORADDRESS:
+                NeighborIpAddress ipNeighborAddressTlv = new NeighborIpAddress(tlvHeader);
+                ipNeighborAddressTlv.readFrom(channelBuffer);
+                subTlv = ipNeighborAddressTlv;
+                break;
             default:
                 //TODO
                 break;
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidth.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidth.java
index 94db6bb..4b3e7b6 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidth.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidth.java
@@ -54,7 +54,7 @@
      *
      * @return List of un reserved bandwidth
      */
-    public List<Float> getUnReservedBandwidthValue() {
+    public List<Float> unReservedBandwidthValue() {
         return this.unReservedBandwidth;
     }
 
diff --git a/providers/isis/topology/src/main/java/org/onosproject/provider/isis/topology/impl/IsisTopologyProvider.java b/providers/isis/topology/src/main/java/org/onosproject/provider/isis/topology/impl/IsisTopologyProvider.java
index 8a58289..78a67c2 100644
--- a/providers/isis/topology/src/main/java/org/onosproject/provider/isis/topology/impl/IsisTopologyProvider.java
+++ b/providers/isis/topology/src/main/java/org/onosproject/provider/isis/topology/impl/IsisTopologyProvider.java
@@ -59,6 +59,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.StringTokenizer;
 
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -132,7 +133,7 @@
     @Override
     public boolean isReachable(DeviceId deviceId) {
         log.debug("IsisDeviceProvider::isReachable...!!!!");
-        return false;
+        return true;
     }
 
     @Override
@@ -149,6 +150,8 @@
     private LinkDescription buildLinkDes(IsisLink isisLink) {
         long srcAddress = 0;
         long dstAddress = 0;
+        boolean localPseduo = false;
+        boolean remotePseduo = false;
         String localSystemId = isisLink.localSystemId();
         String remoteSystemId = isisLink.remoteSystemId();
         //Changing of port numbers
@@ -156,9 +159,17 @@
         dstAddress = isisLink.neighborIp().toInt();
         DeviceId srcId = DeviceId.deviceId(IsisRouterId.uri(localSystemId));
         DeviceId dstId = DeviceId.deviceId(IsisRouterId.uri(remoteSystemId));
-        if (srcAddress == 0) {
+        if (checkIsDis(isisLink.localSystemId())) {
+            localPseduo = true;
+        } else if (checkIsDis(isisLink.remoteSystemId())) {
+            remotePseduo = true;
+        } else {
+            log.debug("IsisDeviceProvider::buildLinkDes : unknown type.!");
+        }
+
+        if (localPseduo && srcAddress == 0) {
             srcAddress = PSEUDO_PORT;
-        } else if (dstAddress == 0) {
+        } else if (remotePseduo && dstAddress == 0) {
             dstAddress = PSEUDO_PORT;
         }
 
@@ -173,6 +184,28 @@
     }
 
     /**
+     * Return the DIS value from the systemId.
+     *
+     * @param systemId system Id.
+     * @return return true if DIS else false
+     */
+    public static boolean checkIsDis(String systemId) {
+        StringTokenizer stringTokenizer = new StringTokenizer(systemId, "." + "-");
+        int count = 0;
+        while (stringTokenizer.hasMoreTokens()) {
+            String str = stringTokenizer.nextToken();
+            if (count == 3) {
+                int x = Integer.parseInt(str);
+                if (x > 0) {
+                    return true;
+                }
+            }
+            count++;
+        }
+        return false;
+    }
+
+    /**
      * Builds port description.
      *
      * @param deviceId   device ID for the port
@@ -181,9 +214,7 @@
      */
     private List<PortDescription> buildPortDescriptions(DeviceId deviceId,
                                                         PortNumber portNumber) {
-
         List<PortDescription> portList;
-
         if (portMap.containsKey(deviceId)) {
             portList = portMap.get(deviceId);
         } else {
@@ -193,8 +224,8 @@
             PortDescription portDescriptions = new DefaultPortDescription(portNumber, true);
             portList.add(portDescriptions);
         }
-
         portMap.put(deviceId, portList);
+
         return portList;
     }
 
@@ -215,6 +246,7 @@
 
         //TE Info
         IsisLinkTed isisLinkTed = isisLink.linkTed();
+        log.info("Ted Information:  {}", isisLinkTed.toString());
         administrativeGroup = isisLinkTed.administrativeGroup();
         teMetric = isisLinkTed.teDefaultMetric();
         maxReservableBandwidth = isisLinkTed.maximumReservableLinkBandwidth();
@@ -251,7 +283,7 @@
             newBuilder.set("RouterId", systemId);
             DeviceDescription description =
                     new DefaultDeviceDescription(IsisRouterId.uri(systemId), deviceType, UNKNOWN, UNKNOWN, UNKNOWN,
-                                                 UNKNOWN, cId, newBuilder.build());
+                            UNKNOWN, cId, newBuilder.build());
             deviceProviderService.deviceConnected(deviceId, description);
         }
 
@@ -276,9 +308,9 @@
             LinkDescription linkDes = buildLinkDes(isisLink);
             //Updating ports of the link
             deviceProviderService.updatePorts(linkDes.src().deviceId(), buildPortDescriptions(linkDes.src().deviceId(),
-                                                                                              linkDes.src().port()));
+                    linkDes.src().port()));
             deviceProviderService.updatePorts(linkDes.dst().deviceId(), buildPortDescriptions(linkDes.dst().deviceId(),
-                                                                                              linkDes.dst().port()));
+                    linkDes.dst().port()));
             registerBandwidth(linkDes, isisLink);
             linkProviderService.linkDetected(linkDes);
         }
@@ -319,4 +351,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
