diff --git a/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpNotificationMsgTest.java b/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpNotificationMsgTest.java
index 78edf13..6dfa57e 100644
--- a/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpNotificationMsgTest.java
+++ b/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpNotificationMsgTest.java
@@ -18,8 +18,8 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.types.BgpHeader;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.instanceOf;
@@ -33,10 +33,10 @@
     /**
      * Notification message with error code, error subcode and data.
      *
-     * @throws BGPParseException while decoding and encoding notification message
+     * @throws BgpParseException while decoding and encoding notification message
      */
     @Test
-    public void bgpNotificationMessageTest1() throws BGPParseException {
+    public void bgpNotificationMessageTest1() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -52,12 +52,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
@@ -72,10 +72,10 @@
     /**
      * Notification message without data.
      *
-     * @throws BGPParseException  while decoding and encoding notification message
+     * @throws BgpParseException  while decoding and encoding notification message
      */
     @Test
-    public void bgpNotificationMessageTest2() throws BGPParseException {
+    public void bgpNotificationMessageTest2() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -90,12 +90,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
@@ -111,10 +111,10 @@
     /**
      * Notification message with wrong maker value.
      *
-     * @throws BGPParseException while decoding and encoding notification message
+     * @throws BgpParseException while decoding and encoding notification message
      */
-    @Test(expected = BGPParseException.class)
-    public void bgpNotificationMessageTest3() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void bgpNotificationMessageTest3() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -129,12 +129,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
@@ -149,10 +149,10 @@
     /**
      * Notification message without error subcode.
      *
-     * @throws BGPParseException while decoding and encoding notification message
+     * @throws BgpParseException while decoding and encoding notification message
      */
-    @Test(expected = BGPParseException.class)
-    public void bgpNotificationMessageTest4() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void bgpNotificationMessageTest4() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -167,12 +167,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
@@ -187,10 +187,10 @@
     /**
      * Notification message with wrong message length.
      *
-     * @throws BGPParseException while decoding and encoding notification message
+     * @throws BgpParseException while decoding and encoding notification message
      */
-    @Test(expected = BGPParseException.class)
-    public void bgpNotificationMessageTest5() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void bgpNotificationMessageTest5() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -205,12 +205,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
