diff --git a/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BGPKeepaliveMsgTest.java b/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpKeepaliveMsgTest.java
similarity index 83%
rename from bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BGPKeepaliveMsgTest.java
rename to bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpKeepaliveMsgTest.java
index 68ce307..682c1bc 100755
--- a/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BGPKeepaliveMsgTest.java
+++ b/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpKeepaliveMsgTest.java
@@ -18,8 +18,8 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.types.BgpHeader;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.instanceOf;
@@ -28,13 +28,13 @@
 /**
  * Test case for BGP KEEPALIVE Message.
  */
-public class BGPKeepaliveMsgTest {
+public class BgpKeepaliveMsgTest {
 
     /**
      * This test case checks BGP Keepalive message.
      */
     @Test
-    public void keepaliveMessageTest1() throws BGPParseException {
+    public void keepaliveMessageTest1() throws BgpParseException {
 
         // BGP KEEPALIVE Message
         byte[] keepaliveMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -47,13 +47,13 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(keepaliveMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPKeepaliveMsg.class));
+        assertThat(message, instanceOf(BgpKeepaliveMsg.class));
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
 
diff --git a/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpNotificationMsgTest.java b/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpNotificationMsgTest.java
index 78edf13..6dfa57e 100644
--- a/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpNotificationMsgTest.java
+++ b/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpNotificationMsgTest.java
@@ -18,8 +18,8 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.types.BgpHeader;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.instanceOf;
@@ -33,10 +33,10 @@
     /**
      * Notification message with error code, error subcode and data.
      *
-     * @throws BGPParseException while decoding and encoding notification message
+     * @throws BgpParseException while decoding and encoding notification message
      */
     @Test
-    public void bgpNotificationMessageTest1() throws BGPParseException {
+    public void bgpNotificationMessageTest1() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -52,12 +52,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
@@ -72,10 +72,10 @@
     /**
      * Notification message without data.
      *
-     * @throws BGPParseException  while decoding and encoding notification message
+     * @throws BgpParseException  while decoding and encoding notification message
      */
     @Test
-    public void bgpNotificationMessageTest2() throws BGPParseException {
+    public void bgpNotificationMessageTest2() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -90,12 +90,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
@@ -111,10 +111,10 @@
     /**
      * Notification message with wrong maker value.
      *
-     * @throws BGPParseException while decoding and encoding notification message
+     * @throws BgpParseException while decoding and encoding notification message
      */
-    @Test(expected = BGPParseException.class)
-    public void bgpNotificationMessageTest3() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void bgpNotificationMessageTest3() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -129,12 +129,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
@@ -149,10 +149,10 @@
     /**
      * Notification message without error subcode.
      *
-     * @throws BGPParseException while decoding and encoding notification message
+     * @throws BgpParseException while decoding and encoding notification message
      */
-    @Test(expected = BGPParseException.class)
-    public void bgpNotificationMessageTest4() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void bgpNotificationMessageTest4() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -167,12 +167,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
@@ -187,10 +187,10 @@
     /**
      * Notification message with wrong message length.
      *
-     * @throws BGPParseException while decoding and encoding notification message
+     * @throws BgpParseException while decoding and encoding notification message
      */
-    @Test(expected = BGPParseException.class)
-    public void bgpNotificationMessageTest5() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void bgpNotificationMessageTest5() throws BgpParseException {
         byte[] notificationMsg = new byte[] {(byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
                                              (byte) 0xff, (byte) 0xff,
@@ -205,12 +205,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(notificationMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message = null;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message = null;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
-        assertThat(message, instanceOf(BGPNotificationMsg.class));
+        assertThat(message, instanceOf(BgpNotificationMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
diff --git a/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BGPOpenMsgTest.java b/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpOpenMsgTest.java
similarity index 81%
rename from bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BGPOpenMsgTest.java
rename to bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpOpenMsgTest.java
index d521017..1fe4036 100755
--- a/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BGPOpenMsgTest.java
+++ b/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/BgpOpenMsgTest.java
@@ -18,8 +18,8 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
-import org.onosproject.bgpio.exceptions.BGPParseException;
-import org.onosproject.bgpio.types.BGPHeader;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.types.BgpHeader;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.instanceOf;
@@ -28,13 +28,13 @@
 /**
  * Test cases for BGP Open Message.
  */
-public class BGPOpenMsgTest {
+public class BgpOpenMsgTest {
 
     /**
      * This test case checks open message without optional parameter.
      */
     @Test
-    public void openMessageTest1() throws BGPParseException {
+    public void openMessageTest1() throws BgpParseException {
         //Open message without optional parameter
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
                                      (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -48,12 +48,12 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
 
@@ -69,7 +69,7 @@
      * capability.
      */
     @Test
-    public void openMessageTest2() throws BGPParseException {
+    public void openMessageTest2() throws BgpParseException {
 
         // OPEN Message (MultiProtocolExtension-CAPABILITY).
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -91,13 +91,13 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
 
@@ -113,7 +113,7 @@
      * capability.
      */
     @Test
-    public void openMessageTest3() throws BGPParseException {
+    public void openMessageTest3() throws BgpParseException {
 
         // OPEN Message (Four-Octet AS number capability).
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -135,13 +135,13 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
 
@@ -156,7 +156,7 @@
      * This test case checks open message with capabilities.
      */
     @Test
-    public void openMessageTest4() throws BGPParseException {
+    public void openMessageTest4() throws BgpParseException {
 
         // OPEN Message with capabilities.
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -178,13 +178,13 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
 
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
@@ -200,8 +200,8 @@
      * In this test case, Invalid version is given as input and expecting
      * an exception.
      */
-    @Test(expected = BGPParseException.class)
-    public void openMessageTest5() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void openMessageTest5() throws BgpParseException {
 
         // OPEN Message with invalid version number.
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -217,20 +217,20 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
     }
 
     /**
      * In this test case, Marker is set as 0 in input and expecting
      * an exception.
      */
-    @Test(expected = BGPParseException.class)
-    public void openMessageTest6() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void openMessageTest6() throws BgpParseException {
 
         // OPEN Message with marker set to 0.
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -246,20 +246,20 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
     }
 
     /**
      * In this test case, Invalid message length is given as input and expecting
      * an exception.
      */
-    @Test(expected = BGPParseException.class)
-    public void openMessageTest7() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void openMessageTest7() throws BgpParseException {
 
         // OPEN Message with invalid header length.
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -275,20 +275,20 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
     }
 
     /**
      * In this test case, Invalid message type is given as input and expecting
      * an exception.
      */
-    @Test(expected = BGPParseException.class)
-    public void openMessageTest8() throws BGPParseException {
+    @Test(expected = BgpParseException.class)
+    public void openMessageTest8() throws BgpParseException {
 
         // OPEN Message with invalid message type.
         byte[] openMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -304,11 +304,11 @@
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
         buffer.writeBytes(openMsg);
 
-        BGPMessageReader<BGPMessage> reader = BGPFactories.getGenericReader();
-        BGPMessage message;
-        BGPHeader bgpHeader = new BGPHeader();
+        BgpMessageReader<BgpMessage> reader = BgpFactories.getGenericReader();
+        BgpMessage message;
+        BgpHeader bgpHeader = new BgpHeader();
         message = reader.readFrom(buffer, bgpHeader);
 
-        assertThat(message, instanceOf(BGPOpenMsg.class));
+        assertThat(message, instanceOf(BgpOpenMsg.class));
     }
 }
diff --git a/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BGPLSIdentifierTest.java b/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpLSIdentifierTest.java
similarity index 82%
rename from bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BGPLSIdentifierTest.java
rename to bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpLSIdentifierTest.java
index f3355d3..59cf96f 100644
--- a/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BGPLSIdentifierTest.java
+++ b/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/BgpLSIdentifierTest.java
@@ -22,12 +22,12 @@
 /**
  * Test for BGPLSIdentifier Tlv.
  */
-public class BGPLSIdentifierTest {
+public class BgpLSIdentifierTest {
     private final int value1 = 8738;
     private final int value2 = 13107;
-    private final BGPLSIdentifierTlv tlv1 = BGPLSIdentifierTlv.of(value1);
-    private final BGPLSIdentifierTlv sameAsTlv1 = new BGPLSIdentifierTlv(value1);
-    private final BGPLSIdentifierTlv tlv2 = new BGPLSIdentifierTlv(value2);
+    private final BgpLSIdentifierTlv tlv1 = BgpLSIdentifierTlv.of(value1);
+    private final BgpLSIdentifierTlv sameAsTlv1 = new BgpLSIdentifierTlv(value1);
+    private final BgpLSIdentifierTlv tlv2 = new BgpLSIdentifierTlv(value2);
 
     @Test
     public void basics() {
diff --git a/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/LocalPrefTest.java b/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/LocalPrefTest.java
index 02a06e05..1bd3438 100644
--- a/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/LocalPrefTest.java
+++ b/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/LocalPrefTest.java
@@ -13,10 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.bgpio;
+package org.onosproject.bgpio.types;
 
 import org.junit.Test;
-import org.onosproject.bgpio.types.LocalPref;
 
 import com.google.common.testing.EqualsTester;
 
@@ -32,9 +31,6 @@
 
     @Test
     public void testEquality() {
-        new EqualsTester()
-        .addEqualityGroup(attr1, sameAsAttr1)
-        .addEqualityGroup(attr2)
-        .testEquals();
+        new EqualsTester().addEqualityGroup(attr1, sameAsAttr1).addEqualityGroup(attr2).testEquals();
     }
 }
diff --git a/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/MedTest.java b/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/MedTest.java
index eafcec7..2ee5b33 100644
--- a/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/MedTest.java
+++ b/bgp/bgpio/src/test/java/org/onosproject/bgpio/types/MedTest.java
@@ -13,10 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.bgpio;
+package org.onosproject.bgpio.types;
 
 import org.junit.Test;
-import org.onosproject.bgpio.types.Med;
 
 import com.google.common.testing.EqualsTester;
 
@@ -32,9 +31,6 @@
 
     @Test
     public void testEquality() {
-        new EqualsTester()
-        .addEqualityGroup(attr1, sameAsAttr1)
-        .addEqualityGroup(attr2)
-        .testEquals();
+        new EqualsTester().addEqualityGroup(attr1, sameAsAttr1).addEqualityGroup(attr2).testEquals();
     }
 }
