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;
     }
 
