diff --git a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepMessageDecoder.java b/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepMessageDecoder.java
index b106589..7f0ea90 100644
--- a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepMessageDecoder.java
+++ b/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepMessageDecoder.java
@@ -22,6 +22,7 @@
 import org.jboss.netty.channel.Channel;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.handler.codec.frame.FrameDecoder;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.protocol.PcepFactories;
 import org.onosproject.pcepio.protocol.PcepMessage;
 import org.onosproject.pcepio.protocol.PcepMessageReader;
@@ -49,20 +50,31 @@
 
         HexDump.pcepHexDump(buffer);
 
-        // Note that a single call to decode results in reading a single
-        // PcepMessage from the channel buffer, which is passed on to, and processed
-        // by, the controller (in PcepChannelHandler).
-        // This is different from earlier behavior (with the original pcepIO),
-        // where we parsed all the messages in the buffer, before passing on
-        // a list of the parsed messages to the controller.
-        // The performance *may or may not* not be as good as before.
+        // Buffer can contain multiple messages, also may contain out of bound message.
+        // Read the message one by one from buffer and parse it. If it encountered out of bound message,
+        // then mark the reader index and again take the next chunk of messages from the channel
+        // and parse again from the marked reader index.
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        List<PcepMessage> msgList = new LinkedList<>();
+        List<PcepMessage> msgList = (List<PcepMessage>) ctx.getAttachment();
 
-        while (buffer.readableBytes() > 0) {
-            PcepMessage message = reader.readFrom(buffer);
-            msgList.add(message);
+        if (msgList == null) {
+            msgList = new LinkedList<>();
         }
-        return msgList;
+
+        try {
+            while (buffer.readableBytes() > 0) {
+                buffer.markReaderIndex();
+                PcepMessage message = reader.readFrom(buffer);
+                msgList.add(message);
+            }
+            ctx.setAttachment(null);
+            return msgList;
+        } catch (PcepOutOfBoundMessageException e) {
+            log.debug("PCEP message decode error");
+            buffer.resetReaderIndex();
+            buffer.discardReadBytes();
+            ctx.setAttachment(msgList);
+        }
+        return null;
     }
 }
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepOutOfBoundMessageException.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepOutOfBoundMessageException.java
new file mode 100644
index 0000000..3f14060
--- /dev/null
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepOutOfBoundMessageException.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.pcepio.exceptions;
+
+/**
+ * Custom exception for message out-of-bound.
+ */
+public class PcepOutOfBoundMessageException extends Exception {
+
+    private static final long serialVersionUID = 3L;
+
+    /**
+     * Default constructor to create a new exception.
+     */
+    public PcepOutOfBoundMessageException() {
+        super();
+    }
+
+    /**
+     * Constructor to create exception from message and cause.
+     *
+     * @param message the detail of exception in string
+     * @param cause underlying cause of the error
+     */
+    public PcepOutOfBoundMessageException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Constructor to create exception from message.
+     *
+     * @param message the detail of exception in string
+     */
+    public PcepOutOfBoundMessageException(final String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor to create exception from cause.
+     *
+     * @param cause underlying cause of the error
+     */
+    public PcepOutOfBoundMessageException(final Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepParseException.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepParseException.java
old mode 100755
new mode 100644
index 85bc33f..466f0e0
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepParseException.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepParseException.java
@@ -21,7 +21,7 @@
  */
 public class PcepParseException extends Exception {
 
-    private static final long serialVersionUID = 7960991379951448423L;
+    private static final long serialVersionUID = 1L;
     private byte errType = 0;
     private byte errValue = 0;
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepTunnelAttributeException.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepTunnelAttributeException.java
old mode 100755
new mode 100644
index 25bdf5b..100392c
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepTunnelAttributeException.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepTunnelAttributeException.java
@@ -21,7 +21,7 @@
  */
 public class PcepTunnelAttributeException extends Exception {
 
-    private static final long serialVersionUID = 7860981378961458434L;
+    private static final long serialVersionUID = 2L;
 
     /**
      * Default constructor to create a new exception.
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepError.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepError.java
old mode 100755
new mode 100644
index b61bfb9..13bbc46
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepError.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepError.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.pcepio.protocol;
 
-import java.util.LinkedList;
+import java.util.List;
 
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.exceptions.PcepParseException;
@@ -30,42 +30,42 @@
      *
      * @return list of type PcepRPObject
      */
-    LinkedList<PcepRPObject> getRPObjList();
+    List<PcepRPObject> getRPObjList();
 
     /**
      * Sets the RP Objects lists.
      *
-     * @param llRPObjList list of type PcepRPObject
+     * @param rpObjList list of type PcepRPObject
      */
-    void setRPObjList(LinkedList<PcepRPObject> llRPObjList);
+    void setRPObjList(List<PcepRPObject> rpObjList);
 
     /**
-     * Returns the PcepTEObject List.
+     * Returns the PcepLSObject List.
      *
-     * @return list of type PcepTEObject
+     * @return list of type PcepLSObject
      */
-    LinkedList<PcepTEObject> getTEObjList();
+    List<PcepLSObject> getLSObjList();
 
     /**
-     * Sets the TE Objects lists.
+     * Sets the LS Objects lists.
      *
-     * @param llTEObjList list of type PcepTEObject
+     * @param lsObjList list of type PcepLSObject
      */
-    void setTEObjList(LinkedList<PcepTEObject> llTEObjList);
+    void setLSObjList(List<PcepLSObject> lsObjList);
 
     /**
      * Returns the PcepErrorObject.
      *
      * @return list of type PcepErrorObject
      */
-    LinkedList<PcepErrorObject> getErrorObjList();
+    List<PcepErrorObject> getErrorObjList();
 
     /**
      * Sets the Error Objects lists.
      *
-     * @param llErrorObjList list of type PcepErrorObject
+     * @param errorObjList list of type PcepErrorObject
      */
-    void setErrorObjList(LinkedList<PcepErrorObject> llErrorObjList);
+    void setErrorObjList(List<PcepErrorObject> errorObjList);
 
     /**
      * Writes the byte stream of PCEP error to the channel buffer.
@@ -93,44 +93,44 @@
          *
          * @return list of type PcepRPObject
          */
-        LinkedList<PcepRPObject> getRPObjList();
+        List<PcepRPObject> getRPObjList();
 
         /**
          * Sets RP Object lists and returns its builder.
          *
-         * @param llRPObjList list of type PcepRpObject
+         * @param rpObjList list of type PcepRpObject
          * @return builder by setting Linked list of RP Object
          */
-        Builder setRPObjList(LinkedList<PcepRPObject> llRPObjList);
+        Builder setRPObjList(List<PcepRPObject> rpObjList);
 
         /**
-         * Returns the PcepTEObject.
+         * Returns the PcepLSObject.
          *
-         * @return llTEObjList of type PcepTEObject
+         * @return lsObjList of type PcepLSObject
          */
-        LinkedList<PcepTEObject> getTEObjList();
+        List<PcepLSObject> getLSObjList();
 
         /**
-         * Sets TE Object lists and returns its builder.
+         * Sets LS Object lists and returns its builder.
          *
-         * @param llTEObjList list of type PcepTEObject
-         * @return builder by setting list of type PcepTEObject
+         * @param lsObjList list of type PcepLSObject
+         * @return builder by setting list of type PcepLSObject
          */
-        Builder setTEObjList(LinkedList<PcepTEObject> llTEObjList);
+        Builder setLSObjList(List<PcepLSObject> lsObjList);
 
         /**
          * Returns the PcepErrorObject.
          *
          * @return list of type PcepErrorObject
          */
-        LinkedList<PcepErrorObject> getErrorObjList();
+        List<PcepErrorObject> getErrorObjList();
 
         /**
          * Sets Error Object lists and returns its builder.
          *
-         * @param llErrorObjList list of type PcepErrorObject
+         * @param errorObjList list of type PcepErrorObject
          * @return builder by setting list of type PcepErrorObject
          */
-        Builder setErrorObjList(LinkedList<PcepErrorObject> llErrorObjList);
+        Builder setErrorObjList(List<PcepErrorObject> errorObjList);
     }
 }
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepErrorInfo.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepErrorInfo.java
old mode 100755
new mode 100644
index 0c625a0..09bc8d3
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepErrorInfo.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepErrorInfo.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.pcepio.protocol;
 
-import java.util.LinkedList;
+import java.util.List;
 
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.exceptions.PcepParseException;
@@ -54,14 +54,14 @@
      *
      * @return list of Error Value in PCEP-ERROR Object
      */
-    LinkedList<Integer> getErrorValue();
+    List<Integer> getErrorValue();
 
     /**
      * Returns Error Type in PCEP-ERROR Object.
      *
      * @return list of Error Type in PCEP-ERROR Object
      */
-    LinkedList<Integer> getErrorType();
+    List<Integer> getErrorType();
 
     /**
      * Builder interface with get and set functions to build ErrorInfo.
@@ -80,7 +80,7 @@
          *
          * @return list of PcepError
          */
-        LinkedList<PcepError> getPcepErrorList();
+        List<PcepError> getPcepErrorList();
 
         /**
          * Sets PcepError lists and returns its builder.
@@ -88,6 +88,6 @@
          * @param llPcepErrorList list of PcepError
          * @return builder by setting list of PcepError.
          */
-        Builder setPcepErrorList(LinkedList<PcepError> llPcepErrorList);
+        Builder setPcepErrorList(List<PcepError> llPcepErrorList);
     }
 }
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFactories.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFactories.java
index 85416f9..a3e3b05 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFactories.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFactories.java
@@ -17,6 +17,7 @@
 package org.onosproject.pcepio.protocol;
 
 import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 import org.onosproject.pcepio.protocol.ver1.PcepFactoryVer1;
 import org.slf4j.Logger;
@@ -54,7 +55,7 @@
     private static class GenericReader implements PcepMessageReader<PcepMessage> {
 
         @Override
-        public PcepMessage readFrom(ChannelBuffer bb) throws PcepParseException {
+        public PcepMessage readFrom(ChannelBuffer bb) throws PcepParseException, PcepOutOfBoundMessageException {
 
             if (!bb.readable()) {
                 throw new PcepParseException("Empty message received");
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLSObject.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLSObject.java
new file mode 100644
index 0000000..a5423ca
--- /dev/null
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLSObject.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.pcepio.protocol;
+
+import java.util.List;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+import org.onosproject.pcepio.types.PcepValueType;
+
+/**
+ * Abstraction of an entity providing PCEP LS Object.
+ */
+public interface PcepLSObject {
+
+    /**
+     * Returns LS object header.
+     *
+     * @return LS object header
+     */
+    PcepObjectHeader getLSObjHeader();
+
+    /**
+     * Sets LS Object header.
+     *
+     * @param obj LS Object header
+     */
+    void setLSObjHeader(PcepObjectHeader obj);
+
+    /**
+     * Returns ProtocolId in LS Object.
+     *
+     * @return ProtocolId in LS Object
+     */
+    byte getProtocolId();
+
+    /**
+     * Sets ProtocolId in LS Object.
+     *
+     * @param protId ProtocolId in LS Object
+     */
+    void setProtocolId(byte protId);
+
+    /**
+     * Returns R flag in LS Object.
+     *
+     * @return R flag in LS Object
+     */
+    boolean getRemoveFlag();
+
+    /**
+     * Sets R flag in LS Object.
+     *
+     * @param removeFlag R flag in LS Object
+     */
+    void setRemoveFlag(boolean removeFlag);
+
+    /**
+     * Returns sync flag in LS Object.
+     *
+     * @return sync flag in LS Object
+     */
+    boolean getSyncFlag();
+
+    /**
+     * Sets sync flag in LS Object.
+     *
+     * @param syncFlag sync flag in LS Object
+     */
+    void setSyncFlag(boolean syncFlag);
+
+    /**
+     * Returns LS ID in LS Object.
+     *
+     * @return LS ID in LS Object
+     */
+    long getLSId();
+
+    /**
+     * Sets LS ID in LS Object.
+     *
+     * @param lsId LS ID in LS Object
+     */
+    void setLSId(long lsId);
+
+    /**
+     * Returns list of Optional Tlvs in LS Object.
+     *
+     * @return list of Optional Tlvs
+     */
+    List<PcepValueType> getOptionalTlv();
+
+    /**
+     * Sets list of Optional Tlvs in LS Object.
+     *
+     * @param optionalTlvList list of Optional Tlvs
+     */
+    void setOptionalTlv(List<PcepValueType> optionalTlvList);
+
+    /**
+     * Writes the LS Object into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException when object header is not written to channel buffer
+     */
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build LS object.
+     */
+    interface Builder {
+
+        /**
+         * Builds LS Object.
+         *
+         * @return LS Object
+         */
+        PcepLSObject build();
+
+        /**
+         * Returns LS object header.
+         *
+         * @return LS object header
+         */
+        PcepObjectHeader getLSObjHeader();
+
+        /**
+         * Sets LS object header and returns its builder.
+         *
+         * @param obj LS object header
+         * @return Builder by setting LS object header
+         */
+        Builder setLSObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns ProtocolId in LS Object.
+         *
+         * @return ProtocolId in LS Object
+         */
+        byte getProtocolId();
+
+        /**
+         * Sets ProtocolId in LS Object and returns its builder.
+         *
+         * @param protId ProtocolId in LS Object
+         * @return Builder by setting ProtocolId
+         */
+        Builder setProtocolId(byte protId);
+
+        /**
+         * Returns R flag in LS Object.
+         *
+         * @return R flag in LS Object
+         */
+        boolean getRemoveFlag();
+
+        /**
+         * Sets R flag in LS Object and returns its builder.
+         *
+         * @param removeFlag R flag in LS Object
+         * @return Builder by setting R flag
+         */
+        Builder setRemoveFlag(boolean removeFlag);
+
+        /**
+         * Returns sync flag in LS Object.
+         *
+         * @return sync flag in LS Object
+         */
+        boolean getSyncFlag();
+
+        /**
+         * Sets sync flag in LS Object and returns its builder.
+         *
+         * @param syncFlag sync flag in LS Object
+         * @return Builder by setting sync flag
+         */
+        Builder setSyncFlag(boolean syncFlag);
+
+        /**
+         * Returns LS ID in LS Object.
+         *
+         * @return LS ID in LS Object
+         */
+        long getLSId();
+
+        /**
+         * Sets LS ID in LS Object and returns its builder.
+         *
+         * @param lsId LS ID in LS Object
+         * @return Builder by setting LS ID
+         */
+        Builder setLSId(long lsId);
+
+        /**
+         * Returns list of Optional Tlvs in LS Object.
+         *
+         * @return list of Optional Tlvs
+         */
+        List<PcepValueType> getOptionalTlv();
+
+        /**
+         * Sets list of Optional Tlvs in LS Object and returns its builder.
+         *
+         * @param optionalTlvList list of Optional Tlvs
+         * @return Builder by setting list of Optional Tlvs
+         */
+        Builder setOptionalTlv(List<PcepValueType> optionalTlvList);
+
+        /**
+         * Sets Processing rule flag in LS object header and returns its builder.
+         *
+         * @param value boolean value to set Processing rule flag
+         * @return Builder by setting Processing rule flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets Ignore flag in LS object header and returns its builder.
+         *
+         * @param value boolean value to set Ignore flag
+         * @return Builder by setting Ignore flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLSReportMsg.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLSReportMsg.java
new file mode 100644
index 0000000..1de448c
--- /dev/null
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLSReportMsg.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.pcepio.protocol;
+
+import java.util.List;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity providing PCEP LS-Report Message.
+ */
+public interface PcepLSReportMsg extends PcepObject, PcepMessage {
+
+    @Override
+    PcepVersion getVersion();
+
+    @Override
+    PcepType getType();
+
+    /**
+     * Returns list of PCEP LS Objects.
+     *
+     * @return list of PCEP LS Objects
+     */
+    List<PcepLSObject> getLSReportList();
+
+    /**
+     * Sets list of Optional Tlvs in LS-Report Message.
+     *
+     * @param lsReportList list of optional Tlvs
+     */
+    void setLSReportList(List<PcepLSObject> lsReportList);
+
+    @Override
+    void writeTo(ChannelBuffer channelBuffer) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build LS-Report message.
+     */
+    interface Builder extends PcepMessage.Builder {
+
+        @Override
+        PcepLSReportMsg build();
+
+        @Override
+        PcepVersion getVersion();
+
+        @Override
+        PcepType getType();
+
+        /**
+         * Returns list of LS Object in LS Report Message.
+         *
+         * @return list of LS Objects
+         */
+        List<PcepLSObject> getLSReportList();
+
+        /**
+         * Sets list of LS Objects and returns its builder.
+         *
+         * @param lsReportList list of LS Objects
+         * @return Builder object for LS-Report message
+         */
+        Builder setLSReportList(List<PcepLSObject> lsReportList);
+    }
+}
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMessageReader.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMessageReader.java
old mode 100755
new mode 100644
index 591a033..4dc2e6e
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMessageReader.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMessageReader.java
@@ -17,6 +17,7 @@
 package org.onosproject.pcepio.protocol;
 
 import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 /**
@@ -32,5 +33,5 @@
      * @throws PcepParseException while parsing PCEP message.
      * @throws PcepParseException when received message is empty
      */
-    T readFrom(ChannelBuffer bb) throws PcepParseException;
+    T readFrom(ChannelBuffer bb) throws PcepParseException, PcepOutOfBoundMessageException;
 }
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepTEObject.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepTEObject.java
deleted file mode 100755
index 21f6c71..0000000
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepTEObject.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.protocol;
-
-import java.util.LinkedList;
-
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.pcepio.exceptions.PcepParseException;
-import org.onosproject.pcepio.types.PcepObjectHeader;
-import org.onosproject.pcepio.types.PcepValueType;
-
-/**
- * Abstraction of an entity providing PCEP TE Object.
- */
-public interface PcepTEObject {
-
-    /**
-     * Returns TE object header.
-     *
-     * @return TE object header
-     */
-    PcepObjectHeader getTEObjHeader();
-
-    /**
-     * Sets TE Object header.
-     *
-     * @param obj TE Object header
-     */
-    void setTEObjHeader(PcepObjectHeader obj);
-
-    /**
-     * Returns ProtocolId in TE Object.
-     *
-     * @return ProtocolId in TE Object
-     */
-    byte getProtocolId();
-
-    /**
-     * Sets ProtocolId in TE Object.
-     *
-     * @param yProtId ProtocolId in TE Object
-     */
-    void setProtocolId(byte yProtId);
-
-    /**
-     * Returns R flag in TE Object.
-     *
-     * @return R flag in TE Object
-     */
-    boolean getRFlag();
-
-    /**
-     * Sets R flag in TE Object.
-     *
-     * @param bRFlag R flag in TE Object
-     */
-    void setRFlag(boolean bRFlag);
-
-    /**
-     * Returns S flag in TE Object.
-     *
-     * @return S flag in TE Object
-     */
-    boolean getSFlag();
-
-    /**
-     * Sets S flag in TE Object.
-     *
-     * @param bSFlag S flag in TE Object
-     */
-    void setSFlag(boolean bSFlag);
-
-    /**
-     * Returns TE ID in TE Object.
-     *
-     * @return TE ID in TE Object
-     */
-    int getTEId();
-
-    /**
-     * Sets TE ID in TE Object.
-     *
-     * @param iTEId TE ID in TE Object
-     */
-    void setTEId(int iTEId);
-
-    /**
-     * Returns list of Optional Tlvs in TE Object.
-     *
-     * @return list of Optional Tlvs
-     */
-    LinkedList<PcepValueType> getOptionalTlv();
-
-    /**
-     * Sets list of Optional Tlvs in TE Object.
-     *
-     * @param llOptionalTlv list of Optional Tlvs
-     */
-    void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
-
-    /**
-     * Writes the TE Object into channel buffer.
-     *
-     * @param bb channel buffer
-     * @return Returns the writerIndex of this buffer
-     * @throws PcepParseException when obj header is not written to channel buffer
-     */
-    int write(ChannelBuffer bb) throws PcepParseException;
-
-    /**
-     * Builder interface with get and set functions to build TE object.
-     */
-    interface Builder {
-
-        /**
-         * Builds TE Object.
-         *
-         * @return TE Object
-         */
-        PcepTEObject build();
-
-        /**
-         * Returns TE object header.
-         *
-         * @return TE object header
-         */
-        PcepObjectHeader getTEObjHeader();
-
-        /**
-         * Sets TE object header and returns its builder.
-         *
-         * @param obj TE object header
-         * @return Builder by setting TE object header
-         */
-        Builder setTEObjHeader(PcepObjectHeader obj);
-
-        /**
-         * Returns ProtocolId in TE Object.
-         *
-         * @return ProtocolId in TE Object
-         */
-        byte getProtocolId();
-
-        /**
-         * Sets ProtocolId in TE Object and returns its builder.
-         *
-         * @param yProtId ProtocolId in TE Object
-         * @return Builder by setting ProtocolId
-         */
-        Builder setProtocolId(byte yProtId);
-
-        /**
-         * Returns R flag in TE Object.
-         *
-         * @return R flag in TE Object
-         */
-        boolean getRFlag();
-
-        /**
-         * Sets R flag in TE Object and returns its builder.
-         *
-         * @param bRFlag R flag in TE Object
-         * @return Builder by setting R flag
-         */
-        Builder setRFlag(boolean bRFlag);
-
-        /**
-         * Returns S flag in TE Object.
-         *
-         * @return S flag in TE Object
-         */
-        boolean getSFlag();
-
-        /**
-         * Sets S flag in TE Object and returns its builder.
-         *
-         * @param bSFlag S flag in TE Object
-         * @return Builder by setting S flag
-         */
-        Builder setSFlag(boolean bSFlag);
-
-        /**
-         * Returns TE ID in TE Object.
-         *
-         * @return TE ID in TE Object
-         */
-        int getTEId();
-
-        /**
-         * Sets TE ID in TE Object and returns its builder.
-         *
-         * @param iTEId TE ID in TE Object
-         * @return Builder by setting TE ID
-         */
-        Builder setTEId(int iTEId);
-
-        /**
-         * Returns list of Optional Tlvs in TE Object.
-         *
-         * @return list of Optional Tlvs
-         */
-        LinkedList<PcepValueType> getOptionalTlv();
-
-        /**
-         * Sets list of Optional Tlvs in TE Object and returns its builder.
-         *
-         * @param llOptionalTlv list of Optional Tlvs
-         * @return Builder by setting list of Optional Tlvs
-         */
-        Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
-
-        /**
-         * Sets P flag in TE object header and returns its builder.
-         *
-         * @param value boolean value to set P flag
-         * @return Builder by setting P flag
-         */
-        Builder setPFlag(boolean value);
-
-        /**
-         * Sets I flag in TE object header and returns its builder.
-         *
-         * @param value boolean value to set I flag
-         * @return Builder by setting I flag
-         */
-        Builder setIFlag(boolean value);
-    }
-}
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepTEReportMsg.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepTEReportMsg.java
deleted file mode 100755
index 3bc5034..0000000
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepTEReportMsg.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.pcepio.protocol;
-
-import java.util.LinkedList;
-
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.pcepio.exceptions.PcepParseException;
-
-/**
- * Abstraction of an entity providing PCEP TE Report Message.
- */
-public interface PcepTEReportMsg extends PcepObject, PcepMessage {
-
-    @Override
-    PcepVersion getVersion();
-
-    @Override
-    PcepType getType();
-
-    /**
-     * Returns list of PCEP TE Objects.
-     *
-     * @return list of PCEP TE Objects
-     */
-    LinkedList<PcepTEObject> getTEReportList();
-
-    /**
-     * Sets list of Optional Tlvs in TE Report Message.
-     *
-     * @param llTEReportList list of optional Tlvs
-     */
-    void setTEReportList(LinkedList<PcepTEObject> llTEReportList);
-
-    @Override
-    void writeTo(ChannelBuffer channelBuffer) throws PcepParseException;
-
-    /**
-     * Builder interface with get and set functions to build TE Report message.
-     */
-    interface Builder extends PcepMessage.Builder {
-
-        @Override
-        PcepTEReportMsg build();
-
-        @Override
-        PcepVersion getVersion();
-
-        @Override
-        PcepType getType();
-
-        /**
-         * Returns list of Optional Tlv in TE Report Message.
-         *
-         * @return list of Optional Tlv
-         */
-        LinkedList<PcepTEObject> getTEReportList();
-
-        /**
-         * Sets list of Optional Tlvs and returns its builder.
-         *
-         * @param llTEReportList list of Optional Tlvs
-         * @return Builder object for TE report message
-         */
-        Builder setTEReportList(LinkedList<PcepTEObject> llTEReportList);
-    }
-}
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepType.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepType.java
old mode 100755
new mode 100644
index 450fdfa..7be9f44
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepType.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepType.java
@@ -22,8 +22,8 @@
 public enum PcepType {
 
     NONE(0), OPEN(1), KEEP_ALIVE(2), PATH_COMPUTATION_REQUEST(3), PATH_COMPUTATION_REPLY(4),
-    NOTIFICATION(5), ERROR(6), CLOSE(7), REPORT(10), UPDATE(11), INITIATE(12), LABEL_UPDATE(13),
-    TE_REPORT(14), LABEL_RANGE_RESERV(15), MAX(16), END(17);
+    NOTIFICATION(5), ERROR(6), CLOSE(7), REPORT(10), UPDATE(11), INITIATE(12),
+    LS_REPORT(224), LABEL_RANGE_RESERV(225), LABEL_UPDATE(226), MAX(227), END(228);
 
     int iValue;
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepEroObjectVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepEroObjectVer1.java
index 4d7cb16..6afd062 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepEroObjectVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepEroObjectVer1.java
@@ -22,7 +22,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 import org.onosproject.pcepio.protocol.PcepEroObject;
-import org.onosproject.pcepio.types.AutonomousSystemTlv;
+import org.onosproject.pcepio.types.AutonomousSystemNumberSubObject;
 import org.onosproject.pcepio.types.IPv4SubObject;
 import org.onosproject.pcepio.types.IPv6SubObject;
 import org.onosproject.pcepio.types.PathKeySubObject;
@@ -147,32 +147,32 @@
     public static final int LABEL_SUB_OBJ_TYPE = 3;
     public static final int SR_ERO_SUB_OBJ_TYPE = 96;
     public static final int OBJECT_HEADER_LENGTH = 4;
-    public static final int YTYPE_SHIFT_VALUE = 0x7F;
+    public static final int TYPE_SHIFT_VALUE = 0x7F;
 
-    static final PcepObjectHeader DEFAULT_ERO_OBJECT_HEADER = new PcepObjectHeader(ERO_OBJ_CLASS, ERO_OBJ_TYPE,
+    public static final PcepObjectHeader DEFAULT_ERO_OBJECT_HEADER = new PcepObjectHeader(ERO_OBJ_CLASS, ERO_OBJ_TYPE,
             PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, ERO_OBJ_MINIMUM_LENGTH);
 
     private PcepObjectHeader eroObjHeader;
-    private LinkedList<PcepValueType> llSubObjects = new LinkedList<>();
+    private LinkedList<PcepValueType> subObjectList = new LinkedList<>();
 
     /**
      * reset variables.
      */
     public PcepEroObjectVer1() {
         this.eroObjHeader = null;
-        this.llSubObjects = null;
+        this.subObjectList = null;
     }
 
     /**
      * Constructor to initialize parameters of ERO object.
      *
      * @param eroObjHeader ERO object header
-     * @param llSubObjects list of sub objects.
+     * @param subObjectList list of sub objects.
      */
-    public PcepEroObjectVer1(PcepObjectHeader eroObjHeader, LinkedList<PcepValueType> llSubObjects) {
+    public PcepEroObjectVer1(PcepObjectHeader eroObjHeader, LinkedList<PcepValueType> subObjectList) {
 
         this.eroObjHeader = eroObjHeader;
-        this.llSubObjects = llSubObjects;
+        this.subObjectList = subObjectList;
     }
 
     /**
@@ -195,12 +195,12 @@
 
     @Override
     public LinkedList<PcepValueType> getSubObjects() {
-        return this.llSubObjects;
+        return this.subObjectList;
     }
 
     @Override
-    public void setSubObjects(LinkedList<PcepValueType> llSubObjects) {
-        this.llSubObjects = llSubObjects;
+    public void setSubObjects(LinkedList<PcepValueType> subObjectList) {
+        this.subObjectList = subObjectList;
     }
 
     /**
@@ -213,7 +213,7 @@
     public static PcepEroObject read(ChannelBuffer cb) throws PcepParseException {
 
         PcepObjectHeader eroObjHeader;
-        LinkedList<PcepValueType> llSubObjects = new LinkedList<>();
+        LinkedList<PcepValueType> subObjectList = new LinkedList<>();
 
         eroObjHeader = PcepObjectHeader.read(cb);
 
@@ -225,9 +225,9 @@
 
         if (eroObjHeader.getObjLen() > OBJECT_HEADER_LENGTH) {
             ChannelBuffer tempCb = cb.readBytes(eroObjHeader.getObjLen() - OBJECT_HEADER_LENGTH);
-            llSubObjects = parseSubObjects(tempCb);
+            subObjectList = parseSubObjects(tempCb);
         }
-        return new PcepEroObjectVer1(eroObjHeader, llSubObjects);
+        return new PcepEroObjectVer1(eroObjHeader, subObjectList);
     }
 
     /**
@@ -239,18 +239,18 @@
      */
     protected static LinkedList<PcepValueType> parseSubObjects(ChannelBuffer cb) throws PcepParseException {
 
-        LinkedList<PcepValueType> llSubObjects = new LinkedList<>();
+        LinkedList<PcepValueType> subObjectList = new LinkedList<>();
 
         while (0 < cb.readableBytes()) {
 
             //check the Type of the TLV
-            byte yType = cb.readByte();
-            yType = (byte) (yType & (YTYPE_SHIFT_VALUE));
+            short type = cb.readByte();
+            type = (short) (type & (TYPE_SHIFT_VALUE));
             byte hLength = cb.readByte();
 
             PcepValueType subObj;
 
-            switch (yType) {
+            switch (type) {
 
             case IPv4SubObject.TYPE:
                 subObj = IPv4SubObject.read(cb);
@@ -260,8 +260,8 @@
                 cb.readBytes(ipv6Value, 0, IPv6SubObject.VALUE_LENGTH);
                 subObj = new IPv6SubObject(ipv6Value);
                 break;
-            case AutonomousSystemTlv.TYPE:
-                subObj = AutonomousSystemTlv.read(cb);
+            case AutonomousSystemNumberSubObject.TYPE:
+                subObj = AutonomousSystemNumberSubObject.read(cb);
                 break;
             case PathKeySubObject.TYPE:
                 subObj = PathKeySubObject.read(cb);
@@ -270,7 +270,7 @@
                 subObj = SrEroSubObject.read(cb);
                 break;
             default:
-                throw new PcepParseException("Unexpected sub object. Type: " + (int) yType);
+                throw new PcepParseException("Unexpected sub object. Type: " + (int) type);
             }
             // Check for the padding
             int pad = hLength % 4;
@@ -281,12 +281,12 @@
                 }
             }
 
-            llSubObjects.add(subObj);
+            subObjectList.add(subObj);
         }
         if (0 < cb.readableBytes()) {
             throw new PcepParseException("Subobject parsing error. Extra bytes received.");
         }
-        return llSubObjects;
+        return subObjectList;
     }
 
     @Override
@@ -301,7 +301,7 @@
             throw new PcepParseException("Failed to write ERO object header. Index " + objLenIndex);
         }
 
-        ListIterator<PcepValueType> listIterator = llSubObjects.listIterator();
+        ListIterator<PcepValueType> listIterator = subObjectList.listIterator();
 
         while (listIterator.hasNext()) {
             listIterator.next().write(cb);
@@ -342,7 +342,7 @@
         private boolean bIFlag;
 
         private PcepObjectHeader eroObjHeader;
-        LinkedList<PcepValueType> llSubObjects = new LinkedList<>();
+        LinkedList<PcepValueType> subObjectList = new LinkedList<>();
 
         @Override
         public PcepEroObject build() {
@@ -357,7 +357,7 @@
                 eroObjHeader.setIFlag(bIFlag);
             }
 
-            return new PcepEroObjectVer1(eroObjHeader, this.llSubObjects);
+            return new PcepEroObjectVer1(eroObjHeader, this.subObjectList);
         }
 
         @Override
@@ -374,12 +374,12 @@
 
         @Override
         public LinkedList<PcepValueType> getSubObjects() {
-            return this.llSubObjects;
+            return this.subObjectList;
         }
 
         @Override
-        public Builder setSubObjects(LinkedList<PcepValueType> llSubObjects) {
-            this.llSubObjects = llSubObjects;
+        public Builder setSubObjects(LinkedList<PcepValueType> subObjectList) {
+            this.subObjectList = subObjectList;
             return this;
         }
 
@@ -400,8 +400,9 @@
 
     @Override
     public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("EroObjHeader", eroObjHeader).add("SubObjects", llSubObjects)
+        return MoreObjects.toStringHelper(getClass()).omitNullValues()
+                .add("EroObjHeader", eroObjHeader)
+                .add("SubObjects", subObjectList)
                 .toString();
     }
 }
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorInfoVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorInfoVer1.java
index 594e40c..6fbfb41 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorInfoVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorInfoVer1.java
@@ -16,6 +16,7 @@
 package org.onosproject.pcepio.protocol.ver1;
 
 import java.util.LinkedList;
+import java.util.List;
 import java.util.ListIterator;
 
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -24,7 +25,7 @@
 import org.onosproject.pcepio.protocol.PcepErrorInfo;
 import org.onosproject.pcepio.protocol.PcepErrorObject;
 import org.onosproject.pcepio.protocol.PcepRPObject;
-import org.onosproject.pcepio.protocol.PcepTEObject;
+import org.onosproject.pcepio.protocol.PcepLSObject;
 import org.onosproject.pcepio.types.PcepObjectHeader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,26 +34,26 @@
 
 /**
  * Provides PCEP Error Info.
- * Reference :PCEP Extension for Transporting TE Data draft-dhodylee-pce-pcep-te-data-extn-02.
+ * Reference : draft-dhodylee-pce-pcep-ls-01, section 8.2.
  */
 public class PcepErrorInfoVer1 implements PcepErrorInfo {
 
     protected static final Logger log = LoggerFactory.getLogger(PcepErrorInfoVer1.class);
     //Error list is optional
-    private LinkedList<PcepError> errList;
+    private List<PcepError> errList;
 
     /**
      * Constructor to add PCEP error object to the list.
      *
      * @param llRPObjList list of PCEP RP object
-     * @param llTEObjList list of PCEP TE object
+     * @param llLSObjList list of PCEP LS object
      * @param llErrObjList list of PCEP error object
      */
-    public PcepErrorInfoVer1(LinkedList<PcepRPObject> llRPObjList, LinkedList<PcepTEObject> llTEObjList,
-            LinkedList<PcepErrorObject> llErrObjList) {
+    public PcepErrorInfoVer1(List<PcepRPObject> llRPObjList, List<PcepLSObject> llLSObjList,
+            List<PcepErrorObject> llErrObjList) {
         this.errList = new LinkedList<>();
         if ((llErrObjList != null) && (!llErrObjList.isEmpty())) {
-            this.errList.add(new PcepErrorVer1(llRPObjList, llTEObjList, llErrObjList));
+            this.errList.add(new PcepErrorVer1(llRPObjList, llLSObjList, llErrObjList));
         }
     }
 
@@ -61,7 +62,7 @@
      *
      * @param errll linked list or pcep error
      */
-    public PcepErrorInfoVer1(LinkedList<PcepError> errll) {
+    public PcepErrorInfoVer1(List<PcepError> errll) {
         this.errList = errll;
     }
 
@@ -79,7 +80,7 @@
             tempObjHeader = PcepObjectHeader.read(cb);
             cb.resetReaderIndex();
             byte yObjClass = tempObjHeader.getObjClass();
-            if ((yObjClass != PcepRPObjectVer1.RP_OBJ_CLASS) && (yObjClass != PcepTEObjectVer1.TE_OBJ_CLASS)
+            if ((yObjClass != PcepRPObjectVer1.RP_OBJ_CLASS) && (yObjClass != PcepLSObjectVer1.LS_OBJ_CLASS)
                     && (yObjClass != PcepErrorObjectVer1.ERROR_OBJ_CLASS)) {
                 throw new PcepParseException("Unknown Object is present in PCEP-ERROR. Object Class: " + yObjClass);
             }
@@ -96,7 +97,7 @@
             PcepError pcepError = listIterator.next();
 
             //RP Object list is optional
-            LinkedList<PcepRPObject> llRPObjList = pcepError.getRPObjList();
+            List<PcepRPObject> llRPObjList = pcepError.getRPObjList();
             if (llRPObjList != null) {
                 ListIterator<PcepRPObject> rpListIterator = llRPObjList.listIterator();
                 while (rpListIterator.hasNext()) {
@@ -104,10 +105,10 @@
                 }
             }
 
-            //TE Object list is optional
-            LinkedList<PcepTEObject> llTEObjList = pcepError.getTEObjList();
-            if (llTEObjList != null) {
-                ListIterator<PcepTEObject> teListIterator = llTEObjList.listIterator();
+            //LS Object list is optional
+            List<PcepLSObject> llLSObjList = pcepError.getLSObjList();
+            if (llLSObjList != null) {
+                ListIterator<PcepLSObject> teListIterator = llLSObjList.listIterator();
                 while (teListIterator.hasNext()) {
                     teListIterator.next().write(cb);
                 }
@@ -116,7 +117,7 @@
             // <error-obj-list> is mandatory
             boolean bIsErrorObjListFound = false;
 
-            LinkedList<PcepErrorObject> llErrObjList = pcepError.getErrorObjList();
+            List<PcepErrorObject> llErrObjList = pcepError.getErrorObjList();
             if (llErrObjList != null) {
                 ListIterator<PcepErrorObject> errObjListIterator = llErrObjList.listIterator();
                 while (errObjListIterator.hasNext()) {
@@ -132,14 +133,14 @@
     }
 
     @Override
-    public LinkedList<Integer> getErrorType() {
-        LinkedList<Integer> errorType = new LinkedList<>();
+    public List<Integer> getErrorType() {
+        List<Integer> errorType = new LinkedList<>();
         ListIterator<PcepError> listIterator = errList.listIterator();
         PcepErrorObject errObj;
         int error;
         while (listIterator.hasNext()) {
             PcepError pcepError = listIterator.next();
-            LinkedList<PcepErrorObject> llErrObjList = pcepError.getErrorObjList();
+            List<PcepErrorObject> llErrObjList = pcepError.getErrorObjList();
             if (llErrObjList != null) {
                 ListIterator<PcepErrorObject> errObjListIterator = llErrObjList.listIterator();
                 while (errObjListIterator.hasNext()) {
@@ -153,14 +154,14 @@
     }
 
     @Override
-    public LinkedList<Integer> getErrorValue() {
-        LinkedList<Integer> errorValue = new LinkedList<>();
+    public List<Integer> getErrorValue() {
+        List<Integer> errorValue = new LinkedList<>();
         ListIterator<PcepError> listIterator = errList.listIterator();
         PcepErrorObject errObj;
         int error;
         while (listIterator.hasNext()) {
             PcepError pcepError = listIterator.next();
-            LinkedList<PcepErrorObject> llErrObjList = pcepError.getErrorObjList();
+            List<PcepErrorObject> llErrObjList = pcepError.getErrorObjList();
             if (llErrObjList != null) {
                 ListIterator<PcepErrorObject> errObjListIterator = llErrObjList.listIterator();
                 while (errObjListIterator.hasNext()) {
@@ -177,7 +178,7 @@
      * Builder class for PCEP error info.
      */
     public static class Builder implements PcepErrorInfo.Builder {
-        private LinkedList<PcepError> errll;
+        private List<PcepError> errll;
 
         @Override
         public PcepErrorInfo build() {
@@ -185,12 +186,12 @@
         }
 
         @Override
-        public LinkedList<PcepError> getPcepErrorList() {
+        public List<PcepError> getPcepErrorList() {
             return this.errll;
         }
 
         @Override
-        public Builder setPcepErrorList(LinkedList<PcepError> errll) {
+        public Builder setPcepErrorList(List<PcepError> errll) {
             this.errll = errll;
             return this;
         }
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorMsgVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorMsgVer1.java
index 927d83d..e27e2cd 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorMsgVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorMsgVer1.java
@@ -16,6 +16,7 @@
 package org.onosproject.pcepio.protocol.ver1;
 
 import java.util.LinkedList;
+import java.util.List;
 
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.pcepio.exceptions.PcepParseException;
@@ -42,6 +43,7 @@
 
     /*
      * PCE Error message format.
+       Reference: draft-dhodylee-pce-pcep-ls-01, section 8.2.
 
        <PCErr Message>                ::= <Common Header>
                                         ( <error-obj-list> [<Open>] ) | <error>
@@ -49,12 +51,12 @@
 
        <error-obj-list>               ::=<PCEP-ERROR>[<error-obj-list>]
 
-       <error>                        ::=[<request-id-list> | <te-id-list>]
+       <error>                        ::=[<request-id-list> | <ls-id-list>]
                                            <error-obj-list>
 
        <request-id-list>              ::=<RP>[<request-id-list>]
 
-       <te-id-list>                   ::=<TE>[<te-id-list>]
+       <ls-id-list>                   ::=<LS>[<ls-id-list>]
 
        <error-list>                   ::=<error>[<error-list>]
      */
@@ -71,7 +73,7 @@
     public static final PcepErrorMsgVer1.Reader READER = new Reader();
 
     /**
-     * constructor to initialize variables.
+     * Constructor to initialize variables.
      */
     public PcepErrorMsgVer1() {
         errObjListWithOpen = null;
@@ -128,7 +130,7 @@
             //parse <PCErr Message>
             parsePCErrMsg(cb);
 
-            // If other than RP or TE or PCEP-ERROR present then it is error.
+            // If other than RP or LS or PCEP-ERROR present then it is error.
             if (0 < cb.readableBytes()) {
                 PcepObjectHeader tempObjHeader = PcepObjectHeader.read(cb);
                 throw new PcepParseException("Unexpected Object found. Object Class : " + tempObjHeader.getObjClass());
@@ -147,10 +149,10 @@
         public void parsePCErrMsg(ChannelBuffer cb) throws PcepParseException {
             //If PCEP-ERROR list is followed by OPEN Object then store into ErrorObjListWithOpen.
             //     ( <error-obj-list> [<Open>]
-            //If PCEP-ERROR list is followed by RP or TE Object then store into errInfo. <error> [<error-list>]
+            //If PCEP-ERROR list is followed by RP or LS Object then store into errInfo. <error> [<error-list>]
             //If only PCEP-ERROR list is present then store into ErrorObjListWithOpen.
             PcepObjectHeader tempObjHeader;
-            LinkedList<PcepErrorObject> llErrObjList;
+            List<PcepErrorObject> llErrObjList;
 
             if (0 >= cb.readableBytes()) {
                 throw new PcepParseException("PCEP-ERROR message came with empty objects.");
@@ -171,9 +173,9 @@
                 PcepOpenObject pcepOpenObj = PcepOpenObjectVer1.read(cb);
                 this.errObjListWithOpen = new ErrorObjListWithOpen(llErrObjList, pcepOpenObj);
 
-            } else if ((tempObjHeader != null) //check whether RP or TE Object is present.
+            } else if ((tempObjHeader != null) //check whether RP or LS Object is present.
                     && ((tempObjHeader.getObjClass() == PcepRPObjectVer1.RP_OBJ_CLASS)
-                            || (tempObjHeader.getObjClass() == PcepTEObjectVer1.TE_OBJ_CLASS))) {
+                            || (tempObjHeader.getObjClass() == PcepLSObjectVer1.LS_OBJ_CLASS))) {
 
                 this.errInfo = new PcepErrorInfoVer1(null, null, llErrObjList);
                 this.errInfo.read(cb);
@@ -194,7 +196,7 @@
          * @throws PcepParseException if mandatory fields are missing
          * @return error object header
          */
-        public PcepObjectHeader parseErrorObjectList(LinkedList<PcepErrorObject> llErrObjList, ChannelBuffer cb)
+        public PcepObjectHeader parseErrorObjectList(List<PcepErrorObject> llErrObjList, ChannelBuffer cb)
                 throws PcepParseException {
             PcepObjectHeader tempObjHeader = null;
 
@@ -337,8 +339,8 @@
      *
      * @return error types list
      */
-    public LinkedList<Integer> getErrorType() {
-        LinkedList<Integer> llErrorType = new LinkedList<>();
+    public List<Integer> getErrorType() {
+        List<Integer> llErrorType = new LinkedList<>();
         if ((errObjListWithOpen != null)
                 && (errObjListWithOpen.isErrorObjListWithOpenPresent())) {
             llErrorType = errObjListWithOpen.getErrorType();
@@ -354,8 +356,8 @@
      *
      * @return error value list
      */
-    public LinkedList<Integer> getErrorValue() {
-        LinkedList<Integer> llErrorValue = new LinkedList<>();
+    public List<Integer> getErrorValue() {
+        List<Integer> llErrorValue = new LinkedList<>();
         if ((errObjListWithOpen != null)
                 && (errObjListWithOpen.isErrorObjListWithOpenPresent())) {
             llErrorValue = errObjListWithOpen.getErrorValue();
@@ -368,7 +370,7 @@
 
     @Override
     public String toString() {
-        ToStringHelper toStrHelper = MoreObjects.toStringHelper(getClass());
+        ToStringHelper toStrHelper = MoreObjects.toStringHelper(getClass()).omitNullValues();
 
         if ((errObjListWithOpen != null)
                 && (errObjListWithOpen.isErrorObjListWithOpenPresent())) {
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorObjectVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorObjectVer1.java
index 48a337f..f9793f4 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorObjectVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorObjectVer1.java
@@ -60,25 +60,25 @@
             ERROR_OBJ_MINIMUM_LENGTH);
 
     private PcepObjectHeader errorObjHeader;
-    private byte yErrorType;
-    private byte yErrorValue;
-    private LinkedList<PcepValueType> llOptionalTlv; // Optional TLV
+    private byte errorType;
+    private byte errorValue;
+    private LinkedList<PcepValueType> optionalTlv; // Optional TLV
 
     /**
      * Constructor to initialize variables.
      *
      * @param errorObjHeader ERROR Object header
-     * @param yErrorType Error Type
-     * @param yErrorValue Error Value
-     * @param llOptionalTlv list of optional TLV
+     * @param errorType Error Type
+     * @param errorValue Error Value
+     * @param optionalTlv list of optional TLV
      */
 
-    public PcepErrorObjectVer1(PcepObjectHeader errorObjHeader, byte yErrorType, byte yErrorValue,
-            LinkedList<PcepValueType> llOptionalTlv) {
+    public PcepErrorObjectVer1(PcepObjectHeader errorObjHeader, byte errorType, byte errorValue,
+            LinkedList<PcepValueType> optionalTlv) {
         this.errorObjHeader = errorObjHeader;
-        this.yErrorType = yErrorType;
-        this.yErrorValue = yErrorValue;
-        this.llOptionalTlv = llOptionalTlv;
+        this.errorType = errorType;
+        this.errorValue = errorValue;
+        this.optionalTlv = optionalTlv;
     }
 
     /**
@@ -91,13 +91,13 @@
     }
 
     @Override
-    public void setErrorType(byte yErrorType) {
-        this.yErrorType = yErrorType;
+    public void setErrorType(byte errorType) {
+        this.errorType = errorType;
     }
 
     @Override
-    public void setErrorValue(byte yErrorValue) {
-        this.yErrorValue = yErrorValue;
+    public void setErrorValue(byte errorValue) {
+        this.errorValue = errorValue;
     }
 
     /**
@@ -111,22 +111,22 @@
 
     @Override
     public int getErrorType() {
-        return this.yErrorType;
+        return this.errorType;
     }
 
     @Override
     public byte getErrorValue() {
-        return this.yErrorValue;
+        return this.errorValue;
     }
 
     @Override
     public LinkedList<PcepValueType> getOptionalTlv() {
-        return this.llOptionalTlv;
+        return this.optionalTlv;
     }
 
     @Override
-    public void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
-        this.llOptionalTlv = llOptionalTlv;
+    public void setOptionalTlv(LinkedList<PcepValueType> optionalTlv) {
+        this.optionalTlv = optionalTlv;
     }
 
     /**
@@ -138,9 +138,9 @@
     public static PcepErrorObject read(ChannelBuffer cb) {
 
         PcepObjectHeader errorObjHeader;
-        byte yErrorType;
-        byte yErrorValue;
-        LinkedList<PcepValueType> llOptionalTlv;
+        byte errorType;
+        byte errorValue;
+        LinkedList<PcepValueType> optionalTlv;
 
         errorObjHeader = PcepObjectHeader.read(cb);
 
@@ -148,12 +148,12 @@
         ChannelBuffer tempCb = cb.readBytes(errorObjHeader.getObjLen() - OBJECT_HEADER_LENGTH);
         tempCb.readByte(); //ignore Reserved
         tempCb.readByte(); //ignore Flags
-        yErrorType = tempCb.readByte();
-        yErrorValue = tempCb.readByte();
+        errorType = tempCb.readByte();
+        errorValue = tempCb.readByte();
 
-        llOptionalTlv = parseOptionalTlv(tempCb);
+        optionalTlv = parseOptionalTlv(tempCb);
 
-        return new PcepErrorObjectVer1(errorObjHeader, yErrorType, yErrorValue, llOptionalTlv);
+        return new PcepErrorObjectVer1(errorObjHeader, errorType, errorValue, optionalTlv);
     }
 
     /**
@@ -189,8 +189,8 @@
         //write Flags
         cb.writeByte(0);
         //write ErrorType and ErrorValue
-        cb.writeByte(this.yErrorType);
-        cb.writeByte(this.yErrorValue);
+        cb.writeByte(this.errorType);
+        cb.writeByte(this.errorValue);
 
         // Add optional TLV
         packOptionalTlv(cb);
@@ -222,7 +222,7 @@
      */
     protected int packOptionalTlv(ChannelBuffer cb) {
 
-        ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator();
+        ListIterator<PcepValueType> listIterator = optionalTlv.listIterator();
         int startIndex = cb.writerIndex();
         while (listIterator.hasNext()) {
             PcepValueType tlv = listIterator.next();
@@ -245,8 +245,8 @@
         private boolean bIsHeaderSet = false;
 
         private PcepObjectHeader errorObjHeader;
-        private byte yErrorType;
-        private byte yErrorValue;
+        private byte errorType;
+        private byte errorValue;
 
         private boolean bIsPFlagSet = false;
         private boolean bPFlag;
@@ -254,7 +254,7 @@
         private boolean bIsIFlagSet = false;
         private boolean bIFlag;
 
-        private LinkedList<PcepValueType> llOptionalTlv = new LinkedList<>();
+        private LinkedList<PcepValueType> optionalTlv = new LinkedList<>();
 
         @Override
         public PcepErrorObject build() {
@@ -269,7 +269,7 @@
                 errorObjHeader.setIFlag(bIFlag);
             }
 
-            return new PcepErrorObjectVer1(errorObjHeader, yErrorType, yErrorValue, llOptionalTlv);
+            return new PcepErrorObjectVer1(errorObjHeader, errorType, errorValue, optionalTlv);
         }
 
         @Override
@@ -286,35 +286,35 @@
 
         @Override
         public int getErrorType() {
-            return this.yErrorType;
+            return this.errorType;
         }
 
         @Override
         public Builder setErrorType(byte value) {
-            this.yErrorType = value;
+            this.errorType = value;
             return this;
         }
 
         @Override
         public byte getErrorValue() {
-            return this.yErrorValue;
+            return this.errorValue;
         }
 
         @Override
         public Builder setErrorValue(byte value) {
-            this.yErrorValue = value;
+            this.errorValue = value;
             return this;
         }
 
         @Override
-        public Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
-            this.llOptionalTlv = llOptionalTlv;
+        public Builder setOptionalTlv(LinkedList<PcepValueType> optionalTlv) {
+            this.optionalTlv = optionalTlv;
             return this;
         }
 
         @Override
         public LinkedList<PcepValueType> getOptionalTlv() {
-            return this.llOptionalTlv;
+            return this.optionalTlv;
         }
 
         @Override
@@ -335,7 +335,7 @@
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
-                .add("ObjectHeader", errorObjHeader).add("ErrorType", yErrorType)
-                .add("ErrorValue", yErrorValue).add("OptionalTlv", llOptionalTlv).toString();
+                .add("ObjectHeader", errorObjHeader).add("ErrorType", errorType)
+                .add("ErrorValue", errorValue).add("OptionalTlv", optionalTlv).toString();
     }
 }
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorVer1.java
index 0ea5141..1c5bf63 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepErrorVer1.java
@@ -16,6 +16,7 @@
 package org.onosproject.pcepio.protocol.ver1;
 
 import java.util.LinkedList;
+import java.util.List;
 import java.util.ListIterator;
 
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -23,7 +24,7 @@
 import org.onosproject.pcepio.protocol.PcepError;
 import org.onosproject.pcepio.protocol.PcepErrorObject;
 import org.onosproject.pcepio.protocol.PcepRPObject;
-import org.onosproject.pcepio.protocol.PcepTEObject;
+import org.onosproject.pcepio.protocol.PcepLSObject;
 import org.onosproject.pcepio.types.PcepObjectHeader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,30 +32,30 @@
 import com.google.common.base.MoreObjects;
 
 /**
- * Provides PcepError list which contains RP or TE objects.
- * Reference:PCEP Extension for Transporting TE Data draft-dhodylee-pce-pcep-te-data-extn-02.
+ * Provides PcepError list which contains RP or LS objects.
+ * Reference: draft-dhodylee-pce-pcep-ls-01, section 8.2.
  */
 public class PcepErrorVer1 implements PcepError {
 
     /*
-           <error>::=[<request-id-list> | <te-id-list>]
+           <error>::=[<request-id-list> | <ls-id-list>]
                       <error-obj-list>
 
            <request-id-list>::=<RP>[<request-id-list>]
 
-           <te-id-list>::=<TE>[<te-id-list>]
+           <ls-id-list>::=<LS>[<ls-id-list>]
      */
 
     protected static final Logger log = LoggerFactory.getLogger(PcepErrorVer1.class);
 
     private boolean isErroInfoSet;
     //PcepErrorObject list
-    private LinkedList<PcepErrorObject> llErrObjList;
+    private List<PcepErrorObject> errObjList;
     //PcepRPObject list
-    private LinkedList<PcepRPObject> llRPObjList;
-    //PcepTEObject list
-    private LinkedList<PcepTEObject> llTEObjList;
-    private boolean isTEObjListSet;
+    private List<PcepRPObject> rpObjList;
+    //PcepLSObject list
+    private List<PcepLSObject> lsObjList;
+    private boolean isLSObjListSet;
 
     public static final int OBJECT_HEADER_LENGTH = 4;
 
@@ -62,49 +63,49 @@
      * Constructor to initialize variable.
      */
     public PcepErrorVer1() {
-        this.llRPObjList = null;
-        this.llTEObjList = null;
-        this.llErrObjList = null;
+        this.rpObjList = null;
+        this.lsObjList = null;
+        this.errObjList = null;
     }
 
     /**
      * Constructor to initialize variable.
      *
-     * @param llRPObjList list of PcepRPObject
-     * @param llTEObjList list of PcepTEObject
-     * @param llErrObjListObjList list of PcepErrorObject
+     * @param rpObjList list of PcepRPObject
+     * @param lsObjList list of PcepLSObject
+     * @param errObjListObjList list of PcepErrorObject
      */
-    public PcepErrorVer1(LinkedList<PcepRPObject> llRPObjList, LinkedList<PcepTEObject> llTEObjList,
-            LinkedList<PcepErrorObject> llErrObjListObjList) {
-        this.llRPObjList = llRPObjList;
-        this.llTEObjList = llTEObjList;
-        this.llErrObjList = llErrObjListObjList;
+    public PcepErrorVer1(List<PcepRPObject> rpObjList, List<PcepLSObject> lsObjList,
+            List<PcepErrorObject> errObjListObjList) {
+        this.rpObjList = rpObjList;
+        this.lsObjList = lsObjList;
+        this.errObjList = errObjListObjList;
     }
 
     /**
      * Constructor to initialize PcepError.
      *
-     * @param llErrObjList list of PcepErrorObject
+     * @param errObjList list of PcepErrorObject
      */
-    public PcepErrorVer1(LinkedList<PcepErrorObject> llErrObjList) {
-        this.llRPObjList = null;
-        this.llTEObjList = null;
-        this.llErrObjList = llErrObjList;
+    public PcepErrorVer1(List<PcepErrorObject> errObjList) {
+        this.rpObjList = null;
+        this.lsObjList = null;
+        this.errObjList = errObjList;
     }
 
     @Override
-    public LinkedList<PcepRPObject> getRPObjList() {
-        return this.llRPObjList;
+    public List<PcepRPObject> getRPObjList() {
+        return this.rpObjList;
     }
 
     @Override
-    public LinkedList<PcepTEObject> getTEObjList() {
-        return this.llTEObjList;
+    public List<PcepLSObject> getLSObjList() {
+        return this.lsObjList;
     }
 
     @Override
-    public LinkedList<PcepErrorObject> getErrorObjList() {
-        return this.llErrObjList;
+    public List<PcepErrorObject> getErrorObjList() {
+        return this.errObjList;
     }
 
     /**
@@ -117,7 +118,7 @@
         byte yObjClass;
         byte yObjType;
 
-        llRPObjList = new LinkedList<>();
+        rpObjList = new LinkedList<>();
 
         // caller should verify for RP object
         if (cb.readableBytes() < OBJECT_HEADER_LENGTH) {
@@ -133,7 +134,7 @@
         PcepRPObject rpObj;
         while ((yObjClass == PcepRPObjectVer1.RP_OBJ_CLASS) && (yObjType == PcepRPObjectVer1.RP_OBJ_TYPE)) {
             rpObj = PcepRPObjectVer1.read(cb);
-            llRPObjList.add(rpObj);
+            rpObjList.add(rpObj);
 
             if (cb.readableBytes() > OBJECT_HEADER_LENGTH) {
                 cb.markReaderIndex();
@@ -148,20 +149,20 @@
     }
 
     /**
-     * Parse TE List from the channel buffer.
+     * Parse LS List from the channel buffer.
      *
      * @param cb of type channel buffer
      * @throws PcepParseException if mandatory fields are missing
      */
-    public void parseTEList(ChannelBuffer cb) throws PcepParseException {
+    public void parseLSList(ChannelBuffer cb) throws PcepParseException {
         byte yObjClass;
         byte yObjType;
 
-        llTEObjList = new LinkedList<>();
+        lsObjList = new LinkedList<>();
 
-        // caller should verify for TE object
+        // caller should verify for LS object
         if (cb.readableBytes() < OBJECT_HEADER_LENGTH) {
-            log.debug("Unable to find TE Object");
+            log.debug("Unable to find LS Object");
             return;
         }
 
@@ -170,11 +171,11 @@
         cb.resetReaderIndex();
         yObjClass = tempObjHeader.getObjClass();
         yObjType = tempObjHeader.getObjType();
-        PcepTEObject teObj;
-        while ((yObjClass == PcepTEObjectVer1.TE_OBJ_CLASS) && ((yObjType == PcepTEObjectVer1.TE_OBJ_TYPE_NODE_VALUE)
-                || (yObjType == PcepTEObjectVer1.TE_OBJ_TYPE_LINK_VALUE))) {
-            teObj = PcepTEObjectVer1.read(cb);
-            llTEObjList.add(teObj);
+        PcepLSObject lsObj;
+        while ((yObjClass == PcepLSObjectVer1.LS_OBJ_CLASS) && ((yObjType == PcepLSObjectVer1.LS_OBJ_TYPE_NODE_VALUE)
+                || (yObjType == PcepLSObjectVer1.LS_OBJ_TYPE_LINK_VALUE))) {
+            lsObj = PcepLSObjectVer1.read(cb);
+            lsObjList.add(lsObj);
 
             if (cb.readableBytes() > OBJECT_HEADER_LENGTH) {
                 cb.markReaderIndex();
@@ -199,7 +200,7 @@
         byte yObjType;
         boolean bIsErrorObjFound = false;
 
-        llErrObjList = new LinkedList<>();
+        errObjList = new LinkedList<>();
 
         // caller should verify for RP object
         if (cb.readableBytes() < OBJECT_HEADER_LENGTH) {
@@ -214,7 +215,7 @@
         PcepErrorObject errorObject;
         while ((yObjClass == PcepErrorObjectVer1.ERROR_OBJ_CLASS) && (yObjType == PcepErrorObjectVer1.ERROR_OBJ_TYPE)) {
             errorObject = PcepErrorObjectVer1.read(cb);
-            llErrObjList.add(errorObject);
+            errObjList.add(errorObject);
             bIsErrorObjFound = true;
 
             if (cb.readableBytes() > OBJECT_HEADER_LENGTH) {
@@ -252,14 +253,14 @@
         cb.resetReaderIndex();
         byte yObjClass = tempObjHeader.getObjClass();
 
-        //If RPlist present then store it.RPList and TEList are optional
+        //If RPlist present then store it.RPList and LSList are optional
         if (yObjClass == PcepRPObjectVer1.RP_OBJ_CLASS) {
             log.debug("RP_LIST");
             pcepError.parseRPList(cb);
             yObjClass = checkNextObject(cb);
-        } else if (yObjClass == PcepTEObjectVer1.TE_OBJ_CLASS) {
-            log.debug("TE_LIST");
-            pcepError.parseTEList(cb);
+        } else if (yObjClass == PcepLSObjectVer1.LS_OBJ_CLASS) {
+            log.debug("LS_LIST");
+            pcepError.parseLSList(cb);
             yObjClass = checkNextObject(cb);
         }
 
@@ -301,21 +302,21 @@
 
         // RPlist is optional
         if (this.isErroInfoSet) {
-            ListIterator<PcepRPObject> rpObjlistIterator = this.llRPObjList.listIterator();
+            ListIterator<PcepRPObject> rpObjlistIterator = this.rpObjList.listIterator();
             while (rpObjlistIterator.hasNext()) {
                 rpObjlistIterator.next().write(cb);
             }
         }
 
-        // TElist is optional
-        if (this.isTEObjListSet) {
-            ListIterator<PcepTEObject> teObjlistIterator = this.llTEObjList.listIterator();
+        // LSlist is optional
+        if (this.isLSObjListSet) {
+            ListIterator<PcepLSObject> teObjlistIterator = this.lsObjList.listIterator();
             while (teObjlistIterator.hasNext()) {
                 teObjlistIterator.next().write(cb);
             }
         }
         //ErrList is mandatory
-        ListIterator<PcepErrorObject> errlistIterator = this.llErrObjList.listIterator();
+        ListIterator<PcepErrorObject> errlistIterator = this.errObjList.listIterator();
         while (errlistIterator.hasNext()) {
             errlistIterator.next().write(cb);
         }
@@ -328,72 +329,72 @@
      */
     public static class Builder implements PcepError.Builder {
 
-        private LinkedList<PcepRPObject> llRPObjList;
-        private LinkedList<PcepTEObject> llTEObjList;
-        private LinkedList<PcepErrorObject> llErrObjList;
+        private List<PcepRPObject> rpObjList;
+        private List<PcepLSObject> lsObjList;
+        private List<PcepErrorObject> errObjList;
 
         @Override
         public PcepError build() {
-            return new PcepErrorVer1(llRPObjList, llTEObjList, llErrObjList);
+            return new PcepErrorVer1(rpObjList, lsObjList, errObjList);
         }
 
         @Override
-        public LinkedList<PcepRPObject> getRPObjList() {
-            return this.llRPObjList;
+        public List<PcepRPObject> getRPObjList() {
+            return this.rpObjList;
         }
 
         @Override
-        public Builder setRPObjList(LinkedList<PcepRPObject> llRPObjList) {
-            this.llRPObjList = llRPObjList;
+        public Builder setRPObjList(List<PcepRPObject> rpObjList) {
+            this.rpObjList = rpObjList;
             return this;
         }
 
         @Override
-        public LinkedList<PcepTEObject> getTEObjList() {
-            return this.llTEObjList;
+        public List<PcepLSObject> getLSObjList() {
+            return this.lsObjList;
         }
 
         @Override
-        public Builder setTEObjList(LinkedList<PcepTEObject> llTEObjList) {
-            this.llTEObjList = llTEObjList;
+        public Builder setLSObjList(List<PcepLSObject> lsObjList) {
+            this.lsObjList = lsObjList;
             return this;
         }
 
         @Override
-        public LinkedList<PcepErrorObject> getErrorObjList() {
-            return this.llErrObjList;
+        public List<PcepErrorObject> getErrorObjList() {
+            return this.errObjList;
         }
 
         @Override
-        public Builder setErrorObjList(LinkedList<PcepErrorObject> llErrObjList) {
-            this.llErrObjList = llErrObjList;
+        public Builder setErrorObjList(List<PcepErrorObject> errObjList) {
+            this.errObjList = errObjList;
             return this;
         }
 
     }
 
     @Override
-    public void setRPObjList(LinkedList<PcepRPObject> llRPObjList) {
-        this.llRPObjList = llRPObjList;
+    public void setRPObjList(List<PcepRPObject> rpObjList) {
+        this.rpObjList = rpObjList;
     }
 
     @Override
-    public void setTEObjList(LinkedList<PcepTEObject> llTEObjList) {
-        this.llTEObjList = llTEObjList;
+    public void setLSObjList(List<PcepLSObject> lsObjList) {
+        this.lsObjList = lsObjList;
     }
 
     @Override
-    public void setErrorObjList(LinkedList<PcepErrorObject> llErrObjList) {
-        this.llErrObjList = llErrObjList;
+    public void setErrorObjList(List<PcepErrorObject> errObjList) {
+        this.errObjList = errObjList;
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
                 .omitNullValues()
-                .add("RpObjectList", llRPObjList)
-                .add("TeObjectList", llTEObjList)
-                .add("ErrorObjectList", llErrObjList)
+                .add("RpObjectList", rpObjList)
+                .add("LsObjectList", lsObjList)
+                .add("ErrorObjectList", errObjList)
                 .toString();
     }
 }
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv4AdjacencyVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv4AdjacencyVer1.java
index 51c672d..0a2a6ea 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv4AdjacencyVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv4AdjacencyVer1.java
@@ -47,12 +47,12 @@
     protected static final Logger log = LoggerFactory.getLogger(PcepFecObjectIPv4AdjacencyVer1.class);
 
     public static final byte FEC_OBJ_TYPE = 3;
-    public static final byte FEC_OBJ_CLASS = 36; //to be defined
+    public static final byte FEC_OBJ_CLASS = (byte) 226;
     public static final byte FEC_OBJECT_VERSION = 1;
     public static final short FEC_OBJ_MINIMUM_LENGTH = 12;
     public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
 
-    static final PcepObjectHeader DEFAULT_FEC_OBJECT_HEADER = new PcepObjectHeader(FEC_OBJ_CLASS, FEC_OBJ_TYPE,
+    public static final PcepObjectHeader DEFAULT_FEC_OBJECT_HEADER = new PcepObjectHeader(FEC_OBJ_CLASS, FEC_OBJ_TYPE,
             PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, FEC_OBJ_MINIMUM_LENGTH);
 
     private PcepObjectHeader fecObjHeader;
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv4UnnumberedAdjacencyVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv4UnnumberedAdjacencyVer1.java
index f2f54cd..d8c9d8f 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv4UnnumberedAdjacencyVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv4UnnumberedAdjacencyVer1.java
@@ -51,7 +51,7 @@
     protected static final Logger log = LoggerFactory.getLogger(PcepFecObjectIPv4UnnumberedAdjacencyVer1.class);
 
     public static final byte FEC_OBJ_TYPE = 5;
-    public static final byte FEC_OBJ_CLASS = 63; //to be defined
+    public static final byte FEC_OBJ_CLASS = (byte) 226;
     public static final byte FEC_OBJECT_VERSION = 1;
     public static final short FEC_OBJ_MINIMUM_LENGTH = 20;
     public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv4Ver1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv4Ver1.java
index 354547a..25fc459 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv4Ver1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv4Ver1.java
@@ -45,7 +45,7 @@
     protected static final Logger log = LoggerFactory.getLogger(PcepFecObjectIPv4Ver1.class);
 
     public static final byte FEC_OBJ_TYPE = 1;
-    public static final byte FEC_OBJ_CLASS = 63; //to be defined
+    public static final byte FEC_OBJ_CLASS = (byte) 226;
     public static final byte FEC_OBJECT_VERSION = 1;
     public static final short FEC_OBJ_MINIMUM_LENGTH = 8;
     public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv6AdjacencyVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv6AdjacencyVer1.java
index f8ea786..a58bc9b 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv6AdjacencyVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv6AdjacencyVer1.java
@@ -51,7 +51,7 @@
     protected static final Logger log = LoggerFactory.getLogger(PcepFecObjectIPv6AdjacencyVer1.class);
 
     public static final byte FEC_OBJ_TYPE = 4;
-    public static final byte FEC_OBJ_CLASS = 63; //to be defined
+    public static final byte FEC_OBJ_CLASS = (byte) 226;
     public static final byte FEC_OBJECT_VERSION = 1;
     public static final short FEC_OBJ_MINIMUM_LENGTH = 36;
     public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv6Ver1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv6Ver1.java
index 240a96f..59d09b6 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv6Ver1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepFecObjectIPv6Ver1.java
@@ -47,7 +47,7 @@
     protected static final Logger log = LoggerFactory.getLogger(PcepFecObjectIPv6Ver1.class);
 
     public static final byte FEC_OBJ_TYPE = 2;
-    public static final byte FEC_OBJ_CLASS = 63; //to be defined
+    public static final byte FEC_OBJ_CLASS = (byte) 226;
     public static final byte FEC_OBJECT_VERSION = 1;
     public static final short FEC_OBJ_MINIMUM_LENGTH = 20;
     public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepLSObjectVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepLSObjectVer1.java
new file mode 100644
index 0000000..d90c848
--- /dev/null
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepLSObjectVer1.java
@@ -0,0 +1,510 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.pcepio.protocol.ver1;
+
+import java.util.List;
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.protocol.PcepLSObject;
+import org.onosproject.pcepio.types.LocalNodeDescriptorsTlv;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+import org.onosproject.pcepio.types.PcepValueType;
+import org.onosproject.pcepio.types.RemoteNodeDescriptorsTlv;
+import org.onosproject.pcepio.types.RoutingUniverseTlv;
+import org.onosproject.pcepio.types.LinkAttributesTlv;
+import org.onosproject.pcepio.types.LinkDescriptorsTlv;
+import org.onosproject.pcepio.types.NodeAttributesTlv;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * Provides PCEP LS (link-state) object.
+ */
+public class PcepLSObjectVer1 implements PcepLSObject {
+    /*
+     *
+    reference: draft-dhodylee-pce-pcep-ls-01, section 9.2.
+
+    Two Object-Type values are defined for the LS object:
+
+    o  LS Node: LS Object-Type is 1.
+
+    o  LS Link: LS Object-Type is 2.
+
+    o  LS IPv4 Topology Prefix: LS Object-Type is 3.
+
+    o  LS IPv6 Topology Prefix: LS Object-Type is 4.
+
+    The format of the LS object body is as follows:
+
+       0                   1                   2                   3
+       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+      |  Protocol-ID  |          Flag                             |R|S|
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+      |                          LS-ID                                |
+      |                                                               |
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+      //                         TLVs                                //
+      |                                                               |
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     */
+
+    protected static final Logger log = LoggerFactory.getLogger(PcepLSObjectVer1.class);
+
+    public static final byte LS_OBJ_TYPE_NODE_VALUE = 1;
+    public static final byte LS_OBJ_TYPE_LINK_VALUE = 2;
+
+    public static final byte LS_OBJ_CLASS = (byte) 224;
+    public static final byte LS_OBJECT_VERSION = 1;
+
+    // LS_OBJ_MINIMUM_LENGTH = LSObjectHeaderLen(4) + LSObjectLen(8)
+    public static final short LS_OBJ_MINIMUM_LENGTH = 12;
+
+    // Signaled, all default values to be checked.
+    public static final byte DEFAULT_PROTOCOL_ID = 1; //IS-IS Level 1
+    public static final boolean DEFAULT_R_FLAG = false;
+    public static final boolean DEFAULT_S_FLAG = false;
+    public static final int DEFAULT_LS_ID = 0;
+
+    public static final int OBJECT_HEADER_LENGTH = 4;
+    public static final int RIGHT_SHIFT_ONE = 1;
+    public static final int RIGHT_FIRST_FLAG = 0x1;
+    public static final int FLAG_SET_R_FLAG = 0x2;
+    public static final int FLAG_SET_S_FLAG = 0x1;
+    public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
+    public static final int MINIMUM_TLV_HEADER_LENGTH = 4;
+
+    public static final PcepObjectHeader DEFAULT_LS_OBJECT_HEADER = new PcepObjectHeader(LS_OBJ_CLASS,
+            LS_OBJ_TYPE_NODE_VALUE, PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED,
+            LS_OBJ_MINIMUM_LENGTH);
+
+    private PcepObjectHeader lsObjHeader;
+    private byte protocolId;
+    // 2-flags
+    private boolean removeFlag;
+    private boolean syncFlag;
+    private long lsId; //link-state identifier
+    // Optional TLV
+    private List<PcepValueType> optionalTlvList;
+
+    /**
+     * Constructor to initialize variables.
+     *
+     * @param lsObjHeader LS Object header
+     * @param protocolId Protocol-ID
+     * @param removeFlag R-flag
+     * @param syncFlag S-flag
+     * @param lsId LS-ID
+     * @param optionalTlvList linked list of Optional TLV
+     */
+    public PcepLSObjectVer1(PcepObjectHeader lsObjHeader, byte protocolId, boolean removeFlag,
+            boolean syncFlag, long lsId, List<PcepValueType> optionalTlvList) {
+
+        this.lsObjHeader = lsObjHeader;
+        this.protocolId = protocolId;
+        this.removeFlag = removeFlag;
+        this.syncFlag = syncFlag;
+        this.lsId = lsId;
+        this.optionalTlvList = optionalTlvList;
+    }
+
+    @Override
+    public PcepObjectHeader getLSObjHeader() {
+        return this.lsObjHeader;
+    }
+
+    @Override
+    public void setLSObjHeader(PcepObjectHeader obj) {
+        this.lsObjHeader = obj;
+    }
+
+    @Override
+    public byte getProtocolId() {
+        return this.protocolId;
+    }
+
+    @Override
+    public void setProtocolId(byte protId) {
+        this.protocolId = protId;
+    }
+
+    @Override
+    public boolean getRemoveFlag() {
+        return this.removeFlag;
+    }
+
+    @Override
+    public void setRemoveFlag(boolean removeFlag) {
+        this.removeFlag = removeFlag;
+    }
+
+    @Override
+    public boolean getSyncFlag() {
+        return this.syncFlag;
+    }
+
+    @Override
+    public void setSyncFlag(boolean syncFlag) {
+        this.syncFlag = syncFlag;
+    }
+
+    @Override
+    public long getLSId() {
+        return this.lsId;
+    }
+
+    @Override
+    public void setLSId(long lsId) {
+        this.lsId = lsId;
+    }
+
+    @Override
+    public List<PcepValueType> getOptionalTlv() {
+        return this.optionalTlvList;
+    }
+
+    @Override
+    public void setOptionalTlv(List<PcepValueType> optionalTlvList) {
+        this.optionalTlvList = optionalTlvList;
+    }
+
+    /**
+     * Reads from the channel buffer and returns Object of PcepLSObject.
+     *
+     * @param cb of type channel buffer
+     * @return Object of PcepLSObject
+     * @throws PcepParseException if mandatory fields are missing
+     */
+    public static PcepLSObject read(ChannelBuffer cb) throws PcepParseException {
+        log.debug("read");
+
+        PcepObjectHeader lsObjHeader;
+        byte protocolId;
+        // 2-flags
+        boolean removeFlag;
+        boolean syncFlag;
+        long lsId;
+        List<PcepValueType> optionalTlvList;
+
+        lsObjHeader = PcepObjectHeader.read(cb);
+
+        //take only LSObject buffer.
+        ChannelBuffer tempCb = cb.readBytes(lsObjHeader.getObjLen() - OBJECT_HEADER_LENGTH);
+
+        protocolId = tempCb.readByte();
+        //ignore first two bytes of Flags
+        tempCb.readShort();
+
+        Integer iTemp = (int) tempCb.readByte(); //read 3rd byte Flag
+        syncFlag = (iTemp & FLAG_SET_S_FLAG) == FLAG_SET_S_FLAG;
+        removeFlag = (iTemp & FLAG_SET_R_FLAG) == FLAG_SET_R_FLAG;
+
+        lsId = tempCb.readLong();
+
+        // parse optional TLV
+        optionalTlvList = parseOptionalTlv(tempCb);
+
+        return new PcepLSObjectVer1(lsObjHeader, protocolId, removeFlag, syncFlag, lsId, optionalTlvList);
+    }
+
+    @Override
+    public int write(ChannelBuffer cb) throws PcepParseException {
+
+        //write Object header
+        int objStartIndex = cb.writerIndex();
+        int objLenIndex = lsObjHeader.write(cb);
+
+        if (objLenIndex <= 0) {
+            throw new PcepParseException("ObjectLength Index is " + objLenIndex);
+        }
+
+        //write Protocol ID
+        cb.writeByte(this.protocolId);
+
+        //write Flag
+        cb.writeShort(0);
+
+        byte bTemp = 0;
+        if (syncFlag) {
+            bTemp = FLAG_SET_S_FLAG;
+        }
+
+        if (removeFlag) {
+            bTemp = (byte) (bTemp | FLAG_SET_R_FLAG);
+        }
+        cb.writeByte(bTemp);
+
+        //write LSId
+        cb.writeLong(lsId);
+
+        // Add optional TLV
+        packOptionalTlv(cb);
+
+        //Update object length now
+        int length = cb.writerIndex() - objStartIndex;
+
+        //will be helpful during print().
+        lsObjHeader.setObjLen((short) length);
+
+        cb.setShort(objLenIndex, (short) length);
+
+        return cb.writerIndex();
+    }
+
+    /**
+     * Returns Linked list of PCEP Value Type.
+     *
+     * @param cb of channel buffer
+     * @return Linked list of PCEP Value Type
+     * @throws PcepParseException if mandatory fields are missing
+     */
+    protected static List<PcepValueType> parseOptionalTlv(ChannelBuffer cb) throws PcepParseException {
+
+        List<PcepValueType> llOutOptionalTlv;
+
+        llOutOptionalTlv = new LinkedList<>();
+
+        while (MINIMUM_TLV_HEADER_LENGTH <= cb.readableBytes()) {
+
+            PcepValueType tlv;
+            short hType = cb.readShort();
+            short hLength = cb.readShort();
+            long lValue = 0;
+
+            switch (hType) {
+
+            case RoutingUniverseTlv.TYPE:
+                lValue = cb.readLong();
+                tlv = new RoutingUniverseTlv(lValue);
+                break;
+            case LocalNodeDescriptorsTlv.TYPE:
+                tlv = LocalNodeDescriptorsTlv.read(cb, hLength);
+                break;
+            case RemoteNodeDescriptorsTlv.TYPE:
+                tlv = RemoteNodeDescriptorsTlv.read(cb, hLength);
+                break;
+            case LinkDescriptorsTlv.TYPE:
+                tlv = LinkDescriptorsTlv.read(cb, hLength);
+                break;
+            case NodeAttributesTlv.TYPE:
+                tlv = NodeAttributesTlv.read(cb, hLength);
+                break;
+            case LinkAttributesTlv.TYPE:
+                tlv = LinkAttributesTlv.read(cb, hLength);
+                break;
+            default:
+                throw new PcepParseException("Unsupported TLV type :" + hType);
+            }
+
+            // Check for the padding
+            int pad = hLength % 4;
+            if (0 < pad) {
+                pad = 4 - pad;
+                if (pad <= cb.readableBytes()) {
+                    cb.skipBytes(pad);
+                }
+            }
+
+            llOutOptionalTlv.add(tlv);
+        }
+
+        if (0 < cb.readableBytes()) {
+
+            throw new PcepParseException("Optional Tlv parsing error. Extra bytes received.");
+        }
+        return llOutOptionalTlv;
+    }
+
+    /**
+     * Returns the writer index.
+     *
+     * @param cb of type channel buffer
+     * @return the writer index.
+     */
+    protected int packOptionalTlv(ChannelBuffer cb) {
+
+        ListIterator<PcepValueType> listIterator = optionalTlvList.listIterator();
+
+        while (listIterator.hasNext()) {
+            PcepValueType tlv = listIterator.next();
+
+            if (tlv == null) {
+                log.debug("TLV is null from OptionalTlv list");
+                continue;
+            }
+            tlv.write(cb);
+
+            // need to take care of padding
+            int pad = tlv.getLength() % 4;
+
+            if (0 != pad) {
+                pad = 4 - pad;
+                for (int i = 0; i < pad; ++i) {
+                    cb.writeByte((byte) 0);
+                }
+            }
+        }
+        return cb.writerIndex();
+    }
+
+    /**
+     * Builder class for PCEP LS (link-state) object.
+     */
+    public static class Builder implements PcepLSObject.Builder {
+        private boolean isHeaderSet = false;
+        private boolean isProtocolIdSet = false;
+        private boolean isRemoveFlagSet = false;
+        private boolean isSyncFlagSet = false;
+        private boolean isLSIdSet = false;
+
+        private PcepObjectHeader lsObjHeader;
+        private byte protocolId;
+        private boolean removeFlag;
+        private boolean syncFlag;
+        private long lsId;
+        private List<PcepValueType> optionalTlvList = new LinkedList<>();
+
+        private boolean isProcRuleFlagSet = false;
+        private boolean procRuleFlag; //Processing rule flag
+
+        private boolean isIgnoreFlagSet = false;
+        private boolean ignoreFlag;
+
+        @Override
+        public PcepLSObject build() {
+            PcepObjectHeader lsObjHeader = this.isHeaderSet ? this.lsObjHeader : DEFAULT_LS_OBJECT_HEADER;
+
+            byte protocolId = this.isProtocolIdSet ? this.protocolId : DEFAULT_PROTOCOL_ID;
+            boolean removeFlag = this.isRemoveFlagSet ? this.removeFlag : DEFAULT_R_FLAG;
+            boolean syncFlag = this.isSyncFlagSet ? this.syncFlag : DEFAULT_S_FLAG;
+            long lsId = this.isLSIdSet ? this.lsId : DEFAULT_LS_ID;
+
+            if (isProcRuleFlagSet) {
+                lsObjHeader.setPFlag(procRuleFlag);
+            }
+
+            if (isIgnoreFlagSet) {
+                lsObjHeader.setIFlag(ignoreFlag);
+            }
+
+            return new PcepLSObjectVer1(lsObjHeader, protocolId, removeFlag, syncFlag, lsId, optionalTlvList);
+
+        }
+
+        @Override
+        public PcepObjectHeader getLSObjHeader() {
+            return this.lsObjHeader;
+        }
+
+        @Override
+        public Builder setLSObjHeader(PcepObjectHeader obj) {
+            this.lsObjHeader = obj;
+            this.isHeaderSet = true;
+            return this;
+        }
+
+        @Override
+        public byte getProtocolId() {
+            return this.protocolId;
+        }
+
+        @Override
+        public Builder setProtocolId(byte protId) {
+            this.protocolId = protId;
+            this.isProtocolIdSet = true;
+            return this;
+        }
+
+        @Override
+        public boolean getRemoveFlag() {
+            return this.removeFlag;
+        }
+
+        @Override
+        public Builder setRemoveFlag(boolean removeFlag) {
+            this.removeFlag = removeFlag;
+            this.isRemoveFlagSet = true;
+            return this;
+        }
+
+        @Override
+        public boolean getSyncFlag() {
+            return this.syncFlag;
+        }
+
+        @Override
+        public Builder setSyncFlag(boolean syncFlag) {
+            this.syncFlag = syncFlag;
+            this.isSyncFlagSet = true;
+            return this;
+        }
+
+        @Override
+        public long getLSId() {
+            return this.lsId;
+        }
+
+        @Override
+        public Builder setLSId(long lsId) {
+            this.lsId = lsId;
+            this.isLSIdSet = true;
+            return this;
+        }
+
+        @Override
+        public List<PcepValueType> getOptionalTlv() {
+            return this.optionalTlvList;
+        }
+
+        @Override
+        public Builder setOptionalTlv(List<PcepValueType> optionalTlvList) {
+            this.optionalTlvList = optionalTlvList;
+            return this;
+        }
+
+        @Override
+        public Builder setPFlag(boolean value) {
+            this.procRuleFlag = value;
+            this.isProcRuleFlagSet = true;
+            return this;
+        }
+
+        @Override
+        public Builder setIFlag(boolean value) {
+            this.ignoreFlag = value;
+            this.isIgnoreFlagSet = true;
+            return this;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass()).omitNullValues()
+                .add("ObjectHeader", lsObjHeader)
+                .add("ProtocolId", protocolId)
+                .add("RFlag", (removeFlag) ? 1 : 0)
+                .add("SFlag", (syncFlag) ? 1 : 0)
+                .add("LsId", lsId)
+                .add("OptionalTlv", optionalTlvList).toString();
+    }
+}
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepLSReportMsgVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepLSReportMsgVer1.java
new file mode 100644
index 0000000..9c4ec45
--- /dev/null
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepLSReportMsgVer1.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.pcepio.protocol.ver1;
+
+import java.util.List;
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.protocol.PcepMessageReader;
+import org.onosproject.pcepio.protocol.PcepMessageWriter;
+import org.onosproject.pcepio.protocol.PcepLSObject;
+import org.onosproject.pcepio.protocol.PcepLSReportMsg;
+import org.onosproject.pcepio.protocol.PcepType;
+import org.onosproject.pcepio.protocol.PcepVersion;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * Provides  PCEP LS (link-state) Report Message.
+ */
+class PcepLSReportMsgVer1 implements PcepLSReportMsg {
+
+    /*
+     * Ref : draft-dhodylee-pce-pcep-ls-01, section 8.1
+
+        <LSRpt Message>  ::=  <Common Header>
+                              <ls-report-list>
+    Where:
+        <ls-report-list> ::=  <LS>[<ls-report-list>]
+     */
+
+    private static final Logger log = LoggerFactory.getLogger(PcepLSReportMsgVer1.class);
+    //PACKET_MINIMUM_LENGTH = CommonHeaderLen(4)+LSObjMinLen(12)
+    public static final int PACKET_MINIMUM_LENGTH = 16;
+    public static final PcepType MSG_TYPE = PcepType.LS_REPORT;
+    // <ls-report-list>
+    private List<PcepLSObject> lsReportList;
+
+    public static final PcepLSReportMsgVer1.Reader READER = new Reader();
+
+    /**
+     * Reader class for reading PCEP LS-Report message form channel buffer.
+     */
+    static class Reader implements PcepMessageReader<PcepLSReportMsg> {
+
+        List<PcepLSObject> lsReportList;
+
+        @Override
+        public PcepLSReportMsg readFrom(ChannelBuffer cb) throws PcepParseException {
+
+            if (cb.readableBytes() < PACKET_MINIMUM_LENGTH) {
+                return null;
+            }
+
+            lsReportList = new LinkedList<>();
+
+            byte version = cb.readByte();
+            version = (byte) (version >> PcepMessageVer1.SHIFT_FLAG);
+            if (version != PcepMessageVer1.PACKET_VERSION) {
+                throw new PcepParseException("Wrong version. Expected=PcepVersion.PCEP_1(1), got=" + version);
+            }
+
+            byte type = cb.readByte();
+            if (type != MSG_TYPE.getType()) {
+                throw new PcepParseException("Wrong type. Expected=PcepType.LS_REPORT(224), got=" + type);
+            }
+
+            short length = cb.readShort();
+            if (length < PACKET_MINIMUM_LENGTH) {
+                throw new PcepParseException(
+                        "Wrong length. Expected to be >= " + PACKET_MINIMUM_LENGTH + ", is: " + length);
+            }
+
+            // Parse <ls-report-list>
+            parseLSReportList(cb);
+
+            return new PcepLSReportMsgVer1(lsReportList);
+        }
+
+        /**
+         * Parse ls-report-list.
+         *
+         * @param cb input Channel Buffer
+         * @throws PcepParseException when fails to parse LS-Report list.
+         */
+        public void parseLSReportList(ChannelBuffer cb) throws PcepParseException {
+            // <ls-report-list> ::= <LS>[<ls-report-list>]
+
+            while (0 < cb.readableBytes()) {
+                //store LS objects
+                if (!lsReportList.add(PcepLSObjectVer1.read(cb))) {
+                    throw new PcepParseException("Failed to add LS object to LS-Report list");
+                }
+            }
+        }
+    }
+
+    /**
+     * Constructor to initialize LS-Report list.
+     *
+     * @param lsReportList list of PCEP LS Object
+     */
+    PcepLSReportMsgVer1(List<PcepLSObject> lsReportList) {
+        this.lsReportList = lsReportList;
+    }
+
+    /**
+     * Builder class for PCEP LS-Report message.
+     */
+    static class Builder implements PcepLSReportMsg.Builder {
+        // PCEP LS Report message fields
+        List<PcepLSObject> lsReportList;
+
+        @Override
+        public PcepVersion getVersion() {
+            return PcepVersion.PCEP_1;
+        }
+
+        @Override
+        public PcepType getType() {
+            return PcepType.LS_REPORT;
+        }
+
+        @Override
+        public PcepLSReportMsg build() {
+            return new PcepLSReportMsgVer1(this.lsReportList);
+        }
+
+        @Override
+        public List<PcepLSObject> getLSReportList() {
+            return this.lsReportList;
+        }
+
+        @Override
+        public Builder setLSReportList(List<PcepLSObject> ll) {
+            this.lsReportList = ll;
+            return this;
+        }
+    }
+
+    @Override
+    public void writeTo(ChannelBuffer bb) throws PcepParseException {
+        WRITER.write(bb, this);
+    }
+
+    static final Writer WRITER = new Writer();
+
+    /**
+     * Writer class for writing PCEP LS-Report message to channel buffer.
+     */
+    static class Writer implements PcepMessageWriter<PcepLSReportMsgVer1> {
+
+        @Override
+        public void write(ChannelBuffer bb, PcepLSReportMsgVer1 message) throws PcepParseException {
+
+            int startIndex = bb.writerIndex();
+
+            // first 3 bits set to version
+            bb.writeByte((byte) (PcepMessageVer1.PACKET_VERSION << PcepMessageVer1.SHIFT_FLAG));
+
+            // message type
+            bb.writeByte(MSG_TYPE.getType());
+
+            // Length of the message will be updated at the end
+            // First write with 0s
+            int msgLenIndex = bb.writerIndex();
+            bb.writeShort((short) 0);
+
+            ListIterator<PcepLSObject> listIterator = message.lsReportList.listIterator();
+
+            while (listIterator.hasNext()) {
+                PcepLSObject lsObj = listIterator.next();
+                lsObj.write(bb);
+            }
+
+            // update message length field
+            int length = bb.writerIndex() - startIndex;
+            bb.setShort(msgLenIndex, (short) length);
+        }
+    }
+
+    @Override
+    public PcepVersion getVersion() {
+        return PcepVersion.PCEP_1;
+    }
+
+    @Override
+    public PcepType getType() {
+        return MSG_TYPE;
+    }
+
+    @Override
+    public List<PcepLSObject> getLSReportList() {
+        return this.lsReportList;
+    }
+
+    @Override
+    public void setLSReportList(List<PcepLSObject> ll) {
+        this.lsReportList = ll;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("LSReportList", lsReportList)
+                .toString();
+    }
+}
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepLabelObjectVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepLabelObjectVer1.java
index a4ac87c..0c76894 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepLabelObjectVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepLabelObjectVer1.java
@@ -56,7 +56,7 @@
     protected static final Logger log = LoggerFactory.getLogger(PcepLspObjectVer1.class);
 
     public static final byte LABEL_OBJ_TYPE = 1;
-    public static final byte LABEL_OBJ_CLASS = 35; //TBD : to be defined
+    public static final byte LABEL_OBJ_CLASS = (byte) 225;
     public static final byte LABEL_OBJECT_VERSION = 1;
     public static final byte OBJECT_HEADER_LENGTH = 4;
     public static final boolean DEFAULT_OFLAG = false;
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepMessageVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepMessageVer1.java
index 2169a67..5e4db6c 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepMessageVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepMessageVer1.java
@@ -17,10 +17,12 @@
 package org.onosproject.pcepio.protocol.ver1;
 
 import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 import org.onosproject.pcepio.protocol.PcepFactories;
 import org.onosproject.pcepio.protocol.PcepMessage;
 import org.onosproject.pcepio.protocol.PcepMessageReader;
+import org.onosproject.pcepio.protocol.PcepType;
 import org.onosproject.pcepio.types.PcepErrorDetailInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,21 +35,11 @@
     protected static final Logger log = LoggerFactory.getLogger(PcepFactories.class);
 
     // version: 1.0
-    static final byte WIRE_VERSION = 1;
-    static final int MINIMUM_LENGTH = 4;
-    static final int PACKET_VERSION = 1;
-    static final byte OPEN_MSG_TYPE = 0x1;
-    static final byte KEEPALIVE_MSG_TYPE = 0x2;
-    static final byte REPORT_MSG_TYPE = 0xa;
-    static final byte TE_REPORT_MSG_TYPE = 0xe;
-    static final byte UPDATE_MSG_TYPE = 0xb;
-    static final byte INITIATE_MSG_TYPE = 0xc;
-    static final byte CLOSE_MSG_TYPE = 0x7;
-    static final byte ERROR_MSG_TYPE = 0x6;
-    static final byte LABEL_UPDATE_MSG_TYPE = 0xD;
-    static final byte LABEL_RANGE_RESV_MSG_TYPE = 0xF;
+    public static final byte WIRE_VERSION = 1;
+    public static final int MINIMUM_LENGTH = 4;
+    public static final int PACKET_VERSION = 1;
     public static final int SHIFT_FLAG = 5;
-    static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
+    public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
 
     public static final PcepMessageVer1.Reader READER = new Reader();
 
@@ -56,7 +48,7 @@
      */
     static class Reader implements PcepMessageReader<PcepMessage> {
         @Override
-        public PcepMessage readFrom(ChannelBuffer cb) throws PcepParseException {
+        public PcepMessage readFrom(ChannelBuffer cb) throws PcepParseException, PcepOutOfBoundMessageException {
 
             if (cb.readableBytes() < MINIMUM_LENGTH) {
                 throw new PcepParseException("Packet should have minimum length: " + MINIMUM_LENGTH);
@@ -75,53 +67,43 @@
                 short length = cb.readShort();
                 cb.readerIndex(start);
 
-                switch (type) {
+                // Check the out-of-bound message.
+                // If the message is out-of-bound then throw PcepOutOfBoundException.
+                if ((length - MINIMUM_COMMON_HEADER_LENGTH) > cb.readableBytes()) {
+                    throw new PcepOutOfBoundMessageException("Message is out-of-bound.");
+                }
 
-                case OPEN_MSG_TYPE:
+                if (type == (byte) PcepType.OPEN.getType()) {
                     log.debug("OPEN MESSAGE is received");
-                    // message type value 1 means it is open message
                     return PcepOpenMsgVer1.READER.readFrom(cb.readBytes(length));
-                case KEEPALIVE_MSG_TYPE:
+                } else if (type == (byte) PcepType.KEEP_ALIVE.getType()) {
                     log.debug("KEEPALIVE MESSAGE is received");
-                    // message type value 2 means it is Keepalive message
                     return PcepKeepaliveMsgVer1.READER.readFrom(cb.readBytes(length));
-                case ERROR_MSG_TYPE:
+                } else if (type == (byte) PcepType.ERROR.getType()) {
                     log.debug("ERROR MESSAGE is received");
-                    // message type value 6 means it is error message
                     return PcepErrorMsgVer1.READER.readFrom(cb.readBytes(length));
-                case REPORT_MSG_TYPE:
-                    log.debug("REPORT MESSAGE is received");
-                    // message type value 10 means it is Report message
-                    // return
-                    return PcepReportMsgVer1.READER.readFrom(cb.readBytes(length));
-                case UPDATE_MSG_TYPE:
-                    log.debug("UPDATE MESSAGE is received");
-                    //message type value 11 means it is Update message
-                    return PcepUpdateMsgVer1.READER.readFrom(cb.readBytes(length));
-                case INITIATE_MSG_TYPE:
-                    log.debug("INITIATE MESSAGE is received");
-                    //message type value 12 means it is PcInitiate message
-                    return PcepInitiateMsgVer1.READER.readFrom(cb.readBytes(length));
-                case CLOSE_MSG_TYPE:
+                } else if (type == (byte) PcepType.CLOSE.getType()) {
                     log.debug("CLOSE MESSAGE is received");
-                    // message type value 7 means it is Close message
                     return PcepCloseMsgVer1.READER.readFrom(cb.readBytes(length));
-                case TE_REPORT_MSG_TYPE:
-                    log.debug("TE REPORT MESSAGE is received");
-                    // message type value 14 means it is TE REPORT message
-                    // return
-                    return PcepTEReportMsgVer1.READER.readFrom(cb.readBytes(length));
-                case LABEL_UPDATE_MSG_TYPE:
-                    log.debug("LABEL UPDATE MESSAGE is received");
-                    // message type value 13 means it is LABEL UPDATE message
-                    // return
-                    return PcepLabelUpdateMsgVer1.READER.readFrom(cb.readBytes(length));
-                case LABEL_RANGE_RESV_MSG_TYPE:
+                } else if (type == (byte) PcepType.REPORT.getType()) {
+                    log.debug("REPORT MESSAGE is received");
+                    return PcepReportMsgVer1.READER.readFrom(cb.readBytes(length));
+                } else if (type == (byte) PcepType.UPDATE.getType()) {
+                    log.debug("UPDATE MESSAGE is received");
+                    return PcepUpdateMsgVer1.READER.readFrom(cb.readBytes(length));
+                } else if (type == (byte) PcepType.INITIATE.getType()) {
+                    log.debug("INITIATE MESSAGE is received");
+                    return PcepInitiateMsgVer1.READER.readFrom(cb.readBytes(length));
+                } else if (type == (byte) PcepType.LS_REPORT.getType()) {
+                    log.debug("LS REPORT MESSAGE is received");
+                    return PcepLSReportMsgVer1.READER.readFrom(cb.readBytes(length));
+                } else if (type == (byte) PcepType.LABEL_RANGE_RESERV.getType()) {
                     log.debug("LABEL RANGE RESERVE MESSAGE is received");
-                    // message type value 15 means it is LABEL RANGE RESERVE message
-                    // return
                     return PcepLabelRangeResvMsgVer1.READER.readFrom(cb.readBytes(length));
-                default:
+                } else if (type == (byte) PcepType.LABEL_UPDATE.getType()) {
+                    log.debug("LABEL UPDATE MESSAGE is received");
+                    return PcepLabelUpdateMsgVer1.READER.readFrom(cb.readBytes(length));
+                } else {
                     throw new PcepParseException("ERROR: UNKNOWN MESSAGE is received. Msg Type: " + type);
                 }
             } catch (IndexOutOfBoundsException e) {
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepOpenObjectVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepOpenObjectVer1.java
index d5e5869..13d2584 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepOpenObjectVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepOpenObjectVer1.java
@@ -31,7 +31,7 @@
 import org.onosproject.pcepio.types.PcepValueType;
 import org.onosproject.pcepio.types.StatefulLspDbVerTlv;
 import org.onosproject.pcepio.types.StatefulPceCapabilityTlv;
-import org.onosproject.pcepio.types.TedCapabilityTlv;
+import org.onosproject.pcepio.types.LsCapabilityTlv;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -252,13 +252,13 @@
                 long lValue = cb.readLong();
                 tlv = new StatefulLspDbVerTlv(lValue);
                 break;
-            case TedCapabilityTlv.TYPE:
-                log.debug("TedCapabilityTlv");
-                if (TedCapabilityTlv.LENGTH != hLength) {
-                    throw new PcepParseException("Invalid length received for TedCapabilityTlv.");
+            case LsCapabilityTlv.TYPE:
+                log.debug("LsCapabilityTlv");
+                if (LsCapabilityTlv.LENGTH != hLength) {
+                    throw new PcepParseException("Invalid length received for LsCapabilityTlv.");
                 }
                 iValue = cb.readInt();
-                tlv = new TedCapabilityTlv(iValue);
+                tlv = new LsCapabilityTlv(iValue);
                 break;
             case PcepLabelDbVerTlv.TYPE:
                 log.debug("PcepLabelDbVerTlv");
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepTEObjectVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepTEObjectVer1.java
deleted file mode 100644
index b1c6940..0000000
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepTEObjectVer1.java
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.pcepio.protocol.ver1;
-
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-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.PcepObjectHeader;
-import org.onosproject.pcepio.types.PcepValueType;
-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.TENodeAttributesTlv;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.MoreObjects;
-
-/**
- * Provides PCEP TE Object.
- */
-public class PcepTEObjectVer1 implements PcepTEObject {
-    /*
-     *
-    reference: PCEP Extension for Transporting TE Data draft-dhodylee-pce-pcep-te-data-extn-02.
-    TE Object-Class is [TBD6].
-
-    Two Object-Type values are defined for the TE object:
-
-    o  TE Node: TE Object-Type is 1.
-
-    o  TE Link: TE Object-Type is 2.
-
-    The format of the TE object body is as follows:
-
-       0                   1                   2                   3
-       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-      |  Protocol-ID  |          Flag                             |R|S|
-      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-      |                          TE-ID                                |
-      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-      //                         TLVs                                //
-      |                                                               |
-      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-     */
-
-    protected static final Logger log = LoggerFactory.getLogger(PcepTEObjectVer1.class);
-
-    public static final byte TE_OBJ_TYPE_NODE_VALUE = 1;
-    public static final byte TE_OBJ_TYPE_LINK_VALUE = 2;
-
-    public static final byte TE_OBJ_CLASS = 101; //TBD6 in RFC.
-    public static final byte TE_OBJECT_VERSION = 1;
-
-    // TE_OBJ_MINIMUM_LENGTH = TEObjectHeaderLen(4)+ TEObjectLen(8)
-    public static final short TE_OBJ_MINIMUM_LENGTH = 12;
-
-    // Signaled ,all default values to be checked.
-    public static final byte DEFAULT_PROTOCOL_ID = 1; //IS-IS Level 1
-    public static final boolean DEFAULT_R_FLAG = false;
-    public static final boolean DEFAULT_S_FLAG = false;
-    public static final int DEFAULT_TE_ID = 0;
-
-    public static final int OBJECT_HEADER_LENGTH = 4;
-    public static final int RIGHT_SHIFT_ONE = 1;
-    public static final int RIGHT_FIRST_FLAG = 0x1;
-    public static final int FLAG_SET_R_FLAG = 0x2;
-    public static final int FLAG_SET_S_FLAG = 0x1;
-    public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
-    public static final int MINIMUM_TLV_HEADER_LENGTH = 4;
-
-    public static final PcepObjectHeader DEFAULT_TE_OBJECT_HEADER = new PcepObjectHeader(TE_OBJ_CLASS,
-            TE_OBJ_TYPE_NODE_VALUE, PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED,
-            TE_OBJ_MINIMUM_LENGTH);
-
-    private PcepObjectHeader teObjHeader;
-    private byte yProtocolId;
-    // 2-flags
-    private boolean bRFlag;
-    private boolean bSFlag;
-    private int iTEId;
-    // Optional TLV
-    private LinkedList<PcepValueType> llOptionalTlv;
-
-    /**
-     * Constructor to initialize variables.
-     *
-     * @param teObjHeader TE Object header
-     * @param yProtocolId Protocol-ID
-     * @param bRFlag R-flag
-     * @param bSFlag S-flag
-     * @param iTEId TE-ID
-     * @param llOptionalTlv linked list of Optional TLV
-     */
-    public PcepTEObjectVer1(PcepObjectHeader teObjHeader, byte yProtocolId, boolean bRFlag, boolean bSFlag, int iTEId,
-            LinkedList<PcepValueType> llOptionalTlv) {
-
-        this.teObjHeader = teObjHeader;
-        this.yProtocolId = yProtocolId;
-        this.bRFlag = bRFlag;
-        this.bSFlag = bSFlag;
-        this.iTEId = iTEId;
-        this.llOptionalTlv = llOptionalTlv;
-    }
-
-    @Override
-    public PcepObjectHeader getTEObjHeader() {
-        return this.teObjHeader;
-    }
-
-    @Override
-    public void setTEObjHeader(PcepObjectHeader obj) {
-        this.teObjHeader = obj;
-    }
-
-    @Override
-    public byte getProtocolId() {
-        return this.yProtocolId;
-    }
-
-    @Override
-    public void setProtocolId(byte yProtId) {
-        this.yProtocolId = yProtId;
-    }
-
-    @Override
-    public boolean getRFlag() {
-        return this.bRFlag;
-    }
-
-    @Override
-    public void setRFlag(boolean bRFlag) {
-        this.bRFlag = bRFlag;
-    }
-
-    @Override
-    public boolean getSFlag() {
-        return this.bSFlag;
-    }
-
-    @Override
-    public void setSFlag(boolean bSFlag) {
-        this.bSFlag = bSFlag;
-    }
-
-    @Override
-    public int getTEId() {
-        return this.iTEId;
-    }
-
-    @Override
-    public void setTEId(int iTEId) {
-        this.iTEId = iTEId;
-    }
-
-    @Override
-    public LinkedList<PcepValueType> getOptionalTlv() {
-        return this.llOptionalTlv;
-    }
-
-    @Override
-    public void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
-        this.llOptionalTlv = llOptionalTlv;
-    }
-
-    /**
-     * Reads from the channel buffer and returns Object of PcepTEObject.
-     *
-     * @param cb of type channel buffer
-     * @return Object of PcepTEObject
-     * @throws PcepParseException if mandatory fields are missing
-     */
-    public static PcepTEObject read(ChannelBuffer cb) throws PcepParseException {
-        log.debug("read");
-
-        PcepObjectHeader teObjHeader;
-        byte yProtocolId;
-        // 2-flags
-        boolean bRFlag;
-        boolean bSFlag;
-        int iTEId;
-        LinkedList<PcepValueType> llOptionalTlv;
-
-        teObjHeader = PcepObjectHeader.read(cb);
-
-        //take only TEObject buffer.
-        ChannelBuffer tempCb = cb.readBytes(teObjHeader.getObjLen() - OBJECT_HEADER_LENGTH);
-
-        yProtocolId = tempCb.readByte();
-        //ignore first two bytes of Flags
-        tempCb.readShort();
-
-        Integer iTemp = (int) tempCb.readByte(); //read 3rd byte Flag
-        bSFlag = (iTemp & FLAG_SET_S_FLAG) == FLAG_SET_S_FLAG;
-        bRFlag = (iTemp & FLAG_SET_R_FLAG) == FLAG_SET_R_FLAG;
-
-        iTEId = tempCb.readInt();
-
-        // parse optional TLV
-        llOptionalTlv = parseOptionalTlv(tempCb);
-
-        return new PcepTEObjectVer1(teObjHeader, yProtocolId, bRFlag, bSFlag, iTEId, llOptionalTlv);
-    }
-
-    @Override
-    public int write(ChannelBuffer cb) throws PcepParseException {
-
-        //write Object header
-        int objStartIndex = cb.writerIndex();
-        int objLenIndex = teObjHeader.write(cb);
-
-        if (objLenIndex <= 0) {
-            throw new PcepParseException("ObjectLength Index is " + objLenIndex);
-        }
-
-        //write Protocol ID
-        cb.writeByte(this.yProtocolId);
-
-        //write Flag
-        cb.writeShort(0);
-
-        byte bTemp = 0;
-        if (bSFlag) {
-            bTemp = FLAG_SET_S_FLAG;
-        }
-
-        if (bRFlag) {
-            bTemp = (byte) (bTemp | FLAG_SET_R_FLAG);
-        }
-        cb.writeByte(bTemp);
-
-        //write TEId
-        cb.writeInt(iTEId);
-
-        // Add optional TLV
-        packOptionalTlv(cb);
-
-        //Update object length now
-        int length = cb.writerIndex() - objStartIndex;
-
-        //will be helpful during print().
-        teObjHeader.setObjLen((short) length);
-
-        cb.setShort(objLenIndex, (short) length);
-
-        return cb.writerIndex();
-    }
-
-    /**
-     * Returns Linked list of PCEP Value Type.
-     *
-     * @param cb of channel buffer
-     * @return Linked list of PCEP Value Type
-     * @throws PcepParseException if mandatory fields are missing
-     */
-    protected static LinkedList<PcepValueType> parseOptionalTlv(ChannelBuffer cb) throws PcepParseException {
-
-        LinkedList<PcepValueType> llOutOptionalTlv;
-
-        llOutOptionalTlv = new LinkedList<>();
-
-        while (MINIMUM_TLV_HEADER_LENGTH <= cb.readableBytes()) {
-
-            PcepValueType tlv;
-            short hType = cb.readShort();
-            short hLength = cb.readShort();
-            long lValue = 0;
-
-            switch (hType) {
-
-            case RoutingUniverseTlv.TYPE:
-                lValue = cb.readLong();
-                tlv = new RoutingUniverseTlv(lValue);
-                break;
-            case LocalTENodeDescriptorsTlv.TYPE:
-                tlv = LocalTENodeDescriptorsTlv.read(cb, hLength);
-                break;
-            case RemoteTENodeDescriptorsTlv.TYPE:
-                tlv = RemoteTENodeDescriptorsTlv.read(cb, hLength);
-                break;
-            case TELinkDescriptorsTlv.TYPE:
-                tlv = TELinkDescriptorsTlv.read(cb, hLength);
-                break;
-            case TENodeAttributesTlv.TYPE:
-                tlv = TENodeAttributesTlv.read(cb, hLength);
-                break;
-            case TELinkAttributesTlv.TYPE:
-                tlv = TELinkAttributesTlv.read(cb, hLength);
-                break;
-            default:
-                throw new PcepParseException("Unsupported TLV type :" + hType);
-            }
-
-            // Check for the padding
-            int pad = hLength % 4;
-            if (0 < pad) {
-                pad = 4 - pad;
-                if (pad <= cb.readableBytes()) {
-                    cb.skipBytes(pad);
-                }
-            }
-
-            llOutOptionalTlv.add(tlv);
-        }
-
-        if (0 < cb.readableBytes()) {
-
-            throw new PcepParseException("Optional Tlv parsing error. Extra bytes received.");
-        }
-        return llOutOptionalTlv;
-    }
-
-    /**
-     * Returns the writer index.
-     *
-     * @param cb of type channel buffer
-     * @return the writer index.
-     */
-    protected int packOptionalTlv(ChannelBuffer cb) {
-
-        ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator();
-
-        while (listIterator.hasNext()) {
-            PcepValueType tlv = listIterator.next();
-
-            if (tlv == null) {
-                log.debug("TLV is null from OptionalTlv list");
-                continue;
-            }
-            tlv.write(cb);
-
-            // need to take care of padding
-            int pad = tlv.getLength() % 4;
-
-            if (0 != pad) {
-                pad = 4 - pad;
-                for (int i = 0; i < pad; ++i) {
-                    cb.writeByte((byte) 0);
-                }
-            }
-        }
-        return cb.writerIndex();
-    }
-
-    /**
-     * Builder class for PCEP te object.
-     */
-    public static class Builder implements PcepTEObject.Builder {
-        private boolean bIsHeaderSet = false;
-        private boolean bIsProtocolIdSet = false;
-        private boolean bIsRFlagSet = false;
-        private boolean bIsSFlagSet = false;
-        private boolean bIsTEIdSet = false;
-
-        private PcepObjectHeader teObjHeader;
-        private byte yProtocolId;
-        private boolean bRFlag;
-        private boolean bSFlag;
-        private int iTEId;
-        private LinkedList<PcepValueType> llOptionalTlv = new LinkedList<>();
-
-        private boolean bIsPFlagSet = false;
-        private boolean bPFlag;
-
-        private boolean bIsIFlagSet = false;
-        private boolean bIFlag;
-
-        @Override
-        public PcepTEObject build() {
-            PcepObjectHeader teObjHeader = this.bIsHeaderSet ? this.teObjHeader : DEFAULT_TE_OBJECT_HEADER;
-
-            byte yProtocolId = this.bIsProtocolIdSet ? this.yProtocolId : DEFAULT_PROTOCOL_ID;
-            boolean bRFlag = this.bIsRFlagSet ? this.bRFlag : DEFAULT_R_FLAG;
-            boolean bSFlag = this.bIsSFlagSet ? this.bSFlag : DEFAULT_S_FLAG;
-            int iTEId = this.bIsTEIdSet ? this.iTEId : DEFAULT_TE_ID;
-
-            if (bIsPFlagSet) {
-                teObjHeader.setPFlag(bPFlag);
-            }
-
-            if (bIsIFlagSet) {
-                teObjHeader.setIFlag(bIFlag);
-            }
-
-            return new PcepTEObjectVer1(teObjHeader, yProtocolId, bRFlag, bSFlag, iTEId, llOptionalTlv);
-
-        }
-
-        @Override
-        public PcepObjectHeader getTEObjHeader() {
-            return this.teObjHeader;
-        }
-
-        @Override
-        public Builder setTEObjHeader(PcepObjectHeader obj) {
-            this.teObjHeader = obj;
-            this.bIsHeaderSet = true;
-            return this;
-        }
-
-        @Override
-        public byte getProtocolId() {
-            return this.yProtocolId;
-        }
-
-        @Override
-        public Builder setProtocolId(byte yProtId) {
-            this.yProtocolId = yProtId;
-            this.bIsProtocolIdSet = true;
-            return this;
-        }
-
-        @Override
-        public boolean getRFlag() {
-            return this.bRFlag;
-        }
-
-        @Override
-        public Builder setRFlag(boolean bRFlag) {
-            this.bRFlag = bRFlag;
-            this.bIsRFlagSet = true;
-            return this;
-        }
-
-        @Override
-        public boolean getSFlag() {
-            return this.bSFlag;
-        }
-
-        @Override
-        public Builder setSFlag(boolean bSFlag) {
-            this.bSFlag = bSFlag;
-            this.bIsSFlagSet = true;
-            return this;
-        }
-
-        @Override
-        public int getTEId() {
-            return this.iTEId;
-        }
-
-        @Override
-        public Builder setTEId(int iTEId) {
-            this.iTEId = iTEId;
-            this.bIsTEIdSet = true;
-            return this;
-        }
-
-        @Override
-        public LinkedList<PcepValueType> getOptionalTlv() {
-            return this.llOptionalTlv;
-        }
-
-        @Override
-        public Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
-            this.llOptionalTlv = llOptionalTlv;
-            return this;
-        }
-
-        @Override
-        public Builder setPFlag(boolean value) {
-            this.bPFlag = value;
-            this.bIsPFlagSet = true;
-            return this;
-        }
-
-        @Override
-        public Builder setIFlag(boolean value) {
-            this.bIFlag = value;
-            this.bIsIFlagSet = true;
-            return this;
-        }
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("ObjectHeader", teObjHeader)
-                .add("ProtocolId", yProtocolId)
-                .add("RFlag", (bRFlag) ? 1 : 0)
-                .add("SFlag", (bSFlag) ? 1 : 0)
-                .add("TeId", iTEId)
-                .add("OptionalTlv", llOptionalTlv)
-                .toString();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepTEReportMsgVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepTEReportMsgVer1.java
deleted file mode 100644
index 9283308..0000000
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepTEReportMsgVer1.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.pcepio.protocol.ver1;
-
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.pcepio.exceptions.PcepParseException;
-import org.onosproject.pcepio.protocol.PcepMessageReader;
-import org.onosproject.pcepio.protocol.PcepMessageWriter;
-import org.onosproject.pcepio.protocol.PcepTEObject;
-import org.onosproject.pcepio.protocol.PcepTEReportMsg;
-import org.onosproject.pcepio.protocol.PcepType;
-import org.onosproject.pcepio.protocol.PcepVersion;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.MoreObjects;
-
-/**
- * Provides  PCEP TE Report Message.
- */
-class PcepTEReportMsgVer1 implements PcepTEReportMsg {
-
-    /*
-     * Ref : draft-dhodylee-pce-pcep-te-data-extn-02, section 8.1
-
-        <TERpt Message>  ::=  <Common Header>
-                              <te-report-list>
-    Where:
-        <te-report-list> ::=  <TE>[<te-report-list>]
-     */
-
-    private static final Logger log = LoggerFactory.getLogger(PcepTEReportMsgVer1.class);
-    //PACKET_MINIMUM_LENGTH = CommonHeaderLen(4)+TEObjMinLen(12)
-    public static final int PACKET_MINIMUM_LENGTH = 16;
-    public static final PcepType MSG_TYPE = PcepType.TE_REPORT;
-    // <te-report-list>
-    private LinkedList<PcepTEObject> teReportList;
-
-    public static final PcepTEReportMsgVer1.Reader READER = new Reader();
-
-    /**
-     * Reader class for reading PCPE te report message form channel buffer.
-     */
-    static class Reader implements PcepMessageReader<PcepTEReportMsg> {
-
-        LinkedList<PcepTEObject> teReportList;
-
-        @Override
-        public PcepTEReportMsg readFrom(ChannelBuffer cb) throws PcepParseException {
-
-            if (cb.readableBytes() < PACKET_MINIMUM_LENGTH) {
-                return null;
-            }
-
-            teReportList = new LinkedList<>();
-
-            byte version = cb.readByte();
-            version = (byte) (version >> PcepMessageVer1.SHIFT_FLAG);
-            if (version != PcepMessageVer1.PACKET_VERSION) {
-                throw new PcepParseException("Wrong version. Expected=PcepVersion.PCEP_1(1), got=" + version);
-            }
-
-            byte type = cb.readByte();
-            if (type != MSG_TYPE.getType()) {
-                throw new PcepParseException("Wrong type. Expected=PcepType.TE_REPORT(14), got=" + type);
-            }
-
-            short length = cb.readShort();
-            if (length < PACKET_MINIMUM_LENGTH) {
-                throw new PcepParseException(
-                        "Wrong length. Expected to be >= " + PACKET_MINIMUM_LENGTH + ", is: " + length);
-            }
-
-            // Parse state report list
-            parseTEReportList(cb);
-
-            return new PcepTEReportMsgVer1(teReportList);
-        }
-
-        /**
-         * Parse te-report-list.
-         *
-         * @param cb input Channel Buffer
-         * @throws PcepParseException when fails to parse TE Report list.
-         */
-        public void parseTEReportList(ChannelBuffer cb) throws PcepParseException {
-            // <te-report-list> ::= <TE>[<te-report-list>]
-
-            while (0 < cb.readableBytes()) {
-                //store TE objectS
-                if (!teReportList.add(PcepTEObjectVer1.read(cb))) {
-                    throw new PcepParseException("Failed to add TE object to TE report list");
-                }
-            }
-        }
-    }
-
-    /**
-     * Constructor to initialize TE Report List.
-     *
-     * @param teReportList list of PCEP TE Object
-     */
-    PcepTEReportMsgVer1(LinkedList<PcepTEObject> teReportList) {
-        this.teReportList = teReportList;
-    }
-
-    /**
-     * Builder class for PCEP te report message.
-     */
-    static class Builder implements PcepTEReportMsg.Builder {
-        // PCEP TE Report message fields
-        LinkedList<PcepTEObject> teReportList;
-
-        @Override
-        public PcepVersion getVersion() {
-            return PcepVersion.PCEP_1;
-        }
-
-        @Override
-        public PcepType getType() {
-            return PcepType.TE_REPORT;
-        }
-
-        @Override
-        public PcepTEReportMsg build() {
-            return new PcepTEReportMsgVer1(this.teReportList);
-        }
-
-        @Override
-        public LinkedList<PcepTEObject> getTEReportList() {
-            return this.teReportList;
-        }
-
-        @Override
-        public Builder setTEReportList(LinkedList<PcepTEObject> ll) {
-            this.teReportList = ll;
-            return this;
-        }
-    }
-
-    @Override
-    public void writeTo(ChannelBuffer bb) throws PcepParseException {
-        WRITER.write(bb, this);
-    }
-
-    static final Writer WRITER = new Writer();
-
-    /**
-     * Writer class for writing PCEP te report message to channel buffer.
-     */
-    static class Writer implements PcepMessageWriter<PcepTEReportMsgVer1> {
-
-        @Override
-        public void write(ChannelBuffer bb, PcepTEReportMsgVer1 message) throws PcepParseException {
-
-            int startIndex = bb.writerIndex();
-
-            // first 3 bits set to version
-            bb.writeByte((byte) (PcepMessageVer1.PACKET_VERSION << PcepMessageVer1.SHIFT_FLAG));
-
-            // message type
-            bb.writeByte(MSG_TYPE.getType());
-
-            // Length of the message will be updated at the end
-            // First write with 0s
-            int msgLenIndex = bb.writerIndex();
-            bb.writeShort((short) 0);
-
-            ListIterator<PcepTEObject> listIterator = message.teReportList.listIterator();
-
-            while (listIterator.hasNext()) {
-                PcepTEObject teObj = listIterator.next();
-                teObj.write(bb);
-            }
-
-            // update message length field
-            int length = bb.writerIndex() - startIndex;
-            bb.setShort(msgLenIndex, (short) length);
-        }
-    }
-
-    @Override
-    public PcepVersion getVersion() {
-        return PcepVersion.PCEP_1;
-    }
-
-    @Override
-    public PcepType getType() {
-        return MSG_TYPE;
-    }
-
-    @Override
-    public LinkedList<PcepTEObject> getTEReportList() {
-        return this.teReportList;
-    }
-
-    @Override
-    public void setTEReportList(LinkedList<PcepTEObject> ll) {
-        this.teReportList = ll;
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("TeReportList", teReportList)
-                .toString();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AdministrativeGroupTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AdministrativeGroupSubTlv.java
similarity index 85%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AdministrativeGroupTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AdministrativeGroupSubTlv.java
index 62ed4e7..0c231b7 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AdministrativeGroupTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AdministrativeGroupSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides Administrative Group Tlv which contains value (32 Bit ).
  */
-public class AdministrativeGroupTlv implements PcepValueType {
+public class AdministrativeGroupSubTlv implements PcepValueType {
 
     /* REFERENCE :[RFC5305]/3.1
      *  0                   1                   2                   3
@@ -39,9 +39,9 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(AdministrativeGroupTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(AdministrativeGroupSubTlv.class);
 
-    public static final short TYPE = 3; //TDB33
+    public static final short TYPE = 22;
     public static final short LENGTH = 4;
 
     private final int rawValue;
@@ -51,7 +51,7 @@
      *
      * @param rawValue of Administrative-Group-Tlv.
      */
-    public AdministrativeGroupTlv(int rawValue) {
+    public AdministrativeGroupSubTlv(int rawValue) {
         this.rawValue = rawValue;
     }
 
@@ -61,8 +61,8 @@
      * @param raw value.
      * @return object of Administrative-Group-Tlv
      */
-    public static AdministrativeGroupTlv of(final int raw) {
-        return new AdministrativeGroupTlv(raw);
+    public static AdministrativeGroupSubTlv of(final int raw) {
+        return new AdministrativeGroupSubTlv(raw);
     }
 
     /**
@@ -99,8 +99,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof AdministrativeGroupTlv) {
-            AdministrativeGroupTlv other = (AdministrativeGroupTlv) obj;
+        if (obj instanceof AdministrativeGroupSubTlv) {
+            AdministrativeGroupSubTlv other = (AdministrativeGroupSubTlv) obj;
             return Objects.equals(rawValue, other.rawValue);
         }
         return false;
@@ -121,8 +121,8 @@
      * @param c input channel buffer
      * @return object of Administrative-Group-Tlv
      */
-    public static AdministrativeGroupTlv read(ChannelBuffer c) {
-        return AdministrativeGroupTlv.of(c.readInt());
+    public static AdministrativeGroupSubTlv read(ChannelBuffer c) {
+        return AdministrativeGroupSubTlv.of(c.readInt());
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AutonomousSystemNumberSubObject.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AutonomousSystemNumberSubObject.java
new file mode 100644
index 0000000..bf56d5e
--- /dev/null
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AutonomousSystemNumberSubObject.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @author b00295750
+ *
+ */
+package org.onosproject.pcepio.types;
+
+import java.util.Objects;
+
+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;
+
+/**
+ * Provides Autonomous system number sub object.
+ */
+public class AutonomousSystemNumberSubObject implements PcepValueType {
+
+    /*Reference : RFC 3209 : 4.3.3.4
+     *  0                   1                   2                   3
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    |L|    Type     |     Length    |      AS number (2-octet)      |
+    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     */
+    protected static final Logger log = LoggerFactory.getLogger(AutonomousSystemNumberSubObject.class);
+
+    public static final byte TYPE = (byte) 0x32;
+    public static final byte LENGTH = 4;
+    public static final byte VALUE_LENGTH = 2;
+    public static final byte OBJ_LENGTH = 4;
+    public static final byte LBIT = 0;
+    public static final int SHIFT_LBIT_POSITION = 7;
+    private short asNumber;
+
+    /**
+     * Constructor to initialize AS number.
+     *
+     * @param asNumber AS number
+     */
+    public AutonomousSystemNumberSubObject(short asNumber) {
+        this.asNumber = asNumber;
+    }
+
+    /**
+     * Returns a new instance of AutonomousSystemNumberSubObject.
+     *
+     * @param asNumber AS number
+     * @return object of AutonomousSystemNumberSubObject
+     */
+    public static AutonomousSystemNumberSubObject of(short asNumber) {
+        return new AutonomousSystemNumberSubObject(asNumber);
+    }
+
+    /**
+     * Returns value of AS number.
+     *
+     * @return value of AS number
+     */
+    public short getAsNumber() {
+        return asNumber;
+    }
+
+    @Override
+    public PcepVersion getVersion() {
+        return PcepVersion.PCEP_1;
+    }
+
+    @Override
+    public short getType() {
+        return TYPE;
+    }
+
+    @Override
+    public short getLength() {
+        return LENGTH;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(asNumber);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof AutonomousSystemNumberSubObject) {
+            AutonomousSystemNumberSubObject other = (AutonomousSystemNumberSubObject) obj;
+            return Objects.equals(this.asNumber, other.asNumber);
+        }
+        return false;
+    }
+
+    /**
+     * Reads the channel buffer and returns object of AutonomousSystemNumberSubObject.
+     *
+     * @param c type of channel buffer
+     * @return object of AutonomousSystemNumberSubObject
+     */
+    public static PcepValueType read(ChannelBuffer c) {
+        short asNumber = c.readShort();
+        return new AutonomousSystemNumberSubObject(asNumber);
+    }
+
+    @Override
+    public int write(ChannelBuffer c) {
+        int iLenStartIndex = c.writerIndex();
+        byte bValue = LBIT;
+        bValue = (byte) (bValue << SHIFT_LBIT_POSITION);
+        bValue = (byte) (bValue | TYPE);
+        c.writeByte(bValue);
+        c.writeByte(OBJ_LENGTH);
+        c.writeShort(asNumber);
+
+        return c.writerIndex() - iLenStartIndex;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("Type", TYPE)
+                .add("Length", LENGTH)
+                .add("AsNumber", asNumber)
+                .toString();
+    }
+}
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AutonomousSystemTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AutonomousSystemSubTlv.java
similarity index 85%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AutonomousSystemTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AutonomousSystemSubTlv.java
index 3f21319..631cff7 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AutonomousSystemTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/AutonomousSystemSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides Autonomous-System-Tlv which contains opaque value (32 Bit AS Number).
  */
-public class AutonomousSystemTlv implements PcepValueType {
+public class AutonomousSystemSubTlv implements PcepValueType {
 
     /* Reference :RFC3209
      *  0                   1                   2                   3
@@ -39,9 +39,9 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(AutonomousSystemTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(AutonomousSystemSubTlv.class);
 
-    public static final short TYPE = 100; //TODD:change this TBD10
+    public static final short TYPE = 1;
     public static final short LENGTH = 4;
 
     private final int rawValue;
@@ -51,7 +51,7 @@
      *
      * @param rawValue Autonomous-System-Tlv
      */
-    public AutonomousSystemTlv(int rawValue) {
+    public AutonomousSystemSubTlv(int rawValue) {
         this.rawValue = rawValue;
     }
 
@@ -61,8 +61,8 @@
      * @param raw value of opaque.
      * @return object of Autonomous-System-Tlv
      */
-    public static AutonomousSystemTlv of(final int raw) {
-        return new AutonomousSystemTlv(raw);
+    public static AutonomousSystemSubTlv of(final int raw) {
+        return new AutonomousSystemSubTlv(raw);
     }
 
     /**
@@ -99,8 +99,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof AutonomousSystemTlv) {
-            AutonomousSystemTlv other = (AutonomousSystemTlv) obj;
+        if (obj instanceof AutonomousSystemSubTlv) {
+            AutonomousSystemSubTlv other = (AutonomousSystemSubTlv) obj;
             return Objects.equals(rawValue, other.rawValue);
         }
         return false;
@@ -121,8 +121,8 @@
      * @param c input channel buffer
      * @return object of Autonomous-System-Tlv
      */
-    public static AutonomousSystemTlv read(ChannelBuffer c) {
-        return AutonomousSystemTlv.of(c.readInt());
+    public static AutonomousSystemSubTlv read(ChannelBuffer c) {
+        return AutonomousSystemSubTlv.of(c.readInt());
     }
 
     @Override
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/BgpLsIdentifierSubTlv.java
similarity index 86%
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/BgpLsIdentifierSubTlv.java
index 9fd80c4..08885f4 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/BgpLsIdentifierSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides BGP LS identifier which contains opaque value (32 Bit ID).
  */
-public class BgpLsIdentifierTlv implements PcepValueType {
+public class BgpLsIdentifierSubTlv implements PcepValueType {
 
     /* Reference :draft-ietf-idr-ls-distribution-10
      *  0                   1                   2                   3
@@ -39,9 +39,9 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(BgpLsIdentifierTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(BgpLsIdentifierSubTlv.class);
 
-    public static final short TYPE = 17; //TODD:change this TBD11
+    public static final short TYPE = 2;
     public static final short LENGTH = 4;
 
     private final int rawValue;
@@ -51,7 +51,7 @@
      *
      * @param rawValue BGP LS identifier Tlv
      */
-    public BgpLsIdentifierTlv(int rawValue) {
+    public BgpLsIdentifierSubTlv(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 BgpLsIdentifierSubTlv of(final int raw) {
+        return new BgpLsIdentifierSubTlv(raw);
     }
 
     /**
@@ -99,8 +99,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof BgpLsIdentifierTlv) {
-            BgpLsIdentifierTlv other = (BgpLsIdentifierTlv) obj;
+        if (obj instanceof BgpLsIdentifierSubTlv) {
+            BgpLsIdentifierSubTlv other = (BgpLsIdentifierSubTlv) 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 BgpLsIdentifierSubTlv read(ChannelBuffer c) {
+        return BgpLsIdentifierSubTlv.of(c.readInt());
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/ErrorObjListWithOpen.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/ErrorObjListWithOpen.java
index 40f89f4..98ad41e 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/ErrorObjListWithOpen.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/ErrorObjListWithOpen.java
@@ -16,6 +16,7 @@
 package org.onosproject.pcepio.types;
 
 import java.util.LinkedList;
+import java.util.List;
 import java.util.ListIterator;
 
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -32,7 +33,7 @@
  */
 public class ErrorObjListWithOpen {
     //errorObjList is mandatory
-    private LinkedList<PcepErrorObject> llerrorObjList;
+    private List<PcepErrorObject> llerrorObjList;
     // openObject is optional
     private PcepOpenObject openObject;
     // flag to check if open object is set or not
@@ -45,7 +46,7 @@
      * @param errObj ERROR object list
      * @param openObj OPEN object
      */
-    public ErrorObjListWithOpen(LinkedList<PcepErrorObject> errObj, PcepOpenObject openObj) {
+    public ErrorObjListWithOpen(List<PcepErrorObject> errObj, PcepOpenObject openObj) {
         this.llerrorObjList = errObj;
         this.openObject = openObj;
         if (openObj != null) {
@@ -60,7 +61,7 @@
      *
      * @param errObj ERROR Object list
      */
-    public ErrorObjListWithOpen(LinkedList<PcepErrorObject> errObj) {
+    public ErrorObjListWithOpen(List<PcepErrorObject> errObj) {
         this.llerrorObjList = errObj;
         this.openObject = null;
         isOpenObjectSet = false;
@@ -71,8 +72,8 @@
      *
      * @return error types list
      */
-    public LinkedList<Integer> getErrorType() {
-        LinkedList<Integer> errorType = new LinkedList<>();
+    public List<Integer> getErrorType() {
+        List<Integer> errorType = new LinkedList<>();
         if (llerrorObjList != null) {
             ListIterator<PcepErrorObject> errObjListIterator = llerrorObjList.listIterator();
             int error;
@@ -91,8 +92,8 @@
      *
      * @return error values list
      */
-    public LinkedList<Integer> getErrorValue() {
-        LinkedList<Integer> errorValue = new LinkedList<>();
+    public List<Integer> getErrorValue() {
+        List<Integer> errorValue = new LinkedList<>();
         if (llerrorObjList != null) {
             ListIterator<PcepErrorObject> errObjListIterator = llerrorObjList.listIterator();
             int error;
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4InterfaceAddressSubTlv.java
similarity index 85%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4InterfaceAddressSubTlv.java
index d1a3015..72a1878 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4InterfaceAddressSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides IPv4 Interface Address .
  */
-public class IPv4InterfaceAddressTlv implements PcepValueType {
+public class IPv4InterfaceAddressSubTlv implements PcepValueType {
 
     /*
      * reference :[RFC5305]/3.2
@@ -40,9 +40,9 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(IPv4InterfaceAddressTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(IPv4InterfaceAddressSubTlv.class);
 
-    public static final short TYPE = 6;
+    public static final short TYPE = 7;
     public static final short LENGTH = 4;
 
     private final int rawValue;
@@ -52,7 +52,7 @@
      *
      * @param rawValue of IPv4-Interface-Address.
      */
-    public IPv4InterfaceAddressTlv(int rawValue) {
+    public IPv4InterfaceAddressSubTlv(int rawValue) {
         this.rawValue = rawValue;
     }
 
@@ -62,8 +62,8 @@
      * @param raw value of IPv4-Interface-Address
      * @return object of IPv4-Interface-Address-Tlv
      */
-    public static IPv4InterfaceAddressTlv of(final int raw) {
-        return new IPv4InterfaceAddressTlv(raw);
+    public static IPv4InterfaceAddressSubTlv of(final int raw) {
+        return new IPv4InterfaceAddressSubTlv(raw);
     }
 
     /**
@@ -100,8 +100,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof IPv4InterfaceAddressTlv) {
-            IPv4InterfaceAddressTlv other = (IPv4InterfaceAddressTlv) obj;
+        if (obj instanceof IPv4InterfaceAddressSubTlv) {
+            IPv4InterfaceAddressSubTlv other = (IPv4InterfaceAddressSubTlv) obj;
             return Objects.equals(rawValue, other.rawValue);
         }
         return false;
@@ -122,8 +122,8 @@
      * @param c input channel buffer
      * @return object of IPv4-Interface-Address-Tlv
      */
-    public static IPv4InterfaceAddressTlv read(ChannelBuffer c) {
-        return IPv4InterfaceAddressTlv.of(c.readInt());
+    public static IPv4InterfaceAddressSubTlv read(ChannelBuffer c) {
+        return IPv4InterfaceAddressSubTlv.of(c.readInt());
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4NeighborAddressSubTlv.java
similarity index 86%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4NeighborAddressSubTlv.java
index 0f98777..c9b070c 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4NeighborAddressSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides IPv4 Neighbor Address .
  */
-public class IPv4NeighborAddressTlv implements PcepValueType {
+public class IPv4NeighborAddressSubTlv implements PcepValueType {
 
     /* Reference :[RFC5305]/3.3
       0                   1                   2                   3
@@ -39,7 +39,7 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(IPv4NeighborAddressTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(IPv4NeighborAddressSubTlv.class);
 
     public static final short TYPE = 8;
     public static final short LENGTH = 4;
@@ -51,7 +51,7 @@
      *
      * @param rawValue IPv4-Neighbor-Address-Tlv
      */
-    public IPv4NeighborAddressTlv(int rawValue) {
+    public IPv4NeighborAddressSubTlv(int rawValue) {
         log.debug("IPv4NeighborAddressTlv");
         this.rawValue = rawValue;
     }
@@ -62,8 +62,8 @@
      * @param raw value of IPv4-Neighbor-Address
      * @return object of IPv4NeighborAddressTlv
      */
-    public static IPv4NeighborAddressTlv of(final int raw) {
-        return new IPv4NeighborAddressTlv(raw);
+    public static IPv4NeighborAddressSubTlv of(final int raw) {
+        return new IPv4NeighborAddressSubTlv(raw);
     }
 
     /**
@@ -100,8 +100,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof IPv4NeighborAddressTlv) {
-            IPv4NeighborAddressTlv other = (IPv4NeighborAddressTlv) obj;
+        if (obj instanceof IPv4NeighborAddressSubTlv) {
+            IPv4NeighborAddressSubTlv other = (IPv4NeighborAddressSubTlv) obj;
             return Objects.equals(rawValue, other.rawValue);
         }
         return false;
@@ -122,8 +122,8 @@
      * @param c input channel buffer
      * @return object of IPv4-Neighbor-Address-Tlv
      */
-    public static IPv4NeighborAddressTlv read(ChannelBuffer c) {
-        return IPv4NeighborAddressTlv.of(c.readInt());
+    public static IPv4NeighborAddressSubTlv read(ChannelBuffer c) {
+        return IPv4NeighborAddressSubTlv.of(c.readInt());
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4TERouterIdOfLocalNodeTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4RouterIdOfLocalNodeSubTlv.java
similarity index 69%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4TERouterIdOfLocalNodeTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4RouterIdOfLocalNodeSubTlv.java
index 2abf4cd..0e8c90f 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4TERouterIdOfLocalNodeTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4RouterIdOfLocalNodeSubTlv.java
@@ -25,9 +25,9 @@
 import com.google.common.base.MoreObjects;
 
 /**
- * Provides IPv4 TE Router Id Of Local Node.
+ * Provides IPv4 Router Id Of Local Node.
  */
-public class IPv4TERouterIdOfLocalNodeTlv implements PcepValueType {
+public class IPv4RouterIdOfLocalNodeSubTlv implements PcepValueType {
 
     /* Reference:[RFC5305]/4.3
      * 0                   1                   2                   3
@@ -35,13 +35,13 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |              Type=[TDB25]      |             Length=4         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-     |               IPv4 TE Router Id Of Local Node                |
+     |               IPv4 Router Id Of Local Node                |
      +-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-++-+-+-+-
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(IPv4TERouterIdOfLocalNodeTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(IPv4RouterIdOfLocalNodeSubTlv.class);
 
-    public static final short TYPE = 134; //TDB25
+    public static final short TYPE = 17;
     public static final short LENGTH = 4;
 
     private final int rawValue;
@@ -49,26 +49,26 @@
     /**
      * Constructor to initialize rawValue.
      *
-     * @param rawValue IPv4-TE-RouterId-Of-Local-Node-Tlv
+     * @param rawValue IPv4-RouterId-Of-Local-Node-Tlv
      */
-    public IPv4TERouterIdOfLocalNodeTlv(int rawValue) {
+    public IPv4RouterIdOfLocalNodeSubTlv(int rawValue) {
         this.rawValue = rawValue;
     }
 
     /**
-     * Returns newly created IPv4TERouterIdOfLocalNodeTlv object.
+     * Returns newly created IPv4RouterIdOfLocalNodeTlv object.
      *
-     * @param raw value of IPv4-TE-RouterId-Of-Local-Node
-     * @return object of IPv4TERouterIdOfLocalNodeTlv
+     * @param raw value of IPv4-RouterId-Of-Local-Node
+     * @return object of IPv4RouterIdOfLocalNodeTlv
      */
-    public static IPv4TERouterIdOfLocalNodeTlv of(final int raw) {
-        return new IPv4TERouterIdOfLocalNodeTlv(raw);
+    public static IPv4RouterIdOfLocalNodeSubTlv of(final int raw) {
+        return new IPv4RouterIdOfLocalNodeSubTlv(raw);
     }
 
     /**
-     * Returns value of IPv4 TE Router Id Of Local Node.
+     * Returns value of IPv4 Router Id Of Local Node.
      *
-     * @return rawValue IPv4 TE Router Id Of Local Node
+     * @return rawValue IPv4 Router Id Of Local Node
      */
     public int getInt() {
         return rawValue;
@@ -99,8 +99,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof IPv4TERouterIdOfLocalNodeTlv) {
-            IPv4TERouterIdOfLocalNodeTlv other = (IPv4TERouterIdOfLocalNodeTlv) obj;
+        if (obj instanceof IPv4RouterIdOfLocalNodeSubTlv) {
+            IPv4RouterIdOfLocalNodeSubTlv other = (IPv4RouterIdOfLocalNodeSubTlv) obj;
             return Objects.equals(rawValue, other.rawValue);
         }
         return false;
@@ -116,13 +116,13 @@
     }
 
     /**
-     * Reads the channel buffer and returns object of IPv4TERouterIdOfLocalNodeTlv.
+     * Reads the channel buffer and returns object of IPv4RouterIdOfLocalNodeTlv.
      *
      * @param c input channel buffer
-     * @return object of IPv4TERouterIdOfLocalNodeTlv
+     * @return object of IPv4RouterIdOfLocalNodeTlv
      */
-    public static IPv4TERouterIdOfLocalNodeTlv read(ChannelBuffer c) {
-        return IPv4TERouterIdOfLocalNodeTlv.of(c.readInt());
+    public static IPv4RouterIdOfLocalNodeSubTlv read(ChannelBuffer c) {
+        return IPv4RouterIdOfLocalNodeSubTlv.of(c.readInt());
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4RouterIdOfRemoteNodeSubTlv.java
similarity index 68%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4RouterIdOfRemoteNodeSubTlv.java
index 21e0989..2a11feb 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv4RouterIdOfRemoteNodeSubTlv.java
@@ -25,9 +25,9 @@
 import com.google.common.base.MoreObjects;
 
 /**
- * Provides IPv4 TE Router Id Of Remote Node.
+ * Provides IPv4 Router Id Of Remote Node.
  */
-public class IPv4TERouterIdOfRemoteNodeTlv implements PcepValueType {
+public class IPv4RouterIdOfRemoteNodeSubTlv implements PcepValueType {
 
     /* Reference :[RFC5305]/4.3
      * 0                   1                   2                   3
@@ -35,13 +35,13 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |              Type=[TDB28]      |             Length=4         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-     |               IPv4 TE Router Id Of Remote Node                |
+     |               IPv4 Router Id Of Remote Node                |
      +-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-++-+-+-+-
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(IPv4TERouterIdOfRemoteNodeTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(IPv4RouterIdOfRemoteNodeSubTlv.class);
 
-    public static final short TYPE = 1340; //TDB28
+    public static final short TYPE = 19;
     public static final short LENGTH = 4;
 
     private final int rawValue;
@@ -49,27 +49,27 @@
     /**
      * Constructor to initialize rawValue.
      *
-     * @param rawValue IPv4 TE RouterId Of Remote Node Tlv
+     * @param rawValue IPv4 RouterId Of Remote Node Tlv
      */
-    public IPv4TERouterIdOfRemoteNodeTlv(int rawValue) {
-        log.debug("IPv4TERouterIdOfRemoteNodeTlv");
+    public IPv4RouterIdOfRemoteNodeSubTlv(int rawValue) {
+        log.debug("IPv4RouterIdOfRemoteNodeTlv");
         this.rawValue = rawValue;
     }
 
     /**
-     * Returns newly created IPv4TERouterIdOfRemoteNodeTlv object.
+     * Returns newly created IPv4RouterIdOfRemoteNodeTlv object.
      *
-     * @param raw IPv4 TE RouterId Of Remote Node
-     * @return object of IPv4TERouterIdOfRemoteNodeTlv
+     * @param raw IPv4 RouterId Of Remote Node
+     * @return object of IPv4RouterIdOfRemoteNodeTlv
      */
-    public static IPv4TERouterIdOfRemoteNodeTlv of(final int raw) {
-        return new IPv4TERouterIdOfRemoteNodeTlv(raw);
+    public static IPv4RouterIdOfRemoteNodeSubTlv of(final int raw) {
+        return new IPv4RouterIdOfRemoteNodeSubTlv(raw);
     }
 
     /**
-     * Returns value of IPv4 TE Router Id Of Remote Node.
+     * Returns value of IPv4 Router Id Of Remote Node.
      *
-     * @return rawValue IPv4 TE Router Id Of Remote Node
+     * @return rawValue IPv4 Router Id Of Remote Node
      */
     public int getInt() {
         return rawValue;
@@ -100,8 +100,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof IPv4TERouterIdOfRemoteNodeTlv) {
-            IPv4TERouterIdOfRemoteNodeTlv other = (IPv4TERouterIdOfRemoteNodeTlv) obj;
+        if (obj instanceof IPv4RouterIdOfRemoteNodeSubTlv) {
+            IPv4RouterIdOfRemoteNodeSubTlv other = (IPv4RouterIdOfRemoteNodeSubTlv) obj;
             return Objects.equals(rawValue, other.rawValue);
         }
         return false;
@@ -117,13 +117,13 @@
     }
 
     /**
-     * Reads the channel buffer and returns object of IPv4TERouterIdOfRemoteNodeTlv.
+     * Reads the channel buffer and returns object of IPv4RouterIdOfRemoteNodeTlv.
      *
      * @param c input channel buffer
-     * @return object of IPv4TERouterIdOfRemoteNodeTlv
+     * @return object of IPv4RouterIdOfRemoteNodeTlv
      */
-    public static IPv4TERouterIdOfRemoteNodeTlv read(ChannelBuffer c) {
-        return IPv4TERouterIdOfRemoteNodeTlv.of(c.readInt());
+    public static IPv4RouterIdOfRemoteNodeSubTlv read(ChannelBuffer c) {
+        return IPv4RouterIdOfRemoteNodeSubTlv.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/IPv6InterfaceAddressSubTlv.java
similarity index 83%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6InterfaceAddressTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6InterfaceAddressSubTlv.java
index 386de1d..fe09d8b 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/IPv6InterfaceAddressSubTlv.java
@@ -27,22 +27,22 @@
 /**
  * Provides IPv6 Interface Address. REFERENCE :[RFC6119]/4.2.
  */
-public class IPv6InterfaceAddressTlv implements PcepValueType {
+public class IPv6InterfaceAddressSubTlv implements PcepValueType {
 
-    protected static final Logger log = LoggerFactory.getLogger(IPv6InterfaceAddressTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(IPv6InterfaceAddressSubTlv.class);
 
-    public static final short TYPE = 12; //TDB18
+    public static final short TYPE = 9;
     public static final short LENGTH = 20;
     public static final byte VALUE_LENGTH = 18;
 
     private static final byte[] NONE_VAL = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    public static final IPv6InterfaceAddressTlv NONE = new IPv6InterfaceAddressTlv(NONE_VAL);
+    public static final IPv6InterfaceAddressSubTlv NONE = new IPv6InterfaceAddressSubTlv(NONE_VAL);
 
     private static final byte[] NO_MASK_VAL = {(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
             (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
             (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF};
-    public static final IPv6InterfaceAddressTlv NO_MASK = new IPv6InterfaceAddressTlv(NO_MASK_VAL);
-    public static final IPv6InterfaceAddressTlv FULL_MASK = NONE;
+    public static final IPv6InterfaceAddressSubTlv NO_MASK = new IPv6InterfaceAddressSubTlv(NO_MASK_VAL);
+    public static final IPv6InterfaceAddressSubTlv FULL_MASK = NONE;
 
     private final byte[] rawValue;
 
@@ -51,7 +51,7 @@
      *
      * @param rawValue IPv6 Interface Address Tlv
      */
-    public IPv6InterfaceAddressTlv(byte[] rawValue) {
+    public IPv6InterfaceAddressSubTlv(byte[] rawValue) {
         log.debug("IPv6InterfaceAddressTlv");
         this.rawValue = rawValue;
     }
@@ -62,7 +62,7 @@
      * @param raw IPv6 Interface Address
      * @return object of IPv6InterfaceAddressTlv
      */
-    public static IPv6InterfaceAddressTlv of(final byte[] raw) {
+    public static IPv6InterfaceAddressSubTlv of(final byte[] raw) {
         //check NONE_VAL
         boolean bFoundNone = true;
         //value starts from 3rd byte.
@@ -88,7 +88,7 @@
             return NO_MASK;
         }
 
-        return new IPv6InterfaceAddressTlv(raw);
+        return new IPv6InterfaceAddressSubTlv(raw);
     }
 
     /**
@@ -134,8 +134,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof IPv6InterfaceAddressTlv) {
-            IPv6InterfaceAddressTlv other = (IPv6InterfaceAddressTlv) obj;
+        if (obj instanceof IPv6InterfaceAddressSubTlv) {
+            IPv6InterfaceAddressSubTlv other = (IPv6InterfaceAddressSubTlv) obj;
             return Arrays.equals(rawValue, other.rawValue);
         }
         return false;
@@ -156,10 +156,10 @@
      * @param c input channel buffer
      * @return object of IPv6InterfaceAddressTlv
      */
-    public static IPv6InterfaceAddressTlv read20Bytes(ChannelBuffer c) {
+    public static IPv6InterfaceAddressSubTlv read20Bytes(ChannelBuffer c) {
         byte[] yTemp = new byte[20];
         c.readBytes(yTemp, 0, 20);
-        return IPv6InterfaceAddressTlv.of(yTemp);
+        return IPv6InterfaceAddressSubTlv.of(yTemp);
     }
 
     @Override
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/IPv6NeighborAddressSubTlv.java
similarity index 83%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6NeighborAddressTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6NeighborAddressSubTlv.java
index 3684af9..206cb31 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/IPv6NeighborAddressSubTlv.java
@@ -27,21 +27,21 @@
 /**
  * Provides IPv6 Neighbor Address. Reference :[RFC6119]/4.3.
  */
-public class IPv6NeighborAddressTlv implements PcepValueType {
-    protected static final Logger log = LoggerFactory.getLogger(IPv6NeighborAddressTlv.class);
+public class IPv6NeighborAddressSubTlv implements PcepValueType {
+    protected static final Logger log = LoggerFactory.getLogger(IPv6NeighborAddressSubTlv.class);
 
-    public static final short TYPE = 13; // TDB19
+    public static final short TYPE = 10;
     public static final short LENGTH = 20;
     public static final byte VALUE_LENGTH = 18;
 
     private static final byte[] NONE_VAL = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    public static final IPv6NeighborAddressTlv NONE = new IPv6NeighborAddressTlv(NONE_VAL);
+    public static final IPv6NeighborAddressSubTlv NONE = new IPv6NeighborAddressSubTlv(NONE_VAL);
 
     private static final byte[] NO_MASK_VAL = {(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
             (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
             (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF};
-    public static final IPv6NeighborAddressTlv NO_MASK = new IPv6NeighborAddressTlv(NO_MASK_VAL);
-    public static final IPv6NeighborAddressTlv FULL_MASK = NONE;
+    public static final IPv6NeighborAddressSubTlv NO_MASK = new IPv6NeighborAddressSubTlv(NO_MASK_VAL);
+    public static final IPv6NeighborAddressSubTlv FULL_MASK = NONE;
 
     private final byte[] rawValue;
 
@@ -50,7 +50,7 @@
      *
      * @param rawValue IPv6 Neighbor Address Tlv
      */
-    public IPv6NeighborAddressTlv(byte[] rawValue) {
+    public IPv6NeighborAddressSubTlv(byte[] rawValue) {
         this.rawValue = rawValue;
     }
 
@@ -60,7 +60,7 @@
      * @param raw IPv6 Neighbor Address
      * @return object of IPv6 Neighbor Address Tlv
      */
-    public static IPv6NeighborAddressTlv of(final byte[] raw) {
+    public static IPv6NeighborAddressSubTlv of(final byte[] raw) {
         //check NONE_VAL
         boolean bFoundNone = true;
         //value starts from 3rd byte.
@@ -86,7 +86,7 @@
             return NO_MASK;
         }
 
-        return new IPv6NeighborAddressTlv(raw);
+        return new IPv6NeighborAddressSubTlv(raw);
     }
 
     /**
@@ -132,8 +132,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof IPv6NeighborAddressTlv) {
-            IPv6NeighborAddressTlv other = (IPv6NeighborAddressTlv) obj;
+        if (obj instanceof IPv6NeighborAddressSubTlv) {
+            IPv6NeighborAddressSubTlv other = (IPv6NeighborAddressSubTlv) obj;
             return Arrays.equals(rawValue, other.rawValue);
         }
         return false;
@@ -154,10 +154,10 @@
      * @param c input channel buffer
      * @return object of IPv6NeighborAddressTlv
      */
-    public static IPv6NeighborAddressTlv read20Bytes(ChannelBuffer c) {
+    public static IPv6NeighborAddressSubTlv read20Bytes(ChannelBuffer c) {
         byte[] yTemp = new byte[20];
         c.readBytes(yTemp, 0, 20);
-        return IPv6NeighborAddressTlv.of(yTemp);
+        return IPv6NeighborAddressSubTlv.of(yTemp);
     }
 
     @Override
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/IPv6RouterIdofLocalNodeSubTlv.java
similarity index 77%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6TERouterIdofLocalNodeTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6RouterIdofLocalNodeSubTlv.java
index 7330fa0..40616e4 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/IPv6RouterIdofLocalNodeSubTlv.java
@@ -27,40 +27,40 @@
 /**
  * Provides IPv6 TE Router Id of Local Node. Reference :[RFC6119]/4.1.
  */
-public class IPv6TERouterIdofLocalNodeTlv implements PcepValueType {
-    protected static final Logger log = LoggerFactory.getLogger(IPv6TERouterIdofLocalNodeTlv.class);
+public class IPv6RouterIdofLocalNodeSubTlv implements PcepValueType {
+    protected static final Logger log = LoggerFactory.getLogger(IPv6RouterIdofLocalNodeSubTlv.class);
 
-    public static final short TYPE = 140; //TDB26
+    public static final short TYPE = 18;
     public static final short LENGTH = 20;
     public static final byte VALUE_LENGTH = 18;
 
     private static final byte[] NONE_VAL = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-    public static final IPv6TERouterIdofLocalNodeTlv NONE = new IPv6TERouterIdofLocalNodeTlv(NONE_VAL);
+    public static final IPv6RouterIdofLocalNodeSubTlv NONE = new IPv6RouterIdofLocalNodeSubTlv(NONE_VAL);
 
     private static final byte[] NO_MASK_VAL = {(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
             (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
             (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF };
-    public static final IPv6TERouterIdofLocalNodeTlv NO_MASK = new IPv6TERouterIdofLocalNodeTlv(NO_MASK_VAL);
-    public static final IPv6TERouterIdofLocalNodeTlv FULL_MASK = NONE;
+    public static final IPv6RouterIdofLocalNodeSubTlv NO_MASK = new IPv6RouterIdofLocalNodeSubTlv(NO_MASK_VAL);
+    public static final IPv6RouterIdofLocalNodeSubTlv FULL_MASK = NONE;
 
     private final byte[] rawValue;
 
     /**
      * Constructor to initialize rawValue.
      *
-     * @param rawValue IPv6TERouterIdofLocalNodeTlv
+     * @param rawValue IPv6RouterIdofLocalNodeTlv
      */
-    public IPv6TERouterIdofLocalNodeTlv(byte[] rawValue) {
+    public IPv6RouterIdofLocalNodeSubTlv(byte[] rawValue) {
         this.rawValue = rawValue;
     }
 
     /**
-     * Returns newly created IPv6TERouterIdofLocalNodeTlv object.
+     * Returns newly created IPv6RouterIdofLocalNodeTlv object.
      *
      * @param raw IPv6 TE Router Id of Local Node
-     * @return object of IPv6TERouterIdofLocalNodeTlv
+     * @return object of IPv6RouterIdofLocalNodeTlv
      */
-    public static IPv6TERouterIdofLocalNodeTlv of(final byte[] raw) {
+    public static IPv6RouterIdofLocalNodeSubTlv of(final byte[] raw) {
         //check NONE_VAL
         boolean bFoundNone = true;
         //value starts from 3rd byte.
@@ -86,7 +86,7 @@
             return NO_MASK;
         }
 
-        return new IPv6TERouterIdofLocalNodeTlv(raw);
+        return new IPv6RouterIdofLocalNodeSubTlv(raw);
     }
 
     /**
@@ -132,8 +132,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof IPv6TERouterIdofLocalNodeTlv) {
-            IPv6TERouterIdofLocalNodeTlv other = (IPv6TERouterIdofLocalNodeTlv) obj;
+        if (obj instanceof IPv6RouterIdofLocalNodeSubTlv) {
+            IPv6RouterIdofLocalNodeSubTlv other = (IPv6RouterIdofLocalNodeSubTlv) obj;
             return Arrays.equals(rawValue, other.rawValue);
         }
         return false;
@@ -149,15 +149,15 @@
     }
 
     /**
-     * Reads the channel buffer and returns object of IPv6TERouterIdofLocalNodeTlv.
+     * Reads the channel buffer and returns object of IPv6RouterIdofLocalNodeTlv.
      *
      * @param c input channel buffer
-     * @return object of IPv6TERouterIdofLocalNodeTlv
+     * @return object of IPv6RouterIdofLocalNodeTlv
      */
-    public static IPv6TERouterIdofLocalNodeTlv read20Bytes(ChannelBuffer c) {
+    public static IPv6RouterIdofLocalNodeSubTlv read20Bytes(ChannelBuffer c) {
         byte[] yTemp = new byte[20];
         c.readBytes(yTemp, 0, 20);
-        return IPv6TERouterIdofLocalNodeTlv.of(yTemp);
+        return IPv6RouterIdofLocalNodeSubTlv.of(yTemp);
     }
 
     @Override
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/IPv6RouterIdofRemoteNodeSubTlv.java
similarity index 75%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IPv6RouterIdofRemoteNodeSubTlv.java
index dd24788..3880824 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/IPv6RouterIdofRemoteNodeSubTlv.java
@@ -27,41 +27,41 @@
 /**
  * Provides IPv6 TE Router Id of Remote Node.  Reference :[RFC6119]/4.1.
  */
-public class IPv6TERouterIdofRemoteNodeTlv implements PcepValueType {
-    protected static final Logger log = LoggerFactory.getLogger(IPv6TERouterIdofRemoteNodeTlv.class);
+public class IPv6RouterIdofRemoteNodeSubTlv implements PcepValueType {
+    protected static final Logger log = LoggerFactory.getLogger(IPv6RouterIdofRemoteNodeSubTlv.class);
 
-    public static final short TYPE = 1400; //TDB29
+    public static final short TYPE = 20;
     public static final short LENGTH = 20;
     public static final byte VALUE_LENGTH = 18;
 
     private static final byte[] NONE_VAL = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-    public static final IPv6TERouterIdofRemoteNodeTlv NONE = new IPv6TERouterIdofRemoteNodeTlv(NONE_VAL);
+    public static final IPv6RouterIdofRemoteNodeSubTlv NONE = new IPv6RouterIdofRemoteNodeSubTlv(NONE_VAL);
 
     private static final byte[] NO_MASK_VAL = {(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
             (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
             (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF};
-    public static final IPv6TERouterIdofRemoteNodeTlv NO_MASK = new IPv6TERouterIdofRemoteNodeTlv(NO_MASK_VAL);
-    public static final IPv6TERouterIdofRemoteNodeTlv FULL_MASK = NONE;
+    public static final IPv6RouterIdofRemoteNodeSubTlv NO_MASK = new IPv6RouterIdofRemoteNodeSubTlv(NO_MASK_VAL);
+    public static final IPv6RouterIdofRemoteNodeSubTlv FULL_MASK = NONE;
 
     private final byte[] rawValue;
 
     /**
      * constructor to initialize rawValue.
      *
-     * @param rawValue IPv6TERouterIdofRemoteNodeTlv
+     * @param rawValue IPv6RouterIdofRemoteNodeTlv
      */
-    public IPv6TERouterIdofRemoteNodeTlv(byte[] rawValue) {
-        log.debug("IPv6TERouterIdofRemoteNodeTlv");
+    public IPv6RouterIdofRemoteNodeSubTlv(byte[] rawValue) {
+        log.debug("IPv6RouterIdofRemoteNodeTlv");
         this.rawValue = rawValue;
     }
 
     /**
-     * Returns newly created IPv6TERouterIdofRemoteNodeTlv object.
+     * Returns newly created IPv6RouterIdofRemoteNodeTlv object.
      *
      * @param raw IPv6 TE Router Id of RemoteNode
-     * @return object of IPv6TERouterIdofRemoteNodeTlv
+     * @return object of IPv6RouterIdofRemoteNodeTlv
      */
-    public static IPv6TERouterIdofRemoteNodeTlv of(final byte[] raw) {
+    public static IPv6RouterIdofRemoteNodeSubTlv of(final byte[] raw) {
         //check NONE_VAL
         boolean bFoundNone = true;
         //value starts from 3rd byte.
@@ -87,7 +87,7 @@
             return NO_MASK;
         }
 
-        return new IPv6TERouterIdofRemoteNodeTlv(raw);
+        return new IPv6RouterIdofRemoteNodeSubTlv(raw);
     }
 
     /**
@@ -124,8 +124,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof IPv6TERouterIdofRemoteNodeTlv) {
-            IPv6TERouterIdofRemoteNodeTlv other = (IPv6TERouterIdofRemoteNodeTlv) obj;
+        if (obj instanceof IPv6RouterIdofRemoteNodeSubTlv) {
+            IPv6RouterIdofRemoteNodeSubTlv other = (IPv6RouterIdofRemoteNodeSubTlv) obj;
             return Arrays.equals(rawValue, other.rawValue);
         }
         return false;
@@ -141,15 +141,15 @@
     }
 
     /**
-     * Reads the channel buffer and returns object of IPv6TERouterIdofRemoteNodeTlv.
+     * Reads the channel buffer and returns object of IPv6RouterIdofRemoteNodeTlv.
      *
      * @param c input channel buffer
-     * @return object of IPv6TERouterIdofRemoteNodeTlv
+     * @return object of IPv6RouterIdofRemoteNodeTlv
      */
-    public static IPv6TERouterIdofRemoteNodeTlv read20Bytes(ChannelBuffer c) {
+    public static IPv6RouterIdofRemoteNodeSubTlv read20Bytes(ChannelBuffer c) {
         byte[] yTemp = new byte[20];
         c.readBytes(yTemp, 0, 20);
-        return IPv6TERouterIdofRemoteNodeTlv.of(yTemp);
+        return IPv6RouterIdofRemoteNodeSubTlv.of(yTemp);
     }
 
     @Override
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/IgpMetricSubTlv.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/IgpMetricSubTlv.java
index fb8eee3..6aff439 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/IgpMetricSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides IGP Link Metric .
  */
-public class IgpMetricTlv implements PcepValueType {
+public class IgpMetricSubTlv implements PcepValueType {
 
     /* Reference :[I-D.ietf-idr-ls-distribution] /3.3.2.4
      *  0                   1                   2                   3
@@ -39,9 +39,9 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(IgpMetricTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(IgpMetricSubTlv.class);
 
-    public static final short TYPE = 1095; //TODO:NEED TO HANDLE TDB40
+    public static final short TYPE = 29;
     private short hLength;
 
     private final byte[] rawValue;
@@ -52,7 +52,7 @@
      * @param rawValue IGP Link Metric
      * @param hLength length
      */
-    public IgpMetricTlv(byte[] rawValue, short hLength) {
+    public IgpMetricSubTlv(byte[] rawValue, short hLength) {
         this.rawValue = rawValue;
         this.hLength = hLength;
     }
@@ -64,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 IgpMetricSubTlv of(final byte[] raw, short hLength) {
+        return new IgpMetricSubTlv(raw, hLength);
     }
 
     /**
@@ -102,8 +102,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof IgpMetricTlv) {
-            IgpMetricTlv other = (IgpMetricTlv) obj;
+        if (obj instanceof IgpMetricSubTlv) {
+            IgpMetricSubTlv other = (IgpMetricSubTlv) obj;
             return Arrays.equals(rawValue, other.rawValue);
         }
         return false;
@@ -128,7 +128,7 @@
     public static PcepValueType read(ChannelBuffer c, short hLength) {
         byte[] iIgpMetric = new byte[hLength];
         c.readBytes(iIgpMetric, 0, hLength);
-        return new IgpMetricTlv(iIgpMetric, hLength);
+        return new IgpMetricSubTlv(iIgpMetric, hLength);
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RouterIDSubTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IgpRouterIdSubTlv.java
similarity index 86%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RouterIDSubTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IgpRouterIdSubTlv.java
index 228d853..9bc6ac7 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RouterIDSubTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/IgpRouterIdSubTlv.java
@@ -28,7 +28,7 @@
 /**
  * Provides router id.
  */
-public class RouterIDSubTlv implements PcepValueType {
+public class IgpRouterIdSubTlv implements PcepValueType {
 
     /* reference :I-D.ietf-idr-ls-distribution.
      *  0                   1                   2                   3
@@ -40,9 +40,9 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(RouterIDSubTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(IgpRouterIdSubTlv.class);
 
-    public static final short TYPE = 1000; //TODD:change this TBD13
+    public static final short TYPE = 4;
     private final short hLength;
 
     private final byte[] rawValue;
@@ -53,7 +53,7 @@
      * @param rawValue raw value
      * @param hLength length
      */
-    public RouterIDSubTlv(byte[] rawValue, short hLength) {
+    public IgpRouterIdSubTlv(byte[] rawValue, short hLength) {
         this.rawValue = rawValue;
         if (0 == hLength) {
             this.hLength = (short) rawValue.length;
@@ -69,8 +69,8 @@
      * @param hLength length
      * @return object of Router ID Sub Tlv
      */
-    public static RouterIDSubTlv of(final byte[] raw, short hLength) {
-        return new RouterIDSubTlv(raw, hLength);
+    public static IgpRouterIdSubTlv of(final byte[] raw, short hLength) {
+        return new IgpRouterIdSubTlv(raw, hLength);
     }
 
     /**
@@ -107,8 +107,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof RouterIDSubTlv) {
-            RouterIDSubTlv other = (RouterIDSubTlv) obj;
+        if (obj instanceof IgpRouterIdSubTlv) {
+            IgpRouterIdSubTlv other = (IgpRouterIdSubTlv) obj;
             return   Arrays.equals(this.rawValue, other.rawValue);
         }
         return false;
@@ -124,16 +124,16 @@
     }
 
     /**
-     * Reads channel buffer and returns object of RouterIDSubTlv.
+     * Reads channel buffer and returns object of IgpRouterIDTlv.
      *
      * @param c input channel buffer
      * @param hLength length
-     * @return object of RouterIDSubTlv
+     * @return object of IgpRouterIDTlv
      */
     public static PcepValueType read(ChannelBuffer c, short hLength) {
         byte[] iOpaqueValue = new byte[hLength];
         c.readBytes(iOpaqueValue, 0, hLength);
-        return new RouterIDSubTlv(iOpaqueValue, hLength);
+        return new IgpRouterIdSubTlv(iOpaqueValue, 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/IsisAreaIdentifierSubTlv.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/IsisAreaIdentifierSubTlv.java
index 4382fc5..fd0f1d7 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/IsisAreaIdentifierSubTlv.java
@@ -28,7 +28,7 @@
 /**
  * Provides ISIS Area Identifier.
  */
-public class IsisAreaIdentifierTlv implements PcepValueType {
+public class IsisAreaIdentifierSubTlv implements PcepValueType {
 
     /* Reference :[I-D.ietf-idr- ls-distribution]/3.3.1.2
      * 0                   1                   2                   3
@@ -40,9 +40,9 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(IsisAreaIdentifierTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(IsisAreaIdentifierSubTlv.class);
 
-    public static final short TYPE = 107; //TODO:NEED TO HANDLE TBD24
+    public static final short TYPE = 16;
     private short hLength;
 
     private final byte[] rawValue;
@@ -53,7 +53,7 @@
      * @param rawValue ISIS-Area-Identifier
      * @param hLength length
      */
-    public IsisAreaIdentifierTlv(byte[] rawValue, short hLength) {
+    public IsisAreaIdentifierSubTlv(byte[] rawValue, short hLength) {
         log.debug("ISISAreaIdentifierTlv");
         this.rawValue = rawValue;
         if (0 == hLength) {
@@ -70,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 IsisAreaIdentifierSubTlv of(final byte[] raw, short hLength) {
+        return new IsisAreaIdentifierSubTlv(raw, hLength);
     }
 
     /**
@@ -108,8 +108,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof IsisAreaIdentifierTlv) {
-            IsisAreaIdentifierTlv other = (IsisAreaIdentifierTlv) obj;
+        if (obj instanceof IsisAreaIdentifierSubTlv) {
+            IsisAreaIdentifierSubTlv other = (IsisAreaIdentifierSubTlv) obj;
             return Objects.equals(hLength, other.hLength) && Arrays.equals(rawValue, other.rawValue);
         }
         return false;
@@ -134,7 +134,7 @@
     public static PcepValueType read(ChannelBuffer c, short hLength) {
         byte[] iIsisAreaIdentifier = new byte[hLength];
         c.readBytes(iIsisAreaIdentifier, 0, hLength);
-        return new IsisAreaIdentifierTlv(iIsisAreaIdentifier, hLength);
+        return new IsisAreaIdentifierSubTlv(iIsisAreaIdentifier, hLength);
     }
 
     @Override
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/LinkAttributesTlv.java
similarity index 69%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TELinkAttributesTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkAttributesTlv.java
index 10e672e..7568509 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/LinkAttributesTlv.java
@@ -17,6 +17,7 @@
 
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.ListIterator;
 import java.util.Objects;
 
@@ -29,12 +30,12 @@
 import com.google.common.base.MoreObjects;
 
 /**
- * Provides TELinkAttributesTlv.
+ * Provides LinkAttributesTlv.
  */
-public class TELinkAttributesTlv implements PcepValueType {
+public class LinkAttributesTlv implements PcepValueType {
 
     /*
-     * Reference :PCEP Extension for Transporting TE Data draft-dhodylee-pce-pcep-te-data-extn-02
+     * Reference :draft-dhodylee-pce-pcep-ls-01, section 9.2.8.2.
      *  0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -46,22 +47,22 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(TELinkAttributesTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(LinkAttributesTlv.class);
 
-    public static final short TYPE = 1897; //TODD:change this TBD27
+    public static final short TYPE = (short) 65286;
     public short hLength;
 
     public static final int TLV_HEADER_LENGTH = 4;
 
     // LinkDescriptors Sub-TLVs (variable)
-    private LinkedList<PcepValueType> llLinkAttributesSubTLVs;
+    private List<PcepValueType> llLinkAttributesSubTLVs;
 
     /**
      * Constructor to initialize Link Attributes Sub TLVs.
      *
      * @param llLinkAttributesSubTLVs linked list of PcepValueType
      */
-    public TELinkAttributesTlv(LinkedList<PcepValueType> llLinkAttributesSubTLVs) {
+    public LinkAttributesTlv(List<PcepValueType> llLinkAttributesSubTLVs) {
         this.llLinkAttributesSubTLVs = llLinkAttributesSubTLVs;
     }
 
@@ -69,10 +70,10 @@
      * Returns object of TE Link Attributes TLV.
      *
      * @param llLinkAttributesSubTLVs linked list of Link Attribute of Sub TLV
-     * @return object of TELinkAttributesTlv
+     * @return object of LinkAttributesTlv
      */
-    public static TELinkAttributesTlv of(final LinkedList<PcepValueType> llLinkAttributesSubTLVs) {
-        return new TELinkAttributesTlv(llLinkAttributesSubTLVs);
+    public static LinkAttributesTlv of(final List<PcepValueType> llLinkAttributesSubTLVs) {
+        return new LinkAttributesTlv(llLinkAttributesSubTLVs);
     }
 
     /**
@@ -80,7 +81,7 @@
      *
      * @return llLinkAttributesSubTLVs linked list of Link Attribute of Sub TLV
      */
-    public LinkedList<PcepValueType> getllLinkAttributesSubTLVs() {
+    public List<PcepValueType> getllLinkAttributesSubTLVs() {
         return llLinkAttributesSubTLVs;
     }
 
@@ -117,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 TELinkAttributesTlv) {
+        if (obj instanceof LinkAttributesTlv) {
             int countObjSubTlv = 0;
             int countOtherSubTlv = 0;
             boolean isCommonSubTlv = true;
-            TELinkAttributesTlv other = (TELinkAttributesTlv) obj;
-            Iterator<PcepValueType> objListIterator = ((TELinkAttributesTlv) obj).llLinkAttributesSubTLVs.iterator();
-            countObjSubTlv = ((TELinkAttributesTlv) obj).llLinkAttributesSubTLVs.size();
+            LinkAttributesTlv other = (LinkAttributesTlv) obj;
+            Iterator<PcepValueType> objListIterator = ((LinkAttributesTlv) obj).llLinkAttributesSubTLVs.iterator();
+            countObjSubTlv = ((LinkAttributesTlv) obj).llLinkAttributesSubTLVs.size();
             countOtherSubTlv = other.llLinkAttributesSubTLVs.size();
             if (countObjSubTlv != countOtherSubTlv) {
                 return false;
@@ -180,13 +181,13 @@
      *
      * @param c input channel buffer
      * @param hLength length
-     * @return object of TELinkAttributesTlv
+     * @return object of LinkAttributesTlv
      * @throws PcepParseException if mandatory fields are missing
      */
     public static PcepValueType read(ChannelBuffer c, short hLength) throws PcepParseException {
 
         // Node Descriptor Sub-TLVs (variable)
-        LinkedList<PcepValueType> llLinkAttributesSubTLVs = new LinkedList<>();
+        List<PcepValueType> llLinkAttributesSubTLVs = new LinkedList<>();
 
         ChannelBuffer tempCb = c.readBytes(hLength);
 
@@ -198,65 +199,65 @@
             short length = tempCb.readShort();
             switch (hType) {
 
-            case IPv4TERouterIdOfLocalNodeTlv.TYPE:
+            case IPv4RouterIdOfLocalNodeSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new IPv4TERouterIdOfLocalNodeTlv(iValue);
+                tlv = new IPv4RouterIdOfLocalNodeSubTlv(iValue);
                 break;
-            case IPv6TERouterIdofLocalNodeTlv.TYPE:
-                byte[] ipv6LValue = new byte[IPv6TERouterIdofLocalNodeTlv.VALUE_LENGTH];
-                tempCb.readBytes(ipv6LValue, 0, IPv6TERouterIdofLocalNodeTlv.VALUE_LENGTH);
-                tlv = new IPv6TERouterIdofLocalNodeTlv(ipv6LValue);
+            case IPv6RouterIdofLocalNodeSubTlv.TYPE:
+                byte[] ipv6LValue = new byte[IPv6RouterIdofLocalNodeSubTlv.VALUE_LENGTH];
+                tempCb.readBytes(ipv6LValue, 0, IPv6RouterIdofLocalNodeSubTlv.VALUE_LENGTH);
+                tlv = new IPv6RouterIdofLocalNodeSubTlv(ipv6LValue);
                 break;
-            case IPv4TERouterIdOfRemoteNodeTlv.TYPE:
+            case IPv4RouterIdOfRemoteNodeSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new IPv4TERouterIdOfRemoteNodeTlv(iValue);
+                tlv = new IPv4RouterIdOfRemoteNodeSubTlv(iValue);
                 break;
-            case IPv6TERouterIdofRemoteNodeTlv.TYPE:
-                byte[] ipv6RValue = new byte[IPv6TERouterIdofRemoteNodeTlv.VALUE_LENGTH];
-                tempCb.readBytes(ipv6RValue, 0, IPv6TERouterIdofRemoteNodeTlv.VALUE_LENGTH);
-                tlv = new IPv6TERouterIdofRemoteNodeTlv(ipv6RValue);
+            case IPv6RouterIdofRemoteNodeSubTlv.TYPE:
+                byte[] ipv6RValue = new byte[IPv6RouterIdofRemoteNodeSubTlv.VALUE_LENGTH];
+                tempCb.readBytes(ipv6RValue, 0, IPv6RouterIdofRemoteNodeSubTlv.VALUE_LENGTH);
+                tlv = new IPv6RouterIdofRemoteNodeSubTlv(ipv6RValue);
                 break;
-            case LinkLocalRemoteIdentifiersTlv.TYPE:
-                tlv = LinkLocalRemoteIdentifiersTlv.read(tempCb);
+            case LinkLocalRemoteIdentifiersSubTlv.TYPE:
+                tlv = LinkLocalRemoteIdentifiersSubTlv.read(tempCb);
                 break;
-            case AdministrativeGroupTlv.TYPE:
+            case AdministrativeGroupSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new AdministrativeGroupTlv(iValue);
+                tlv = new AdministrativeGroupSubTlv(iValue);
                 break;
-            case MaximumLinkBandwidthTlv.TYPE:
+            case MaximumLinkBandwidthSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new MaximumLinkBandwidthTlv(iValue);
+                tlv = new MaximumLinkBandwidthSubTlv(iValue);
                 break;
-            case MaximumReservableLinkBandwidthTlv.TYPE:
+            case MaximumReservableLinkBandwidthSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new MaximumReservableLinkBandwidthTlv(iValue);
+                tlv = new MaximumReservableLinkBandwidthSubTlv(iValue);
                 break;
-            case UnreservedBandwidthTlv.TYPE:
+            case UnreservedBandwidthSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new UnreservedBandwidthTlv(iValue);
+                tlv = new UnreservedBandwidthSubTlv(iValue);
                 break;
-            case TEDefaultMetricTlv.TYPE:
+            case TEDefaultMetricSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new TEDefaultMetricTlv(iValue);
+                tlv = new TEDefaultMetricSubTlv(iValue);
                 break;
-            case LinkProtectionTypeTlv.TYPE:
-                tlv = LinkProtectionTypeTlv.read(tempCb);
+            case LinkProtectionTypeSubTlv.TYPE:
+                tlv = LinkProtectionTypeSubTlv.read(tempCb);
                 break;
-            case MplsProtocolMaskTlv.TYPE:
+            case MplsProtocolMaskSubTlv.TYPE:
                 byte cValue = tempCb.readByte();
-                tlv = new MplsProtocolMaskTlv(cValue);
+                tlv = new MplsProtocolMaskSubTlv(cValue);
                 break;
-            case IgpMetricTlv.TYPE:
-                tlv = IgpMetricTlv.read(tempCb, length);
+            case IgpMetricSubTlv.TYPE:
+                tlv = IgpMetricSubTlv.read(tempCb, length);
                 break;
-            case SharedRiskLinkGroupTlv.TYPE:
-                tlv = SharedRiskLinkGroupTlv.read(tempCb, length);
+            case SharedRiskLinkGroupSubTlv.TYPE:
+                tlv = SharedRiskLinkGroupSubTlv.read(tempCb, length);
                 break;
-            case OpaqueLinkAttributeTlv.TYPE:
-                tlv = OpaqueLinkAttributeTlv.read(tempCb, length);
+            case OpaqueLinkAttributeSubTlv.TYPE:
+                tlv = OpaqueLinkAttributeSubTlv.read(tempCb, length);
                 break;
-            case LinkNameTlv.TYPE:
-                tlv = LinkNameTlv.read(tempCb, length);
+            case LinkNameAttributeSubTlv.TYPE:
+                tlv = LinkNameAttributeSubTlv.read(tempCb, length);
                 break;
             default:
                 throw new PcepParseException("Unsupported Sub TLV type :" + hType);
@@ -278,7 +279,7 @@
             throw new PcepParseException("Sub Tlv parsing error. Extra bytes received.");
         }
 
-        return new TELinkAttributesTlv(llLinkAttributesSubTLVs);
+        return new LinkAttributesTlv(llLinkAttributesSubTLVs);
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TELinkDescriptorsTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkDescriptorsTlv.java
similarity index 77%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TELinkDescriptorsTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkDescriptorsTlv.java
index b974cf8..0770421 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TELinkDescriptorsTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkDescriptorsTlv.java
@@ -17,6 +17,7 @@
 
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.ListIterator;
 import java.util.Objects;
 
@@ -31,10 +32,10 @@
 /**
  * Provides TE Link Descriptors TLV.
  */
-public class TELinkDescriptorsTlv implements PcepValueType {
+public class LinkDescriptorsTlv implements PcepValueType {
 
     /*
-     * Reference: PCEP Extension for Transporting TE Data draft-dhodylee-pce-pcep-te-data-extn-02
+     * Reference: draft-dhodylee-pce-pcep-ls-01, section 9.2.6.
      *   0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -47,33 +48,33 @@
 
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(TELinkDescriptorsTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(LinkDescriptorsTlv.class);
 
-    public static final short TYPE = 1070; //TODD:change this TBD14
+    public static final short TYPE = (short) 65284;
     public short hLength;
 
     public static final int TLV_HEADER_LENGTH = 4;
 
     // LinkDescriptors Sub-TLVs (variable)
-    private LinkedList<PcepValueType> llLinkDescriptorsSubTLVs;
+    private List<PcepValueType> llLinkDescriptorsSubTLVs;
 
     /**
      * Constructor to initialize llLinkDescriptorsSubTLVs.
      *
      * @param llLinkDescriptorsSubTLVs of PcepValueType
      */
-    public TELinkDescriptorsTlv(LinkedList<PcepValueType> llLinkDescriptorsSubTLVs) {
+    public LinkDescriptorsTlv(List<PcepValueType> llLinkDescriptorsSubTLVs) {
         this.llLinkDescriptorsSubTLVs = llLinkDescriptorsSubTLVs;
     }
 
     /**
-     * Returns object of TELinkDescriptorsTLV.
+     * Returns object of LinkDescriptorsTlv.
      *
      * @param llLinkDescriptorsSubTLVs of PcepValueType
-     * @return object of TELinkDescriptorsTLV
+     * @return object of LinkDescriptorsTlv
      */
-    public static TELinkDescriptorsTlv of(final LinkedList<PcepValueType> llLinkDescriptorsSubTLVs) {
-        return new TELinkDescriptorsTlv(llLinkDescriptorsSubTLVs);
+    public static LinkDescriptorsTlv of(final List<PcepValueType> llLinkDescriptorsSubTLVs) {
+        return new LinkDescriptorsTlv(llLinkDescriptorsSubTLVs);
     }
 
     /**
@@ -81,7 +82,7 @@
      *
      * @return llLinkDescriptorsSubTLVs linked list of Link Attribute of Sub TLV
      */
-    public LinkedList<PcepValueType> getllLinkDescriptorsSubTLVs() {
+    public List<PcepValueType> getllLinkDescriptorsSubTLVs() {
         return llLinkDescriptorsSubTLVs;
     }
 
@@ -118,13 +119,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 LinkDescriptorsTlv) {
             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();
+            LinkDescriptorsTlv other = (LinkDescriptorsTlv) obj;
+            Iterator<PcepValueType> objListIterator = ((LinkDescriptorsTlv) obj).llLinkDescriptorsSubTLVs.iterator();
+            countObjSubTlv = ((LinkDescriptorsTlv) obj).llLinkDescriptorsSubTLVs.size();
             countOtherSubTlv = other.llLinkDescriptorsSubTLVs.size();
             if (countObjSubTlv != countOtherSubTlv) {
                 return false;
@@ -173,17 +174,17 @@
     }
 
     /**
-     * Reads channel buffer and returns object of TELinkDescriptorsTLV.
+     * Reads channel buffer and returns object of LinkDescriptorsTlv.
      *
      * @param c input channel buffer
      * @param length length
-     * @return object of TELinkDescriptorsTLV
+     * @return object of LinkDescriptorsTlv
      * @throws PcepParseException if mandatory fields are missing
      */
     public static PcepValueType read(ChannelBuffer c, short length) throws PcepParseException {
 
         // Node Descriptor Sub-TLVs (variable)
-        LinkedList<PcepValueType> llLinkDescriptorsSubTLVs = new LinkedList<>();
+        List<PcepValueType> llLinkDescriptorsSubTLVs = new LinkedList<>();
 
         ChannelBuffer tempCb = c.readBytes(length);
 
@@ -196,26 +197,26 @@
             log.debug("sub Tlv Length" + hLength);
             switch (hType) {
 
-            case LinkLocalRemoteIdentifiersTlv.TYPE:
-                tlv = LinkLocalRemoteIdentifiersTlv.read(tempCb);
+            case LinkLocalRemoteIdentifiersSubTlv.TYPE:
+                tlv = LinkLocalRemoteIdentifiersSubTlv.read(tempCb);
                 break;
-            case IPv4InterfaceAddressTlv.TYPE:
+            case IPv4InterfaceAddressSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new IPv4InterfaceAddressTlv(iValue);
+                tlv = new IPv4InterfaceAddressSubTlv(iValue);
                 break;
-            case IPv4NeighborAddressTlv.TYPE:
+            case IPv4NeighborAddressSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new IPv4NeighborAddressTlv(iValue);
+                tlv = new IPv4NeighborAddressSubTlv(iValue);
                 break;
-            case IPv6InterfaceAddressTlv.TYPE:
-                byte[] ipv6Value = new byte[IPv6InterfaceAddressTlv.VALUE_LENGTH];
-                tempCb.readBytes(ipv6Value, 0, IPv6InterfaceAddressTlv.VALUE_LENGTH);
-                tlv = new IPv6InterfaceAddressTlv(ipv6Value);
+            case IPv6InterfaceAddressSubTlv.TYPE:
+                byte[] ipv6Value = new byte[IPv6InterfaceAddressSubTlv.VALUE_LENGTH];
+                tempCb.readBytes(ipv6Value, 0, IPv6InterfaceAddressSubTlv.VALUE_LENGTH);
+                tlv = new IPv6InterfaceAddressSubTlv(ipv6Value);
                 break;
-            case IPv6NeighborAddressTlv.TYPE:
-                byte[] ipv6NeighborAdd = new byte[IPv6NeighborAddressTlv.VALUE_LENGTH];
-                tempCb.readBytes(ipv6NeighborAdd, 0, IPv6NeighborAddressTlv.VALUE_LENGTH);
-                tlv = new IPv6NeighborAddressTlv(ipv6NeighborAdd);
+            case IPv6NeighborAddressSubTlv.TYPE:
+                byte[] ipv6NeighborAdd = new byte[IPv6NeighborAddressSubTlv.VALUE_LENGTH];
+                tempCb.readBytes(ipv6NeighborAdd, 0, IPv6NeighborAddressSubTlv.VALUE_LENGTH);
+                tlv = new IPv6NeighborAddressSubTlv(ipv6NeighborAdd);
                 break;
             default:
                 throw new PcepParseException("Unsupported Sub TLV type:" + hType);
@@ -237,7 +238,7 @@
 
             throw new PcepParseException("Sub Tlv parsing error. Extra bytes received.");
         }
-        return new TELinkDescriptorsTlv(llLinkDescriptorsSubTLVs);
+        return new LinkDescriptorsTlv(llLinkDescriptorsSubTLVs);
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersSubTlv.java
similarity index 86%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersSubTlv.java
index 5fa0a4c..336c884 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides Local and remote Link Identifiers.
  */
-public class LinkLocalRemoteIdentifiersTlv implements PcepValueType {
+public class LinkLocalRemoteIdentifiersSubTlv implements PcepValueType {
 
     /* Reference :RFC5307
      * 0                   1                   2                   3
@@ -41,9 +41,9 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
      */
-    protected static final Logger log = LoggerFactory.getLogger(LinkLocalRemoteIdentifiersTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(LinkLocalRemoteIdentifiersSubTlv.class);
 
-    public static final short TYPE = 4;
+    public static final short TYPE = 6;
     public static final short LENGTH = 8;
     private final int iLinkLocalIdentifier;
     private final int iLinkRemoteIdentifier;
@@ -54,7 +54,7 @@
      * @param iLinkLocalIdentifier Link Local identifier
      * @param iLinkRemoteIdentifier Link Remote identifier
      */
-    public LinkLocalRemoteIdentifiersTlv(int iLinkLocalIdentifier, int iLinkRemoteIdentifier) {
+    public LinkLocalRemoteIdentifiersSubTlv(int iLinkLocalIdentifier, int iLinkRemoteIdentifier) {
         this.iLinkLocalIdentifier = iLinkLocalIdentifier;
         this.iLinkRemoteIdentifier = iLinkRemoteIdentifier;
     }
@@ -66,8 +66,8 @@
      * @param iLinkRemoteIdentifier Link Remote identifier
      * @return object of LinkLocalRemoteIdentifiersTlv
      */
-    public static LinkLocalRemoteIdentifiersTlv of(int iLinkLocalIdentifier, int iLinkRemoteIdentifier) {
-        return new LinkLocalRemoteIdentifiersTlv(iLinkLocalIdentifier, iLinkRemoteIdentifier);
+    public static LinkLocalRemoteIdentifiersSubTlv of(int iLinkLocalIdentifier, int iLinkRemoteIdentifier) {
+        return new LinkLocalRemoteIdentifiersSubTlv(iLinkLocalIdentifier, iLinkRemoteIdentifier);
     }
 
     /**
@@ -113,8 +113,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof LinkLocalRemoteIdentifiersTlv) {
-            LinkLocalRemoteIdentifiersTlv other = (LinkLocalRemoteIdentifiersTlv) obj;
+        if (obj instanceof LinkLocalRemoteIdentifiersSubTlv) {
+            LinkLocalRemoteIdentifiersSubTlv other = (LinkLocalRemoteIdentifiersSubTlv) obj;
             return Objects.equals(iLinkLocalIdentifier, other.iLinkLocalIdentifier)
                     && Objects.equals(iLinkRemoteIdentifier, other.iLinkRemoteIdentifier);
         }
@@ -140,7 +140,7 @@
     public static PcepValueType read(ChannelBuffer c) {
         int iLinkLocalIdentifier = c.readInt();
         int iLinkRemoteIdentifier = c.readInt();
-        return new LinkLocalRemoteIdentifiersTlv(iLinkLocalIdentifier, iLinkRemoteIdentifier);
+        return new LinkLocalRemoteIdentifiersSubTlv(iLinkLocalIdentifier, iLinkRemoteIdentifier);
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkNameTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkNameAttributeSubTlv.java
similarity index 87%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkNameTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkNameAttributeSubTlv.java
index 34dea5b..fe38db9 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkNameTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkNameAttributeSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides the Link Name.
  */
-public class LinkNameTlv implements PcepValueType {
+public class LinkNameAttributeSubTlv implements PcepValueType {
 
     /* Reference :[I-D.ietf-idr- ls-distribution] /3.3.2.7
      * Link name tlv format.
@@ -40,9 +40,9 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(LinkNameTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(LinkNameAttributeSubTlv.class);
 
-    public static final short TYPE = 1098; //TODO:NEED TO HANDLE TDB43
+    public static final short TYPE = 32;
     private short hLength;
 
     private final byte[] rawValue;
@@ -53,7 +53,7 @@
      * @param rawValue Link-Name
      * @param hLength length
      */
-    public LinkNameTlv(byte[] rawValue, short hLength) {
+    public LinkNameAttributeSubTlv(byte[] rawValue, short hLength) {
         this.rawValue = rawValue;
         if (0 == hLength) {
             this.hLength = (short) rawValue.length;
@@ -69,8 +69,8 @@
      * @param hLength length
      * @return object of LinkNameTlv
      */
-    public static LinkNameTlv of(final byte[] raw, short hLength) {
-        return new LinkNameTlv(raw, hLength);
+    public static LinkNameAttributeSubTlv of(final byte[] raw, short hLength) {
+        return new LinkNameAttributeSubTlv(raw, hLength);
     }
 
     /**
@@ -107,8 +107,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof LinkNameTlv) {
-            LinkNameTlv other = (LinkNameTlv) obj;
+        if (obj instanceof LinkNameAttributeSubTlv) {
+            LinkNameAttributeSubTlv other = (LinkNameAttributeSubTlv) obj;
             return Arrays.equals(this.rawValue, other.rawValue);
         }
         return false;
@@ -133,7 +133,7 @@
     public static PcepValueType read(ChannelBuffer c, short hLength) {
         byte[] linkName = new byte[hLength];
         c.readBytes(linkName, 0, hLength);
-        return new LinkNameTlv(linkName, hLength);
+        return new LinkNameAttributeSubTlv(linkName, hLength);
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkProtectionTypeTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkProtectionTypeSubTlv.java
similarity index 88%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkProtectionTypeTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkProtectionTypeSubTlv.java
index a802d57..2fe60a3 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkProtectionTypeTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LinkProtectionTypeSubTlv.java
@@ -28,7 +28,7 @@
  * Provide Link Protection Type.
  */
 
-public class LinkProtectionTypeTlv implements PcepValueType {
+public class LinkProtectionTypeSubTlv implements PcepValueType {
 
     /* Reference  :[RFC5307]/1.2
      * 0                   1                   2                   3
@@ -39,9 +39,9 @@
      |Protection Cap | Reserved      |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
-    protected static final Logger log = LoggerFactory.getLogger(LinkProtectionTypeTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(LinkProtectionTypeSubTlv.class);
 
-    public static final short TYPE = 20; //TDB38
+    public static final short TYPE = 27;
     public static final short LENGTH = 2;
     private final byte protectionCap;
     private final byte reserved;
@@ -51,7 +51,7 @@
      *
      * @param protectionCap Protection Cap
      */
-    public LinkProtectionTypeTlv(byte protectionCap) {
+    public LinkProtectionTypeSubTlv(byte protectionCap) {
         this.protectionCap = protectionCap;
         this.reserved = 0;
     }
@@ -62,7 +62,7 @@
      * @param protectionCap Protection Cap
      * @param reserved Reserved value
      */
-    public LinkProtectionTypeTlv(byte protectionCap, byte reserved) {
+    public LinkProtectionTypeSubTlv(byte protectionCap, byte reserved) {
         this.protectionCap = protectionCap;
         this.reserved = reserved;
     }
@@ -101,8 +101,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof LinkProtectionTypeTlv) {
-            LinkProtectionTypeTlv other = (LinkProtectionTypeTlv) obj;
+        if (obj instanceof LinkProtectionTypeSubTlv) {
+            LinkProtectionTypeSubTlv other = (LinkProtectionTypeSubTlv) obj;
             return Objects.equals(protectionCap, other.protectionCap) && Objects.equals(reserved, other.reserved);
         }
 
@@ -128,7 +128,7 @@
     public static PcepValueType read(ChannelBuffer c) {
         byte protectionCap = c.readByte();
         byte reserved = c.readByte();
-        return new LinkProtectionTypeTlv(protectionCap, reserved);
+        return new LinkProtectionTypeSubTlv(protectionCap, reserved);
     }
 
     @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/LocalNodeDescriptorsTlv.java
similarity index 81%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LocalNodeDescriptorsTlv.java
index e2f9779..5f353e8 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/LocalNodeDescriptorsTlv.java
@@ -17,6 +17,7 @@
 
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.ListIterator;
 import java.util.Objects;
 
@@ -31,9 +32,9 @@
 /**
  * Provides Local TE Node Descriptors TLV which contains Node Descriptor Sub-TLVs.
  */
-public class LocalTENodeDescriptorsTlv implements PcepValueType {
+public class LocalNodeDescriptorsTlv implements PcepValueType {
 
-    /* REFERENCE :draft-ietf-idr-ls-distribution-10
+    /* REFERENCE :draft-dhodylee-pce-pcep-ls-01, section 9.2.2
      *  0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -46,32 +47,32 @@
      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(LocalNodeDescriptorsTlv.class);
 
-    public static final short TYPE = 1637; //TODD:change this TBD8
+    public static final short TYPE = (short) 65282;
     public short hLength;
 
     public static final int TLV_HEADER_LENGTH = 4;
     // Node Descriptor Sub-TLVs (variable)
-    private LinkedList<PcepValueType> llNodeDescriptorSubTLVs;
+    private List<PcepValueType> llNodeDescriptorSubTLVs;
 
     /**
      * Constructor to initialize llNodeDescriptorSubTLVs.
      *
-     * @param llNodeDescriptorSubTLVs LinkedList of PcepValueType
+     * @param llNodeDescriptorSubTLVs List of PcepValueType
      */
-    public LocalTENodeDescriptorsTlv(LinkedList<PcepValueType> llNodeDescriptorSubTLVs) {
+    public LocalNodeDescriptorsTlv(List<PcepValueType> llNodeDescriptorSubTLVs) {
         this.llNodeDescriptorSubTLVs = llNodeDescriptorSubTLVs;
     }
 
     /**
-     * Returns a new object of LocalTENodeDescriptorsTLV.
+     * Returns a new object of LocalNodeDescriptorsTLV.
      *
      * @param llNodeDescriptorSubTLVs linked list of Node Descriptor Sub TLVs
-     * @return object of LocalTENodeDescriptorsTLV
+     * @return object of LocalNodeDescriptorsTLV
      */
-    public static LocalTENodeDescriptorsTlv of(final LinkedList<PcepValueType> llNodeDescriptorSubTLVs) {
-        return new LocalTENodeDescriptorsTlv(llNodeDescriptorSubTLVs);
+    public static LocalNodeDescriptorsTlv of(final List<PcepValueType> llNodeDescriptorSubTLVs) {
+        return new LocalNodeDescriptorsTlv(llNodeDescriptorSubTLVs);
     }
 
     /**
@@ -79,7 +80,7 @@
      *
      * @return llNodeDescriptorSubTLVs linked list of Node Descriptor Sub TLV
      */
-    public LinkedList<PcepValueType> getllNodeDescriptorSubTLVs() {
+    public List<PcepValueType> getllNodeDescriptorSubTLVs() {
         return llNodeDescriptorSubTLVs;
     }
 
@@ -117,14 +118,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 LocalNodeDescriptorsTlv) {
             int countObjSubTlv = 0;
             int countOtherSubTlv = 0;
             boolean isCommonSubTlv = true;
-            LocalTENodeDescriptorsTlv other = (LocalTENodeDescriptorsTlv) obj;
-            Iterator<PcepValueType> objListIterator = ((LocalTENodeDescriptorsTlv) obj).llNodeDescriptorSubTLVs
+            LocalNodeDescriptorsTlv other = (LocalNodeDescriptorsTlv) obj;
+            Iterator<PcepValueType> objListIterator = ((LocalNodeDescriptorsTlv) obj).llNodeDescriptorSubTLVs
                     .iterator();
-            countObjSubTlv = ((LocalTENodeDescriptorsTlv) obj).llNodeDescriptorSubTLVs.size();
+            countObjSubTlv = ((LocalNodeDescriptorsTlv) obj).llNodeDescriptorSubTLVs.size();
             countOtherSubTlv = other.llNodeDescriptorSubTLVs.size();
             if (countObjSubTlv != countOtherSubTlv) {
                 return false;
@@ -184,7 +185,7 @@
     public static PcepValueType read(ChannelBuffer c, short hLength) throws PcepParseException {
 
         // Node Descriptor Sub-TLVs (variable)
-        LinkedList<PcepValueType> llNodeDescriptorSubTLVs = new LinkedList<>();
+        List<PcepValueType> llNodeDescriptorSubTLVs = new LinkedList<>();
 
         ChannelBuffer tempCb = c.readBytes(hLength);
 
@@ -197,20 +198,20 @@
 
             switch (hType) {
 
-            case AutonomousSystemTlv.TYPE:
+            case AutonomousSystemSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new AutonomousSystemTlv(iValue);
+                tlv = new AutonomousSystemSubTlv(iValue);
                 break;
-            case BgpLsIdentifierTlv.TYPE:
+            case BgpLsIdentifierSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new BgpLsIdentifierTlv(iValue);
+                tlv = new BgpLsIdentifierSubTlv(iValue);
                 break;
             case OspfAreaIdSubTlv.TYPE:
                 iValue = tempCb.readInt();
                 tlv = new OspfAreaIdSubTlv(iValue);
                 break;
-            case RouterIDSubTlv.TYPE:
-                tlv = RouterIDSubTlv.read(tempCb, length);
+            case IgpRouterIdSubTlv.TYPE:
+                tlv = IgpRouterIdSubTlv.read(tempCb, length);
                 break;
 
             default:
@@ -232,7 +233,7 @@
         if (0 < tempCb.readableBytes()) {
             throw new PcepParseException("Sub Tlv parsing error. Extra bytes received.");
         }
-        return new LocalTENodeDescriptorsTlv(llNodeDescriptorSubTLVs);
+        return new LocalNodeDescriptorsTlv(llNodeDescriptorSubTLVs);
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TedCapabilityTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LsCapabilityTlv.java
similarity index 74%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TedCapabilityTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LsCapabilityTlv.java
index 189dcad..549ac38 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TedCapabilityTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/LsCapabilityTlv.java
@@ -27,10 +27,10 @@
 /**
  * Provides TED Capability Tlv.
  */
-public class TedCapabilityTlv implements PcepValueType {
+public class LsCapabilityTlv implements PcepValueType {
 
     /*
-     * Reference :PCEP Extension for Transporting TE Data draft-dhodylee-pce-pcep-te-data-extn-02
+     * Reference :draft-dhodylee-pce-pcep-ls-01, section 9.1.1.
      *  0                   1                   2                   3
         0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -40,14 +40,14 @@
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(TedCapabilityTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(LsCapabilityTlv.class);
 
-    public static final short TYPE = 132; //TODO: need to change this TBD5
+    public static final short TYPE = (short) 65280;
     public static final short LENGTH = 4;
     public static final int SET = 1;
     public static final byte RFLAG_CHECK = 0x01;
 
-    private final boolean bRFlag;
+    private final boolean rFlag;
     private final int rawValue;
     private final boolean isRawValueSet;
 
@@ -56,26 +56,26 @@
      *
      * @param rawValue Flags
      */
-    public TedCapabilityTlv(final int rawValue) {
+    public LsCapabilityTlv(final int rawValue) {
         this.rawValue = rawValue;
         this.isRawValueSet = true;
         int temp = rawValue;
         temp = temp & RFLAG_CHECK;
         if (temp == SET) {
-            this.bRFlag = true;
+            this.rFlag = true;
         } else {
-            this.bRFlag = false;
+            this.rFlag = false;
         }
 
     }
 
     /**
-     * Constructor to initialize bRFlag.
+     * Constructor to initialize rFlag.
      *
-     * @param bRFlag R-flag
+     * @param rFlag R-flag
      */
-    public TedCapabilityTlv(boolean bRFlag) {
-        this.bRFlag = bRFlag;
+    public LsCapabilityTlv(boolean rFlag) {
+        this.rFlag = rFlag;
         this.rawValue = 0;
         this.isRawValueSet = false;
     }
@@ -83,20 +83,20 @@
     /**
      * Returns R-flag.
      *
-     * @return bRFlag
+     * @return rFlag
      */
-    public boolean getbRFlag() {
-        return bRFlag;
+    public boolean getrFlag() {
+        return rFlag;
     }
 
     /**
-     * Returns an object of TedCapabilityTlv.
+     * Returns an object of LsCapabilityTlv.
      *
      * @param raw value Flags
-     * @return object of TedCapabilityTlv
+     * @return object of LsCapabilityTlv
      */
-    public static TedCapabilityTlv of(final int raw) {
-        return new TedCapabilityTlv(raw);
+    public static LsCapabilityTlv of(final int raw) {
+        return new LsCapabilityTlv(raw);
     }
 
     @Override
@@ -123,7 +123,7 @@
         if (isRawValueSet) {
             return Objects.hash(rawValue);
         } else {
-            return Objects.hash(bRFlag);
+            return Objects.hash(rFlag);
         }
     }
 
@@ -132,12 +132,12 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof TedCapabilityTlv) {
-            TedCapabilityTlv other = (TedCapabilityTlv) obj;
+        if (obj instanceof LsCapabilityTlv) {
+            LsCapabilityTlv other = (LsCapabilityTlv) obj;
             if (isRawValueSet) {
                 return Objects.equals(this.rawValue, other.rawValue);
             } else {
-                return Objects.equals(this.bRFlag, other.bRFlag);
+                return Objects.equals(this.rFlag, other.rFlag);
             }
         }
         return false;
@@ -152,7 +152,7 @@
         if (isRawValueSet) {
             c.writeInt(rawValue);
         } else {
-            if (bRFlag) {
+            if (rFlag) {
                 temp = temp | RFLAG_CHECK;
             }
             c.writeInt(temp);
@@ -161,13 +161,13 @@
     }
 
     /**
-     * Reads channel buffer and returns object of TedCapabilityTlv.
+     * Reads channel buffer and returns object of LsCapabilityTlv.
      *
      * @param c input channel buffer
-     * @return object of TedCapabilityTlv
+     * @return object of LsCapabilityTlv
      */
-    public static TedCapabilityTlv read(ChannelBuffer c) {
-        return TedCapabilityTlv.of(c.readInt());
+    public static LsCapabilityTlv read(ChannelBuffer c) {
+        return LsCapabilityTlv.of(c.readInt());
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MaximumLinkBandwidthSubTlv.java
similarity index 85%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MaximumLinkBandwidthSubTlv.java
index db1acf0..5b11792 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MaximumLinkBandwidthSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provide the Maximum Link Bandwidth.
  */
-public class MaximumLinkBandwidthTlv implements PcepValueType {
+public class MaximumLinkBandwidthSubTlv implements PcepValueType {
 
     /* Reference :[RFC5305]/3.3.
      * 0                   1                   2                   3
@@ -39,9 +39,9 @@
      +-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-++-+-+-+-
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(MaximumLinkBandwidthTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(MaximumLinkBandwidthSubTlv.class);
 
-    public static final short TYPE = 9; //TDB34
+    public static final short TYPE = 23;
     public static final short LENGTH = 4;
 
     private final int rawValue;
@@ -52,7 +52,7 @@
      * @param rawValue Maximum-Link-Bandwidth
      */
 
-    public MaximumLinkBandwidthTlv(int rawValue) {
+    public MaximumLinkBandwidthSubTlv(int rawValue) {
         this.rawValue = rawValue;
     }
 
@@ -62,8 +62,8 @@
      * @param raw value of Maximum-Link-Bandwidth
      * @return object of MaximumLinkBandwidthTlv
      */
-    public static MaximumLinkBandwidthTlv of(final int raw) {
-        return new MaximumLinkBandwidthTlv(raw);
+    public static MaximumLinkBandwidthSubTlv of(final int raw) {
+        return new MaximumLinkBandwidthSubTlv(raw);
     }
 
     /**
@@ -100,8 +100,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof MaximumLinkBandwidthTlv) {
-            MaximumLinkBandwidthTlv other = (MaximumLinkBandwidthTlv) obj;
+        if (obj instanceof MaximumLinkBandwidthSubTlv) {
+            MaximumLinkBandwidthSubTlv other = (MaximumLinkBandwidthSubTlv) obj;
             return Objects.equals(rawValue, other.rawValue);
         }
         return false;
@@ -122,8 +122,8 @@
      * @param c input channel buffer
      * @return object of MaximumLinkBandwidthTlv
      */
-    public static MaximumLinkBandwidthTlv read(ChannelBuffer c) {
-        return MaximumLinkBandwidthTlv.of(c.readInt());
+    public static MaximumLinkBandwidthSubTlv read(ChannelBuffer c) {
+        return MaximumLinkBandwidthSubTlv.of(c.readInt());
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthSubTlv.java
similarity index 83%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthSubTlv.java
index 01d08ca..ece6b79e 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provide the Maximum Reservable Link Bandwidth.
  */
-public class MaximumReservableLinkBandwidthTlv implements PcepValueType {
+public class MaximumReservableLinkBandwidthSubTlv implements PcepValueType {
 
     /* Reference :[RFC5305]/3.5.
      * 0                   1                   2                   3
@@ -39,9 +39,9 @@
      +-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-++-+-+-+-
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(MaximumReservableLinkBandwidthTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(MaximumReservableLinkBandwidthSubTlv.class);
 
-    public static final short TYPE = 10; // TDB35
+    public static final short TYPE = 24;
     public static final short LENGTH = 4;
 
     private final int rawValue;
@@ -51,7 +51,7 @@
      *
      * @param rawValue MaximumReservableLinkBandwidth
      */
-    public MaximumReservableLinkBandwidthTlv(int rawValue) {
+    public MaximumReservableLinkBandwidthSubTlv(int rawValue) {
         log.debug("MaximumReservableLinkBandwidthTlv");
         this.rawValue = rawValue;
     }
@@ -62,8 +62,8 @@
      * @param raw MaximumReservableLinkBandwidth
      * @return object of MaximumReservableLinkBandwidthTlv
      */
-    public static MaximumReservableLinkBandwidthTlv of(final int raw) {
-        return new MaximumReservableLinkBandwidthTlv(raw);
+    public static MaximumReservableLinkBandwidthSubTlv of(final int raw) {
+        return new MaximumReservableLinkBandwidthSubTlv(raw);
     }
 
     /**
@@ -99,8 +99,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof MaximumReservableLinkBandwidthTlv) {
-            MaximumReservableLinkBandwidthTlv other = (MaximumReservableLinkBandwidthTlv) obj;
+        if (obj instanceof MaximumReservableLinkBandwidthSubTlv) {
+            MaximumReservableLinkBandwidthSubTlv other = (MaximumReservableLinkBandwidthSubTlv) obj;
             return Objects.equals(this.rawValue, other.rawValue);
         }
         return false;
@@ -121,8 +121,8 @@
      * @param c input channel buffer
      * @return object of MaximumReservableLinkBandwidthTlv
      */
-    public static MaximumReservableLinkBandwidthTlv read(ChannelBuffer c) {
-        return MaximumReservableLinkBandwidthTlv.of(c.readInt());
+    public static MaximumReservableLinkBandwidthSubTlv read(ChannelBuffer c) {
+        return MaximumReservableLinkBandwidthSubTlv.of(c.readInt());
     }
 
     @Override
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/MplsProtocolMaskSubTlv.java
similarity index 89%
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/MplsProtocolMaskSubTlv.java
index 95f8514..d47dc21 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/MplsProtocolMaskSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides MPLS Protocol Mask.
  */
-public class MplsProtocolMaskTlv implements PcepValueType {
+public class MplsProtocolMaskSubTlv implements PcepValueType {
 
     /* Reference :[I-D.ietf-idr-ls-distribution]/3.3.2.2
      *  0                   1                   2                   3
@@ -38,9 +38,9 @@
      |L|R|  Reserved |
      +-+-+-+-+-+-+-+-+
      */
-    protected static final Logger log = LoggerFactory.getLogger(MplsProtocolMaskTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(MplsProtocolMaskSubTlv.class);
 
-    public static final short TYPE = 1094; //TDB39
+    public static final short TYPE = 28;
     public static final short LENGTH = 1;
     public static final byte LFLAG_SET = (byte) 0x80;
     public static final byte RFLAG_SET = 0x40;
@@ -55,7 +55,7 @@
      *
      * @param rawValue MPLS Protocol Mask Flag Bits
      */
-    public MplsProtocolMaskTlv(byte rawValue) {
+    public MplsProtocolMaskSubTlv(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 MplsProtocolMaskSubTlv(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 MplsProtocolMaskSubTlv of(final byte raw) {
+        return new MplsProtocolMaskSubTlv(raw);
     }
 
     /**
@@ -141,8 +141,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof MplsProtocolMaskTlv) {
-            MplsProtocolMaskTlv other = (MplsProtocolMaskTlv) obj;
+        if (obj instanceof MplsProtocolMaskSubTlv) {
+            MplsProtocolMaskSubTlv other = (MplsProtocolMaskSubTlv) 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 MplsProtocolMaskSubTlv(bLFlag, bRFlag);
     }
 
     @Override
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/NodeAttributesTlv.java
similarity index 76%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TENodeAttributesTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NodeAttributesTlv.java
index 10f54de..dc0ab7c 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/NodeAttributesTlv.java
@@ -17,6 +17,7 @@
 
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.ListIterator;
 import java.util.Objects;
 
@@ -31,7 +32,7 @@
 /**
  * Provides TE Node Attributes Tlv.
  */
-public class TENodeAttributesTlv implements PcepValueType {
+public class NodeAttributesTlv implements PcepValueType {
     /*
      * Reference :PCEP Extension for Transporting TE Data draft-dhodylee-pce-pcep-te-data-extn-02
      *
@@ -48,32 +49,32 @@
 
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(TENodeAttributesTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(NodeAttributesTlv.class);
 
-    public static final short TYPE = 1267; //TODD:change this TBD20
+    public static final short TYPE = (short) 65285;
     public short hLength;
 
     public static final int TLV_HEADER_LENGTH = 4;
     // LinkDescriptors Sub-TLVs (variable)
-    private LinkedList<PcepValueType> llNodeAttributesSubTLVs;
+    private List<PcepValueType> llNodeAttributesSubTLVs;
 
     /**
      * Constructor to initialize llNodeAttributesSubTLVs.
      *
      * @param llNodeAttributesSubTLVs linked list of Node Attributes Sub-TLVs
      */
-    public TENodeAttributesTlv(LinkedList<PcepValueType> llNodeAttributesSubTLVs) {
+    public NodeAttributesTlv(List<PcepValueType> llNodeAttributesSubTLVs) {
         this.llNodeAttributesSubTLVs = llNodeAttributesSubTLVs;
     }
 
     /**
-     * Returns object of TENodeAttributesTlv.
+     * Returns object of NodeAttributesTlv.
      *
-     * @param llNodeAttributesSubTLVs LinkedList of PcepValueType
-     * @return object of TENodeAttributesTlv
+     * @param llNodeAttributesSubTLVs List of PcepValueType
+     * @return object of NodeAttributesTlv
      */
-    public static TENodeAttributesTlv of(LinkedList<PcepValueType> llNodeAttributesSubTLVs) {
-        return new TENodeAttributesTlv(llNodeAttributesSubTLVs);
+    public static NodeAttributesTlv of(List<PcepValueType> llNodeAttributesSubTLVs) {
+        return new NodeAttributesTlv(llNodeAttributesSubTLVs);
     }
 
     /**
@@ -81,7 +82,7 @@
      *
      * @return llNodeAttributesSubTLVs linked list of Node Attributes Sub-TLVs
      */
-    public LinkedList<PcepValueType> getllNodeAttributesSubTLVs() {
+    public List<PcepValueType> getllNodeAttributesSubTLVs() {
         return llNodeAttributesSubTLVs;
     }
 
@@ -118,13 +119,13 @@
          * the size, if both are same then we should check for the subtlv objects otherwise
          * we should return false.
          */
-        if (obj instanceof TENodeAttributesTlv) {
+        if (obj instanceof NodeAttributesTlv) {
             int countObjSubTlv = 0;
             int countOtherSubTlv = 0;
             boolean isCommonSubTlv = true;
-            TENodeAttributesTlv other = (TENodeAttributesTlv) obj;
-            Iterator<PcepValueType> objListIterator = ((TENodeAttributesTlv) obj).llNodeAttributesSubTLVs.iterator();
-            countObjSubTlv = ((TENodeAttributesTlv) obj).llNodeAttributesSubTLVs.size();
+            NodeAttributesTlv other = (NodeAttributesTlv) obj;
+            Iterator<PcepValueType> objListIterator = ((NodeAttributesTlv) obj).llNodeAttributesSubTLVs.iterator();
+            countObjSubTlv = ((NodeAttributesTlv) obj).llNodeAttributesSubTLVs.size();
             countOtherSubTlv = other.llNodeAttributesSubTLVs.size();
             if (countObjSubTlv != countOtherSubTlv) {
                 return false;
@@ -173,17 +174,17 @@
     }
 
     /**
-     * Reads the channel buffer and returns object of TENodeAttributesTlv.
+     * Reads the channel buffer and returns object of NodeAttributesTlv.
      *
      * @param c input channel buffer
      * @param hLength length
-     * @return object of TENodeAttributesTlv
+     * @return object of NodeAttributesTlv
      * @throws PcepParseException if mandatory fields are missing
      */
     public static PcepValueType read(ChannelBuffer c, short hLength) throws PcepParseException {
 
         // Node Descriptor Sub-TLVs (variable)
-        LinkedList<PcepValueType> llNodeAttributesSubTLVs = new LinkedList<>();
+        List<PcepValueType> llNodeAttributesSubTLVs = new LinkedList<>();
 
         ChannelBuffer tempCb = c.readBytes(hLength);
 
@@ -194,27 +195,27 @@
             short length = tempCb.readShort();
             switch (hType) {
 
-            case NodeFlagBitsTlv.TYPE:
+            case NodeFlagBitsSubTlv.TYPE:
                 byte cValue = tempCb.readByte();
-                tlv = new NodeFlagBitsTlv(cValue);
+                tlv = new NodeFlagBitsSubTlv(cValue);
                 break;
-            case OpaqueNodeAttributeTlv.TYPE:
-                tlv = OpaqueNodeAttributeTlv.read(tempCb, length);
+            case OpaqueNodePropertiesSubTlv.TYPE:
+                tlv = OpaqueNodePropertiesSubTlv.read(tempCb, length);
                 break;
-            case NodeNameTlv.TYPE:
-                tlv = NodeNameTlv.read(tempCb, length);
+            case NodeNameSubTlv.TYPE:
+                tlv = NodeNameSubTlv.read(tempCb, length);
                 break;
-            case IsisAreaIdentifierTlv.TYPE:
-                tlv = IsisAreaIdentifierTlv.read(tempCb, length);
+            case IsisAreaIdentifierSubTlv.TYPE:
+                tlv = IsisAreaIdentifierSubTlv.read(tempCb, length);
                 break;
-            case IPv4TERouterIdOfLocalNodeTlv.TYPE:
+            case IPv4RouterIdOfLocalNodeSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new IPv4TERouterIdOfLocalNodeTlv(iValue);
+                tlv = new IPv4RouterIdOfLocalNodeSubTlv(iValue);
                 break;
-            case IPv6TERouterIdofLocalNodeTlv.TYPE:
-                byte[] ipv6Value = new byte[IPv6TERouterIdofLocalNodeTlv.VALUE_LENGTH];
-                tempCb.readBytes(ipv6Value, 0, IPv6TERouterIdofLocalNodeTlv.VALUE_LENGTH);
-                tlv = new IPv6TERouterIdofLocalNodeTlv(ipv6Value);
+            case IPv6RouterIdofLocalNodeSubTlv.TYPE:
+                byte[] ipv6Value = new byte[IPv6RouterIdofLocalNodeSubTlv.VALUE_LENGTH];
+                tempCb.readBytes(ipv6Value, 0, IPv6RouterIdofLocalNodeSubTlv.VALUE_LENGTH);
+                tlv = new IPv6RouterIdofLocalNodeSubTlv(ipv6Value);
                 break;
             default:
                 throw new PcepParseException("Unsupported Sub TLV type :" + hType);
@@ -236,7 +237,7 @@
 
             throw new PcepParseException("Sub Tlv parsing error. Extra bytes received.");
         }
-        return new TENodeAttributesTlv(llNodeAttributesSubTLVs);
+        return new NodeAttributesTlv(llNodeAttributesSubTLVs);
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NodeFlagBitsTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NodeFlagBitsSubTlv.java
similarity index 91%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NodeFlagBitsTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NodeFlagBitsSubTlv.java
index 019daa1..88b40f2 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NodeFlagBitsTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NodeFlagBitsSubTlv.java
@@ -26,7 +26,7 @@
 /**
  * Provide node Flags bits.
  */
-public class NodeFlagBitsTlv implements PcepValueType {
+public class NodeFlagBitsSubTlv implements PcepValueType {
 
     /* Reference :[I-D.ietf-idr- ls-distribution] /3.3.1.1
      * 0                   1                   2                   3
@@ -38,9 +38,9 @@
      +-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(NodeFlagBitsTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(NodeFlagBitsSubTlv.class);
 
-    public static final short TYPE = 14;
+    public static final short TYPE = 13;
     public static final short LENGTH = 1;
     public static final int SET = 1;
     public static final byte OFLAG_SET = (byte) 0x80;
@@ -60,7 +60,7 @@
      *
      * @param rawValue of Node Flag Bits TLV
      */
-    public NodeFlagBitsTlv(byte rawValue) {
+    public NodeFlagBitsSubTlv(byte rawValue) {
         this.rawValue = rawValue;
         isRawValueSet = true;
         this.bOFlag = (rawValue & OFLAG_SET) == OFLAG_SET;
@@ -77,7 +77,7 @@
      * @param bEFlag E-flag
      * @param bBFlag B-flag
      */
-    public NodeFlagBitsTlv(boolean bOFlag, boolean bTFlag, boolean bEFlag, boolean bBFlag) {
+    public NodeFlagBitsSubTlv(boolean bOFlag, boolean bTFlag, boolean bEFlag, boolean bBFlag) {
         this.bOFlag = bOFlag;
         this.bTFlag = bTFlag;
         this.bEFlag = bEFlag;
@@ -92,8 +92,8 @@
      * @param raw of Node Flag Bits TLV
      * @return new object of NodeFlagBitsTlv
      */
-    public static NodeFlagBitsTlv of(final byte raw) {
-        return new NodeFlagBitsTlv(raw);
+    public static NodeFlagBitsSubTlv of(final byte raw) {
+        return new NodeFlagBitsSubTlv(raw);
     }
 
     /**
@@ -170,8 +170,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof NodeFlagBitsTlv) {
-            NodeFlagBitsTlv other = (NodeFlagBitsTlv) obj;
+        if (obj instanceof NodeFlagBitsSubTlv) {
+            NodeFlagBitsSubTlv other = (NodeFlagBitsSubTlv) obj;
             if (isRawValueSet) {
                 return Objects.equals(this.rawValue, other.rawValue);
             } else {
@@ -216,7 +216,7 @@
      */
     public static PcepValueType read(ChannelBuffer c) {
 
-        return NodeFlagBitsTlv.of(c.readByte());
+        return NodeFlagBitsSubTlv.of(c.readByte());
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NodeNameTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NodeNameSubTlv.java
similarity index 89%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NodeNameTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NodeNameSubTlv.java
index e535a35..33ab692 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NodeNameTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/NodeNameSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provide the name for the node.
  */
-public class NodeNameTlv implements PcepValueType {
+public class NodeNameSubTlv implements PcepValueType {
 
     /* reference :[I-D.ietf-idr-ls-distribution]/3.3.1.3
      *  0                   1                   2                   3
@@ -39,9 +39,9 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(NodeNameTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(NodeNameSubTlv.class);
 
-    public static final short TYPE = 1007; //TODO:check and change TBD23
+    public static final short TYPE = 15;
     public final short hLength;
 
     private final byte[] rawValue;
@@ -52,7 +52,7 @@
      * @param rawValue of Node Name
      * @param hLength length
      */
-    public NodeNameTlv(byte[] rawValue, short hLength) {
+    public NodeNameSubTlv(byte[] rawValue, short hLength) {
         log.debug("NodeNameTlv");
         this.rawValue = rawValue;
         if (0 == hLength) {
@@ -69,8 +69,8 @@
      * @param hLength length
      * @return new object of Node Name Tlv
      */
-    public static NodeNameTlv of(final byte[] raw, short hLength) {
-        return new NodeNameTlv(raw, hLength);
+    public static NodeNameSubTlv of(final byte[] raw, short hLength) {
+        return new NodeNameSubTlv(raw, hLength);
     }
 
     /**
@@ -107,8 +107,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof NodeNameTlv) {
-            NodeNameTlv other = (NodeNameTlv) obj;
+        if (obj instanceof NodeNameSubTlv) {
+            NodeNameSubTlv other = (NodeNameSubTlv) obj;
             return Objects.equals(this.rawValue, other.rawValue);
         }
         return false;
@@ -133,7 +133,7 @@
     public static PcepValueType read(ChannelBuffer c, short hLength) {
         byte[] iNodeName = new byte[hLength];
         c.readBytes(iNodeName, 0, hLength);
-        return new NodeNameTlv(iNodeName, hLength);
+        return new NodeNameSubTlv(iNodeName, hLength);
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OpaqueLinkAttributeTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OpaqueLinkAttributeSubTlv.java
similarity index 87%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OpaqueLinkAttributeTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OpaqueLinkAttributeSubTlv.java
index 1af332e..0707cbd 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OpaqueLinkAttributeTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OpaqueLinkAttributeSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides Opaque Link Attribute.
  */
-public class OpaqueLinkAttributeTlv implements PcepValueType {
+public class OpaqueLinkAttributeSubTlv implements PcepValueType {
 
     /*
      * TLV format.
@@ -41,9 +41,9 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(OpaqueLinkAttributeTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(OpaqueLinkAttributeSubTlv.class);
 
-    public static final short TYPE = 1097; //TODO:NEED TO HANDLE TDB42
+    public static final short TYPE = 31;
     private final short hLength;
 
     private final byte[] rawValue;
@@ -54,7 +54,7 @@
      * @param rawValue of Opaque Link Attribute
      * @param hLength length
      */
-    public OpaqueLinkAttributeTlv(byte[] rawValue, short hLength) {
+    public OpaqueLinkAttributeSubTlv(byte[] rawValue, short hLength) {
         log.debug("OpaqueLinkAttributeTlv");
         this.rawValue = rawValue;
         if (0 == hLength) {
@@ -71,8 +71,8 @@
      * @param hLength length
      * @return new object of OpaqueLinkAttributeTlv
      */
-    public static OpaqueLinkAttributeTlv of(final byte[] raw, short hLength) {
-        return new OpaqueLinkAttributeTlv(raw, hLength);
+    public static OpaqueLinkAttributeSubTlv of(final byte[] raw, short hLength) {
+        return new OpaqueLinkAttributeSubTlv(raw, hLength);
     }
 
     /**
@@ -108,8 +108,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof OpaqueLinkAttributeTlv) {
-            OpaqueLinkAttributeTlv other = (OpaqueLinkAttributeTlv) obj;
+        if (obj instanceof OpaqueLinkAttributeSubTlv) {
+            OpaqueLinkAttributeSubTlv other = (OpaqueLinkAttributeSubTlv) obj;
             return Objects.equals(this.rawValue, other.rawValue);
         }
         return false;
@@ -134,7 +134,7 @@
     public static PcepValueType read(ChannelBuffer c, short hLength) {
         byte[] iOpaqueValue = new byte[hLength];
         c.readBytes(iOpaqueValue, 0, hLength);
-        return new OpaqueLinkAttributeTlv(iOpaqueValue, hLength);
+        return new OpaqueLinkAttributeSubTlv(iOpaqueValue, hLength);
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OpaqueNodeAttributeTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OpaqueNodePropertiesSubTlv.java
similarity index 87%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OpaqueNodeAttributeTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OpaqueNodePropertiesSubTlv.java
index 26e8c8b..83b0b39 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OpaqueNodeAttributeTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/OpaqueNodePropertiesSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides Opaque node attributes.
  */
-public class OpaqueNodeAttributeTlv implements PcepValueType {
+public class OpaqueNodePropertiesSubTlv implements PcepValueType {
     /*
      * Reference [I-D.ietf-idr-Properties ls-distribution] /3.3.1.5
      * 0                   1                   2                   3
@@ -39,9 +39,9 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(OpaqueNodeAttributeTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(OpaqueNodePropertiesSubTlv.class);
 
-    public static final short TYPE = 1001;
+    public static final short TYPE = 14;
     private final short hLength;
 
     private final byte[] rawValue;
@@ -52,7 +52,7 @@
      * @param rawValue Opaque Node Attribute
      * @param hLength length
      */
-    public OpaqueNodeAttributeTlv(byte[] rawValue, short hLength) {
+    public OpaqueNodePropertiesSubTlv(byte[] rawValue, short hLength) {
 
         this.rawValue = rawValue;
         if (0 == hLength) {
@@ -69,8 +69,8 @@
      * @param hLength length
      * @return new object of Opaque Node Attribute Tlv
      */
-    public static OpaqueNodeAttributeTlv of(final byte[] raw, short hLength) {
-        return new OpaqueNodeAttributeTlv(raw, hLength);
+    public static OpaqueNodePropertiesSubTlv of(final byte[] raw, short hLength) {
+        return new OpaqueNodePropertiesSubTlv(raw, hLength);
     }
 
     /**
@@ -107,8 +107,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof OpaqueNodeAttributeTlv) {
-            OpaqueNodeAttributeTlv other = (OpaqueNodeAttributeTlv) obj;
+        if (obj instanceof OpaqueNodePropertiesSubTlv) {
+            OpaqueNodePropertiesSubTlv other = (OpaqueNodePropertiesSubTlv) obj;
             return Objects.equals(this.rawValue, other.rawValue);
         }
         return false;
@@ -133,7 +133,7 @@
     public static PcepValueType read(ChannelBuffer c, short hLength) {
         byte[] iOpaqueValue = new byte[hLength];
         c.readBytes(iOpaqueValue, 0, hLength);
-        return new OpaqueNodeAttributeTlv(iOpaqueValue, hLength);
+        return new OpaqueNodePropertiesSubTlv(iOpaqueValue, hLength);
     }
 
     @Override
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
index d60eb60..79527c4 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
@@ -40,7 +40,7 @@
 
     protected static final Logger log = LoggerFactory.getLogger(OspfAreaIdSubTlv.class);
 
-    public static final short TYPE = 600; //TODD:change this TBD12
+    public static final short TYPE = 3;
     public static final short LENGTH = 4;
 
     private final int rawValue;
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepRsvpUserErrorSpec.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepRsvpUserErrorSpec.java
index 4a9357d..b42d135 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepRsvpUserErrorSpec.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepRsvpUserErrorSpec.java
@@ -169,9 +169,9 @@
             int iValue = 0;
             //short hLength = cb.readShort();
             switch (hType) {
-            case AutonomousSystemTlv.TYPE:
+            case AutonomousSystemSubTlv.TYPE:
                 iValue = cb.readInt();
-                tlv = new AutonomousSystemTlv(iValue);
+                tlv = new AutonomousSystemSubTlv(iValue);
                 break;
             default:
                 throw new PcepParseException("Unsupported Sub TLV type :" + hType);
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/RemoteNodeDescriptorsTlv.java
similarity index 79%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RemoteNodeDescriptorsTlv.java
index cabd709..3912600 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/RemoteNodeDescriptorsTlv.java
@@ -17,6 +17,7 @@
 
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.ListIterator;
 import java.util.Objects;
 
@@ -31,10 +32,9 @@
 /**
  * Provides Remote TE Node Descriptors TLV.
  */
-public class RemoteTENodeDescriptorsTlv implements PcepValueType {
+public class RemoteNodeDescriptorsTlv implements PcepValueType {
 
-    /* Reference :PCEP Extension for Transporting TE Data
-        draft-dhodylee-pce-pcep-te-data-extn-02
+    /* Reference : draft-dhodylee-pce-pcep-ls-01, section 9.2.3.
      *
           0                   1                   2                   3
           0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
@@ -47,32 +47,32 @@
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(RemoteTENodeDescriptorsTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(RemoteNodeDescriptorsTlv.class);
 
-    public static final short TYPE = 1003; //TODD:change this TBD9
+    public static final short TYPE = (short) 65283;
     public short hLength;
 
     public static final int TLV_HEADER_LENGTH = 4;
     // Node Descriptor Sub-TLVs (variable)
-    private LinkedList<PcepValueType> llRemoteTENodeDescriptorSubTLVs;
+    private List<PcepValueType> llRemoteTENodeDescriptorSubTLVs;
 
     /**
      * Constructor to initialize llRemoteTENodeDescriptorSubTLVs.
      *
-     * @param llRemoteTENodeDescriptorSubTLVs LinkedList of PcepValueType
+     * @param llRemoteTENodeDescriptorSubTLVs List of PcepValueType
      */
-    public RemoteTENodeDescriptorsTlv(LinkedList<PcepValueType> llRemoteTENodeDescriptorSubTLVs) {
+    public RemoteNodeDescriptorsTlv(List<PcepValueType> llRemoteTENodeDescriptorSubTLVs) {
         this.llRemoteTENodeDescriptorSubTLVs = llRemoteTENodeDescriptorSubTLVs;
     }
 
     /**
      * Returns object of Remote TE Node Descriptors TLV.
      *
-     * @param llRemoteTENodeDescriptorSubTLVs LinkedList of PcepValueType
-     * @return object of RemoteTENodeDescriptorsTLV
+     * @param llRemoteTENodeDescriptorSubTLVs List of PcepValueType
+     * @return object of RemoteNodeDescriptorsTlv
      */
-    public static RemoteTENodeDescriptorsTlv of(final LinkedList<PcepValueType> llRemoteTENodeDescriptorSubTLVs) {
-        return new RemoteTENodeDescriptorsTlv(llRemoteTENodeDescriptorSubTLVs);
+    public static RemoteNodeDescriptorsTlv of(final List<PcepValueType> llRemoteTENodeDescriptorSubTLVs) {
+        return new RemoteNodeDescriptorsTlv(llRemoteTENodeDescriptorSubTLVs);
     }
 
     /**
@@ -80,7 +80,7 @@
      *
      * @return llRemoteTENodeDescriptorSubTLVs
      */
-    public LinkedList<PcepValueType> getllRemoteTENodeDescriptorSubTLVs() {
+    public List<PcepValueType> getllRemoteTENodeDescriptorSubTLVs() {
         return 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 RemoteNodeDescriptorsTlv) {
             int countObjSubTlv = 0;
             int countOtherSubTlv = 0;
             boolean isCommonSubTlv = true;
-            RemoteTENodeDescriptorsTlv other = (RemoteTENodeDescriptorsTlv) obj;
-            Iterator<PcepValueType> objListIterator = ((RemoteTENodeDescriptorsTlv) obj).llRemoteTENodeDescriptorSubTLVs
+            RemoteNodeDescriptorsTlv other = (RemoteNodeDescriptorsTlv) obj;
+            Iterator<PcepValueType> objListIterator = ((RemoteNodeDescriptorsTlv) obj).llRemoteTENodeDescriptorSubTLVs
                     .iterator();
-            countObjSubTlv = ((RemoteTENodeDescriptorsTlv) obj).llRemoteTENodeDescriptorSubTLVs.size();
+            countObjSubTlv = ((RemoteNodeDescriptorsTlv) obj).llRemoteTENodeDescriptorSubTLVs.size();
             countOtherSubTlv = other.llRemoteTENodeDescriptorSubTLVs.size();
             if (countObjSubTlv != countOtherSubTlv) {
                 return false;
@@ -182,13 +182,13 @@
      *
      * @param c input channel buffer
      * @param length length of buffer
-     * @return object of RemoteTENodeDescriptorsTLV
+     * @return object of RemoteNodeDescriptorsTlv
      * @throws PcepParseException if mandatory fields are missing
      */
     public static PcepValueType read(ChannelBuffer c, short length) throws PcepParseException {
 
         // Node Descriptor Sub-TLVs (variable)
-        LinkedList<PcepValueType> llRemoteTENodeDescriptorSubTLVs = new LinkedList<>();
+        List<PcepValueType> llRemoteTENodeDescriptorSubTLVs = new LinkedList<>();
 
         ChannelBuffer tempCb = c.readBytes(length);
 
@@ -200,20 +200,20 @@
             short hLength = tempCb.readShort();
             switch (hType) {
 
-            case AutonomousSystemTlv.TYPE:
+            case AutonomousSystemSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new AutonomousSystemTlv(iValue);
+                tlv = new AutonomousSystemSubTlv(iValue);
                 break;
-            case BgpLsIdentifierTlv.TYPE:
+            case BgpLsIdentifierSubTlv.TYPE:
                 iValue = tempCb.readInt();
-                tlv = new BgpLsIdentifierTlv(iValue);
+                tlv = new BgpLsIdentifierSubTlv(iValue);
                 break;
             case OspfAreaIdSubTlv.TYPE:
                 iValue = tempCb.readInt();
                 tlv = new OspfAreaIdSubTlv(iValue);
                 break;
-            case RouterIDSubTlv.TYPE:
-                tlv = RouterIDSubTlv.read(tempCb, hLength);
+            case IgpRouterIdSubTlv.TYPE:
+                tlv = IgpRouterIdSubTlv.read(tempCb, hLength);
                 break;
 
             default:
@@ -236,7 +236,7 @@
 
             throw new PcepParseException("Sub Tlv parsing error. Extra bytes received.");
         }
-        return new RemoteTENodeDescriptorsTlv(llRemoteTENodeDescriptorSubTLVs);
+        return new RemoteNodeDescriptorsTlv(llRemoteTENodeDescriptorSubTLVs);
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RoutingUniverseTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RoutingUniverseTlv.java
index 924a3a3..f5c9a04 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RoutingUniverseTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/RoutingUniverseTlv.java
@@ -52,7 +52,7 @@
 
     protected static final Logger log = LoggerFactory.getLogger(RoutingUniverseTlv.class);
 
-    public static final short TYPE = 14; // TODO:need to change TBD7
+    public static final short TYPE = (short) 65281;
     public static final short LENGTH = 8;
 
     private final long rawValue;
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SharedRiskLinkGroupTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SharedRiskLinkGroupSubTlv.java
similarity index 88%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SharedRiskLinkGroupTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SharedRiskLinkGroupSubTlv.java
index e855a52..a7c1b81 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SharedRiskLinkGroupTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SharedRiskLinkGroupSubTlv.java
@@ -28,7 +28,7 @@
 /**
  * Provides SharedRiskLinkGroupTlv.
  */
-public class SharedRiskLinkGroupTlv implements PcepValueType {
+public class SharedRiskLinkGroupSubTlv implements PcepValueType {
 
     /*
      * Reference :[I-D.ietf-idr- Group ls-distribution] /3.3.2.5
@@ -46,9 +46,9 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(SharedRiskLinkGroupTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(SharedRiskLinkGroupSubTlv.class);
 
-    public static final short TYPE = 1096; //TODO:NEED TO HANDLE TDB41
+    public static final short TYPE = 30;
 
     private final short hLength;
 
@@ -60,7 +60,7 @@
      * @param srlgValue Shared Risk Link Group Value
      * @param hLength length
      */
-    public SharedRiskLinkGroupTlv(int[] srlgValue, short hLength) {
+    public SharedRiskLinkGroupSubTlv(int[] srlgValue, short hLength) {
         this.srlgValue = srlgValue;
         if (0 == hLength) {
             this.hLength = (short) ((srlgValue.length) * 4);
@@ -76,8 +76,8 @@
      * @param hLength length
      * @return object of SharedRiskLinkGroupTlv
      */
-    public static SharedRiskLinkGroupTlv of(final int[] raw, short hLength) {
-        return new SharedRiskLinkGroupTlv(raw, hLength);
+    public static SharedRiskLinkGroupSubTlv of(final int[] raw, short hLength) {
+        return new SharedRiskLinkGroupSubTlv(raw, hLength);
     }
 
     /**
@@ -114,8 +114,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof SharedRiskLinkGroupTlv) {
-            SharedRiskLinkGroupTlv other = (SharedRiskLinkGroupTlv) obj;
+        if (obj instanceof SharedRiskLinkGroupSubTlv) {
+            SharedRiskLinkGroupSubTlv other = (SharedRiskLinkGroupSubTlv) obj;
             return Arrays.equals(this.srlgValue, other.srlgValue);
         }
         return false;
@@ -145,7 +145,7 @@
         for (int i = 0; i < iLength; i++) {
             iSharedRiskLinkGroup[i] = c.readInt();
         }
-        return new SharedRiskLinkGroupTlv(iSharedRiskLinkGroup, hLength);
+        return new SharedRiskLinkGroupSubTlv(iSharedRiskLinkGroup, hLength);
     }
 
 
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TEDefaultMetricTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TEDefaultMetricSubTlv.java
similarity index 86%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TEDefaultMetricTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TEDefaultMetricSubTlv.java
index 4429d22..c63ba64 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TEDefaultMetricTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/TEDefaultMetricSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides TEDefaultMetricTlv.
  */
-public class TEDefaultMetricTlv implements PcepValueType {
+public class TEDefaultMetricSubTlv implements PcepValueType {
 
     /*
      * Reference :| [I-D.ietf-idr- ls-distribution] /3.3.2.3
@@ -40,9 +40,9 @@
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
      */
-    protected static final Logger log = LoggerFactory.getLogger(TEDefaultMetricTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(TEDefaultMetricSubTlv.class);
 
-    public static final short TYPE = 13400; //TDB37
+    public static final short TYPE = 26;
     public static final short LENGTH = 4;
 
     private final int rawValue;
@@ -52,7 +52,7 @@
      *
      * @param rawValue TE Default Link Metric
      */
-    public TEDefaultMetricTlv(int rawValue) {
+    public TEDefaultMetricSubTlv(int rawValue) {
         this.rawValue = rawValue;
     }
 
@@ -62,8 +62,8 @@
      * @param raw raw value
      * @return object of TEDefaultMetricTlv.
      */
-    public static TEDefaultMetricTlv of(final int raw) {
-        return new TEDefaultMetricTlv(raw);
+    public static TEDefaultMetricSubTlv of(final int raw) {
+        return new TEDefaultMetricSubTlv(raw);
     }
 
     /**
@@ -100,8 +100,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof TEDefaultMetricTlv) {
-            TEDefaultMetricTlv other = (TEDefaultMetricTlv) obj;
+        if (obj instanceof TEDefaultMetricSubTlv) {
+            TEDefaultMetricSubTlv other = (TEDefaultMetricSubTlv) obj;
             return Objects.equals(this.rawValue, other.rawValue);
         }
         return false;
@@ -122,8 +122,8 @@
      * @param c input channel buffer
      * @return object of TEDefaultMetricTlv
      */
-    public static TEDefaultMetricTlv read(ChannelBuffer c) {
-        return TEDefaultMetricTlv.of(c.readInt());
+    public static TEDefaultMetricSubTlv read(ChannelBuffer c) {
+        return TEDefaultMetricSubTlv.of(c.readInt());
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/UnreservedBandwidthTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/UnreservedBandwidthSubTlv.java
similarity index 85%
rename from protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/UnreservedBandwidthTlv.java
rename to protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/UnreservedBandwidthSubTlv.java
index d44bf82..859199e 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/UnreservedBandwidthTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/UnreservedBandwidthSubTlv.java
@@ -27,7 +27,7 @@
 /**
  * Provides Unreserved Bandwidth Tlv.
  */
-public class UnreservedBandwidthTlv implements PcepValueType {
+public class UnreservedBandwidthSubTlv implements PcepValueType {
 
     /* Reference :[RFC5305]/3.6
      0                   1                   2                   3
@@ -39,9 +39,9 @@
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(UnreservedBandwidthTlv.class);
+    protected static final Logger log = LoggerFactory.getLogger(UnreservedBandwidthSubTlv.class);
 
-    public static final short TYPE = 11; //TDB36
+    public static final short TYPE = 25;
     public static final short LENGTH = 4;
 
     private final int rawValue;
@@ -51,7 +51,7 @@
      *
      * @param rawValue Unreserved Bandwidth
      */
-    public UnreservedBandwidthTlv(int rawValue) {
+    public UnreservedBandwidthSubTlv(int rawValue) {
         this.rawValue = rawValue;
     }
 
@@ -61,8 +61,8 @@
      * @param raw as Unreserved Bandwidth
      * @return object of UnreservedBandwidthTlv
      */
-    public static UnreservedBandwidthTlv of(final int raw) {
-        return new UnreservedBandwidthTlv(raw);
+    public static UnreservedBandwidthSubTlv of(final int raw) {
+        return new UnreservedBandwidthSubTlv(raw);
     }
 
     /**
@@ -99,8 +99,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof UnreservedBandwidthTlv) {
-            UnreservedBandwidthTlv other = (UnreservedBandwidthTlv) obj;
+        if (obj instanceof UnreservedBandwidthSubTlv) {
+            UnreservedBandwidthSubTlv other = (UnreservedBandwidthSubTlv) obj;
             return Objects.equals(this.rawValue, other.rawValue);
         }
         return false;
@@ -121,8 +121,8 @@
      * @param c input channel buffer
      * @return object of UnreservedBandwidthTlv
      */
-    public static UnreservedBandwidthTlv read(ChannelBuffer c) {
-        return UnreservedBandwidthTlv.of(c.readInt());
+    public static UnreservedBandwidthSubTlv read(ChannelBuffer c) {
+        return UnreservedBandwidthSubTlv.of(c.readInt());
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepCloseMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepCloseMsgTest.java
index 33c00dd..e51b0ce 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepCloseMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepCloseMsgTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -30,7 +31,7 @@
      * Common header, reason to close.
      */
     @Test
-    public void closeMessageTest1() throws PcepParseException {
+    public void closeMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] closeMsg = new byte[] {0x20, 0x07, 0x00, 0x0C, 0x0f, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02 };
 
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepErrorMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepErrorMsgTest.java
index 234cea6..71655b5 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepErrorMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepErrorMsgTest.java
@@ -19,6 +19,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -33,11 +34,11 @@
     /**
      * This test case checks for
      * PCEP-ERROR Object, OPEN Object (STATEFUL-PCE-CAPABILITY, GMPLS-CAPABILITY-TLV,
-     * PCECC-CAPABILITY-TLV, TED Capability TLV)
+     * PCECC-CAPABILITY-TLV, LS Capability TLV)
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest1() throws PcepParseException {
+    public void errorMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x34, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -46,7 +47,7 @@
                 0x00, 0x10, 0x00, 0x04, // STATEFUL-PCE-CAPABILITY
                 0x00, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x04, // GMPLS-CAPABILITY-TLV
                 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, // PCECC-CAPABILITY-TLV
-                0x00, 0x00, 0x00, 0x03, 0x00, (byte) 0x84, 0x00, 0x04, // TED Capability TLV
+                0x00, 0x00, 0x00, 0x03, (byte) 0xFF, (byte) 0x00, 0x00, 0x04, // LS Capability TLV
                 0x00, 0x00, 0x00, 0x00};
 
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -72,11 +73,11 @@
     /**
      * This test case checks for
      * PCEP-ERROR Object, PCEP-ERROR Object, OPEN Object (STATEFUL-PCE-CAPABILITY, GMPLS-CAPABILITY-TLV,
-     * PCECC-CAPABILITY-TLV, TED Capability TLV)
+     * PCECC-CAPABILITY-TLV, LS Capability TLV)
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest2() throws PcepParseException {
+    public void errorMessageTest2() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x3C, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -86,7 +87,7 @@
                 0x00, 0x10, 0x00, 0x04, // STATEFUL-PCE-CAPABILITY
                 0x00, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x04, // GMPLS-CAPABILITY-TLV
                 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, // PCECC-CAPABILITY-TLV
-                0x00, 0x00, 0x00, 0x03, 0x00, (byte) 0x84, 0x00, 0x04, // TED Capability TLV
+                0x00, 0x00, 0x00, 0x03, (byte) 0xFF, (byte) 0x00, 0x00, 0x04, // LS Capability TLV
                 0x00, 0x00, 0x00, 0x00};
 
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -115,7 +116,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest3() throws PcepParseException {
+    public void errorMessageTest3() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x34, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -152,7 +153,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest4() throws PcepParseException {
+    public void errorMessageTest4() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x2c, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -188,7 +189,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest5() throws PcepParseException {
+    public void errorMessageTest5() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x24, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -223,7 +224,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest6() throws PcepParseException {
+    public void errorMessageTest6() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x1C, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -257,7 +258,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest7() throws PcepParseException {
+    public void errorMessageTest7() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x14, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -290,7 +291,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest8() throws PcepParseException {
+    public void errorMessageTest8() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x20, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -323,7 +324,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest9() throws PcepParseException {
+    public void errorMessageTest9() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x14, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
@@ -355,7 +356,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest10() throws PcepParseException {
+    public void errorMessageTest10() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x14, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
@@ -383,15 +384,16 @@
 
     /**
      * This test case checks for
-     * TE Object, PCEP-ERROR Object
+     * LS Object, PCEP-ERROR Object
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest11() throws PcepParseException {
+    public void errorMessageTest11() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x18, // common header
-                0x65, 0x13, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
+        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x1C, // common header
+                (byte) 0xE0, 0x13, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, // LS-ID
+                0x00, 0x00, 0x00, 0x10,
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
                 0x00, 0x00, 0x01, 0x01};
 
@@ -420,7 +422,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest12() throws PcepParseException {
+    public void errorMessageTest12() throws PcepParseException, PcepOutOfBoundMessageException {
 
         //RP Object, PCEP-ERROR Object
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x18, // common header
@@ -453,7 +455,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest13() throws PcepParseException {
+    public void errorMessageTest13() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x24, // common header
                 0x02, 0x10, 0x00, 0x0C, // RP Object Header
@@ -482,17 +484,21 @@
 
     /**
      * This test case checks for
-     * TE Object, TE Object, PCEP-ERROR Object
+     * LS Object, LS Object, PCEP-ERROR Object
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest14() throws PcepParseException {
+    public void errorMessageTest14() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x24, // common header
-                0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, // TE-ID
+        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x2C, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, // LS-ID
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x10,
+                (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, // LS-ID
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x11,
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
                 0x00, 0x00, 0x01, 0x01};
 
@@ -517,16 +523,19 @@
 
     /**
      * This test case checks for
-     * PCEP-ERROR Object, TE Object, PCEP-ERROR Object
+     * PCEP-ERROR Object, LS Object, PCEP-ERROR Object
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest15() throws PcepParseException {
+    public void errorMessageTest15() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x20, // common header
+        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x24, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
-                0x00, 0x00, 0x01, 0x01, 0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
+                0x00, 0x00, 0x01, 0x01,
+                (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, // LS-ID
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x10,
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
                 0x00, 0x00, 0x01, 0x03};
 
@@ -555,7 +564,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest16() throws PcepParseException {
+    public void errorMessageTest16() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x2C, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
@@ -585,18 +594,23 @@
 
     /**
      * This test case checks for
-     * PCEP-ERROR Object, TE Object, TE Object, PCEP-ERROR Object
+     * PCEP-ERROR Object, LS Object, LS Object, PCEP-ERROR Object
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest17() throws PcepParseException {
+    public void errorMessageTest17() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x2C, // common header
+        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x34, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
-                0x00, 0x00, 0x01, 0x01, 0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, // TE-ID
+                0x00, 0x00, 0x01, 0x01,
+                (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, // LS-ID
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x10,
+                (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, // LS-ID
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x11,
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
                 0x00, 0x00, 0x01, 0x03};
 
@@ -625,7 +639,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest18() throws PcepParseException {
+    public void errorMessageTest18() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x3C, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
@@ -657,21 +671,28 @@
 
     /**
      * This test case checks for
-     * PCEP-ERROR Object, PCEP-ERROR Object, TE Object, TE Object, PCEP-ERROR Object, PCEP-ERROR Object
+     * PCEP-ERROR Object, PCEP-ERROR Object, LS Object, LS Object, PCEP-ERROR Object, PCEP-ERROR Object
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest19() throws PcepParseException {
+    public void errorMessageTest19() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x3C, // common header
+        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x44, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
-                0x00, 0x00, 0x01, 0x01, 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
-                0x00, 0x00, 0x01, 0x03, 0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, // TE-ID
+                0x00, 0x00, 0x01, 0x01,
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
-                0x00, 0x00, 0x01, 0x04, 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
+                0x00, 0x00, 0x01, 0x03,
+                (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, // LS-ID
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x10,
+                (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, // LS-ID
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x11,
+                0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
+                0x00, 0x00, 0x01, 0x04, // PCERR Object Header
+                0x0D, 0x10, 0x00, 0x08,
                 0x00, 0x00, 0x01, 0x06};
 
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -696,20 +717,20 @@
     /**
      * This test case checks for
      * PCEP-ERROR Object, RP Object, RP Object, PCEP-ERROR Object, PCEP-ERROR Object,
-     * TE Object, PCEP-ERROR Object
+     * LS Object, PCEP-ERROR Object
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest20() throws PcepParseException {
+    public void errorMessageTest20() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x48, // common header
+        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x4C, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
                 0x00, 0x00, 0x01, 0x01, 0x02, 0x10, 0x00, 0x0C, // RP Object Header
                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x10, 0x00, 0x0C, // RP Object Header
                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
                 0x00, 0x00, 0x01, 0x04, 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
-                0x00, 0x00, 0x01, 0x06, 0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
+                0x00, 0x00, 0x01, 0x06, (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
                 0x00, 0x00, 0x01, 0x06};
 
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgExtTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgExtTest.java
index 9341f32..dad53ad 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgExtTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgExtTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -32,11 +33,11 @@
      * END-POINTS, ERO, LSPA, BANDWIDTH, METRIC-LIST objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest1() throws PcepParseException {
+    public void initiateMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
-         * StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC-LIST.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
+        // StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC-LIST.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0xA4,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -88,11 +89,11 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest2() throws PcepParseException {
+    public void initiateMessageTest2() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
-         * StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
+        // StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0xA8,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -143,11 +144,11 @@
      * ERO, LSPA, BANDWIDTH objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest3() throws PcepParseException {
+    public void initiateMessageTest3() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
-         * StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA, BANDWIDTH.
-         */
+        // SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
+        // StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA, BANDWIDTH.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x8c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -197,11 +198,11 @@
      * END-POINTS, ERO, LSPA objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest4() throws PcepParseException {
+    public void initiateMessageTest4() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
-         * StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
+        // StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x84,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -250,11 +251,11 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest5() throws PcepParseException {
+    public void initiateMessageTest5() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
-         * StatefulLspErrorCodeTlv), END-POINTS, ERO, LSPA.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
+        // StatefulLspErrorCodeTlv), END-POINTS, ERO, LSPA.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x84,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -301,11 +302,11 @@
      * BANDWIDTH OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest6() throws PcepParseException {
+    public void initiateMessageTest6() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
-         * StatefulLspErrorCodeTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
+        // StatefulLspErrorCodeTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x8c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -353,11 +354,11 @@
      * LSPA, BANDWIDTH, METRIC OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest7() throws PcepParseException {
+    public void initiateMessageTest7() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
-         * StatefulLspErrorCodeTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
+        // StatefulLspErrorCodeTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x98,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -406,11 +407,11 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest8() throws PcepParseException {
+    public void initiateMessageTest8() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
-         * END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
+        // END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x90,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -458,11 +459,11 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest9() throws PcepParseException {
+    public void initiateMessageTest9() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
-         * END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
+        // END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x84,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -508,11 +509,11 @@
      * SymbolicPathNameTlv), END-POINTS, ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest10() throws PcepParseException {
+    public void initiateMessageTest10() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
-         * END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
+        // END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -556,11 +557,11 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest11() throws PcepParseException {
+    public void initiateMessageTest11() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
-         * END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
+        // END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x7C,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -604,11 +605,11 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest12() throws PcepParseException {
+    public void initiateMessageTest12() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
-         * END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
+        // END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x78,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -653,11 +654,11 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest13() throws PcepParseException {
+    public void initiateMessageTest13() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
-         * END-POINTS, ERO, LSPA, BANDWIDTH , METRIC OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
+        // END-POINTS, ERO, LSPA, BANDWIDTH , METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x84,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -702,11 +703,11 @@
      * END-POINTS, ERO, LSPA, BANDWIDTH , METRIC OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest14() throws PcepParseException {
+    public void initiateMessageTest14() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
-         * END-POINTS, ERO, LSPA, BANDWIDTH , METRIC OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
+        // END-POINTS, ERO, LSPA, BANDWIDTH , METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x7c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -750,11 +751,11 @@
      * END-POINTS, ERO, LSPA, BANDWIDTH OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest15() throws PcepParseException {
+    public void initiateMessageTest15() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
-         * END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
+        // END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -797,11 +798,11 @@
      * END-POINTS, ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest16() throws PcepParseException {
+    public void initiateMessageTest16() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
-         * END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
+        // END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -843,10 +844,10 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest17() throws PcepParseException {
+    public void initiateMessageTest17() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -887,10 +888,10 @@
      * BANDWIDTH OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest18() throws PcepParseException {
+    public void initiateMessageTest18() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03,
@@ -933,10 +934,10 @@
      * BANDWIDTH, METRIC OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest19() throws PcepParseException {
+    public void initiateMessageTest19() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x74,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -979,10 +980,10 @@
      * BANDWIDTH, METRIC OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest20() throws PcepParseException {
+    public void initiateMessageTest20() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -1024,10 +1025,10 @@
      * BANDWIDTH OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest21() throws PcepParseException {
+    public void initiateMessageTest21() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -1068,10 +1069,10 @@
      * LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest22() throws PcepParseException {
+    public void initiateMessageTest22() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x50,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -1111,10 +1112,10 @@
      * END-POINTS, ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest23() throws PcepParseException {
+    public void initiateMessageTest23() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1155,10 +1156,10 @@
      * END-POINTS, ERO, LSPA BANDWIDTH OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest25() throws PcepParseException {
+    public void initiateMessageTest25() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1200,11 +1201,11 @@
      * ERO, LSPA, BANDWIDTH, METRIC OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest26() throws PcepParseException {
+    public void initiateMessageTest26() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv), END-POINTS,
-         * ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv), END-POINTS,
+        // ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x6C,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1247,10 +1248,10 @@
      * BANDWIDTH, METRIC OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest27() throws PcepParseException {
+    public void initiateMessageTest27() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1291,10 +1292,10 @@
      * LSPA, BANDWIDTH OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest28() throws PcepParseException {
+    public void initiateMessageTest28() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1334,10 +1335,10 @@
      * END-POINTS, ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest29() throws PcepParseException {
+    public void initiateMessageTest29() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x4C,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1376,10 +1377,10 @@
      * END-POINTS, ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest30() throws PcepParseException {
+    public void initiateMessageTest30() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x5C,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1419,10 +1420,10 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest31() throws PcepParseException {
+    public void initiateMessageTest31() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv), END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv), END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -1461,11 +1462,11 @@
      * ERO, LSPA, BANDWIDTH, METRIC OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest32() throws PcepParseException {
+    public void initiateMessageTest32() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
-         * ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
+        // ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1507,11 +1508,11 @@
      * ERO, LSPA, BANDWIDTH OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest33() throws PcepParseException {
+    public void initiateMessageTest33() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
-         * ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
+        // ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1552,11 +1553,11 @@
      * ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest34() throws PcepParseException {
+    public void initiateMessageTest34() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
-         * ERO, LSPA OBJECT.
-         */
+        // SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
+        // ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x50,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1596,11 +1597,11 @@
      * ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest35() throws PcepParseException {
+    public void initiateMessageTest35() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
-         * ERO, LSPA OBJECT.
-         */
+        // SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
+        // ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1641,11 +1642,11 @@
      * ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest36() throws PcepParseException {
+    public void initiateMessageTest36() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
-         * ERO, LSPA OBJECT.
-         */
+        // SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
+        // ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x14, 0x00, 0x00, 0x10, 0x03, //LSP object
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgTest.java
index 0f8bb7b..cb5b0dd 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -30,7 +31,7 @@
      * This test case checks for srp, lsp, end-point, ERO objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest1() throws PcepParseException {
+    public void initiateMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* srp, lsp, end-point, ERO.
          */
@@ -75,7 +76,7 @@
      * This test case checks for srp and lsp objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest2() throws PcepParseException {
+    public void initiateMessageTest2() throws PcepParseException, PcepOutOfBoundMessageException {
         /* srp, lsp.
          */
         byte[] initiateDeletionMsg = new byte[]{0x20, 0x0C, 0x00, 0x34,
@@ -115,7 +116,7 @@
      * in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest3() throws PcepParseException {
+    public void initiateMessageTest3() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv,
          * StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO.
@@ -162,7 +163,7 @@
      * StatefulLspErrorCodeTlv), END-POINT, ERO objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest4() throws PcepParseException {
+    public void initiateMessageTest4() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv,
          * StatefulLspErrorCodeTlv), END-POINT, ERO.
@@ -208,7 +209,7 @@
      * END-POINT, ERO objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest5() throws PcepParseException {
+    public void initiateMessageTest5() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
          * END-POINT, ERO.
@@ -255,7 +256,7 @@
      * END-POINT, ERO objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest6() throws PcepParseException {
+    public void initiateMessageTest6() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
          * END-POINT, ERO.
@@ -303,7 +304,7 @@
      * END-POINT, ERO objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest7() throws PcepParseException {
+    public void initiateMessageTest7() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
          * END-POINT, ERO.
@@ -350,7 +351,7 @@
      * END-POINT, ERO objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest8() throws PcepParseException {
+    public void initiateMessageTest8() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv),
          * END-POINT, ERO.
@@ -396,7 +397,7 @@
      * END-POINT, ERO objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest9() throws PcepParseException {
+    public void initiateMessageTest9() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv),
          * END-POINT, ERO.
@@ -440,7 +441,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest10() throws PcepParseException {
+    public void initiateMessageTest10() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, StatefulRsvpErrorSpecTlv).
          */
@@ -484,7 +485,7 @@
      * StatefulLspErrorCodeTlv) objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest11() throws PcepParseException {
+    public void initiateMessageTest11() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv,
            StatefulLspErrorCodeTlv).*/
@@ -528,7 +529,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest12() throws PcepParseException {
+    public void initiateMessageTest12() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv).
          */
@@ -571,7 +572,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest13() throws PcepParseException {
+    public void initiateMessageTest13() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv).
          */
@@ -613,7 +614,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest14() throws PcepParseException {
+    public void initiateMessageTest14() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv).
          */
@@ -655,7 +656,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest15() throws PcepParseException {
+    public void initiateMessageTest15() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv).
          */
@@ -696,7 +697,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest16() throws PcepParseException {
+    public void initiateMessageTest16() throws PcepParseException, PcepOutOfBoundMessageException {
 
         //srp,lsp (StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x50,
@@ -740,7 +741,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest17() throws PcepParseException {
+    public void initiateMessageTest17() throws PcepParseException, PcepOutOfBoundMessageException {
 
         //srp,lsp (StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x58,
@@ -784,7 +785,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest18() throws PcepParseException {
+    public void initiateMessageTest18() throws PcepParseException, PcepOutOfBoundMessageException {
         //srp,lsp (StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth,metric-list
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -829,7 +830,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest19() throws PcepParseException {
+    public void initiateMessageTest19() throws PcepParseException, PcepOutOfBoundMessageException {
         //srp,lsp(all tlvs),end-point,ero,lspa,bandwidth,metric-list
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x74,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -876,7 +877,7 @@
      * lsp(SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv) objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest20() throws PcepParseException {
+    public void initiateMessageTest20() throws PcepParseException, PcepOutOfBoundMessageException {
         /* srp,lsp (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, srp,
          *  lsp(SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv).
          */
@@ -924,7 +925,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest21() throws PcepParseException {
+    public void initiateMessageTest21() throws PcepParseException, PcepOutOfBoundMessageException {
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero
          */
@@ -978,7 +979,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest22() throws PcepParseException {
+    public void initiateMessageTest22() throws PcepParseException, PcepOutOfBoundMessageException {
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa
          */
@@ -1033,7 +1034,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest23() throws PcepParseException {
+    public void initiateMessageTest23() throws PcepParseException, PcepOutOfBoundMessageException {
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth
          */
@@ -1090,7 +1091,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest24() throws PcepParseException {
+    public void initiateMessageTest24() throws PcepParseException, PcepOutOfBoundMessageException {
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth*/
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0xBC,
@@ -1148,7 +1149,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest25() throws PcepParseException {
+    public void initiateMessageTest25() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,bandwidth,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),
@@ -1209,7 +1210,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest26() throws PcepParseException {
+    public void initiateMessageTest26() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,bandwidth,metric-list,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),
@@ -1271,7 +1272,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest27() throws PcepParseException {
+    public void initiateMessageTest27() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth,metric-list,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepKeepaliveMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepKeepaliveMsgTest.java
index 56cf06b..0131860 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepKeepaliveMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepKeepaliveMsgTest.java
@@ -19,6 +19,7 @@
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Assert;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -31,7 +32,7 @@
      * Common header for keep alive message.
      */
     @Test
-    public void keepaliveMessageTest1() throws PcepParseException {
+    public void keepaliveMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] keepaliveMsg = new byte[] {0x20, 0x02, 0x00, 0x04 };
 
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepLSReportMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepLSReportMsgTest.java
new file mode 100644
index 0000000..ea1009d
--- /dev/null
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepLSReportMsgTest.java
@@ -0,0 +1,1585 @@
+/*
+ * Copyright 2014-2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.core.Is.is;
+
+public class PcepLSReportMsgTest {
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV, Local Node Descriptors TLV(AutonomousSystemSubTlv)).
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x2C, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x28, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x08, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystem Tlv
+                0x00, 0x00, 0x00, 0x11};
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV, Local Node Descriptors TLV(AutonomousSystemSubTlv)) with different LS-ID.
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest2() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x2C, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x28, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x08, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11};
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for  LS Object (Routing Universe TLV)
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest3() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x20, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x1C, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv.
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv)).
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest4() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x48, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x44, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OspfAreaIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11};
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest5() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x40, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x3C, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x1C, // Local Node Descriptors TLV
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11};
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for LS Object (Routing Universe TLV,Local Node Descriptors TLV(OSPFareaIDsubTlv,
+     * IgpRouterIdSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest6() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x38, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x34, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x14, // Local Node Descriptors TLV
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11};
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for LS Object (Routing Universe TLV,Local Node Descriptors TLV(IgpRouterIdSubTlv)).
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest7() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x30, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x2C, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x0C, // Local Node Descriptors TLV
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11};
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for LS Object (Routing Universe TLV,Local Node Descriptors TLV)
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest8() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x24, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x20, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x00 // Local Node Descriptors TLV
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv.
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv.
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv)).
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest9() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x70, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x6C, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest10() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x68, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x64, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x1C, //RemoteNodeDescriptorsTLV
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(OSPFareaIDsubTlv, IgpRouterIdSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest11() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x60, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x5C, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x14, //RemoteNodeDescriptorsTLV
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(IgpRouterIdSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest12() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x58, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x54, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x0c, //RemoteNodeDescriptorsTLV
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV)
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest13() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x4C, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x48, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x00 //RemoteNodeDescriptorsTLV
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest14() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0x90, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0x8C, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest15() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0x84, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0x80, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x10, //LinkDescriptorsTLV
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(IPv4NeighborAddressSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest16() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0x7C, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0x78, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x08, //LinkDescriptorsTLV
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV)
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest17() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0x74, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0x70, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x00, //LinkDescriptorsTLV
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest18() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0xC4, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0xC0, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x30, //NodeAttributesTlv
+                0x00, 0x0D, 0x00, 0x01, //NodeFlagBitsSubTlv
+                (byte) 0x90, 0x00, 0x00, 0x00,
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x0F, 0x00, 0x08, //NodeNameSubTlv
+                0x08, 0x00, 0x01, 0x09,
+                0x08, 0x00, 0x01, 0x09,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv), NodeAttributesTlv(NodeFlagBitsSubTlv
+     * OpaqueNodePropertiesSubTlv, NodeNameSubTlv, ISISAreaIdentifierSubTlv, IPv4RouterIdOfLocalNodeSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest19() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0xC4, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0xC0, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x30, //NodeAttributesTlv
+                0x00, 0x0D, 0x00, 0x01, //NodeFlagBitsSubTlv
+                (byte) 0x90, 0x00, 0x00, 0x00,
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x0F, 0x00, 0x08, //NodeNameSubTlv
+                0x08, 0x00, 0x01, 0x09,
+                0x08, 0x00, 0x01, 0x09,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv), NodeAttributesTlv(OpaqueNodePropertiesSubTlv
+     * NodeNameSubTlv, ISISAreaIdentifierSubTlv, IPv4RouterIdOfLocalNodeSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest20() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0xBC, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0xB8, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x28, //NodeAttributesTlv
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x0F, 0x00, 0x08, //NodeNameSubTlv
+                0x08, 0x00, 0x01, 0x09,
+                0x08, 0x00, 0x01, 0x09,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv.
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv), NodeAttributesTlv(OpaqueNodePropertiesSubTlv
+     * ISISAreaIdentifierSubTlv, IPv4RouterIdOfLocalNodeSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest21() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0xB0, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0xAC, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x1C, //NodeAttributesTlv
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv,
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv), NodeAttributesTlv(NodeFlagBitsSubTlv,
+     * OpaqueNodePropertiesSubTlv, NodeNameSubTlv, ISISAreaIdentifierSubTlv, IPv4RouterIdOfLocalNodeSubTlv),
+     * LinkAttributesTlv(IPv4RouterIdOfRemoteNodeSubTlv, IPv6LSRouterIdofRemoteNodeTlv, AdministrativeGroupSubTlv,
+     * TEDefaultMetricSubTlv, MaximumLinkBandwidthSubTlv, MaximumReservableLinkBandwidthSubTlv,
+     * UnreservedBandwidthSubTlv, LinkProtectionTypeSubTlv, MPLSProtocolMaskSubTlv, IgpMetricSubTlv,
+     * SharedRiskLinkGroupSubTlv, OpaqueLinkAttributeSubTlv, LinkNameAttributeSubTlv)).
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest22() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x01, 0x18, // common header
+                (byte) 0xE0, 0x10, 0x01, 0x14, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x1C, //NodeAttributesTlv
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02,
+                (byte) 0xFF, 0x06, 0x00, 0x64, //LinkAttributesTlv
+                0x00, 0x13, 0x00, 0x04, //IPv4RouterIdOfRemoteNodeSubTlv
+                0x00, 0x07, 0x08, 0x00,
+                0x00, 0x16, 0x00, 0x04, //AdministrativeGroupSubTlv
+                0x00, 0x09, 0x08, 0x00,
+                0x00, 0x17, 0x00, 0x04, //MaximumLinkBandwidthSubTlv
+                0x00, 0x09, 0x00, 0x00,
+                0x00, 0x18, 0x00, 0x04, //MaximumReservableLinkBandwidthSubTlv
+                0x00, 0x10, 0x00, 0x00,
+                0x00, 0x19, 0x00, 0x04, //UnreservedBandwidthSubTlv
+                0x00, 0x00, (byte) 0x90, 0x00,
+                0x00, 0x1A, 0x00, 0x04, //TEDefaultMetricSubTlv
+                0x00, (byte) 0x99, 0x09, 0x00,
+                0x00, 0x1B, 0x00, 0x02, //LinkProtectionTypeSubTlv
+                0x09, 0x00, 0x00, 0x00,
+                0x00, 0x1C, 0x00, 0x01, //MPLSProtocolMaskSubTlv
+                (byte) 0x80, 0x00, 0x00, 0x00,
+                0x00, 0x1D, 0x00, 0x04, //IgpMetricSubTlv
+                0x09, (byte) 0x89, 0x07, 0x00,
+                0x00, 0x1E, 0x00, 0x04, //SharedRiskLinkGroupSubTlv
+                0x04, 0x47, 0x00, 0x03,
+                0x00, 0x1F, 0x00, 0x08, //OpaqueLinkAttributeSubTlv
+                0x04, 0x49, 0x00, 0x04,
+                0x04, 0x47, 0x00, 0x03,
+                0x00, 0x20, 0x00, 0x04, //LinkNameAttributeSubTlv
+                0x04, 0x47, 0x00, 0x03
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv,
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv), NodeAttributesTlv(NodeFlagBitsSubTlv,
+     * OpaqueNodePropertiesSubTlv, NodeNameSubTlv, ISISAreaIdentifierSubTlv, IPv4RouterIdOfLocalNodeSubTlv),
+     * LinkAttributesTlv(IPv4RouterIdOfRemoteNodeSubTlv, IPv6LSRouterIdofRemoteNodeTlv, AdministrativeGroupSubTlv,
+     * MaximumLinkBandwidthSubTlv, MaximumReservableLinkBandwidthSubTlv, UnreservedBandwidthSubTlv,
+     * TEDefaultMetricSubTlv, LinkProtectionTypeSubTlv, MPLSProtocolMaskSubTlv, IgpMetricSubTlv,
+     * SharedRiskLinkGroupSubTlv, OpaqueLinkAttributeSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest23() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x01, 0x10, // common header
+                (byte) 0xE0, 0x10, 0x01, 0x0C, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x1C, //NodeAttributesTlv
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02,
+                (byte) 0xFF, 0x06, 0x00, 0x5C, //LinkAttributesTlv
+                0x00, 0x13, 0x00, 0x04, //IPv4RouterIdOfRemoteNodeSubTlv
+                0x00, 0x07, 0x08, 0x00,
+                0x00, 0x16, 0x00, 0x04, //AdministrativeGroupSubTlv
+                0x00, 0x09, 0x08, 0x00,
+                0x00, 0x17, 0x00, 0x04, //MaximumLinkBandwidthSubTlv
+                0x00, 0x09, 0x00, 0x00,
+                0x00, 0x18, 0x00, 0x04, //MaximumReservableLinkBandwidthSubTlv
+                0x00, 0x10, 0x00, 0x00,
+                0x00, 0x19, 0x00, 0x04, //UnreservedBandwidthSubTlv
+                0x00, 0x00, (byte) 0x90, 0x00,
+                0x00, 0x1A, 0x00, 0x04, //TEDefaultMetricSubTlv
+                0x00, (byte) 0x99, 0x09, 0x00,
+                0x00, 0x1B, 0x00, 0x02, //LinkProtectionTypeSubTlv
+                0x09, 0x00, 0x00, 0x00,
+                0x00, 0x1C, 0x00, 0x01, //MPLSProtocolMaskSubTlv
+                (byte) 0x80, 0x00, 0x00, 0x00,
+                0x00, 0x1D, 0x00, 0x04, //IgpMetricSubTlv
+                0x09, (byte) 0x89, 0x07, 0x00,
+                0x00, 0x1E, 0x00, 0x04, //SharedRiskLinkGroupSubTlv
+                0x04, 0x47, 0x00, 0x03,
+                0x00, 0x1F, 0x00, 0x08, //OpaqueLinkAttributeSubTlv
+                0x04, 0x49, 0x00, 0x04,
+                0x04, 0x47, 0x00, 0x03
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv,
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv), NodeAttributesTlv(NodeFlagBitsSubTlv,
+     * OpaqueNodePropertiesSubTlv, NodeNameSubTlv, ISISAreaIdentifierSubTlv, IPv4RouterIdOfLocalNodeSubTlv),
+     * LinkAttributesTlv(IPv4RouterIdOfRemoteNodeSubTlv, IPv6LSRouterIdofRemoteNodeTlv, AdministrativeGroupSubTlv,
+     * MaximumLinkBandwidthSubTlv, MaximumReservableLinkBandwidthSubTlv, UnreservedBandwidthSubTlv,
+     * TEDefaultMetricSubTlv, LinkProtectionTypeSubTlv, MPLSProtocolMaskSubTlv, IgpMetricSubTlv,
+     * SharedRiskLinkGroupSubTlv)) in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest24() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x01, 0x08, // common header
+                (byte) 0xE0, 0x10, 0x01, 0x04, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x1C, //NodeAttributesTlv
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02,
+                (byte) 0xFF, 0x06, 0x00, 0x54, //LinkAttributesTlv
+                0x00, 0x13, 0x00, 0x04, //IPv4RouterIdOfRemoteNodeSubTlv
+                0x00, 0x07, 0x08, 0x00,
+                0x00, 0x16, 0x00, 0x04, //AdministrativeGroupSubTlv
+                0x00, 0x09, 0x08, 0x00,
+                0x00, 0x17, 0x00, 0x04, //MaximumLinkBandwidthSubTlv
+                0x00, 0x09, 0x00, 0x00,
+                0x00, 0x18, 0x00, 0x04, //MaximumReservableLinkBandwidthSubTlv
+                0x00, 0x10, 0x00, 0x00,
+                0x00, 0x19, 0x00, 0x04, //UnreservedBandwidthSubTlv
+                0x00, 0x00, (byte) 0x90, 0x00,
+                0x00, 0x1A, 0x00, 0x04, //TEDefaultMetricSubTlv
+                0x00, (byte) 0x99, 0x09, 0x00,
+                0x00, 0x1B, 0x00, 0x02, //LinkProtectionTypeSubTlv
+                0x09, 0x00, 0x00, 0x00,
+                0x00, 0x1C, 0x00, 0x01, //MPLSProtocolMaskSubTlv
+                (byte) 0x80, 0x00, 0x00, 0x00,
+                0x00, 0x1D, 0x00, 0x04, //IgpMetricSubTlv
+                0x09, (byte) 0x89, 0x07, 0x00,
+                0x00, 0x1E, 0x00, 0x08, //SharedRiskLinkGroupSubTlv
+                0x04, 0x47, 0x00, 0x03,
+                0x04, 0x47, 0x00, 0x03
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv,
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv), NodeAttributesTlv(NodeFlagBitsSubTlv,
+     * OpaqueNodePropertiesSubTlv, NodeNameSubTlv, ISISAreaIdentifierSubTlv, IPv4RouterIdOfLocalNodeSubTlv),
+     * LinkAttributesTlv(IPv4RouterIdOfRemoteNodeSubTlv, IPv6LSRouterIdofRemoteNodeTlv, AdministrativeGroupSubTlv,
+     * MaximumLinkBandwidthSubTlv, MaximumReservableLinkBandwidthSubTlv, UnreservedBandwidthSubTlv,
+     * TEDefaultMetricSubTlv, LinkProtectionTypeSubTlv, MPLSProtocolMaskSubTlv, IgpMetricSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest25() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0xFC, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0xF8, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x1C, //NodeAttributesTlv
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02,
+                (byte) 0xFF, 0x06, 0x00, 0x48, //LinkAttributesTlv
+                0x00, 0x13, 0x00, 0x04, //IPv4RouterIdOfRemoteNodeSubTlv
+                0x00, 0x07, 0x08, 0x00,
+                0x00, 0x16, 0x00, 0x04, //AdministrativeGroupSubTlv
+                0x00, 0x09, 0x08, 0x00,
+                0x00, 0x17, 0x00, 0x04, //MaximumLinkBandwidthSubTlv
+                0x00, 0x09, 0x00, 0x00,
+                0x00, 0x18, 0x00, 0x04, //MaximumReservableLinkBandwidthSubTlv
+                0x00, 0x10, 0x00, 0x00,
+                0x00, 0x19, 0x00, 0x04, //UnreservedBandwidthSubTlv
+                0x00, 0x00, (byte) 0x90, 0x00,
+                0x00, 0x1A, 0x00, 0x04, //TEDefaultMetricSubTlv
+                0x00, (byte) 0x99, 0x09, 0x00,
+                0x00, 0x1B, 0x00, 0x02, //LinkProtectionTypeSubTlv
+                0x09, 0x00, 0x00, 0x00,
+                0x00, 0x1C, 0x00, 0x01, //MPLSProtocolMaskSubTlv
+                (byte) 0x80, 0x00, 0x00, 0x00,
+                0x00, 0x1D, 0x00, 0x04, //IgpMetricSubTlv
+                0x09, (byte) 0x89, 0x07, 0x00
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepLabelUpdateMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepLabelUpdateMsgTest.java
index e1947bd..2256496 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepLabelUpdateMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepLabelUpdateMsgTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -32,15 +33,15 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest1() throws PcepParseException {
+    public void labelUpdateMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x24, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x24, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x01, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66};
 
@@ -72,18 +73,18 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest2() throws PcepParseException {
+    public void labelUpdateMessageTest2() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x30, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x30, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x01, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x77};
 
@@ -113,16 +114,16 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest3() throws PcepParseException {
+    public void labelUpdateMessageTest3() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x24, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x24, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x24, 0x10, 0x00, 0x08, // FEC Object Header
+                (byte) 0xE2, 0x10, 0x00, 0x08, // FEC Object Header
                 0x0A, 0x0A, 0x0B, 0x0B};
 
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -151,18 +152,18 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest4() throws PcepParseException {
+    public void labelUpdateMessageTest4() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x50, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x50, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x01, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x77,
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
@@ -170,7 +171,7 @@
                 0x00, 0x00, 0x00, 0x11,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x02, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x44};
 
@@ -200,24 +201,24 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest5() throws PcepParseException {
+    public void labelUpdateMessageTest5() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x44, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x44, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x01,
                 0x00, 0x00, 0x00, 0x66,
-                0x24, 0x10, 0x00, 0x08, // FEC Object Header
+                (byte) 0xE2, 0x10, 0x00, 0x08, // FEC Object Header
                 0x0A, 0x0A, 0x0B, 0x0B,
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x11,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x24, 0x10, 0x00, 0x08, // FEC Object Header
+                (byte) 0xE2, 0x10, 0x00, 0x08, // FEC Object Header
                 0x0A, 0x0A, 0x0C, 0x0C};
 
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -246,27 +247,27 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest6() throws PcepParseException {
+    public void labelUpdateMessageTest6() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x50, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x50, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x01, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x77,
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x12,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x24, 0x10, 0x00, 0x08, // FEC Object Header
+                (byte) 0xE2, 0x10, 0x00, 0x08, // FEC Object Header
                 0x0A, 0x0A, 0x0D, 0x0D};
 
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -295,26 +296,26 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest7() throws PcepParseException {
+    public void labelUpdateMessageTest7() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x50, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x50, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x12,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x24, 0x10, 0x00, 0x08, // FEC Object Header
+                (byte) 0xE2, 0x10, 0x00, 0x08, // FEC Object Header
                 0x0A, 0x0A, 0x0D, 0x0D,
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x01, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x77};
 
@@ -345,26 +346,26 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest8() throws PcepParseException {
+    public void labelUpdateMessageTest8() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x7C, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x7C, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x12,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x24, 0x10, 0x00, 0x08, // FEC Object Header
+                (byte) 0xE2, 0x10, 0x00, 0x08, // FEC Object Header
                 0x0A, 0x0A, 0x0D, 0x0D,
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x01, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x77,
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
@@ -372,10 +373,10 @@
                 0x00, 0x00, 0x00, 0x10,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x01, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x77};
 
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepOpenMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepOpenMsgTest.java
index 6e0a059..eea8a26 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepOpenMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepOpenMsgTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -33,7 +34,7 @@
      * PCECC-CAPABILITY-TLV in Pcep Open message.
      */
     @Test
-    public void openMessageTest1() throws PcepParseException {
+    public void openMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x24, 0x01, 0x10, 0x00, 0x20, 0x20, 0x1e, 0x78, (byte) 0xbd,
                 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0f, //STATEFUL-PCE-CAPABILITY
@@ -67,7 +68,7 @@
      * This test case checks open object with STATEFUL-PCE-CAPABILITY-TLV in Pcep Open message.
      */
     @Test
-    public void openMessageTest2() throws PcepParseException {
+    public void openMessageTest2() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x14, // common header
                 0x01, 0x10, 0x00, 0x10, // common object header
@@ -99,7 +100,7 @@
      * This test case checks open object with GmplsCapability tlv in Pcep Open message.
      */
     @Test
-    public void openMessageTest3() throws PcepParseException {
+    public void openMessageTest3() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x14, // common header
                 0x01, 0x10, 0x00, 0x10, // common object header
@@ -133,7 +134,7 @@
      * This test case checks open object with StatefulLspDbVer Tlv in Pcep Open message.
      */
     @Test
-    public void openMessageTest4() throws PcepParseException {
+    public void openMessageTest4() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x18,
                 0x01, 0x10, 0x00, 0x14, 0x20, 0x1e, 0x78, 0x20,
@@ -165,7 +166,7 @@
      * This test case checks open object with no tlv's in Pcep Open message.
      */
     @Test
-    public void openMessageTest5() throws PcepParseException {
+    public void openMessageTest5() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x0C,
                 0x01, 0x10, 0x00, 0x08, 0x20, 0x1e, 0x78, (byte) 0xbd }; // no Tlvs in open messsage
@@ -197,7 +198,7 @@
      * with I bit set in Pcep Open message.
      */
     @Test
-    public void openMessageTest6() throws PcepParseException {
+    public void openMessageTest6() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x24, 0x01, 0x11, 0x00, 0x20, //p bit not set & i bit set
                 0x20, 0x1e, 0x78, (byte) 0xbd,
@@ -233,7 +234,7 @@
      * with P bit set in Pcep Open message.
      */
     @Test
-    public void openMessageTest7() throws PcepParseException {
+    public void openMessageTest7() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x24, 0x01, 0x12, 0x00, 0x20, //p bit set & i bit not set
                 0x20, 0x1e, 0x78, (byte) 0xbd,
@@ -269,7 +270,7 @@
      * with P & I bits set in Pcep Open message.
      */
     @Test
-    public void openMessageTest8() throws PcepParseException {
+    public void openMessageTest8() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* OPEN OBJECT (STATEFUL-PCE-CAPABILITY, GMPLS-CAPABILITY-TLV, PCECC-CAPABILITY-TLV)
         with p bit set & i bit set.
@@ -308,7 +309,7 @@
      * with P & I bits set and invalid session id in Pcep Open message.
      */
     @Test
-    public void openMessageTest9() throws PcepParseException {
+    public void openMessageTest9() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x24, 0x01, 0x13, 0x00, 0x20, //p bit set & i bit set
                 0x20, 0x1e, 0x78, 0x00, //invalid sessionID
@@ -345,7 +346,7 @@
      * in Pcep Open message.
      */
     @Test
-    public void openMessageTest10() throws PcepParseException {
+    public void openMessageTest10() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x1C, // common header
                 0x01, 0x10, 0x00, 0x18, // common object header
@@ -382,7 +383,7 @@
      * PCECC-CAPABILITY-TLV, TED Capability TLV in Pcep Open message.
      */
     @Test
-    public void openMessageTest11() throws PcepParseException {
+    public void openMessageTest11() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x2C, // common header
                 0x01, 0x10, 0x00, 0x28, // common object header
@@ -390,7 +391,7 @@
                 0x00, 0x10, 0x00, 0x04, // STATEFUL-PCE-CAPABILITY
                 0x00, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x04, // GMPLS-CAPABILITY-TLV
                 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, // PCECC-CAPABILITY-TLV
-                0x00, 0x00, 0x00, 0x03, 0x00, (byte) 0x84, 0x00, 0x04, // TED Capability TLV
+                0x00, 0x00, 0x00, 0x03, (byte) 0xFF, (byte) 0x00, 0x00, 0x04, // LS Capability TLV
                 0x00, 0x00, 0x00, 0x00 };
 
         byte[] testOpenMsg = {0};
@@ -412,7 +413,6 @@
         buf.readBytes(testOpenMsg, 0, readLen);
 
         assertThat(testOpenMsg, is(openMsg));
-
     }
 
     /**
@@ -420,7 +420,7 @@
      * PCECC-CAPABILITY-TLV in Pcep Open message.
      */
     @Test
-    public void openMessageTest12() throws PcepParseException {
+    public void openMessageTest12() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x24, // common header
                 0x01, 0x10, 0x00, 0x20, // common object header
@@ -457,7 +457,7 @@
      * in Pcep Open message.
      */
     @Test
-    public void openMessageTest13() throws PcepParseException {
+    public void openMessageTest13() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x1c, // common header
                 0x01, 0x10, 0x00, 0x18, // common object header
@@ -493,7 +493,7 @@
      * This test case checks open object with STATEFUL-PCE-CAPABILITY in Pcep Open message.
      */
     @Test
-    public void openMessageTest14() throws PcepParseException {
+    public void openMessageTest14() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x14, // common header
                 0x01, 0x10, 0x00, 0x10, // common object header
@@ -527,7 +527,7 @@
      * This test case checks open object with no tlv Pcep Open message.
      */
     @Test
-    public void openMessageTest15() throws PcepParseException {
+    public void openMessageTest15() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x0c, // common header
                 0x01, 0x10, 0x00, 0x08, // common object header
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgExtTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgExtTest.java
index f9921ef..8a78e04 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgExtTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgExtTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -32,7 +33,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest39() throws PcepParseException {
+    public void reportMessageTest39() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x98,
                 0x21, 0x10, 0x00, 0x0C,  0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x01, //SRP object
@@ -79,7 +80,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest40() throws PcepParseException {
+    public void reportMessageTest40() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x0C,  0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x01, //SRP object
@@ -120,7 +121,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest41() throws PcepParseException {
+    public void reportMessageTest41() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x8c,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP object
@@ -166,7 +167,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest42() throws PcepParseException {
+    public void reportMessageTest42() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0xE8,
                 0x21, 0x10, 0x00, 0x0C,  0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x01, //SRP object
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgTest.java
index c9e2bc8..ff10078 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -31,7 +32,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest1() throws PcepParseException {
+    public void reportMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, 0x24,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -66,7 +67,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest2() throws PcepParseException {
+    public void reportMessageTest2() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x7c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -111,7 +112,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest3() throws PcepParseException {
+    public void reportMessageTest3() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x70,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object //LSP Object
@@ -155,7 +156,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest4() throws PcepParseException {
+    public void reportMessageTest4() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -197,7 +198,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest5() throws PcepParseException {
+    public void reportMessageTest5() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x50,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -237,7 +238,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest6() throws PcepParseException {
+    public void reportMessageTest6() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x6c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -279,7 +280,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest7() throws PcepParseException {
+    public void reportMessageTest7() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -318,7 +319,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest8() throws PcepParseException {
+    public void reportMessageTest8() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -361,7 +362,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest9() throws PcepParseException {
+    public void reportMessageTest9() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x44,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object //LSP Object
@@ -399,7 +400,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest10() throws PcepParseException {
+    public void reportMessageTest10() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x74,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -442,7 +443,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest11() throws PcepParseException {
+    public void reportMessageTest11() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -483,7 +484,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest12() throws PcepParseException {
+    public void reportMessageTest12() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -523,7 +524,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest13() throws PcepParseException {
+    public void reportMessageTest13() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -564,7 +565,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest14() throws PcepParseException {
+    public void reportMessageTest14() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -604,7 +605,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest15() throws PcepParseException {
+    public void reportMessageTest15() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x7C,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -647,7 +648,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest16() throws PcepParseException {
+    public void reportMessageTest16() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -689,7 +690,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest17() throws PcepParseException {
+    public void reportMessageTest17() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x74,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -731,7 +732,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest18() throws PcepParseException {
+    public void reportMessageTest18() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -772,7 +773,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest19() throws PcepParseException {
+    public void reportMessageTest19() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x6C,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -813,7 +814,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest20() throws PcepParseException {
+    public void reportMessageTest20() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x88,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -858,7 +859,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest21() throws PcepParseException {
+    public void reportMessageTest21() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0xac,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -908,7 +909,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest22() throws PcepParseException {
+    public void reportMessageTest22() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0xA0,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object
@@ -957,7 +958,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest23() throws PcepParseException {
+    public void reportMessageTest23() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x8c,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object
@@ -1004,7 +1005,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest24() throws PcepParseException {
+    public void reportMessageTest24() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x84,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object
@@ -1050,7 +1051,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest25() throws PcepParseException {
+    public void reportMessageTest25() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x8c,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object
@@ -1097,7 +1098,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest26() throws PcepParseException {
+    public void reportMessageTest26() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x58,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object
@@ -1138,7 +1139,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest27() throws PcepParseException {
+    public void reportMessageTest27() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x44,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object
@@ -1177,7 +1178,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest28() throws PcepParseException {
+    public void reportMessageTest28() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x6c,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object
@@ -1219,7 +1220,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest29() throws PcepParseException {
+    public void reportMessageTest29() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x74,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -1262,7 +1263,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest30() throws PcepParseException {
+    public void reportMessageTest30() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0xE4,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -1319,7 +1320,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest31() throws PcepParseException {
+    public void reportMessageTest31() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x01, 0x00,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -1379,7 +1380,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest32() throws PcepParseException {
+    public void reportMessageTest32() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x01, (byte) 0x14,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -1441,7 +1442,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest33() throws PcepParseException {
+    public void reportMessageTest33() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x01, (byte) 0x1c,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -1504,7 +1505,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest34() throws PcepParseException {
+    public void reportMessageTest34() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0xB4,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -1554,7 +1555,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest35() throws PcepParseException {
+    public void reportMessageTest35() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x8C,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepTEReportMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepTEReportMsgTest.java
deleted file mode 100644
index e401c15..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepTEReportMsgTest.java
+++ /dev/null
@@ -1,1596 +0,0 @@
-/*
- * Copyright 2014-2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.protocol;
-
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.jboss.netty.buffer.ChannelBuffers;
-import org.junit.Test;
-import org.onosproject.pcepio.exceptions.PcepParseException;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.instanceOf;
-import static org.hamcrest.core.Is.is;
-
-public class PcepTEReportMsgTest {
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV, Local TE Node Descriptors TLV(AutonomousSystemTlv)).
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest1() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x28, // common header
-                0x0E, 0x10, 0x00, 0x24, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x08, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystem Tlv
-                0x00, 0x00, 0x00, 0x11};
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * T E Object (Routing Universe TLV, Local TE Node Descriptors TLV(AutonomousSystemTlv)) with different TE-ID.
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest2() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x28, // common header
-                0x0E, 0x10, 0x00, 0x24, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x08, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11};
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for  TE Object (Routing Universe TLV)
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest3() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x1c, // common header
-                0x0E, 0x10, 0x00, 0x18, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv.
-     * OSPFareaIDsubTlv, RouterIDSubTlv)).
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest4() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x44, // common header
-                0x0E, 0x10, 0x00, 0x40, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11};
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest5() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x3C, // common header
-                0x0E, 0x10, 0x00, 0x38, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x1C, // Local TE Node Descriptors TLV
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11};
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(OSPFareaIDsubTlv,
-     * RouterIDSubTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest6() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x34, // common header
-                0x0E, 0x10, 0x00, 0x30, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x14, // Local TE Node Descriptors TLV
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11};
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(RouterIDSubTlv)).
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest7() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x2C, // common header
-                0x0E, 0x10, 0x00, 0x28, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x0C, // Local TE Node Descriptors TLV
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11};
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for TE Object (Routing Universe TLV,Local TE Node Descriptors TLV)
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest8() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x20, // common header
-                0x0E, 0x10, 0x00, 0x1C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x00 // Local TE Node Descriptors TLV
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv.
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv.
-     * OSPFareaIDsubTlv, RouterIDSubTlv)).
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest9() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x6C, // common header
-                0x0E, 0x10, 0x00, 0x68, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest10() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x64, // common header
-                0x0E, 0x10, 0x00, 0x60, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x1C, //RemoteTENodeDescriptorsTLV
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(OSPFareaIDsubTlv, RouterIDSubTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest11() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x5C, // common header
-                0x0E, 0x10, 0x00, 0x58, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x14, //RemoteTENodeDescriptorsTLV
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(RouterIDSubTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest12() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x54, // common header
-                0x0E, 0x10, 0x00, 0x50, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x0c, //RemoteTENodeDescriptorsTLV
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV)
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest13() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x48, // common header
-                0x0E, 0x10, 0x00, 0x44, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x00, //RemoteTENodeDescriptorsTLV
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest14() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0x8C, // common header
-                0x0E, 0x10, 0x00, (byte) 0x88, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest15() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0x80, // common header
-                0x0E, 0x10, 0x00, (byte) 0x7C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x10, //TELinkDescriptorsTLV
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(IPv4NeighborAddressTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest16() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0x78, // common header
-                0x0E, 0x10, 0x00, (byte) 0x74, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x08, //TELinkDescriptorsTLV
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV)
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest17() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0x70, // common header
-                0x0E, 0x10, 0x00, (byte) 0x6C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x00, //TELinkDescriptorsTLV
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest18() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0xC0, // common header
-                0x0E, 0x10, 0x00, (byte) 0xbC, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x30, //TENodeAttributesTlv
-                0x00, 0x0E, 0x00, 0x01, //NodeFlagBitsTlv
-                (byte) 0x90, 0x00, 0x00, 0x00,
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x03, (byte) 0xEF, 0x00, 0x08, //NodeNameTlv
-                0x08, 0x00, 0x01, 0x09,
-                0x08, 0x00, 0x01, 0x09,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv), TENodeAttributesTlv(NodeFlagBitsTlv
-     * OpaqueNodeAttributeTlv, NodeNameTlv, ISISAreaIdentifierTlv, IPv4TERouterIdOfLocalNodeTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest19() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0xC0, // common header
-                0x0E, 0x10, 0x00, (byte) 0xBC, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x30, //TENodeAttributesTlv
-                0x00, 0x0E, 0x00, 0x01, //NodeFlagBitsTlv
-                (byte) 0x90, 0x00, 0x00, 0x00,
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x03, (byte) 0xEF, 0x00, 0x08, //NodeNameTlv
-                0x08, 0x00, 0x01, 0x09,
-                0x08, 0x00, 0x01, 0x09,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv), TENodeAttributesTlv(OpaqueNodeAttributeTlv
-     * NodeNameTlv, ISISAreaIdentifierTlv, IPv4TERouterIdOfLocalNodeTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest20() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0xB8, // common header
-                0x0E, 0x10, 0x00, (byte) 0xB4, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x28, //TENodeAttributesTlv
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x03, (byte) 0xEF, 0x00, 0x08, //NodeNameTlv
-                0x08, 0x00, 0x01, 0x09,
-                0x08, 0x00, 0x01, 0x09,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv.
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv), TENodeAttributesTlv(OpaqueNodeAttributeTlv
-     * ISISAreaIdentifierTlv, IPv4TERouterIdOfLocalNodeTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest21() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0xAC, // common header
-                0x0E, 0x10, 0x00, (byte) 0xA8, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x1C, //TENodeAttributesTlv
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv.
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv.
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv.
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv), TENodeAttributesTlv(NodeFlagBitsTlv.
-     * OpaqueNodeAttributeTlv, NodeNameTlv, ISISAreaIdentifierTlv, IPv4TERouterIdOfLocalNodeTlv).
-     * TELinkAttributesTlv(IPv4TERouterIdOfRemoteNodeTlv, IPv6TERouterIdofRemoteNodeTlv, AdministrativeGroupTlv.
-     * MaximumLinkBandwidthTlv, MaximumReservableLinkBandwidthTlv, UnreservedBandwidthTlv, TEDefaultMetricTlv.
-     * LinkProtectionTypeTlv, MPLSProtocolMaskTlv, IGPMetricTlv:, SharedRiskLinkGroupTlv.
-     * OpaqueLinkAttributeTlv, LinkNameTlv)).
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest22() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x01, (byte) 0x120, // common header
-                0x0E, 0x10, 0x01, (byte) 0x1C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x28, //TENodeAttributesTlv
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x03, (byte) 0xEF, 0x00, 0x08, //NodeNameTlv
-                0x08, 0x00, 0x01, 0x09,
-                0x08, 0x00, 0x01, 0x09,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02,
-                0x07, 0x69, 0x00, 0x64, //TELinkAttributesTlv
-                0x05, 0x3C, 0x00, 0x04, //IPv4TERouterIdOfRemoteNodeTlv
-                0x00, 0x07, 0x08, 0x00,
-                0x00, 0x03, 0x00, 0x04, //AdministrativeGroupTlv
-                0x00, 0x09, 0x08, 0x00,
-                0x00, 0x09, 0x00, 0x04, //MaximumLinkBandwidthTlv
-                0x00, 0x09, 0x00, 0x00,
-                0x00, 0x0a, 0x00, 0x04, //MaximumReservableLinkBandwidthTlv
-                0x00, 0x10, 0x00, 0x00,
-                0x00, 0x0b, 0x00, 0x04, //UnreservedBandwidthTlv
-                0x00, 0x00, (byte) 0x90, 0x00,
-                0x34, 0x58, 0x00, 0x04, //TEDefaultMetricTlv
-                0x00, (byte) 0x99, 0x09, 0x00,
-                0x00, 0x14, 0x00, 0x02, //LinkProtectionTypeTlv
-                0x09, 0x00, 0x00, 0x00,
-                0x04, 0x46, 0x00, 0x01, //MPLSProtocolMaskTlv
-                (byte) 0x80, 0x00, 0x00, 0x00,
-                0x04, 0x47, 0x00, 0x03, //IGPMetricTlv
-                0x09, (byte) 0x89, 0x07, 0x00,
-                0x04, 0x48, 0x00, 0x08, //SharedRiskLinkGroupTlv
-                0x04, 0x47, 0x00, 0x03,
-                0x04, 0x47, 0x00, 0x03, //OpaqueLinkAttributeTlv
-                0x04, 0x49, 0x00, 0x04,
-                0x04, 0x47, 0x00, 0x03,
-                0x04, 0x4A, 0x00, 0x04, //LinkNameTlv
-                0x04, 0x47, 0x00, 0x03
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv), TENodeAttributesTlv(NodeFlagBitsTlv
-     * OpaqueNodeAttributeTlv, NodeNameTlv, ISISAreaIdentifierTlv, IPv4TERouterIdOfLocalNodeTlv)
-     * TELinkAttributesTlv(IPv4TERouterIdOfRemoteNodeTlv, IPv6TERouterIdofRemoteNodeTlv, AdministrativeGroupTlv
-     * MaximumLinkBandwidthTlv, MaximumReservableLinkBandwidthTlv, UnreservedBandwidthTlv, TEDefaultMetricTlv
-     * LinkProtectionTypeTlv, MPLSProtocolMaskTlv, IGPMetricTlv:, SharedRiskLinkGroupTlv
-     * OpaqueLinkAttributeTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest23() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x01, (byte) 0x118, // common header
-                0x0E, 0x10, 0x01, (byte) 0x14, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x28, //TENodeAttributesTlv
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x03, (byte) 0xEF, 0x00, 0x08, //NodeNameTlv
-                0x08, 0x00, 0x01, 0x09,
-                0x08, 0x00, 0x01, 0x09,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02,
-                0x07, 0x69, 0x00, 0x5C, //TELinkAttributesTlv
-                0x05, 0x3C, 0x00, 0x04, //IPv4TERouterIdOfRemoteNodeTlv
-                0x00, 0x07, 0x08, 0x00,
-                0x00, 0x03, 0x00, 0x04, //AdministrativeGroupTlv
-                0x00, 0x09, 0x08, 0x00,
-                0x00, 0x09, 0x00, 0x04, //MaximumLinkBandwidthTlv
-                0x00, 0x09, 0x00, 0x00,
-                0x00, 0x0a, 0x00, 0x04, //MaximumReservableLinkBandwidthTlv
-                0x00, 0x10, 0x00, 0x00,
-                0x00, 0x0b, 0x00, 0x04, //UnreservedBandwidthTlv
-                0x00, 0x00, (byte) 0x90, 0x00,
-                0x34, 0x58, 0x00, 0x04, //TEDefaultMetricTlv
-                0x00, (byte) 0x99, 0x09, 0x00,
-                0x00, 0x14, 0x00, 0x02, //LinkProtectionTypeTlv
-                0x09, 0x00, 0x00, 0x00,
-                0x04, 0x46, 0x00, 0x01, //MPLSProtocolMaskTlv
-                (byte) 0x80, 0x00, 0x00, 0x00,
-                0x04, 0x47, 0x00, 0x03, //IGPMetricTlv
-                0x09, (byte) 0x89, 0x07, 0x00,
-                0x04, 0x48, 0x00, 0x08, //SharedRiskLinkGroupTlv
-                0x04, 0x47, 0x00, 0x03,
-                0x04, 0x47, 0x00, 0x03, //OpaqueLinkAttributeTlv
-                0x04, 0x49, 0x00, 0x04,
-                0x04, 0x47, 0x00, 0x03
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv), TENodeAttributesTlv(NodeFlagBitsTlv
-     * OpaqueNodeAttributeTlv, NodeNameTlv, ISISAreaIdentifierTlv, IPv4TERouterIdOfLocalNodeTlv)
-     * TELinkAttributesTlv(IPv4TERouterIdOfRemoteNodeTlv, IPv6TERouterIdofRemoteNodeTlv, AdministrativeGroupTlv
-     * MaximumLinkBandwidthTlv, MaximumReservableLinkBandwidthTlv, UnreservedBandwidthTlv, TEDefaultMetricTlv
-     * LinkProtectionTypeTlv, MPLSProtocolMaskTlv, IGPMetricTlv:, SharedRiskLinkGroupTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest24() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x01, (byte) 0x110, // common header
-                0x0E, 0x10, 0x01, (byte) 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x28, //TENodeAttributesTlv
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x03, (byte) 0xEF, 0x00, 0x08, //NodeNameTlv
-                0x08, 0x00, 0x01, 0x09,
-                0x08, 0x00, 0x01, 0x09,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02,
-                0x07, 0x69, 0x00, 0x54, //TELinkAttributesTlv
-                0x05, 0x3C, 0x00, 0x04, //IPv4TERouterIdOfRemoteNodeTlv
-                0x00, 0x07, 0x08, 0x00,
-                0x00, 0x03, 0x00, 0x04, //AdministrativeGroupTlv
-                0x00, 0x09, 0x08, 0x00,
-                0x00, 0x09, 0x00, 0x04, //MaximumLinkBandwidthTlv
-                0x00, 0x09, 0x00, 0x00,
-                0x00, 0x0a, 0x00, 0x04, //MaximumReservableLinkBandwidthTlv
-                0x00, 0x10, 0x00, 0x00,
-                0x00, 0x0b, 0x00, 0x04, //UnreservedBandwidthTlv
-                0x00, 0x00, (byte) 0x90, 0x00,
-                0x34, 0x58, 0x00, 0x04, //TEDefaultMetricTlv
-                0x00, (byte) 0x99, 0x09, 0x00,
-                0x00, 0x14, 0x00, 0x02, //LinkProtectionTypeTlv
-                0x09, 0x00, 0x00, 0x00,
-                0x04, 0x46, 0x00, 0x01, //MPLSProtocolMaskTlv
-                (byte) 0x80, 0x00, 0x00, 0x00,
-                0x04, 0x47, 0x00, 0x03, //IGPMetricTlv
-                0x09, (byte) 0x89, 0x07, 0x00,
-                0x04, 0x48, 0x00, 0x08, //SharedRiskLinkGroupTlv
-                0x04, 0x47, 0x00, 0x03,
-                0x04, 0x47, 0x00, 0x03
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv), TENodeAttributesTlv(NodeFlagBitsTlv
-     * OpaqueNodeAttributeTlv, NodeNameTlv, ISISAreaIdentifierTlv, IPv4TERouterIdOfLocalNodeTlv)
-     * TELinkAttributesTlv(IPv4TERouterIdOfRemoteNodeTlv, IPv6TERouterIdofRemoteNodeTlv, AdministrativeGroupTlv
-     * MaximumLinkBandwidthTlv, MaximumReservableLinkBandwidthTlv, UnreservedBandwidthTlv, TEDefaultMetricTlv
-     * LinkProtectionTypeTlv, MPLSProtocolMaskTlv, IGPMetricTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest25() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x01, (byte) 0x104, // common header
-                0x0E, 0x10, 0x01, 0x00, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x28, //TENodeAttributesTlv
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x03, (byte) 0xEF, 0x00, 0x08, //NodeNameTlv
-                0x08, 0x00, 0x01, 0x09,
-                0x08, 0x00, 0x01, 0x09,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02,
-                0x07, 0x69, 0x00, 0x48, //TELinkAttributesTlv
-                0x05, 0x3C, 0x00, 0x04, //IPv4TERouterIdOfRemoteNodeTlv
-                0x00, 0x07, 0x08, 0x00,
-                0x00, 0x03, 0x00, 0x04, //AdministrativeGroupTlv
-                0x00, 0x09, 0x08, 0x00,
-                0x00, 0x09, 0x00, 0x04, //MaximumLinkBandwidthTlv
-                0x00, 0x09, 0x00, 0x00,
-                0x00, 0x0a, 0x00, 0x04, //MaximumReservableLinkBandwidthTlv
-                0x00, 0x10, 0x00, 0x00,
-                0x00, 0x0b, 0x00, 0x04, //UnreservedBandwidthTlv
-                0x00, 0x00, (byte) 0x90, 0x00,
-                0x34, 0x58, 0x00, 0x04, //TEDefaultMetricTlv
-                0x00, (byte) 0x99, 0x09, 0x00,
-                0x00, 0x14, 0x00, 0x02, //LinkProtectionTypeTlv
-                0x09, 0x00, 0x00, 0x00,
-                0x04, 0x46, 0x00, 0x01, //MPLSProtocolMaskTlv
-                (byte) 0x80, 0x00, 0x00, 0x00,
-                0x04, 0x47, 0x00, 0x03, //IGPMetricTlv
-                0x09, (byte) 0x89, 0x07, 0x00
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgExtTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgExtTest.java
index 40234a6..fd21ba2 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgExtTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgExtTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -34,7 +35,7 @@
      * Metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest1() throws PcepParseException {
+    public void pcepUpdateMsgTest1() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x8c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -80,7 +81,7 @@
      * LSPA, Bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest2() throws PcepParseException {
+    public void pcepUpdateMsgTest2() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -121,7 +122,7 @@
      * Metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest3() throws PcepParseException {
+    public void pcepUpdateMsgTest3() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x08, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -159,7 +160,7 @@
      * Metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest4() throws PcepParseException {
+    public void pcepUpdateMsgTest4() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x5c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -198,7 +199,7 @@
      * Metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest5() throws PcepParseException {
+    public void pcepUpdateMsgTest5() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x14, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -238,7 +239,7 @@
      * Metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest6() throws PcepParseException {
+    public void pcepUpdateMsgTest6() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x5c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -277,7 +278,7 @@
      * bandwidth object Metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest7() throws PcepParseException {
+    public void pcepUpdateMsgTest7() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -317,7 +318,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest8() throws PcepParseException {
+    public void pcepUpdateMsgTest8() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x5c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -357,7 +358,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest9() throws PcepParseException {
+    public void pcepUpdateMsgTest9() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x18, 0x00, 0x00, 0x10, 0x03,
@@ -396,7 +397,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest10() throws PcepParseException {
+    public void pcepUpdateMsgTest10() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x50,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -434,7 +435,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest11() throws PcepParseException {
+    public void pcepUpdateMsgTest11() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x14, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -473,7 +474,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest12() throws PcepParseException {
+    public void pcepUpdateMsgTest12() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x50,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -511,7 +512,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest13() throws PcepParseException {
+    public void pcepUpdateMsgTest13() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -550,7 +551,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest14() throws PcepParseException {
+    public void pcepUpdateMsgTest14() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -590,7 +591,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest15() throws PcepParseException {
+    public void pcepUpdateMsgTest15() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x4c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x08, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -627,7 +628,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest16() throws PcepParseException {
+    public void pcepUpdateMsgTest16() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -665,7 +666,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest17() throws PcepParseException {
+    public void pcepUpdateMsgTest17() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x14, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -704,7 +705,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest18() throws PcepParseException {
+    public void pcepUpdateMsgTest18() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -742,7 +743,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest19() throws PcepParseException {
+    public void pcepUpdateMsgTest19() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x5c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -781,7 +782,7 @@
      * Bandwidth , metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest20() throws PcepParseException {
+    public void pcepUpdateMsgTest20() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -820,7 +821,7 @@
      * Bandwidth , metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest21() throws PcepParseException {
+    public void pcepUpdateMsgTest21() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x40,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x08, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -856,7 +857,7 @@
      * Bandwidth , metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest22() throws PcepParseException {
+    public void pcepUpdateMsgTest22() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x48,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -893,7 +894,7 @@
      * Bandwidth , metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest23() throws PcepParseException {
+    public void pcepUpdateMsgTest23() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x4c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x14, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -931,7 +932,7 @@
      * Bandwidth , metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest24() throws PcepParseException {
+    public void pcepUpdateMsgTest24() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x48,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -968,7 +969,7 @@
      * Bandwidth , metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest25() throws PcepParseException {
+    public void pcepUpdateMsgTest25() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x50,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1006,7 +1007,7 @@
      * LSPA object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest26() throws PcepParseException {
+    public void pcepUpdateMsgTest26() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -1045,7 +1046,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest27() throws PcepParseException {
+    public void pcepUpdateMsgTest27() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x34,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x08, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -1080,7 +1081,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest28() throws PcepParseException {
+    public void pcepUpdateMsgTest28() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x40,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -1116,7 +1117,7 @@
      * lspa object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest29() throws PcepParseException {
+    public void pcepUpdateMsgTest29() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1155,7 +1156,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest30() throws PcepParseException {
+    public void pcepUpdateMsgTest30() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x48,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1193,7 +1194,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest31() throws PcepParseException {
+    public void pcepUpdateMsgTest31() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x4c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1231,7 +1232,7 @@
      * Metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest32() throws PcepParseException {
+    public void pcepUpdateMsgTest32() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgTest.java
index 1db3064..3d0ba27 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -29,7 +30,7 @@
      * This test case checks for SRP, LSP (StatefulIPv4LspIdentidiersTlv), ERO in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest1() throws PcepParseException {
+    public void pcepUpdateMsgTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x30,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -64,7 +65,7 @@
      * SymbolicPathNameTlv, StatefulLspErrorCodeTlv), ERO, LSPA, Metric-list in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest2() throws PcepParseException {
+    public void pcepUpdateMsgTest2() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x94,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -108,7 +109,7 @@
      * ERO objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest3() throws PcepParseException {
+    public void pcepUpdateMsgTest3() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x38,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -145,7 +146,7 @@
      * SymbolicPathNameTlv), ERO objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest4() throws PcepParseException {
+    public void pcepUpdateMsgTest4() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x40,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -183,7 +184,7 @@
      * SymbolicPathNameTlv), ERO objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest5() throws PcepParseException {
+    public void pcepUpdateMsgTest5() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x40,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -221,7 +222,7 @@
      * StatefulLspErrorCodeTlv), ERO objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest6() throws PcepParseException {
+    public void pcepUpdateMsgTest6() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x48,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -261,7 +262,7 @@
      * StatefulLspErrorCodeTlv), ERO objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest7() throws PcepParseException {
+    public void pcepUpdateMsgTest7() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x48,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -299,7 +300,7 @@
      * StatefulLspErrorCodeTlv), ERO (IPv4SubObject) objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest8() throws PcepParseException {
+    public void pcepUpdateMsgTest8() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x50,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -339,7 +340,7 @@
      * StatefulLspErrorCodeTlv), ERO (IPv4SubObject, IPv4SubObject) objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest9() throws PcepParseException {
+    public void pcepUpdateMsgTest9() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -380,7 +381,7 @@
      * StatefulLspErrorCodeTlv), ERO (IPv4SubObject, IPv4SubObject), LSPA objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest10() throws PcepParseException {
+    public void pcepUpdateMsgTest10() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x6c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -423,7 +424,7 @@
      * StatefulLspErrorCodeTlv), ERO (IPv4SubObject, IPv4SubObject),LSPA, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest11() throws PcepParseException {
+    public void pcepUpdateMsgTest11() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x78,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -467,7 +468,7 @@
      * StatefulLspErrorCodeTlv), ERO (IPv4SubObject, IPv4SubObject),LSPA, metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest12() throws PcepParseException {
+    public void pcepUpdateMsgTest12() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -510,7 +511,7 @@
      * StatefulLspErrorCodeTlv), ERO (IPv4SubObject, IPv4SubObject),LSPA, metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest13() throws PcepParseException {
+    public void pcepUpdateMsgTest13() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -553,7 +554,7 @@
      * ERO (IPv4SubObject, IPv4SubObject),LSPA, metric Object objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest14() throws PcepParseException {
+    public void pcepUpdateMsgTest14() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -595,7 +596,7 @@
      * ERO (IPv4SubObject, IPv4SubObject),LSPA, metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest15() throws PcepParseException {
+    public void pcepUpdateMsgTest15() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -637,7 +638,7 @@
      * ERO (IPv4SubObject, IPv4SubObject),LSPA, metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest16() throws PcepParseException {
+    public void pcepUpdateMsgTest16() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -678,7 +679,7 @@
      * ERO (IPv4SubObject, IPv4SubObject),LSPA objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest17() throws PcepParseException {
+    public void pcepUpdateMsgTest17() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -718,7 +719,7 @@
      * ERO (IPv4SubObject, IPv4SubObject),Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest18() throws PcepParseException {
+    public void pcepUpdateMsgTest18() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x4c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -757,7 +758,7 @@
      * ERO (IPv4SubObject, IPv4SubObject),Metric-list objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest19() throws PcepParseException {
+    public void pcepUpdateMsgTest19() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -797,7 +798,7 @@
      * StatefulLspErrorCodeTlv),ERO (IPv4SubObject, IPv4SubObject),LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest20() throws PcepParseException {
+    public void pcepUpdateMsgTest20() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x80,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -842,7 +843,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), Bandwidth objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest21() throws PcepParseException {
+    public void pcepUpdateMsgTest21() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x48,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -881,7 +882,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest22() throws PcepParseException {
+    public void pcepUpdateMsgTest22() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x5C,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -922,7 +923,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest23() throws PcepParseException {
+    public void pcepUpdateMsgTest23() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -964,7 +965,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest24() throws PcepParseException {
+    public void pcepUpdateMsgTest24() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1007,7 +1008,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest25() throws PcepParseException {
+    public void pcepUpdateMsgTest25() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1051,7 +1052,7 @@
      * Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest26() throws PcepParseException {
+    public void pcepUpdateMsgTest26() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x78,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1095,7 +1096,7 @@
      * Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest27() throws PcepParseException {
+    public void pcepUpdateMsgTest27() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x78,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1140,7 +1141,7 @@
      * LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest28() throws PcepParseException {
+    public void pcepUpdateMsgTest28() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x80,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1185,7 +1186,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest29() throws PcepParseException {
+    public void pcepUpdateMsgTest29() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1227,7 +1228,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest30() throws PcepParseException {
+    public void pcepUpdateMsgTest30() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1266,7 +1267,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest31() throws PcepParseException {
+    public void pcepUpdateMsgTest31() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x5c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1306,7 +1307,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest32() throws PcepParseException {
+    public void pcepUpdateMsgTest32() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1345,7 +1346,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest33() throws PcepParseException {
+    public void pcepUpdateMsgTest33() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x5c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1385,7 +1386,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest34() throws PcepParseException {
+    public void pcepUpdateMsgTest34() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AdministrativeGroupSubTlvTest.java
similarity index 72%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AdministrativeGroupSubTlvTest.java
index eb3a16a..2ec8b4a 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AdministrativeGroupSubTlvTest.java
@@ -19,13 +19,12 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv4InterfaceAddressTlv.
+ * Test of the AdministrativeGroupSubTlv.
  */
-public class IPv4InterfaceAddressTlvTest {
-
-    private final IPv4InterfaceAddressTlv tlv1 = IPv4InterfaceAddressTlv.of(2);
-    private final IPv4InterfaceAddressTlv sameAsTlv1 = IPv4InterfaceAddressTlv.of(2);
-    private final IPv4InterfaceAddressTlv tlv2 = IPv4InterfaceAddressTlv.of(3);
+public class AdministrativeGroupSubTlvTest {
+    private final AdministrativeGroupSubTlv tlv1 = AdministrativeGroupSubTlv.of(1);
+    private final AdministrativeGroupSubTlv sameAsTlv1 = AdministrativeGroupSubTlv.of(1);
+    private final AdministrativeGroupSubTlv tlv2 = AdministrativeGroupSubTlv.of(2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AdministrativeGroupTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AdministrativeGroupTlvTest.java
deleted file mode 100644
index 41e8844..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AdministrativeGroupTlvTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the AdministrativeGroupTlv.
- */
-public class AdministrativeGroupTlvTest {
-    private final AdministrativeGroupTlv tlv1 = AdministrativeGroupTlv.of(1);
-    private final AdministrativeGroupTlv sameAsTlv1 = AdministrativeGroupTlv.of(1);
-    private final AdministrativeGroupTlv tlv2 = AdministrativeGroupTlv.of(2);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemNumberSubObjectTest.java
similarity index 61%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemNumberSubObjectTest.java
index 4e022b8..83bb86f 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemNumberSubObjectTest.java
@@ -19,21 +19,19 @@
 import org.junit.Test;
 
 /**
- * Test of the MaximumLinkBandwidthTlv.
+ * Test of the AutonomousSystemNumberSubObject.
  */
-public class MaximumLinkBandwidthTlvTest {
-    private final int rawValue1 = 0x0A;
-    private final int rawValue2 = 0x0B;
+public class AutonomousSystemNumberSubObjectTest {
 
-    private final MaximumLinkBandwidthTlv tlv1 = new MaximumLinkBandwidthTlv(rawValue1);
-    private final MaximumLinkBandwidthTlv sameAsTlv1 = new MaximumLinkBandwidthTlv(rawValue1);
-    private final MaximumLinkBandwidthTlv tlv2 = MaximumLinkBandwidthTlv.of(rawValue2);
+    private final AutonomousSystemNumberSubObject subObj1 = AutonomousSystemNumberSubObject.of((short) 2);
+    private final AutonomousSystemNumberSubObject sameAsSubObj1 = AutonomousSystemNumberSubObject.of((short) 2);
+    private final AutonomousSystemNumberSubObject subObj2 = AutonomousSystemNumberSubObject.of((short) 3);
 
     @Test
     public void basics() {
         new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
+        .addEqualityGroup(subObj1, sameAsSubObj1)
+        .addEqualityGroup(subObj2)
         .testEquals();
     }
 }
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemSubTlvTest.java
similarity index 73%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemSubTlvTest.java
index eb3a16a..a959af7 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemSubTlvTest.java
@@ -19,13 +19,12 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv4InterfaceAddressTlv.
+ * Test of the AutonomousSystemSubTlv.
  */
-public class IPv4InterfaceAddressTlvTest {
-
-    private final IPv4InterfaceAddressTlv tlv1 = IPv4InterfaceAddressTlv.of(2);
-    private final IPv4InterfaceAddressTlv sameAsTlv1 = IPv4InterfaceAddressTlv.of(2);
-    private final IPv4InterfaceAddressTlv tlv2 = IPv4InterfaceAddressTlv.of(3);
+public class AutonomousSystemSubTlvTest {
+    private final AutonomousSystemSubTlv tlv1 = AutonomousSystemSubTlv.of(1);
+    private final AutonomousSystemSubTlv sameAsTlv1 = AutonomousSystemSubTlv.of(1);
+    private final AutonomousSystemSubTlv tlv2 = AutonomousSystemSubTlv.of(2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BgpLsIdentifierSubTlvTest.java
similarity index 74%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BgpLsIdentifierSubTlvTest.java
index 904a71e..222c468 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BgpLsIdentifierSubTlvTest.java
@@ -19,12 +19,12 @@
 import org.junit.Test;
 
 /**
- * Test of the AutonomousSystemTlv.
+ * Test of the BgpLsIdentifierSubTlv.
  */
-public class AutonomousSystemTlvTest {
-    private final AutonomousSystemTlv tlv1 = AutonomousSystemTlv.of(1);
-    private final AutonomousSystemTlv sameAsTlv1 = AutonomousSystemTlv.of(1);
-    private final AutonomousSystemTlv tlv2 = AutonomousSystemTlv.of(2);
+public class BgpLsIdentifierSubTlvTest {
+    private final BgpLsIdentifierSubTlv tlv1 = BgpLsIdentifierSubTlv.of(1);
+    private final BgpLsIdentifierSubTlv sameAsTlv1 = BgpLsIdentifierSubTlv.of(1);
+    private final BgpLsIdentifierSubTlv tlv2 = BgpLsIdentifierSubTlv.of(2);
 
     @Test
     public void basics() {
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
deleted file mode 100644
index 78137a7..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BgpLsIdentifierTlvTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * 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);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressSubTlvTest.java
similarity index 71%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressSubTlvTest.java
index eb3a16a..40574a9 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressSubTlvTest.java
@@ -19,13 +19,13 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv4InterfaceAddressTlv.
+ * Test of the IPv4InterfaceAddressSubTlv.
  */
-public class IPv4InterfaceAddressTlvTest {
+public class IPv4InterfaceAddressSubTlvTest {
 
-    private final IPv4InterfaceAddressTlv tlv1 = IPv4InterfaceAddressTlv.of(2);
-    private final IPv4InterfaceAddressTlv sameAsTlv1 = IPv4InterfaceAddressTlv.of(2);
-    private final IPv4InterfaceAddressTlv tlv2 = IPv4InterfaceAddressTlv.of(3);
+    private final IPv4InterfaceAddressSubTlv tlv1 = IPv4InterfaceAddressSubTlv.of(2);
+    private final IPv4InterfaceAddressSubTlv sameAsTlv1 = IPv4InterfaceAddressSubTlv.of(2);
+    private final IPv4InterfaceAddressSubTlv tlv2 = IPv4InterfaceAddressSubTlv.of(3);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressSubTlvTest.java
similarity index 72%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressSubTlvTest.java
index eb3a16a..b0d8e2a 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressSubTlvTest.java
@@ -19,13 +19,13 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv4InterfaceAddressTlv.
+ * Test of the IPv4NeighborAddressSubTlv.
  */
-public class IPv4InterfaceAddressTlvTest {
+public class IPv4NeighborAddressSubTlvTest {
 
-    private final IPv4InterfaceAddressTlv tlv1 = IPv4InterfaceAddressTlv.of(2);
-    private final IPv4InterfaceAddressTlv sameAsTlv1 = IPv4InterfaceAddressTlv.of(2);
-    private final IPv4InterfaceAddressTlv tlv2 = IPv4InterfaceAddressTlv.of(3);
+    private final IPv4NeighborAddressSubTlv tlv1 = IPv4NeighborAddressSubTlv.of(2);
+    private final IPv4NeighborAddressSubTlv sameAsTlv1 = IPv4NeighborAddressSubTlv.of(2);
+    private final IPv4NeighborAddressSubTlv tlv2 = IPv4NeighborAddressSubTlv.of(3);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java
deleted file mode 100644
index 5f10b4c..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the IPv4NeighborAddressTlv.
- */
-public class IPv4NeighborAddressTlvTest {
-
-    private final IPv4NeighborAddressTlv tlv1 = IPv4NeighborAddressTlv.of(2);
-    private final IPv4NeighborAddressTlv sameAsTlv1 = IPv4NeighborAddressTlv.of(2);
-    private final IPv4NeighborAddressTlv tlv2 = IPv4NeighborAddressTlv.of(3);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4RouterIdOfLocalNodeSubTlvTest.java
similarity index 70%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4RouterIdOfLocalNodeSubTlvTest.java
index f40ede0..89e1878 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4RouterIdOfLocalNodeSubTlvTest.java
@@ -19,13 +19,13 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv4TERouterIdOfRemoteNodeTlv.
+ * Test of the IPv4RouterIdOfLocalNodeSubTlv.
  */
-public class IPv4TERouterIdOfRemoteNodeTlvTest {
+public class IPv4RouterIdOfLocalNodeSubTlvTest {
 
-    private final IPv4TERouterIdOfRemoteNodeTlv tlv1 = IPv4TERouterIdOfRemoteNodeTlv.of(2);
-    private final IPv4TERouterIdOfRemoteNodeTlv sameAsTlv1 = IPv4TERouterIdOfRemoteNodeTlv.of(2);
-    private final IPv4TERouterIdOfRemoteNodeTlv tlv2 = IPv4TERouterIdOfRemoteNodeTlv.of(3);
+    private final IPv4RouterIdOfLocalNodeSubTlv tlv1 = IPv4RouterIdOfLocalNodeSubTlv.of(2);
+    private final IPv4RouterIdOfLocalNodeSubTlv sameAsTlv1 = IPv4RouterIdOfLocalNodeSubTlv.of(2);
+    private final IPv4RouterIdOfLocalNodeSubTlv tlv2 = IPv4RouterIdOfLocalNodeSubTlv.of(3);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4RouterIdOfRemoteNodeSubTlvTest.java
similarity index 70%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4RouterIdOfRemoteNodeSubTlvTest.java
index f40ede0..778d227 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4RouterIdOfRemoteNodeSubTlvTest.java
@@ -19,13 +19,13 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv4TERouterIdOfRemoteNodeTlv.
+ * Test of the IPv4RouterIdOfRemoteNodeSubTlv.
  */
-public class IPv4TERouterIdOfRemoteNodeTlvTest {
+public class IPv4RouterIdOfRemoteNodeSubTlvTest {
 
-    private final IPv4TERouterIdOfRemoteNodeTlv tlv1 = IPv4TERouterIdOfRemoteNodeTlv.of(2);
-    private final IPv4TERouterIdOfRemoteNodeTlv sameAsTlv1 = IPv4TERouterIdOfRemoteNodeTlv.of(2);
-    private final IPv4TERouterIdOfRemoteNodeTlv tlv2 = IPv4TERouterIdOfRemoteNodeTlv.of(3);
+    private final IPv4RouterIdOfRemoteNodeSubTlv tlv1 = IPv4RouterIdOfRemoteNodeSubTlv.of(2);
+    private final IPv4RouterIdOfRemoteNodeSubTlv sameAsTlv1 = IPv4RouterIdOfRemoteNodeSubTlv.of(2);
+    private final IPv4RouterIdOfRemoteNodeSubTlv tlv2 = IPv4RouterIdOfRemoteNodeSubTlv.of(3);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfLocalNodeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfLocalNodeTlvTest.java
deleted file mode 100644
index 3880ca7..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfLocalNodeTlvTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the IPv4TERouterIdOfLocalNodeTlv.
- */
-public class IPv4TERouterIdOfLocalNodeTlvTest {
-
-    private final IPv4TERouterIdOfLocalNodeTlv tlv1 = IPv4TERouterIdOfLocalNodeTlv.of(2);
-    private final IPv4TERouterIdOfLocalNodeTlv sameAsTlv1 = IPv4TERouterIdOfLocalNodeTlv.of(2);
-    private final IPv4TERouterIdOfLocalNodeTlv tlv2 = IPv4TERouterIdOfLocalNodeTlv.of(3);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6InterfaceAddressTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6InterfaceAddressSubTlvTest.java
similarity index 78%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6InterfaceAddressTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6InterfaceAddressSubTlvTest.java
index 0f8e37c..79a3260 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6InterfaceAddressTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6InterfaceAddressSubTlvTest.java
@@ -19,18 +19,18 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv6InterfaceAddressTlv.
+ * Test of the IPv6InterfaceAddressSubTlv.
  */
-public class IPv6InterfaceAddressTlvTest {
+public class IPv6InterfaceAddressSubTlvTest {
 
     private final byte[] b1 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x29, 0x00, 0x02, 0x00, 0x00};
     private final byte[] b2 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x30, 0x00, 0x02, 0x00, 0x01};
 
-    private final IPv6InterfaceAddressTlv tlv1 = IPv6InterfaceAddressTlv.of(b1);
-    private final IPv6InterfaceAddressTlv sameAsTlv1 = IPv6InterfaceAddressTlv.of(b1);
-    private final IPv6InterfaceAddressTlv tlv2 = IPv6InterfaceAddressTlv.of(b2);
+    private final IPv6InterfaceAddressSubTlv tlv1 = IPv6InterfaceAddressSubTlv.of(b1);
+    private final IPv6InterfaceAddressSubTlv sameAsTlv1 = IPv6InterfaceAddressSubTlv.of(b1);
+    private final IPv6InterfaceAddressSubTlv tlv2 = IPv6InterfaceAddressSubTlv.of(b2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6NeighborAddressTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6NeighborAddressSubTlvTest.java
similarity index 79%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6NeighborAddressTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6NeighborAddressSubTlvTest.java
index 57ad769..375ce49 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6NeighborAddressTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6NeighborAddressSubTlvTest.java
@@ -19,18 +19,18 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv6NeighborAddressTlv.
+ * Test of the IPv6NeighborAddressSubTlv.
  */
-public class IPv6NeighborAddressTlvTest {
+public class IPv6NeighborAddressSubTlvTest {
 
     private final byte[] b1 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x29, 0x00, 0x02, 0x00, 0x00};
     private final byte[] b2 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x30, 0x00, 0x02, 0x00, 0x01};
 
-    private final IPv6NeighborAddressTlv tlv1 = IPv6NeighborAddressTlv.of(b1);
-    private final IPv6NeighborAddressTlv sameAsTlv1 = IPv6NeighborAddressTlv.of(b1);
-    private final IPv6NeighborAddressTlv tlv2 = IPv6NeighborAddressTlv.of(b2);
+    private final IPv6NeighborAddressSubTlv tlv1 = IPv6NeighborAddressSubTlv.of(b1);
+    private final IPv6NeighborAddressSubTlv sameAsTlv1 = IPv6NeighborAddressSubTlv.of(b1);
+    private final IPv6NeighborAddressSubTlv tlv2 = IPv6NeighborAddressSubTlv.of(b2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6RouterIdofLocalNodeSubTlvTest.java
similarity index 77%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6RouterIdofLocalNodeSubTlvTest.java
index f382860..6bd63a6 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6RouterIdofLocalNodeSubTlvTest.java
@@ -19,18 +19,18 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv6TERouterIdofRemoteNodeTlv.
+ * Test of the IPv6RouterIdofLocalNodeSubTlv.
  */
-public class IPv6TERouterIdofRemoteNodeTlvTest {
+public class IPv6RouterIdofLocalNodeSubTlvTest {
 
     private final byte[] b1 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x29, 0x00, 0x02, 0x00, 0x00};
     private final byte[] b2 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x30, 0x00, 0x02, 0x00, 0x00 };
 
-    private final IPv6TERouterIdofRemoteNodeTlv tlv1 = IPv6TERouterIdofRemoteNodeTlv.of(b1);
-    private final IPv6TERouterIdofRemoteNodeTlv sameAsTlv1 = IPv6TERouterIdofRemoteNodeTlv.of(b1);
-    private final IPv6TERouterIdofRemoteNodeTlv tlv2 = IPv6TERouterIdofRemoteNodeTlv.of(b2);
+    private final IPv6RouterIdofLocalNodeSubTlv tlv1 = IPv6RouterIdofLocalNodeSubTlv.of(b1);
+    private final IPv6RouterIdofLocalNodeSubTlv sameAsTlv1 = IPv6RouterIdofLocalNodeSubTlv.of(b1);
+    private final IPv6RouterIdofLocalNodeSubTlv tlv2 = IPv6RouterIdofLocalNodeSubTlv.of(b2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6RouterIdofRemoteNodeSubTlvTest.java
similarity index 77%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6RouterIdofRemoteNodeSubTlvTest.java
index f382860..eb04558 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6RouterIdofRemoteNodeSubTlvTest.java
@@ -19,18 +19,18 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv6TERouterIdofRemoteNodeTlv.
+ * Test of the IPv6RouterIdofRemoteNodeSubTlv.
  */
-public class IPv6TERouterIdofRemoteNodeTlvTest {
+public class IPv6RouterIdofRemoteNodeSubTlvTest {
 
     private final byte[] b1 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x29, 0x00, 0x02, 0x00, 0x00};
     private final byte[] b2 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x30, 0x00, 0x02, 0x00, 0x00 };
 
-    private final IPv6TERouterIdofRemoteNodeTlv tlv1 = IPv6TERouterIdofRemoteNodeTlv.of(b1);
-    private final IPv6TERouterIdofRemoteNodeTlv sameAsTlv1 = IPv6TERouterIdofRemoteNodeTlv.of(b1);
-    private final IPv6TERouterIdofRemoteNodeTlv tlv2 = IPv6TERouterIdofRemoteNodeTlv.of(b2);
+    private final IPv6RouterIdofRemoteNodeSubTlv tlv1 = IPv6RouterIdofRemoteNodeSubTlv.of(b1);
+    private final IPv6RouterIdofRemoteNodeSubTlv sameAsTlv1 = IPv6RouterIdofRemoteNodeSubTlv.of(b1);
+    private final IPv6RouterIdofRemoteNodeSubTlv tlv2 = IPv6RouterIdofRemoteNodeSubTlv.of(b2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofLocalNodeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofLocalNodeTlvTest.java
deleted file mode 100644
index 6516ed3..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofLocalNodeTlvTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the IPv6TERouterIdofLocalNodeTlv.
- */
-public class IPv6TERouterIdofLocalNodeTlvTest {
-
-    private final byte[] b1 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
-            (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x29, 0x00, 0x02, 0x00, 0x00};
-    private final byte[] b2 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
-            (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x30, 0x00, 0x02, 0x00, 0x00 };
-
-    private final IPv6TERouterIdofLocalNodeTlv tlv1 = IPv6TERouterIdofLocalNodeTlv.of(b1);
-    private final IPv6TERouterIdofLocalNodeTlv sameAsTlv1 = IPv6TERouterIdofLocalNodeTlv.of(b1);
-    private final IPv6TERouterIdofLocalNodeTlv tlv2 = IPv6TERouterIdofLocalNodeTlv.of(b2);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
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/IgpMetricSubTlvTest.java
similarity index 77%
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/IgpMetricSubTlvTest.java
index 20c9dc7..20945f2 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/IgpMetricSubTlvTest.java
@@ -19,14 +19,14 @@
 import org.junit.Test;
 
 /**
- * Test of the IGPMetricTlv.
+ * Test of the IgpMetricSubTlv.
  */
-public class IgpMetricTlvTest {
+public class IgpMetricSubTlvTest {
     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 IgpMetricSubTlv tlv1 = IgpMetricSubTlv.of(b1, (short) 2);
+    private final IgpMetricSubTlv sameAsTlv1 = IgpMetricSubTlv.of(b1, (short) 2);
+    private final IgpMetricSubTlv tlv2 = IgpMetricSubTlv.of(b2, (short) 2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RouterIDSubTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpRouterIdSubTlvTest.java
similarity index 77%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RouterIDSubTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpRouterIdSubTlvTest.java
index 2f9e18a..5f36f90 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RouterIDSubTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpRouterIdSubTlvTest.java
@@ -19,20 +19,20 @@
 import org.junit.Test;
 
 /**
- * Test case for Router ID Sub tlv.
+ * Test case for IgpRouterIdSubTlv.
  */
-public class RouterIDSubTlvTest {
+public class IgpRouterIdSubTlvTest {
 
     private final byte[] value1 = {1, 2 };
     private final Short length1 = 2;
-    private final RouterIDSubTlv tlv1 = RouterIDSubTlv.of(value1, length1);
+    private final IgpRouterIdSubTlv tlv1 = IgpRouterIdSubTlv.of(value1, length1);
 
     private final Short length2 = 2;
-    private final RouterIDSubTlv tlv2 = RouterIDSubTlv.of(value1, length2);
+    private final IgpRouterIdSubTlv tlv2 = IgpRouterIdSubTlv.of(value1, length2);
 
     private final byte[] value3 = {1, 2, 3 };
     private final Short length3 = 3;
-    private final RouterIDSubTlv tlv3 = RouterIDSubTlv.of(value3, length3);
+    private final IgpRouterIdSubTlv tlv3 = IgpRouterIdSubTlv.of(value3, length3);
 
     @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/IsisAreaIdentifierSubTlvTest.java
similarity index 74%
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/IsisAreaIdentifierSubTlvTest.java
index a5a14c2..1b91fcd 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/IsisAreaIdentifierSubTlvTest.java
@@ -19,16 +19,16 @@
 import org.junit.Test;
 
 /**
- * Test of the ISISAreaIdentifierTlv.
+ * Test of the IsisAreaIdentifierSubTlv.
  */
-public class IsisAreaIdentifierTlvTest {
+public class IsisAreaIdentifierSubTlvTest {
 
     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 IsisAreaIdentifierSubTlv tlv1 = IsisAreaIdentifierSubTlv.of(b1, (short) 20);
+    private final IsisAreaIdentifierSubTlv sameAsTlv1 = IsisAreaIdentifierSubTlv.of(b1, (short) 20);
+    private final IsisAreaIdentifierSubTlv tlv2 = IsisAreaIdentifierSubTlv.of(b2, (short) 20);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkAttributesTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkAttributesTlvTest.java
new file mode 100644
index 0000000..8c0cb62
--- /dev/null
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkAttributesTlvTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.pcepio.types;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Test case for TE Link Attribute Tlv.
+ */
+public class LinkAttributesTlvTest {
+
+    private final AdministrativeGroupSubTlv administrativeGroupTlv1 = new AdministrativeGroupSubTlv(10);
+    private final MaximumReservableLinkBandwidthSubTlv maximumReservableLinkBandwidthTlv1 =
+            new MaximumReservableLinkBandwidthSubTlv(20);
+
+    private final AdministrativeGroupSubTlv administrativeGroupTlv2 = new AdministrativeGroupSubTlv(20);
+    private final MaximumReservableLinkBandwidthSubTlv maximumReservableLinkBandwidthTlv2 =
+            new MaximumReservableLinkBandwidthSubTlv(30);
+
+    private final List<PcepValueType> llLinkAttributesSubTLV1 = new LinkedList<>();
+    private final boolean a = llLinkAttributesSubTLV1.add(administrativeGroupTlv1);
+    private final boolean b = llLinkAttributesSubTLV1.add(maximumReservableLinkBandwidthTlv1);
+
+    private final List<PcepValueType> llLinkAttributesSubTLV2 = new LinkedList<>();
+
+    private final boolean c = llLinkAttributesSubTLV2.add(administrativeGroupTlv2);
+    private final boolean d = llLinkAttributesSubTLV2.add(maximumReservableLinkBandwidthTlv2);
+
+    private final LinkAttributesTlv tlv1 = LinkAttributesTlv.of(llLinkAttributesSubTLV1);
+    private final LinkAttributesTlv sameAsTlv1 = LinkAttributesTlv.of(llLinkAttributesSubTLV1);
+    private final LinkAttributesTlv tlv2 = LinkAttributesTlv.of(llLinkAttributesSubTLV2);
+
+    @Test
+    public void basics() {
+        new EqualsTester().addEqualityGroup(tlv1, sameAsTlv1).addEqualityGroup(tlv2).testEquals();
+    }
+
+}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkDescriptorsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkDescriptorsTlvTest.java
new file mode 100644
index 0000000..d271595
--- /dev/null
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkDescriptorsTlvTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.pcepio.types;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Test case for TE link descriptors Tlv.
+ */
+public class LinkDescriptorsTlvTest {
+    private final LinkLocalRemoteIdentifiersSubTlv linkLocalRemoteIdentifiersTlv1 = new
+            LinkLocalRemoteIdentifiersSubTlv(10, 10);
+    private final IPv4InterfaceAddressSubTlv iPv4InterfaceAddressTlv1 = new IPv4InterfaceAddressSubTlv(0x01010101);
+
+    private final LinkLocalRemoteIdentifiersSubTlv linkLocalRemoteIdentifiersTlv2 = new
+            LinkLocalRemoteIdentifiersSubTlv(20, 20);
+    private final IPv4InterfaceAddressSubTlv iPv4InterfaceAddressTlv2 = new IPv4InterfaceAddressSubTlv(0x02020202);
+
+    private final List<PcepValueType> llLinkDescriptorsSubTLVs1 = new LinkedList<>();
+    private final boolean a = llLinkDescriptorsSubTLVs1.add(linkLocalRemoteIdentifiersTlv1);
+    private final boolean b = llLinkDescriptorsSubTLVs1.add(iPv4InterfaceAddressTlv1);
+
+    private final List<PcepValueType> llLinkDescriptorsSubTLVs2 = new LinkedList<>();
+    private final boolean c = llLinkDescriptorsSubTLVs2.add(linkLocalRemoteIdentifiersTlv2);
+    private final boolean d = llLinkDescriptorsSubTLVs2.add(iPv4InterfaceAddressTlv2);
+
+    private final LinkDescriptorsTlv tlv1 = LinkDescriptorsTlv.of(llLinkDescriptorsSubTLVs1);
+    private final LinkDescriptorsTlv sameAstlv1 = LinkDescriptorsTlv.of(llLinkDescriptorsSubTLVs1);
+    private final LinkDescriptorsTlv tlv2 = LinkDescriptorsTlv.of(llLinkDescriptorsSubTLVs2);
+
+    @Test
+    public void basics() {
+        new EqualsTester().addEqualityGroup(tlv1, sameAstlv1).addEqualityGroup(tlv2).testEquals();
+    }
+
+}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersSubTlvTest.java
similarity index 68%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersSubTlvTest.java
index f40ede0..9752874 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersSubTlvTest.java
@@ -19,13 +19,13 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv4TERouterIdOfRemoteNodeTlv.
+ * Test of the LinkLocalRemoteIdentifiersSubTlv.
  */
-public class IPv4TERouterIdOfRemoteNodeTlvTest {
+public class LinkLocalRemoteIdentifiersSubTlvTest {
 
-    private final IPv4TERouterIdOfRemoteNodeTlv tlv1 = IPv4TERouterIdOfRemoteNodeTlv.of(2);
-    private final IPv4TERouterIdOfRemoteNodeTlv sameAsTlv1 = IPv4TERouterIdOfRemoteNodeTlv.of(2);
-    private final IPv4TERouterIdOfRemoteNodeTlv tlv2 = IPv4TERouterIdOfRemoteNodeTlv.of(3);
+    private final LinkLocalRemoteIdentifiersSubTlv tlv1 = LinkLocalRemoteIdentifiersSubTlv.of(10, 20);
+    private final LinkLocalRemoteIdentifiersSubTlv sameAsTlv1 = LinkLocalRemoteIdentifiersSubTlv.of(10, 20);
+    private final LinkLocalRemoteIdentifiersSubTlv tlv2 = LinkLocalRemoteIdentifiersSubTlv.of(20, 30);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersTlvTest.java
deleted file mode 100644
index e25bda0..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersTlvTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the LinkLocalRemoteIdentifiersTlv.
- */
-public class LinkLocalRemoteIdentifiersTlvTest {
-
-    private final LinkLocalRemoteIdentifiersTlv tlv1 = LinkLocalRemoteIdentifiersTlv.of(10, 20);
-    private final LinkLocalRemoteIdentifiersTlv sameAsTlv1 = LinkLocalRemoteIdentifiersTlv.of(10, 20);
-    private final LinkLocalRemoteIdentifiersTlv tlv2 = LinkLocalRemoteIdentifiersTlv.of(20, 30);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkNameTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkNameAttributeSubTlvTest.java
similarity index 70%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkNameTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkNameAttributeSubTlvTest.java
index 7d9dcb2..697f015 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkNameTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkNameAttributeSubTlvTest.java
@@ -19,15 +19,15 @@
 import org.junit.Test;
 
 /**
- * Equality test for LinkNameTlv.
+ * Equality test for LinkNameAttributeSubTlv.
  */
-public class LinkNameTlvTest {
+public class LinkNameAttributeSubTlvTest {
     private final byte[] rawValue1 = new byte[] {0x01, 0x00};
     private final byte[] rawValue2 = new byte[] {0x02, 0x00};
 
-    private final LinkNameTlv tlv1 = new LinkNameTlv(rawValue1, (short) rawValue1.length);
-    private final LinkNameTlv sameAsTlv1 = LinkNameTlv.of(tlv1.getValue(), tlv1.getLength());
-    private final LinkNameTlv tlv2 = new LinkNameTlv(rawValue2, (short) 0);
+    private final LinkNameAttributeSubTlv tlv1 = new LinkNameAttributeSubTlv(rawValue1, (short) rawValue1.length);
+    private final LinkNameAttributeSubTlv sameAsTlv1 = LinkNameAttributeSubTlv.of(tlv1.getValue(), tlv1.getLength());
+    private final LinkNameAttributeSubTlv tlv2 = new LinkNameAttributeSubTlv(rawValue2, (short) 0);
 
     @Test
     public void basics() {
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/LinkProtectionTypeSubTlvTest.java
similarity index 72%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MplsProtocolMaskTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkProtectionTypeSubTlvTest.java
index ff87b7a..412cfcc 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/LinkProtectionTypeSubTlvTest.java
@@ -19,15 +19,15 @@
 import org.junit.Test;
 
 /**
- * Test of the MPLSProtocolMaskTlv.
+ * Test of the LinkProtectionTypeSubTlv.
  */
-public class MplsProtocolMaskTlvTest {
+public class LinkProtectionTypeSubTlvTest {
     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 LinkProtectionTypeSubTlv tlv1 = new LinkProtectionTypeSubTlv(rawValue1);
+    private final LinkProtectionTypeSubTlv sameAsTlv1 = new LinkProtectionTypeSubTlv(rawValue1);
+    private final LinkProtectionTypeSubTlv tlv2 = new LinkProtectionTypeSubTlv(rawValue2, (byte) 0);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkProtectionTypeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkProtectionTypeTlvTest.java
deleted file mode 100644
index 61928f2..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkProtectionTypeTlvTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the LinkProtectionTypeTlv.
- */
-public class LinkProtectionTypeTlvTest {
-    private final byte rawValue1 = 0x0A;
-    private final byte rawValue2 = 0x0B;
-
-    private final LinkProtectionTypeTlv tlv1 = new LinkProtectionTypeTlv(rawValue1);
-    private final LinkProtectionTypeTlv sameAsTlv1 = new LinkProtectionTypeTlv(rawValue1);
-    private final LinkProtectionTypeTlv tlv2 = new LinkProtectionTypeTlv(rawValue2, (byte) 0);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LocalNodeDescriptorsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LocalNodeDescriptorsTlvTest.java
new file mode 100644
index 0000000..2570e66
--- /dev/null
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LocalNodeDescriptorsTlvTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.pcepio.types;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Test of the LocalNodeDescriptorsTlv.
+ */
+public class LocalNodeDescriptorsTlvTest {
+
+    private final AutonomousSystemSubTlv baAutoSysTlvRawValue1 = new AutonomousSystemSubTlv(1);
+    private final BgpLsIdentifierSubTlv baBgplsIdRawValue1 = new BgpLsIdentifierSubTlv(1);
+
+    private final AutonomousSystemSubTlv baAutoSysTlvRawValue2 = new AutonomousSystemSubTlv(2);
+    private final BgpLsIdentifierSubTlv baBgplsIdRawValue2 = new BgpLsIdentifierSubTlv(2);
+
+    private final List<PcepValueType> llNodeDescriptorSubTLVs1 = new LinkedList<PcepValueType>();
+    private final boolean a = llNodeDescriptorSubTLVs1.add(baAutoSysTlvRawValue1);
+    private final boolean b = llNodeDescriptorSubTLVs1.add(baBgplsIdRawValue1);
+
+    private final List<PcepValueType> llNodeDescriptorSubTLVs2 = new LinkedList<PcepValueType>();
+    private final boolean c = llNodeDescriptorSubTLVs2.add(baAutoSysTlvRawValue2);
+    private final boolean d = llNodeDescriptorSubTLVs2.add(baBgplsIdRawValue2);
+
+    private final LocalNodeDescriptorsTlv tlv1 = LocalNodeDescriptorsTlv.of(llNodeDescriptorSubTLVs1);
+    private final LocalNodeDescriptorsTlv sameAstlv1 = LocalNodeDescriptorsTlv.of(llNodeDescriptorSubTLVs1);
+    private final LocalNodeDescriptorsTlv tlv2 = LocalNodeDescriptorsTlv.of(llNodeDescriptorSubTLVs2);
+
+    @Test
+    public void basics() {
+        new EqualsTester().addEqualityGroup(tlv1, sameAstlv1).addEqualityGroup(tlv2).testEquals();
+    }
+}
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
deleted file mode 100644
index 17daa75..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlvTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-import java.util.LinkedList;
-
-/**
- * Test of the LocalTENodeDescriptorsTlv.
- */
-public class LocalTENodeDescriptorsTlvTest {
-
-    private final AutonomousSystemTlv baAutoSysTlvRawValue1 = new AutonomousSystemTlv(1);
-    private final BgpLsIdentifierTlv baBgplsIdRawValue1 = new BgpLsIdentifierTlv(1);
-
-    private final AutonomousSystemTlv baAutoSysTlvRawValue2 = new AutonomousSystemTlv(2);
-    private final BgpLsIdentifierTlv baBgplsIdRawValue2 = new BgpLsIdentifierTlv(2);
-
-    private final LinkedList<PcepValueType> llNodeDescriptorSubTLVs1 = new LinkedList<PcepValueType>();
-    private final boolean a = llNodeDescriptorSubTLVs1.add(baAutoSysTlvRawValue1);
-    private final boolean b = llNodeDescriptorSubTLVs1.add(baBgplsIdRawValue1);
-
-    private final LinkedList<PcepValueType> llNodeDescriptorSubTLVs2 = new LinkedList<PcepValueType>();
-    private final boolean c = llNodeDescriptorSubTLVs2.add(baAutoSysTlvRawValue2);
-    private final boolean d = llNodeDescriptorSubTLVs2.add(baBgplsIdRawValue2);
-
-    private final LocalTENodeDescriptorsTlv tlv1 = LocalTENodeDescriptorsTlv.of(llNodeDescriptorSubTLVs1);
-    private final LocalTENodeDescriptorsTlv sameAstlv1 = LocalTENodeDescriptorsTlv.of(llNodeDescriptorSubTLVs1);
-    private final LocalTENodeDescriptorsTlv tlv2 = LocalTENodeDescriptorsTlv.of(llNodeDescriptorSubTLVs2);
-
-    @Test
-    public void basics() {
-        new EqualsTester().addEqualityGroup(tlv1, sameAstlv1).addEqualityGroup(tlv2).testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TedCapabilityTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LsCapabilityTlvTest.java
similarity index 79%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TedCapabilityTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LsCapabilityTlvTest.java
index 18677ca..3766a4d 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TedCapabilityTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LsCapabilityTlvTest.java
@@ -21,11 +21,11 @@
 /**
  * Test case for TED Capability tlv.
  */
-public class TedCapabilityTlvTest {
+public class LsCapabilityTlvTest {
 
-    private final TedCapabilityTlv tlv1 = TedCapabilityTlv.of(1);
-    private final TedCapabilityTlv tlv2 = TedCapabilityTlv.of(1);
-    private final TedCapabilityTlv tlv3 = TedCapabilityTlv.of(2);
+    private final LsCapabilityTlv tlv1 = LsCapabilityTlv.of(1);
+    private final LsCapabilityTlv tlv2 = LsCapabilityTlv.of(1);
+    private final LsCapabilityTlv tlv3 = LsCapabilityTlv.of(2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthSubTlvTest.java
similarity index 72%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthSubTlvTest.java
index 4e022b8..d4b9c6b 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthSubTlvTest.java
@@ -19,15 +19,15 @@
 import org.junit.Test;
 
 /**
- * Test of the MaximumLinkBandwidthTlv.
+ * Test of the MaximumLinkBandwidthSubTlv.
  */
-public class MaximumLinkBandwidthTlvTest {
+public class MaximumLinkBandwidthSubTlvTest {
     private final int rawValue1 = 0x0A;
     private final int rawValue2 = 0x0B;
 
-    private final MaximumLinkBandwidthTlv tlv1 = new MaximumLinkBandwidthTlv(rawValue1);
-    private final MaximumLinkBandwidthTlv sameAsTlv1 = new MaximumLinkBandwidthTlv(rawValue1);
-    private final MaximumLinkBandwidthTlv tlv2 = MaximumLinkBandwidthTlv.of(rawValue2);
+    private final MaximumLinkBandwidthSubTlv tlv1 = new MaximumLinkBandwidthSubTlv(rawValue1);
+    private final MaximumLinkBandwidthSubTlv sameAsTlv1 = new MaximumLinkBandwidthSubTlv(rawValue1);
+    private final MaximumLinkBandwidthSubTlv tlv2 = MaximumLinkBandwidthSubTlv.of(rawValue2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthSubTlvTest.java
similarity index 68%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthSubTlvTest.java
index 4e022b8..85e108d 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthSubTlvTest.java
@@ -19,15 +19,15 @@
 import org.junit.Test;
 
 /**
- * Test of the MaximumLinkBandwidthTlv.
+ * Test of the MaximumReservableLinkBandwidthSubTlv.
  */
-public class MaximumLinkBandwidthTlvTest {
+public class MaximumReservableLinkBandwidthSubTlvTest {
     private final int rawValue1 = 0x0A;
     private final int rawValue2 = 0x0B;
 
-    private final MaximumLinkBandwidthTlv tlv1 = new MaximumLinkBandwidthTlv(rawValue1);
-    private final MaximumLinkBandwidthTlv sameAsTlv1 = new MaximumLinkBandwidthTlv(rawValue1);
-    private final MaximumLinkBandwidthTlv tlv2 = MaximumLinkBandwidthTlv.of(rawValue2);
+    private final MaximumReservableLinkBandwidthSubTlv tlv1 = new MaximumReservableLinkBandwidthSubTlv(rawValue1);
+    private final MaximumReservableLinkBandwidthSubTlv sameAsTlv1 = new MaximumReservableLinkBandwidthSubTlv(rawValue1);
+    private final MaximumReservableLinkBandwidthSubTlv tlv2 = MaximumReservableLinkBandwidthSubTlv.of(rawValue2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthTlvTest.java
deleted file mode 100644
index 7b37035..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthTlvTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the MaximumReservableLinkBandwidthTlv.
- */
-public class MaximumReservableLinkBandwidthTlvTest {
-    private final int rawValue1 = 0x0A;
-    private final int rawValue2 = 0x0B;
-
-    private final MaximumReservableLinkBandwidthTlv tlv1 = new MaximumReservableLinkBandwidthTlv(rawValue1);
-    private final MaximumReservableLinkBandwidthTlv sameAsTlv1 = new MaximumReservableLinkBandwidthTlv(rawValue1);
-    private final MaximumReservableLinkBandwidthTlv tlv2 = MaximumReservableLinkBandwidthTlv.of(rawValue2);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
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/MplsProtocolMaskSubTlvTest.java
similarity index 73%
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/MplsProtocolMaskSubTlvTest.java
index ff87b7a..6e396b8 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/MplsProtocolMaskSubTlvTest.java
@@ -19,15 +19,15 @@
 import org.junit.Test;
 
 /**
- * Test of the MPLSProtocolMaskTlv.
+ * Test of the MplsProtocolMaskSubTlv.
  */
-public class MplsProtocolMaskTlvTest {
+public class MplsProtocolMaskSubTlvTest {
     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 MplsProtocolMaskSubTlv tlv1 = new MplsProtocolMaskSubTlv(rawValue1);
+    private final MplsProtocolMaskSubTlv sameAsTlv1 = new MplsProtocolMaskSubTlv(rawValue1);
+    private final MplsProtocolMaskSubTlv tlv2 = MplsProtocolMaskSubTlv.of(rawValue2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeAttributesTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeAttributesTlvTest.java
new file mode 100644
index 0000000..2c9664d
--- /dev/null
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeAttributesTlvTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.pcepio.types;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Test case for TE Node Attribute tlv.
+ */
+public class NodeAttributesTlvTest {
+
+    private final NodeFlagBitsSubTlv nodeFlagBitsTlv1 = new NodeFlagBitsSubTlv((byte) 10);
+    private final IPv4RouterIdOfLocalNodeSubTlv iPv4TERouterIdOfLocalNodeTlv1 = new
+            IPv4RouterIdOfLocalNodeSubTlv(0x01010101);
+
+    private final NodeFlagBitsSubTlv nodeFlagBitsTlv2 = new NodeFlagBitsSubTlv((byte) 20);
+    private final IPv4RouterIdOfLocalNodeSubTlv iPv4TERouterIdOfLocalNodeTlv2 = new
+            IPv4RouterIdOfLocalNodeSubTlv(0x02020202);
+
+    private final List<PcepValueType> llNodeAttributesSubTLV1 = new LinkedList<>();
+    private final boolean a = llNodeAttributesSubTLV1.add(nodeFlagBitsTlv1);
+    private final boolean b = llNodeAttributesSubTLV1.add(iPv4TERouterIdOfLocalNodeTlv1);
+
+    private final List<PcepValueType> llNodeAttributesSubTLV2 = new LinkedList<>();
+
+    private final boolean c = llNodeAttributesSubTLV2.add(nodeFlagBitsTlv2);
+    private final boolean d = llNodeAttributesSubTLV2.add(iPv4TERouterIdOfLocalNodeTlv2);
+
+    private final NodeAttributesTlv tlv1 = NodeAttributesTlv.of(llNodeAttributesSubTLV1);
+    private final NodeAttributesTlv sameAsTlv1 = NodeAttributesTlv.of(llNodeAttributesSubTLV1);
+    private final NodeAttributesTlv tlv2 = NodeAttributesTlv.of(llNodeAttributesSubTLV2);
+
+    @Test
+    public void basics() {
+        new EqualsTester().addEqualityGroup(tlv1, sameAsTlv1).addEqualityGroup(tlv2).testEquals();
+    }
+
+}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsSubTlvTest.java
similarity index 76%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsSubTlvTest.java
index fb90fed..5179a2c 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsSubTlvTest.java
@@ -19,15 +19,15 @@
 import org.junit.Test;
 
 /**
- * Test of the NodeFlagBitsTlv.
+ * Test of the NodeFlagBitsSubTlv.
  */
-public class NodeFlagBitsTlvTest {
+public class NodeFlagBitsSubTlvTest {
     private final byte rawValue1 = 0x0A;
     private final byte rawValue2 = 0x0B;
 
-    private final NodeFlagBitsTlv tlv1 = new NodeFlagBitsTlv(rawValue1);
-    private final NodeFlagBitsTlv sameAsTlv1 = new NodeFlagBitsTlv(rawValue1);
-    private final NodeFlagBitsTlv tlv2 = NodeFlagBitsTlv.of(rawValue2);
+    private final NodeFlagBitsSubTlv tlv1 = new NodeFlagBitsSubTlv(rawValue1);
+    private final NodeFlagBitsSubTlv sameAsTlv1 = new NodeFlagBitsSubTlv(rawValue1);
+    private final NodeFlagBitsSubTlv tlv2 = NodeFlagBitsSubTlv.of(rawValue2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameSubTlvTest.java
similarity index 74%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameSubTlvTest.java
index d6d53d6..c21c986 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameSubTlvTest.java
@@ -19,15 +19,15 @@
 import org.junit.Test;
 
 /**
- * Test of the NodeNameTlv.
+ * Test of the NodeNameSubTlv.
  */
-public class NodeNameTlvTest {
+public class NodeNameSubTlvTest {
     private final byte[] rawValue1 = new byte[] {0x01, 0x02};
     private final byte[] rawValue2 = new byte[] {0x14, 0x15};
 
-    private final NodeNameTlv tlv1 = new NodeNameTlv(rawValue1, (short) rawValue1.length);
-    private final NodeNameTlv sameAsTlv1 = NodeNameTlv.of(tlv1.getValue(), tlv1.getLength());
-    private final NodeNameTlv tlv2 = new NodeNameTlv(rawValue2, (short) 0);
+    private final NodeNameSubTlv tlv1 = new NodeNameSubTlv(rawValue1, (short) rawValue1.length);
+    private final NodeNameSubTlv sameAsTlv1 = NodeNameSubTlv.of(tlv1.getValue(), tlv1.getLength());
+    private final NodeNameSubTlv tlv2 = new NodeNameSubTlv(rawValue2, (short) 0);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OpaqueLinkAttributeSubTlvTest.java
similarity index 69%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OpaqueLinkAttributeSubTlvTest.java
index d6d53d6..4a4c29e 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OpaqueLinkAttributeSubTlvTest.java
@@ -19,15 +19,17 @@
 import org.junit.Test;
 
 /**
- * Test of the NodeNameTlv.
+ * Test of the OpaqueLinkAttributeSubTlv.
  */
-public class NodeNameTlvTest {
+public class OpaqueLinkAttributeSubTlvTest {
     private final byte[] rawValue1 = new byte[] {0x01, 0x02};
     private final byte[] rawValue2 = new byte[] {0x14, 0x15};
 
-    private final NodeNameTlv tlv1 = new NodeNameTlv(rawValue1, (short) rawValue1.length);
-    private final NodeNameTlv sameAsTlv1 = NodeNameTlv.of(tlv1.getValue(), tlv1.getLength());
-    private final NodeNameTlv tlv2 = new NodeNameTlv(rawValue2, (short) 0);
+    private final OpaqueLinkAttributeSubTlv tlv1 =
+            new OpaqueLinkAttributeSubTlv(rawValue1, (short) rawValue1.length);
+    private final OpaqueLinkAttributeSubTlv sameAsTlv1 =
+            OpaqueLinkAttributeSubTlv.of(tlv1.getValue(), tlv1.getLength());
+    private final OpaqueLinkAttributeSubTlv tlv2 = new OpaqueLinkAttributeSubTlv(rawValue2, (short) 0);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OpaqueLinkAttributeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OpaqueLinkAttributeTlvTest.java
deleted file mode 100644
index f437fb5..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OpaqueLinkAttributeTlvTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the OpaqueLinkAttributeTlv.
- */
-public class OpaqueLinkAttributeTlvTest {
-    private final byte[] rawValue1 = new byte[] {0x01, 0x02};
-    private final byte[] rawValue2 = new byte[] {0x14, 0x15};
-
-    private final OpaqueLinkAttributeTlv tlv1 = new OpaqueLinkAttributeTlv(rawValue1, (short) rawValue1.length);
-    private final OpaqueLinkAttributeTlv sameAsTlv1 = OpaqueLinkAttributeTlv.of(tlv1.getValue(), tlv1.getLength());
-    private final OpaqueLinkAttributeTlv tlv2 = new OpaqueLinkAttributeTlv(rawValue2, (short) 0);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
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
index 2ea3511..4dc4fdd 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
@@ -19,7 +19,7 @@
 import org.junit.Test;
 
 /**
- * Test of the OSPFareaIDsubTlv.
+ * Test of the OspfAreaIdSubTlv.
  */
 public class OspfAreaIdSubTlvTest {
     private final int rawValue1 = 0x0A;
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RemoteNodeDescriptorsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RemoteNodeDescriptorsTlvTest.java
new file mode 100644
index 0000000..ee78b57
--- /dev/null
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RemoteNodeDescriptorsTlvTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.pcepio.types;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Test case for Remote TE Node Descriptors tlv.
+ */
+public class RemoteNodeDescriptorsTlvTest {
+
+    private final AutonomousSystemSubTlv autonomousSystemTlv1 = new AutonomousSystemSubTlv(10);
+    private final BgpLsIdentifierSubTlv bGPLSidentifierTlv1 = new BgpLsIdentifierSubTlv(20);
+
+    private final AutonomousSystemSubTlv autonomousSystemTlv2 = new AutonomousSystemSubTlv(20);
+    private final BgpLsIdentifierSubTlv bGPLSidentifierTlv2 = new BgpLsIdentifierSubTlv(30);
+
+    private final List<PcepValueType> llRemoteTENodeDescriptorSubTLV1 = new LinkedList<>();
+    private final boolean a = llRemoteTENodeDescriptorSubTLV1.add(autonomousSystemTlv1);
+    private final boolean b = llRemoteTENodeDescriptorSubTLV1.add(bGPLSidentifierTlv1);
+
+    private final List<PcepValueType> llRemoteTENodeDescriptorSubTLV2 = new LinkedList<>();
+    private final boolean c = llRemoteTENodeDescriptorSubTLV2.add(autonomousSystemTlv2);
+    private final boolean d = llRemoteTENodeDescriptorSubTLV2.add(bGPLSidentifierTlv2);
+
+    private final RemoteNodeDescriptorsTlv tlv1 = RemoteNodeDescriptorsTlv.of(llRemoteTENodeDescriptorSubTLV1);
+    private final RemoteNodeDescriptorsTlv sameAsTlv1 =
+            RemoteNodeDescriptorsTlv.of(llRemoteTENodeDescriptorSubTLV1);
+    private final RemoteNodeDescriptorsTlv tlv2 = RemoteNodeDescriptorsTlv.of(llRemoteTENodeDescriptorSubTLV2);
+
+    @Test
+    public void basics() {
+        new EqualsTester().addEqualityGroup(tlv1, sameAsTlv1).addEqualityGroup(tlv2).testEquals();
+    }
+
+}
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
deleted file mode 100644
index 8e74921..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlvTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-import java.util.LinkedList;
-
-/**
- * Test case for Remote TE Node Descriptors tlv.
- */
-public class RemoteTENodeDescriptorsTlvTest {
-
-    private final AutonomousSystemTlv autonomousSystemTlv1 = new AutonomousSystemTlv(10);
-    private final BgpLsIdentifierTlv bGPLSidentifierTlv1 = new BgpLsIdentifierTlv(20);
-
-    private final AutonomousSystemTlv autonomousSystemTlv2 = new AutonomousSystemTlv(20);
-    private final BgpLsIdentifierTlv bGPLSidentifierTlv2 = new BgpLsIdentifierTlv(30);
-
-    private final LinkedList<PcepValueType> llRemoteTENodeDescriptorSubTLV1 = new LinkedList<>();
-    private final boolean a = llRemoteTENodeDescriptorSubTLV1.add(autonomousSystemTlv1);
-    private final boolean b = llRemoteTENodeDescriptorSubTLV1.add(bGPLSidentifierTlv1);
-
-    private final LinkedList<PcepValueType> llRemoteTENodeDescriptorSubTLV2 = new LinkedList<>();
-    private final boolean c = llRemoteTENodeDescriptorSubTLV2.add(autonomousSystemTlv2);
-    private final boolean d = llRemoteTENodeDescriptorSubTLV2.add(bGPLSidentifierTlv2);
-
-    private final RemoteTENodeDescriptorsTlv tlv1 = RemoteTENodeDescriptorsTlv.of(llRemoteTENodeDescriptorSubTLV1);
-    private final RemoteTENodeDescriptorsTlv sameAsTlv1 =
-            RemoteTENodeDescriptorsTlv.of(llRemoteTENodeDescriptorSubTLV1);
-    private final RemoteTENodeDescriptorsTlv tlv2 = RemoteTENodeDescriptorsTlv.of(llRemoteTENodeDescriptorSubTLV2);
-
-    @Test
-    public void basics() {
-        new EqualsTester().addEqualityGroup(tlv1, sameAsTlv1).addEqualityGroup(tlv2).testEquals();
-    }
-
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/SharedRiskLinkGroupTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/SharedRiskLinkGroupSubTlvTest.java
similarity index 72%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/SharedRiskLinkGroupTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/SharedRiskLinkGroupSubTlvTest.java
index 7c8ec57..777ff9c 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/SharedRiskLinkGroupTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/SharedRiskLinkGroupSubTlvTest.java
@@ -19,19 +19,19 @@
 import org.junit.Test;
 
 /**
- * Test case for Shared Risk Link Group tlv.
+ * Test case for SharedRiskLinkGroupSubTlv.
  */
-public class SharedRiskLinkGroupTlvTest {
+public class SharedRiskLinkGroupSubTlvTest {
 
     private final int[] raw = {1 };
     private final Short hLength = 2;
-    private final SharedRiskLinkGroupTlv tlv1 = SharedRiskLinkGroupTlv.of(raw, hLength);
+    private final SharedRiskLinkGroupSubTlv tlv1 = SharedRiskLinkGroupSubTlv.of(raw, hLength);
 
-    private final SharedRiskLinkGroupTlv sameAsTlv1 = SharedRiskLinkGroupTlv.of(raw, hLength);
+    private final SharedRiskLinkGroupSubTlv sameAsTlv1 = SharedRiskLinkGroupSubTlv.of(raw, hLength);
 
     private final int[] raw2 = {2 };
     private final Short hLength2 = 3;
-    private final SharedRiskLinkGroupTlv tlv2 = SharedRiskLinkGroupTlv.of(raw2, hLength2);
+    private final SharedRiskLinkGroupSubTlv tlv2 = SharedRiskLinkGroupSubTlv.of(raw2, hLength2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TEDefaultMetricTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TEDefaultMetricSubTlvTest.java
similarity index 73%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TEDefaultMetricTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TEDefaultMetricSubTlvTest.java
index c46b0af..ee63621 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TEDefaultMetricTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TEDefaultMetricSubTlvTest.java
@@ -19,13 +19,13 @@
 import org.junit.Test;
 
 /**
- * Test case for TE Default Metric tlv.
+ * Test case for TEDefaultMetricSubTlv.
  */
-public class TEDefaultMetricTlvTest {
+public class TEDefaultMetricSubTlvTest {
 
-    private final TEDefaultMetricTlv tlv1 = TEDefaultMetricTlv.of(1);
-    private final TEDefaultMetricTlv tlv2 = TEDefaultMetricTlv.of(1);
-    private final TEDefaultMetricTlv tlv3 = TEDefaultMetricTlv.of(2);
+    private final TEDefaultMetricSubTlv tlv1 = TEDefaultMetricSubTlv.of(1);
+    private final TEDefaultMetricSubTlv tlv2 = TEDefaultMetricSubTlv.of(1);
+    private final TEDefaultMetricSubTlv tlv3 = TEDefaultMetricSubTlv.of(2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TELinkAttributesTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TELinkAttributesTlvTest.java
deleted file mode 100644
index 8504a87..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TELinkAttributesTlvTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-import java.util.LinkedList;
-
-/**
- * Test case for TE Link Attribute Tlv.
- */
-public class TELinkAttributesTlvTest {
-
-    private final AdministrativeGroupTlv administrativeGroupTlv1 = new AdministrativeGroupTlv(10);
-    private final MaximumReservableLinkBandwidthTlv maximumReservableLinkBandwidthTlv1 =
-            new MaximumReservableLinkBandwidthTlv(20);
-
-    private final AdministrativeGroupTlv administrativeGroupTlv2 = new AdministrativeGroupTlv(20);
-    private final MaximumReservableLinkBandwidthTlv maximumReservableLinkBandwidthTlv2 =
-            new MaximumReservableLinkBandwidthTlv(30);
-
-    private final LinkedList<PcepValueType> llLinkAttributesSubTLV1 = new LinkedList<>();
-    private final boolean a = llLinkAttributesSubTLV1.add(administrativeGroupTlv1);
-    private final boolean b = llLinkAttributesSubTLV1.add(maximumReservableLinkBandwidthTlv1);
-
-    private final LinkedList<PcepValueType> llLinkAttributesSubTLV2 = new LinkedList<>();
-
-    private final boolean c = llLinkAttributesSubTLV2.add(administrativeGroupTlv2);
-    private final boolean d = llLinkAttributesSubTLV2.add(maximumReservableLinkBandwidthTlv2);
-
-    private final TELinkAttributesTlv tlv1 = TELinkAttributesTlv.of(llLinkAttributesSubTLV1);
-    private final TELinkAttributesTlv sameAsTlv1 = TELinkAttributesTlv.of(llLinkAttributesSubTLV1);
-    private final TELinkAttributesTlv tlv2 = TELinkAttributesTlv.of(llLinkAttributesSubTLV2);
-
-    @Test
-    public void basics() {
-        new EqualsTester().addEqualityGroup(tlv1, sameAsTlv1).addEqualityGroup(tlv2).testEquals();
-    }
-
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TELinkDescriptorsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TELinkDescriptorsTlvTest.java
deleted file mode 100644
index 4e94209..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TELinkDescriptorsTlvTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-import java.util.LinkedList;
-
-/**
- * Test case for TE link descriptors Tlv.
- */
-public class TELinkDescriptorsTlvTest {
-    private final LinkLocalRemoteIdentifiersTlv linkLocalRemoteIdentifiersTlv1 = new
-            LinkLocalRemoteIdentifiersTlv(10, 10);
-    private final IPv4InterfaceAddressTlv iPv4InterfaceAddressTlv1 = new IPv4InterfaceAddressTlv(0x01010101);
-
-    private final LinkLocalRemoteIdentifiersTlv linkLocalRemoteIdentifiersTlv2 = new
-            LinkLocalRemoteIdentifiersTlv(20, 20);
-    private final IPv4InterfaceAddressTlv iPv4InterfaceAddressTlv2 = new IPv4InterfaceAddressTlv(0x02020202);
-
-    private final LinkedList<PcepValueType> llLinkDescriptorsSubTLVs1 = new LinkedList<>();
-    private final boolean a = llLinkDescriptorsSubTLVs1.add(linkLocalRemoteIdentifiersTlv1);
-    private final boolean b = llLinkDescriptorsSubTLVs1.add(iPv4InterfaceAddressTlv1);
-
-    private final LinkedList<PcepValueType> llLinkDescriptorsSubTLVs2 = new LinkedList<>();
-    private final boolean c = llLinkDescriptorsSubTLVs2.add(linkLocalRemoteIdentifiersTlv2);
-    private final boolean d = llLinkDescriptorsSubTLVs2.add(iPv4InterfaceAddressTlv2);
-
-    private final TELinkDescriptorsTlv tlv1 = TELinkDescriptorsTlv.of(llLinkDescriptorsSubTLVs1);
-    private final TELinkDescriptorsTlv sameAstlv1 = TELinkDescriptorsTlv.of(llLinkDescriptorsSubTLVs1);
-    private final TELinkDescriptorsTlv tlv2 = TELinkDescriptorsTlv.of(llLinkDescriptorsSubTLVs2);
-
-    @Test
-    public void basics() {
-        new EqualsTester().addEqualityGroup(tlv1, sameAstlv1).addEqualityGroup(tlv2).testEquals();
-    }
-
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TENodeAttributesTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TENodeAttributesTlvTest.java
deleted file mode 100644
index 28cf27d..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TENodeAttributesTlvTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-import java.util.LinkedList;
-
-/**
- * Test case for TE Node Attribute tlv.
- */
-public class TENodeAttributesTlvTest {
-
-    private final NodeFlagBitsTlv nodeFlagBitsTlv1 = new NodeFlagBitsTlv((byte) 10);
-    private final IPv4TERouterIdOfLocalNodeTlv iPv4TERouterIdOfLocalNodeTlv1 = new
-            IPv4TERouterIdOfLocalNodeTlv(0x01010101);
-
-    private final NodeFlagBitsTlv nodeFlagBitsTlv2 = new NodeFlagBitsTlv((byte) 20);
-    private final IPv4TERouterIdOfLocalNodeTlv iPv4TERouterIdOfLocalNodeTlv2 = new
-            IPv4TERouterIdOfLocalNodeTlv(0x02020202);
-
-    private final LinkedList<PcepValueType> llNodeAttributesSubTLV1 = new LinkedList<>();
-    private final boolean a = llNodeAttributesSubTLV1.add(nodeFlagBitsTlv1);
-    private final boolean b = llNodeAttributesSubTLV1.add(iPv4TERouterIdOfLocalNodeTlv1);
-
-    private final LinkedList<PcepValueType> llNodeAttributesSubTLV2 = new LinkedList<>();
-
-    private final boolean c = llNodeAttributesSubTLV2.add(nodeFlagBitsTlv2);
-    private final boolean d = llNodeAttributesSubTLV2.add(iPv4TERouterIdOfLocalNodeTlv2);
-
-    private final TENodeAttributesTlv tlv1 = TENodeAttributesTlv.of(llNodeAttributesSubTLV1);
-    private final TENodeAttributesTlv sameAsTlv1 = TENodeAttributesTlv.of(llNodeAttributesSubTLV1);
-    private final TENodeAttributesTlv tlv2 = TENodeAttributesTlv.of(llNodeAttributesSubTLV2);
-
-    @Test
-    public void basics() {
-        new EqualsTester().addEqualityGroup(tlv1, sameAsTlv1).addEqualityGroup(tlv2).testEquals();
-    }
-
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/UnreservedBandwidthTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/UnreservedBandwidthSubTlvTest.java
similarity index 72%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/UnreservedBandwidthTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/UnreservedBandwidthSubTlvTest.java
index a50fd9f..f33018f 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/UnreservedBandwidthTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/UnreservedBandwidthSubTlvTest.java
@@ -19,14 +19,14 @@
 import org.junit.Test;
 
 /**
- * Unit Test case for Unreserved Bandwidth Tlv.
+ * Unit Test case for UnreservedBandwidthSubTlv.
  */
-public class UnreservedBandwidthTlvTest {
+public class UnreservedBandwidthSubTlvTest {
 
     // Objects of unreserved bandwidth tlv
-    private final UnreservedBandwidthTlv tlv1 = UnreservedBandwidthTlv.of(100);
-    private final UnreservedBandwidthTlv tlv2 = UnreservedBandwidthTlv.of(100);
-    private final UnreservedBandwidthTlv tlv3 = UnreservedBandwidthTlv.of(200);
+    private final UnreservedBandwidthSubTlv tlv1 = UnreservedBandwidthSubTlv.of(100);
+    private final UnreservedBandwidthSubTlv tlv2 = UnreservedBandwidthSubTlv.of(100);
+    private final UnreservedBandwidthSubTlv tlv3 = UnreservedBandwidthSubTlv.of(200);
 
     @Test
     public void basics() {
