diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepTEObjectVer1.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepTEObjectVer1.java
index d6c1aa8..56290cf 100644
--- a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepTEObjectVer1.java
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepTEObjectVer1.java
@@ -22,13 +22,13 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 import org.onosproject.pcepio.protocol.PcepTEObject;
-import org.onosproject.pcepio.types.LocalTENodeDescriptorsTLV;
+import org.onosproject.pcepio.types.LocalTENodeDescriptorsTlv;
 import org.onosproject.pcepio.types.PcepObjectHeader;
 import org.onosproject.pcepio.types.PcepValueType;
-import org.onosproject.pcepio.types.RemoteTENodeDescriptorsTLV;
-import org.onosproject.pcepio.types.RoutingUniverseTLV;
+import org.onosproject.pcepio.types.RemoteTENodeDescriptorsTlv;
+import org.onosproject.pcepio.types.RoutingUniverseTlv;
 import org.onosproject.pcepio.types.TELinkAttributesTlv;
-import org.onosproject.pcepio.types.TELinkDescriptorsTLV;
+import org.onosproject.pcepio.types.TELinkDescriptorsTlv;
 import org.onosproject.pcepio.types.TENodeAttributesTlv;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -288,18 +288,18 @@
 
             switch (hType) {
 
-            case RoutingUniverseTLV.TYPE:
+            case RoutingUniverseTlv.TYPE:
                 lValue = cb.readLong();
-                tlv = new RoutingUniverseTLV(lValue);
+                tlv = new RoutingUniverseTlv(lValue);
                 break;
-            case LocalTENodeDescriptorsTLV.TYPE:
-                tlv = LocalTENodeDescriptorsTLV.read(cb, hLength);
+            case LocalTENodeDescriptorsTlv.TYPE:
+                tlv = LocalTENodeDescriptorsTlv.read(cb, hLength);
                 break;
-            case RemoteTENodeDescriptorsTLV.TYPE:
-                tlv = RemoteTENodeDescriptorsTLV.read(cb, hLength);
+            case RemoteTENodeDescriptorsTlv.TYPE:
+                tlv = RemoteTENodeDescriptorsTlv.read(cb, hLength);
                 break;
-            case TELinkDescriptorsTLV.TYPE:
-                tlv = TELinkDescriptorsTLV.read(cb, hLength);
+            case TELinkDescriptorsTlv.TYPE:
+                tlv = TELinkDescriptorsTlv.read(cb, hLength);
                 break;
             case TENodeAttributesTlv.TYPE:
                 tlv = TENodeAttributesTlv.read(cb, hLength);
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTLV.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlv.java
similarity index 92%
rename from pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTLV.java
rename to pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlv.java
index eb6364b..6f84524 100644
--- a/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTLV.java
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlv.java
@@ -31,7 +31,7 @@
 /**
  * Provides Local TE Node Descriptors TLV which contains Node Descriptor Sub-TLVs.
  */
-public class LocalTENodeDescriptorsTLV implements PcepValueType {
+public class LocalTENodeDescriptorsTlv implements PcepValueType {
 
     /* REFERENCE :draft-ietf-idr-ls-distribution-10
      *  0                   1                   2                   3
@@ -46,7 +46,7 @@
      Note: Length is including header here. Refer Routing Universe TLV.
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(LocalTENodeDescriptorsTLV.class);
+    protected static final Logger log = LoggerFactory.getLogger(LocalTENodeDescriptorsTlv.class);
 
     public static final short TYPE = 1637; //TODD:change this TBD8
     public short hLength;
@@ -60,7 +60,7 @@
      *
      * @param llNodeDescriptorSubTLVs LinkedList of PcepValueType
      */
-    public LocalTENodeDescriptorsTLV(LinkedList<PcepValueType> llNodeDescriptorSubTLVs) {
+    public LocalTENodeDescriptorsTlv(LinkedList<PcepValueType> llNodeDescriptorSubTLVs) {
         this.llNodeDescriptorSubTLVs = llNodeDescriptorSubTLVs;
     }
 
@@ -70,8 +70,8 @@
      * @param llNodeDescriptorSubTLVs linked list of Node Descriptor Sub TLVs
      * @return object of LocalTENodeDescriptorsTLV
      */
-    public static LocalTENodeDescriptorsTLV of(final LinkedList<PcepValueType> llNodeDescriptorSubTLVs) {
-        return new LocalTENodeDescriptorsTLV(llNodeDescriptorSubTLVs);
+    public static LocalTENodeDescriptorsTlv of(final LinkedList<PcepValueType> llNodeDescriptorSubTLVs) {
+        return new LocalTENodeDescriptorsTlv(llNodeDescriptorSubTLVs);
     }
 
     /**
@@ -117,14 +117,14 @@
          * the size, if both are same then we should check for the subtlv objects otherwise
          * we should return false.
          */
-        if (obj instanceof LocalTENodeDescriptorsTLV) {
+        if (obj instanceof LocalTENodeDescriptorsTlv) {
             int countObjSubTlv = 0;
             int countOtherSubTlv = 0;
             boolean isCommonSubTlv = true;
-            LocalTENodeDescriptorsTLV other = (LocalTENodeDescriptorsTLV) obj;
-            Iterator<PcepValueType> objListIterator = ((LocalTENodeDescriptorsTLV) obj).llNodeDescriptorSubTLVs
+            LocalTENodeDescriptorsTlv other = (LocalTENodeDescriptorsTlv) obj;
+            Iterator<PcepValueType> objListIterator = ((LocalTENodeDescriptorsTlv) obj).llNodeDescriptorSubTLVs
                     .iterator();
-            countObjSubTlv = ((LocalTENodeDescriptorsTLV) obj).llNodeDescriptorSubTLVs.size();
+            countObjSubTlv = ((LocalTENodeDescriptorsTlv) obj).llNodeDescriptorSubTLVs.size();
             countOtherSubTlv = other.llNodeDescriptorSubTLVs.size();
             if (countObjSubTlv != countOtherSubTlv) {
                 return false;
@@ -232,7 +232,7 @@
         if (0 < tempCb.readableBytes()) {
             throw new PcepParseException("Sub Tlv parsing error. Extra bytes received.");
         }
-        return new LocalTENodeDescriptorsTLV(llNodeDescriptorSubTLVs);
+        return new LocalTENodeDescriptorsTlv(llNodeDescriptorSubTLVs);
     }
 
     @Override
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTLV.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlv.java
similarity index 92%
rename from pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTLV.java
rename to pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlv.java
index 61d93a1..0d55b2e 100644
--- a/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTLV.java
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlv.java
@@ -31,7 +31,7 @@
 /**
  * Provides Remote TE Node Descriptors TLV.
  */
-public class RemoteTENodeDescriptorsTLV implements PcepValueType {
+public class RemoteTENodeDescriptorsTlv implements PcepValueType {
 
     /* Reference :PCEP Extension for Transporting TE Data
         draft-dhodylee-pce-pcep-te-data-extn-02
@@ -47,7 +47,7 @@
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(RemoteTENodeDescriptorsTLV.class);
+    protected static final Logger log = LoggerFactory.getLogger(RemoteTENodeDescriptorsTlv.class);
 
     public static final short TYPE = 1003; //TODD:change this TBD9
     public short hLength;
@@ -61,7 +61,7 @@
      *
      * @param llRemoteTENodeDescriptorSubTLVs LinkedList of PcepValueType
      */
-    public RemoteTENodeDescriptorsTLV(LinkedList<PcepValueType> llRemoteTENodeDescriptorSubTLVs) {
+    public RemoteTENodeDescriptorsTlv(LinkedList<PcepValueType> llRemoteTENodeDescriptorSubTLVs) {
         this.llRemoteTENodeDescriptorSubTLVs = llRemoteTENodeDescriptorSubTLVs;
     }
 
@@ -71,8 +71,8 @@
      * @param llRemoteTENodeDescriptorSubTLVs LinkedList of PcepValueType
      * @return object of RemoteTENodeDescriptorsTLV
      */
-    public static RemoteTENodeDescriptorsTLV of(final LinkedList<PcepValueType> llRemoteTENodeDescriptorSubTLVs) {
-        return new RemoteTENodeDescriptorsTLV(llRemoteTENodeDescriptorSubTLVs);
+    public static RemoteTENodeDescriptorsTlv of(final LinkedList<PcepValueType> llRemoteTENodeDescriptorSubTLVs) {
+        return new RemoteTENodeDescriptorsTlv(llRemoteTENodeDescriptorSubTLVs);
     }
 
     /**
@@ -117,14 +117,14 @@
          * the size, if both are same then we should check for the subtlv objects otherwise
          * we should return false.
          */
-        if (obj instanceof RemoteTENodeDescriptorsTLV) {
+        if (obj instanceof RemoteTENodeDescriptorsTlv) {
             int countObjSubTlv = 0;
             int countOtherSubTlv = 0;
             boolean isCommonSubTlv = true;
-            RemoteTENodeDescriptorsTLV other = (RemoteTENodeDescriptorsTLV) obj;
-            Iterator<PcepValueType> objListIterator = ((RemoteTENodeDescriptorsTLV) obj).llRemoteTENodeDescriptorSubTLVs
+            RemoteTENodeDescriptorsTlv other = (RemoteTENodeDescriptorsTlv) obj;
+            Iterator<PcepValueType> objListIterator = ((RemoteTENodeDescriptorsTlv) obj).llRemoteTENodeDescriptorSubTLVs
                     .iterator();
-            countObjSubTlv = ((RemoteTENodeDescriptorsTLV) obj).llRemoteTENodeDescriptorSubTLVs.size();
+            countObjSubTlv = ((RemoteTENodeDescriptorsTlv) obj).llRemoteTENodeDescriptorSubTLVs.size();
             countOtherSubTlv = other.llRemoteTENodeDescriptorSubTLVs.size();
             if (countObjSubTlv != countOtherSubTlv) {
                 return false;
@@ -235,7 +235,7 @@
 
             throw new PcepParseException("Sub Tlv parsing error. Extra bytes received.");
         }
-        return new RemoteTENodeDescriptorsTLV(llRemoteTENodeDescriptorSubTLVs);
+        return new RemoteTENodeDescriptorsTlv(llRemoteTENodeDescriptorSubTLVs);
     }
 
     @Override
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RoutingUniverseTLV.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RoutingUniverseTlv.java
similarity index 88%
rename from pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RoutingUniverseTLV.java
rename to pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RoutingUniverseTlv.java
index bf553a4..325b121 100644
--- a/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RoutingUniverseTLV.java
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RoutingUniverseTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides RoutingUniverseTLV identifiers.
  */
-public class RoutingUniverseTLV implements PcepValueType {
+public class RoutingUniverseTlv implements PcepValueType {
 
     /*
      * Reference : draft-dhodylee-pce-pcep-te-data-extn-02, section 9.2.1.
@@ -50,7 +50,7 @@
                    +------------+---------------------+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(RoutingUniverseTLV.class);
+    protected static final Logger log = LoggerFactory.getLogger(RoutingUniverseTlv.class);
 
     public static final short TYPE = 14; // TODO:need to change TBD7
     public static final short LENGTH = 8;
@@ -62,7 +62,7 @@
      *
      * @param rawValue raw value
      */
-    public RoutingUniverseTLV(long rawValue) {
+    public RoutingUniverseTlv(long rawValue) {
         this.rawValue = rawValue;
     }
 
@@ -72,8 +72,8 @@
      * @param raw value
      * @return object of RoutingUniverseTLV
      */
-    public static RoutingUniverseTLV of(final long raw) {
-        return new RoutingUniverseTLV(raw);
+    public static RoutingUniverseTlv of(final long raw) {
+        return new RoutingUniverseTlv(raw);
     }
 
     /**
@@ -110,8 +110,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof RoutingUniverseTLV) {
-            RoutingUniverseTLV other = (RoutingUniverseTLV) obj;
+        if (obj instanceof RoutingUniverseTlv) {
+            RoutingUniverseTlv other = (RoutingUniverseTlv) obj;
             return Objects.equals(this.rawValue, other.rawValue);
         }
         return false;
@@ -132,8 +132,8 @@
      * @param c input channel buffer
      * @return object of RoutingUniverseTLV
      */
-    public static RoutingUniverseTLV read(ChannelBuffer c) {
-        return RoutingUniverseTLV.of(c.readLong());
+    public static RoutingUniverseTlv read(ChannelBuffer c) {
+        return RoutingUniverseTlv.of(c.readLong());
     }
 
     @Override
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TELinkDescriptorsTLV.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TELinkDescriptorsTlv.java
similarity index 93%
rename from pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TELinkDescriptorsTLV.java
rename to pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TELinkDescriptorsTlv.java
index 44059e3..2154eab 100644
--- a/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TELinkDescriptorsTLV.java
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TELinkDescriptorsTlv.java
@@ -31,7 +31,7 @@
 /**
  * Provides TE Link Descriptors TLV.
  */
-public class TELinkDescriptorsTLV implements PcepValueType {
+public class TELinkDescriptorsTlv implements PcepValueType {
 
     /*
      * Reference: PCEP Extension for Transporting TE Data draft-dhodylee-pce-pcep-te-data-extn-02
@@ -47,7 +47,7 @@
 
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(TELinkDescriptorsTLV.class);
+    protected static final Logger log = LoggerFactory.getLogger(TELinkDescriptorsTlv.class);
 
     public static final short TYPE = 1070; //TODD:change this TBD14
     public short hLength;
@@ -62,7 +62,7 @@
      *
      * @param llLinkDescriptorsSubTLVs of PcepValueType
      */
-    public TELinkDescriptorsTLV(LinkedList<PcepValueType> llLinkDescriptorsSubTLVs) {
+    public TELinkDescriptorsTlv(LinkedList<PcepValueType> llLinkDescriptorsSubTLVs) {
         this.llLinkDescriptorsSubTLVs = llLinkDescriptorsSubTLVs;
     }
 
@@ -72,8 +72,8 @@
      * @param llLinkDescriptorsSubTLVs of PcepValueType
      * @return object of TELinkDescriptorsTLV
      */
-    public static TELinkDescriptorsTLV of(final LinkedList<PcepValueType> llLinkDescriptorsSubTLVs) {
-        return new TELinkDescriptorsTLV(llLinkDescriptorsSubTLVs);
+    public static TELinkDescriptorsTlv of(final LinkedList<PcepValueType> llLinkDescriptorsSubTLVs) {
+        return new TELinkDescriptorsTlv(llLinkDescriptorsSubTLVs);
     }
 
     /**
@@ -118,13 +118,13 @@
          * the size, if both are same then we should check for the subtlv objects otherwise
          * we should return false.
          */
-        if (obj instanceof TELinkDescriptorsTLV) {
+        if (obj instanceof TELinkDescriptorsTlv) {
             int countObjSubTlv = 0;
             int countOtherSubTlv = 0;
             boolean isCommonSubTlv = true;
-            TELinkDescriptorsTLV other = (TELinkDescriptorsTLV) obj;
-            Iterator<PcepValueType> objListIterator = ((TELinkDescriptorsTLV) obj).llLinkDescriptorsSubTLVs.iterator();
-            countObjSubTlv = ((TELinkDescriptorsTLV) obj).llLinkDescriptorsSubTLVs.size();
+            TELinkDescriptorsTlv other = (TELinkDescriptorsTlv) obj;
+            Iterator<PcepValueType> objListIterator = ((TELinkDescriptorsTlv) obj).llLinkDescriptorsSubTLVs.iterator();
+            countObjSubTlv = ((TELinkDescriptorsTlv) obj).llLinkDescriptorsSubTLVs.size();
             countOtherSubTlv = other.llLinkDescriptorsSubTLVs.size();
             if (countObjSubTlv != countOtherSubTlv) {
                 return false;
@@ -237,7 +237,7 @@
 
             throw new PcepParseException("Sub Tlv parsing error. Extra bytes received.");
         }
-        return new TELinkDescriptorsTLV(llLinkDescriptorsSubTLVs);
+        return new TELinkDescriptorsTlv(llLinkDescriptorsSubTLVs);
     }
 
     @Override
