diff --git a/bgp/api/src/main/java/org/onosproject/bgp/controller/BGPCfg.java b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpCfg.java
similarity index 96%
rename from bgp/api/src/main/java/org/onosproject/bgp/controller/BGPCfg.java
rename to bgp/api/src/main/java/org/onosproject/bgp/controller/BgpCfg.java
index 46165d8..6f64d2b 100755
--- a/bgp/api/src/main/java/org/onosproject/bgp/controller/BGPCfg.java
+++ b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpCfg.java
@@ -20,7 +20,7 @@
 /**
  * Abstraction of an BGP configuration. Manages the BGP configuration from CLI to the BGP controller.
  */
-public interface BGPCfg {
+public interface BgpCfg {
 
     enum State {
         /**
@@ -233,7 +233,7 @@
      *
      * @return return the tree map with IP as key and BGPPeerCfg as object
      */
-    TreeMap<String, BGPPeerCfg> displayPeers();
+    TreeMap<String, BgpPeerCfg> displayPeers();
 
     /**
      * Return the BGP Peer information with this matching IP.
@@ -242,7 +242,7 @@
      *
      * @return BGPPeerCfg object
      */
-    BGPPeerCfg displayPeers(String routerid);
+    BgpPeerCfg displayPeers(String routerid);
 
     /**
      * Check if this BGP peer is configured.
@@ -267,7 +267,7 @@
      *
      * @return return the tree map with IP as key and BGPPeerCfg as object
      */
-    TreeMap<String, BGPPeerCfg> getPeerTree();
+    TreeMap<String, BgpPeerCfg> getPeerTree();
 
     /**
      * Set the current connection state information.
@@ -275,7 +275,7 @@
      * @param routerid  router IP address in string format
      * @param state state information
      */
-    void setPeerConnState(String routerid, BGPPeerCfg.State state);
+    void setPeerConnState(String routerid, BgpPeerCfg.State state);
 
     /**
      * Check if the peer can be connected or not.
@@ -293,5 +293,5 @@
      *
      * @return state information
      */
-    BGPPeerCfg.State getPeerConnState(String routerid);
+    BgpPeerCfg.State getPeerConnState(String routerid);
 }
diff --git a/bgp/api/src/main/java/org/onosproject/bgp/controller/BGPController.java b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpController.java
similarity index 86%
rename from bgp/api/src/main/java/org/onosproject/bgp/controller/BGPController.java
rename to bgp/api/src/main/java/org/onosproject/bgp/controller/BgpController.java
index 9d44041..79677e9 100755
--- a/bgp/api/src/main/java/org/onosproject/bgp/controller/BGPController.java
+++ b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpController.java
@@ -19,21 +19,21 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPMessage;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpMessage;
 
 /**
  * Abstraction of an BGP controller. Serves as a one stop shop for obtaining BGP devices and (un)register listeners on
  * bgp events
  */
-public interface BGPController {
+public interface BgpController {
 
     /**
      * Returns list of bgp peers connected to this BGP controller.
      *
      * @return Iterable of BGPPeer elements
      */
-    Iterable<BGPPeer> getPeers();
+    Iterable<BgpPeer> getPeers();
 
     /**
      * Returns the actual bgp peer for the given ip address.
@@ -41,7 +41,7 @@
      * @param bgpId the id of the bgp peer to fetch
      * @return the interface to this bgp peer
      */
-    BGPPeer getPeer(BGPId bgpId);
+    BgpPeer getPeer(BgpId bgpId);
 
     /**
      * Register a listener for BGP message events.
@@ -77,16 +77,16 @@
      * @param bgpId the id of the peer to send message.
      * @param msg the message to send
      */
-    void writeMsg(BGPId bgpId, BGPMessage msg);
+    void writeMsg(BgpId bgpId, BgpMessage msg);
 
     /**
      * Process a message and notify the appropriate listeners.
      *
      * @param bgpId id of the peer the message arrived on
      * @param msg the message to process.
-     * @throws BGPParseException on data processing error
+     * @throws BgpParseException on data processing error
      */
-    void processBGPPacket(BGPId bgpId, BGPMessage msg) throws BGPParseException;
+    void processBGPPacket(BgpId bgpId, BgpMessage msg) throws BgpParseException;
 
     /**
      * Close all connected BGP peers.
@@ -99,7 +99,7 @@
      *
      * @return configuration object
      */
-    BGPCfg getConfig();
+    BgpCfg getConfig();
 
     /**
      * Get the BGP connected peers to this controller.
@@ -120,7 +120,7 @@
      *
      * @return connectedPeers connected peers
      */
-    Map<BGPId, BGPPeer> connectedPeers();
+    Map<BgpId, BgpPeer> connectedPeers();
 
     /**
      * Return BGP node listener.
diff --git a/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpDpid.java b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpDpid.java
index 9004216..71117c2 100755
--- a/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpDpid.java
+++ b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpDpid.java
@@ -18,9 +18,9 @@
 import java.net.URI;
 import java.net.URISyntaxException;
 
-import org.onosproject.bgpio.exceptions.BGPParseException;
+import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.onosproject.bgpio.protocol.linkstate.BgpLinkLsNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -61,7 +61,7 @@
             } else if (nodeDescriptorType == NODE_DESCRIPTOR_REMOTE) {
                 add(linkNlri.remoteNodeDescriptors().toString());
             }
-        } catch (BGPParseException e) {
+        } catch (BgpParseException e) {
             log.info("Exception BgpId string: " + e.toString());
         }
 
@@ -72,7 +72,7 @@
      *
      * @param nodeNlri node Nlri.
      */
-    public BgpDpid(final BGPNodeLSNlriVer4 nodeNlri) {
+    public BgpDpid(final BgpNodeLSNlriVer4 nodeNlri) {
         this.stringBuilder = new StringBuilder("bgpls://");
 
         if (nodeNlri.getRouteDistinguisher() != null) {
@@ -89,7 +89,7 @@
 
             add(nodeNlri.getLocalNodeDescriptors().toString());
 
-        } catch (BGPParseException e) {
+        } catch (BgpParseException e) {
             log.info("Exception node string: " + e.toString());
         }
     }
diff --git a/bgp/api/src/main/java/org/onosproject/bgp/controller/BGPId.java b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpId.java
similarity index 87%
rename from bgp/api/src/main/java/org/onosproject/bgp/controller/BGPId.java
rename to bgp/api/src/main/java/org/onosproject/bgp/controller/BgpId.java
index 636e72f..7a6c625 100755
--- a/bgp/api/src/main/java/org/onosproject/bgp/controller/BGPId.java
+++ b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpId.java
@@ -27,7 +27,7 @@
  * The class representing a network peer bgp ip.
  * This class is immutable.
  */
-public final class BGPId {
+public final class BgpId {
 
     private static final String SCHEME = "bgp";
     private static final long UNKNOWN = 0;
@@ -36,7 +36,7 @@
     /**
      * Private constructor.
      */
-    private BGPId(IpAddress ipAddress) {
+    private BgpId(IpAddress ipAddress) {
         this.ipAddress = ipAddress;
     }
 
@@ -46,8 +46,8 @@
      * @param ipAddress IP address
      * @return object of BGPId
      */
-    public static BGPId bgpId(IpAddress ipAddress) {
-        return new BGPId(ipAddress);
+    public static BgpId bgpId(IpAddress ipAddress) {
+        return new BgpId(ipAddress);
     }
 
     /**
@@ -71,11 +71,11 @@
 
     @Override
     public boolean equals(Object other) {
-        if (!(other instanceof BGPId)) {
+        if (!(other instanceof BgpId)) {
             return false;
         }
 
-        BGPId otherBGPid = (BGPId) other;
+        BgpId otherBGPid = (BgpId) other;
         return Objects.equals(ipAddress, otherBGPid.ipAddress);
     }
 
@@ -90,9 +90,9 @@
      * @param uri device URI
      * @return object of BGPId
      */
-    public static BGPId bgpId(URI uri) {
+    public static BgpId bgpId(URI uri) {
         checkArgument(uri.getScheme().equals(SCHEME), "Unsupported URI scheme");
-        return new BGPId(IpAddress.valueOf(uri.getSchemeSpecificPart()));
+        return new BgpId(IpAddress.valueOf(uri.getSchemeSpecificPart()));
     }
 
     /**
@@ -101,7 +101,7 @@
      * @param bgpId device bgpId
      * @return device URI
      */
-    public static URI uri(BGPId bgpId) {
+    public static URI uri(BgpId bgpId) {
         return uri(bgpId.ipAddress());
     }
 
diff --git a/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpLocalRib.java b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpLocalRib.java
index 9ecebc5..636c1c8 100755
--- a/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpLocalRib.java
+++ b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpLocalRib.java
@@ -13,7 +13,7 @@
 
 package org.onosproject.bgp.controller;
 
-import org.onosproject.bgpio.protocol.BGPLSNlri;
+import org.onosproject.bgpio.protocol.BgpLSNlri;
 import org.onosproject.bgpio.protocol.linkstate.PathAttrNlriDetails;
 import org.onosproject.bgpio.types.RouteDistinguisher;
 
@@ -29,14 +29,14 @@
      * @param nlri network layer reach info
      * @param details nlri details
      */
-    void add(BgpSessionInfo sessionInfo, BGPLSNlri nlri, PathAttrNlriDetails details);
+    void add(BgpSessionInfo sessionInfo, BgpLSNlri nlri, PathAttrNlriDetails details);
 
     /**
      * Removes NLRI identifier if it exists.
      *
      * @param nlri info
      */
-    void delete(BGPLSNlri nlri);
+    void delete(BgpLSNlri nlri);
 
     /**
      * Update NLRI identifier mapped with route distinguisher if it exists in tree otherwise add NLRI infomation mapped
@@ -47,7 +47,7 @@
      * @param details has pathattribute, protocol id and identifier
      * @param routeDistinguisher unique for each VPN
      */
-    void add(BgpSessionInfo sessionInfo, BGPLSNlri nlri, PathAttrNlriDetails details,
+    void add(BgpSessionInfo sessionInfo, BgpLSNlri nlri, PathAttrNlriDetails details,
                     RouteDistinguisher routeDistinguisher);
 
     /**
@@ -56,5 +56,5 @@
      * @param nlri info
      * @param routeDistinguisher unique for each VPN
      */
-    void delete(BGPLSNlri nlri, RouteDistinguisher routeDistinguisher);
+    void delete(BgpLSNlri nlri, RouteDistinguisher routeDistinguisher);
 }
diff --git a/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpNodeListener.java b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpNodeListener.java
index 37d849c..726d931 100755
--- a/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpNodeListener.java
+++ b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpNodeListener.java
@@ -12,7 +12,7 @@
  */
 package org.onosproject.bgp.controller;
 
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4;
 
 /**
  * Allows for providers interested in node events to be notified.
@@ -24,12 +24,12 @@
      *
      * @param nodeNlri node rechability info
      */
-    void addNode(BGPNodeLSNlriVer4 nodeNlri);
+    void addNode(BgpNodeLSNlriVer4 nodeNlri);
 
     /**
      * Notifies that the node was removed.
      *
      * @param nodeNlri node rechability info
      */
-    void deleteNode(BGPNodeLSNlriVer4 nodeNlri);
+    void deleteNode(BgpNodeLSNlriVer4 nodeNlri);
 }
diff --git a/bgp/api/src/main/java/org/onosproject/bgp/controller/BGPPacketStats.java b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPacketStats.java
similarity index 97%
rename from bgp/api/src/main/java/org/onosproject/bgp/controller/BGPPacketStats.java
rename to bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPacketStats.java
index 95f83a2..8fd3c68 100755
--- a/bgp/api/src/main/java/org/onosproject/bgp/controller/BGPPacketStats.java
+++ b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPacketStats.java
@@ -21,7 +21,7 @@
  * to the event if blocked has been called. This packet context can be used to react to the packet in event with a
  * packet out.
  */
-public interface BGPPacketStats {
+public interface BgpPacketStats {
     /**
      * Returns the count for no of packets sent out.
      *
diff --git a/bgp/api/src/main/java/org/onosproject/bgp/controller/BGPPeer.java b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPeer.java
similarity index 91%
rename from bgp/api/src/main/java/org/onosproject/bgp/controller/BGPPeer.java
rename to bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPeer.java
index aafaf06..df16346 100755
--- a/bgp/api/src/main/java/org/onosproject/bgp/controller/BGPPeer.java
+++ b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPeer.java
@@ -16,14 +16,14 @@
 package org.onosproject.bgp.controller;
 import java.util.List;
 import org.jboss.netty.channel.Channel;
-import org.onosproject.bgpio.protocol.BGPFactory;
-import org.onosproject.bgpio.protocol.BGPMessage;
+import org.onosproject.bgpio.protocol.BgpFactory;
+import org.onosproject.bgpio.protocol.BgpMessage;
 
 /**
  * Represents the peer side of an BGP peer.
  *
  */
-public interface BGPPeer {
+public interface BgpPeer {
 
     /**
      * Sets the associated Netty channel for this bgp peer.
@@ -58,21 +58,21 @@
      *
      * @param msg the message to write
      */
-    void sendMessage(BGPMessage msg);
+    void sendMessage(BgpMessage msg);
 
     /**
      * Writes the BGPMessage list to the peer.
      *
      * @param msgs the messages to be written
      */
-    void sendMessage(List<BGPMessage> msgs);
+    void sendMessage(List<BgpMessage> msgs);
 
     /**
      * Provides the factory for BGP version.
      *
      * @return BGP version specific factory.
      */
-    BGPFactory factory();
+    BgpFactory factory();
 
     /**
      * Checks if the bgp peer is still connected.
diff --git a/bgp/api/src/main/java/org/onosproject/bgp/controller/BGPPeerCfg.java b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPeerCfg.java
similarity index 99%
rename from bgp/api/src/main/java/org/onosproject/bgp/controller/BGPPeerCfg.java
rename to bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPeerCfg.java
index e7c5d9b..2fb970f 100755
--- a/bgp/api/src/main/java/org/onosproject/bgp/controller/BGPPeerCfg.java
+++ b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPeerCfg.java
@@ -18,7 +18,7 @@
 /**
  * BGP Peer configuration information.
  */
-public interface BGPPeerCfg {
+public interface BgpPeerCfg {
 
     enum State {
 
diff --git a/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPeerManager.java b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPeerManager.java
index d223096..895cc14 100755
--- a/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPeerManager.java
+++ b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpPeerManager.java
@@ -26,7 +26,7 @@
      *
      * @return false if peer already exist, otherwise true
      */
-    public boolean addConnectedPeer(BGPId bgpId, BGPPeer bgpPeer);
+    public boolean addConnectedPeer(BgpId bgpId, BgpPeer bgpPeer);
 
     /**
      * Validate wheather peer is connected.
@@ -35,14 +35,14 @@
      *
      * @return true if peer exist, otherwise false
      */
-    public boolean isPeerConnected(BGPId bgpId);
+    public boolean isPeerConnected(BgpId bgpId);
 
     /**
      * Remove connected peer.
      *
      * @param bgpId BGP ID
      */
-    public void removeConnectedPeer(BGPId bgpId);
+    public void removeConnectedPeer(BgpId bgpId);
 
     /**
      * Gets connected peer.
@@ -50,5 +50,5 @@
      * @param bgpId BGP ID
      * @return BGPPeer the connected peer, otherwise null
      */
-    public BGPPeer getPeer(BGPId bgpId);
+    public BgpPeer getPeer(BgpId bgpId);
 }
diff --git a/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpSessionInfo.java b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpSessionInfo.java
index 17753ff..a21a23d 100755
--- a/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpSessionInfo.java
+++ b/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpSessionInfo.java
@@ -13,7 +13,7 @@
 
 package org.onosproject.bgp.controller;
 
-import org.onosproject.bgpio.protocol.BGPVersion;
+import org.onosproject.bgpio.protocol.BgpVersion;
 
 /**
  * Abstraction of an BGP session info. Maintian session parameters obtained during session creation.
@@ -38,14 +38,14 @@
      *
      * @return bgp ID.
      */
-    BGPId remoteBgpId();
+    BgpId remoteBgpId();
 
     /**
      * Gets the BGP version of peer.
      *
      * @return bgp version.
      */
-    BGPVersion remoteBgpVersion();
+    BgpVersion remoteBgpVersion();
 
     /**
      * Gets the BGP remote bgp AS number.
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/exceptions/BGPParseException.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/exceptions/BgpParseException.java
similarity index 88%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/exceptions/BGPParseException.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/exceptions/BgpParseException.java
index 62427a4..d089032 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/exceptions/BGPParseException.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/exceptions/BgpParseException.java
@@ -21,7 +21,7 @@
 /**
  * Custom Exception for BGP IO.
  */
-public class BGPParseException extends Exception {
+public class BgpParseException extends Exception {
 
     private static final long serialVersionUID = 1L;
     private byte errorCode;
@@ -31,7 +31,7 @@
     /**
      * Default constructor to create a new exception.
      */
-    public BGPParseException() {
+    public BgpParseException() {
         super();
     }
 
@@ -41,7 +41,7 @@
      * @param message  the detail of exception in string
      * @param cause underlying cause of the error
      */
-    public BGPParseException(final String message, final Throwable cause) {
+    public BgpParseException(final String message, final Throwable cause) {
         super(message, cause);
     }
 
@@ -50,7 +50,7 @@
      *
      * @param message the detail of exception in string
      */
-    public BGPParseException(final String message) {
+    public BgpParseException(final String message) {
         super(message);
     }
 
@@ -59,7 +59,7 @@
      *
      * @param cause underlying cause of the error
      */
-    public BGPParseException(final Throwable cause) {
+    public BgpParseException(final Throwable cause) {
         super(cause);
     }
 
@@ -70,7 +70,7 @@
      * @param errorSubCode error subcode of BGP message
      * @param data error data of BGP message
      */
-    public BGPParseException(final byte errorCode, final byte errorSubCode, final ChannelBuffer data) {
+    public BgpParseException(final byte errorCode, final byte errorSubCode, final ChannelBuffer data) {
         super();
         this.errorCode = errorCode;
         this.errorSubCode = errorSubCode;
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPFactories.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpFactories.java
similarity index 67%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPFactories.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpFactories.java
index 71b9cbf..eb18c7d 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPFactories.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpFactories.java
@@ -17,22 +17,22 @@
 package org.onosproject.bgpio.protocol;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.ver4.BGPFactoryVer4;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.ver4.BgpFactoryVer4;
+import org.onosproject.bgpio.types.BgpHeader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Abstraction to provide the version for BGP.
  */
-public final class BGPFactories {
+public final class BgpFactories {
 
-    protected static final Logger log = LoggerFactory.getLogger(BGPFactories.class);
+    protected static final Logger log = LoggerFactory.getLogger(BgpFactories.class);
 
     private static final GenericReader GENERIC_READER = new GenericReader();
 
-    private BGPFactories() {
+    private BgpFactories() {
     }
 
     /**
@@ -41,12 +41,12 @@
      * @param version BGP version
      * @return BGP version
      */
-    public static BGPFactory getFactory(BGPVersion version) {
+    public static BgpFactory getFactory(BgpVersion version) {
         switch (version) {
         case BGP_4:
-            return BGPFactoryVer4.INSTANCE;
+            return BgpFactoryVer4.INSTANCE;
         default:
-            throw new IllegalArgumentException("[BGPFactory:]Unknown version: " + version);
+            throw new IllegalArgumentException("[BgpFactory:]Unknown version: " + version);
         }
     }
 
@@ -54,19 +54,19 @@
      * Reader class for reading BGP messages from channel buffer.
      *
      */
-    private static class GenericReader implements BGPMessageReader<BGPMessage> {
+    private static class GenericReader implements BgpMessageReader<BgpMessage> {
 
         @Override
-        public BGPMessage readFrom(ChannelBuffer bb, BGPHeader bgpHeader)
-                throws BGPParseException {
-            BGPFactory factory;
+        public BgpMessage readFrom(ChannelBuffer bb, BgpHeader bgpHeader)
+                throws BgpParseException {
+            BgpFactory factory;
 
             if (!bb.readable()) {
                 log.error("Empty message received");
-                throw new BGPParseException("Empty message received");
+                throw new BgpParseException("Empty message received");
             }
             // TODO: Currently only BGP version 4 is supported
-            factory = org.onosproject.bgpio.protocol.ver4.BGPFactoryVer4.INSTANCE;
+            factory = org.onosproject.bgpio.protocol.ver4.BgpFactoryVer4.INSTANCE;
             return factory.getReader().readFrom(bb, bgpHeader);
         }
     }
@@ -76,7 +76,7 @@
      *
      * @return bgp message generic reader
      */
-    public static BGPMessageReader<BGPMessage> getGenericReader() {
+    public static BgpMessageReader<BgpMessage> getGenericReader() {
         return GENERIC_READER;
     }
 }
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPFactory.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpFactory.java
similarity index 83%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPFactory.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpFactory.java
index cf6bf00..11a85ff 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPFactory.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpFactory.java
@@ -21,40 +21,40 @@
  * and objects.
  *
  */
-public interface BGPFactory {
+public interface BgpFactory {
 
     /**
      * Gets the builder object for a open message.
      *
      * @return builder object for open message
      */
-    BGPOpenMsg.Builder openMessageBuilder();
+    BgpOpenMsg.Builder openMessageBuilder();
 
     /**
      * Gets the builder object for a keepalive message.
      *
      * @return builder object for keepalive message
      */
-    BGPKeepaliveMsg.Builder keepaliveMessageBuilder();
+    BgpKeepaliveMsg.Builder keepaliveMessageBuilder();
 
     /**
      * Gets the builder object for a notification message.
      *
      * @return builder object for notification message.
      */
-    BGPNotificationMsg.Builder notificationMessageBuilder();
+    BgpNotificationMsg.Builder notificationMessageBuilder();
 
     /**
      * Gets the BGP message reader.
      *
      * @return BGP message reader
      */
-    BGPMessageReader<BGPMessage> getReader();
+    BgpMessageReader<BgpMessage> getReader();
 
     /**
      * Returns BGP version.
      *
      * @return BGP version
      */
-    BGPVersion getVersion();
+    BgpVersion getVersion();
 }
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPKeepaliveMsg.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpKeepaliveMsg.java
similarity index 76%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPKeepaliveMsg.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpKeepaliveMsg.java
index ae77388..0cb776a 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPKeepaliveMsg.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpKeepaliveMsg.java
@@ -16,33 +16,33 @@
 package org.onosproject.bgpio.protocol;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.types.BgpHeader;
 
 /**
  * Abstraction of an entity providing BGP Keepalive Message.
  */
-public interface BGPKeepaliveMsg extends BGPMessage {
+public interface BgpKeepaliveMsg extends BgpMessage {
 
     @Override
-    BGPVersion getVersion();
+    BgpVersion getVersion();
 
     @Override
-    BGPType getType();
+    BgpType getType();
 
     @Override
     void writeTo(ChannelBuffer channelBuffer);
 
     @Override
-    BGPHeader getHeader();
+    BgpHeader getHeader();
 
     /**
      * Builder interface with get and set functions to build Keepalive message.
      */
-    interface Builder extends BGPMessage.Builder {
+    interface Builder extends BgpMessage.Builder {
         @Override
-        BGPKeepaliveMsg build();
+        BgpKeepaliveMsg build();
 
         @Override
-        Builder setHeader(BGPHeader bgpMsgHeader);
+        Builder setHeader(BgpHeader bgpMsgHeader);
     }
 }
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPLSNlri.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpLSNlri.java
similarity index 82%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPLSNlri.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpLSNlri.java
index 201285d..dd8857a 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPLSNlri.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpLSNlri.java
@@ -15,14 +15,14 @@
  */
 package org.onosproject.bgpio.protocol;
 
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4.ProtocolType;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4.ProtocolType;
 import org.onosproject.bgpio.types.RouteDistinguisher;
 
 /**
  * Abstraction of an entity providing BGP-LS NLRI.
  */
-public interface BGPLSNlri {
+public interface BgpLSNlri {
     /**
      * Returns NlriType of BGP-LS NLRI.
      *
@@ -41,9 +41,9 @@
      * Returns Protocol Id in Nlri.
      *
      * @return Protocol Id in Nlri
-     * @throws BGPParseException while getting protocol ID
+     * @throws BgpParseException while getting protocol ID
      */
-    ProtocolType getProtocolId() throws BGPParseException;
+    ProtocolType getProtocolId() throws BgpParseException;
 
     /**
      * Returns Route distinguisher in Nlri.
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpLinkLsNlri.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpLinkLsNlri.java
index dab7a3d..3924a13 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpLinkLsNlri.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpLinkLsNlri.java
@@ -17,13 +17,13 @@
 
 import java.util.List;
 
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.protocol.linkstate.NodeDescriptors;
 
 /**
  * Abstraction of an entity providing BGP-LS Link NLRI.
  */
-public interface BgpLinkLsNlri extends BGPLSNlri {
+public interface BgpLinkLsNlri extends BgpLSNlri {
     /**
      * Returns local node descriptors.
      *
@@ -43,5 +43,5 @@
      *
      * @return link descriptors
      */
-    List<BGPValueType> linkDescriptors();
+    List<BgpValueType> linkDescriptors();
 }
\ No newline at end of file
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPMessage.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpMessage.java
similarity index 76%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPMessage.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpMessage.java
index 309ef43..f1e1b96 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPMessage.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpMessage.java
@@ -17,36 +17,36 @@
 package org.onosproject.bgpio.protocol;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.types.BgpHeader;
 
 /**
  * Abstraction of an entity providing BGP Messages.
  */
-public interface BGPMessage extends Writeable {
+public interface BgpMessage extends Writeable {
     /**
      * Returns BGP Header of BGP Message.
      *
      * @return BGP Header of BGP Message
      */
-    BGPHeader getHeader();
+    BgpHeader getHeader();
 
     /**
      * Returns version of BGP Message.
      *
      * @return version of BGP Message
      */
-    BGPVersion getVersion();
+    BgpVersion getVersion();
 
     /**
      * Returns BGP Type of BGP Message.
      *
      * @return BGP Type of BGP Message
      */
-    BGPType getType();
+    BgpType getType();
 
     @Override
-    void writeTo(ChannelBuffer cb) throws BGPParseException;
+    void writeTo(ChannelBuffer cb) throws BgpParseException;
 
     /**
      * Builder interface with get and set functions to build BGP Message.
@@ -56,9 +56,9 @@
          * Builds BGP Message.
          *
          * @return BGP Message
-         * @throws BGPParseException while building bgp message
+         * @throws BgpParseException while building bgp message
          */
-        BGPMessage build() throws BGPParseException;
+        BgpMessage build() throws BgpParseException;
 
         /**
          * Sets BgpHeader and return its builder.
@@ -66,6 +66,6 @@
          * @param bgpMsgHeader BGP Message Header
          * @return builder by setting BGP message header
          */
-        Builder setHeader(BGPHeader bgpMsgHeader);
+        Builder setHeader(BgpHeader bgpMsgHeader);
     }
 }
\ No newline at end of file
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPMessageReader.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpMessageReader.java
similarity index 78%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPMessageReader.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpMessageReader.java
index 18b8f58..b8318b2 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPMessageReader.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpMessageReader.java
@@ -16,13 +16,13 @@
 package org.onosproject.bgpio.protocol;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.types.BgpHeader;
 
 /**
  * Abstraction of an entity providing BGP Message Reader.
  */
-public interface BGPMessageReader<T> {
+public interface BgpMessageReader<T> {
 
     /**
      * Reads the Objects in the BGP Message and Returns BGP Message.
@@ -30,7 +30,7 @@
      * @param cb Channel Buffer
      * @param bgpHeader BGP message header
      * @return BGP Message
-     * @throws BGPParseException while parsing BGP message.
+     * @throws BgpParseException while parsing BGP message.
      */
-    T readFrom(ChannelBuffer cb, BGPHeader bgpHeader) throws BGPParseException;
+    T readFrom(ChannelBuffer cb, BgpHeader bgpHeader) throws BgpParseException;
 }
\ No newline at end of file
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPMessageWriter.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpMessageWriter.java
similarity index 83%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPMessageWriter.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpMessageWriter.java
index 11f161c..bb75b5e 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPMessageWriter.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpMessageWriter.java
@@ -17,20 +17,20 @@
 package org.onosproject.bgpio.protocol;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
+import org.onosproject.bgpio.exceptions.BgpParseException;
 
 /**
  * Abstraction of an entity providing BGP Message Writer.
  */
-public interface BGPMessageWriter<T> {
+public interface BgpMessageWriter<T> {
 
     /**
      * Writes the Objects of the BGP Message into Channel Buffer.
      *
      * @param cb Channel Buffer
      * @param message BGP Message
-     * @throws BGPParseException
+     * @throws BgpParseException
      *                     While writing message
      */
-     void write(ChannelBuffer cb, T message) throws BGPParseException;
+     void write(ChannelBuffer cb, T message) throws BgpParseException;
 }
\ No newline at end of file
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPNodeLSNlri.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpNodeLSNlri.java
similarity index 83%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPNodeLSNlri.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpNodeLSNlri.java
index b6e4a3a..13ef5cc 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPNodeLSNlri.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpNodeLSNlri.java
@@ -15,16 +15,16 @@
  */
 package org.onosproject.bgpio.protocol;
 
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSIdentifier;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSIdentifier;
 
 /**
  * Abstraction of an entity providing BGP-LS Node NLRI.
  */
-public interface BGPNodeLSNlri extends BGPLSNlri {
+public interface BgpNodeLSNlri extends BgpLSNlri {
     /**
      * Returns local node descriptors.
      *
      * @return local node descriptors
      */
-    BGPNodeLSIdentifier getLocalNodeDescriptors();
+    BgpNodeLSIdentifier getLocalNodeDescriptors();
 }
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPNotificationMsg.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpNotificationMsg.java
similarity index 90%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPNotificationMsg.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpNotificationMsg.java
index a1d9d57..e3361aa 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPNotificationMsg.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpNotificationMsg.java
@@ -15,12 +15,12 @@
  */
 package org.onosproject.bgpio.protocol;
 
-import org.onosproject.bgpio.exceptions.BGPParseException;
+import org.onosproject.bgpio.exceptions.BgpParseException;
 
 /**
  * Abstraction of an entity providing BGP notification message.
  */
-public interface BGPNotificationMsg extends BGPMessage {
+public interface BgpNotificationMsg extends BgpMessage {
     /**
      * Returns errorCode in notification message.
      *
@@ -45,10 +45,10 @@
     /**
      * Builder interface with get and set functions to build notification message.
      */
-    public interface Builder extends BGPMessage.Builder {
+    public interface Builder extends BgpMessage.Builder {
 
         @Override
-        BGPNotificationMsg build() throws BGPParseException;
+        BgpNotificationMsg build() throws BgpParseException;
 
         /**
          * Sets errorCode in notification message and return its builder.
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPOpenMsg.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpOpenMsg.java
similarity index 84%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPOpenMsg.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpOpenMsg.java
index bf5d05f..94ec223 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPOpenMsg.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpOpenMsg.java
@@ -17,23 +17,23 @@
 
 import java.util.LinkedList;
 
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.types.BGPHeader;
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.types.BgpHeader;
+import org.onosproject.bgpio.types.BgpValueType;
 
 /**
  * Abstraction of an entity providing BGP Open Message.
  */
-public interface BGPOpenMsg extends BGPMessage {
+public interface BgpOpenMsg extends BgpMessage {
 
     @Override
-    BGPHeader getHeader();
+    BgpHeader getHeader();
 
     @Override
-    BGPVersion getVersion();
+    BgpVersion getVersion();
 
     @Override
-    BGPType getType();
+    BgpType getType();
 
     /**
      * Returns hold time of Open Message.
@@ -61,15 +61,15 @@
      *
      * @return capabilities of Open Message
      */
-    LinkedList<BGPValueType> getCapabilityTlv();
+    LinkedList<BgpValueType> getCapabilityTlv();
 
     /**
      * Builder interface with get and set functions to build Open message.
      */
-    interface Builder extends BGPMessage.Builder {
+    interface Builder extends BgpMessage.Builder {
 
         @Override
-        BGPOpenMsg build() throws BGPParseException;
+        BgpOpenMsg build() throws BgpParseException;
 
         /**
          * Sets hold time in Open Message and return its builder.
@@ -101,7 +101,7 @@
          * @param capabilityTlv capabilities in open message
          * @return builder by setting capabilities
          */
-        Builder setCapabilityTlv(LinkedList<BGPValueType> capabilityTlv);
+        Builder setCapabilityTlv(LinkedList<BgpValueType> capabilityTlv);
 
         /**
          * Sets isLargeAsCapabilityTlvSet and return its builder.
@@ -122,6 +122,6 @@
         Builder setLsCapabilityTlv(boolean isLsCapabilitySet);
 
         @Override
-        Builder setHeader(BGPHeader bgpMsgHeader);
+        Builder setHeader(BgpHeader bgpMsgHeader);
     }
 }
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPPrefixLSNlri.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpPrefixLSNlri.java
similarity index 87%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPPrefixLSNlri.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpPrefixLSNlri.java
index 2c331a2..794b6e9 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPPrefixLSNlri.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpPrefixLSNlri.java
@@ -17,13 +17,13 @@
 
 import java.util.LinkedList;
 
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.protocol.linkstate.NodeDescriptors;
 
 /**
  * Abstraction of an entity providing BGP-LS Prefix NLRI.
  */
-public interface BGPPrefixLSNlri extends BGPLSNlri {
+public interface BgpPrefixLSNlri extends BgpLSNlri {
     /**
      * Returns local node descriptors.
      *
@@ -36,5 +36,5 @@
      *
      * @return list of Prefix descriptor
      */
-    LinkedList<BGPValueType> getPrefixdescriptor();
+    LinkedList<BgpValueType> getPrefixdescriptor();
 }
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPType.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpType.java
similarity index 96%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPType.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpType.java
index d334915..b90721d 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPType.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpType.java
@@ -19,7 +19,7 @@
 /**
  * Enum to Provide the Different types of BGP messages.
  */
-public enum BGPType {
+public enum BgpType {
 
     NONE(0), OPEN(1), UPDATE(2), NOTIFICATION(3), KEEP_ALIVE(4);
 
@@ -30,7 +30,7 @@
      *
      * @param val type of BGP message
      */
-    BGPType(int val) {
+    BgpType(int val) {
         value = val;
     }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpUpdateMsg.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpUpdateMsg.java
index 969936c..d79a423 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpUpdateMsg.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpUpdateMsg.java
@@ -24,7 +24,7 @@
 /**
  * Abstraction of an entity providing BGP Update Message.
  */
-public interface BgpUpdateMsg extends BGPMessage {
+public interface BgpUpdateMsg extends BgpMessage {
     /**
      * Returns path attributes in BGP Update Message.
      *
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPVersion.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpVersion.java
similarity index 94%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPVersion.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpVersion.java
index 97bc7dc..b1f037f 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BGPVersion.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpVersion.java
@@ -19,7 +19,7 @@
 /**
  * Enum to provide BGP Message Version.
  */
-public enum BGPVersion {
+public enum BgpVersion {
 
     BGP_4(4);
 
@@ -30,7 +30,7 @@
      *
      * @param packetVersion version of BGP
      */
-    BGPVersion(final int packetVersion) {
+    BgpVersion(final int packetVersion) {
         this.packetVersion = packetVersion;
     }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/Writeable.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/Writeable.java
index 72df7f3..1c6f7fc 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/Writeable.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/Writeable.java
@@ -17,7 +17,7 @@
 package org.onosproject.bgpio.protocol;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
+import org.onosproject.bgpio.exceptions.BgpParseException;
 
 /**
  * Abstraction of an entity providing functionality to write byte streams of
@@ -29,7 +29,7 @@
      * Writes byte streams of messages to channel buffer.
      *
      * @param cb channelBuffer
-     * @throws BGPParseException when error occurs while writing BGP message to channel buffer
+     * @throws BgpParseException when error occurs while writing BGP message to channel buffer
      */
-    void writeTo(ChannelBuffer cb) throws BGPParseException;
+    void writeTo(ChannelBuffer cb) throws BgpParseException;
 }
\ No newline at end of file
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)));
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPFactoryVer4.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPFactoryVer4.java
deleted file mode 100755
index 32af385..0000000
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPFactoryVer4.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.bgpio.protocol.ver4;
-
-import org.onosproject.bgpio.protocol.BGPFactory;
-import org.onosproject.bgpio.protocol.BGPKeepaliveMsg;
-import org.onosproject.bgpio.protocol.BGPMessage;
-import org.onosproject.bgpio.protocol.BGPMessageReader;
-import org.onosproject.bgpio.protocol.BGPNotificationMsg;
-import org.onosproject.bgpio.protocol.BGPOpenMsg;
-import org.onosproject.bgpio.protocol.BGPVersion;
-
-/**
- * Provides BGP Factory and returns builder classes for all objects and messages.
- */
-public class BGPFactoryVer4 implements BGPFactory {
-
-    public static final BGPFactoryVer4 INSTANCE = new BGPFactoryVer4();
-
-    @Override
-    public BGPOpenMsg.Builder openMessageBuilder() {
-        return new BGPOpenMsgVer4.Builder();
-    }
-
-    @Override
-    public BGPKeepaliveMsg.Builder keepaliveMessageBuilder() {
-        return new BGPKeepaliveMsgVer4.Builder();
-    }
-
-    @Override
-    public BGPNotificationMsg.Builder notificationMessageBuilder() {
-        return new BGPNotificationMsgVer4.Builder();
-    }
-
-    @Override
-    public BGPMessageReader<BGPMessage> getReader() {
-        return BGPMessageVer4.READER;
-    }
-
-    @Override
-    public BGPVersion getVersion() {
-        return BGPVersion.BGP_4;
-    }
-}
\ No newline at end of file
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpFactoryVer4.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpFactoryVer4.java
new file mode 100755
index 0000000..c57832b
--- /dev/null
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpFactoryVer4.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.bgpio.protocol.ver4;
+
+import org.onosproject.bgpio.protocol.BgpFactory;
+import org.onosproject.bgpio.protocol.BgpKeepaliveMsg;
+import org.onosproject.bgpio.protocol.BgpMessage;
+import org.onosproject.bgpio.protocol.BgpMessageReader;
+import org.onosproject.bgpio.protocol.BgpNotificationMsg;
+import org.onosproject.bgpio.protocol.BgpOpenMsg;
+import org.onosproject.bgpio.protocol.BgpVersion;
+
+/**
+ * Provides BGP Factory and returns builder classes for all objects and messages.
+ */
+public class BgpFactoryVer4 implements BgpFactory {
+
+    public static final BgpFactoryVer4 INSTANCE = new BgpFactoryVer4();
+
+    @Override
+    public BgpOpenMsg.Builder openMessageBuilder() {
+        return new BgpOpenMsgVer4.Builder();
+    }
+
+    @Override
+    public BgpKeepaliveMsg.Builder keepaliveMessageBuilder() {
+        return new BgpKeepaliveMsgVer4.Builder();
+    }
+
+    @Override
+    public BgpNotificationMsg.Builder notificationMessageBuilder() {
+        return new BgpNotificationMsgVer4.Builder();
+    }
+
+    @Override
+    public BgpMessageReader<BgpMessage> getReader() {
+        return BgpMessageVer4.READER;
+    }
+
+    @Override
+    public BgpVersion getVersion() {
+        return BgpVersion.BGP_4;
+    }
+}
\ No newline at end of file
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPKeepaliveMsgVer4.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpKeepaliveMsgVer4.java
similarity index 73%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPKeepaliveMsgVer4.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpKeepaliveMsgVer4.java
index 0cf4ae5..2c14158 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPKeepaliveMsgVer4.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpKeepaliveMsgVer4.java
@@ -16,13 +16,13 @@
 package org.onosproject.bgpio.protocol.ver4;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPKeepaliveMsg;
-import org.onosproject.bgpio.protocol.BGPMessageReader;
-import org.onosproject.bgpio.protocol.BGPMessageWriter;
-import org.onosproject.bgpio.types.BGPHeader;
-import org.onosproject.bgpio.protocol.BGPType;
-import org.onosproject.bgpio.protocol.BGPVersion;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpKeepaliveMsg;
+import org.onosproject.bgpio.protocol.BgpMessageReader;
+import org.onosproject.bgpio.protocol.BgpMessageWriter;
+import org.onosproject.bgpio.types.BgpHeader;
+import org.onosproject.bgpio.protocol.BgpType;
+import org.onosproject.bgpio.protocol.BgpVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -31,7 +31,7 @@
 /**
  * Provides BGP keep alive message.
  */
-public class BGPKeepaliveMsgVer4 implements BGPKeepaliveMsg {
+public class BgpKeepaliveMsgVer4 implements BgpKeepaliveMsg {
 
     /*
     <Keepalive Message>::= <Common Header>
@@ -56,56 +56,56 @@
     */
 
     protected static final Logger log = LoggerFactory
-            .getLogger(BGPKeepaliveMsgVer4.class);
+            .getLogger(BgpKeepaliveMsgVer4.class);
 
-    private BGPHeader bgpMsgHeader;
+    private BgpHeader bgpMsgHeader;
     public static final byte PACKET_VERSION = 4;
     public static final int PACKET_MINIMUM_LENGTH = 19;
     public static final int MARKER_LENGTH = 16;
-    public static final BGPType MSG_TYPE = BGPType.KEEP_ALIVE;
+    public static final BgpType MSG_TYPE = BgpType.KEEP_ALIVE;
     public static byte[] marker = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
                                               (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
                                               (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
                                               (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};
 
-    public static final BGPKeepaliveMsgVer4.Reader READER = new Reader();
+    public static final BgpKeepaliveMsgVer4.Reader READER = new Reader();
 
     /**
      * Reader class for reading BGP keepalive message from channel buffer.
      */
-    static class Reader implements BGPMessageReader<BGPKeepaliveMsg> {
+    static class Reader implements BgpMessageReader<BgpKeepaliveMsg> {
 
         @Override
-        public BGPKeepaliveMsg readFrom(ChannelBuffer cb, BGPHeader bgpHeader)
-                throws BGPParseException {
+        public BgpKeepaliveMsg readFrom(ChannelBuffer cb, BgpHeader bgpHeader)
+                throws BgpParseException {
 
             /* bgpHeader is not required in case of keepalive message and
             Header is already read and no other fields except header in keepalive message.*/
-            return new BGPKeepaliveMsgVer4();
+            return new BgpKeepaliveMsgVer4();
         }
     }
 
     /**
      * Default constructor.
      */
-    public BGPKeepaliveMsgVer4() {
+    public BgpKeepaliveMsgVer4() {
     }
 
     /**
      * Builder class for BGP keepalive message.
      */
-    static class Builder implements BGPKeepaliveMsg.Builder {
-        BGPHeader bgpMsgHeader;
+    static class Builder implements BgpKeepaliveMsg.Builder {
+        BgpHeader bgpMsgHeader;
 
         @Override
-        public Builder setHeader(BGPHeader bgpMsgHeader) {
+        public Builder setHeader(BgpHeader bgpMsgHeader) {
             this.bgpMsgHeader = bgpMsgHeader;
             return this;
         }
 
         @Override
-        public BGPKeepaliveMsg build() {
-            return new BGPKeepaliveMsgVer4();
+        public BgpKeepaliveMsg build() {
+            return new BgpKeepaliveMsgVer4();
         }
     }
 
@@ -119,10 +119,10 @@
     /**
      * Writer class for writing the BGP keepalive message to channel buffer.
      */
-    static class Writer implements BGPMessageWriter<BGPKeepaliveMsgVer4> {
+    static class Writer implements BgpMessageWriter<BgpKeepaliveMsgVer4> {
 
         @Override
-        public void write(ChannelBuffer cb, BGPKeepaliveMsgVer4 message) {
+        public void write(ChannelBuffer cb, BgpKeepaliveMsgVer4 message) {
 
             // write marker
             cb.writeBytes(marker, 0, MARKER_LENGTH);
@@ -136,17 +136,17 @@
     }
 
     @Override
-    public BGPVersion getVersion() {
-        return BGPVersion.BGP_4;
+    public BgpVersion getVersion() {
+        return BgpVersion.BGP_4;
     }
 
     @Override
-    public BGPType getType() {
+    public BgpType getType() {
         return MSG_TYPE;
     }
 
     @Override
-    public BGPHeader getHeader() {
+    public BgpHeader getHeader() {
         return this.bgpMsgHeader;
     }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPMessageVer4.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpMessageVer4.java
similarity index 66%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPMessageVer4.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpMessageVer4.java
index 34fa5d7..1c05dae 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPMessageVer4.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpMessageVer4.java
@@ -17,12 +17,12 @@
 package org.onosproject.bgpio.protocol.ver4;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPFactories;
-import org.onosproject.bgpio.protocol.BGPMessage;
-import org.onosproject.bgpio.protocol.BGPMessageReader;
-import org.onosproject.bgpio.types.BGPErrorType;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpFactories;
+import org.onosproject.bgpio.protocol.BgpMessage;
+import org.onosproject.bgpio.protocol.BgpMessageReader;
+import org.onosproject.bgpio.types.BgpErrorType;
+import org.onosproject.bgpio.types.BgpHeader;
 import org.onosproject.bgpio.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,9 +30,9 @@
 /**
  * Provides BGP messages.
  */
-public abstract class BGPMessageVer4 {
+public abstract class BgpMessageVer4 {
 
-    protected static final Logger log = LoggerFactory.getLogger(BGPFactories.class);
+    protected static final Logger log = LoggerFactory.getLogger(BgpFactories.class);
 
     static final byte OPEN_MSG_TYPE = 0x1;
     static final byte KEEPALIVE_MSG_TYPE = 0x4;
@@ -42,42 +42,42 @@
     static final int HEADER_AND_MSG_LEN = 18;
     static final int MAXIMUM_PACKET_LENGTH = 4096;
 
-    public static final BGPMessageVer4.Reader READER = new Reader();
+    public static final BgpMessageVer4.Reader READER = new Reader();
 
     /**
      * Reader class for reading BGP messages from channel buffer.
      *
      */
-    static class Reader implements BGPMessageReader<BGPMessage> {
+    static class Reader implements BgpMessageReader<BgpMessage> {
         @Override
-        public BGPMessage readFrom(ChannelBuffer cb, BGPHeader bgpHeader)
-                throws BGPParseException {
+        public BgpMessage readFrom(ChannelBuffer cb, BgpHeader bgpHeader)
+                throws BgpParseException {
 
             if (cb.readableBytes() < MINIMUM_COMMON_HEADER_LENGTH) {
                 log.error("Packet should have minimum length.");
-                Validation.validateLen(BGPErrorType.MESSAGE_HEADER_ERROR, BGPErrorType.BAD_MESSAGE_LENGTH,
+                Validation.validateLen(BgpErrorType.MESSAGE_HEADER_ERROR, BgpErrorType.BAD_MESSAGE_LENGTH,
                                        cb.readableBytes());
             }
             if (cb.readableBytes() > MAXIMUM_PACKET_LENGTH) {
                 log.error("Packet length should not exceed {}.", MAXIMUM_PACKET_LENGTH);
-                Validation.validateLen(BGPErrorType.MESSAGE_HEADER_ERROR, BGPErrorType.BAD_MESSAGE_LENGTH,
+                Validation.validateLen(BgpErrorType.MESSAGE_HEADER_ERROR, BgpErrorType.BAD_MESSAGE_LENGTH,
                                        cb.readableBytes());
             }
             try {
                 // fixed value property version == 4
-                byte[] marker = new byte[BGPHeader.MARKER_LENGTH];
-                cb.readBytes(marker, 0, BGPHeader.MARKER_LENGTH);
+                byte[] marker = new byte[BgpHeader.MARKER_LENGTH];
+                cb.readBytes(marker, 0, BgpHeader.MARKER_LENGTH);
                 bgpHeader.setMarker(marker);
-                for (int i = 0; i < BGPHeader.MARKER_LENGTH; i++) {
+                for (int i = 0; i < BgpHeader.MARKER_LENGTH; i++) {
                     if (marker[i] != (byte) 0xff) {
-                        throw new BGPParseException(BGPErrorType.MESSAGE_HEADER_ERROR,
-                                                    BGPErrorType.CONNECTION_NOT_SYNCHRONIZED, null);
+                        throw new BgpParseException(BgpErrorType.MESSAGE_HEADER_ERROR,
+                                                    BgpErrorType.CONNECTION_NOT_SYNCHRONIZED, null);
                     }
                 }
                 short length = cb.readShort();
                 if (length > cb.readableBytes() + HEADER_AND_MSG_LEN) {
-                    Validation.validateLen(BGPErrorType.MESSAGE_HEADER_ERROR,
-                                           BGPErrorType.BAD_MESSAGE_LENGTH, length);
+                    Validation.validateLen(BgpErrorType.MESSAGE_HEADER_ERROR,
+                                           BgpErrorType.BAD_MESSAGE_LENGTH, length);
                 }
                 bgpHeader.setLength(length);
                 byte type = cb.readByte();
@@ -88,23 +88,23 @@
                 switch (type) {
                 case OPEN_MSG_TYPE:
                     log.debug("OPEN MESSAGE is received");
-                    return BGPOpenMsgVer4.READER.readFrom(cb.readBytes(len), bgpHeader);
+                    return BgpOpenMsgVer4.READER.readFrom(cb.readBytes(len), bgpHeader);
                 case KEEPALIVE_MSG_TYPE:
                     log.debug("KEEPALIVE MESSAGE is received");
-                    return BGPKeepaliveMsgVer4.READER.readFrom(cb.readBytes(len), bgpHeader);
+                    return BgpKeepaliveMsgVer4.READER.readFrom(cb.readBytes(len), bgpHeader);
                 case UPDATE_MSG_TYPE:
                     log.debug("UPDATE MESSAGE is received");
                     return BgpUpdateMsgVer4.READER.readFrom(cb.readBytes(len), bgpHeader);
                 case NOTIFICATION_MSG_TYPE:
                     log.debug("NOTIFICATION MESSAGE is received");
-                    return BGPNotificationMsgVer4.READER.readFrom(cb.readBytes(len), bgpHeader);
+                    return BgpNotificationMsgVer4.READER.readFrom(cb.readBytes(len), bgpHeader);
                 default:
-                    Validation.validateType(BGPErrorType.MESSAGE_HEADER_ERROR, BGPErrorType.BAD_MESSAGE_TYPE, type);
+                    Validation.validateType(BgpErrorType.MESSAGE_HEADER_ERROR, BgpErrorType.BAD_MESSAGE_TYPE, type);
                     return null;
                 }
             } catch (IndexOutOfBoundsException e) {
-                throw new BGPParseException(BGPErrorType.MESSAGE_HEADER_ERROR,
-                                            BGPErrorType.BAD_MESSAGE_LENGTH, null);
+                throw new BgpParseException(BgpErrorType.MESSAGE_HEADER_ERROR,
+                                            BgpErrorType.BAD_MESSAGE_LENGTH, null);
             }
         }
     }
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPNotificationMsgVer4.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpNotificationMsgVer4.java
similarity index 75%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPNotificationMsgVer4.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpNotificationMsgVer4.java
index bf9d575..d25db24 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPNotificationMsgVer4.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpNotificationMsgVer4.java
@@ -16,14 +16,14 @@
 package org.onosproject.bgpio.protocol.ver4;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPMessageReader;
-import org.onosproject.bgpio.protocol.BGPMessageWriter;
-import org.onosproject.bgpio.protocol.BGPNotificationMsg;
-import org.onosproject.bgpio.protocol.BGPType;
-import org.onosproject.bgpio.protocol.BGPVersion;
-import org.onosproject.bgpio.types.BGPErrorType;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpMessageReader;
+import org.onosproject.bgpio.protocol.BgpMessageWriter;
+import org.onosproject.bgpio.protocol.BgpNotificationMsg;
+import org.onosproject.bgpio.protocol.BgpType;
+import org.onosproject.bgpio.protocol.BgpVersion;
+import org.onosproject.bgpio.types.BgpErrorType;
+import org.onosproject.bgpio.types.BgpHeader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,7 +33,7 @@
  * A NOTIFICATION message is sent when an error condition is detected. The BGP connection is closed immediately after it
  * is sent.
  */
-class BGPNotificationMsgVer4 implements BGPNotificationMsg {
+class BgpNotificationMsgVer4 implements BgpNotificationMsg {
 
     /*
           0                   1                   2                   3
@@ -44,32 +44,32 @@
               REFERENCE : RFC 4271
     */
 
-    private static final Logger log = LoggerFactory.getLogger(BGPNotificationMsgVer4.class);
+    private static final Logger log = LoggerFactory.getLogger(BgpNotificationMsgVer4.class);
 
     static final byte PACKET_VERSION = 4;
     //BGPHeader(19) + Error code(1) + Error subcode(1)
     static final int TOTAL_MESSAGE_MIN_LENGTH = 21;
     static final int PACKET_MINIMUM_LENGTH = 2;
-    static final BGPType MSG_TYPE = BGPType.NOTIFICATION;
+    static final BgpType MSG_TYPE = BgpType.NOTIFICATION;
     static final byte DEFAULT_ERRORSUBCODE = 0;
     static final byte[] MARKER = {(byte) 0xff, (byte) 0xff, (byte) 0xff,
             (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
             (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
             (byte) 0xff, (byte) 0xff, (byte) 0xff };
     static final byte MESSAGE_TYPE = 3;
-    static final BGPHeader DEFAULT_MESSAGE_HEADER = new BGPHeader(MARKER, BGPHeader.DEFAULT_HEADER_LENGTH,
+    static final BgpHeader DEFAULT_MESSAGE_HEADER = new BgpHeader(MARKER, BgpHeader.DEFAULT_HEADER_LENGTH,
                                                                   MESSAGE_TYPE);
 
     private byte errorCode;
     private byte errorSubCode;
     private byte[] data;
-    private BGPHeader bgpHeader;
-    public static final BGPNotificationMsgVer4.Reader READER = new Reader();
+    private BgpHeader bgpHeader;
+    public static final BgpNotificationMsgVer4.Reader READER = new Reader();
 
     /**
      * Initialize fields.
      */
-    public BGPNotificationMsgVer4() {
+    public BgpNotificationMsgVer4() {
         this.bgpHeader = null;
         this.data = null;
         this.errorCode = 0;
@@ -84,7 +84,7 @@
      * @param errorSubCode error subcode
      * @param data field
      */
-    public BGPNotificationMsgVer4(BGPHeader bgpHeader, byte errorCode, byte errorSubCode, byte[] data) {
+    public BgpNotificationMsgVer4(BgpHeader bgpHeader, byte errorCode, byte errorSubCode, byte[] data) {
         this.bgpHeader = bgpHeader;
         this.data = data;
         this.errorCode = errorCode;
@@ -94,13 +94,13 @@
     /**
      * Reader reads BGP Notification Message from the channel buffer.
      */
-    static class Reader implements BGPMessageReader<BGPNotificationMsg> {
+    static class Reader implements BgpMessageReader<BgpNotificationMsg> {
         @Override
-        public BGPNotificationMsg readFrom(ChannelBuffer cb, BGPHeader bgpHeader) throws BGPParseException {
+        public BgpNotificationMsg readFrom(ChannelBuffer cb, BgpHeader bgpHeader) throws BgpParseException {
             byte errorCode;
             byte errorSubCode;
             if (cb.readableBytes() < PACKET_MINIMUM_LENGTH) {
-                throw new BGPParseException("Not enough readable bytes");
+                throw new BgpParseException("Not enough readable bytes");
             }
             errorCode = cb.readByte();
             errorSubCode = cb.readByte();
@@ -108,31 +108,31 @@
             int dataLength = bgpHeader.getLength() - TOTAL_MESSAGE_MIN_LENGTH;
             byte[] data = new byte[dataLength];
             cb.readBytes(data, 0, dataLength);
-            return new BGPNotificationMsgVer4(bgpHeader, errorCode, errorSubCode, data);
+            return new BgpNotificationMsgVer4(bgpHeader, errorCode, errorSubCode, data);
         }
     }
 
     /**
      * Builder class for BGP notification message.
      */
-    static class Builder implements BGPNotificationMsg.Builder {
+    static class Builder implements BgpNotificationMsg.Builder {
         private byte errorCode;
         private byte errorSubCode;
         private byte[] data;
-        private BGPHeader bgpHeader;
+        private BgpHeader bgpHeader;
         private boolean isErrorCodeSet = false;
         private boolean isErrorSubCodeSet = false;
         private boolean isBGPHeaderSet = false;
 
         @Override
-        public BGPNotificationMsg build() throws BGPParseException {
-            BGPHeader bgpHeader = this.isBGPHeaderSet ? this.bgpHeader : DEFAULT_MESSAGE_HEADER;
+        public BgpNotificationMsg build() throws BgpParseException {
+            BgpHeader bgpHeader = this.isBGPHeaderSet ? this.bgpHeader : DEFAULT_MESSAGE_HEADER;
             if (!this.isErrorCodeSet) {
-                throw new BGPParseException("Error code must be present");
+                throw new BgpParseException("Error code must be present");
             }
 
             byte errorSubCode = this.isErrorSubCodeSet ? this.errorSubCode : DEFAULT_ERRORSUBCODE;
-            return new BGPNotificationMsgVer4(bgpHeader, this.errorCode, errorSubCode, this.data);
+            return new BgpNotificationMsgVer4(bgpHeader, this.errorCode, errorSubCode, this.data);
         }
 
         @Override
@@ -158,24 +158,24 @@
         }
 
         @Override
-        public Builder setHeader(BGPHeader bgpMsgHeader) {
+        public Builder setHeader(BgpHeader bgpMsgHeader) {
             this.bgpHeader = bgpMsgHeader;
             return this;
         }
     }
 
     @Override
-    public BGPVersion getVersion() {
-        return BGPVersion.BGP_4;
+    public BgpVersion getVersion() {
+        return BgpVersion.BGP_4;
     }
 
     @Override
-    public BGPType getType() {
-        return BGPType.NOTIFICATION;
+    public BgpType getType() {
+        return BgpType.NOTIFICATION;
     }
 
     @Override
-    public void writeTo(ChannelBuffer cb) throws BGPParseException {
+    public void writeTo(ChannelBuffer cb) throws BgpParseException {
         WRITER.write(cb, this);
     }
 
@@ -184,13 +184,13 @@
     /**
      * Writer writes BGP notification message to channel buffer.
      */
-    static class Writer implements BGPMessageWriter<BGPNotificationMsgVer4> {
+    static class Writer implements BgpMessageWriter<BgpNotificationMsgVer4> {
         @Override
-        public void write(ChannelBuffer cb, BGPNotificationMsgVer4 message) throws BGPParseException {
+        public void write(ChannelBuffer cb, BgpNotificationMsgVer4 message) throws BgpParseException {
             int msgStartIndex = cb.writerIndex();
             int headerLenIndex = message.bgpHeader.write(cb);
             if (headerLenIndex <= 0) {
-                throw new BGPParseException(BGPErrorType.MESSAGE_HEADER_ERROR, (byte) 0, null);
+                throw new BgpParseException(BgpErrorType.MESSAGE_HEADER_ERROR, (byte) 0, null);
             }
             cb.writeByte(message.errorCode);
             cb.writeByte(message.errorSubCode);
@@ -246,7 +246,7 @@
     }
 
     @Override
-    public BGPHeader getHeader() {
+    public BgpHeader getHeader() {
         return this.bgpHeader;
     }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPOpenMsgVer4.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpOpenMsgVer4.java
similarity index 79%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPOpenMsgVer4.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpOpenMsgVer4.java
index fccbf5f..359eec2 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BGPOpenMsgVer4.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpOpenMsgVer4.java
@@ -19,15 +19,15 @@
 import java.util.ListIterator;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPMessageReader;
-import org.onosproject.bgpio.protocol.BGPMessageWriter;
-import org.onosproject.bgpio.protocol.BGPOpenMsg;
-import org.onosproject.bgpio.protocol.BGPType;
-import org.onosproject.bgpio.protocol.BGPVersion;
-import org.onosproject.bgpio.types.BGPErrorType;
-import org.onosproject.bgpio.types.BGPHeader;
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpMessageReader;
+import org.onosproject.bgpio.protocol.BgpMessageWriter;
+import org.onosproject.bgpio.protocol.BgpOpenMsg;
+import org.onosproject.bgpio.protocol.BgpType;
+import org.onosproject.bgpio.protocol.BgpVersion;
+import org.onosproject.bgpio.types.BgpErrorType;
+import org.onosproject.bgpio.types.BgpHeader;
+import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.types.FourOctetAsNumCapabilityTlv;
 import org.onosproject.bgpio.types.MultiProtocolExtnCapabilityTlv;
 import org.onosproject.bgpio.util.Validation;
@@ -39,7 +39,7 @@
 /**
  * Provides BGP open message.
  */
-public class BGPOpenMsgVer4 implements BGPOpenMsg {
+public class BgpOpenMsgVer4 implements BgpOpenMsg {
 
     /*
        0                   1                   2                   3
@@ -61,7 +61,7 @@
        REFERENCE : RFC 4271
     */
 
-    protected static final Logger log = LoggerFactory.getLogger(BGPOpenMsgVer4.class);
+    protected static final Logger log = LoggerFactory.getLogger(BgpOpenMsgVer4.class);
 
     public static final byte PACKET_VERSION = 4;
     public static final int OPEN_MSG_MINIMUM_LENGTH = 10;
@@ -70,7 +70,7 @@
     public static final int DEFAULT_HOLD_TIME = 120;
     public static final short AS_TRANS = 23456;
     public static final int OPT_PARA_TYPE_CAPABILITY = 2;
-    public static final BGPType MSG_TYPE = BGPType.OPEN;
+    public static final BgpType MSG_TYPE = BgpType.OPEN;
     public static final short AFI = 16388;
     public static final byte SAFI = 71;
     public static final byte RES = 0;
@@ -78,22 +78,22 @@
     public static final byte[] MARKER = new byte[]{(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
         (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
         (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};
-    public static final BGPHeader DEFAULT_OPEN_HEADER = new BGPHeader(MARKER,
+    public static final BgpHeader DEFAULT_OPEN_HEADER = new BgpHeader(MARKER,
         (short) OPEN_MSG_MINIMUM_LENGTH, (byte) 0X01);
-    private BGPHeader bgpMsgHeader;
+    private BgpHeader bgpMsgHeader;
     private byte version;
     private short asNumber;
     private short holdTime;
     private int bgpId;
     private boolean isLargeAsCapabilitySet;
-    private LinkedList<BGPValueType> capabilityTlv;
+    private LinkedList<BgpValueType> capabilityTlv;
 
-    public static final BGPOpenMsgVer4.Reader READER = new Reader();
+    public static final BgpOpenMsgVer4.Reader READER = new Reader();
 
     /**
      * reset variables.
      */
-    public BGPOpenMsgVer4() {
+    public BgpOpenMsgVer4() {
         this.bgpMsgHeader = null;
         this.version = 0;
         this.holdTime = 0;
@@ -112,8 +112,8 @@
      * @param bgpId BGP identifier in open message
      * @param capabilityTlv capabilities in open message
      */
-    public BGPOpenMsgVer4(BGPHeader bgpMsgHeader, byte version, short asNumber, short holdTime,
-             int bgpId, LinkedList<BGPValueType> capabilityTlv) {
+    public BgpOpenMsgVer4(BgpHeader bgpMsgHeader, byte version, short asNumber, short holdTime,
+             int bgpId, LinkedList<BgpValueType> capabilityTlv) {
         this.bgpMsgHeader = bgpMsgHeader;
         this.version = version;
         this.asNumber = asNumber;
@@ -123,17 +123,17 @@
     }
 
     @Override
-    public BGPHeader getHeader() {
+    public BgpHeader getHeader() {
         return this.bgpMsgHeader;
     }
 
     @Override
-    public BGPVersion getVersion() {
-        return BGPVersion.BGP_4;
+    public BgpVersion getVersion() {
+        return BgpVersion.BGP_4;
     }
 
     @Override
-    public BGPType getType() {
+    public BgpType getType() {
         return MSG_TYPE;
     }
 
@@ -153,17 +153,17 @@
     }
 
     @Override
-    public LinkedList<BGPValueType> getCapabilityTlv() {
+    public LinkedList<BgpValueType> getCapabilityTlv() {
         return this.capabilityTlv;
     }
 
     /**
      * Reader class for reading BGP open message from channel buffer.
      */
-    public static class Reader implements BGPMessageReader<BGPOpenMsg> {
+    public static class Reader implements BgpMessageReader<BgpOpenMsg> {
 
         @Override
-        public BGPOpenMsg readFrom(ChannelBuffer cb, BGPHeader bgpHeader) throws BGPParseException {
+        public BgpOpenMsg readFrom(ChannelBuffer cb, BgpHeader bgpHeader) throws BgpParseException {
 
             byte version;
             short holdTime;
@@ -172,11 +172,11 @@
             byte optParaLen = 0;
             byte optParaType;
             byte capParaLen = 0;
-            LinkedList<BGPValueType> capabilityTlv = new LinkedList<>();
+            LinkedList<BgpValueType> capabilityTlv = new LinkedList<>();
 
             if (cb.readableBytes() < OPEN_MSG_MINIMUM_LENGTH) {
                 log.error("[readFrom] Invalid length: Packet size is less than the minimum length ");
-                Validation.validateLen(BGPErrorType.OPEN_MESSAGE_ERROR, BGPErrorType.BAD_MESSAGE_LENGTH,
+                Validation.validateLen(BgpErrorType.OPEN_MESSAGE_ERROR, BgpErrorType.BAD_MESSAGE_LENGTH,
                         cb.readableBytes());
             }
 
@@ -184,8 +184,8 @@
             version = cb.readByte();
             if (version != PACKET_VERSION) {
                 log.error("[readFrom] Invalid version: " + version);
-                throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR,
-                        BGPErrorType.UNSUPPORTED_VERSION_NUMBER, null);
+                throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR,
+                        BgpErrorType.UNSUPPORTED_VERSION_NUMBER, null);
             }
 
             // Read AS number
@@ -209,7 +209,7 @@
                 capParaLen = cb.readByte();
 
                 if (cb.readableBytes() < capParaLen) {
-                    throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR, (byte) 0, null);
+                    throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR, (byte) 0, null);
                 }
 
                 ChannelBuffer capaCb = cb.readBytes(capParaLen);
@@ -218,11 +218,11 @@
                 if ((optParaType == OPT_PARA_TYPE_CAPABILITY) && (capParaLen != 0)) {
                     capabilityTlv = parseCapabilityTlv(capaCb);
                 } else {
-                    throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR,
-                        BGPErrorType.UNSUPPORTED_OPTIONAL_PARAMETER, null);
+                    throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR,
+                        BgpErrorType.UNSUPPORTED_OPTIONAL_PARAMETER, null);
                 }
             }
-            return new BGPOpenMsgVer4(bgpHeader, version, asNumber, holdTime, bgpId, capabilityTlv);
+            return new BgpOpenMsgVer4(bgpHeader, version, asNumber, holdTime, bgpId, capabilityTlv);
         }
     }
 
@@ -231,14 +231,14 @@
      *
      * @param cb of type channel buffer
      * @return capabilityTlv of open message
-     * @throws BGPParseException while parsing capabilities
+     * @throws BgpParseException while parsing capabilities
      */
-    protected static LinkedList<BGPValueType> parseCapabilityTlv(ChannelBuffer cb) throws BGPParseException {
+    protected static LinkedList<BgpValueType> parseCapabilityTlv(ChannelBuffer cb) throws BgpParseException {
 
-        LinkedList<BGPValueType> capabilityTlv = new LinkedList<>();
+        LinkedList<BgpValueType> capabilityTlv = new LinkedList<>();
 
         while (cb.readableBytes() > 0) {
-            BGPValueType tlv;
+            BgpValueType tlv;
             short type = cb.readByte();
             short length = cb.readByte();
 
@@ -246,10 +246,10 @@
             case FourOctetAsNumCapabilityTlv.TYPE:
                 log.debug("FourOctetAsNumCapabilityTlv");
                 if (FourOctetAsNumCapabilityTlv.LENGTH != length) {
-                    throw new BGPParseException("Invalid length received for FourOctetAsNumCapabilityTlv.");
+                    throw new BgpParseException("Invalid length received for FourOctetAsNumCapabilityTlv.");
                 }
                 if (length > cb.readableBytes()) {
-                    throw new BGPParseException("Four octet as num tlv length"
+                    throw new BgpParseException("Four octet as num tlv length"
                             + " is more than readableBytes.");
                 }
                 int as4Num = cb.readInt();
@@ -258,10 +258,10 @@
             case MultiProtocolExtnCapabilityTlv.TYPE:
                 log.debug("MultiProtocolExtnCapabilityTlv");
                 if (MultiProtocolExtnCapabilityTlv.LENGTH != length) {
-                    throw new BGPParseException("Invalid length received for MultiProtocolExtnCapabilityTlv.");
+                    throw new BgpParseException("Invalid length received for MultiProtocolExtnCapabilityTlv.");
                 }
                 if (length > cb.readableBytes()) {
-                    throw new BGPParseException("BGP LS tlv length is more than readableBytes.");
+                    throw new BgpParseException("BGP LS tlv length is more than readableBytes.");
                 }
                 short afi = cb.readShort();
                 byte res = cb.readByte();
@@ -281,10 +281,10 @@
     /**
      * Builder class for BGP open message.
      */
-    static class Builder implements BGPOpenMsg.Builder {
+    static class Builder implements BgpOpenMsg.Builder {
 
         private boolean isHeaderSet = false;
-        private BGPHeader bgpMsgHeader;
+        private BgpHeader bgpMsgHeader;
         private boolean isHoldTimeSet = false;
         private short holdTime;
         private boolean isAsNumSet = false;
@@ -294,40 +294,40 @@
         private boolean isLargeAsCapabilityTlvSet = false;
         private boolean isLsCapabilityTlvSet = false;
 
-        LinkedList<BGPValueType> capabilityTlv = new LinkedList<>();
+        LinkedList<BgpValueType> capabilityTlv = new LinkedList<>();
 
         @Override
-        public BGPOpenMsg build() throws BGPParseException {
-            BGPHeader bgpMsgHeader = this.isHeaderSet ? this.bgpMsgHeader : DEFAULT_OPEN_HEADER;
+        public BgpOpenMsg build() throws BgpParseException {
+            BgpHeader bgpMsgHeader = this.isHeaderSet ? this.bgpMsgHeader : DEFAULT_OPEN_HEADER;
             short holdTime = this.isHoldTimeSet ? this.holdTime : DEFAULT_HOLD_TIME;
 
             if (!this.isAsNumSet) {
-                throw new BGPParseException("BGP AS number is not set (mandatory)");
+                throw new BgpParseException("BGP AS number is not set (mandatory)");
             }
 
             if (!this.isBgpIdSet) {
-                throw new BGPParseException("BGPID  is not set (mandatory)");
+                throw new BgpParseException("BGPID  is not set (mandatory)");
             }
 
             if (this.isLargeAsCapabilityTlvSet) {
-                BGPValueType tlv;
+                BgpValueType tlv;
                 int value = this.asNumber;
                 tlv = new FourOctetAsNumCapabilityTlv(value);
                 this.capabilityTlv.add(tlv);
             }
 
             if (this.isLsCapabilityTlvSet) {
-                BGPValueType tlv;
+                BgpValueType tlv;
                 tlv = new MultiProtocolExtnCapabilityTlv(AFI, RES, SAFI);
                 this.capabilityTlv.add(tlv);
             }
 
-            return new BGPOpenMsgVer4(bgpMsgHeader, PACKET_VERSION, this.asNumber, holdTime, this.bgpId,
+            return new BgpOpenMsgVer4(bgpMsgHeader, PACKET_VERSION, this.asNumber, holdTime, this.bgpId,
                        this.capabilityTlv);
         }
 
         @Override
-        public Builder setHeader(BGPHeader bgpMsgHeader) {
+        public Builder setHeader(BgpHeader bgpMsgHeader) {
             this.bgpMsgHeader = bgpMsgHeader;
             return this;
         }
@@ -354,7 +354,7 @@
         }
 
         @Override
-        public Builder setCapabilityTlv(LinkedList<BGPValueType> capabilityTlv) {
+        public Builder setCapabilityTlv(LinkedList<BgpValueType> capabilityTlv) {
             this.capabilityTlv = capabilityTlv;
             return this;
         }
@@ -376,7 +376,7 @@
     public void writeTo(ChannelBuffer cb) {
         try {
             WRITER.write(cb, this);
-        } catch (BGPParseException e) {
+        } catch (BgpParseException e) {
             log.debug("[writeTo] Error: " + e.toString());
         }
     }
@@ -386,10 +386,10 @@
     /**
      * Writer class for writing BGP open message to channel buffer.
      */
-    public static class Writer implements BGPMessageWriter<BGPOpenMsgVer4> {
+    public static class Writer implements BgpMessageWriter<BgpOpenMsgVer4> {
 
         @Override
-        public void write(ChannelBuffer cb, BGPOpenMsgVer4 message) throws BGPParseException {
+        public void write(ChannelBuffer cb, BgpOpenMsgVer4 message) throws BgpParseException {
 
             int optParaLen = 0;
             int as4num = 0;
@@ -400,7 +400,7 @@
             int msgLenIndex = message.bgpMsgHeader.write(cb);
 
             if (msgLenIndex <= 0) {
-                throw new BGPParseException("Unable to write message header.");
+                throw new BgpParseException("Unable to write message header.");
             }
 
             // write version in 1-octet
@@ -408,13 +408,13 @@
 
             // get as4num if LS Capability is set
             if (message.isLargeAsCapabilitySet) {
-                LinkedList<BGPValueType> capabilityTlv = message
+                LinkedList<BgpValueType> capabilityTlv = message
                         .getCapabilityTlv();
-                ListIterator<BGPValueType> listIterator = capabilityTlv
+                ListIterator<BgpValueType> listIterator = capabilityTlv
                         .listIterator();
 
                 while (listIterator.hasNext()) {
-                    BGPValueType tlv = listIterator.next();
+                    BgpValueType tlv = listIterator.next();
                     if (tlv.getType() == FOUR_OCTET_AS_NUM_CAPA_TYPE) {
                         as4num = ((FourOctetAsNumCapabilityTlv) tlv).getInt();
                         break;
@@ -464,13 +464,13 @@
      * @param message of type BGPOpenMsgVer4
      * @return capParaLen of open message
      */
-    protected int packCapabilityTlv(ChannelBuffer cb, BGPOpenMsgVer4 message) {
+    protected int packCapabilityTlv(ChannelBuffer cb, BgpOpenMsgVer4 message) {
         int startIndex = cb.writerIndex();
         int capParaLen = 0;
         int capParaLenIndex = 0;
 
-        LinkedList<BGPValueType> capabilityTlv = message.capabilityTlv;
-        ListIterator<BGPValueType> listIterator = capabilityTlv.listIterator();
+        LinkedList<BgpValueType> capabilityTlv = message.capabilityTlv;
+        ListIterator<BgpValueType> listIterator = capabilityTlv.listIterator();
 
         if (listIterator.hasNext()) {
             // Set optional parameter type as 2
@@ -487,7 +487,7 @@
         }
 
         while (listIterator.hasNext()) {
-            BGPValueType tlv = listIterator.next();
+            BgpValueType tlv = listIterator.next();
             if (tlv == null) {
                 log.debug("Warning: tlv is null from CapabilityTlv list");
                 continue;
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpPathAttributes.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpPathAttributes.java
index 20a7ba0..9ffddf6 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpPathAttributes.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpPathAttributes.java
@@ -19,11 +19,11 @@
 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.types.As4Path;
 import org.onosproject.bgpio.types.AsPath;
-import org.onosproject.bgpio.types.BGPErrorType;
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgpio.types.BgpErrorType;
+import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.types.LocalPref;
 import org.onosproject.bgpio.types.Med;
 import org.onosproject.bgpio.types.NextHop;
@@ -58,7 +58,7 @@
     public static final int MPREACHNLRI_TYPE = 14;
     public static final int MPUNREACHNLRI_TYPE = 15;
 
-    private final List<BGPValueType> pathAttribute;
+    private final List<BgpValueType> pathAttribute;
 
     /**
      * Initialize parameter.
@@ -72,7 +72,7 @@
      *
      * @param pathAttribute list of path attributes
      */
-    public BgpPathAttributes(List<BGPValueType> pathAttribute) {
+    public BgpPathAttributes(List<BgpValueType> pathAttribute) {
         this.pathAttribute = pathAttribute;
     }
 
@@ -81,7 +81,7 @@
      *
      * @return list of path attributes
      */
-    public List<BGPValueType> pathAttributes() {
+    public List<BgpValueType> pathAttributes() {
         return this.pathAttribute;
     }
 
@@ -90,13 +90,13 @@
      *
      * @param cb channelBuffer
      * @return object of BgpPathAttributes
-     * @throws BGPParseException while parsing BGP path attributes
+     * @throws BgpParseException while parsing BGP path attributes
      */
     public static BgpPathAttributes read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
 
-        BGPValueType pathAttribute = null;
-        List<BGPValueType> pathAttributeList = new LinkedList<>();
+        BgpValueType pathAttribute = null;
+        List<BgpValueType> pathAttributeList = new LinkedList<>();
         boolean isOrigin = false;
         boolean isAsPath = false;
         boolean isNextHop = false;
@@ -161,27 +161,27 @@
      * @param isNextHop say whether nexthop attribute is present
      * @param isMpReach say whether mpreach attribute is present
      * @param isMpUnReach say whether mpunreach attribute is present
-     * @throws BGPParseException if mandatory path attribute is not present
+     * @throws BgpParseException if mandatory path attribute is not present
      */
     public static void checkMandatoryAttr(boolean isOrigin, boolean isAsPath,
             boolean isNextHop, boolean isMpReach, boolean isMpUnReach)
-            throws BGPParseException {
+            throws BgpParseException {
         if (!isOrigin) {
             log.debug("Mandatory Attributes not Present");
-            Validation.validateType(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                    BGPErrorType.MISSING_WELLKNOWN_ATTRIBUTE,
+            Validation.validateType(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                    BgpErrorType.MISSING_WELLKNOWN_ATTRIBUTE,
                     Origin.ORIGIN_TYPE);
         }
         if (!isAsPath) {
             log.debug("Mandatory Attributes not Present");
-            Validation.validateType(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                    BGPErrorType.MISSING_WELLKNOWN_ATTRIBUTE,
+            Validation.validateType(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                    BgpErrorType.MISSING_WELLKNOWN_ATTRIBUTE,
                     AsPath.ASPATH_TYPE);
         }
         if (!isMpUnReach && !isMpReach && !isNextHop) {
             log.debug("Mandatory Attributes not Present");
-            Validation.validateType(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                    BGPErrorType.MISSING_WELLKNOWN_ATTRIBUTE,
+            Validation.validateType(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                    BgpErrorType.MISSING_WELLKNOWN_ATTRIBUTE,
                     NextHop.NEXTHOP_TYPE);
         }
     }
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpUpdateMsgVer4.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpUpdateMsgVer4.java
index 9f4cf9b..4d6af59 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpUpdateMsgVer4.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpUpdateMsgVer4.java
@@ -20,14 +20,14 @@
 
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onlab.packet.IpPrefix;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPMessageReader;
-import org.onosproject.bgpio.protocol.BGPType;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpMessageReader;
+import org.onosproject.bgpio.protocol.BgpType;
 import org.onosproject.bgpio.protocol.BgpUpdateMsg;
-import org.onosproject.bgpio.types.BGPErrorType;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.types.BgpErrorType;
+import org.onosproject.bgpio.types.BgpHeader;
 import org.onosproject.bgpio.util.Validation;
-import org.onosproject.bgpio.protocol.BGPVersion;
+import org.onosproject.bgpio.protocol.BgpVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -75,12 +75,12 @@
     public static final int BYTE_IN_BITS = 8;
     public static final int MIN_LEN_AFTER_WITHDRW_ROUTES = 2;
     public static final int MINIMUM_COMMON_HEADER_LENGTH = 19;
-    public static final BGPType MSG_TYPE = BGPType.UPDATE;
+    public static final BgpType MSG_TYPE = BgpType.UPDATE;
     public static final BgpUpdateMsgVer4.Reader READER = new Reader();
 
     private List<IpPrefix> withdrawnRoutes;
     private BgpPathAttributes bgpPathAttributes;
-    private BGPHeader bgpHeader;
+    private BgpHeader bgpHeader;
     private List<IpPrefix> nlri;
 
     /**
@@ -91,7 +91,7 @@
      * @param bgpPathAttributes BGP Path attributes
      * @param nlri Network Layer Reachability Information
      */
-    public BgpUpdateMsgVer4(BGPHeader bgpHeader, List<IpPrefix> withdrawnRoutes,
+    public BgpUpdateMsgVer4(BgpHeader bgpHeader, List<IpPrefix> withdrawnRoutes,
                      BgpPathAttributes bgpPathAttributes, List<IpPrefix> nlri) {
         this.bgpHeader = bgpHeader;
         this.withdrawnRoutes = withdrawnRoutes;
@@ -102,15 +102,15 @@
     /**
      * Reader reads BGP Update Message from the channel buffer.
      */
-    static class Reader implements BGPMessageReader<BgpUpdateMsg> {
+    static class Reader implements BgpMessageReader<BgpUpdateMsg> {
 
         @Override
-        public BgpUpdateMsg readFrom(ChannelBuffer cb, BGPHeader bgpHeader)
-                throws BGPParseException {
+        public BgpUpdateMsg readFrom(ChannelBuffer cb, BgpHeader bgpHeader)
+                throws BgpParseException {
 
             if (cb.readableBytes() != (bgpHeader.getLength() - MINIMUM_COMMON_HEADER_LENGTH)) {
-                Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                        BGPErrorType.BAD_MESSAGE_LENGTH, bgpHeader.getLength());
+                Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                        BgpErrorType.BAD_MESSAGE_LENGTH, bgpHeader.getLength());
             }
 
             LinkedList<IpPrefix> withDrwRoutes = new LinkedList<>();
@@ -120,8 +120,8 @@
             Short withDrwLen = cb.readShort();
 
             if (cb.readableBytes() < withDrwLen) {
-                Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                        BGPErrorType.MALFORMED_ATTRIBUTE_LIST,
+                Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                        BgpErrorType.MALFORMED_ATTRIBUTE_LIST,
                         cb.readableBytes());
             }
             ChannelBuffer tempCb = cb.readBytes(withDrwLen);
@@ -131,23 +131,23 @@
             }
             if (cb.readableBytes() < MIN_LEN_AFTER_WITHDRW_ROUTES) {
                 log.debug("Bgp Path Attribute len field not present");
-                throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                        BGPErrorType.MALFORMED_ATTRIBUTE_LIST, null);
+                throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                        BgpErrorType.MALFORMED_ATTRIBUTE_LIST, null);
             }
 
             // Reading Total Path Attribute Length
             short totPathAttrLen = cb.readShort();
             int len = withDrwLen + totPathAttrLen + PACKET_MINIMUM_LENGTH;
             if (len > bgpHeader.getLength()) {
-                throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                        BGPErrorType.MALFORMED_ATTRIBUTE_LIST, null);
+                throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                        BgpErrorType.MALFORMED_ATTRIBUTE_LIST, null);
             }
             if (totPathAttrLen != 0) {
                 // Parsing BGPPathAttributes
                 if (cb.readableBytes() < totPathAttrLen) {
                     Validation
-                            .validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                         BGPErrorType.MALFORMED_ATTRIBUTE_LIST,
+                            .validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                         BgpErrorType.MALFORMED_ATTRIBUTE_LIST,
                                          cb.readableBytes());
                 }
                 tempCb = cb.readBytes(totPathAttrLen);
@@ -167,10 +167,10 @@
      *
      * @param cb channelBuffer
      * @return list of IP Prefix
-     * @throws BGPParseException while parsing NLRI
+     * @throws BgpParseException while parsing NLRI
      */
     public static LinkedList<IpPrefix> parseNlri(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         LinkedList<IpPrefix> nlri = new LinkedList<>();
         while (cb.readableBytes() > 0) {
             int length = cb.readByte();
@@ -186,8 +186,8 @@
                     len = len + 1;
                 }
                 if (cb.readableBytes() < len) {
-                    Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                            BGPErrorType.MALFORMED_ATTRIBUTE_LIST,
+                    Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                            BgpErrorType.MALFORMED_ATTRIBUTE_LIST,
                             cb.readableBytes());
                 }
                 byte[] prefix = new byte[len];
@@ -204,10 +204,10 @@
      *
      * @param cb channelBuffer
      * @return list of IP prefix
-     * @throws BGPParseException while parsing withdrawn routes
+     * @throws BgpParseException while parsing withdrawn routes
      */
     public static LinkedList<IpPrefix> parseWithdrawnRoutes(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         LinkedList<IpPrefix> withDrwRoutes = new LinkedList<>();
         while (cb.readableBytes() > 0) {
             int length = cb.readByte();
@@ -224,8 +224,8 @@
                 }
                 if (cb.readableBytes() < len) {
                     Validation
-                            .validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                         BGPErrorType.MALFORMED_ATTRIBUTE_LIST,
+                            .validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                         BgpErrorType.MALFORMED_ATTRIBUTE_LIST,
                                          cb.readableBytes());
                 }
                 byte[] prefix = new byte[len];
@@ -238,17 +238,17 @@
     }
 
     @Override
-    public BGPVersion getVersion() {
-        return BGPVersion.BGP_4;
+    public BgpVersion getVersion() {
+        return BgpVersion.BGP_4;
     }
 
     @Override
-    public BGPType getType() {
-        return BGPType.UPDATE;
+    public BgpType getType() {
+        return BgpType.UPDATE;
     }
 
     @Override
-    public void writeTo(ChannelBuffer channelBuffer) throws BGPParseException {
+    public void writeTo(ChannelBuffer channelBuffer) throws BgpParseException {
         //Not to be implemented as of now
     }
 
@@ -268,7 +268,7 @@
     }
 
     @Override
-    public BGPHeader getHeader() {
+    public BgpHeader getHeader() {
         return this.bgpHeader;
     }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/AreaIDTlv.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/AreaIDTlv.java
index 52bae46..7b5cabe 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/AreaIDTlv.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/AreaIDTlv.java
@@ -26,7 +26,7 @@
 /**
  * Provides AreaID Tlv which contains opaque value (32 Bit Area-ID).
  */
-public class AreaIDTlv implements BGPValueType {
+public class AreaIDTlv implements BgpValueType {
 
     /* Reference :draft-ietf-idr-ls-distribution-11
      *  0                   1                   2                   3
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/As4Path.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/As4Path.java
index e9df399..c4409f4 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/As4Path.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/As4Path.java
@@ -20,7 +20,7 @@
 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.util.Constants;
 import org.onosproject.bgpio.util.Validation;
 import org.slf4j.Logger;
@@ -31,7 +31,7 @@
 /**
  * Provides Implementation of As4Path BGP Path Attribute.
  */
-public class As4Path implements BGPValueType {
+public class As4Path implements BgpValueType {
     private static final Logger log = LoggerFactory.getLogger(AsPath.class);
     public static final byte AS4PATH_TYPE = 17;
     public static final byte ASNUM_SIZE = 4;
@@ -63,16 +63,16 @@
      *
      * @param cb ChannelBuffer
      * @return object of As4Path
-     * @throws BGPParseException while parsing As4Path
+     * @throws BgpParseException while parsing As4Path
      */
-    public static As4Path read(ChannelBuffer cb) throws BGPParseException {
+    public static As4Path read(ChannelBuffer cb) throws BgpParseException {
         List<Integer> as4pathSet = new ArrayList<>();
         List<Integer> as4pathSeq = new ArrayList<>();
         ChannelBuffer tempCb = cb.copy();
         Validation validation = Validation.parseAttributeHeader(cb);
 
         if (cb.readableBytes() < validation.getLength()) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                     validation.getLength());
         }
         //if fourth bit is set length is read as short otherwise as byte , len includes type, length and value
@@ -80,7 +80,7 @@
                 .getLength() + Constants.TYPE_AND_LEN_AS_BYTE;
         ChannelBuffer data = tempCb.readBytes(len);
         if (validation.getFirstBit() && !validation.getSecondBit() && validation.getThirdBit()) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.ATTRIBUTE_FLAGS_ERROR, data);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_FLAGS_ERROR, data);
         }
 
         ChannelBuffer tempBuf = cb.readBytes(validation.getLength());
@@ -91,8 +91,8 @@
             //length = no of Ases * ASnum size (4 bytes)
             int length = pathSegLen * ASNUM_SIZE;
             if (tempBuf.readableBytes() < length) {
-                Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                        BGPErrorType.ATTRIBUTE_LENGTH_ERROR, length);
+                Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                        BgpErrorType.ATTRIBUTE_LENGTH_ERROR, length);
             }
             ChannelBuffer aspathBuf = tempBuf.readBytes(length);
             while (aspathBuf.readableBytes() > 0) {
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/AsPath.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/AsPath.java
index e3eb2c5..ef63647 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/AsPath.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/AsPath.java
@@ -21,7 +21,7 @@
 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.util.Constants;
 import org.onosproject.bgpio.util.Validation;
 import org.slf4j.Logger;
@@ -32,7 +32,7 @@
 /**
  * Provides Implementation of AsPath mandatory BGP Path Attribute.
  */
-public class AsPath implements BGPValueType {
+public class AsPath implements BgpValueType {
     /**
      * Enum to provide AS types.
      */
@@ -94,16 +94,16 @@
      *
      * @param cb ChannelBuffer
      * @return object of AsPath
-     * @throws BGPParseException while parsing AsPath
+     * @throws BgpParseException while parsing AsPath
      */
-    public static AsPath read(ChannelBuffer cb) throws BGPParseException {
+    public static AsPath read(ChannelBuffer cb) throws BgpParseException {
         List<Short> aspathSet = new ArrayList<>();
         List<Short> aspathSeq = new ArrayList<>();
         ChannelBuffer tempCb = cb.copy();
         Validation validation = Validation.parseAttributeHeader(cb);
 
         if (cb.readableBytes() < validation.getLength()) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                     validation.getLength());
         }
         //if fourth bit is set, length is read as short otherwise as byte , len includes type, length and value
@@ -111,7 +111,7 @@
                 .getLength() + Constants.TYPE_AND_LEN_AS_BYTE;
         ChannelBuffer data = tempCb.readBytes(len);
         if (validation.getFirstBit() && !validation.getSecondBit() && validation.getThirdBit()) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.ATTRIBUTE_FLAGS_ERROR, data);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_FLAGS_ERROR, data);
         }
 
         ChannelBuffer tempBuf = cb.readBytes(validation.getLength());
@@ -121,8 +121,8 @@
             byte pathSegLen = tempBuf.readByte();
             int length = pathSegLen * ASNUM_SIZE;
             if (tempBuf.readableBytes() < length) {
-                Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                        BGPErrorType.ATTRIBUTE_LENGTH_ERROR, length);
+                Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                        BgpErrorType.ATTRIBUTE_LENGTH_ERROR, length);
             }
             ChannelBuffer aspathBuf = tempBuf.readBytes(length);
             while (aspathBuf.readableBytes() > 0) {
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/AutonomousSystemTlv.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/AutonomousSystemTlv.java
index 5d8a919..def2c3f 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/AutonomousSystemTlv.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/AutonomousSystemTlv.java
@@ -26,7 +26,7 @@
 /**
  * Provides Autonomous System Tlv which contains opaque value (32 Bit AS Number).
  */
-public class AutonomousSystemTlv implements BGPValueType {
+public class AutonomousSystemTlv implements BgpValueType {
 
     /* Reference :draft-ietf-idr-ls-distribution-11
      *  0                   1                   2                   3
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BGPErrorType.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpErrorType.java
similarity index 97%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BGPErrorType.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpErrorType.java
index dfcfc9d..c0932eb 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BGPErrorType.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpErrorType.java
@@ -19,8 +19,8 @@
 /**
  * BgpErrorType class defines all errorCodes and error Subcodes required for Notification message.
  */
-public final class BGPErrorType {
-    private BGPErrorType() {
+public final class BgpErrorType {
+    private BgpErrorType() {
     }
 
     //Error Codes
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BGPHeader.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpHeader.java
similarity index 94%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BGPHeader.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpHeader.java
index 6acda0d..ad63775 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BGPHeader.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpHeader.java
@@ -23,7 +23,7 @@
  * Provides BGP Message Header which is common for all the Messages.
  */
 
-public class BGPHeader {
+public class BgpHeader {
 
     /*      0                   1                   2                   3
           0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
@@ -40,7 +40,7 @@
           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     */
 
-    protected static final Logger log = LoggerFactory.getLogger(BGPHeader.class);
+    protected static final Logger log = LoggerFactory.getLogger(BgpHeader.class);
 
     public static final int MARKER_LENGTH = 16;
     public static final short DEFAULT_HEADER_LENGTH = 19;
@@ -52,7 +52,7 @@
     /**
      * Reset fields.
      */
-    public BGPHeader() {
+    public BgpHeader() {
         this.marker = null;
         this.length = 0;
         this.type = 0;
@@ -65,7 +65,7 @@
      * @param length message length
      * @param type message type
      */
-    public BGPHeader(byte[] marker, short length, byte type) {
+    public BgpHeader(byte[] marker, short length, byte type) {
         this.marker = marker;
         this.length = length;
         this.type = type;
@@ -148,7 +148,7 @@
      * @param cb ChannelBuffer
      * @return object of BGPHeader
      */
-    public static BGPHeader read(ChannelBuffer cb) {
+    public static BgpHeader read(ChannelBuffer cb) {
 
         byte[] marker = new byte[MARKER_LENGTH];
         byte type;
@@ -156,6 +156,6 @@
         cb.readBytes(marker, 0, MARKER_LENGTH);
         length = cb.readShort();
         type = cb.readByte();
-        return new BGPHeader(marker, length, type);
+        return new BgpHeader(marker, length, type);
     }
 }
\ No newline at end of file
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BGPLSIdentifierTlv.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpLSIdentifierTlv.java
similarity index 81%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BGPLSIdentifierTlv.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpLSIdentifierTlv.java
index f723d2c..e0964ac 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BGPLSIdentifierTlv.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpLSIdentifierTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides BGPLSIdentifier Tlv which contains opaque value (32 Bit BGPLS-Identifier).
  */
-public class BGPLSIdentifierTlv implements BGPValueType {
+public class BgpLSIdentifierTlv implements BgpValueType {
 
     /* Reference :draft-ietf-idr-ls-distribution-11
      *  0                   1                   2                   3
@@ -39,7 +39,7 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(BGPLSIdentifierTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(BgpLSIdentifierTlv.class);
 
     public static final short TYPE = 513;
     public static final short LENGTH = 4;
@@ -49,26 +49,26 @@
     /**
      * Constructor to initialize bgpLSIdentifier.
      *
-     * @param bgpLSIdentifier BgpLS-Identifier
+     * @param bgpLSIdentifier BGPLS-Identifier
      */
-    public BGPLSIdentifierTlv(int bgpLSIdentifier) {
+    public BgpLSIdentifierTlv(int bgpLSIdentifier) {
         this.bgpLSIdentifier = bgpLSIdentifier;
     }
 
     /**
      * Returns object of this class with specified rbgpLSIdentifier.
      *
-     * @param bgpLSIdentifier BgpLS-Identifier
-     * @return BgpLS-Identifier
+     * @param bgpLSIdentifier BGPLS-Identifier
+     * @return BGPLS-Identifier
      */
-    public static BGPLSIdentifierTlv of(final int bgpLSIdentifier) {
-        return new BGPLSIdentifierTlv(bgpLSIdentifier);
+    public static BgpLSIdentifierTlv of(final int bgpLSIdentifier) {
+        return new BgpLSIdentifierTlv(bgpLSIdentifier);
     }
 
     /**
-     * Returns opaque value of BgpLS-Identifier.
+     * Returns opaque value of BGPLS-Identifier.
      *
-     * @return opaque value of BgpLS-Identifier
+     * @return opaque value of BGPLS-Identifier
      */
     public int getBgpLSIdentifier() {
         return bgpLSIdentifier;
@@ -85,8 +85,8 @@
             return true;
         }
 
-        if (obj instanceof BGPLSIdentifierTlv) {
-            BGPLSIdentifierTlv other = (BGPLSIdentifierTlv) obj;
+        if (obj instanceof BgpLSIdentifierTlv) {
+            BgpLSIdentifierTlv other = (BgpLSIdentifierTlv) obj;
             return Objects.equals(bgpLSIdentifier, other.bgpLSIdentifier);
         }
         return false;
@@ -107,8 +107,8 @@
      * @param cb ChannelBuffer
      * @return object of BGPLSIdentifierTlv
      */
-    public static BGPLSIdentifierTlv read(ChannelBuffer cb) {
-        return BGPLSIdentifierTlv.of(cb.readInt());
+    public static BgpLSIdentifierTlv read(ChannelBuffer cb) {
+        return BgpLSIdentifierTlv.of(cb.readInt());
     }
 
     @Override
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BGPValueType.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpValueType.java
similarity index 97%
rename from bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BGPValueType.java
rename to bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpValueType.java
index 54a8b43..fbf53b3 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BGPValueType.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpValueType.java
@@ -21,7 +21,7 @@
 /**
  * Abstraction which Provides the BGP of TLV format.
  */
-public interface BGPValueType {
+public interface BgpValueType {
     /**
      * Returns the Type of BGP Message.
      *
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/FourOctetAsNumCapabilityTlv.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/FourOctetAsNumCapabilityTlv.java
index 6157028..392dba2 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/FourOctetAsNumCapabilityTlv.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/FourOctetAsNumCapabilityTlv.java
@@ -26,7 +26,7 @@
 /**
  * Provides FourOctetAsNumCapabilityTlv Capability Tlv.
  */
-public class FourOctetAsNumCapabilityTlv implements BGPValueType {
+public class FourOctetAsNumCapabilityTlv implements BgpValueType {
 
     /**
      * support to indicate its support for four-octet AS numbers -CAPABILITY TLV format.
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IPReachabilityInformationTlv.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IPReachabilityInformationTlv.java
index 59afbed..80f02ce 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IPReachabilityInformationTlv.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IPReachabilityInformationTlv.java
@@ -29,7 +29,7 @@
 /**
  * Provides IP Reachability InformationTlv Tlv which contains IP Prefix.
  */
-public class IPReachabilityInformationTlv implements BGPValueType {
+public class IPReachabilityInformationTlv implements BgpValueType {
 
     /*
      * Reference :draft-ietf-idr-ls-distribution-11
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IPv4AddressTlv.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IPv4AddressTlv.java
index 2fd3670..d83bb1f 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IPv4AddressTlv.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IPv4AddressTlv.java
@@ -20,7 +20,7 @@
 
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onlab.packet.Ip4Address;
-import org.onosproject.bgpio.exceptions.BGPParseException;
+import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.onosproject.bgpio.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,7 +31,7 @@
 /**
  * Provides Implementation of IPv4AddressTlv.
  */
-public class IPv4AddressTlv implements BGPValueType {
+public class IPv4AddressTlv implements BgpValueType {
     private static final Logger log = LoggerFactory.getLogger(IPv4AddressTlv.class);
     private static final int LENGTH = 4;
 
@@ -95,12 +95,12 @@
      * @param cb channelBuffer
      * @param type address type
      * @return object of IPv4AddressTlv
-     * @throws BGPParseException while parsing IPv4AddressTlv
+     * @throws BgpParseException while parsing IPv4AddressTlv
      */
-    public static IPv4AddressTlv read(ChannelBuffer cb, short type) throws BGPParseException {
+    public static IPv4AddressTlv read(ChannelBuffer cb, short type) throws BgpParseException {
         InetAddress ipAddress = Validation.toInetAddress(LENGTH, cb);
         if (ipAddress.isMulticastAddress()) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, (byte) 0, null);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, (byte) 0, null);
         }
         Ip4Address address = Ip4Address.valueOf(ipAddress);
         return IPv4AddressTlv.of(address, type);
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IPv6AddressTlv.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IPv6AddressTlv.java
index 7bc7518..a87825f 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IPv6AddressTlv.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IPv6AddressTlv.java
@@ -20,7 +20,7 @@
 
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onlab.packet.Ip6Address;
-import org.onosproject.bgpio.exceptions.BGPParseException;
+import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.onosproject.bgpio.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,7 +31,7 @@
 /**
  * Provides Implementation of IPv6AddressTlv.
  */
-public class IPv6AddressTlv implements BGPValueType {
+public class IPv6AddressTlv implements BgpValueType {
     private static final Logger log = LoggerFactory.getLogger(IPv6AddressTlv.class);
     private static final int LENGTH = 16;
 
@@ -95,12 +95,12 @@
      * @param cb channelBuffer
      * @param type address type
      * @return object of IPv6AddressTlv
-     * @throws BGPParseException while parsing IPv6AddressTlv
+     * @throws BgpParseException while parsing IPv6AddressTlv
      */
-    public static IPv6AddressTlv read(ChannelBuffer cb, short type) throws BGPParseException {
+    public static IPv6AddressTlv read(ChannelBuffer cb, short type) throws BgpParseException {
         InetAddress ipAddress = Validation.toInetAddress(LENGTH, cb);
         if (ipAddress.isMulticastAddress()) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, (byte) 0, null);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, (byte) 0, null);
         }
         Ip6Address address = Ip6Address.valueOf(ipAddress);
         return IPv6AddressTlv.of(address, type);
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IsIsNonPseudonode.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IsIsNonPseudonode.java
index 8410157..e6b9d60 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IsIsNonPseudonode.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IsIsNonPseudonode.java
@@ -27,7 +27,7 @@
 /**
  * Provides Implementation of IsIsNonPseudonode Tlv.
  */
-public class IsIsNonPseudonode implements IGPRouterID, BGPValueType {
+public class IsIsNonPseudonode implements IGPRouterID, BgpValueType {
     private static final Logger log = LoggerFactory.getLogger(IsIsNonPseudonode.class);
 
     public static final short TYPE = 515;
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IsIsPseudonode.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IsIsPseudonode.java
index 99d5573..bbdbe5b 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IsIsPseudonode.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/IsIsPseudonode.java
@@ -28,7 +28,7 @@
 /**
  * Provides implementation of IsIsPseudonode Tlv.
  */
-public class IsIsPseudonode implements IGPRouterID, BGPValueType {
+public class IsIsPseudonode implements IGPRouterID, BgpValueType {
     private static final Logger log = LoggerFactory.getLogger(IsIsPseudonode.class);
 
     public static final short TYPE = 515;
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkLocalRemoteIdentifiersTlv.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkLocalRemoteIdentifiersTlv.java
index 988925f..a970082 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkLocalRemoteIdentifiersTlv.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkLocalRemoteIdentifiersTlv.java
@@ -26,7 +26,7 @@
 /**
  * Provides Implementation of Link Local/Remote IdentifiersTlv.
  */
-public class LinkLocalRemoteIdentifiersTlv implements BGPValueType {
+public class LinkLocalRemoteIdentifiersTlv implements BgpValueType {
     private static final Logger log = LoggerFactory.getLogger(LinkLocalRemoteIdentifiersTlv.class);
     public static final short TYPE = 258;
     private static final int LENGTH = 8;
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkStateAttributes.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkStateAttributes.java
index f64abd0..e55b90f 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkStateAttributes.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkStateAttributes.java
@@ -19,7 +19,7 @@
 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.types.attr.BgpAttrNodeFlagBitTlv;
 import org.onosproject.bgpio.types.attr.BgpAttrNodeIsIsAreaId;
 import org.onosproject.bgpio.types.attr.BgpAttrNodeMultiTopologyId;
@@ -52,7 +52,7 @@
 /**
  * Implements BGP Link state attribute.
  */
-public class LinkStateAttributes implements BGPValueType {
+public class LinkStateAttributes implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(LinkStateAttributes.class);
@@ -92,7 +92,7 @@
     public static final byte LINKSTATE_ATTRIB_TYPE = 50;
     public static final byte TYPE_AND_LEN = 4;
     private boolean isLinkStateAttribute = false;
-    private List<BGPValueType> linkStateAttribList;
+    private List<BgpValueType> linkStateAttribList;
 
     /**
      * Constructor to reset parameters.
@@ -106,7 +106,7 @@
      *
      * @param linkStateAttribList Linked list of Link, Node and Prefix TLVs
      */
-    LinkStateAttributes(List<BGPValueType> linkStateAttribList) {
+    LinkStateAttributes(List<BgpValueType> linkStateAttribList) {
         this.linkStateAttribList = linkStateAttribList;
         this.isLinkStateAttribute = true;
     }
@@ -116,7 +116,7 @@
      *
      * @return linked list of Link, Node and Prefix TLVs
      */
-    public List<BGPValueType> linkStateAttributes() {
+    public List<BgpValueType> linkStateAttributes() {
         return this.linkStateAttribList;
     }
 
@@ -134,10 +134,10 @@
      *
      * @param cb ChannelBuffer
      * @return constructor of LinkStateAttributes
-     * @throws BGPParseException while parsing link state attributes
+     * @throws BgpParseException while parsing link state attributes
      */
     public static LinkStateAttributes read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
 
         ChannelBuffer tempBuf = cb;
         Validation parseFlags = Validation.parseAttributeHeader(cb);
@@ -147,20 +147,20 @@
         ChannelBuffer data = tempBuf.readBytes(len);
         if (!parseFlags.getFirstBit() || parseFlags.getSecondBit()
                 || parseFlags.getThirdBit()) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                        BGPErrorType.ATTRIBUTE_FLAGS_ERROR,
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                        BgpErrorType.ATTRIBUTE_FLAGS_ERROR,
                                         data);
         }
 
         if (cb.readableBytes() < parseFlags.getLength()) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.BAD_MESSAGE_LENGTH,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.BAD_MESSAGE_LENGTH,
                                    parseFlags.getLength());
         }
 
-        BGPValueType bgpLSAttrib = null;
-        LinkedList<BGPValueType> linkStateAttribList;
-        linkStateAttribList = new LinkedList<BGPValueType>();
+        BgpValueType bgpLSAttrib = null;
+        LinkedList<BgpValueType> linkStateAttribList;
+        linkStateAttribList = new LinkedList<BgpValueType>();
         ChannelBuffer tempCb = cb.readBytes(parseFlags.getLength());
         while (tempCb.readableBytes() > 0) {
             short tlvCodePoint = tempCb.readShort();
@@ -279,8 +279,8 @@
                 break;
 
             default:
-                throw new BGPParseException(
-                                            "The BGP-LS Attribute is not supported : "
+                throw new BgpParseException(
+                                            "The Bgp-LS Attribute is not supported : "
                                                     + tlvCodePoint);
             }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LocalPref.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LocalPref.java
index 0f78ab7..5576a60 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LocalPref.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LocalPref.java
@@ -18,7 +18,7 @@
 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.util.Constants;
 import org.onosproject.bgpio.util.Validation;
 
@@ -27,7 +27,7 @@
 /**
  * Provides implementation of LocalPref BGP Path Attribute.
  */
-public class LocalPref implements BGPValueType {
+public class LocalPref implements BgpValueType {
     public static final byte LOCAL_PREF_TYPE = 5;
     public static final byte LOCAL_PREF_MAX_LEN = 4;
 
@@ -56,14 +56,14 @@
      *
      * @param cb channelBuffer
      * @return object of LocalPref
-     * @throws BGPParseException while parsing localPref attribute
+     * @throws BgpParseException while parsing localPref attribute
      */
-    public static LocalPref read(ChannelBuffer cb) throws BGPParseException {
+    public static LocalPref read(ChannelBuffer cb) throws BgpParseException {
         int localPref;
         ChannelBuffer tempCb = cb.copy();
         Validation parseFlags = Validation.parseAttributeHeader(cb);
         if ((parseFlags.getLength() > LOCAL_PREF_MAX_LEN) || cb.readableBytes() < parseFlags.getLength()) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                     parseFlags.getLength());
         }
 
@@ -71,7 +71,7 @@
                   Constants.TYPE_AND_LEN_AS_SHORT : parseFlags.getLength() + Constants.TYPE_AND_LEN_AS_BYTE;
         ChannelBuffer data = tempCb.readBytes(len);
         if (parseFlags.getFirstBit()) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.ATTRIBUTE_FLAGS_ERROR, data);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_FLAGS_ERROR, data);
         }
 
         localPref = cb.readInt();
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/Med.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/Med.java
index 23402c2..4ce73be 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/Med.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/Med.java
@@ -18,7 +18,7 @@
 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.util.Constants;
 import org.onosproject.bgpio.util.Validation;
 
@@ -27,7 +27,7 @@
 /**
  * Provides Implementation of Med BGP Path Attribute.
  */
-public class Med implements BGPValueType {
+public class Med implements BgpValueType {
     public static final byte MED_TYPE = 4;
     public static final byte MED_MAX_LEN = 4;
 
@@ -56,22 +56,22 @@
      *
      * @param cb ChannelBuffer
      * @return object of Med
-     * @throws BGPParseException while parsing Med path attribute
+     * @throws BgpParseException while parsing Med path attribute
      */
-    public static Med read(ChannelBuffer cb) throws BGPParseException {
+    public static Med read(ChannelBuffer cb) throws BgpParseException {
         int med;
         ChannelBuffer tempCb = cb.copy();
         Validation parseFlags = Validation.parseAttributeHeader(cb);
 
         if ((parseFlags.getLength() > MED_MAX_LEN) || cb.readableBytes() < parseFlags.getLength()) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                     parseFlags.getLength());
         }
         int len = parseFlags.isShort() ? parseFlags.getLength() + Constants.TYPE_AND_LEN_AS_SHORT : parseFlags
                 .getLength() + Constants.TYPE_AND_LEN_AS_BYTE;
         ChannelBuffer data = tempCb.readBytes(len);
         if (!parseFlags.getFirstBit() && parseFlags.getSecondBit() && parseFlags.getThirdBit()) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.ATTRIBUTE_FLAGS_ERROR, data);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_FLAGS_ERROR, data);
         }
 
         med = cb.readInt();
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpReachNlri.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpReachNlri.java
index fe99d28..1f39c80 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpReachNlri.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpReachNlri.java
@@ -22,10 +22,10 @@
 
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onlab.packet.Ip4Address;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPLSNlri;
-import org.onosproject.bgpio.protocol.linkstate.BGPPrefixIPv4LSNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpLSNlri;
+import org.onosproject.bgpio.protocol.linkstate.BgpPrefixIPv4LSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4;
 import org.onosproject.bgpio.protocol.linkstate.BgpLinkLsNlriVer4;
 import org.onosproject.bgpio.util.Constants;
 import org.onosproject.bgpio.util.Validation;
@@ -37,14 +37,14 @@
 /*
  * Provides Implementation of MpReach Nlri BGP Path Attribute.
  */
-public class MpReachNlri implements BGPValueType {
+public class MpReachNlri implements BgpValueType {
 
     private static final Logger log = LoggerFactory.getLogger(MpReachNlri.class);
     public static final byte MPREACHNLRI_TYPE = 14;
     public static final byte LINK_NLRITYPE = 2;
 
     private boolean isMpReachNlri = false;
-    private final List<BGPLSNlri> mpReachNlri;
+    private final List<BgpLSNlri> mpReachNlri;
     private final int length;
     private final short afi;
     private final byte safi;
@@ -59,7 +59,7 @@
      * @param ipNextHop nexthop IpAddress
      * @param length of MpReachNlri
      */
-    public MpReachNlri(List<BGPLSNlri> mpReachNlri, short afi, byte safi, Ip4Address ipNextHop, int length) {
+    public MpReachNlri(List<BgpLSNlri> mpReachNlri, short afi, byte safi, Ip4Address ipNextHop, int length) {
         this.mpReachNlri = mpReachNlri;
         this.isMpReachNlri = true;
         this.ipNextHop = ipNextHop;
@@ -82,7 +82,7 @@
      *
      * @return list of MpReach Nlri
      */
-    public List<BGPLSNlri> mpReachNlri() {
+    public List<BgpLSNlri> mpReachNlri() {
         return this.mpReachNlri;
     }
 
@@ -100,9 +100,9 @@
      *
      * @param cb channelBuffer
      * @return object of MpReachNlri
-     * @throws BGPParseException while parsing MpReachNlri
+     * @throws BgpParseException while parsing MpReachNlri
      */
-    public static MpReachNlri read(ChannelBuffer cb) throws BGPParseException {
+    public static MpReachNlri read(ChannelBuffer cb) throws BgpParseException {
         ChannelBuffer tempBuf = cb.copy();
         Validation parseFlags = Validation.parseAttributeHeader(cb);
         int len = parseFlags.isShort() ? parseFlags.getLength() + Constants.TYPE_AND_LEN_AS_SHORT :
@@ -110,15 +110,15 @@
         ChannelBuffer data = tempBuf.readBytes(len);
 
         if (cb.readableBytes() < parseFlags.getLength()) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                     parseFlags.getLength());
         }
         if (!parseFlags.getFirstBit() && parseFlags.getSecondBit() && parseFlags.getThirdBit()) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.ATTRIBUTE_FLAGS_ERROR, data);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_FLAGS_ERROR, data);
         }
 
-        BGPLSNlri bgpLSNlri = null;
-        List<BGPLSNlri> mpReachNlri = new LinkedList<>();
+        BgpLSNlri bgpLSNlri = null;
+        List<BgpLSNlri> mpReachNlri = new LinkedList<>();
         ChannelBuffer tempCb = cb.readBytes(parseFlags.getLength());
         short afi = 0;
         byte safi = 0;
@@ -133,7 +133,7 @@
                 byte nextHopLen = tempCb.readByte();
                 InetAddress ipAddress = Validation.toInetAddress(nextHopLen, cb);
                 if (ipAddress.isMulticastAddress()) {
-                    throw new BGPParseException("Multicast not supported");
+                    throw new BgpParseException("Multicast not supported");
                 }
                 ipNextHop = Ip4Address.valueOf(ipAddress);
                 byte reserved = tempCb.readByte();
@@ -142,19 +142,19 @@
                     short nlriType = tempCb.readShort();
                     short totNlriLen = tempCb.readShort();
                     if (tempCb.readableBytes() < totNlriLen) {
-                        Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                        BGPErrorType.ATTRIBUTE_LENGTH_ERROR, totNlriLen);
+                        Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                        BgpErrorType.ATTRIBUTE_LENGTH_ERROR, totNlriLen);
                     }
                     tempBuf = tempCb.readBytes(totNlriLen);
                     switch (nlriType) {
-                    case BGPNodeLSNlriVer4.NODE_NLRITYPE:
-                        bgpLSNlri = BGPNodeLSNlriVer4.read(tempBuf, afi, safi);
+                    case BgpNodeLSNlriVer4.NODE_NLRITYPE:
+                        bgpLSNlri = BgpNodeLSNlriVer4.read(tempBuf, afi, safi);
                         break;
                     case BgpLinkLsNlriVer4.LINK_NLRITYPE:
                         bgpLSNlri = BgpLinkLsNlriVer4.read(tempBuf, afi, safi);
                         break;
-                    case BGPPrefixIPv4LSNlriVer4.PREFIX_IPV4_NLRITYPE:
-                        bgpLSNlri = BGPPrefixIPv4LSNlriVer4.read(tempBuf, afi, safi);
+                    case BgpPrefixIPv4LSNlriVer4.PREFIX_IPV4_NLRITYPE:
+                        bgpLSNlri = BgpPrefixIPv4LSNlriVer4.read(tempBuf, afi, safi);
                         break;
                     default:
                         log.debug("nlriType not supported" + nlriType);
@@ -162,7 +162,7 @@
                     mpReachNlri.add(bgpLSNlri);
                 }
             } else {
-                throw new BGPParseException("Not Supporting afi " + afi + "safi " + safi);
+                throw new BgpParseException("Not Supporting afi " + afi + "safi " + safi);
             }
         }
         return new MpReachNlri(mpReachNlri, afi, safi, ipNextHop, parseFlags.getLength());
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpUnReachNlri.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpUnReachNlri.java
index 8763ec5..d719c65 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpUnReachNlri.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MpUnReachNlri.java
@@ -20,10 +20,10 @@
 import java.util.List;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPLSNlri;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPPrefixIPv4LSNlriVer4;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpLSNlri;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.BgpPrefixIPv4LSNlriVer4;
 import org.onosproject.bgpio.protocol.linkstate.BgpLinkLsNlriVer4;
 import org.onosproject.bgpio.util.Constants;
 import org.onosproject.bgpio.util.Validation;
@@ -35,7 +35,7 @@
 /**
  * Provides Implementation of MpUnReach Nlri BGP Path Attribute.
  */
-public class MpUnReachNlri implements BGPValueType {
+public class MpUnReachNlri implements BgpValueType {
 
     private static final Logger log = LoggerFactory.getLogger(MpUnReachNlri.class);
     public static final byte MPUNREACHNLRI_TYPE = 15;
@@ -44,7 +44,7 @@
     private boolean isMpUnReachNlri = false;
     private final short afi;
     private final byte safi;
-    private final List<BGPLSNlri> mpUnReachNlri;
+    private final List<BgpLSNlri> mpUnReachNlri;
     private final int length;
 
     /**
@@ -55,7 +55,7 @@
      * @param safi subsequent address family identifier
      * @param length of MpUnReachNlri
      */
-    public MpUnReachNlri(List<BGPLSNlri> mpUnReachNlri, short afi, byte safi,
+    public MpUnReachNlri(List<BgpLSNlri> mpUnReachNlri, short afi, byte safi,
                   int length) {
         this.mpUnReachNlri = mpUnReachNlri;
         this.isMpUnReachNlri = true;
@@ -69,9 +69,9 @@
      *
      * @param cb ChannelBuffer
      * @return object of MpUnReachNlri
-     * @throws BGPParseException while parsing MpUnReachNlri
+     * @throws BgpParseException while parsing MpUnReachNlri
      */
-    public static MpUnReachNlri read(ChannelBuffer cb) throws BGPParseException {
+    public static MpUnReachNlri read(ChannelBuffer cb) throws BgpParseException {
         ChannelBuffer tempBuf = cb.copy();
         Validation parseFlags = Validation.parseAttributeHeader(cb);
         int len = parseFlags.isShort() ? parseFlags.getLength() + Constants.TYPE_AND_LEN_AS_SHORT
@@ -80,17 +80,17 @@
 
         if (!parseFlags.getFirstBit() && parseFlags.getSecondBit()
                 && parseFlags.getThirdBit()) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                        BGPErrorType.ATTRIBUTE_FLAGS_ERROR, data);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                        BgpErrorType.ATTRIBUTE_FLAGS_ERROR, data);
         }
 
         if (cb.readableBytes() < parseFlags.getLength()) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR, parseFlags.getLength());
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR, parseFlags.getLength());
         }
 
-        LinkedList<BGPLSNlri> mpUnReachNlri = new LinkedList<>();
-        BGPLSNlri bgpLSNlri = null;
+        LinkedList<BgpLSNlri> mpUnReachNlri = new LinkedList<>();
+        BgpLSNlri bgpLSNlri = null;
         short afi = 0;
         byte safi = 0;
         ChannelBuffer tempCb = cb.readBytes(parseFlags.getLength());
@@ -106,19 +106,19 @@
                     short totNlriLen = tempCb.readShort();
                     if (tempCb.readableBytes() < totNlriLen) {
                         Validation.validateLen(
-                                BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                BGPErrorType.ATTRIBUTE_LENGTH_ERROR, totNlriLen);
+                                BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                BgpErrorType.ATTRIBUTE_LENGTH_ERROR, totNlriLen);
                     }
                     tempBuf = tempCb.readBytes(totNlriLen);
                     switch (nlriType) {
-                    case BGPNodeLSNlriVer4.NODE_NLRITYPE:
-                        bgpLSNlri = BGPNodeLSNlriVer4.read(tempBuf, afi, safi);
+                    case BgpNodeLSNlriVer4.NODE_NLRITYPE:
+                        bgpLSNlri = BgpNodeLSNlriVer4.read(tempBuf, afi, safi);
                         break;
                     case BgpLinkLsNlriVer4.LINK_NLRITYPE:
                         bgpLSNlri = BgpLinkLsNlriVer4.read(tempBuf, afi, safi);
                         break;
-                    case BGPPrefixIPv4LSNlriVer4.PREFIX_IPV4_NLRITYPE:
-                        bgpLSNlri = BGPPrefixIPv4LSNlriVer4.read(tempBuf, afi,
+                    case BgpPrefixIPv4LSNlriVer4.PREFIX_IPV4_NLRITYPE:
+                        bgpLSNlri = BgpPrefixIPv4LSNlriVer4.read(tempBuf, afi,
                                                                  safi);
                         break;
                     default:
@@ -128,7 +128,7 @@
                 }
             } else {
                 //TODO: check with the values got from capability
-                throw new BGPParseException("Not Supporting afi " + afi
+                throw new BgpParseException("Not Supporting afi " + afi
                         + "safi " + safi);
             }
         }
@@ -164,7 +164,7 @@
      *
      * @return list of MpUnReach Nlri
      */
-    public List<BGPLSNlri> mpUnReachNlri() {
+    public List<BgpLSNlri> mpUnReachNlri() {
         return this.mpUnReachNlri;
     }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MultiProtocolExtnCapabilityTlv.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MultiProtocolExtnCapabilityTlv.java
index 9beff68..af4d2a3 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MultiProtocolExtnCapabilityTlv.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/MultiProtocolExtnCapabilityTlv.java
@@ -25,7 +25,7 @@
 /**
  * Provides MultiProtocolExtnCapabilityTlv.
  */
-public class MultiProtocolExtnCapabilityTlv implements BGPValueType {
+public class MultiProtocolExtnCapabilityTlv implements BgpValueType {
 
     /*
         0       7       15      23      31
@@ -141,7 +141,7 @@
      * @param cb of type channel buffer
      * @return object of MultiProtocolExtnCapabilityTlv
      */
-    public static BGPValueType read(ChannelBuffer cb) {
+    public static BgpValueType read(ChannelBuffer cb) {
         short afi = cb.readShort();
         byte res = cb.readByte();
         byte safi = cb.readByte();
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/NextHop.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/NextHop.java
index 1d083b7..caf27e3 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/NextHop.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/NextHop.java
@@ -20,7 +20,7 @@
 
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onlab.packet.Ip4Address;
-import org.onosproject.bgpio.exceptions.BGPParseException;
+import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.onosproject.bgpio.util.Constants;
 import org.onosproject.bgpio.util.Validation;
 
@@ -30,7 +30,7 @@
 /**
  * Implementation of NextHop BGP Path Attribute.
  */
-public class NextHop implements BGPValueType {
+public class NextHop implements BgpValueType {
     public static final byte NEXTHOP_TYPE = 3;
 
     private boolean isNextHop = false;
@@ -60,27 +60,27 @@
      *
      * @param cb ChannelBuffer
      * @return object of NextHop
-     * @throws BGPParseException while parsing nexthop attribute
+     * @throws BgpParseException while parsing nexthop attribute
      */
-    public static NextHop read(ChannelBuffer cb) throws BGPParseException {
+    public static NextHop read(ChannelBuffer cb) throws BgpParseException {
         Ip4Address nextHop;
         ChannelBuffer tempCb = cb.copy();
         Validation parseFlags = Validation.parseAttributeHeader(cb);
 
         if (cb.readableBytes() < parseFlags.getLength()) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                     parseFlags.getLength());
         }
         int len = parseFlags.isShort() ? parseFlags.getLength() + Constants.TYPE_AND_LEN_AS_SHORT : parseFlags
                 .getLength() + Constants.TYPE_AND_LEN_AS_BYTE;
         ChannelBuffer data = tempCb.readBytes(len);
         if (parseFlags.getFirstBit() && !parseFlags.getSecondBit() && parseFlags.getThirdBit()) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.ATTRIBUTE_FLAGS_ERROR, data);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_FLAGS_ERROR, data);
         }
 
          InetAddress ipAddress = Validation.toInetAddress(parseFlags.getLength(), cb);
         if (ipAddress.isMulticastAddress()) {
-            throw new BGPParseException("Multicast address is not supported");
+            throw new BgpParseException("Multicast address is not supported");
         }
 
         nextHop = Ip4Address.valueOf(ipAddress);
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/OSPFNonPseudonode.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/OSPFNonPseudonode.java
index 6d8282b..8fc41dc 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/OSPFNonPseudonode.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/OSPFNonPseudonode.java
@@ -28,7 +28,7 @@
 /**
  * Provides implementation of OSPFNonPseudonode Tlv.
  */
-public class OSPFNonPseudonode implements IGPRouterID, BGPValueType {
+public class OSPFNonPseudonode implements IGPRouterID, BgpValueType {
 
     protected static final Logger log = LoggerFactory.getLogger(OSPFNonPseudonode.class);
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/OSPFPseudonode.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/OSPFPseudonode.java
index 82a39bd..3dfcc42 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/OSPFPseudonode.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/OSPFPseudonode.java
@@ -28,7 +28,7 @@
 /**
  * Provides implementation of OSPFPseudonode Tlv.
  */
-public class OSPFPseudonode implements IGPRouterID, BGPValueType {
+public class OSPFPseudonode implements IGPRouterID, BgpValueType {
 
     protected static final Logger log = LoggerFactory.getLogger(OSPFPseudonode.class);
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/OSPFRouteTypeTlv.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/OSPFRouteTypeTlv.java
index 20fffbf..cd44d97 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/OSPFRouteTypeTlv.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/OSPFRouteTypeTlv.java
@@ -18,7 +18,7 @@
 import java.util.Objects;
 
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BGPParseException;
+import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -27,7 +27,7 @@
 /**
  * Provides OSPF Route Type Tlv which contains route type.
  */
-public class OSPFRouteTypeTlv implements BGPValueType {
+public class OSPFRouteTypeTlv implements BgpValueType {
 
     /* Reference :draft-ietf-idr-ls-distribution-11
       0                   1                   2                   3
@@ -90,9 +90,9 @@
      * Returns RouteType.
      *
      * @return RouteType
-     * @throws BGPParseException if routeType is not matched
+     * @throws BgpParseException if routeType is not matched
      */
-    public ROUTETYPE getValue() throws BGPParseException {
+    public ROUTETYPE getValue() throws BgpParseException {
         switch (routeType) {
         case INTRA_AREA_TYPE:
             return ROUTETYPE.Intra_Area;
@@ -107,7 +107,7 @@
         case NSSA_TYPE_2:
             return ROUTETYPE.NSSA_2;
         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/types/Origin.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/Origin.java
index 2052e96..763a15b 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/Origin.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/Origin.java
@@ -18,7 +18,7 @@
 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.util.Constants;
 import org.onosproject.bgpio.util.Validation;
 
@@ -27,7 +27,7 @@
 /**
  * Provides Implementation of mandatory BGP Origin path attribute.
  */
-public class Origin implements BGPValueType {
+public class Origin implements BgpValueType {
 
     /**
      * Enum to provide ORIGIN types.
@@ -99,9 +99,9 @@
      *
      * @param cb ChannelBuffer
      * @return object of Origin
-     * @throws BGPParseException while parsing Origin path attribute
+     * @throws BgpParseException while parsing Origin path attribute
      */
-    public static Origin read(ChannelBuffer cb) throws BGPParseException {
+    public static Origin read(ChannelBuffer cb) throws BgpParseException {
         ChannelBuffer tempCb = cb.copy();
         Validation parseFlags = Validation.parseAttributeHeader(cb);
 
@@ -109,18 +109,18 @@
                 .getLength() + Constants.TYPE_AND_LEN_AS_BYTE;
         ChannelBuffer data = tempCb.readBytes(len);
         if ((parseFlags.getLength() > ORIGIN_VALUE_LEN) || (cb.readableBytes() < parseFlags.getLength())) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                     parseFlags.getLength());
         }
         if (parseFlags.getFirstBit() && !parseFlags.getSecondBit() && parseFlags.getThirdBit()) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.ATTRIBUTE_FLAGS_ERROR, data);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.ATTRIBUTE_FLAGS_ERROR, data);
         }
 
         byte originValue;
         originValue = cb.readByte();
         if ((originValue != ORIGINTYPE.INCOMPLETE.value) && (originValue != ORIGINTYPE.IGP.value) &&
               (originValue != ORIGINTYPE.EGP.value)) {
-            throw new BGPParseException(BGPErrorType.UPDATE_MESSAGE_ERROR, BGPErrorType.INVALID_ORIGIN_ATTRIBUTE, data);
+            throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.INVALID_ORIGIN_ATTRIBUTE, data);
         }
         return new Origin(originValue);
     }
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeFlagBitTlv.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeFlagBitTlv.java
index e7f4a4c..2351cc5 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeFlagBitTlv.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeFlagBitTlv.java
@@ -18,9 +18,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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP attribute node flag.
  */
-public final class BgpAttrNodeFlagBitTlv implements BGPValueType {
+public final class BgpAttrNodeFlagBitTlv implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpAttrNodeFlagBitTlv.class);
@@ -86,10 +86,10 @@
      *
      * @param cb ChannelBuffer
      * @return attribute node flag bit tlv
-     * @throws BGPParseException while parsing BgpAttrNodeFlagBitTlv
+     * @throws BgpParseException while parsing BgpAttrNodeFlagBitTlv
      */
     public static BgpAttrNodeFlagBitTlv read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         boolean bOverloadBit = false;
         boolean bAttachedBit = false;
         boolean bExternalBit = false;
@@ -98,8 +98,8 @@
         short lsAttrLength = cb.readShort();
 
         if ((lsAttrLength != 1) || (cb.readableBytes() < lsAttrLength)) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeIsIsAreaId.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeIsIsAreaId.java
index 6e9f9ce..b23d646 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeIsIsAreaId.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeIsIsAreaId.java
@@ -18,9 +18,9 @@
 import java.util.Arrays;
 
 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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP attribute ISIS Area Identifier.
  */
-public class BgpAttrNodeIsIsAreaId implements BGPValueType {
+public class BgpAttrNodeIsIsAreaId implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpAttrNodeIsIsAreaId.class);
@@ -64,17 +64,17 @@
      *
      * @param cb ChannelBuffer
      * @return object of BgpAttrNodeIsIsAreaId
-     * @throws BGPParseException while parsing BgpAttrNodeIsIsAreaId
+     * @throws BgpParseException while parsing BgpAttrNodeIsIsAreaId
      */
     public static BgpAttrNodeIsIsAreaId read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         byte[] isisAreaId;
 
         short lsAttrLength = cb.readShort();
 
         if (cb.readableBytes() < lsAttrLength) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeMultiTopologyId.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeMultiTopologyId.java
index 4b704fb..caf73a0 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeMultiTopologyId.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeMultiTopologyId.java
@@ -20,9 +20,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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,7 +32,7 @@
 /**
  * BGP Multi-Topology ID of the LS attribute.
  */
-public class BgpAttrNodeMultiTopologyId implements BGPValueType {
+public class BgpAttrNodeMultiTopologyId implements BgpValueType {
 
     private static final Logger log = LoggerFactory
             .getLogger(BgpAttrNodeMultiTopologyId.class);
@@ -66,18 +66,18 @@
      *
      * @param cb ChannelBuffer
      * @return Constructor of BgpAttrNodeMultiTopologyId
-     * @throws BGPParseException while parsing BgpAttrNodeMultiTopologyId
+     * @throws BgpParseException while parsing BgpAttrNodeMultiTopologyId
      */
     public static BgpAttrNodeMultiTopologyId read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         ArrayList<Short> multiTopologyId = new ArrayList<Short>();
         short tempMultiTopologyId;
         short lsAttrLength = cb.readShort();
         int len = lsAttrLength / 2; // Length is 2*n and n is the number of MT-IDs
 
         if (cb.readableBytes() < lsAttrLength) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeName.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeName.java
index a1f95e6..11c99ba 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeName.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeName.java
@@ -18,9 +18,9 @@
 import java.util.Arrays;
 
 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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP attribute node name.
  */
-public class BgpAttrNodeName implements BGPValueType {
+public class BgpAttrNodeName implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpAttrNodeName.class);
@@ -64,17 +64,17 @@
      *
      * @param cb ChannelBuffer
      * @return object of BgpAttrNodeName
-     * @throws BGPParseException while parsing BgpAttrNodeName
+     * @throws BgpParseException while parsing BgpAttrNodeName
      */
     public static BgpAttrNodeName read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         byte[] nodeName;
 
         short lsAttrLength = cb.readShort();
 
         if (cb.readableBytes() < lsAttrLength) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrOpaqueNode.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrOpaqueNode.java
index 3b0717e..8e800cb 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrOpaqueNode.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrOpaqueNode.java
@@ -18,9 +18,9 @@
 import java.util.Arrays;
 
 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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP attribute opaque node.
  */
-public class BgpAttrOpaqueNode implements BGPValueType {
+public class BgpAttrOpaqueNode implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpAttrOpaqueNode.class);
@@ -64,18 +64,18 @@
      *
      * @param cb ChannelBuffer
      * @return object of BgpAttrOpaqueNode
-     * @throws BGPParseException while parsing BgpAttrOpaqueNode
+     * @throws BgpParseException while parsing BgpAttrOpaqueNode
      */
     public static BgpAttrOpaqueNode read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
 
         byte[] opaqueNodeAttribute;
 
         short lsAttrLength = cb.readShort();
 
         if (cb.readableBytes() < lsAttrLength) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrRouterIdV4.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrRouterIdV4.java
index a10d167..63937ba 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrRouterIdV4.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrRouterIdV4.java
@@ -19,9 +19,9 @@
 
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onlab.packet.Ip4Address;
-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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,7 +31,7 @@
 /**
  * Implements BGP attribute node router ID.
  */
-public final class BgpAttrRouterIdV4 implements BGPValueType {
+public final class BgpAttrRouterIdV4 implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpAttrRouterIdV4.class);
@@ -70,15 +70,15 @@
      * @param cb ChannelBuffer
      * @param sType tag type
      * @return object of BgpAttrRouterIdV4
-     * @throws BGPParseException while parsing BgpAttrRouterIdV4
+     * @throws BgpParseException while parsing BgpAttrRouterIdV4
      */
     public static BgpAttrRouterIdV4 read(ChannelBuffer cb, short sType)
-            throws BGPParseException {
+            throws BgpParseException {
         short lsAttrLength = cb.readShort();
 
         if ((lsAttrLength != 4) || (cb.readableBytes() < lsAttrLength)) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrRouterIdV6.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrRouterIdV6.java
index ea63c37..754f838 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrRouterIdV6.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrRouterIdV6.java
@@ -19,9 +19,9 @@
 
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onlab.packet.Ip6Address;
-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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,7 +31,7 @@
 /**
  * Implements BGP attribute IPv6 router ID.
  */
-public final class BgpAttrRouterIdV6 implements BGPValueType {
+public final class BgpAttrRouterIdV6 implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpAttrRouterIdV6.class);
@@ -70,18 +70,18 @@
      * @param cb ChannelBuffer
      * @param sType TLV type
      * @return object of BgpAttrRouterIdV6
-     * @throws BGPParseException while parsing BgpAttrRouterIdV6
+     * @throws BgpParseException while parsing BgpAttrRouterIdV6
      */
     public static BgpAttrRouterIdV6 read(ChannelBuffer cb, short sType)
-            throws BGPParseException {
+            throws BgpParseException {
         byte[] ipBytes;
         Ip6Address ip6RouterId;
 
         short lsAttrLength = cb.readShort();
 
         if ((lsAttrLength != 16) || (cb.readableBytes() < lsAttrLength)) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrIgpMetric.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrIgpMetric.java
index c1cb299..6063ba6 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrIgpMetric.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrIgpMetric.java
@@ -18,9 +18,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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP link IGP metric attribute.
  */
-public class BgpLinkAttrIgpMetric implements BGPValueType {
+public class BgpLinkAttrIgpMetric implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpLinkAttrIgpMetric.class);
@@ -75,10 +75,10 @@
      *
      * @param cb Channel buffer
      * @return object of type BgpLinkAttrIgpMetric
-     * @throws BGPParseException while parsing BgpLinkAttrIgpMetric
+     * @throws BgpParseException while parsing BgpLinkAttrIgpMetric
      */
     public static BgpLinkAttrIgpMetric read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
 
         short linkigp;
         int igpMetric = 0;
@@ -88,8 +88,8 @@
 
         if (cb.readableBytes() < lsAttrLength
                 || lsAttrLength > ATTRLINK_MAX_LEN) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrIsIsAdminstGrp.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrIsIsAdminstGrp.java
index 086e8b0..fa391a9 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrIsIsAdminstGrp.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrIsIsAdminstGrp.java
@@ -18,9 +18,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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP attribute Is Is Administrative area.
  */
-public final class BgpLinkAttrIsIsAdminstGrp implements BGPValueType {
+public final class BgpLinkAttrIsIsAdminstGrp implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpLinkAttrIsIsAdminstGrp.class);
@@ -65,17 +65,17 @@
      *
      * @param cb Channel buffer
      * @return object of type BgpLinkAttrIsIsAdminstGrp
-     * @throws BGPParseException while parsing BgpLinkAttrIsIsAdminstGrp
+     * @throws BgpParseException while parsing BgpLinkAttrIsIsAdminstGrp
      */
     public static BgpLinkAttrIsIsAdminstGrp read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         long isisAdminGrp;
         short lsAttrLength = cb.readShort();
 
         if ((lsAttrLength != ISIS_ADMIN_DATA_LEN)
                 || (cb.readableBytes() < lsAttrLength)) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrMaxLinkBandwidth.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrMaxLinkBandwidth.java
index a1f0198..b747536 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrMaxLinkBandwidth.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrMaxLinkBandwidth.java
@@ -18,9 +18,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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP attribute Max Link bandwidth.
  */
-public final class BgpLinkAttrMaxLinkBandwidth implements BGPValueType {
+public final class BgpLinkAttrMaxLinkBandwidth implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpLinkAttrMaxLinkBandwidth.class);
@@ -72,17 +72,17 @@
      * @param cb Channel buffer
      * @param type type of this tlv
      * @return object of type BgpLinkAttrMaxLinkBandwidth
-     * @throws BGPParseException while parsing BgpLinkAttrMaxLinkBandwidth
+     * @throws BgpParseException while parsing BgpLinkAttrMaxLinkBandwidth
      */
     public static BgpLinkAttrMaxLinkBandwidth read(ChannelBuffer cb, short type)
-            throws BGPParseException {
+            throws BgpParseException {
         float maxBandwidth;
         short lsAttrLength = cb.readShort();
 
         if ((lsAttrLength != MAX_BANDWIDTH_LEN)
                 || (cb.readableBytes() < lsAttrLength)) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrMplsProtocolMask.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrMplsProtocolMask.java
index 61143fa..d18e8e2 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrMplsProtocolMask.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrMplsProtocolMask.java
@@ -18,9 +18,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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP MPLS protocol mask attribute.
  */
-public class BgpLinkAttrMplsProtocolMask implements BGPValueType {
+public class BgpLinkAttrMplsProtocolMask implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpLinkAttrMplsProtocolMask.class);
@@ -72,10 +72,10 @@
      *
      * @param cb Channel buffer
      * @return object of type BgpLinkAttrMPLSProtocolMask
-     * @throws BGPParseException while parsing BgpLinkAttrMplsProtocolMask
+     * @throws BgpParseException while parsing BgpLinkAttrMplsProtocolMask
      */
     public static BgpLinkAttrMplsProtocolMask read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         boolean bLdp = false;
         boolean bRsvpTe = false;
 
@@ -83,8 +83,8 @@
 
         if ((lsAttrLength != MASK_BYTE_LEN)
                 || (cb.readableBytes() < lsAttrLength)) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrName.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrName.java
index e44ba7e..61993f4 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrName.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrName.java
@@ -18,9 +18,9 @@
 import java.util.Arrays;
 
 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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP link name attribute.
  */
-public class BgpLinkAttrName implements BGPValueType {
+public class BgpLinkAttrName implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpLinkAttrName.class);
@@ -64,16 +64,16 @@
      *
      * @param cb Channel buffer
      * @return object of type BgpLinkAttrName
-     * @throws BGPParseException while parsing BgpLinkAttrName
+     * @throws BgpParseException while parsing BgpLinkAttrName
      */
     public static BgpLinkAttrName read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         byte[] linkName;
         short lsAttrLength = cb.readShort();
 
         if (cb.readableBytes() < lsAttrLength) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrOpaqLnkAttrib.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrOpaqLnkAttrib.java
index 258598b..e12f5fb 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrOpaqLnkAttrib.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrOpaqLnkAttrib.java
@@ -18,9 +18,9 @@
 import java.util.Arrays;
 
 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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP link opaque attribute.
  */
-public final class BgpLinkAttrOpaqLnkAttrib implements BGPValueType {
+public final class BgpLinkAttrOpaqLnkAttrib implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpLinkAttrOpaqLnkAttrib.class);
@@ -65,18 +65,18 @@
      *
      * @param cb Channel buffer
      * @return object of type BgpLinkAttrOpaqLnkAttrib
-     * @throws BGPParseException while parsing BgpLinkAttrOpaqLnkAttrib
+     * @throws BgpParseException while parsing BgpLinkAttrOpaqLnkAttrib
      */
     public static BgpLinkAttrOpaqLnkAttrib read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
 
         byte[] opaqueLinkAttribute;
 
         short lsAttrLength = cb.readShort();
 
         if (cb.readableBytes() < lsAttrLength) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrProtectionType.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrProtectionType.java
index b45d95b..f56a3f90 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrProtectionType.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrProtectionType.java
@@ -18,9 +18,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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP link protection type attribute.
  */
-public final class BgpLinkAttrProtectionType implements BGPValueType {
+public final class BgpLinkAttrProtectionType implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpLinkAttrProtectionType.class);
@@ -102,10 +102,10 @@
      *
      * @param cb Channel buffer
      * @return object of type BgpLinkAttrProtectionType
-     * @throws BGPParseException while parsing BgpLinkAttrProtectionType
+     * @throws BgpParseException while parsing BgpLinkAttrProtectionType
      */
     public static BgpLinkAttrProtectionType read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         short linkProtectionType;
         byte higherByte;
         short lsAttrLength = cb.readShort();
@@ -119,8 +119,8 @@
 
         if ((lsAttrLength != LINK_PROTECTION_LEN)
                 || (cb.readableBytes() < lsAttrLength)) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrSrlg.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrSrlg.java
index b769252..dde1fba 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrSrlg.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrSrlg.java
@@ -20,9 +20,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.util.Validation;
 
 import com.google.common.base.MoreObjects;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP link Shared Risk Link Group attribute.
  */
-public class BgpLinkAttrSrlg implements BGPValueType {
+public class BgpLinkAttrSrlg implements BgpValueType {
 
     public static final short ATTRNODE_SRLG = 1097;
 
@@ -61,10 +61,10 @@
      *
      * @param cb Channel buffer
      * @return object of type BgpLinkAttrSrlg
-     * @throws BGPParseException while parsing BgpLinkAttrSrlg
+     * @throws BgpParseException while parsing BgpLinkAttrSrlg
      */
     public static BgpLinkAttrSrlg read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         int tempSrlg;
         ArrayList<Integer> sRlg = new ArrayList<Integer>();
 
@@ -72,8 +72,8 @@
         int len = lsAttrLength / Integer.SIZE; // each element is of 4 octets
 
         if (cb.readableBytes() < lsAttrLength) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrTeDefaultMetric.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrTeDefaultMetric.java
index 7febe3c3..a7e53a5 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrTeDefaultMetric.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrTeDefaultMetric.java
@@ -18,9 +18,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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP link state Default TE metric link attribute.
  */
-public class BgpLinkAttrTeDefaultMetric implements BGPValueType {
+public class BgpLinkAttrTeDefaultMetric implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpLinkAttrTeDefaultMetric.class);
@@ -66,18 +66,18 @@
      *
      * @param cb Channel buffer
      * @return object of type BgpLinkAttrTeDefaultMetric
-     * @throws BGPParseException while parsing BgpLinkAttrTeDefaultMetric
+     * @throws BgpParseException while parsing BgpLinkAttrTeDefaultMetric
      */
     public static BgpLinkAttrTeDefaultMetric read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         int linkTeMetric;
 
         short lsAttrLength = cb.readShort();
 
         if ((lsAttrLength != TE_DATA_LEN)
                 || (cb.readableBytes() < lsAttrLength)) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrUnRsrvdLinkBandwidth.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrUnRsrvdLinkBandwidth.java
index dfef8e7..3fcfafc 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrUnRsrvdLinkBandwidth.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrUnRsrvdLinkBandwidth.java
@@ -20,9 +20,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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,7 +32,7 @@
 /**
  * Implements BGP unreserved bandwidth attribute.
  */
-public class BgpLinkAttrUnRsrvdLinkBandwidth implements BGPValueType {
+public class BgpLinkAttrUnRsrvdLinkBandwidth implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpLinkAttrUnRsrvdLinkBandwidth.class);
@@ -74,19 +74,19 @@
      *
      * @param cb Channel buffer
      * @return object of type BgpLinkAttrMaxLinkBandwidth
-     * @throws BGPParseException while parsing BgpLinkAttrMaxLinkBandwidth
+     * @throws BgpParseException while parsing BgpLinkAttrMaxLinkBandwidth
      */
     public static BgpLinkAttrUnRsrvdLinkBandwidth read(ChannelBuffer cb,
                                                        short sType)
-                                                               throws BGPParseException {
+                                                               throws BgpParseException {
         ArrayList<Float> maxUnResBandwidth = new ArrayList<Float>();
         float tmp;
         short lsAttrLength = cb.readShort();
 
         if ((lsAttrLength != MAX_BANDWIDTH_LEN * NO_OF_PRIORITY)
                 || (cb.readableBytes() < lsAttrLength)) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrExtRouteTag.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrExtRouteTag.java
index c5ac51b..bbe3a10 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrExtRouteTag.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrExtRouteTag.java
@@ -22,9 +22,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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -34,7 +34,7 @@
 /**
  * Implements BGP prefix route Extended tag attribute.
  */
-public class BgpPrefixAttrExtRouteTag implements BGPValueType {
+public class BgpPrefixAttrExtRouteTag implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpPrefixAttrExtRouteTag.class);
@@ -69,10 +69,10 @@
      *
      * @param cb ChannelBuffer
      * @return object of BgpPrefixAttrExtRouteTag
-     * @throws BGPParseException while parsing BgpPrefixAttrExtRouteTag
+     * @throws BgpParseException while parsing BgpPrefixAttrExtRouteTag
      */
     public static BgpPrefixAttrExtRouteTag read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         ArrayList<Long> pfxExtRouteTag = new ArrayList<Long>();
         long temp;
 
@@ -80,8 +80,8 @@
         int len = lsAttrLength / ATTR_PREFIX_EXT_LEN;
 
         if (cb.readableBytes() < lsAttrLength) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrIgpFlags.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrIgpFlags.java
index a215e6f..dec3804 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrIgpFlags.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrIgpFlags.java
@@ -18,9 +18,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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP prefix IGP Flag attribute.
  */
-public final class BgpPrefixAttrIgpFlags implements BGPValueType {
+public final class BgpPrefixAttrIgpFlags implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpPrefixAttrIgpFlags.class);
@@ -88,10 +88,10 @@
      *
      * @param cb ChannelBuffer
      * @return object of BgpPrefixAttrIGPFlags
-     * @throws BGPParseException while parsing BgpPrefixAttrIGPFlags
+     * @throws BgpParseException while parsing BgpPrefixAttrIGPFlags
      */
     public static BgpPrefixAttrIgpFlags read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         boolean bisisUpDownBit = false;
         boolean bOspfNoUnicastBit = false;
         boolean bOspfLclAddrBit = false;
@@ -101,8 +101,8 @@
 
         if ((lsAttrLength != ATTR_PREFIX_FLAG_LEN)
                 || (cb.readableBytes() < lsAttrLength)) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrMetric.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrMetric.java
index 0678b81..403d182 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrMetric.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrMetric.java
@@ -18,9 +18,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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP prefix metric attribute.
  */
-public class BgpPrefixAttrMetric implements BGPValueType {
+public class BgpPrefixAttrMetric implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpPrefixAttrMetric.class);
@@ -65,18 +65,18 @@
      *
      * @param cb ChannelBuffer
      * @return object of BgpPrefixAttrMetric
-     * @throws BGPParseException while parsing BgpPrefixAttrMetric
+     * @throws BgpParseException while parsing BgpPrefixAttrMetric
      */
     public static BgpPrefixAttrMetric read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         int linkPfxMetric;
 
         short lsAttrLength = cb.readShort(); // 4 Bytes
 
         if ((lsAttrLength != ATTR_PREFIX_LEN)
                 || (cb.readableBytes() < lsAttrLength)) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrOpaqueData.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrOpaqueData.java
index c7008ca..f8df22f 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrOpaqueData.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrOpaqueData.java
@@ -18,9 +18,9 @@
 import java.util.Arrays;
 
 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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@
 /**
  * Implements BGP prefix opaque data attribute.
  */
-public final class BgpPrefixAttrOpaqueData implements BGPValueType {
+public final class BgpPrefixAttrOpaqueData implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpPrefixAttrOpaqueData.class);
@@ -65,18 +65,18 @@
      *
      * @param cb ChannelBuffer
      * @return object of BgpPrefixAttrOpaqueData
-     * @throws BGPParseException while parsing BgpPrefixAttrOpaqueData
+     * @throws BgpParseException while parsing BgpPrefixAttrOpaqueData
      */
     public static BgpPrefixAttrOpaqueData read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         byte[] opaquePrefixAttribute;
 
         short lsAttrLength = cb.readShort();
         opaquePrefixAttribute = new byte[lsAttrLength];
 
         if (cb.readableBytes() < lsAttrLength) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrOspfFwdAddr.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrOspfFwdAddr.java
index cf04304..8ac3da0 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrOspfFwdAddr.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrOspfFwdAddr.java
@@ -20,9 +20,9 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.Ip6Address;
-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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,7 +32,7 @@
 /**
  * Implements BGP prefix OSPF Forwarding address attribute.
  */
-public class BgpPrefixAttrOspfFwdAddr implements BGPValueType {
+public class BgpPrefixAttrOspfFwdAddr implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpPrefixAttrOspfFwdAddr.class);
@@ -80,10 +80,10 @@
      *
      * @param cb ChannelBuffer
      * @return object of BgpPrefixAttrOSPFFwdAddr
-     * @throws BGPParseException while parsing BgpPrefixAttrOspfFwdAddr
+     * @throws BgpParseException while parsing BgpPrefixAttrOspfFwdAddr
      */
     public static BgpPrefixAttrOspfFwdAddr read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         short lsAttrLength;
         byte[] ipBytes;
         Ip4Address ip4RouterId = null;
@@ -93,8 +93,8 @@
         ipBytes = new byte[lsAttrLength];
 
         if ((cb.readableBytes() < lsAttrLength)) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrRouteTag.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrRouteTag.java
index 426eb27..cf5156a 100755
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrRouteTag.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpPrefixAttrRouteTag.java
@@ -20,9 +20,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.util.Validation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,7 +32,7 @@
 /**
  * Implements BGP prefix route tag attribute.
  */
-public class BgpPrefixAttrRouteTag implements BGPValueType {
+public class BgpPrefixAttrRouteTag implements BgpValueType {
 
     protected static final Logger log = LoggerFactory
             .getLogger(BgpPrefixAttrRouteTag.class);
@@ -66,10 +66,10 @@
      *
      * @param cb ChannelBuffer
      * @return object of BgpPrefixAttrRouteTag
-     * @throws BGPParseException while parsing BgpPrefixAttrRouteTag
+     * @throws BgpParseException while parsing BgpPrefixAttrRouteTag
      */
     public static BgpPrefixAttrRouteTag read(ChannelBuffer cb)
-            throws BGPParseException {
+            throws BgpParseException {
         int tmp;
         ArrayList<Integer> pfxRouteTag = new ArrayList<Integer>();
 
@@ -77,8 +77,8 @@
         int len = lsAttrLength / Integer.SIZE;
 
         if (cb.readableBytes() < lsAttrLength) {
-            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
-                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                                   BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
                                    lsAttrLength);
         }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/util/Validation.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/util/Validation.java
index bc13189..23dd1a7 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/util/Validation.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/util/Validation.java
@@ -24,7 +24,7 @@
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
-import org.onosproject.bgpio.exceptions.BGPParseException;
+import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -109,13 +109,13 @@
      * @param errorCode Error code
      * @param subErrCode Sub Error Code
      * @param length erroneous length
-     * @throws BGPParseException for erroneous length
+     * @throws BgpParseException for erroneous length
      */
-    public static void validateLen(byte errorCode, byte subErrCode, int length) throws BGPParseException {
+    public static void validateLen(byte errorCode, byte subErrCode, int length) throws BgpParseException {
         byte[] errLen = Ints.toByteArray(length);
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(errLen);
-        throw new BGPParseException(errorCode, subErrCode, buffer);
+        throw new BgpParseException(errorCode, subErrCode, buffer);
     }
 
     /**
@@ -124,13 +124,13 @@
      * @param errorCode Error code
      * @param subErrCode Sub Error Code
      * @param type erroneous type
-     * @throws BGPParseException for erroneous type
+     * @throws BgpParseException for erroneous type
      */
-    public static void validateType(byte errorCode, byte subErrCode, int type) throws BGPParseException {
+    public static void validateType(byte errorCode, byte subErrCode, int type) throws BgpParseException {
         byte[] errType = Ints.toByteArray(type);
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(errType);
-        throw new BGPParseException(errorCode, subErrCode, buffer);
+        throw new BgpParseException(errorCode, subErrCode, buffer);
     }
 
     /**
diff --git a/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BGPKeepaliveMsgTest.java b/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpKeepaliveMsgTest.java
similarity index 83%
rename from bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BGPKeepaliveMsgTest.java
rename to bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpKeepaliveMsgTest.java
index 68ce307..682c1bc 100755
--- a/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BGPKeepaliveMsgTest.java
+++ b/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpKeepaliveMsgTest.java
@@ -18,8 +18,8 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.types.BgpHeader;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.instanceOf;
@@ -28,13 +28,13 @@
 /**
  * Test case for BGP KEEPALIVE Message.
  */
-public class BGPKeepaliveMsgTest {
+public class BgpKeepaliveMsgTest {
 
     /**
      * This test case checks BGP Keepalive message.
      */
     @Test
-    public void keepaliveMessageTest1() throws BGPParseException {
+    public void keepaliveMessageTest1() throws BgpParseException {
 
         // BGP KEEPALIVE Message
         byte[] keepaliveMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -47,13 +47,13 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(keepaliveMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPKeepaliveMsg.class));
+        assertThat(message, instanceOf(BgpKeepaliveMsg.class));
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
 
diff --git a/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpNotificationMsgTest.java b/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpNotificationMsgTest.java
index 78edf13..6dfa57e 100644
--- a/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpNotificationMsgTest.java
+++ b/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpNotificationMsgTest.java
@@ -18,8 +18,8 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.types.BgpHeader;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.instanceOf;
@@ -33,10 +33,10 @@
     /**
      * Notification message with error code, error subcode and data.
      *
-     * @throws BGPParseException while decoding and encoding notification message
+     * @throws BgpParseException while decoding and encoding notification message
      */
     @Test
-    public void bgpNotificationMessageTest1() throws BGPParseException {
+    public void bgpNotificationMessageTest1() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -52,12 +52,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
@@ -72,10 +72,10 @@
     /**
      * Notification message without data.
      *
-     * @throws BGPParseException  while decoding and encoding notification message
+     * @throws BgpParseException  while decoding and encoding notification message
      */
     @Test
-    public void bgpNotificationMessageTest2() throws BGPParseException {
+    public void bgpNotificationMessageTest2() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -90,12 +90,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
@@ -111,10 +111,10 @@
     /**
      * Notification message with wrong maker value.
      *
-     * @throws BGPParseException while decoding and encoding notification message
+     * @throws BgpParseException while decoding and encoding notification message
      */
-    @Test(expected = BGPParseException.class)
-    public void bgpNotificationMessageTest3() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void bgpNotificationMessageTest3() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -129,12 +129,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
@@ -149,10 +149,10 @@
     /**
      * Notification message without error subcode.
      *
-     * @throws BGPParseException while decoding and encoding notification message
+     * @throws BgpParseException while decoding and encoding notification message
      */
-    @Test(expected = BGPParseException.class)
-    public void bgpNotificationMessageTest4() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void bgpNotificationMessageTest4() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -167,12 +167,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
@@ -187,10 +187,10 @@
     /**
      * Notification message with wrong message length.
      *
-     * @throws BGPParseException while decoding and encoding notification message
+     * @throws BgpParseException while decoding and encoding notification message
      */
-    @Test(expected = BGPParseException.class)
-    public void bgpNotificationMessageTest5() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void bgpNotificationMessageTest5() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -205,12 +205,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
diff --git a/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BGPOpenMsgTest.java b/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpOpenMsgTest.java
similarity index 81%
rename from bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BGPOpenMsgTest.java
rename to bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpOpenMsgTest.java
index d521017..1fe4036 100755
--- a/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BGPOpenMsgTest.java
+++ b/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpOpenMsgTest.java
@@ -18,8 +18,8 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.types.BgpHeader;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.instanceOf;
@@ -28,13 +28,13 @@
 /**
  * Test cases for BGP Open Message.
  */
-public class BGPOpenMsgTest {
+public class BgpOpenMsgTest {
 
     /**
      * This test case checks open message without optional parameter.
      */
     @Test
-    public void openMessageTest1() throws BGPParseException {
+    public void openMessageTest1() throws BgpParseException {
         //Open message without optional parameter
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
                                      (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -48,12 +48,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
 
@@ -69,7 +69,7 @@
      * capability.
      */
     @Test
-    public void openMessageTest2() throws BGPParseException {
+    public void openMessageTest2() throws BgpParseException {
 
         // OPEN Message (MultiProtocolExtension-CAPABILITY).
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -91,13 +91,13 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
 
@@ -113,7 +113,7 @@
      * capability.
      */
     @Test
-    public void openMessageTest3() throws BGPParseException {
+    public void openMessageTest3() throws BgpParseException {
 
         // OPEN Message (Four-Octet AS number capability).
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -135,13 +135,13 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
 
@@ -156,7 +156,7 @@
      * This test case checks open message with capabilities.
      */
     @Test
-    public void openMessageTest4() throws BGPParseException {
+    public void openMessageTest4() throws BgpParseException {
 
         // OPEN Message with capabilities.
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -178,13 +178,13 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
@@ -200,8 +200,8 @@
      * In this test case, Invalid version is given as input and expecting
      * an exception.
      */
-    @Test(expected = BGPParseException.class)
-    public void openMessageTest5() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void openMessageTest5() throws BgpParseException {
 
         // OPEN Message with invalid version number.
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -217,20 +217,20 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
     }
 
     /**
      * In this test case, Marker is set as 0 in input and expecting
      * an exception.
      */
-    @Test(expected = BGPParseException.class)
-    public void openMessageTest6() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void openMessageTest6() throws BgpParseException {
 
         // OPEN Message with marker set to 0.
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -246,20 +246,20 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
     }
 
     /**
      * In this test case, Invalid message length is given as input and expecting
      * an exception.
      */
-    @Test(expected = BGPParseException.class)
-    public void openMessageTest7() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void openMessageTest7() throws BgpParseException {
 
         // OPEN Message with invalid header length.
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -275,20 +275,20 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
     }
 
     /**
      * In this test case, Invalid message type is given as input and expecting
      * an exception.
      */
-    @Test(expected = BGPParseException.class)
-    public void openMessageTest8() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void openMessageTest8() throws BgpParseException {
 
         // OPEN Message with invalid message type.
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -304,11 +304,11 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
     }
 }
diff --git a/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BGPLSIdentifierTest.java b/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpLSIdentifierTest.java
similarity index 82%
rename from bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BGPLSIdentifierTest.java
rename to bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpLSIdentifierTest.java
index f3355d3..59cf96f 100644
--- a/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BGPLSIdentifierTest.java
+++ b/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpLSIdentifierTest.java
@@ -22,12 +22,12 @@
 /**
  * Test for BGPLSIdentifier Tlv.
  */
-public class BGPLSIdentifierTest {
+public class BgpLSIdentifierTest {
     private final int value1 = 8738;
     private final int value2 = 13107;
-    private final BGPLSIdentifierTlv tlv1 = BGPLSIdentifierTlv.of(value1);
-    private final BGPLSIdentifierTlv sameAsTlv1 = new BGPLSIdentifierTlv(value1);
-    private final BGPLSIdentifierTlv tlv2 = new BGPLSIdentifierTlv(value2);
+    private final BgpLSIdentifierTlv tlv1 = BgpLSIdentifierTlv.of(value1);
+    private final BgpLSIdentifierTlv sameAsTlv1 = new BgpLSIdentifierTlv(value1);
+    private final BgpLSIdentifierTlv tlv2 = new BgpLSIdentifierTlv(value2);
 
     @Test
     public void basics() {
diff --git a/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/LocalPrefTest.java b/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/LocalPrefTest.java
index 02a06e05..1bd3438 100644
--- a/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/LocalPrefTest.java
+++ b/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/LocalPrefTest.java
@@ -13,10 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.bgpio;
+package org.onosproject.bgpio.types;
 
 import org.junit.Test;
-import org.onosproject.bgpio.types.LocalPref;
 
 import com.google.common.testing.EqualsTester;
 
@@ -32,9 +31,6 @@
 
     @Test
     public void testEquality() {
-        new EqualsTester()
-        .addEqualityGroup(attr1, sameAsAttr1)
-        .addEqualityGroup(attr2)
-        .testEquals();
+        new EqualsTester().addEqualityGroup(attr1, sameAsAttr1).addEqualityGroup(attr2).testEquals();
     }
 }
diff --git a/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/MedTest.java b/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/MedTest.java
index eafcec7..2ee5b33 100644
--- a/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/MedTest.java
+++ b/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/MedTest.java
@@ -13,10 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.bgpio;
+package org.onosproject.bgpio.types;
 
 import org.junit.Test;
-import org.onosproject.bgpio.types.Med;
 
 import com.google.common.testing.EqualsTester;
 
@@ -32,9 +31,6 @@
 
     @Test
     public void testEquality() {
-        new EqualsTester()
-        .addEqualityGroup(attr1, sameAsAttr1)
-        .addEqualityGroup(attr2)
-        .testEquals();
+        new EqualsTester().addEqualityGroup(attr1, sameAsAttr1).addEqualityGroup(attr2).testEquals();
     }
 }
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/AdjRibIn.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/AdjRibIn.java
index 0444d69..9cbfbf6 100644
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/AdjRibIn.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/AdjRibIn.java
@@ -19,13 +19,13 @@
 import java.util.Map;
 import java.util.TreeMap;
 
-import org.onosproject.bgpio.protocol.BGPLSNlri;
-import org.onosproject.bgpio.protocol.linkstate.BGPLinkLSIdentifier;
+import org.onosproject.bgpio.protocol.BgpLSNlri;
+import org.onosproject.bgpio.protocol.linkstate.BgpLinkLSIdentifier;
 import org.onosproject.bgpio.protocol.linkstate.BgpLinkLsNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSIdentifier;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPPrefixIPv4LSNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPPrefixLSIdentifier;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSIdentifier;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.BgpPrefixIPv4LSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.BgpPrefixLSIdentifier;
 import org.onosproject.bgpio.protocol.linkstate.PathAttrNlriDetails;
 
 import com.google.common.base.MoreObjects;
@@ -34,16 +34,16 @@
  * Implementation of Adj-RIB-In for each peer.
  */
 public class AdjRibIn {
-    private Map<BGPNodeLSIdentifier, PathAttrNlriDetails> nodeTree = new TreeMap<>();
-    private Map<BGPLinkLSIdentifier, PathAttrNlriDetails> linkTree = new TreeMap<>();
-    private Map<BGPPrefixLSIdentifier, PathAttrNlriDetails> prefixTree = new TreeMap<>();
+    private Map<BgpNodeLSIdentifier, PathAttrNlriDetails> nodeTree = new TreeMap<>();
+    private Map<BgpLinkLSIdentifier, PathAttrNlriDetails> linkTree = new TreeMap<>();
+    private Map<BgpPrefixLSIdentifier, PathAttrNlriDetails> prefixTree = new TreeMap<>();
 
     /**
      * Returns the adjacency node.
      *
      * @return node adjacency RIB node
      */
-    public Map<BGPNodeLSIdentifier, PathAttrNlriDetails> nodeTree() {
+    public Map<BgpNodeLSIdentifier, PathAttrNlriDetails> nodeTree() {
         return nodeTree;
     }
 
@@ -52,7 +52,7 @@
      *
      * @return link adjacency RIB node
      */
-    public Map<BGPLinkLSIdentifier, PathAttrNlriDetails> linkTree() {
+    public Map<BgpLinkLSIdentifier, PathAttrNlriDetails> linkTree() {
         return linkTree;
     }
 
@@ -61,7 +61,7 @@
      *
      * @return prefix adjacency RIB node
      */
-    public Map<BGPPrefixLSIdentifier, PathAttrNlriDetails> prefixTree() {
+    public Map<BgpPrefixLSIdentifier, PathAttrNlriDetails> prefixTree() {
         return prefixTree;
     }
 
@@ -71,23 +71,23 @@
      * @param nlri NLRI Info
      * @param details has pathattribute , protocolID and identifier
      */
-    public void add(BGPLSNlri nlri, PathAttrNlriDetails details) {
-        if (nlri instanceof BGPNodeLSNlriVer4) {
-            BGPNodeLSIdentifier nodeLSIdentifier = ((BGPNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
+    public void add(BgpLSNlri nlri, PathAttrNlriDetails details) {
+        if (nlri instanceof BgpNodeLSNlriVer4) {
+            BgpNodeLSIdentifier nodeLSIdentifier = ((BgpNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
             if (nodeTree.containsKey(nodeLSIdentifier)) {
                 nodeTree.replace(nodeLSIdentifier, details);
             } else {
                 nodeTree.put(nodeLSIdentifier, details);
             }
         } else if (nlri instanceof BgpLinkLsNlriVer4) {
-            BGPLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
+            BgpLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
             if (linkTree.containsKey(linkLSIdentifier)) {
                 linkTree.replace(linkLSIdentifier, details);
             } else {
                 linkTree.put(linkLSIdentifier, details);
             }
-        } else if (nlri instanceof BGPPrefixIPv4LSNlriVer4) {
-            BGPPrefixLSIdentifier prefixIdentifier = ((BGPPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
+        } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) {
+            BgpPrefixLSIdentifier prefixIdentifier = ((BgpPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
             if (prefixTree.containsKey(prefixIdentifier)) {
                 prefixTree.replace(prefixIdentifier, details);
             } else {
@@ -101,19 +101,19 @@
      *
      * @param nlri NLRI Info
      */
-    public void remove(BGPLSNlri nlri) {
-        if (nlri instanceof BGPNodeLSNlriVer4) {
-            BGPNodeLSIdentifier nodeLSIdentifier = ((BGPNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
+    public void remove(BgpLSNlri nlri) {
+        if (nlri instanceof BgpNodeLSNlriVer4) {
+            BgpNodeLSIdentifier nodeLSIdentifier = ((BgpNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
             if (nodeTree.containsKey(nodeLSIdentifier)) {
                 nodeTree.remove(nodeLSIdentifier);
             }
         } else if (nlri instanceof BgpLinkLsNlriVer4) {
-            BGPLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
+            BgpLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
             if (linkTree.containsKey(linkLSIdentifier)) {
                 linkTree.remove(linkLSIdentifier);
             }
-        } else if (nlri instanceof BGPPrefixIPv4LSNlriVer4) {
-            BGPPrefixLSIdentifier prefixIdentifier = ((BGPPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
+        } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) {
+            BgpPrefixLSIdentifier prefixIdentifier = ((BgpPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
             if (prefixTree.containsKey(prefixIdentifier)) {
                 prefixTree.remove(prefixIdentifier);
             }
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPChannelHandler.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpChannelHandler.java
similarity index 80%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPChannelHandler.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpChannelHandler.java
index c467f3c..8754563 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPChannelHandler.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpChannelHandler.java
@@ -40,20 +40,20 @@
 import org.jboss.netty.handler.timeout.ReadTimeoutHandler;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
-import org.onosproject.bgp.controller.BGPCfg;
-import org.onosproject.bgp.controller.BGPController;
-import org.onosproject.bgp.controller.BGPId;
-import org.onosproject.bgp.controller.BGPPeer;
-import org.onosproject.bgp.controller.BGPPeerCfg;
-import org.onosproject.bgp.controller.impl.BGPControllerImpl.BGPPeerManagerImpl;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPFactory;
-import org.onosproject.bgpio.protocol.BGPMessage;
-import org.onosproject.bgpio.protocol.BGPOpenMsg;
-import org.onosproject.bgpio.protocol.BGPType;
-import org.onosproject.bgpio.protocol.BGPVersion;
-import org.onosproject.bgpio.types.BGPErrorType;
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgp.controller.BgpCfg;
+import org.onosproject.bgp.controller.BgpController;
+import org.onosproject.bgp.controller.BgpId;
+import org.onosproject.bgp.controller.BgpPeer;
+import org.onosproject.bgp.controller.BgpPeerCfg;
+import org.onosproject.bgp.controller.impl.BgpControllerImpl.BgpPeerManagerImpl;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpFactory;
+import org.onosproject.bgpio.protocol.BgpMessage;
+import org.onosproject.bgpio.protocol.BgpOpenMsg;
+import org.onosproject.bgpio.protocol.BgpType;
+import org.onosproject.bgpio.protocol.BgpVersion;
+import org.onosproject.bgpio.types.BgpErrorType;
+import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.types.FourOctetAsNumCapabilityTlv;
 import org.onosproject.bgpio.types.MultiProtocolExtnCapabilityTlv;
 import org.slf4j.Logger;
@@ -62,20 +62,20 @@
 /**
  * Channel handler deals with the bgp peer connection and dispatches messages from peer to the appropriate locations.
  */
-class BGPChannelHandler extends IdleStateAwareChannelHandler {
+class BgpChannelHandler extends IdleStateAwareChannelHandler {
 
-    private static final Logger log = LoggerFactory.getLogger(BGPChannelHandler.class);
+    private static final Logger log = LoggerFactory.getLogger(BgpChannelHandler.class);
     static final int BGP_MIN_HOLDTIME = 3;
     static final int BGP_MAX_KEEPALIVE_INTERVAL = 3;
-    private BGPPeer bgpPeer;
-    private BGPId thisbgpId;
+    private BgpPeer bgpPeer;
+    private BgpId thisbgpId;
     private Channel channel;
-    private BGPKeepAliveTimer keepAliveTimer = null;
+    private BgpKeepAliveTimer keepAliveTimer = null;
     private short peerHoldTime = 0;
     private short negotiatedHoldTime = 0;
     private long peerAsNum;
     private int peerIdentifier;
-    private BGPPacketStatsImpl bgpPacketStats;
+    private BgpPacketStatsImpl bgpPacketStats;
     static final int MAX_WRONG_COUNT_PACKET = 5;
     static final byte MULTI_PROTOCOL_EXTN_CAPA_TYPE = 1;
     static final byte FOUR_OCTET_AS_NUM_CAPA_TYPE = 65;
@@ -97,30 +97,30 @@
     // peer state for the older (still connected) peer
     private volatile Boolean duplicateBGPIdFound;
     // Indicates the bgp version used by this bgp peer
-    protected BGPVersion bgpVersion;
-    private BGPController bgpController;
-    protected BGPFactory factory4;
+    protected BgpVersion bgpVersion;
+    private BgpController bgpController;
+    protected BgpFactory factory4;
     private boolean isIbgpSession;
     private BgpSessionInfoImpl sessionInfo;
-    private BGPPeerManagerImpl peerManager;
+    private BgpPeerManagerImpl peerManager;
     private InetSocketAddress inetAddress;
     private IpAddress ipAddress;
     private SocketAddress address;
     private String peerAddr;
-    private BGPCfg bgpconfig;
+    private BgpCfg bgpconfig;
 
     /**
      * Create a new unconnected BGPChannelHandler.
      *
      * @param bgpController bgp controller
      */
-    BGPChannelHandler(BGPController bgpController) {
+    BgpChannelHandler(BgpController bgpController) {
         this.bgpController = bgpController;
-        this.peerManager = (BGPPeerManagerImpl) bgpController.peerManager();
+        this.peerManager = (BgpPeerManagerImpl) bgpController.peerManager();
         this.state = ChannelState.IDLE;
-        this.factory4 = Controller.getBGPMessageFactory4();
+        this.factory4 = Controller.getBgpMessageFactory4();
         this.duplicateBGPIdFound = Boolean.FALSE;
-        this.bgpPacketStats = new BGPPacketStatsImpl();
+        this.bgpPacketStats = new BgpPacketStatsImpl();
         this.bgpconfig = bgpController.getConfig();
     }
 
@@ -147,25 +147,25 @@
 
         OPENSENT(false) {
             @Override
-            void processBGPMessage(BGPChannelHandler h, BGPMessage m) throws IOException, BGPParseException {
+            void processBgpMessage(BgpChannelHandler h, BgpMessage m) throws IOException, BgpParseException {
                 log.debug("message received in OPENSENT state");
                 // check for OPEN message
-                if (m.getType() != BGPType.OPEN) {
+                if (m.getType() != BgpType.OPEN) {
                     // When the message type is not keep alive message increment the wrong packet statistics
-                    h.processUnknownMsg(BGPErrorType.FINITE_STATE_MACHINE_ERROR,
-                                        BGPErrorType.RECEIVE_UNEXPECTED_MESSAGE_IN_OPENSENT_STATE,
+                    h.processUnknownMsg(BgpErrorType.FINITE_STATE_MACHINE_ERROR,
+                                        BgpErrorType.RECEIVE_UNEXPECTED_MESSAGE_IN_OPENSENT_STATE,
                                         m.getType().getType());
                     log.debug("Message is not OPEN message");
                 } else {
                     log.debug("Sending keep alive message in OPENSENT state");
                     h.bgpPacketStats.addInPacket();
 
-                    BGPOpenMsg pOpenmsg = (BGPOpenMsg) m;
+                    BgpOpenMsg pOpenmsg = (BgpOpenMsg) m;
                     h.peerIdentifier = pOpenmsg.getBgpId();
 
                     // validate capabilities and open msg
                     if (h.openMsgValidation(h, pOpenmsg)) {
-                        if (h.connectionCollisionDetection(BGPPeerCfg.State.OPENCONFIRM,
+                        if (h.connectionCollisionDetection(BgpPeerCfg.State.OPENCONFIRM,
                                                            h.peerIdentifier, h.peerAddr)) {
                             h.channel.close();
                             return;
@@ -181,7 +181,7 @@
                         if (h.peerHoldTime < h.bgpconfig.getHoldTime()) {
                             h.channel.getPipeline().replace("holdTime",
                                                             "holdTime",
-                                                            new ReadTimeoutHandler(BGPPipelineFactory.TIMER,
+                                                            new ReadTimeoutHandler(BgpPipelineFactory.TIMER,
                                                                                    h.peerHoldTime));
                         }
 
@@ -195,31 +195,31 @@
                     h.sendKeepAliveMessage();
                     h.bgpPacketStats.addOutPacket();
                     h.setState(OPENCONFIRM);
-                    h.bgpconfig.setPeerConnState(h.peerAddr, BGPPeerCfg.State.OPENCONFIRM);
+                    h.bgpconfig.setPeerConnState(h.peerAddr, BgpPeerCfg.State.OPENCONFIRM);
                 }
             }
         },
 
         OPENWAIT(false) {
             @Override
-            void processBGPMessage(BGPChannelHandler h, BGPMessage m) throws IOException, BGPParseException {
+            void processBgpMessage(BgpChannelHandler h, BgpMessage m) throws IOException, BgpParseException {
                 log.debug("Message received in OPEN WAIT State");
 
                 // check for open message
-                if (m.getType() != BGPType.OPEN) {
+                if (m.getType() != BgpType.OPEN) {
                     // When the message type is not open message increment the wrong packet statistics
-                    h.processUnknownMsg(BGPErrorType.FINITE_STATE_MACHINE_ERROR, BGPErrorType.UNSPECIFIED_ERROR,
+                    h.processUnknownMsg(BgpErrorType.FINITE_STATE_MACHINE_ERROR, BgpErrorType.UNSPECIFIED_ERROR,
                                         m.getType().getType());
                     log.debug("Message is not OPEN message");
                 } else {
                     h.bgpPacketStats.addInPacket();
 
-                    BGPOpenMsg pOpenmsg = (BGPOpenMsg) m;
+                    BgpOpenMsg pOpenmsg = (BgpOpenMsg) m;
                     h.peerIdentifier = pOpenmsg.getBgpId();
 
                     // Validate open message
                     if (h.openMsgValidation(h, pOpenmsg)) {
-                        if (h.connectionCollisionDetection(BGPPeerCfg.State.OPENSENT,
+                        if (h.connectionCollisionDetection(BgpPeerCfg.State.OPENSENT,
                                                            h.peerIdentifier, h.peerAddr)) {
                             h.channel.close();
                             return;
@@ -235,7 +235,7 @@
                         if (h.peerHoldTime < h.bgpconfig.getHoldTime()) {
                             h.channel.getPipeline().replace("holdTime",
                                                             "holdTime",
-                                                            new ReadTimeoutHandler(BGPPipelineFactory.TIMER,
+                                                            new ReadTimeoutHandler(BgpPipelineFactory.TIMER,
                                                                                    h.peerHoldTime));
                         }
 
@@ -247,7 +247,7 @@
                         h.sendHandshakeOpenMessage();
                         h.bgpPacketStats.addOutPacket();
                         h.setState(OPENCONFIRM);
-                        h.bgpconfig.setPeerConnState(h.peerAddr, BGPPeerCfg.State.OPENCONFIRM);
+                        h.bgpconfig.setPeerConnState(h.peerAddr, BgpPeerCfg.State.OPENCONFIRM);
                     }
                 }
             }
@@ -255,13 +255,13 @@
 
         OPENCONFIRM(false) {
             @Override
-            void processBGPMessage(BGPChannelHandler h, BGPMessage m) throws IOException, BGPParseException {
+            void processBgpMessage(BgpChannelHandler h, BgpMessage m) throws IOException, BgpParseException {
                 log.debug("Message received in OPENCONFIRM state");
                 // check for keep alive message
-                if (m.getType() != BGPType.KEEP_ALIVE) {
+                if (m.getType() != BgpType.KEEP_ALIVE) {
                     // When the message type is not keep alive message handle the wrong packet
-                    h.processUnknownMsg(BGPErrorType.FINITE_STATE_MACHINE_ERROR,
-                                        BGPErrorType.RECEIVE_UNEXPECTED_MESSAGE_IN_OPENCONFIRM_STATE,
+                    h.processUnknownMsg(BgpErrorType.FINITE_STATE_MACHINE_ERROR,
+                                        BgpErrorType.RECEIVE_UNEXPECTED_MESSAGE_IN_OPENCONFIRM_STATE,
                                         m.getType().getType());
                     log.debug("Message is not KEEPALIVE message");
                 } else {
@@ -271,7 +271,7 @@
                     log.debug("Sending keep alive message in OPENCONFIRM state");
 
                     final InetSocketAddress inetAddress = (InetSocketAddress) h.address;
-                    h.thisbgpId = BGPId.bgpId(IpAddress.valueOf(inetAddress.getAddress()));
+                    h.thisbgpId = BgpId.bgpId(IpAddress.valueOf(inetAddress.getAddress()));
 
                     // set session parameters
                     h.negotiatedHoldTime = (h.peerHoldTime < h.bgpconfig.getHoldTime()) ? h.peerHoldTime
@@ -279,7 +279,7 @@
                     h.sessionInfo = new BgpSessionInfoImpl(h.thisbgpId, h.bgpVersion, h.peerAsNum, h.peerHoldTime,
                                                            h.peerIdentifier, h.negotiatedHoldTime, h.isIbgpSession);
 
-                    h.bgpPeer = h.peerManager.getBGPPeerInstance(h.bgpController, h.sessionInfo, h.bgpPacketStats);
+                    h.bgpPeer = h.peerManager.getBgpPeerInstance(h.bgpController, h.sessionInfo, h.bgpPacketStats);
                     // set the status of bgp as connected
                     h.bgpPeer.setConnected(true);
                     h.bgpPeer.setChannel(h.channel);
@@ -291,7 +291,7 @@
                      */
 
                     if (h.negotiatedHoldTime != 0) {
-                        h.keepAliveTimer = new BGPKeepAliveTimer(h,
+                        h.keepAliveTimer = new BgpKeepAliveTimer(h,
                                                                 (h.negotiatedHoldTime / BGP_MAX_KEEPALIVE_INTERVAL));
                     } else {
                         h.sendKeepAliveMessage();
@@ -306,7 +306,7 @@
                         disconnectDuplicate(h);
                     } else {
                         h.setState(ESTABLISHED);
-                        h.bgpconfig.setPeerConnState(h.peerAddr, BGPPeerCfg.State.ESTABLISHED);
+                        h.bgpconfig.setPeerConnState(h.peerAddr, BgpPeerCfg.State.ESTABLISHED);
                     }
                 }
             }
@@ -314,7 +314,7 @@
 
         ESTABLISHED(true) {
             @Override
-            void processBGPMessage(BGPChannelHandler h, BGPMessage m) throws IOException, BGPParseException {
+            void processBgpMessage(BgpChannelHandler h, BgpMessage m) throws IOException, BgpParseException {
                 log.debug("Message received in established state " + m.getType());
                 // dispatch the message
                 h.dispatchMessage(m);
@@ -341,7 +341,7 @@
          *
          * @param h channel handler
          */
-        protected void disconnectDuplicate(BGPChannelHandler h) {
+        protected void disconnectDuplicate(BgpChannelHandler h) {
             log.error("Duplicated BGP IP or incompleted cleanup - " + "" + "disconnecting channel {}",
                       h.getPeerInfoString());
             h.duplicateBGPIdFound = Boolean.TRUE;
@@ -353,8 +353,8 @@
             this.handshakeComplete = handshakeComplete;
         }
 
-        void processBGPMessage(BGPChannelHandler bgpChannelHandler, BGPMessage pm)
-                throws IOException, BGPParseException {
+        void processBgpMessage(BgpChannelHandler bgpChannelHandler, BgpMessage pm)
+                throws IOException, BgpParseException {
             // TODO Auto-generated method stub
             log.debug("BGP message stub");
         }
@@ -377,8 +377,8 @@
         }
 
         // Connection should establish only if local ip and Autonomous system number is configured.
-        if (bgpconfig.getState() != BGPCfg.State.IP_AS_CONFIGURED) {
-            sendNotification(BGPErrorType.CEASE, BGPErrorType.CONNECTION_REJECTED, null);
+        if (bgpconfig.getState() != BgpCfg.State.IP_AS_CONFIGURED) {
+            sendNotification(BgpErrorType.CEASE, BgpErrorType.CONNECTION_REJECTED, null);
             channel.close();
             log.info("BGP local AS and router ID not configured");
             return;
@@ -390,13 +390,13 @@
         // if peer is not configured disconnect session
         if (!bgpconfig.isPeerConfigured(peerAddr)) {
             log.debug("Peer is not configured {}", peerAddr);
-            sendNotification(BGPErrorType.CEASE, BGPErrorType.CONNECTION_REJECTED, null);
+            sendNotification(BgpErrorType.CEASE, BgpErrorType.CONNECTION_REJECTED, null);
             channel.close();
             return;
         }
 
         // if connection is already established close channel
-        if (peerManager.isPeerConnected(BGPId.bgpId(IpAddress.valueOf(peerAddr)))) {
+        if (peerManager.isPeerConnected(BgpId.bgpId(IpAddress.valueOf(peerAddr)))) {
             log.debug("Duplicate connection received, peer {}", peerAddr);
             channel.close();
             return;
@@ -412,7 +412,7 @@
             sendHandshakeOpenMessage();
             bgpPacketStats.addOutPacket();
             setState(ChannelState.OPENSENT);
-            bgpconfig.setPeerConnState(peerAddr, BGPPeerCfg.State.OPENSENT);
+            bgpconfig.setPeerConnState(peerAddr, BgpPeerCfg.State.OPENSENT);
         }
     }
 
@@ -446,20 +446,20 @@
                 // Retry connection if connection is lost to bgp speaker/peer
                 if ((channel != null) && (null != channel.getPipeline().get("ActiveHandler"))) {
                     BgpConnectPeerImpl connectPeer;
-                    BGPPeerCfg.State peerCfgState;
+                    BgpPeerCfg.State peerCfgState;
 
                     peerCfgState = bgpconfig.getPeerConnState(peerAddr);
                     // on session disconnect using configuration, do not retry
-                    if (!peerCfgState.equals(BGPPeerCfg.State.IDLE)) {
+                    if (!peerCfgState.equals(BgpPeerCfg.State.IDLE)) {
                         log.debug("Connection reset by peer, retry, STATE:{}", peerCfgState);
-                        BGPPeerConfig peerConfig = (BGPPeerConfig) bgpconfig.displayPeers(peerAddr);
+                        BgpPeerConfig peerConfig = (BgpPeerConfig) bgpconfig.displayPeers(peerAddr);
 
-                        bgpconfig.setPeerConnState(peerAddr, BGPPeerCfg.State.IDLE);
+                        bgpconfig.setPeerConnState(peerAddr, BgpPeerCfg.State.IDLE);
                         connectPeer = new BgpConnectPeerImpl(bgpController, peerAddr, Controller.getBgpPortNum());
                         peerConfig.setConnectPeer(connectPeer);
                     }
                 } else {
-                    bgpconfig.setPeerConnState(peerAddr, BGPPeerCfg.State.IDLE);
+                    bgpconfig.setPeerConnState(peerAddr, BgpPeerCfg.State.IDLE);
                 }
             } else {
                 // A duplicate was disconnected on this ChannelHandler,
@@ -473,7 +473,7 @@
                 keepAliveTimer.getKeepAliveTimer().cancel();
             }
         } else {
-            bgpconfig.setPeerConnState(peerAddr, BGPPeerCfg.State.IDLE);
+            bgpconfig.setPeerConnState(peerAddr, BgpPeerCfg.State.IDLE);
             log.warn("No bgp ip in channelHandler registered for " + "disconnected peer {}", getPeerInfoString());
         }
     }
@@ -487,14 +487,14 @@
             if ((ChannelState.OPENWAIT == state) || (ChannelState.OPENSENT == state)) {
 
                 // When ReadTimeout timer is expired in OPENWAIT/OPENSENT state, it is considered
-                sendNotification(BGPErrorType.HOLD_TIMER_EXPIRED, (byte) 0, null);
+                sendNotification(BgpErrorType.HOLD_TIMER_EXPIRED, (byte) 0, null);
                 channel.close();
                 state = ChannelState.IDLE;
                 return;
             } else if (ChannelState.OPENCONFIRM == state) {
 
                 // When ReadTimeout timer is expired in OPENCONFIRM state.
-                sendNotification(BGPErrorType.HOLD_TIMER_EXPIRED, (byte) 0, null);
+                sendNotification(BgpErrorType.HOLD_TIMER_EXPIRED, (byte) 0, null);
                 channel.close();
                 state = ChannelState.IDLE;
                 return;
@@ -508,9 +508,9 @@
                 log.debug("StackTrace for previous Exception: ", e.getCause());
             }
             channel.close();
-        } else if (e.getCause() instanceof BGPParseException) {
+        } else if (e.getCause() instanceof BgpParseException) {
             byte[] data = new byte[] {};
-            BGPParseException errMsg = (BGPParseException) e.getCause();
+            BgpParseException errMsg = (BgpParseException) e.getCause();
             byte errorCode = errMsg.getErrorCode();
             byte errorSubCode = errMsg.getErrorSubCode();
             ChannelBuffer tempCb = errMsg.getData();
@@ -537,13 +537,13 @@
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
         if (e.getMessage() instanceof List) {
             @SuppressWarnings("Unchecked")
-            List<BGPMessage> msglist = (List<BGPMessage>) e.getMessage();
-            for (BGPMessage pm : msglist) {
+            List<BgpMessage> msglist = (List<BgpMessage>) e.getMessage();
+            for (BgpMessage pm : msglist) {
                 // Do the actual packet processing
-                state.processBGPMessage(this, pm);
+                state.processBgpMessage(this, pm);
             }
         } else {
-            state.processBGPMessage(this, (BGPMessage) e.getMessage());
+            state.processBgpMessage(this, (BgpMessage) e.getMessage());
         }
     }
 
@@ -554,22 +554,22 @@
      * @param peerIdentifier BGP peer identifier
      * @param peerAddr BGP peer address
      * @return true if bgp spreakers initiated connection
-     * @throws BGPParseException on error while procession collision detection
+     * @throws BgpParseException on error while procession collision detection
      * @throws IOException on error while procession collision detection
      */
-    public boolean connectionCollisionDetection(BGPPeerCfg.State state, int peerIdentifier, String peerAddr)
-            throws IOException, BGPParseException {
+    public boolean connectionCollisionDetection(BgpPeerCfg.State state, int peerIdentifier, String peerAddr)
+            throws IOException, BgpParseException {
         /*
          * RFC 4271, Section 6.8, Based on the value of the BGP identifier, a convention is established for detecting
          * which BGP connection is to be preserved when a collision occurs. The convention is to compare the BGP
          * Identifiers of the peers involved in the collision and to retain only the connection initiated by the BGP
          * speaker with the higher-valued BGP Identifier..
          */
-        BGPPeerCfg.State currentState = bgpconfig.getPeerConnState(peerAddr);
+        BgpPeerCfg.State currentState = bgpconfig.getPeerConnState(peerAddr);
         if (currentState.equals(state)) {
             if (((Ip4Address.valueOf(bgpconfig.getRouterId())).compareTo(Ip4Address.valueOf(peerIdentifier))) > 0) {
                 // send notification
-                sendNotification(BGPErrorType.CEASE, BGPErrorType.CONNECTION_COLLISION_RESOLUTION, null);
+                sendNotification(BgpErrorType.CEASE, BgpErrorType.CONNECTION_COLLISION_RESOLUTION, null);
                 log.debug("Connection collision detected, local id: {},  peer id: {}, peer state:{}, in state:{}",
                           (Ip4Address.valueOf(bgpconfig.getRouterId())), (Ip4Address.valueOf(peerIdentifier)),
                           currentState, state);
@@ -605,9 +605,9 @@
      * To handle the BGP message.
      *
      * @param m bgp message
-     * @throws BGPParseException throw exception
+     * @throws BgpParseException throw exception
      */
-    private void dispatchMessage(BGPMessage m) throws BGPParseException {
+    private void dispatchMessage(BgpMessage m) throws BgpParseException {
         bgpPacketStats.addInPacket();
         bgpController.processBGPPacket(thisbgpId, m);
     }
@@ -648,20 +648,20 @@
      *
      * @return packet statistics
      */
-    public BGPPacketStatsImpl getBgpPacketStats() {
+    public BgpPacketStatsImpl getBgpPacketStats() {
         return bgpPacketStats;
     }
 
     /**
      * Send handshake open message to the peer.
      *
-     * @throws IOException, BGPParseException
+     * @throws IOException, BgpParseException
      */
-    private void sendHandshakeOpenMessage() throws IOException, BGPParseException {
+    private void sendHandshakeOpenMessage() throws IOException, BgpParseException {
         int bgpId;
 
         bgpId = Ip4Address.valueOf(bgpconfig.getRouterId()).toInt();
-        BGPMessage msg = factory4.openMessageBuilder().setAsNumber((short) bgpconfig.getAsNumber())
+        BgpMessage msg = factory4.openMessageBuilder().setAsNumber((short) bgpconfig.getAsNumber())
                 .setHoldTime(bgpconfig.getHoldTime()).setBgpId(bgpId).setLsCapabilityTlv(bgpconfig.getLsCapability())
                 .setLargeAsCapabilityTlv(bgpconfig.getLargeASCapability()).build();
         log.debug("Sending open message to {}", channel.getRemoteAddress());
@@ -675,11 +675,11 @@
      * @param errorCode error code send in notification
      * @param errorSubCode sub error code send in notification
      * @param data data to send in notification
-     * @throws IOException, BGPParseException while building message
+     * @throws IOException, BgpParseException while building message
      */
     private void sendNotification(byte errorCode, byte errorSubCode, byte[] data)
-                                                                           throws IOException, BGPParseException {
-        BGPMessage msg = factory4.notificationMessageBuilder().setErrorCode(errorCode)
+                                                                           throws IOException, BgpParseException {
+        BgpMessage msg = factory4.notificationMessageBuilder().setErrorCode(errorCode)
                                                               .setErrorSubCode(errorSubCode).setData(data).build();
         log.debug("Sending notification message to {}", channel.getRemoteAddress());
         channel.write(Collections.singletonList(msg));
@@ -689,11 +689,11 @@
      * Send keep alive message.
      *
      * @throws IOException when channel is disconnected
-     * @throws BGPParseException while building keep alive message
+     * @throws BgpParseException while building keep alive message
      */
-    synchronized void sendKeepAliveMessage() throws IOException, BGPParseException {
+    synchronized void sendKeepAliveMessage() throws IOException, BgpParseException {
 
-        BGPMessage msg = factory4.keepaliveMessageBuilder().build();
+        BgpMessage msg = factory4.keepaliveMessageBuilder().build();
         log.debug("Sending keepalive message to {}", channel.getRemoteAddress());
         channel.write(Collections.singletonList(msg));
     }
@@ -704,10 +704,10 @@
      * @param errorCode error code
      * @param errorSubCode error sub code
      * @param data message type
-     * @throws BGPParseException while processing error messsage
+     * @throws BgpParseException while processing error messsage
      * @throws IOException while processing error message
      */
-    public void processUnknownMsg(byte errorCode, byte errorSubCode, byte data) throws BGPParseException, IOException {
+    public void processUnknownMsg(byte errorCode, byte errorSubCode, byte data) throws BgpParseException, IOException {
         log.debug("UNKNOWN message received");
         byte[] byteArray = new byte[1];
         byteArray[0] = data;
@@ -721,26 +721,26 @@
      * @param h channel handler
      * @param openMsg open message
      * @return true if valid message, otherwise false
-     * @throws BGPParseException throw exception
+     * @throws BgpParseException throw exception
      */
-    public boolean openMsgValidation(BGPChannelHandler h, BGPOpenMsg openMsg) throws BGPParseException {
+    public boolean openMsgValidation(BgpChannelHandler h, BgpOpenMsg openMsg) throws BgpParseException {
         boolean result;
 
         // Validate BGP ID
         result = bgpIdValidation(openMsg);
         if (!result) {
-            throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR, BGPErrorType.BAD_BGP_IDENTIFIER, null);
+            throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR, BgpErrorType.BAD_BGP_IDENTIFIER, null);
         }
 
         // Validate AS number
         result = asNumberValidation(h, openMsg);
         if (!result) {
-            throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR, BGPErrorType.BAD_PEER_AS, null);
+            throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR, BgpErrorType.BAD_PEER_AS, null);
         }
 
         // Validate hold timer
         if ((openMsg.getHoldTime() != 0) && (openMsg.getHoldTime() < BGP_MIN_HOLDTIME)) {
-            throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR, BGPErrorType.UNACCEPTABLE_HOLD_TIME, null);
+            throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR, BgpErrorType.UNACCEPTABLE_HOLD_TIME, null);
         }
 
         // Validate capabilities
@@ -754,25 +754,25 @@
      * @param h channel handler
      * @param openmsg open message
      * @return success or failure
-     * @throws BGPParseException
+     * @throws BgpParseException
      */
-    private boolean capabilityValidation(BGPChannelHandler h, BGPOpenMsg openmsg) throws BGPParseException {
+    private boolean capabilityValidation(BgpChannelHandler h, BgpOpenMsg openmsg) throws BgpParseException {
         log.debug("capabilityValidation");
 
         boolean isMultiProtocolcapabilityExists = false;
         boolean isFourOctetCapabilityExits = false;
         int capAsNum = 0;
 
-        List<BGPValueType> capabilityTlv = openmsg.getCapabilityTlv();
-        ListIterator<BGPValueType> listIterator = capabilityTlv.listIterator();
-        List<BGPValueType> unSupportedCapabilityTlv = new LinkedList<>();
-        ListIterator<BGPValueType> unSupportedCaplistIterator = unSupportedCapabilityTlv.listIterator();
-        BGPValueType tempTlv;
+        List<BgpValueType> capabilityTlv = openmsg.getCapabilityTlv();
+        ListIterator<BgpValueType> listIterator = capabilityTlv.listIterator();
+        List<BgpValueType> unSupportedCapabilityTlv = new LinkedList<>();
+        ListIterator<BgpValueType> unSupportedCaplistIterator = unSupportedCapabilityTlv.listIterator();
+        BgpValueType tempTlv;
         boolean isLargeAsCapabilityCfg = h.bgpconfig.getLargeASCapability();
         boolean isLsCapabilityCfg = h.bgpconfig.getLsCapability();
 
         while (listIterator.hasNext()) {
-            BGPValueType tlv = listIterator.next();
+            BgpValueType tlv = listIterator.next();
             if (tlv.getType() == MULTI_PROTOCOL_EXTN_CAPA_TYPE) {
                 isMultiProtocolcapabilityExists = true;
             }
@@ -785,11 +785,11 @@
         if (isFourOctetCapabilityExits) {
             if (capAsNum > MAX_AS2_NUM) {
                 if (openmsg.getAsNumber() != AS_TRANS) {
-                    throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR, BGPErrorType.BAD_PEER_AS, null);
+                    throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR, BgpErrorType.BAD_PEER_AS, null);
                 }
             } else {
                 if (capAsNum != openmsg.getAsNumber()) {
-                    throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR, BGPErrorType.BAD_PEER_AS, null);
+                    throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR, BgpErrorType.BAD_PEER_AS, null);
                 }
             }
         }
@@ -811,10 +811,10 @@
         if (unSupportedCaplistIterator.hasNext()) {
             ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
             while (unSupportedCaplistIterator.hasNext()) {
-                BGPValueType tlv = unSupportedCaplistIterator.next();
+                BgpValueType tlv = unSupportedCaplistIterator.next();
                 tlv.write(buffer);
             }
-            throw new BGPParseException(BGPErrorType.OPEN_MESSAGE_ERROR, BGPErrorType.UNSUPPORTED_CAPABILITY, buffer);
+            throw new BgpParseException(BgpErrorType.OPEN_MESSAGE_ERROR, BgpErrorType.UNSUPPORTED_CAPABILITY, buffer);
         } else {
             return true;
         }
@@ -827,18 +827,18 @@
      * @param openMsg open message
      * @return true or false
      */
-    private boolean asNumberValidation(BGPChannelHandler h, BGPOpenMsg openMsg) {
+    private boolean asNumberValidation(BgpChannelHandler h, BgpOpenMsg openMsg) {
         log.debug("AS Num validation");
 
         int capAsNum = 0;
         boolean isFourOctetCapabilityExits = false;
 
-        BGPPeerCfg peerCfg = h.bgpconfig.displayPeers(peerAddr);
-        List<BGPValueType> capabilityTlv = openMsg.getCapabilityTlv();
-        ListIterator<BGPValueType> listIterator = capabilityTlv.listIterator();
+        BgpPeerCfg peerCfg = h.bgpconfig.displayPeers(peerAddr);
+        List<BgpValueType> capabilityTlv = openMsg.getCapabilityTlv();
+        ListIterator<BgpValueType> listIterator = capabilityTlv.listIterator();
 
         while (listIterator.hasNext()) {
-            BGPValueType tlv = listIterator.next();
+            BgpValueType tlv = listIterator.next();
             if (tlv.getType() == FOUR_OCTET_AS_NUM_CAPA_TYPE) {
                 isFourOctetCapabilityExits = true;
                 capAsNum = ((FourOctetAsNumCapabilityTlv) tlv).getInt();
@@ -894,7 +894,7 @@
      * @param openMsg open message
      * @return true or false
      */
-    private boolean bgpIdValidation(BGPOpenMsg openMsg) {
+    private boolean bgpIdValidation(BgpOpenMsg openMsg) {
         String openMsgBgpId = Ip4Address.valueOf(openMsg.getBgpId()).toString();
 
         InetAddress ipAddress;
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPConfig.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConfig.java
similarity index 83%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPConfig.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConfig.java
index 56877a1..716cc0c 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPConfig.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConfig.java
@@ -21,17 +21,17 @@
 import java.util.TreeMap;
 
 import org.onlab.packet.Ip4Address;
-import org.onosproject.bgp.controller.BGPCfg;
-import org.onosproject.bgp.controller.BGPPeerCfg;
+import org.onosproject.bgp.controller.BgpCfg;
+import org.onosproject.bgp.controller.BgpPeerCfg;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Provides BGP configuration of this BGP speaker.
  */
-public class BGPConfig implements BGPCfg {
+public class BgpConfig implements BgpCfg {
 
-    protected static final Logger log = LoggerFactory.getLogger(BGPConfig.class);
+    protected static final Logger log = LoggerFactory.getLogger(BgpConfig.class);
 
     private static final short DEFAULT_HOLD_TIMER = 120;
     private static final short DEFAULT_CONN_RETRY_TIME = 120;
@@ -47,12 +47,12 @@
     private int maxConnRetryCount;
 
     private Ip4Address routerId = null;
-    private TreeMap<String, BGPPeerCfg> bgpPeerTree = new TreeMap<>();
+    private TreeMap<String, BgpPeerCfg> bgpPeerTree = new TreeMap<>();
 
     /**
      * Constructor to initialize the values.
      */
-    public BGPConfig() {
+    public BgpConfig() {
 
         this.holdTime = DEFAULT_HOLD_TIMER;
         this.maxConnRetryTime = DEFAULT_CONN_RETRY_TIME;
@@ -142,13 +142,13 @@
 
     @Override
     public boolean addPeer(String routerid, int remoteAs, short holdTime) {
-        BGPPeerConfig lspeer = new BGPPeerConfig();
+        BgpPeerConfig lspeer = new BgpPeerConfig();
         if (this.bgpPeerTree.get(routerid) == null) {
 
             lspeer.setPeerRouterId(routerid);
             lspeer.setAsNumber(remoteAs);
             lspeer.setHoldtime(holdTime);
-            lspeer.setState(BGPPeerCfg.State.IDLE);
+            lspeer.setState(BgpPeerCfg.State.IDLE);
             lspeer.setSelfInnitConnection(false);
 
             if (this.getAsNumber() == remoteAs) {
@@ -168,7 +168,7 @@
 
     @Override
     public boolean connectPeer(String routerid) {
-        BGPPeerCfg lspeer = this.bgpPeerTree.get(routerid);
+        BgpPeerCfg lspeer = this.bgpPeerTree.get(routerid);
 
         if (lspeer != null) {
             lspeer.setSelfInnitConnection(true);
@@ -181,7 +181,7 @@
 
     @Override
     public boolean removePeer(String routerid) {
-        BGPPeerCfg lspeer = this.bgpPeerTree.get(routerid);
+        BgpPeerCfg lspeer = this.bgpPeerTree.get(routerid);
 
         if (lspeer != null) {
 
@@ -200,12 +200,12 @@
 
     @Override
     public boolean disconnectPeer(String routerid) {
-        BGPPeerCfg lspeer = this.bgpPeerTree.get(routerid);
+        BgpPeerCfg lspeer = this.bgpPeerTree.get(routerid);
 
         if (lspeer != null) {
 
             //TODO DISCONNECT PEER
-            lspeer.setState(BGPPeerCfg.State.IDLE);
+            lspeer.setState(BgpPeerCfg.State.IDLE);
             lspeer.setSelfInnitConnection(false);
             log.debug("Disconnected : " + routerid + " successfully");
 
@@ -217,8 +217,8 @@
     }
 
     @Override
-    public void setPeerConnState(String routerid, BGPPeerCfg.State state) {
-        BGPPeerCfg lspeer = this.bgpPeerTree.get(routerid);
+    public void setPeerConnState(String routerid, BgpPeerCfg.State state) {
+        BgpPeerCfg lspeer = this.bgpPeerTree.get(routerid);
 
         if (lspeer != null) {
             lspeer.setState(state);
@@ -232,21 +232,21 @@
     }
 
     @Override
-    public BGPPeerCfg.State getPeerConnState(String routerid) {
-        BGPPeerCfg lspeer = this.bgpPeerTree.get(routerid);
+    public BgpPeerCfg.State getPeerConnState(String routerid) {
+        BgpPeerCfg lspeer = this.bgpPeerTree.get(routerid);
 
         if (lspeer != null) {
             return lspeer.getState();
         } else {
-            return BGPPeerCfg.State.INVALID; //No instance
+            return BgpPeerCfg.State.INVALID; //No instance
         }
     }
 
     @Override
     public boolean isPeerConnectable(String routerid) {
-        BGPPeerCfg lspeer = this.bgpPeerTree.get(routerid);
+        BgpPeerCfg lspeer = this.bgpPeerTree.get(routerid);
 
-        if ((lspeer != null) && lspeer.getState().equals(BGPPeerCfg.State.IDLE)) {
+        if ((lspeer != null) && lspeer.getState().equals(BgpPeerCfg.State.IDLE)) {
             return true;
         }
 
@@ -254,21 +254,21 @@
     }
 
     @Override
-    public TreeMap<String, BGPPeerCfg> getPeerTree() {
+    public TreeMap<String, BgpPeerCfg> getPeerTree() {
         return this.bgpPeerTree;
     }
 
     @Override
-    public TreeMap<String, BGPPeerCfg> displayPeers() {
+    public TreeMap<String, BgpPeerCfg> displayPeers() {
         if (this.bgpPeerTree.isEmpty()) {
             log.debug("There are no BGP peers");
         } else {
-            Set<Entry<String, BGPPeerCfg>> set = this.bgpPeerTree.entrySet();
-            Iterator<Entry<String, BGPPeerCfg>> list = set.iterator();
-            BGPPeerCfg lspeer;
+            Set<Entry<String, BgpPeerCfg>> set = this.bgpPeerTree.entrySet();
+            Iterator<Entry<String, BgpPeerCfg>> list = set.iterator();
+            BgpPeerCfg lspeer;
 
             while (list.hasNext()) {
-                Entry<String, BGPPeerCfg> me = list.next();
+                Entry<String, BgpPeerCfg> me = list.next();
                 lspeer = me.getValue();
                 log.debug("Peer neighbor IP :" + me.getKey());
                 log.debug(", AS Number : " + lspeer.getAsNumber());
@@ -280,10 +280,10 @@
     }
 
     @Override
-    public BGPPeerCfg displayPeers(String routerid) {
+    public BgpPeerCfg displayPeers(String routerid) {
 
         if (this.bgpPeerTree.isEmpty()) {
-            log.debug("There are no BGP peers");
+            log.debug("There are no Bgp peers");
         } else {
             return this.bgpPeerTree.get(routerid);
         }
@@ -312,7 +312,7 @@
 
     @Override
     public boolean isPeerConfigured(String routerid) {
-        BGPPeerCfg lspeer = this.bgpPeerTree.get(routerid);
+        BgpPeerCfg lspeer = this.bgpPeerTree.get(routerid);
         return (lspeer != null) ? true : false;
     }
 
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConnectPeerImpl.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConnectPeerImpl.java
index b6d88fc..27db618 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConnectPeerImpl.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpConnectPeerImpl.java
@@ -21,9 +21,9 @@
 import org.jboss.netty.channel.ChannelFuture;
 import org.jboss.netty.channel.ChannelFutureListener;
 import org.jboss.netty.channel.ChannelPipelineFactory;
-import org.onosproject.bgp.controller.BGPCfg;
-import org.onosproject.bgp.controller.BGPController;
-import org.onosproject.bgp.controller.BGPPeerCfg;
+import org.onosproject.bgp.controller.BgpCfg;
+import org.onosproject.bgp.controller.BgpController;
+import org.onosproject.bgp.controller.BgpPeerCfg;
 import org.onosproject.bgp.controller.BgpConnectPeer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,7 +42,7 @@
     private int connectRetryTime;
     private ChannelPipelineFactory pfact;
     private ClientBootstrap peerBootstrap;
-    private BGPCfg bgpconfig;
+    private BgpCfg bgpconfig;
 
     /**
      * Initialize timer and initiate pipeline factory.
@@ -51,10 +51,10 @@
      * @param remoteHost remote host to connect
      * @param remotePort remote port to connect
      */
-    public BgpConnectPeerImpl(BGPController bgpController, String remoteHost, int remotePort) {
+    public BgpConnectPeerImpl(BgpController bgpController, String remoteHost, int remotePort) {
 
         this.bgpconfig = bgpController.getConfig();
-        this.pfact = new BGPPipelineFactory(bgpController, false);
+        this.pfact = new BgpPipelineFactory(bgpController, false);
         this.peerBootstrap = Controller.peerBootstrap();
         this.peerBootstrap.setPipelineFactory(pfact);
         this.peerHost = remoteHost;
@@ -98,12 +98,12 @@
             InetSocketAddress connectToSocket = new InetSocketAddress(peerHost, peerPort);
 
             try {
-                bgpconfig.setPeerConnState(peerHost, BGPPeerCfg.State.CONNECT);
+                bgpconfig.setPeerConnState(peerHost, BgpPeerCfg.State.CONNECT);
                 peerBootstrap.connect(connectToSocket).addListener(new ChannelFutureListener() {
                     @Override
                     public void operationComplete(ChannelFuture future) throws Exception {
                         if (!future.isSuccess()) {
-                            bgpconfig.setPeerConnState(peerHost, BGPPeerCfg.State.ACTIVE);
+                            bgpconfig.setPeerConnState(peerHost, BgpPeerCfg.State.ACTIVE);
                             connectRetryCounter++;
                             log.error("Connection failed, ConnectRetryCounter {} remote host {}", connectRetryCounter,
                                       peerHost);
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPControllerImpl.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpControllerImpl.java
similarity index 76%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPControllerImpl.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpControllerImpl.java
index 042e2da..e540824 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPControllerImpl.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpControllerImpl.java
@@ -26,34 +26,34 @@
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Service;
-import org.onosproject.bgp.controller.BGPCfg;
-import org.onosproject.bgp.controller.BGPController;
-import org.onosproject.bgp.controller.BGPId;
-import org.onosproject.bgp.controller.BGPPeer;
+import org.onosproject.bgp.controller.BgpCfg;
+import org.onosproject.bgp.controller.BgpController;
+import org.onosproject.bgp.controller.BgpId;
+import org.onosproject.bgp.controller.BgpPeer;
 import org.onosproject.bgp.controller.BgpLinkListener;
 import org.onosproject.bgp.controller.BgpNodeListener;
 import org.onosproject.bgp.controller.BgpPeerManager;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPMessage;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpMessage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Component(immediate = true)
 @Service
-public class BGPControllerImpl implements BGPController {
+public class BgpControllerImpl implements BgpController {
 
-    private static final Logger log = LoggerFactory.getLogger(BGPControllerImpl.class);
+    private static final Logger log = LoggerFactory.getLogger(BgpControllerImpl.class);
 
-    protected ConcurrentHashMap<BGPId, BGPPeer> connectedPeers = new ConcurrentHashMap<BGPId, BGPPeer>();
+    protected ConcurrentHashMap<BgpId, BgpPeer> connectedPeers = new ConcurrentHashMap<BgpId, BgpPeer>();
 
-    protected BGPPeerManagerImpl peerManager = new BGPPeerManagerImpl();
+    protected BgpPeerManagerImpl peerManager = new BgpPeerManagerImpl();
 
     protected Set<BgpNodeListener> bgpNodeListener = new CopyOnWriteArraySet<>();
     protected Set<BgpLinkListener> bgpLinkListener = new CopyOnWriteArraySet<>();
 
     final Controller ctrl = new Controller(this);
 
-    private BGPConfig bgpconfig = new BGPConfig();
+    private BgpConfig bgpconfig = new BgpConfig();
 
     @Activate
     public void activate() {
@@ -70,12 +70,12 @@
     }
 
     @Override
-    public Iterable<BGPPeer> getPeers() {
+    public Iterable<BgpPeer> getPeers() {
         return this.connectedPeers.values();
     }
 
     @Override
-    public BGPPeer getPeer(BGPId bgpId) {
+    public BgpPeer getPeer(BgpId bgpId) {
         return this.connectedPeers.get(bgpId);
     }
 
@@ -110,12 +110,12 @@
     }
 
     @Override
-    public void writeMsg(BGPId bgpId, BGPMessage msg) {
+    public void writeMsg(BgpId bgpId, BgpMessage msg) {
         this.getPeer(bgpId).sendMessage(msg);
     }
 
     @Override
-    public void processBGPPacket(BGPId bgpId, BGPMessage msg) throws BGPParseException {
+    public void processBGPPacket(BgpId bgpId, BgpMessage msg) throws BgpParseException {
 
         switch (msg.getType()) {
         case OPEN:
@@ -138,8 +138,8 @@
 
     @Override
     public void closeConnectedPeers() {
-        BGPPeer bgpPeer;
-        for (BGPId id : this.connectedPeers.keySet()) {
+        BgpPeer bgpPeer;
+        for (BgpId id : this.connectedPeers.keySet()) {
             bgpPeer = getPeer(id);
             bgpPeer.disconnectPeer();
         }
@@ -149,13 +149,13 @@
      * Implementation of an BGP Peer which is responsible for keeping track of connected peers and the state in which
      * they are.
      */
-    public class BGPPeerManagerImpl implements BgpPeerManager {
+    public class BgpPeerManagerImpl implements BgpPeerManager {
 
-        private final Logger log = LoggerFactory.getLogger(BGPPeerManagerImpl.class);
+        private final Logger log = LoggerFactory.getLogger(BgpPeerManagerImpl.class);
         private final Lock peerLock = new ReentrantLock();
 
         @Override
-        public boolean addConnectedPeer(BGPId bgpId, BGPPeer bgpPeer) {
+        public boolean addConnectedPeer(BgpId bgpId, BgpPeer bgpPeer) {
 
             if (connectedPeers.get(bgpId) != null) {
                 this.log.error("Trying to add connectedPeer but found previous " + "value for bgp ip: {}",
@@ -169,7 +169,7 @@
         }
 
         @Override
-        public boolean isPeerConnected(BGPId bgpId) {
+        public boolean isPeerConnected(BgpId bgpId) {
             if (connectedPeers.get(bgpId) == null) {
                 this.log.error("Is peer connected: bgpIp {}.", bgpId.toString());
                 return false;
@@ -179,12 +179,12 @@
         }
 
         @Override
-        public void removeConnectedPeer(BGPId bgpId) {
+        public void removeConnectedPeer(BgpId bgpId) {
             connectedPeers.remove(bgpId);
         }
 
         @Override
-        public BGPPeer getPeer(BGPId bgpId) {
+        public BgpPeer getPeer(BgpId bgpId) {
             return connectedPeers.get(bgpId);
         }
 
@@ -196,9 +196,9 @@
          * @param pktStats packet statistics.
          * @return BGPPeer peer instance.
          */
-        public BGPPeer getBGPPeerInstance(BGPController bgpController, BgpSessionInfoImpl sessionInfo,
-                                          BGPPacketStatsImpl pktStats) {
-            BGPPeer bgpPeer = new BGPPeerImpl(bgpController, sessionInfo, pktStats);
+        public BgpPeer getBgpPeerInstance(BgpController bgpController, BgpSessionInfoImpl sessionInfo,
+                                          BgpPacketStatsImpl pktStats) {
+            BgpPeer bgpPeer = new BgpPeerImpl(bgpController, sessionInfo, pktStats);
             return bgpPeer;
         }
 
@@ -214,17 +214,17 @@
     }
 
     @Override
-    public ConcurrentHashMap<BGPId, BGPPeer> connectedPeers() {
+    public ConcurrentHashMap<BgpId, BgpPeer> connectedPeers() {
         return connectedPeers;
     }
 
     @Override
-    public BGPPeerManagerImpl peerManager() {
+    public BgpPeerManagerImpl peerManager() {
         return peerManager;
     }
 
     @Override
-    public BGPCfg getConfig() {
+    public BgpCfg getConfig() {
         return this.bgpconfig;
     }
 
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPKeepAliveTimer.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpKeepAliveTimer.java
similarity index 89%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPKeepAliveTimer.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpKeepAliveTimer.java
index 1c95804..524ac4c 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPKeepAliveTimer.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpKeepAliveTimer.java
@@ -25,11 +25,11 @@
 /**
  * Implement sending keepalive message to connected peer periodically based on negotiated holdtime.
  */
-public class BGPKeepAliveTimer {
+public class BgpKeepAliveTimer {
 
     private Timer keepAliveTimer;
-    private BGPChannelHandler handler;
-    private static final Logger log = LoggerFactory.getLogger(BGPKeepAliveTimer.class);
+    private BgpChannelHandler handler;
+    private static final Logger log = LoggerFactory.getLogger(BgpKeepAliveTimer.class);
 
     /**
      * Gets keepalive timer object.
@@ -46,7 +46,7 @@
      * @param h channel handler
      * @param seconds time interval.
      */
-    public BGPKeepAliveTimer(BGPChannelHandler h, int seconds) {
+    public BgpKeepAliveTimer(BgpChannelHandler h, int seconds) {
         this.handler = h;
         this.keepAliveTimer = new Timer();
         this.keepAliveTimer.schedule(new SendKeepAlive(), 0, seconds * 1000);
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPMessageDecoder.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpMessageDecoder.java
similarity index 75%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPMessageDecoder.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpMessageDecoder.java
index 636b78c..431c621 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPMessageDecoder.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpMessageDecoder.java
@@ -22,20 +22,20 @@
 import org.jboss.netty.channel.Channel;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.handler.codec.frame.FrameDecoder;
-import org.onosproject.bgpio.protocol.BGPMessage;
+import org.onosproject.bgpio.protocol.BgpMessage;
 import org.onlab.util.HexDump;
-import org.onosproject.bgpio.protocol.BGPFactories;
-import org.onosproject.bgpio.protocol.BGPMessageReader;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.protocol.BgpFactories;
+import org.onosproject.bgpio.protocol.BgpMessageReader;
+import org.onosproject.bgpio.types.BgpHeader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Decode an bgp message from a Channel, for use in a netty pipeline.
  */
-public class BGPMessageDecoder extends FrameDecoder {
+public class BgpMessageDecoder extends FrameDecoder {
 
-    protected static final Logger log = LoggerFactory.getLogger(BGPMessageDecoder.class);
+    protected static final Logger log = LoggerFactory.getLogger(BgpMessageDecoder.class);
 
     @Override
     protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {
@@ -47,12 +47,12 @@
 
         HexDump.dump(buffer);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        List<BGPMessage> msgList = new LinkedList<BGPMessage>();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        List<BgpMessage> msgList = new LinkedList<BgpMessage>();
 
         while (buffer.readableBytes() > 0) {
-            BGPHeader bgpHeader = new BGPHeader();
-            BGPMessage message = reader.readFrom(buffer, bgpHeader);
+            BgpHeader bgpHeader = new BgpHeader();
+            BgpMessage message = reader.readFrom(buffer, bgpHeader);
             msgList.add(message);
         }
         return msgList;
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPMessageEncoder.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpMessageEncoder.java
similarity index 87%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPMessageEncoder.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpMessageEncoder.java
index f0d38c3..3e56d6f 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPMessageEncoder.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpMessageEncoder.java
@@ -22,7 +22,7 @@
 import org.jboss.netty.channel.Channel;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
-import org.onosproject.bgpio.protocol.BGPMessage;
+import org.onosproject.bgpio.protocol.BgpMessage;
 import org.onlab.util.HexDump;
 
 import org.slf4j.Logger;
@@ -32,8 +32,8 @@
  * Encode an bgp message for output into a ChannelBuffer, for use in a
  * netty pipeline.
  */
-public class BGPMessageEncoder extends OneToOneEncoder {
-    protected static final Logger log = LoggerFactory.getLogger(BGPMessageEncoder.class);
+public class BgpMessageEncoder extends OneToOneEncoder {
+    protected static final Logger log = LoggerFactory.getLogger(BgpMessageEncoder.class);
 
     @Override
     protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception {
@@ -44,12 +44,12 @@
         }
 
         @SuppressWarnings("unchecked")
-        List<BGPMessage> msglist = (List<BGPMessage>) msg;
+        List<BgpMessage> msglist = (List<BgpMessage>) msg;
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
 
         log.debug("SENDING MESSAGE");
-        for (BGPMessage pm : msglist) {
+        for (BgpMessage pm : msglist) {
             pm.writeTo(buf);
         }
 
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPacketStatsImpl.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPacketStatsImpl.java
similarity index 94%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPacketStatsImpl.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPacketStatsImpl.java
index 09f4d45..7494c81 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPacketStatsImpl.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPacketStatsImpl.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.bgp.controller.impl;
 
-import org.onosproject.bgp.controller.BGPPacketStats;
+import org.onosproject.bgp.controller.BgpPacketStats;
 
 /**
  * A representation of a packet context which allows any provider
@@ -23,7 +23,7 @@
  * event if blocked has been called. This packet context can be used
  * to react to the packet in event with a packet out.
  */
-public class BGPPacketStatsImpl implements BGPPacketStats {
+public class BgpPacketStatsImpl implements BgpPacketStats {
 
     private int inPacketCount;
     private int outPacketCount;
@@ -33,7 +33,7 @@
     /**
      * Resets parameter.
      */
-    public BGPPacketStatsImpl() {
+    public BgpPacketStatsImpl() {
         this.inPacketCount = 0;
         this.outPacketCount = 0;
         this.wrongPacketCount = 0;
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPeerConfig.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerConfig.java
similarity index 95%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPeerConfig.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerConfig.java
index 14a68cf6..a8eaee3 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPeerConfig.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerConfig.java
@@ -17,12 +17,12 @@
 
 import org.onlab.packet.Ip4Address;
 import org.onosproject.bgp.controller.BgpConnectPeer;
-import org.onosproject.bgp.controller.BGPPeerCfg;
+import org.onosproject.bgp.controller.BgpPeerCfg;
 
 /**
  * BGP Peer configuration information.
  */
-public class BGPPeerConfig  implements BGPPeerCfg {
+public class BgpPeerConfig  implements BgpPeerCfg {
     private int asNumber;
     private short holdTime;
     private boolean isIBgp;
@@ -34,7 +34,7 @@
     /**
      * Constructor to initialize the values.
      */
-    BGPPeerConfig() {
+    BgpPeerConfig() {
         state = State.IDLE;
         selfInitiated = false;
     }
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPeerImpl.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerImpl.java
similarity index 84%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPeerImpl.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerImpl.java
index 45f7463..8bcd5a0 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPeerImpl.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPeerImpl.java
@@ -24,12 +24,12 @@
 
 import org.jboss.netty.channel.Channel;
 import org.onlab.packet.IpAddress;
-import org.onosproject.bgp.controller.BGPController;
-import org.onosproject.bgp.controller.BGPPeer;
+import org.onosproject.bgp.controller.BgpController;
+import org.onosproject.bgp.controller.BgpPeer;
 import org.onosproject.bgp.controller.BgpSessionInfo;
-import org.onosproject.bgpio.protocol.BGPFactories;
-import org.onosproject.bgpio.protocol.BGPFactory;
-import org.onosproject.bgpio.protocol.BGPMessage;
+import org.onosproject.bgpio.protocol.BgpFactories;
+import org.onosproject.bgpio.protocol.BgpFactory;
+import org.onosproject.bgpio.protocol.BgpMessage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -38,19 +38,19 @@
 /**
  * BGPPeerImpl implements BGPPeer, maintains peer information and store updates in RIB .
  */
-public class BGPPeerImpl implements BGPPeer {
+public class BgpPeerImpl implements BgpPeer {
 
-    protected final Logger log = LoggerFactory.getLogger(BGPPeerImpl.class);
+    protected final Logger log = LoggerFactory.getLogger(BgpPeerImpl.class);
 
     private static final String SHUTDOWN_MSG = "Worker has already been shutdown";
 
-    private BGPController bgpController;
+    private BgpController bgpController;
     private Channel channel;
     protected String channelId;
     private boolean connected;
     protected boolean isHandShakeComplete = false;
     private BgpSessionInfo sessionInfo;
-    private BGPPacketStatsImpl pktStats;
+    private BgpPacketStatsImpl pktStats;
 
 
     @Override
@@ -65,7 +65,7 @@
      *@param sessionInfo bgp session info
      *@param pktStats packet statistics
      */
-    public BGPPeerImpl(BGPController bgpController, BgpSessionInfo sessionInfo, BGPPacketStatsImpl pktStats) {
+    public BgpPeerImpl(BgpController bgpController, BgpSessionInfo sessionInfo, BgpPacketStatsImpl pktStats) {
         this.bgpController = bgpController;
         this.sessionInfo = sessionInfo;
         this.pktStats = pktStats;
@@ -81,7 +81,7 @@
     }
 
     @Override
-    public final void sendMessage(BGPMessage m) {
+    public final void sendMessage(BgpMessage m) {
         log.debug("Sending message to {}", channel.getRemoteAddress());
         try {
             channel.write(Collections.singletonList(m));
@@ -95,7 +95,7 @@
     }
 
     @Override
-    public final void sendMessage(List<BGPMessage> msgs) {
+    public final void sendMessage(List<BgpMessage> msgs) {
         try {
             channel.write(msgs);
             this.pktStats.addOutPacket(msgs.size());
@@ -143,8 +143,8 @@
     }
 
     @Override
-    public BGPFactory factory() {
-        return BGPFactories.getFactory(sessionInfo.remoteBgpVersion());
+    public BgpFactory factory() {
+        return BgpFactories.getFactory(sessionInfo.remoteBgpVersion());
     }
 
     @Override
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPipelineFactory.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPipelineFactory.java
similarity index 85%
rename from bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPipelineFactory.java
rename to bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPipelineFactory.java
index e6f09f2..28e1041 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BGPPipelineFactory.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpPipelineFactory.java
@@ -23,18 +23,18 @@
 import org.jboss.netty.util.ExternalResourceReleasable;
 import org.jboss.netty.util.HashedWheelTimer;
 import org.jboss.netty.util.Timer;
-import org.onosproject.bgp.controller.BGPController;
+import org.onosproject.bgp.controller.BgpController;
 
 /**
  * Creates a ChannelPipeline for a server-side bgp channel.
  */
-public class BGPPipelineFactory
+public class BgpPipelineFactory
     implements ChannelPipelineFactory, ExternalResourceReleasable {
 
     static final Timer TIMER = new HashedWheelTimer();
     protected ReadTimeoutHandler readTimeoutHandler;
     private boolean isBgpServ;
-    private BGPController bgpController;
+    private BgpController bgpController;
 
     /**
      * Constructor to initialize the values.
@@ -42,7 +42,7 @@
      * @param bgpController parent controller
      * @param isBgpServ if it is a server or remote peer
      */
-    public BGPPipelineFactory(BGPController bgpController, boolean isBgpServ) {
+    public BgpPipelineFactory(BgpController bgpController, boolean isBgpServ) {
         super();
         this.isBgpServ = isBgpServ;
         this.bgpController = bgpController;
@@ -52,11 +52,11 @@
 
     @Override
     public ChannelPipeline getPipeline() throws Exception {
-        BGPChannelHandler handler = new BGPChannelHandler(bgpController);
+        BgpChannelHandler handler = new BgpChannelHandler(bgpController);
 
         ChannelPipeline pipeline = Channels.pipeline();
-        pipeline.addLast("bgpmessagedecoder", new BGPMessageDecoder());
-        pipeline.addLast("bgpmessageencoder", new BGPMessageEncoder());
+        pipeline.addLast("bgpmessagedecoder", new BgpMessageDecoder());
+        pipeline.addLast("bgpmessageencoder", new BgpMessageEncoder());
         pipeline.addLast("holdTime", readTimeoutHandler);
         if (isBgpServ) {
             pipeline.addLast("PassiveHandler", handler);
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpSessionInfoImpl.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpSessionInfoImpl.java
index 6705b46..33623dc 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpSessionInfoImpl.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpSessionInfoImpl.java
@@ -13,9 +13,9 @@
 
 package org.onosproject.bgp.controller.impl;
 
-import org.onosproject.bgp.controller.BGPId;
+import org.onosproject.bgp.controller.BgpId;
 import org.onosproject.bgp.controller.BgpSessionInfo;
-import org.onosproject.bgpio.protocol.BGPVersion;
+import org.onosproject.bgpio.protocol.BgpVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -25,8 +25,8 @@
 public class BgpSessionInfoImpl implements BgpSessionInfo {
 
     protected final Logger log = LoggerFactory.getLogger(BgpSessionInfoImpl.class);
-    private BGPId remoteBgpId;
-    private BGPVersion remoteBgpVersion;
+    private BgpId remoteBgpId;
+    private BgpVersion remoteBgpVersion;
     private long remoteBgpASNum;
     private short remoteBgpholdTime;
     private int remoteBgpIdentifier;
@@ -44,7 +44,7 @@
      *@param negotiatedholdTime negotiated hold time
      *@param isIbgpSession session type ibgp/ebgp
      */
-    public BgpSessionInfoImpl(BGPId remoteBgpId, BGPVersion remoteBgpVersion, long remoteBgpASNum,
+    public BgpSessionInfoImpl(BgpId remoteBgpId, BgpVersion remoteBgpVersion, long remoteBgpASNum,
                               short remoteBgpholdTime, int remoteBgpIdentifier, short negotiatedholdTime,
                               boolean isIbgpSession) {
         this.remoteBgpId = remoteBgpId;
@@ -67,12 +67,12 @@
     }
 
     @Override
-    public BGPId remoteBgpId() {
+    public BgpId remoteBgpId() {
         return remoteBgpId;
     }
 
     @Override
-    public BGPVersion remoteBgpVersion() {
+    public BgpVersion remoteBgpVersion() {
         return remoteBgpVersion;
     }
 
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/Controller.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/Controller.java
index 95eebb4..f02cee8 100755
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/Controller.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/Controller.java
@@ -32,10 +32,10 @@
 import org.jboss.netty.channel.group.DefaultChannelGroup;
 import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
 import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
-import org.onosproject.bgp.controller.BGPController;
-import org.onosproject.bgpio.protocol.BGPFactories;
-import org.onosproject.bgpio.protocol.BGPFactory;
-import org.onosproject.bgpio.protocol.BGPVersion;
+import org.onosproject.bgp.controller.BgpController;
+import org.onosproject.bgpio.protocol.BgpFactories;
+import org.onosproject.bgpio.protocol.BgpFactory;
+import org.onosproject.bgpio.protocol.BgpVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,7 +47,7 @@
 
     private static final Logger log = LoggerFactory.getLogger(Controller.class);
 
-    private static final BGPFactory FACTORY4 = BGPFactories.getFactory(BGPVersion.BGP_4);
+    private static final BgpFactory FACTORY4 = BgpFactories.getFactory(BgpVersion.BGP_4);
 
     private ChannelGroup cg;
     public Channel serverChannel;
@@ -65,7 +65,7 @@
     private NioServerSocketChannelFactory serverExecFactory;
     private NioClientSocketChannelFactory peerExecFactory;
     private static ClientBootstrap peerBootstrap;
-    private BGPController bgpController;
+    private BgpController bgpController;
 
     // Perf. related configuration
     private static final int SEND_BUFFER_SIZE = 4 * 1024 * 1024;
@@ -75,7 +75,7 @@
      *
      * @param bgpController bgp controller instance
      */
-    public Controller(BGPController bgpController) {
+    public Controller(BgpController bgpController) {
         this.bgpController = bgpController;
     }
 
@@ -84,7 +84,7 @@
      *
      * @return instance of factory version
      */
-    static BGPFactory getBGPMessageFactory4() {
+    static BgpFactory getBgpMessageFactory4() {
         return FACTORY4;
     }
 
@@ -118,7 +118,7 @@
             bootstrap.setOption("child.tcpNoDelay", true);
             bootstrap.setOption("child.sendBufferSize", Controller.SEND_BUFFER_SIZE);
 
-            ChannelPipelineFactory pfact = new BGPPipelineFactory(bgpController, true);
+            ChannelPipelineFactory pfact = new BgpPipelineFactory(bgpController, true);
 
             bootstrap.setPipelineFactory(pfact);
             InetSocketAddress sa = new InetSocketAddress(getBgpPortNum());
diff --git a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/VpnAdjRibIn.java b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/VpnAdjRibIn.java
index a8740c4..8a9ea91 100644
--- a/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/VpnAdjRibIn.java
+++ b/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/VpnAdjRibIn.java
@@ -19,13 +19,13 @@
 import java.util.Map;
 import java.util.TreeMap;
 
-import org.onosproject.bgpio.protocol.BGPLSNlri;
-import org.onosproject.bgpio.protocol.linkstate.BGPLinkLSIdentifier;
+import org.onosproject.bgpio.protocol.BgpLSNlri;
+import org.onosproject.bgpio.protocol.linkstate.BgpLinkLSIdentifier;
 import org.onosproject.bgpio.protocol.linkstate.BgpLinkLsNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSIdentifier;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPPrefixIPv4LSNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPPrefixLSIdentifier;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSIdentifier;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.BgpPrefixIPv4LSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.BgpPrefixLSIdentifier;
 import org.onosproject.bgpio.protocol.linkstate.PathAttrNlriDetails;
 import org.onosproject.bgpio.types.RouteDistinguisher;
 
@@ -35,22 +35,22 @@
  * Implementation of Adj-RIB-In with VPN for each peer.
  */
 public class VpnAdjRibIn {
-    private Map<BGPNodeLSIdentifier, PathAttrNlriDetails> nodeTree = new TreeMap<>();
-    private Map<BGPLinkLSIdentifier, PathAttrNlriDetails> linkTree = new TreeMap<>();
-    private Map<BGPPrefixLSIdentifier, PathAttrNlriDetails> prefixTree = new TreeMap<>();
+    private Map<BgpNodeLSIdentifier, PathAttrNlriDetails> nodeTree = new TreeMap<>();
+    private Map<BgpLinkLSIdentifier, PathAttrNlriDetails> linkTree = new TreeMap<>();
+    private Map<BgpPrefixLSIdentifier, PathAttrNlriDetails> prefixTree = new TreeMap<>();
 
-    private Map<RouteDistinguisher, Map<BGPNodeLSIdentifier, PathAttrNlriDetails>> vpnNodeTree
+    private Map<RouteDistinguisher, Map<BgpNodeLSIdentifier, PathAttrNlriDetails>> vpnNodeTree
                                                                                                      = new TreeMap<>();
-    private Map<RouteDistinguisher, Map<BGPLinkLSIdentifier, PathAttrNlriDetails>> vpnLinkTree
+    private Map<RouteDistinguisher, Map<BgpLinkLSIdentifier, PathAttrNlriDetails>> vpnLinkTree
                                                                                                      = new TreeMap<>();
-    private Map<RouteDistinguisher, Map<BGPPrefixLSIdentifier, PathAttrNlriDetails>> vpnPrefixTree
+    private Map<RouteDistinguisher, Map<BgpPrefixLSIdentifier, PathAttrNlriDetails>> vpnPrefixTree
                                                                                                      = new TreeMap<>();
     /**
      * Returns the adjacency node.
      *
      * @return node adjacency RIB node
      */
-    public Map<BGPNodeLSIdentifier, PathAttrNlriDetails> nodeTree() {
+    public Map<BgpNodeLSIdentifier, PathAttrNlriDetails> nodeTree() {
         return nodeTree;
     }
 
@@ -59,7 +59,7 @@
      *
      * @return link adjacency RIB node
      */
-    public Map<BGPLinkLSIdentifier, PathAttrNlriDetails> linkTree() {
+    public Map<BgpLinkLSIdentifier, PathAttrNlriDetails> linkTree() {
         return linkTree;
     }
 
@@ -68,7 +68,7 @@
      *
      * @return prefix adjacency RIB node
      */
-    public Map<BGPPrefixLSIdentifier, PathAttrNlriDetails> prefixTree() {
+    public Map<BgpPrefixLSIdentifier, PathAttrNlriDetails> prefixTree() {
         return prefixTree;
     }
 
@@ -77,7 +77,7 @@
      *
      * @return vpnNode adjacency RIB node
      */
-    public Map<RouteDistinguisher, Map<BGPNodeLSIdentifier, PathAttrNlriDetails>> vpnNodeTree() {
+    public Map<RouteDistinguisher, Map<BgpNodeLSIdentifier, PathAttrNlriDetails>> vpnNodeTree() {
         return vpnNodeTree;
     }
 
@@ -86,7 +86,7 @@
      *
      * @return vpnLink adjacency RIB node
      */
-    public Map<RouteDistinguisher, Map<BGPLinkLSIdentifier, PathAttrNlriDetails>> vpnLinkTree() {
+    public Map<RouteDistinguisher, Map<BgpLinkLSIdentifier, PathAttrNlriDetails>> vpnLinkTree() {
         return vpnLinkTree;
     }
 
@@ -95,7 +95,7 @@
      *
      * @return vpnPrefix adjacency RIB node
      */
-    public Map<RouteDistinguisher, Map<BGPPrefixLSIdentifier, PathAttrNlriDetails>> vpnPrefixTree() {
+    public Map<RouteDistinguisher, Map<BgpPrefixLSIdentifier, PathAttrNlriDetails>> vpnPrefixTree() {
         return vpnPrefixTree;
     }
 
@@ -105,23 +105,23 @@
      * @param nlri NLRI info
      * @param details has pathattribute , protocolID and identifier
      */
-    public void add(BGPLSNlri nlri, PathAttrNlriDetails details) {
-        if (nlri instanceof BGPNodeLSNlriVer4) {
-            BGPNodeLSIdentifier nodeLSIdentifier = ((BGPNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
+    public void add(BgpLSNlri nlri, PathAttrNlriDetails details) {
+        if (nlri instanceof BgpNodeLSNlriVer4) {
+            BgpNodeLSIdentifier nodeLSIdentifier = ((BgpNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
             if (nodeTree.containsKey(nodeLSIdentifier)) {
                 nodeTree.replace(nodeLSIdentifier, details);
             } else {
                 nodeTree.put(nodeLSIdentifier, details);
             }
         } else if (nlri instanceof BgpLinkLsNlriVer4) {
-            BGPLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
+            BgpLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
             if (linkTree.containsKey(linkLSIdentifier)) {
                 linkTree.replace(linkLSIdentifier, details);
             } else {
                 linkTree.put(linkLSIdentifier, details);
             }
-        } else if (nlri instanceof BGPPrefixIPv4LSNlriVer4) {
-            BGPPrefixLSIdentifier prefixIdentifier = ((BGPPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
+        } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) {
+            BgpPrefixLSIdentifier prefixIdentifier = ((BgpPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
             if (prefixTree.containsKey(prefixIdentifier)) {
                 prefixTree.replace(prefixIdentifier, details);
             } else {
@@ -138,9 +138,9 @@
      * @param details has pathattribute , protocolID and identifier
      * @param routeDistinguisher unique for for each vpn
      */
-    public void addVpn(BGPLSNlri nlri, PathAttrNlriDetails details, RouteDistinguisher routeDistinguisher) {
+    public void addVpn(BgpLSNlri nlri, PathAttrNlriDetails details, RouteDistinguisher routeDistinguisher) {
         add(nlri, details);
-        if (nlri instanceof BGPNodeLSNlriVer4) {
+        if (nlri instanceof BgpNodeLSNlriVer4) {
             if (!vpnNodeTree.containsKey(routeDistinguisher)) {
                 vpnNodeTree.put(routeDistinguisher, nodeTree);
             }
@@ -148,7 +148,7 @@
             if (!vpnLinkTree.containsKey(routeDistinguisher)) {
                 vpnLinkTree.put(routeDistinguisher, linkTree);
             }
-        } else if (nlri instanceof BGPPrefixIPv4LSNlriVer4) {
+        } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) {
             if (!vpnPrefixTree.containsKey(routeDistinguisher)) {
                 vpnPrefixTree.put(routeDistinguisher, prefixTree);
             }
@@ -161,10 +161,10 @@
      * @param nlri NLRI Info
      * @param routeDistinguisher unique for for each vpn
      */
-    public void removeVpn(BGPLSNlri nlri, RouteDistinguisher routeDistinguisher) {
-        if (nlri instanceof BGPNodeLSNlriVer4) {
+    public void removeVpn(BgpLSNlri nlri, RouteDistinguisher routeDistinguisher) {
+        if (nlri instanceof BgpNodeLSNlriVer4) {
             if (vpnNodeTree.containsKey(routeDistinguisher)) {
-                BGPNodeLSIdentifier nodeLSIdentifier = ((BGPNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
+                BgpNodeLSIdentifier nodeLSIdentifier = ((BgpNodeLSNlriVer4) nlri).getLocalNodeDescriptors();
                 if (nodeTree.containsKey(nodeLSIdentifier)) {
                     nodeTree.remove(nodeLSIdentifier);
                 }
@@ -174,7 +174,7 @@
             }
         } else if (nlri instanceof BgpLinkLsNlriVer4) {
             if (vpnLinkTree.containsKey(routeDistinguisher)) {
-                BGPLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
+                BgpLinkLSIdentifier linkLSIdentifier = ((BgpLinkLsNlriVer4) nlri).getLinkIdentifier();
                 if (linkTree.containsKey(linkLSIdentifier)) {
                     linkTree.remove(linkLSIdentifier);
                 }
@@ -182,9 +182,9 @@
                     vpnLinkTree.remove(routeDistinguisher);
                 }
             }
-        } else if (nlri instanceof BGPPrefixIPv4LSNlriVer4) {
+        } else if (nlri instanceof BgpPrefixIPv4LSNlriVer4) {
             if (vpnPrefixTree.containsKey(routeDistinguisher)) {
-                BGPPrefixLSIdentifier prefixIdentifier = ((BGPPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
+                BgpPrefixLSIdentifier prefixIdentifier = ((BgpPrefixIPv4LSNlriVer4) nlri).getPrefixIdentifier();
                 if (prefixTree.containsKey(prefixIdentifier)) {
                     prefixTree.remove(prefixIdentifier);
                 }
diff --git a/bgp/ctl/src/test/java/org/onosproject/bgp/BGPControllerImplTest.java b/bgp/ctl/src/test/java/org/onosproject/bgp/BgpControllerImplTest.java
similarity index 92%
rename from bgp/ctl/src/test/java/org/onosproject/bgp/BGPControllerImplTest.java
rename to bgp/ctl/src/test/java/org/onosproject/bgp/BgpControllerImplTest.java
index 83583bb..36b1d6f 100755
--- a/bgp/ctl/src/test/java/org/onosproject/bgp/BGPControllerImplTest.java
+++ b/bgp/ctl/src/test/java/org/onosproject/bgp/BgpControllerImplTest.java
@@ -42,19 +42,19 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.onosproject.bgp.controller.BGPCfg;
-import org.onosproject.bgp.controller.impl.BGPControllerImpl;
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgp.controller.BgpCfg;
+import org.onosproject.bgp.controller.impl.BgpControllerImpl;
+import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.types.FourOctetAsNumCapabilityTlv;
 import org.onosproject.bgpio.types.MultiProtocolExtnCapabilityTlv;
 
 /**
  * Test case for BGPControllerImpl.
  */
-public class BGPControllerImplTest {
+public class BgpControllerImplTest {
 
     protected static final Logger log = LoggerFactory
-            .getLogger(BGPControllerImplTest.class);
+            .getLogger(BgpControllerImplTest.class);
 
     private static final String IP_LOOPBACK_ID1 = "127.0.0.1";
 
@@ -64,7 +64,7 @@
     public short holdTime;
     public int bgpId = InetAddresses.coerceToInteger(InetAddresses.forString(IP_LOOPBACK_ID1));
     public boolean isLargeAsCapabilitySet = false;
-    public LinkedList<BGPValueType> capabilityTlv = new LinkedList<>();
+    public LinkedList<BgpValueType> capabilityTlv = new LinkedList<>();
 
     @Before
     public void setUp() throws Exception {
@@ -72,7 +72,7 @@
                 holdTime, bgpId, isLargeAsCapabilitySet,
                 capabilityTlv);
 
-        bgpControllerImpl = new BGPControllerImpl();
+        bgpControllerImpl = new BgpControllerImpl();
 
         // NOTE: We use port 0 to bind on any available port
         bgpControllerImpl.controller().setBgpPortNum();
@@ -90,7 +90,7 @@
         bgpControllerImpl.getConfig().setRouterId("1.1.1.1");
         bgpControllerImpl.getConfig().setAsNumber(200);
         bgpControllerImpl.getConfig().setHoldTime((short) 120);
-        bgpControllerImpl.getConfig().setState(BGPCfg.State.IP_AS_CONFIGURED);
+        bgpControllerImpl.getConfig().setState(BgpCfg.State.IP_AS_CONFIGURED);
 
         bgpControllerImpl.getConfig().addPeer("127.0.0.1", 200);
     }
@@ -101,7 +101,7 @@
         bgpControllerImpl = null;
     }
 
-    private BGPControllerImpl bgpControllerImpl;
+    private BgpControllerImpl bgpControllerImpl;
 
     BgpPeerTest peer1;
 
@@ -162,7 +162,7 @@
         peer1.peerChannelHandler.version = 4;
         peer1.peerChannelHandler.holdTime = 120;
         peer1.peerChannelHandler.isLargeAsCapabilitySet = true;
-        BGPValueType tempTlv = new FourOctetAsNumCapabilityTlv(766545);
+        BgpValueType tempTlv = new FourOctetAsNumCapabilityTlv(766545);
         peer1.peerChannelHandler.capabilityTlv.add(tempTlv);
         peer1.connect(connectToSocket);
 
@@ -183,7 +183,7 @@
         peer1.peerChannelHandler.version = 4;
         peer1.peerChannelHandler.holdTime = 120;
         bgpControllerImpl.getConfig().setLsCapability(true);
-        BGPValueType tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
+        BgpValueType tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
         peer1.peerChannelHandler.capabilityTlv.add(tempTlv1);
         peer1.connect(connectToSocket);
 
@@ -206,7 +206,7 @@
         peer1.peerChannelHandler.holdTime = 120;
         peer1.peerChannelHandler.isLargeAsCapabilitySet = true;
         bgpControllerImpl.getConfig().setLargeASCapability(true);
-        BGPValueType tempTlv = new FourOctetAsNumCapabilityTlv(200);
+        BgpValueType tempTlv = new FourOctetAsNumCapabilityTlv(200);
         peer1.peerChannelHandler.capabilityTlv.add(tempTlv);
         peer1.connect(connectToSocket);
 
@@ -238,11 +238,11 @@
 
         peer1.peerChannelHandler.isLargeAsCapabilitySet = true;
         bgpControllerImpl.getConfig().setLargeASCapability(true);
-        BGPValueType tempTlv = new FourOctetAsNumCapabilityTlv(200);
+        BgpValueType tempTlv = new FourOctetAsNumCapabilityTlv(200);
         peer1.peerChannelHandler.capabilityTlv.add(tempTlv);
 
         bgpControllerImpl.getConfig().setLsCapability(true);
-        BGPValueType tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
+        BgpValueType tempTlv1 = new MultiProtocolExtnCapabilityTlv(afi, res, safi);
         peer1.peerChannelHandler.capabilityTlv.add(tempTlv1);
         peer1.connect(connectToSocket);
 
@@ -264,7 +264,7 @@
 
         private BgpPeerTest(byte version, short asNumber,
                 short holdTime, int bgpId, boolean isLargeAsCapabilitySet,
-                LinkedList<BGPValueType> capabilityTlv) {
+                LinkedList<BgpValueType> capabilityTlv) {
             peerChannelHandler = new BgpPeerChannelHandlerTest(version,
                 asNumber, holdTime, bgpId, isLargeAsCapabilitySet, capabilityTlv);
         }
diff --git a/bgp/ctl/src/test/java/org/onosproject/bgp/BgpPeerChannelHandlerTest.java b/bgp/ctl/src/test/java/org/onosproject/bgp/BgpPeerChannelHandlerTest.java
index 6f1828f..26ed36d 100755
--- a/bgp/ctl/src/test/java/org/onosproject/bgp/BgpPeerChannelHandlerTest.java
+++ b/bgp/ctl/src/test/java/org/onosproject/bgp/BgpPeerChannelHandlerTest.java
@@ -23,10 +23,10 @@
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.ChannelStateEvent;
 import org.jboss.netty.channel.SimpleChannelHandler;
-import org.onosproject.bgpio.protocol.ver4.BGPKeepaliveMsgVer4;
-import org.onosproject.bgpio.protocol.ver4.BGPOpenMsgVer4;
-import org.onosproject.bgpio.types.BGPHeader;
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgpio.protocol.ver4.BgpKeepaliveMsgVer4;
+import org.onosproject.bgpio.protocol.ver4.BgpOpenMsgVer4;
+import org.onosproject.bgpio.types.BgpHeader;
+import org.onosproject.bgpio.types.BgpValueType;
 
 public class BgpPeerChannelHandlerTest extends SimpleChannelHandler {
     public static final int OPEN_MSG_MINIMUM_LENGTH = 29;
@@ -34,16 +34,16 @@
         (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
         (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
         (byte) 0xff, (byte) 0xff};
-    public static final BGPHeader DEFAULT_OPEN_HEADER = new BGPHeader(MARKER,
+    public static final BgpHeader DEFAULT_OPEN_HEADER = new BgpHeader(MARKER,
             (short) OPEN_MSG_MINIMUM_LENGTH, (byte) 0X01);
-    LinkedList<BGPValueType> capabilityTlv = new LinkedList<>();
+    LinkedList<BgpValueType> capabilityTlv = new LinkedList<>();
     public byte version;
     public short asNumber;
     public short holdTime;
     public int bgpId;
     public boolean isLargeAsCapabilitySet;
 
-    final BGPOpenMsgVer4 openMessage = new BGPOpenMsgVer4();
+    final BgpOpenMsgVer4 openMessage = new BgpOpenMsgVer4();
     ChannelHandlerContext savedCtx;
 
     /**
@@ -60,7 +60,7 @@
             short holdTime,
             int bgpId,
             boolean isLargeAsCapabilitySet,
-            LinkedList<BGPValueType> capabilityTlv) {
+            LinkedList<BgpValueType> capabilityTlv) {
         this.version = version;
         this.asNumber = asNumber;
         this.holdTime = holdTime;
@@ -81,7 +81,7 @@
                                  ChannelStateEvent channelEvent) throws InterruptedException {
         this.savedCtx = ctx;
 
-        BGPOpenMsgVer4 openMsg = new BGPOpenMsgVer4(DEFAULT_OPEN_HEADER,
+        BgpOpenMsgVer4 openMsg = new BgpOpenMsgVer4(DEFAULT_OPEN_HEADER,
                 this.version,
                 this.asNumber,
                 this.holdTime,
@@ -93,7 +93,7 @@
 
         TimeUnit.MILLISECONDS.sleep(100);
 
-        BGPKeepaliveMsgVer4 keepaliveMsg = new BGPKeepaliveMsgVer4();
+        BgpKeepaliveMsgVer4 keepaliveMsg = new BgpKeepaliveMsgVer4();
         ChannelBuffer buffer1 = ChannelBuffers.dynamicBuffer();
         keepaliveMsg.writeTo(buffer1);
         ctx.getChannel().write(buffer1);
diff --git a/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
index 57581f6..9f58c45 100755
--- a/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
+++ b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
@@ -27,12 +27,12 @@
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onosproject.bgp.controller.BGPController;
+import org.onosproject.bgp.controller.BgpController;
 import org.onosproject.bgp.controller.BgpDpid;
 import org.onosproject.bgp.controller.BgpLinkListener;
 import org.onosproject.bgp.controller.BgpNodeListener;
 import org.onosproject.bgpio.protocol.linkstate.BgpLinkLsNlriVer4;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
@@ -74,7 +74,7 @@
     protected DeviceProviderRegistry deviceProviderRegistry;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected BGPController controller;
+    protected BgpController controller;
 
     private DeviceProviderService deviceProviderService;
     private LinkProviderService linkProviderService;
@@ -150,7 +150,7 @@
     private class InternalBgpProvider implements BgpNodeListener, BgpLinkListener {
 
         @Override
-        public void addNode(BGPNodeLSNlriVer4 nodeNlri) {
+        public void addNode(BgpNodeLSNlriVer4 nodeNlri) {
             log.debug("Add node {}", nodeNlri.toString());
 
             if (deviceProviderService == null) {
@@ -167,7 +167,7 @@
         }
 
         @Override
-        public void deleteNode(BGPNodeLSNlriVer4 nodeNlri) {
+        public void deleteNode(BgpNodeLSNlriVer4 nodeNlri) {
             log.debug("Delete node {}", nodeNlri.toString());
 
             if (deviceProviderService == null) {
diff --git a/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java b/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java
index 9ae7492..de8d1c1 100755
--- a/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java
+++ b/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java
@@ -27,23 +27,23 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.onosproject.bgp.controller.BGPCfg;
-import org.onosproject.bgp.controller.BGPController;
-import org.onosproject.bgp.controller.BGPId;
-import org.onosproject.bgp.controller.BGPPeer;
+import org.onosproject.bgp.controller.BgpCfg;
+import org.onosproject.bgp.controller.BgpController;
+import org.onosproject.bgp.controller.BgpId;
+import org.onosproject.bgp.controller.BgpPeer;
 import org.onosproject.bgp.controller.BgpLinkListener;
 import org.onosproject.bgp.controller.BgpNodeListener;
 import org.onosproject.bgp.controller.BgpPeerManager;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.protocol.BGPMessage;
-import org.onosproject.bgpio.protocol.linkstate.BGPLinkLSIdentifier;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSIdentifier;
-import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.BgpMessage;
+import org.onosproject.bgpio.protocol.linkstate.BgpLinkLSIdentifier;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSIdentifier;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4;
 import org.onosproject.bgpio.protocol.linkstate.BgpLinkLsNlriVer4;
 import org.onosproject.bgpio.protocol.linkstate.NodeDescriptors;
 import org.onosproject.bgpio.types.AutonomousSystemTlv;
 import org.onosproject.bgpio.types.LinkLocalRemoteIdentifiersTlv;
-import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.types.RouteDistinguisher;
 import org.onosproject.bgpio.util.Constants;
 import org.onosproject.net.ConnectPoint;
@@ -225,7 +225,7 @@
     }
 
     /* class implement test controller */
-    private class TestController implements BGPController {
+    private class TestController implements BgpController {
         protected Set<BgpNodeListener> nodeListener = new CopyOnWriteArraySet<>();
         protected Set<BgpLinkListener> linkListener = new CopyOnWriteArraySet<>();
 
@@ -250,25 +250,25 @@
         }
 
         @Override
-        public Iterable<BGPPeer> getPeers() {
+        public Iterable<BgpPeer> getPeers() {
             // TODO Auto-generated method stub
             return null;
         }
 
         @Override
-        public BGPPeer getPeer(BGPId bgpId) {
+        public BgpPeer getPeer(BgpId bgpId) {
             // TODO Auto-generated method stub
             return null;
         }
 
         @Override
-        public void writeMsg(BGPId bgpId, BGPMessage msg) {
+        public void writeMsg(BgpId bgpId, BgpMessage msg) {
             // TODO Auto-generated method stub
 
         }
 
         @Override
-        public void processBGPPacket(BGPId bgpId, BGPMessage msg) throws BGPParseException {
+        public void processBGPPacket(BgpId bgpId, BgpMessage msg) throws BgpParseException {
             // TODO Auto-generated method stub
 
         }
@@ -280,7 +280,7 @@
         }
 
         @Override
-        public BGPCfg getConfig() {
+        public BgpCfg getConfig() {
             // TODO Auto-generated method stub
             return null;
         }
@@ -299,7 +299,7 @@
         }
 
         @Override
-        public Map<BGPId, BGPPeer> connectedPeers() {
+        public Map<BgpId, BgpPeer> connectedPeers() {
             // TODO Auto-generated method stub
             return null;
         }
@@ -321,16 +321,16 @@
     @Test
     public void bgpTopologyProviderTestAddDevice1() {
         int deviceAddCount = 0;
-        LinkedList<BGPValueType> subTlvs;
+        LinkedList<BgpValueType> subTlvs;
         subTlvs = new LinkedList<>();
-        BGPValueType tlv = new AutonomousSystemTlv(100);
+        BgpValueType tlv = new AutonomousSystemTlv(100);
         short deslength = AutonomousSystemTlv.LENGTH;
         short desType = AutonomousSystemTlv.TYPE;
 
         subTlvs.add(tlv);
-        BGPNodeLSIdentifier localNodeDescriptors = new BGPNodeLSIdentifier(new NodeDescriptors(subTlvs, deslength,
+        BgpNodeLSIdentifier localNodeDescriptors = new BgpNodeLSIdentifier(new NodeDescriptors(subTlvs, deslength,
                                                                                                desType));
-        BGPNodeLSNlriVer4 nodeNlri = new BGPNodeLSNlriVer4(0, (byte) Constants.DIRECT, localNodeDescriptors, false,
+        BgpNodeLSNlriVer4 nodeNlri = new BgpNodeLSNlriVer4(0, (byte) Constants.DIRECT, localNodeDescriptors, false,
                                                            new RouteDistinguisher());
 
         nodeNlri.setNodeLSIdentifier(localNodeDescriptors);
@@ -347,16 +347,16 @@
     /* Validate node is not added to the device for invalid URI, RIB count should be zero */
     @Test
     public void bgpTopologyProviderTestAddDevice2() {
-        LinkedList<BGPValueType> subTlvs;
-        BGPValueType tlv = new AutonomousSystemTlv(10);
+        LinkedList<BgpValueType> subTlvs;
+        BgpValueType tlv = new AutonomousSystemTlv(10);
         short deslength = AutonomousSystemTlv.LENGTH;
         short desType = AutonomousSystemTlv.TYPE;
 
         subTlvs = new LinkedList<>();
         subTlvs.add(tlv);
-        BGPNodeLSIdentifier localNodeDescriptors = new BGPNodeLSIdentifier(new NodeDescriptors(subTlvs, deslength,
+        BgpNodeLSIdentifier localNodeDescriptors = new BgpNodeLSIdentifier(new NodeDescriptors(subTlvs, deslength,
                                                                                                desType));
-        BGPNodeLSNlriVer4 nodeNlri = new BGPNodeLSNlriVer4(0, (byte) Constants.DIRECT, localNodeDescriptors, false,
+        BgpNodeLSNlriVer4 nodeNlri = new BgpNodeLSNlriVer4(0, (byte) Constants.DIRECT, localNodeDescriptors, false,
                                                            new RouteDistinguisher());
 
         nodeNlri.setNodeLSIdentifier(localNodeDescriptors);
@@ -369,16 +369,16 @@
     /* Delete node when node does not exist, RIB count should be zero */
     @Test
     public void bgpTopologyProviderTestAddDevice3() {
-        LinkedList<BGPValueType> subTlvs;
-        BGPValueType tlv = new AutonomousSystemTlv(10);
+        LinkedList<BgpValueType> subTlvs;
+        BgpValueType tlv = new AutonomousSystemTlv(10);
         short deslength = AutonomousSystemTlv.LENGTH;
         short desType = AutonomousSystemTlv.TYPE;
 
         subTlvs = new LinkedList<>();
         subTlvs.add(tlv);
-        BGPNodeLSIdentifier localNodeDescriptors = new BGPNodeLSIdentifier(new NodeDescriptors(subTlvs, deslength,
+        BgpNodeLSIdentifier localNodeDescriptors = new BgpNodeLSIdentifier(new NodeDescriptors(subTlvs, deslength,
                                                                                                desType));
-        BGPNodeLSNlriVer4 nodeNlri = new BGPNodeLSNlriVer4(0, (byte) Constants.DIRECT, localNodeDescriptors, false,
+        BgpNodeLSNlriVer4 nodeNlri = new BgpNodeLSNlriVer4(0, (byte) Constants.DIRECT, localNodeDescriptors, false,
                                                            new RouteDistinguisher());
 
         nodeNlri.setNodeLSIdentifier(localNodeDescriptors);
@@ -394,13 +394,13 @@
 
         NodeDescriptors localNodeDescriptors;
         NodeDescriptors remoteNodeDescriptors;
-        LinkedList<BGPValueType> subTlvs;
-        LinkedList<BGPValueType> linkDescriptor = new LinkedList<>();
-        BGPValueType tlvLocalRemoteId;
+        LinkedList<BgpValueType> subTlvs;
+        LinkedList<BgpValueType> linkDescriptor = new LinkedList<>();
+        BgpValueType tlvLocalRemoteId;
         short deslength = AutonomousSystemTlv.LENGTH;
         short desType = AutonomousSystemTlv.TYPE;
 
-        BGPValueType tlv = new AutonomousSystemTlv(100);
+        BgpValueType tlv = new AutonomousSystemTlv(100);
         subTlvs = new LinkedList<>();
         subTlvs.add(tlv);
 
@@ -409,7 +409,7 @@
         tlvLocalRemoteId = new LinkLocalRemoteIdentifiersTlv(1, 2);
         linkDescriptor.add(tlvLocalRemoteId);
 
-        BGPLinkLSIdentifier linkLSIdentifier = new BGPLinkLSIdentifier(localNodeDescriptors, remoteNodeDescriptors,
+        BgpLinkLSIdentifier linkLSIdentifier = new BgpLinkLSIdentifier(localNodeDescriptors, remoteNodeDescriptors,
                                                                        linkDescriptor);
         BgpLinkLsNlriVer4 linkNlri = new BgpLinkLsNlriVer4((byte) Constants.DIRECT, 0, linkLSIdentifier, null, false);
 
