diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlv.java
new file mode 100755
index 0000000..dad08bd
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlv.java
@@ -0,0 +1,91 @@
+/*
+ * 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.isis.io.isispacket.tlv;
+
+import com.google.common.primitives.Bytes;
+import io.netty.buffer.ByteBuf;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents Protocol supported TLV.
+ */
+public class ProtocolSupportedTlv extends TlvHeader implements IsisTlv {
+
+    private List<Byte> protocolSupported = new ArrayList();
+
+    /**
+     * Sets TLV type and TLV length of protocol supported TLV.
+     *
+     * @param tlvHeader tlvHeader.
+     */
+    public ProtocolSupportedTlv(TlvHeader tlvHeader) {
+
+        this.setTlvType(tlvHeader.tlvType());
+        this.setTlvLength(tlvHeader.tlvLength());
+
+    }
+
+    /**
+     * Gets the Protocol Supported by the TLV.
+     *
+     * @return Protocol Supported
+     */
+    public List<Byte> protocolSupported() {
+
+        return this.protocolSupported;
+
+    }
+
+    @Override
+    public void readFrom(ByteBuf byteBuf) {
+
+        while (byteBuf.readableBytes() > 0) {
+            this.protocolSupported.add(byteBuf.readByte());
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] bytes = null;
+
+        byte[] tlvHeader = tlvHeaderAsByteArray();
+        byte[] tlvBody = tlvBodyAsBytes();
+        bytes = Bytes.concat(tlvHeader, tlvBody);
+
+        return bytes;
+    }
+
+    /**
+     * Gets TLV body of protocol supported TLV.
+     *
+     * @return byteArray TLV body of protocol supported TLV
+     */
+    public byte[] tlvBodyAsBytes() {
+
+        List<Byte> bytes = new ArrayList();
+        for (byte byt : this.protocolSupported) {
+            bytes.add(byt);
+        }
+        byte[] byteArray = new byte[bytes.size()];
+        int i = 0;
+        for (byte byt : bytes) {
+            byteArray[i++] = byt;
+        }
+        return byteArray;
+    }
+}
\ No newline at end of file
