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);
     }
 
     /**
