diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPLinkLSIdentifier.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpLinkLSIdentifier.java
similarity index 80%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPLinkLSIdentifier.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpLinkLSIdentifier.java
index ffea74d..9b14b4b 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPLinkLSIdentifier.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpLinkLSIdentifier.java
@@ -21,9 +21,9 @@
 import java.util.Objects;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.types.BGPErrorType;
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.types.BgpErrorType;
+import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.types.IPv4AddressTlv;
 import org.onosproject.bgpio.types.IPv6AddressTlv;
 import org.onosproject.bgpio.types.LinkLocalRemoteIdentifiersTlv;
@@ -38,8 +38,8 @@
 /**
  * Implementation of local node descriptors, remote node descriptors and link descriptors.
  */
-public class BGPLinkLSIdentifier {
-    private static final Logger log = LoggerFactory.getLogger(BGPLinkLSIdentifier.class);
+public class BgpLinkLSIdentifier {
+    private static final Logger log = LoggerFactory.getLogger(BgpLinkLSIdentifier.class);
     public static final short IPV4_INTERFACE_ADDRESS_TYPE = 259;
     public static final short IPV4_NEIGHBOR_ADDRESS_TYPE = 260;
     public static final short IPV6_INTERFACE_ADDRESS_TYPE = 261;
@@ -48,12 +48,12 @@
 
     private NodeDescriptors localNodeDescriptors;
     private NodeDescriptors remoteNodeDescriptors;
-    private List<BGPValueType> linkDescriptor;
+    private List<BgpValueType> linkDescriptor;
 
     /**
      * Initialize fields.
      */
-    public BGPLinkLSIdentifier() {
+    public BgpLinkLSIdentifier() {
         this.localNodeDescriptors = null;
         this.remoteNodeDescriptors = null;
         this.linkDescriptor = null;
@@ -66,8 +66,8 @@
      * @param remoteNodeDescriptors remote node descriptors
      * @param linkDescriptor link descriptors
      */
-    public BGPLinkLSIdentifier(NodeDescriptors localNodeDescriptors, NodeDescriptors remoteNodeDescriptors,
-            LinkedList<BGPValueType> linkDescriptor) {
+    public BgpLinkLSIdentifier(NodeDescriptors localNodeDescriptors, NodeDescriptors remoteNodeDescriptors,
+            LinkedList<BgpValueType> linkDescriptor) {
         this.localNodeDescriptors = Preconditions.checkNotNull(localNodeDescriptors);
         this.remoteNodeDescriptors = Preconditions.checkNotNull(remoteNodeDescriptors);
         this.linkDescriptor = Preconditions.checkNotNull(linkDescriptor);
@@ -79,9 +79,9 @@
      * @param cb ChannelBuffer
      * @param protocolId in linkstate nlri
      * @return object of BGPLinkLSIdentifier
-     * @throws BGPParseException while parsing link identifier
+     * @throws BgpParseException while parsing link identifier
      */
-    public static BGPLinkLSIdentifier parseLinkIdendifier(ChannelBuffer cb, byte protocolId) throws BGPParseException {
+    public static BgpLinkLSIdentifier parseLinkIdendifier(ChannelBuffer cb, byte protocolId) throws BgpParseException {
         //Parse local node descriptor
         NodeDescriptors localNodeDescriptors = new NodeDescriptors();
         localNodeDescriptors = parseNodeDescriptors(cb, NodeDescriptors.LOCAL_NODE_DES_TYPE, protocolId);
@@ -91,9 +91,9 @@
         remoteNodeDescriptors = parseNodeDescriptors(cb, NodeDescriptors.REMOTE_NODE_DES_TYPE, protocolId);
 
         //Parse link descriptor
-        LinkedList<BGPValueType> linkDescriptor = new LinkedList<>();
+        LinkedList<BgpValueType> linkDescriptor = new LinkedList<>();
         linkDescriptor = parseLinkDescriptors(cb);
-        return new BGPLinkLSIdentifier(localNodeDescriptors, remoteNodeDescriptors, linkDescriptor);
+        return new BgpLinkLSIdentifier(localNodeDescriptors, remoteNodeDescriptors, linkDescriptor);
     }
 
     /**
@@ -103,15 +103,15 @@
      * @param desType descriptor type
      * @param protocolId protocol identifier
      * @return object of NodeDescriptors
-     * @throws BGPParseException while parsing Local/Remote node descriptors
+     * @throws BgpParseException while parsing Local/Remote node descriptors
      */
     public static NodeDescriptors parseNodeDescriptors(ChannelBuffer cb, short desType, byte protocolId)
-            throws BGPParseException {
+            throws BgpParseException {
         ChannelBuffer tempBuf = cb;
         short type = cb.readShort();
         short length = cb.readShort();
         if (cb.readableBytes() < length) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.OPTIONAL_ATTRIBUTE_ERROR,
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.OPTIONAL_ATTRIBUTE_ERROR,
                     tempBuf.readBytes(cb.readableBytes() + TYPE_AND_LEN));
         }
         NodeDescriptors nodeIdentifier = new NodeDescriptors();
@@ -120,7 +120,7 @@
         if (type == desType) {
             nodeIdentifier = NodeDescriptors.read(tempCb, length, desType, protocolId);
         } else {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.MALFORMED_ATTRIBUTE_LIST, null);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.MALFORMED_ATTRIBUTE_LIST, null);
         }
         return nodeIdentifier;
     }
@@ -130,11 +130,11 @@
      *
      * @param cb ChannelBuffer
      * @return list of link descriptors
-     * @throws BGPParseException while parsing link descriptors
+     * @throws BgpParseException while parsing link descriptors
      */
-    public static LinkedList<BGPValueType> parseLinkDescriptors(ChannelBuffer cb) throws BGPParseException {
-        LinkedList<BGPValueType> linkDescriptor = new LinkedList<>();
-        BGPValueType tlv = null;
+    public static LinkedList<BgpValueType> parseLinkDescriptors(ChannelBuffer cb) throws BgpParseException {
+        LinkedList<BgpValueType> linkDescriptor = new LinkedList<>();
+        BgpValueType tlv = null;
         int count = 0;
 
         while (cb.readableBytes() > 0) {
@@ -142,7 +142,7 @@
             short type = cb.readShort();
             short length = cb.readShort();
             if (cb.readableBytes() < length) {
-                throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.OPTIONAL_ATTRIBUTE_ERROR,
+                throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.OPTIONAL_ATTRIBUTE_ERROR,
                         tempBuf.readBytes(cb.readableBytes() + TYPE_AND_LEN));
             }
             ChannelBuffer tempCb = cb.readBytes(length);
@@ -168,8 +168,8 @@
                 //MultiTopologyId TLV cannot repeat more than once
                 if (count > 1) {
                     //length + 4 implies data contains type, length and value
-                    throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                            BGPErrorType.OPTIONAL_ATTRIBUTE_ERROR, tempBuf.readBytes(length
+                    throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                            BgpErrorType.OPTIONAL_ATTRIBUTE_ERROR, tempBuf.readBytes(length
                                     + TYPE_AND_LEN));
                 }
                 break;
@@ -204,7 +204,7 @@
      *
      * @return link descriptors
      */
-    public List<BGPValueType> linkDescriptors() {
+    public List<BgpValueType> linkDescriptors() {
         return this.linkDescriptor;
     }
 
@@ -218,19 +218,19 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof BGPLinkLSIdentifier) {
+        if (obj instanceof BgpLinkLSIdentifier) {
             int countObjSubTlv = 0;
             int countOtherSubTlv = 0;
             boolean isCommonSubTlv = true;
-            BGPLinkLSIdentifier other = (BGPLinkLSIdentifier) obj;
-            Iterator<BGPValueType> objListIterator = other.linkDescriptor.iterator();
+            BgpLinkLSIdentifier other = (BgpLinkLSIdentifier) obj;
+            Iterator<BgpValueType> objListIterator = other.linkDescriptor.iterator();
             countOtherSubTlv = other.linkDescriptor.size();
             countObjSubTlv = linkDescriptor.size();
             if (countObjSubTlv != countOtherSubTlv) {
                 return false;
             } else {
                 while (objListIterator.hasNext() && isCommonSubTlv) {
-                    BGPValueType subTlv = objListIterator.next();
+                    BgpValueType subTlv = objListIterator.next();
                     isCommonSubTlv = Objects.equals(linkDescriptor.contains(subTlv),
                             other.linkDescriptor.contains(subTlv));
                 }
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpLinkLsNlriVer4.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpLinkLsNlriVer4.java
index f7ab2e0..01d369e 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpLinkLsNlriVer4.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpLinkLsNlriVer4.java
@@ -18,12 +18,12 @@
 import java.util.List;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
+import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.onosproject.bgpio.protocol.BgpLinkLsNlri;
 import org.onosproject.bgpio.protocol.NlriType;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4.ProtocolType;
-import org.onosproject.bgpio.types.BGPErrorType;
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4.ProtocolType;
+import org.onosproject.bgpio.types.BgpErrorType;
+import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.types.RouteDistinguisher;
 import org.onosproject.bgpio.util.Constants;
 import org.slf4j.Logger;
@@ -58,7 +58,7 @@
     private static final Logger log = LoggerFactory.getLogger(BgpLinkLsNlriVer4.class);
     public static final int LINK_NLRITYPE = 2;
 
-    private BGPLinkLSIdentifier linkLSIdentifier;
+    private BgpLinkLSIdentifier linkLSIdentifier;
     private byte protocolId;
     private long identifier;
     private RouteDistinguisher routeDistinguisher;
@@ -84,7 +84,7 @@
      * @param routeDistinguisher route distinguisher from message
      * @param isVpn vpn info availability in message
      */
-    public BgpLinkLsNlriVer4(byte protocolId, long identifier, BGPLinkLSIdentifier linkLSIdentifier,
+    public BgpLinkLsNlriVer4(byte protocolId, long identifier, BgpLinkLSIdentifier linkLSIdentifier,
                              RouteDistinguisher routeDistinguisher, boolean isVpn) {
         this.protocolId = protocolId;
         this.identifier = identifier;
@@ -100,9 +100,9 @@
      * @param afi Address Family Identifier
      * @param safi Subsequent Address Family Identifier
      * @return object of this class
-     * @throws BGPParseException while parsing Link LS NLRI
+     * @throws BgpParseException while parsing Link LS NLRI
      */
-    public static BgpLinkLsNlriVer4 read(ChannelBuffer cb, short afi, byte safi) throws BGPParseException {
+    public static BgpLinkLsNlriVer4 read(ChannelBuffer cb, short afi, byte safi) throws BgpParseException {
         boolean isVpn = false;
         RouteDistinguisher routeDistinguisher = null;
         if ((afi == Constants.AFI_VALUE) && (safi == Constants.VPN_SAFI_VALUE)) {
@@ -115,8 +115,8 @@
         byte protocolId = cb.readByte();
         long identifier = cb.readLong();
 
-        BGPLinkLSIdentifier linkLSIdentifier = new BGPLinkLSIdentifier();
-        linkLSIdentifier = BGPLinkLSIdentifier.parseLinkIdendifier(cb, protocolId);
+        BgpLinkLSIdentifier linkLSIdentifier = new BgpLinkLSIdentifier();
+        linkLSIdentifier = BgpLinkLSIdentifier.parseLinkIdendifier(cb, protocolId);
         return new BgpLinkLsNlriVer4(protocolId, identifier, linkLSIdentifier, routeDistinguisher, isVpn);
     }
 
@@ -135,12 +135,12 @@
      *
      * @param linkLSIdentifier link LS identifier to set
      */
-    public void setLinkLSIdentifier(BGPLinkLSIdentifier linkLSIdentifier) {
+    public void setLinkLSIdentifier(BgpLinkLSIdentifier linkLSIdentifier) {
         this.linkLSIdentifier = linkLSIdentifier;
     }
 
     @Override
-    public ProtocolType getProtocolId() throws BGPParseException {
+    public ProtocolType getProtocolId() throws BgpParseException {
         switch (protocolId) {
         case Constants.ISIS_LEVELONE:
             return ProtocolType.ISIS_LEVEL_ONE;
@@ -155,7 +155,7 @@
         case Constants.OSPFV3:
             return ProtocolType.OSPF_V3;
         default:
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, (byte) 0, null);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, (byte) 0, null);
         }
     }
 
@@ -188,12 +188,12 @@
      *
      * @return link identifier
      */
-    public BGPLinkLSIdentifier getLinkIdentifier() {
+    public BgpLinkLSIdentifier getLinkIdentifier() {
         return this.linkLSIdentifier;
     }
 
     @Override
-    public List<BGPValueType> linkDescriptors() {
+    public List<BgpValueType> linkDescriptors() {
         return this.linkLSIdentifier.linkDescriptors();
     }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPNodeLSIdentifier.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpNodeLSIdentifier.java
similarity index 77%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPNodeLSIdentifier.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpNodeLSIdentifier.java
index 603bf6e..25910a9 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPNodeLSIdentifier.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpNodeLSIdentifier.java
@@ -18,8 +18,8 @@
 import java.util.Objects;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.types.BGPErrorType;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.types.BgpErrorType;
 import org.onosproject.bgpio.util.Constants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -29,15 +29,15 @@
 /**
  * Implementation of Node Identifier which includes local node descriptor/remote node descriptors.
  */
-public class BGPNodeLSIdentifier {
+public class BgpNodeLSIdentifier {
 
-    protected static final Logger log = LoggerFactory.getLogger(BGPNodeLSIdentifier.class);
+    protected static final Logger log = LoggerFactory.getLogger(BgpNodeLSIdentifier.class);
     private NodeDescriptors nodeDescriptors;
 
     /**
      * Resets fields.
      */
-    public BGPNodeLSIdentifier() {
+    public BgpNodeLSIdentifier() {
         this.nodeDescriptors = null;
     }
 
@@ -46,7 +46,7 @@
      *
      * @param nodeDescriptors local/remote node descriptor
      */
-    public BGPNodeLSIdentifier(NodeDescriptors nodeDescriptors) {
+    public BgpNodeLSIdentifier(NodeDescriptors nodeDescriptors) {
         this.nodeDescriptors = nodeDescriptors;
     }
 
@@ -56,15 +56,15 @@
      * @param cb ChannelBuffer
      * @param protocolId protocol identifier
      * @return object of this BGPNodeLSIdentifier
-     * @throws BGPParseException while parsing local node descriptors
+     * @throws BgpParseException while parsing local node descriptors
      */
-    public static BGPNodeLSIdentifier parseLocalNodeDescriptors(ChannelBuffer cb, byte protocolId)
-            throws BGPParseException {
+    public static BgpNodeLSIdentifier parseLocalNodeDescriptors(ChannelBuffer cb, byte protocolId)
+            throws BgpParseException {
         ChannelBuffer tempBuf = cb;
         short type = cb.readShort();
         short length = cb.readShort();
         if (cb.readableBytes() < length) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.OPTIONAL_ATTRIBUTE_ERROR,
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.OPTIONAL_ATTRIBUTE_ERROR,
                                         tempBuf.readBytes(cb.readableBytes() + Constants.TYPE_AND_LEN));
         }
         NodeDescriptors nodeDescriptors = new NodeDescriptors();
@@ -73,9 +73,9 @@
         if (type == NodeDescriptors.LOCAL_NODE_DES_TYPE) {
             nodeDescriptors = NodeDescriptors.read(tempCb, length, type, protocolId);
         } else {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.MALFORMED_ATTRIBUTE_LIST, null);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.MALFORMED_ATTRIBUTE_LIST, null);
         }
-        return new BGPNodeLSIdentifier(nodeDescriptors);
+        return new BgpNodeLSIdentifier(nodeDescriptors);
     }
 
     /**
@@ -92,8 +92,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof BGPNodeLSIdentifier) {
-            BGPNodeLSIdentifier other = (BGPNodeLSIdentifier) obj;
+        if (obj instanceof BgpNodeLSIdentifier) {
+            BgpNodeLSIdentifier other = (BgpNodeLSIdentifier) obj;
             return Objects.equals(nodeDescriptors, other.nodeDescriptors);
         }
         return false;
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPNodeLSNlriVer4.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpNodeLSNlriVer4.java
similarity index 85%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPNodeLSNlriVer4.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpNodeLSNlriVer4.java
index 02f0a4a..b27096c 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPNodeLSNlriVer4.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpNodeLSNlriVer4.java
@@ -16,10 +16,10 @@
 package org.onosproject.bgpio.protocol.linkstate;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPNodeLSNlri;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpNodeLSNlri;
 import org.onosproject.bgpio.protocol.NlriType;
-import org.onosproject.bgpio.types.BGPErrorType;
+import org.onosproject.bgpio.types.BgpErrorType;
 import org.onosproject.bgpio.types.RouteDistinguisher;
 import org.onosproject.bgpio.util.Constants;
 import org.slf4j.Logger;
@@ -30,7 +30,7 @@
 /**
  * Implementation of Node LS NLRI.
  */
-public class BGPNodeLSNlriVer4 implements BGPNodeLSNlri {
+public class BgpNodeLSNlriVer4 implements BgpNodeLSNlri {
 
     /*
      *REFERENCE : draft-ietf-idr-ls-distribution-11
@@ -48,13 +48,13 @@
                           Figure : The Node NLRI format
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(BGPNodeLSNlriVer4.class);
+    protected static final Logger log = LoggerFactory.getLogger(BgpNodeLSNlriVer4.class);
 
     public static final int NODE_NLRITYPE = 1;
     public static final int IDENTIFIER_LENGTH = 16;
     private long identifier;
     private byte protocolId;
-    private BGPNodeLSIdentifier localNodeDescriptors;
+    private BgpNodeLSIdentifier localNodeDescriptors;
     private RouteDistinguisher routeDistinguisher;
     private boolean isVpn;
 
@@ -87,7 +87,7 @@
     /**
      * Reset fields.
      */
-    public BGPNodeLSNlriVer4() {
+    public BgpNodeLSNlriVer4() {
         this.identifier = 0;
         this.protocolId = 0;
         this.localNodeDescriptors = null;
@@ -104,7 +104,7 @@
      * @param isVpn true if VPN info is present
      * @param routeDistinguisher unique for each VPN
      */
-    public BGPNodeLSNlriVer4(long identifier, byte protocolId, BGPNodeLSIdentifier localNodeDescriptors, boolean isVpn,
+    public BgpNodeLSNlriVer4(long identifier, byte protocolId, BgpNodeLSIdentifier localNodeDescriptors, boolean isVpn,
                       RouteDistinguisher routeDistinguisher) {
         this.identifier = identifier;
         this.protocolId = protocolId;
@@ -120,9 +120,9 @@
      * @param afi Address Family Identifier
      * @param safi Subsequent Address Family Identifier
      * @return object of this class
-     * @throws BGPParseException while parsing node descriptors
+     * @throws BgpParseException while parsing node descriptors
      */
-    public static BGPNodeLSNlriVer4 read(ChannelBuffer cb, short afi, byte safi) throws BGPParseException {
+    public static BgpNodeLSNlriVer4 read(ChannelBuffer cb, short afi, byte safi) throws BgpParseException {
         boolean isVpn = false;
         RouteDistinguisher routeDistinguisher = null;
         if ((afi == Constants.AFI_VALUE) && (safi == Constants.VPN_SAFI_VALUE)) {
@@ -136,9 +136,9 @@
         long identifier = cb.readLong();
 
         // Parse Local Node Descriptors
-        BGPNodeLSIdentifier localNodeDescriptors = new BGPNodeLSIdentifier();
-        localNodeDescriptors = BGPNodeLSIdentifier.parseLocalNodeDescriptors(cb, protocolId);
-        return new BGPNodeLSNlriVer4(identifier, protocolId, localNodeDescriptors, isVpn, routeDistinguisher);
+        BgpNodeLSIdentifier localNodeDescriptors = new BgpNodeLSIdentifier();
+        localNodeDescriptors = BgpNodeLSIdentifier.parseLocalNodeDescriptors(cb, protocolId);
+        return new BgpNodeLSNlriVer4(identifier, protocolId, localNodeDescriptors, isVpn, routeDistinguisher);
     }
 
     @Override
@@ -147,7 +147,7 @@
     }
 
     @Override
-    public BGPNodeLSIdentifier getLocalNodeDescriptors() {
+    public BgpNodeLSIdentifier getLocalNodeDescriptors() {
         return this.localNodeDescriptors;
     }
 
@@ -175,12 +175,12 @@
      *
      * @param localNodeDescriptors node LS identifier to set
      */
-    public void setNodeLSIdentifier(BGPNodeLSIdentifier localNodeDescriptors) {
+    public void setNodeLSIdentifier(BgpNodeLSIdentifier localNodeDescriptors) {
         this.localNodeDescriptors = localNodeDescriptors;
     }
 
     @Override
-    public ProtocolType getProtocolId() throws BGPParseException {
+    public ProtocolType getProtocolId() throws BgpParseException {
         switch (protocolId) {
         case Constants.ISIS_LEVELONE:
             return ProtocolType.ISIS_LEVEL_ONE;
@@ -195,7 +195,7 @@
         case Constants.OSPFV3:
             return ProtocolType.OSPF_V3;
         default:
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, (byte) 0, null);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, (byte) 0, null);
         }
     }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPPrefixIPv4LSNlriVer4.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpPrefixIPv4LSNlriVer4.java
similarity index 83%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPPrefixIPv4LSNlriVer4.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpPrefixIPv4LSNlriVer4.java
index 854551f..5610696 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPPrefixIPv4LSNlriVer4.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpPrefixIPv4LSNlriVer4.java
@@ -18,11 +18,11 @@
 import java.util.LinkedList;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPPrefixLSNlri;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpPrefixLSNlri;
 import org.onosproject.bgpio.protocol.NlriType;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4.ProtocolType;
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4.ProtocolType;
+import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.types.RouteDistinguisher;
 import org.onosproject.bgpio.util.Constants;
 import org.slf4j.Logger;
@@ -33,7 +33,7 @@
 /**
  * Implementation of Prefix IPV4 LS NLRI.
  */
-public class BGPPrefixIPv4LSNlriVer4 implements BGPPrefixLSNlri {
+public class BgpPrefixIPv4LSNlriVer4 implements BgpPrefixLSNlri {
 
     /*
      * REFERENCE : draft-ietf-idr-ls-distribution-11
@@ -53,7 +53,7 @@
                 Figure : The IPv4/IPv6 Topology Prefix NLRI format
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(BGPPrefixIPv4LSNlriVer4.class);
+    protected static final Logger log = LoggerFactory.getLogger(BgpPrefixIPv4LSNlriVer4.class);
 
     public static final int PREFIX_IPV4_NLRITYPE = 3;
     public static final int IDENTIFIER_LENGTH = 16;
@@ -61,12 +61,12 @@
     private byte protocolId;
     private RouteDistinguisher routeDistinguisher;
     private boolean isVpn;
-    private BGPPrefixLSIdentifier bgpPrefixLSIdentifier;
+    private BgpPrefixLSIdentifier bgpPrefixLSIdentifier;
 
     /**
      * Resets parameters.
      */
-    public BGPPrefixIPv4LSNlriVer4() {
+    public BgpPrefixIPv4LSNlriVer4() {
         this.identifier = 0;
         this.protocolId = 0;
         this.bgpPrefixLSIdentifier = null;
@@ -83,7 +83,7 @@
      * @param routeDistinguisher RouteDistinguisher
      * @param isVpn vpn availability in message
      */
-    public BGPPrefixIPv4LSNlriVer4(long identifier, byte protocolId, BGPPrefixLSIdentifier bgpPrefixLSIdentifier,
+    public BgpPrefixIPv4LSNlriVer4(long identifier, byte protocolId, BgpPrefixLSIdentifier bgpPrefixLSIdentifier,
                                    RouteDistinguisher routeDistinguisher, boolean isVpn) {
         this.identifier = identifier;
         this.protocolId = protocolId;
@@ -99,9 +99,9 @@
      * @param afi Address family identifier
      * @param safi Subsequent address family identifier
      * @return object of BGPPrefixIPv4LSNlriVer4
-     * @throws BGPParseException while parsing Prefix LS Nlri
+     * @throws BgpParseException while parsing Prefix LS Nlri
      */
-    public static BGPPrefixIPv4LSNlriVer4 read(ChannelBuffer cb, short afi, byte safi) throws BGPParseException {
+    public static BgpPrefixIPv4LSNlriVer4 read(ChannelBuffer cb, short afi, byte safi) throws BgpParseException {
 
         boolean isVpn = false;
         RouteDistinguisher routeDistinguisher = null;
@@ -115,9 +115,9 @@
         byte protocolId = cb.readByte();
         long identifier = cb.readLong();
 
-        BGPPrefixLSIdentifier bgpPrefixLSIdentifier = new BGPPrefixLSIdentifier();
-        bgpPrefixLSIdentifier = BGPPrefixLSIdentifier.parsePrefixIdendifier(cb, protocolId);
-        return new BGPPrefixIPv4LSNlriVer4(identifier, protocolId, bgpPrefixLSIdentifier, routeDistinguisher, isVpn);
+        BgpPrefixLSIdentifier bgpPrefixLSIdentifier = new BgpPrefixLSIdentifier();
+        bgpPrefixLSIdentifier = BgpPrefixLSIdentifier.parsePrefixIdendifier(cb, protocolId);
+        return new BgpPrefixIPv4LSNlriVer4(identifier, protocolId, bgpPrefixLSIdentifier, routeDistinguisher, isVpn);
     }
 
     @Override
@@ -140,12 +140,12 @@
      *
      * @param bgpPrefixLSIdentifier prefix identifier to set
      */
-    public void setPrefixLSIdentifier(BGPPrefixLSIdentifier bgpPrefixLSIdentifier) {
+    public void setPrefixLSIdentifier(BgpPrefixLSIdentifier bgpPrefixLSIdentifier) {
         this.bgpPrefixLSIdentifier = bgpPrefixLSIdentifier;
     }
 
     @Override
-    public ProtocolType getProtocolId() throws BGPParseException {
+    public ProtocolType getProtocolId() throws BgpParseException {
         switch (protocolId) {
         case Constants.ISIS_LEVELONE:
             return ProtocolType.ISIS_LEVEL_ONE;
@@ -160,7 +160,7 @@
         case Constants.OSPFV3:
             return ProtocolType.OSPF_V3;
         default:
-            throw new BGPParseException("protocol id not valid");
+            throw new BgpParseException("protocol id not valid");
         }
     }
 
@@ -178,7 +178,7 @@
      *
      * @return Prefix Identifier
      */
-    public BGPPrefixLSIdentifier getPrefixIdentifier() {
+    public BgpPrefixLSIdentifier getPrefixIdentifier() {
         return this.bgpPrefixLSIdentifier;
     }
 
@@ -188,7 +188,7 @@
     }
 
     @Override
-    public LinkedList<BGPValueType> getPrefixdescriptor() {
+    public LinkedList<BgpValueType> getPrefixdescriptor() {
         return this.bgpPrefixLSIdentifier.getPrefixdescriptor();
     }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPPrefixLSIdentifier.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpPrefixLSIdentifier.java
similarity index 77%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPPrefixLSIdentifier.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpPrefixLSIdentifier.java
index 23f4179..f6aaea6 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPPrefixLSIdentifier.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpPrefixLSIdentifier.java
@@ -21,9 +21,9 @@
 import java.util.Objects;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.types.BGPErrorType;
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.types.BgpErrorType;
+import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.types.IPReachabilityInformationTlv;
 import org.onosproject.bgpio.types.OSPFRouteTypeTlv;
 import org.onosproject.bgpio.types.attr.BgpAttrNodeMultiTopologyId;
@@ -36,17 +36,17 @@
 /**
  * Provides Implementation of Local node descriptors and prefix descriptors.
  */
-public class BGPPrefixLSIdentifier {
+public class BgpPrefixLSIdentifier {
 
-    protected static final Logger log = LoggerFactory.getLogger(BGPPrefixLSIdentifier.class);
+    protected static final Logger log = LoggerFactory.getLogger(BgpPrefixLSIdentifier.class);
     public static final int TYPE_AND_LEN = 4;
     private NodeDescriptors localNodeDescriptors;
-    private LinkedList<BGPValueType> prefixDescriptor;
+    private LinkedList<BgpValueType> prefixDescriptor;
 
     /**
      * Resets parameters.
      */
-    public BGPPrefixLSIdentifier() {
+    public BgpPrefixLSIdentifier() {
         this.localNodeDescriptors = null;
         this.prefixDescriptor = null;
     }
@@ -57,7 +57,7 @@
      * @param localNodeDescriptors Local node descriptors
      * @param prefixDescriptor Prefix Descriptors
      */
-    public BGPPrefixLSIdentifier(NodeDescriptors localNodeDescriptors, LinkedList<BGPValueType> prefixDescriptor) {
+    public BgpPrefixLSIdentifier(NodeDescriptors localNodeDescriptors, LinkedList<BgpValueType> prefixDescriptor) {
         this.localNodeDescriptors = localNodeDescriptors;
         this.prefixDescriptor = prefixDescriptor;
     }
@@ -68,18 +68,18 @@
      * @param cb ChannelBuffer
      * @param protocolId protocol ID
      * @return object of this class
-     * @throws BGPParseException while parsing Prefix Identifier
+     * @throws BgpParseException while parsing Prefix Identifier
      */
-    public static BGPPrefixLSIdentifier parsePrefixIdendifier(ChannelBuffer cb, byte protocolId)
-            throws BGPParseException {
+    public static BgpPrefixLSIdentifier parsePrefixIdendifier(ChannelBuffer cb, byte protocolId)
+            throws BgpParseException {
         //Parse Local Node descriptor
         NodeDescriptors localNodeDescriptors = new NodeDescriptors();
         localNodeDescriptors = parseLocalNodeDescriptors(cb, protocolId);
 
         //Parse Prefix descriptor
-        LinkedList<BGPValueType> prefixDescriptor = new LinkedList<>();
+        LinkedList<BgpValueType> prefixDescriptor = new LinkedList<>();
         prefixDescriptor = parsePrefixDescriptors(cb);
-        return new BGPPrefixLSIdentifier(localNodeDescriptors, prefixDescriptor);
+        return new BgpPrefixLSIdentifier(localNodeDescriptors, prefixDescriptor);
     }
 
     /**
@@ -88,16 +88,16 @@
      * @param cb ChannelBuffer
      * @param protocolId protocol identifier
      * @return LocalNodeDescriptors
-     * @throws BGPParseException while parsing local node descriptors
+     * @throws BgpParseException while parsing local node descriptors
      */
     public static NodeDescriptors parseLocalNodeDescriptors(ChannelBuffer cb, byte protocolId)
-                                                                 throws BGPParseException {
+                                                                 throws BgpParseException {
         ChannelBuffer tempBuf = cb;
         short type = cb.readShort();
         short length = cb.readShort();
         if (cb.readableBytes() < length) {
             //length + 4 implies data contains type, length and value
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.OPTIONAL_ATTRIBUTE_ERROR,
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.OPTIONAL_ATTRIBUTE_ERROR,
                     tempBuf.readBytes(cb.readableBytes() + TYPE_AND_LEN));
         }
         NodeDescriptors localNodeDescriptors = new NodeDescriptors();
@@ -106,8 +106,8 @@
         if (type == NodeDescriptors.LOCAL_NODE_DES_TYPE) {
             localNodeDescriptors = NodeDescriptors.read(tempCb, length, type, protocolId);
         } else {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                           BGPErrorType.MALFORMED_ATTRIBUTE_LIST, null);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                           BgpErrorType.MALFORMED_ATTRIBUTE_LIST, null);
         }
         return localNodeDescriptors;
     }
@@ -117,11 +117,11 @@
      *
      * @param cb ChannelBuffer
      * @return list of prefix descriptors
-     * @throws BGPParseException while parsing list of prefix descriptors
+     * @throws BgpParseException while parsing list of prefix descriptors
      */
-    public static LinkedList<BGPValueType> parsePrefixDescriptors(ChannelBuffer cb) throws BGPParseException {
-        LinkedList<BGPValueType> prefixDescriptor = new LinkedList<>();
-        BGPValueType tlv = null;
+    public static LinkedList<BgpValueType> parsePrefixDescriptors(ChannelBuffer cb) throws BgpParseException {
+        LinkedList<BgpValueType> prefixDescriptor = new LinkedList<>();
+        BgpValueType tlv = null;
         boolean isIpReachInfo = false;
         ChannelBuffer tempCb;
         int count = 0;
@@ -132,7 +132,7 @@
             short length = cb.readShort();
             if (cb.readableBytes() < length) {
                 //length + 4 implies data contains type, length and value
-                throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.OPTIONAL_ATTRIBUTE_ERROR,
+                throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.OPTIONAL_ATTRIBUTE_ERROR,
                         tempBuf.readBytes(cb.readableBytes() + TYPE_AND_LEN));
             }
             tempCb = cb.readBytes(length);
@@ -149,8 +149,8 @@
                 count = count + 1;
                 if (count > 1) {
                     //length + 4 implies data contains type, length and value
-                    throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                           BGPErrorType.OPTIONAL_ATTRIBUTE_ERROR, tempBuf.readBytes(length + TYPE_AND_LEN));
+                    throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                           BgpErrorType.OPTIONAL_ATTRIBUTE_ERROR, tempBuf.readBytes(length + TYPE_AND_LEN));
                 }
                 break;
             default:
@@ -160,7 +160,7 @@
         }
 
         if (!isIpReachInfo) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.OPTIONAL_ATTRIBUTE_ERROR,
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.OPTIONAL_ATTRIBUTE_ERROR,
                     null);
         }
         return prefixDescriptor;
@@ -180,7 +180,7 @@
      *
      * @return Prefix descriptors
      */
-    public LinkedList<BGPValueType> getPrefixdescriptor() {
+    public LinkedList<BgpValueType> getPrefixdescriptor() {
         return this.prefixDescriptor;
     }
 
@@ -195,20 +195,20 @@
             return true;
         }
 
-        if (obj instanceof BGPPrefixLSIdentifier) {
+        if (obj instanceof BgpPrefixLSIdentifier) {
             int countObjSubTlv = 0;
             int countOtherSubTlv = 0;
             boolean isCommonSubTlv = true;
-            BGPPrefixLSIdentifier other = (BGPPrefixLSIdentifier) obj;
+            BgpPrefixLSIdentifier other = (BgpPrefixLSIdentifier) obj;
 
-            Iterator<BGPValueType> objListIterator = other.prefixDescriptor.iterator();
+            Iterator<BgpValueType> objListIterator = other.prefixDescriptor.iterator();
             countOtherSubTlv = other.prefixDescriptor.size();
             countObjSubTlv = prefixDescriptor.size();
             if (countObjSubTlv != countOtherSubTlv) {
                 return false;
             } else {
                 while (objListIterator.hasNext() && isCommonSubTlv) {
-                    BGPValueType subTlv = objListIterator.next();
+                    BgpValueType subTlv = objListIterator.next();
                     isCommonSubTlv = Objects.equals(prefixDescriptor.contains(subTlv),
                             other.prefixDescriptor.contains(subTlv));
                 }
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/NodeDescriptors.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/NodeDescriptors.java
index 74637c7..0581b70 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/NodeDescriptors.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/NodeDescriptors.java
@@ -21,12 +21,12 @@
 import java.util.Objects;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
+import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.onosproject.bgpio.types.AreaIDTlv;
 import org.onosproject.bgpio.types.AutonomousSystemTlv;
-import org.onosproject.bgpio.types.BGPErrorType;
-import org.onosproject.bgpio.types.BGPLSIdentifierTlv;
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgpio.types.BgpErrorType;
+import org.onosproject.bgpio.types.BgpLSIdentifierTlv;
+import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.types.IsIsNonPseudonode;
 import org.onosproject.bgpio.types.IsIsPseudonode;
 import org.onosproject.bgpio.types.OSPFNonPseudonode;
@@ -71,7 +71,7 @@
     public static final int ISISPSEUDONODE_LEN = 7;
     public static final int OSPFNONPSEUDONODE_LEN = 4;
     public static final int OSPFPSEUDONODE_LEN = 8;
-    private LinkedList<BGPValueType> subTlvs;
+    private LinkedList<BgpValueType> subTlvs;
     private short deslength;
     private short desType;
 
@@ -91,7 +91,7 @@
      * @param deslength Descriptors length
      * @param desType local node descriptor or remote node descriptor type
      */
-    public NodeDescriptors(LinkedList<BGPValueType> subTlvs, short deslength, short desType) {
+    public NodeDescriptors(LinkedList<BgpValueType> subTlvs, short deslength, short desType) {
         this.subTlvs = subTlvs;
         this.deslength = deslength;
         this.desType = desType;
@@ -102,7 +102,7 @@
      *
      * @return subTlvs list of subTlvs
      */
-    public LinkedList<BGPValueType> getSubTlvs() {
+    public LinkedList<BgpValueType> getSubTlvs() {
         return subTlvs;
     }
 
@@ -122,14 +122,14 @@
             int countOtherSubTlv = 0;
             boolean isCommonSubTlv = true;
             NodeDescriptors other = (NodeDescriptors) obj;
-            Iterator<BGPValueType> objListIterator = other.subTlvs.iterator();
+            Iterator<BgpValueType> objListIterator = other.subTlvs.iterator();
             countOtherSubTlv = other.subTlvs.size();
             countObjSubTlv = subTlvs.size();
             if (countObjSubTlv != countOtherSubTlv) {
                 return false;
             } else {
                 while (objListIterator.hasNext() && isCommonSubTlv) {
-                    BGPValueType subTlv = objListIterator.next();
+                    BgpValueType subTlv = objListIterator.next();
                     isCommonSubTlv = Objects.equals(subTlvs.contains(subTlv), other.subTlvs.contains(subTlv));
                 }
                 return isCommonSubTlv;
@@ -146,20 +146,20 @@
      * @param desType local node descriptor or remote node descriptor type
      * @param protocolId protocol ID
      * @return object of NodeDescriptors
-     * @throws BGPParseException while parsing node descriptors
+     * @throws BgpParseException while parsing node descriptors
      */
     public static NodeDescriptors read(ChannelBuffer cb, short desLength, short desType, byte protocolId)
-            throws BGPParseException {
-        LinkedList<BGPValueType> subTlvs;
+            throws BgpParseException {
+        LinkedList<BgpValueType> subTlvs;
         subTlvs = new LinkedList<>();
-        BGPValueType tlv = null;
+        BgpValueType tlv = null;
 
         while (cb.readableBytes() > 0) {
             ChannelBuffer tempBuf = cb;
             short type = cb.readShort();
             short length = cb.readShort();
             if (cb.readableBytes() < length) {
-                throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.OPTIONAL_ATTRIBUTE_ERROR,
+                throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.OPTIONAL_ATTRIBUTE_ERROR,
                         tempBuf.readBytes(cb.readableBytes() + TYPE_AND_LEN));
             }
             ChannelBuffer tempCb = cb.readBytes(length);
@@ -167,8 +167,8 @@
             case AutonomousSystemTlv.TYPE:
                 tlv = AutonomousSystemTlv.read(tempCb);
                 break;
-            case BGPLSIdentifierTlv.TYPE:
-                tlv = BGPLSIdentifierTlv.read(tempCb);
+            case BgpLSIdentifierTlv.TYPE:
+                tlv = BgpLSIdentifierTlv.read(tempCb);
                 break;
             case AreaIDTlv.TYPE:
                 tlv = AreaIDTlv.read(tempCb);
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/PathAttrNlriDetails.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/PathAttrNlriDetails.java
index 76d533f..9578ccf 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/PathAttrNlriDetails.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/PathAttrNlriDetails.java
@@ -19,8 +19,8 @@
 import java.util.List;
 import java.util.Objects;
 
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4.ProtocolType;
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4.ProtocolType;
+import org.onosproject.bgpio.types.BgpValueType;
 
 import com.google.common.base.MoreObjects;
 
@@ -28,7 +28,7 @@
  * This Class stores path Attributes, protocol ID and Identifier of LinkState NLRI.
  */
 public class PathAttrNlriDetails {
-    private List<BGPValueType> pathAttributes;
+    private List<BgpValueType> pathAttributes;
     private ProtocolType protocolID;
     private long identifier;
 
@@ -37,7 +37,7 @@
      *
      * @param pathAttributes in update message
      */
-    public void setPathAttribute(List<BGPValueType> pathAttributes) {
+    public void setPathAttribute(List<BgpValueType> pathAttributes) {
         this.pathAttributes = pathAttributes;
     }
 
@@ -46,7 +46,7 @@
      *
      * @return path attributes
      */
-    public List<BGPValueType> pathAttributes() {
+    public List<BgpValueType> pathAttributes() {
         return this.pathAttributes;
     }
 
@@ -102,14 +102,14 @@
             int countOtherSubTlv = 0;
             boolean isCommonSubTlv = true;
             PathAttrNlriDetails other = (PathAttrNlriDetails) obj;
-            Iterator<BGPValueType> objListIterator = other.pathAttributes.iterator();
+            Iterator<BgpValueType> objListIterator = other.pathAttributes.iterator();
             countOtherSubTlv = other.pathAttributes.size();
             countObjSubTlv = pathAttributes.size();
             if (countObjSubTlv != countOtherSubTlv) {
                 return false;
             } else {
                 while (objListIterator.hasNext() && isCommonSubTlv) {
-                    BGPValueType subTlv = objListIterator.next();
+                    BgpValueType subTlv = objListIterator.next();
                     if (pathAttributes.contains(subTlv) && other.pathAttributes.contains(subTlv)) {
                         isCommonSubTlv = Objects.equals(pathAttributes.get(pathAttributes.indexOf(subTlv)),
                                 other.pathAttributes.get(other.pathAttributes.indexOf(subTlv)));
