diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcInitiatedLspRequestVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcInitiatedLspRequestVer1.java
index d61f731..a179b74 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcInitiatedLspRequestVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcInitiatedLspRequestVer1.java
@@ -145,10 +145,10 @@
      */
     public static class Builder implements PcInitiatedLspRequest.Builder {
 
-        private boolean bIsSRPObjectSet = false;
-        private boolean bIsLSPObjectSet = false;
+        private boolean bIsSrpObjectSet = false;
+        private boolean bIsLspObjectSet = false;
         private boolean bIsEndPointsObjectSet = false;
-        private boolean bIsEROObjectSet = false;
+        private boolean bIsEroObjectSet = false;
         private boolean bIsPcepAttributeSet = false;
         private boolean bIsbRFlagSet = false;
 
@@ -178,7 +178,7 @@
             PcepAttribute pcepAttribute = null;
             boolean bRFlag = false;
 
-            if (!this.bIsSRPObjectSet) {
+            if (!this.bIsSrpObjectSet) {
                 throw new PcepParseException("Srp object NOT Set while building PcInitiatedLspRequest");
             } else {
                 srpObject = this.srpObject;
@@ -191,7 +191,7 @@
                 this.bIsbRFlagSet = false;
             }
 
-            if (!this.bIsLSPObjectSet) {
+            if (!this.bIsLspObjectSet) {
                 throw new PcepParseException("LSP Object NOT Set while building PcInitiatedLspRequest");
             } else {
                 lspObject = this.lspObject;
@@ -203,7 +203,7 @@
                 } else {
                     endPointsObject = this.endPointsObject;
                 }
-                if (!this.bIsEROObjectSet) {
+                if (!this.bIsEroObjectSet) {
                     throw new PcepParseException("ERO Object NOT Set while building PcInitiatedLspRequest");
                 } else {
                     eroObject = this.eroObject;
@@ -243,7 +243,7 @@
         @Override
         public Builder setSrpObject(PcepSrpObject srpobj) {
             this.srpObject = srpobj;
-            this.bIsSRPObjectSet = true;
+            this.bIsSrpObjectSet = true;
             return this;
 
         }
@@ -251,7 +251,7 @@
         @Override
         public Builder setLspObject(PcepLspObject lspObject) {
             this.lspObject = lspObject;
-            this.bIsLSPObjectSet = true;
+            this.bIsLspObjectSet = true;
             return this;
         }
 
@@ -265,7 +265,7 @@
         @Override
         public Builder setEroObject(PcepEroObject eroObject) {
             this.eroObject = eroObject;
-            this.bIsEROObjectSet = true;
+            this.bIsEroObjectSet = true;
             return this;
         }
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepLabelUpdateVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepLabelUpdateVer1.java
index a2293d3..0bc675e 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepLabelUpdateVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepLabelUpdateVer1.java
@@ -236,7 +236,7 @@
             default:
                 throw new PcepParseException("Unkown FEC object type " + tempObjHeader.getObjType());
             }
-            labelMap.setFECObject(fecObject);
+            labelMap.setFecObject(fecObject);
             pceLabelUpdate.setLabelMap(labelMap);
         } else {
             throw new PcepParseException(
@@ -308,7 +308,7 @@
             } else {
                 labelObject.write(cb);
             }
-            fecObject = labelMap.getFECObject();
+            fecObject = labelMap.getFecObject();
             if (fecObject == null) {
                 throw new PcepParseException("fec Object is mandatory object for Label map.");
             } else {
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepMsgPathVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepMsgPathVer1.java
index 49c738f..a7fbc53 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepMsgPathVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepMsgPathVer1.java
@@ -121,7 +121,7 @@
      */
     public static class Builder implements PcepMsgPath.Builder {
 
-        private boolean bIsEROObjectSet = false;
+        private boolean bIsEroObjectSet = false;
         private boolean bIsPcepAttributeSet = false;
 
         //PCEP ERO Object
@@ -137,7 +137,7 @@
             //PCEP Attribute list
             PcepAttribute pcepAttribute = null;
 
-            if (!this.bIsEROObjectSet) {
+            if (!this.bIsEroObjectSet) {
                 throw new PcepParseException("ERO Object NOT Set while building PcepMsgPath.");
             } else {
                 eroObject = this.eroObject;
@@ -164,7 +164,7 @@
         @Override
         public Builder setEroObject(PcepEroObject eroObject) {
             this.eroObject = eroObject;
-            this.bIsEROObjectSet = true;
+            this.bIsEroObjectSet = true;
             return this;
         }
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepStateReportVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepStateReportVer1.java
index ce589bc..d67bfd3 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepStateReportVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepStateReportVer1.java
@@ -333,8 +333,8 @@
      */
     public static class Builder implements PcepStateReport.Builder {
 
-        private boolean bIsSRPObjectSet = false;
-        private boolean bIsLSPObjectSet = false;
+        private boolean bIsSrpObjectSet = false;
+        private boolean bIsLspObjectSet = false;
         private boolean bIsPcepMsgPathSet = false;
 
         //PCEP SRP Object
@@ -354,11 +354,11 @@
             //PCEP Attribute list
             PcepStateReport.PcepMsgPath msgPath = null;
 
-            if (this.bIsSRPObjectSet) {
+            if (this.bIsSrpObjectSet) {
                 srpObject = this.srpObject;
             }
 
-            if (!this.bIsLSPObjectSet) {
+            if (!this.bIsLspObjectSet) {
                 throw new PcepParseException(" LSP Object NOT Set while building PcepStateReport.");
             } else {
                 lspObject = this.lspObject;
@@ -390,14 +390,14 @@
         @Override
         public Builder setSrpObject(PcepSrpObject srpobj) {
             this.srpObject = srpobj;
-            this.bIsSRPObjectSet = true;
+            this.bIsSrpObjectSet = true;
             return this;
         }
 
         @Override
         public Builder setLspObject(PcepLspObject lspObject) {
             this.lspObject = lspObject;
-            this.bIsLSPObjectSet = true;
+            this.bIsLspObjectSet = true;
             return this;
         }
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepUpdateRequestVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepUpdateRequestVer1.java
index 0bcc290..9fc8d70 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepUpdateRequestVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepUpdateRequestVer1.java
@@ -110,8 +110,8 @@
      */
     public static class Builder implements PcepUpdateRequest.Builder {
 
-        private boolean bIsSRPObjectSet = false;
-        private boolean bIsLSPObjectSet = false;
+        private boolean bIsSrpObjectSet = false;
+        private boolean bIsLspObjectSet = false;
         private boolean bIsPcepMsgPathSet = false;
 
         //PCEP SRP Object
@@ -131,12 +131,12 @@
             //PCEP Attribute list
             PcepMsgPath msgPath = null;
 
-            if (!this.bIsSRPObjectSet) {
+            if (!this.bIsSrpObjectSet) {
                 throw new PcepParseException(" SRP Object NOT Set while building PcepUpdateRequest.");
             } else {
                 srpObject = this.srpObject;
             }
-            if (!this.bIsLSPObjectSet) {
+            if (!this.bIsLspObjectSet) {
                 throw new PcepParseException(" LSP Object NOT Set while building PcepUpdateRequest.");
             } else {
                 lspObject = this.lspObject;
@@ -168,7 +168,7 @@
         @Override
         public Builder setSrpObject(PcepSrpObject srpobj) {
             this.srpObject = srpobj;
-            this.bIsSRPObjectSet = true;
+            this.bIsSrpObjectSet = true;
             return this;
 
         }
@@ -176,7 +176,7 @@
         @Override
         public Builder setLspObject(PcepLspObject lspObject) {
             this.lspObject = lspObject;
-            this.bIsLSPObjectSet = true;
+            this.bIsLspObjectSet = true;
             return this;
         }
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/BGPLSidentifierTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/BgpLsIdentifierTlv.java
similarity index 88%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/BGPLSidentifierTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/BgpLsIdentifierTlv.java
index 4981649..9fd80c4 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/BGPLSidentifierTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/BgpLsIdentifierTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides BGP LS identifier which contains opaque value (32 Bit ID).
  */
-public class BGPLSidentifierTlv implements PcepValueType {
+public class BgpLsIdentifierTlv implements PcepValueType {
 
     /* Reference :draft-ietf-idr-ls-distribution-10
      *  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 = 17; //TODD:change this TBD11
     public static final short LENGTH = 4;
@@ -51,7 +51,7 @@
      *
      * @param rawValue BGP LS identifier Tlv
      */
-    public BGPLSidentifierTlv(int rawValue) {
+    public BgpLsIdentifierTlv(int rawValue) {
         this.rawValue = rawValue;
     }
 
@@ -61,8 +61,8 @@
      * @param raw value
      * @return object of BGPLSidentifierTlv
      */
-    public static BGPLSidentifierTlv of(final int raw) {
-        return new BGPLSidentifierTlv(raw);
+    public static BgpLsIdentifierTlv of(final int raw) {
+        return new BgpLsIdentifierTlv(raw);
     }
 
     /**
@@ -99,8 +99,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof BGPLSidentifierTlv) {
-            BGPLSidentifierTlv other = (BGPLSidentifierTlv) obj;
+        if (obj instanceof BgpLsIdentifierTlv) {
+            BgpLsIdentifierTlv other = (BgpLsIdentifierTlv) obj;
             return Objects.equals(rawValue, other.rawValue);
         }
         return false;
@@ -121,8 +121,8 @@
      * @param c input channel buffer
      * @return object of BGP LS identifier Tlv
      */
-    public static BGPLSidentifierTlv read(ChannelBuffer c) {
-        return BGPLSidentifierTlv.of(c.readInt());
+    public static BgpLsIdentifierTlv read(ChannelBuffer c) {
+        return BgpLsIdentifierTlv.of(c.readInt());
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6InterfaceAddressTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6InterfaceAddressTlv.java
index 62a5588..386de1d 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6InterfaceAddressTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6InterfaceAddressTlv.java
@@ -15,15 +15,14 @@
  */
 package org.onosproject.pcepio.types;
 
-import java.util.Arrays;
-
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.protocol.PcepVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
+import java.util.Arrays;
 
 /**
  * Provides IPv6 Interface Address. REFERENCE :[RFC6119]/4.2.
@@ -65,15 +64,15 @@
      */
     public static IPv6InterfaceAddressTlv of(final byte[] raw) {
         //check NONE_VAL
-        boolean bFoundNONE = true;
+        boolean bFoundNone = true;
         //value starts from 3rd byte.
         for (int i = 2; i < 20; ++i) {
             if (NONE_VAL[i] != raw[i]) {
-                bFoundNONE = false;
+                bFoundNone = false;
             }
         }
 
-        if (bFoundNONE) {
+        if (bFoundNone) {
             return NONE;
         }
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6NeighborAddressTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6NeighborAddressTlv.java
index fb9b98a..3684af9 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6NeighborAddressTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6NeighborAddressTlv.java
@@ -15,15 +15,14 @@
  */
 package org.onosproject.pcepio.types;
 
-import java.util.Arrays;
-
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.protocol.PcepVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
+import java.util.Arrays;
 
 /**
  * Provides IPv6 Neighbor Address. Reference :[RFC6119]/4.3.
@@ -63,15 +62,15 @@
      */
     public static IPv6NeighborAddressTlv of(final byte[] raw) {
         //check NONE_VAL
-        boolean bFoundNONE = true;
+        boolean bFoundNone = true;
         //value starts from 3rd byte.
         for (int i = 2; i < 20; ++i) {
             if (NONE_VAL[i] != raw[i]) {
-                bFoundNONE = false;
+                bFoundNone = false;
             }
         }
 
-        if (bFoundNONE) {
+        if (bFoundNone) {
             return NONE;
         }
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6SubObject.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6SubObject.java
index b3164f2..d05240f 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6SubObject.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6SubObject.java
@@ -16,15 +16,14 @@
 
 package org.onosproject.pcepio.types;
 
-import java.util.Arrays;
-
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.protocol.PcepVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
+import java.util.Arrays;
 
 /**
  * Provides IPv6 Sub Object.
@@ -115,15 +114,15 @@
      */
     public static IPv6SubObject of(final byte[] raw) {
         //check NONE_VAL
-        boolean bFoundNONE = true;
+        boolean bFoundNone = true;
         //value starts from 3rd byte.
         for (int i = 2; i < 20; ++i) {
             if (NONE_VAL[i] != raw[i]) {
-                bFoundNONE = false;
+                bFoundNone = false;
             }
         }
 
-        if (bFoundNONE) {
+        if (bFoundNone) {
             return NONE;
         }
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6TERouterIdofLocalNodeTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6TERouterIdofLocalNodeTlv.java
index f10d5e3..7330fa0 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6TERouterIdofLocalNodeTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6TERouterIdofLocalNodeTlv.java
@@ -15,15 +15,14 @@
  */
 package org.onosproject.pcepio.types;
 
-import java.util.Arrays;
-
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.protocol.PcepVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
+import java.util.Arrays;
 
 /**
  * Provides IPv6 TE Router Id of Local Node. Reference :[RFC6119]/4.1.
@@ -63,15 +62,15 @@
      */
     public static IPv6TERouterIdofLocalNodeTlv of(final byte[] raw) {
         //check NONE_VAL
-        boolean bFoundNONE = true;
+        boolean bFoundNone = true;
         //value starts from 3rd byte.
         for (int i = 2; i < 20; ++i) {
             if (NONE_VAL[i] != raw[i]) {
-                bFoundNONE = false;
+                bFoundNone = false;
             }
         }
 
-        if (bFoundNONE) {
+        if (bFoundNone) {
             return NONE;
         }
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlv.java
index bf1d475..dd24788 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlv.java
@@ -15,15 +15,14 @@
  */
 package org.onosproject.pcepio.types;
 
-import java.util.Arrays;
-
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.protocol.PcepVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
+import java.util.Arrays;
 
 /**
  * Provides IPv6 TE Router Id of Remote Node.  Reference :[RFC6119]/4.1.
@@ -64,15 +63,15 @@
      */
     public static IPv6TERouterIdofRemoteNodeTlv of(final byte[] raw) {
         //check NONE_VAL
-        boolean bFoundNONE = true;
+        boolean bFoundNone = true;
         //value starts from 3rd byte.
         for (int i = 2; i < 20; ++i) {
             if (NONE_VAL[i] != raw[i]) {
-                bFoundNONE = false;
+                bFoundNone = false;
             }
         }
 
-        if (bFoundNONE) {
+        if (bFoundNone) {
             return NONE;
         }
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IGPMetricTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IgpMetricTlv.java
similarity index 88%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IGPMetricTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IgpMetricTlv.java
index 07cfea7..fb8eee3 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IGPMetricTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IgpMetricTlv.java
@@ -15,20 +15,19 @@
  */
 package org.onosproject.pcepio.types;
 
-import java.util.Arrays;
-
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.protocol.PcepVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
+import java.util.Arrays;
 
 /**
  * Provides IGP Link Metric .
  */
-public class IGPMetricTlv implements PcepValueType {
+public class IgpMetricTlv implements PcepValueType {
 
     /* Reference :[I-D.ietf-idr-ls-distribution] /3.3.2.4
      *  0                   1                   2                   3
@@ -40,7 +39,7 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(IGPMetricTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(IgpMetricTlv.class);
 
     public static final short TYPE = 1095; //TODO:NEED TO HANDLE TDB40
     private short hLength;
@@ -53,7 +52,7 @@
      * @param rawValue IGP Link Metric
      * @param hLength length
      */
-    public IGPMetricTlv(byte[] rawValue, short hLength) {
+    public IgpMetricTlv(byte[] rawValue, short hLength) {
         this.rawValue = rawValue;
         this.hLength = hLength;
     }
@@ -65,8 +64,8 @@
      * @param hLength length
      * @return object of IGPMetricTlv
      */
-    public static IGPMetricTlv of(final byte[] raw, short hLength) {
-        return new IGPMetricTlv(raw, hLength);
+    public static IgpMetricTlv of(final byte[] raw, short hLength) {
+        return new IgpMetricTlv(raw, hLength);
     }
 
     /**
@@ -103,8 +102,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof IGPMetricTlv) {
-            IGPMetricTlv other = (IGPMetricTlv) obj;
+        if (obj instanceof IgpMetricTlv) {
+            IgpMetricTlv other = (IgpMetricTlv) obj;
             return Arrays.equals(rawValue, other.rawValue);
         }
         return false;
@@ -127,9 +126,9 @@
      * @return object of IGPMetricTlv
      */
     public static PcepValueType read(ChannelBuffer c, short hLength) {
-        byte[] iIGPMetric = new byte[hLength];
-        c.readBytes(iIGPMetric, 0, hLength);
-        return new IGPMetricTlv(iIGPMetric, hLength);
+        byte[] iIgpMetric = new byte[hLength];
+        c.readBytes(iIgpMetric, 0, hLength);
+        return new IgpMetricTlv(iIgpMetric, hLength);
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/ISISAreaIdentifierTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IsisAreaIdentifierTlv.java
similarity index 87%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/ISISAreaIdentifierTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IsisAreaIdentifierTlv.java
index f9fb4f8..4382fc5 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/ISISAreaIdentifierTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IsisAreaIdentifierTlv.java
@@ -15,21 +15,20 @@
  */
 package org.onosproject.pcepio.types;
 
-import java.util.Arrays;
-import java.util.Objects;
-
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.protocol.PcepVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
+import java.util.Arrays;
+import java.util.Objects;
 
 /**
  * Provides ISIS Area Identifier.
  */
-public class ISISAreaIdentifierTlv implements PcepValueType {
+public class IsisAreaIdentifierTlv implements PcepValueType {
 
     /* Reference :[I-D.ietf-idr- ls-distribution]/3.3.1.2
      * 0                   1                   2                   3
@@ -41,7 +40,7 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(ISISAreaIdentifierTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(IsisAreaIdentifierTlv.class);
 
     public static final short TYPE = 107; //TODO:NEED TO HANDLE TBD24
     private short hLength;
@@ -54,7 +53,7 @@
      * @param rawValue ISIS-Area-Identifier
      * @param hLength length
      */
-    public ISISAreaIdentifierTlv(byte[] rawValue, short hLength) {
+    public IsisAreaIdentifierTlv(byte[] rawValue, short hLength) {
         log.debug("ISISAreaIdentifierTlv");
         this.rawValue = rawValue;
         if (0 == hLength) {
@@ -71,8 +70,8 @@
      * @param hLength length
      * @return object of ISISAreaIdentifierTlv
      */
-    public static ISISAreaIdentifierTlv of(final byte[] raw, short hLength) {
-        return new ISISAreaIdentifierTlv(raw, hLength);
+    public static IsisAreaIdentifierTlv of(final byte[] raw, short hLength) {
+        return new IsisAreaIdentifierTlv(raw, hLength);
     }
 
     /**
@@ -109,8 +108,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof ISISAreaIdentifierTlv) {
-            ISISAreaIdentifierTlv other = (ISISAreaIdentifierTlv) obj;
+        if (obj instanceof IsisAreaIdentifierTlv) {
+            IsisAreaIdentifierTlv other = (IsisAreaIdentifierTlv) obj;
             return Objects.equals(hLength, other.hLength) && Arrays.equals(rawValue, other.rawValue);
         }
         return false;
@@ -133,9 +132,9 @@
      * @return object of ISISAreaIdentifierTlv
      */
     public static PcepValueType read(ChannelBuffer c, short hLength) {
-        byte[] iISISAreaIdentifier = new byte[hLength];
-        c.readBytes(iISISAreaIdentifier, 0, hLength);
-        return new ISISAreaIdentifierTlv(iISISAreaIdentifier, hLength);
+        byte[] iIsisAreaIdentifier = new byte[hLength];
+        c.readBytes(iIsisAreaIdentifier, 0, hLength);
+        return new IsisAreaIdentifierTlv(iIsisAreaIdentifier, hLength);
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlv.java
index b31dac2..e2f9779 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlv.java
@@ -201,13 +201,13 @@
                 iValue = tempCb.readInt();
                 tlv = new AutonomousSystemTlv(iValue);
                 break;
-            case BGPLSidentifierTlv.TYPE:
+            case BgpLsIdentifierTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new BGPLSidentifierTlv(iValue);
+                tlv = new BgpLsIdentifierTlv(iValue);
                 break;
-            case OSPFareaIDsubTlv.TYPE:
+            case OspfAreaIdSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new OSPFareaIDsubTlv(iValue);
+                tlv = new OspfAreaIdSubTlv(iValue);
                 break;
             case RouterIDSubTlv.TYPE:
                 tlv = RouterIDSubTlv.read(tempCb, length);
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MPLSProtocolMaskTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MplsProtocolMaskTlv.java
similarity index 91%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MPLSProtocolMaskTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MplsProtocolMaskTlv.java
index fc0f877..95f8514 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MPLSProtocolMaskTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MplsProtocolMaskTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides MPLS Protocol Mask.
  */
-public class MPLSProtocolMaskTlv implements PcepValueType {
+public class MplsProtocolMaskTlv implements PcepValueType {
 
     /* Reference :[I-D.ietf-idr-ls-distribution]/3.3.2.2
      *  0                   1                   2                   3
@@ -38,7 +38,7 @@
      |L|R|  Reserved |
      +-+-+-+-+-+-+-+-+
      */
-    protected static final Logger log = LoggerFactory.getLogger(MPLSProtocolMaskTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(MplsProtocolMaskTlv.class);
 
     public static final short TYPE = 1094; //TDB39
     public static final short LENGTH = 1;
@@ -55,7 +55,7 @@
      *
      * @param rawValue MPLS Protocol Mask Flag Bits
      */
-    public MPLSProtocolMaskTlv(byte rawValue) {
+    public MplsProtocolMaskTlv(byte rawValue) {
         this.rawValue = rawValue;
         this.isRawValueSet = true;
         this.bLFlag = (rawValue & LFLAG_SET) == LFLAG_SET;
@@ -68,7 +68,7 @@
      * @param bLFlag L-flag
      * @param bRFlag R-flag
      */
-    public MPLSProtocolMaskTlv(boolean bLFlag, boolean bRFlag) {
+    public MplsProtocolMaskTlv(boolean bLFlag, boolean bRFlag) {
         this.bLFlag = bLFlag;
         this.bRFlag = bRFlag;
         this.rawValue = 0;
@@ -81,8 +81,8 @@
      * @param raw MPLS Protocol Mask Tlv
      * @return new object of MPLS Protocol Mask Tlv
      */
-    public static MPLSProtocolMaskTlv of(final byte raw) {
-        return new MPLSProtocolMaskTlv(raw);
+    public static MplsProtocolMaskTlv of(final byte raw) {
+        return new MplsProtocolMaskTlv(raw);
     }
 
     /**
@@ -141,8 +141,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof MPLSProtocolMaskTlv) {
-            MPLSProtocolMaskTlv other = (MPLSProtocolMaskTlv) obj;
+        if (obj instanceof MplsProtocolMaskTlv) {
+            MplsProtocolMaskTlv other = (MplsProtocolMaskTlv) obj;
             if (isRawValueSet) {
                 return Objects.equals(this.rawValue, other.rawValue);
             } else {
@@ -186,7 +186,7 @@
         bLFlag = (temp & LFLAG_SET) == LFLAG_SET;
         bRFlag = (temp & RFLAG_SET) == RFLAG_SET;
 
-        return new MPLSProtocolMaskTlv(bLFlag, bRFlag);
+        return new MplsProtocolMaskTlv(bLFlag, bRFlag);
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NexthopIPv6addressTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NexthopIPv6addressTlv.java
index 45bf7ac..059577f 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NexthopIPv6addressTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NexthopIPv6addressTlv.java
@@ -16,15 +16,14 @@
 
 package org.onosproject.pcepio.types;
 
-import java.util.Objects;
-
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.protocol.PcepVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
+import java.util.Objects;
 
 /**
  * NexthopIPv6addressTlv provides Ipv6  address of next hop.
@@ -84,15 +83,15 @@
     //logic to be checked
     public static NexthopIPv6addressTlv of(final byte[] raw) {
         //check NONE_VAL
-        boolean bFoundNONE = true;
+        boolean bFoundNone = true;
         //value starts from 3rd byte.
         for (int i = 5; i < 20; ++i) {
             if (NONE_VAL[i] != raw[i]) {
-                bFoundNONE = false;
+                bFoundNone = false;
             }
         }
 
-        if (bFoundNONE) {
+        if (bFoundNone) {
             return NONE;
         }
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OSPFareaIDsubTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OspfAreaIdSubTlv.java
similarity index 88%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OSPFareaIDsubTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OspfAreaIdSubTlv.java
index 2233ab0..d60eb60 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OSPFareaIDsubTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OspfAreaIdSubTlv.java
@@ -15,18 +15,18 @@
  */
 package org.onosproject.pcepio.types;
 
-import java.util.Objects;
+import com.google.common.base.MoreObjects;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.protocol.PcepVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.MoreObjects;
+import java.util.Objects;
 
 /**
  * Provides area ID for OSPF area.
  */
-public class OSPFareaIDsubTlv implements PcepValueType {
+public class OspfAreaIdSubTlv implements PcepValueType {
 
     /* Reference :draft-ietf-idr-ls-distribution-10.
      *  0                   1                   2                   3
@@ -38,7 +38,7 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(OSPFareaIDsubTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(OspfAreaIdSubTlv.class);
 
     public static final short TYPE = 600; //TODD:change this TBD12
     public static final short LENGTH = 4;
@@ -50,7 +50,7 @@
      *
      * @param rawValue area ID for OSPF area.
      */
-    public OSPFareaIDsubTlv(int rawValue) {
+    public OspfAreaIdSubTlv(int rawValue) {
         this.rawValue = rawValue;
     }
 
@@ -60,8 +60,8 @@
      * @param raw opaque value of AreaID
      * @return new object of OSPF area ID sub TLV
      */
-    public static OSPFareaIDsubTlv of(final int raw) {
-        return new OSPFareaIDsubTlv(raw);
+    public static OspfAreaIdSubTlv of(final int raw) {
+        return new OspfAreaIdSubTlv(raw);
     }
 
     /**
@@ -98,8 +98,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof OSPFareaIDsubTlv) {
-            OSPFareaIDsubTlv other = (OSPFareaIDsubTlv) obj;
+        if (obj instanceof OspfAreaIdSubTlv) {
+            OspfAreaIdSubTlv other = (OspfAreaIdSubTlv) obj;
             return Objects.equals(this.rawValue, other.rawValue);
         }
         return false;
@@ -120,8 +120,8 @@
      * @param c input channel buffer
      * @return object of OSPFAreaIdSubTlv
      */
-    public static OSPFareaIDsubTlv read(ChannelBuffer c) {
-        return OSPFareaIDsubTlv.of(c.readInt());
+    public static OspfAreaIdSubTlv read(ChannelBuffer c) {
+        return OspfAreaIdSubTlv.of(c.readInt());
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepLabelMap.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepLabelMap.java
index 2d3a953..77273b0 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepLabelMap.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepLabelMap.java
@@ -43,7 +43,7 @@
      *
      * @param fecObject PCEP fec object
      */
-    public void setFECObject(PcepFecObject fecObject) {
+    public void setFecObject(PcepFecObject fecObject) {
         this.fecObject = fecObject;
     }
 
@@ -52,7 +52,7 @@
      *
      * @return PCEP fec object
      */
-    public PcepFecObject getFECObject() {
+    public PcepFecObject getFecObject() {
         return this.fecObject;
     }
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlv.java
index 9e8cea3..cabd709 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlv.java
@@ -204,13 +204,13 @@
                 iValue = tempCb.readInt();
                 tlv = new AutonomousSystemTlv(iValue);
                 break;
-            case BGPLSidentifierTlv.TYPE:
+            case BgpLsIdentifierTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new BGPLSidentifierTlv(iValue);
+                tlv = new BgpLsIdentifierTlv(iValue);
                 break;
-            case OSPFareaIDsubTlv.TYPE:
+            case OspfAreaIdSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new OSPFareaIDsubTlv(iValue);
+                tlv = new OspfAreaIdSubTlv(iValue);
                 break;
             case RouterIDSubTlv.TYPE:
                 tlv = RouterIDSubTlv.read(tempCb, hLength);
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SrEroSubObject.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SrEroSubObject.java
index 3cbb82c..e2b4a6b 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SrEroSubObject.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SrEroSubObject.java
@@ -16,15 +16,14 @@
 
 package org.onosproject.pcepio.types;
 
-import java.util.Objects;
-
+import com.google.common.base.MoreObjects;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.protocol.PcepNai;
 import org.onosproject.pcepio.protocol.PcepVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.MoreObjects;
+import java.util.Objects;
 
 /**
  * Provides SrEroSubObject.
@@ -185,7 +184,7 @@
      * Returns sID.
      * @return sID
      */
-    public int getSID() {
+    public int getSid() {
         return sID;
     }
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TELinkAttributesTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TELinkAttributesTlv.java
index b3b71ae..10e672e 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TELinkAttributesTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TELinkAttributesTlv.java
@@ -242,12 +242,12 @@
             case LinkProtectionTypeTlv.TYPE:
                 tlv = LinkProtectionTypeTlv.read(tempCb);
                 break;
-            case MPLSProtocolMaskTlv.TYPE:
+            case MplsProtocolMaskTlv.TYPE:
                 byte cValue = tempCb.readByte();
-                tlv = new MPLSProtocolMaskTlv(cValue);
+                tlv = new MplsProtocolMaskTlv(cValue);
                 break;
-            case IGPMetricTlv.TYPE:
-                tlv = IGPMetricTlv.read(tempCb, length);
+            case IgpMetricTlv.TYPE:
+                tlv = IgpMetricTlv.read(tempCb, length);
                 break;
             case SharedRiskLinkGroupTlv.TYPE:
                 tlv = SharedRiskLinkGroupTlv.read(tempCb, length);
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TENodeAttributesTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TENodeAttributesTlv.java
index f18b75b..10f54de 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TENodeAttributesTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TENodeAttributesTlv.java
@@ -204,8 +204,8 @@
             case NodeNameTlv.TYPE:
                 tlv = NodeNameTlv.read(tempCb, length);
                 break;
-            case ISISAreaIdentifierTlv.TYPE:
-                tlv = ISISAreaIdentifierTlv.read(tempCb, length);
+            case IsisAreaIdentifierTlv.TYPE:
+                tlv = IsisAreaIdentifierTlv.read(tempCb, length);
                 break;
             case IPv4TERouterIdOfLocalNodeTlv.TYPE:
                 iValue = tempCb.readInt();
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BGPLSidentifierTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BgpLsIdentifierTlvTest.java
similarity index 80%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BGPLSidentifierTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BgpLsIdentifierTlvTest.java
index 7ac6cea..78137a7 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BGPLSidentifierTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BgpLsIdentifierTlvTest.java
@@ -21,10 +21,10 @@
 /**
  * Test of the BGPLSidentifierTlv.
  */
-public class BGPLSidentifierTlvTest {
-    private final BGPLSidentifierTlv tlv1 = BGPLSidentifierTlv.of(1);
-    private final BGPLSidentifierTlv sameAsTlv1 = BGPLSidentifierTlv.of(1);
-    private final BGPLSidentifierTlv tlv2 = BGPLSidentifierTlv.of(2);
+public class BgpLsIdentifierTlvTest {
+    private final BgpLsIdentifierTlv tlv1 = BgpLsIdentifierTlv.of(1);
+    private final BgpLsIdentifierTlv sameAsTlv1 = BgpLsIdentifierTlv.of(1);
+    private final BgpLsIdentifierTlv tlv2 = BgpLsIdentifierTlv.of(2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IGPMetricTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpMetricTlvTest.java
similarity index 82%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IGPMetricTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpMetricTlvTest.java
index 2715a4d..20c9dc7 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IGPMetricTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpMetricTlvTest.java
@@ -21,12 +21,12 @@
 /**
  * Test of the IGPMetricTlv.
  */
-public class IGPMetricTlvTest {
+public class IgpMetricTlvTest {
     private final byte[] b1 = new byte[] {0x01, 0x02};
     private final byte[] b2 = new byte[] {0x01, 0x03};
-    private final IGPMetricTlv tlv1 = IGPMetricTlv.of(b1, (short) 2);
-    private final IGPMetricTlv sameAsTlv1 = IGPMetricTlv.of(b1, (short) 2);
-    private final IGPMetricTlv tlv2 = IGPMetricTlv.of(b2, (short) 2);
+    private final IgpMetricTlv tlv1 = IgpMetricTlv.of(b1, (short) 2);
+    private final IgpMetricTlv sameAsTlv1 = IgpMetricTlv.of(b1, (short) 2);
+    private final IgpMetricTlv tlv2 = IgpMetricTlv.of(b2, (short) 2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/ISISAreaIdentifierTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IsisAreaIdentifierTlvTest.java
similarity index 84%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/ISISAreaIdentifierTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IsisAreaIdentifierTlvTest.java
index 17584ac..a5a14c2 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/ISISAreaIdentifierTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IsisAreaIdentifierTlvTest.java
@@ -21,14 +21,14 @@
 /**
  * Test of the ISISAreaIdentifierTlv.
  */
-public class ISISAreaIdentifierTlvTest {
+public class IsisAreaIdentifierTlvTest {
 
     private final byte[] b1 = new byte[] {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
     private final byte[] b2 = new byte[] {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 };
 
-    private final ISISAreaIdentifierTlv tlv1 = ISISAreaIdentifierTlv.of(b1, (short) 20);
-    private final ISISAreaIdentifierTlv sameAsTlv1 = ISISAreaIdentifierTlv.of(b1, (short) 20);
-    private final ISISAreaIdentifierTlv tlv2 = ISISAreaIdentifierTlv.of(b2, (short) 20);
+    private final IsisAreaIdentifierTlv tlv1 = IsisAreaIdentifierTlv.of(b1, (short) 20);
+    private final IsisAreaIdentifierTlv sameAsTlv1 = IsisAreaIdentifierTlv.of(b1, (short) 20);
+    private final IsisAreaIdentifierTlv tlv2 = IsisAreaIdentifierTlv.of(b2, (short) 20);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlvTest.java
index e8b6abc..17daa75 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlvTest.java
@@ -26,10 +26,10 @@
 public class LocalTENodeDescriptorsTlvTest {
 
     private final AutonomousSystemTlv baAutoSysTlvRawValue1 = new AutonomousSystemTlv(1);
-    private final BGPLSidentifierTlv baBgplsIdRawValue1 = new BGPLSidentifierTlv(1);
+    private final BgpLsIdentifierTlv baBgplsIdRawValue1 = new BgpLsIdentifierTlv(1);
 
     private final AutonomousSystemTlv baAutoSysTlvRawValue2 = new AutonomousSystemTlv(2);
-    private final BGPLSidentifierTlv baBgplsIdRawValue2 = new BGPLSidentifierTlv(2);
+    private final BgpLsIdentifierTlv baBgplsIdRawValue2 = new BgpLsIdentifierTlv(2);
 
     private final LinkedList<PcepValueType> llNodeDescriptorSubTLVs1 = new LinkedList<PcepValueType>();
     private final boolean a = llNodeDescriptorSubTLVs1.add(baAutoSysTlvRawValue1);
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MPLSProtocolMaskTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MplsProtocolMaskTlvTest.java
similarity index 82%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MPLSProtocolMaskTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MplsProtocolMaskTlvTest.java
index 5e79e28..ff87b7a 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MPLSProtocolMaskTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MplsProtocolMaskTlvTest.java
@@ -21,13 +21,13 @@
 /**
  * Test of the MPLSProtocolMaskTlv.
  */
-public class MPLSProtocolMaskTlvTest {
+public class MplsProtocolMaskTlvTest {
     private final byte rawValue1 = 0x0A;
     private final byte rawValue2 = 0x0B;
 
-    private final MPLSProtocolMaskTlv tlv1 = new MPLSProtocolMaskTlv(rawValue1);
-    private final MPLSProtocolMaskTlv sameAsTlv1 = new MPLSProtocolMaskTlv(rawValue1);
-    private final MPLSProtocolMaskTlv tlv2 = MPLSProtocolMaskTlv.of(rawValue2);
+    private final MplsProtocolMaskTlv tlv1 = new MplsProtocolMaskTlv(rawValue1);
+    private final MplsProtocolMaskTlv sameAsTlv1 = new MplsProtocolMaskTlv(rawValue1);
+    private final MplsProtocolMaskTlv tlv2 = MplsProtocolMaskTlv.of(rawValue2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OSPFareaIDsubTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OspfAreaIdSubTlvTest.java
similarity index 85%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OSPFareaIDsubTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OspfAreaIdSubTlvTest.java
index 3f741ed..2ea3511 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OSPFareaIDsubTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OspfAreaIdSubTlvTest.java
@@ -21,11 +21,11 @@
 /**
  * Test of the OSPFareaIDsubTlv.
  */
-public class OSPFareaIDsubTlvTest {
+public class OspfAreaIdSubTlvTest {
     private final int rawValue1 = 0x0A;
 
-    private final OSPFareaIDsubTlv tlv1 = new OSPFareaIDsubTlv(rawValue1);
-    private final OSPFareaIDsubTlv tlv2 = OSPFareaIDsubTlv.of(tlv1.getInt());
+    private final OspfAreaIdSubTlv tlv1 = new OspfAreaIdSubTlv(rawValue1);
+    private final OspfAreaIdSubTlv tlv2 = OspfAreaIdSubTlv.of(tlv1.getInt());
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlvTest.java
index 112e4a4..8e74921 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlvTest.java
@@ -26,10 +26,10 @@
 public class RemoteTENodeDescriptorsTlvTest {
 
     private final AutonomousSystemTlv autonomousSystemTlv1 = new AutonomousSystemTlv(10);
-    private final BGPLSidentifierTlv bGPLSidentifierTlv1 = new BGPLSidentifierTlv(20);
+    private final BgpLsIdentifierTlv bGPLSidentifierTlv1 = new BgpLsIdentifierTlv(20);
 
     private final AutonomousSystemTlv autonomousSystemTlv2 = new AutonomousSystemTlv(20);
-    private final BGPLSidentifierTlv bGPLSidentifierTlv2 = new BGPLSidentifierTlv(30);
+    private final BgpLsIdentifierTlv bGPLSidentifierTlv2 = new BgpLsIdentifierTlv(30);
 
     private final LinkedList<PcepValueType> llRemoteTENodeDescriptorSubTLV1 = new LinkedList<>();
     private final boolean a = llRemoteTENodeDescriptorSubTLV1.add(autonomousSystemTlv1);
