diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PceccCapabilityTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PceccCapabilityTlv.java
index b8ae1e8..ce868ab 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PceccCapabilityTlv.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PceccCapabilityTlv.java
@@ -29,27 +29,25 @@
 public class PceccCapabilityTlv implements PcepValueType {
 
     /*          PCECC CAPABILITY TLV
-     * Reference : draft-zhao-pce-pcep-extension-for-pce-controller-01, section-7.1.1
+     * Reference : draft-zhao-pce-pcep-extension-for-pce-controller-03, section-7.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
-    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |               Type=32         |            Length=4           |
-    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |                             Flags                         |G|L|
-    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+   |               Type=[TBD]      |            Length=4           |
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+   |                             Flags                           |S|
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
      */
     protected static final Logger log = LoggerFactory.getLogger(PceccCapabilityTlv.class);
 
-    public static final short TYPE = 32;
+    public static final short TYPE = (short) 65287;
     public static final short LENGTH = 4;
     public static final int SET = 1;
-    public static final byte LFLAG_CHECK = 0x01;
-    public static final byte GFLAG_CHECK = 0x02;
+    public static final byte SBIT_CHECK = 0x01;
 
-    private final boolean bGFlag;
-    private final boolean bLFlag;
+    private final boolean sBit;
 
     private final int rawValue;
     private final boolean isRawValueSet;
@@ -63,18 +61,16 @@
         this.rawValue = rawValue;
         this.isRawValueSet = true;
 
-        bLFlag = (rawValue & LFLAG_CHECK) == LFLAG_CHECK;
-        bGFlag = (rawValue & GFLAG_CHECK) == GFLAG_CHECK;
+        sBit = (rawValue & SBIT_CHECK) == SBIT_CHECK;
     }
 
     /**
      * Constructor to initialize G-flag L-flag.
-     * @param bGFlag G-flag
-     * @param bLFlag L-flag
+     *
+     * @param sBit pcecc sr capbaility bit
      */
-    public PceccCapabilityTlv(boolean bGFlag, boolean bLFlag) {
-        this.bGFlag = bGFlag;
-        this.bLFlag = bLFlag;
+    public PceccCapabilityTlv(boolean sBit) {
+        this.sBit = sBit;
         this.rawValue = 0;
         this.isRawValueSet = false;
     }
@@ -95,23 +91,17 @@
     }
 
     /**
-     * Returns G-flag.
-     * @return bGFlag G-flag
+     * Returns sBit.
+     *
+     * @return sBit S bit
      */
-    public boolean getGFlag() {
-        return bGFlag;
-    }
-
-    /**
-     * Returns L-flag.
-     * @return bLFlag L-flag
-     */
-    public boolean getLFlag() {
-        return bLFlag;
+    public boolean sBit() {
+        return sBit;
     }
 
     /**
      * Returns the raw value.
+     *
      * @return rawValue Flags
      */
     public int getInt() {
@@ -133,7 +123,7 @@
         if (isRawValueSet) {
             return Objects.hash(rawValue);
         } else {
-            return Objects.hash(bLFlag, bGFlag);
+            return Objects.hash(sBit);
         }
     }
 
@@ -147,7 +137,7 @@
             if (isRawValueSet) {
                 return Objects.equals(this.rawValue, other.rawValue);
             } else {
-                return Objects.equals(this.bGFlag, other.bGFlag) && Objects.equals(this.bLFlag, other.bLFlag);
+                return Objects.equals(this.sBit, other.sBit);
             }
         }
         return false;
@@ -162,11 +152,8 @@
         if (isRawValueSet) {
             c.writeInt(rawValue);
         } else {
-            if (bGFlag) {
-                temp = temp | GFLAG_CHECK;
-            }
-            if (bLFlag) {
-                temp = temp | LFLAG_CHECK;
+            if (sBit) {
+                temp = temp | SBIT_CHECK;
             }
             c.writeInt(temp);
         }
@@ -188,7 +175,7 @@
         return MoreObjects.toStringHelper(getClass())
                 .add("Type", TYPE)
                 .add("Length", LENGTH)
-                .add("Value", rawValue)
+                .add("rawValue", rawValue)
                 .toString();
     }
 }
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SrEroSubObject.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SrEroSubObject.java
index e2b4a6b..464c018 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SrEroSubObject.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SrEroSubObject.java
@@ -30,7 +30,8 @@
  */
 public class SrEroSubObject implements PcepValueType {
     /*
-    SR-ERO subobject: (draft-ietf-pce-segment-routing-00)
+    SR-ERO subobject: (draft-ietf-pce-segment-routing-06)
+
     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,7 +41,8 @@
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     //                        NAI (variable)                       //
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
+    When M bit is reset, SID is 32 bit Index.
+    When M bit is set, SID is 20 bit Label.
 
 
     NAI
@@ -98,7 +100,8 @@
     private final boolean bMFlag;
     private final byte st;
 
-    private final int sID;
+    //If m bit is set SID will store label else store 32 bit value
+    private final int sid;
     private final PcepNai nai;
 
     /**
@@ -109,17 +112,17 @@
      * @param bSFlag S flag
      * @param bCFlag C flag
      * @param bMFlag M flag
-     * @param sID segment identifier value
+     * @param sid segment identifier value
      * @param nai NAI associated with SID
      */
-    public SrEroSubObject(byte st, boolean bFFlag, boolean bSFlag, boolean bCFlag, boolean bMFlag, int sID,
+    public SrEroSubObject(byte st, boolean bFFlag, boolean bSFlag, boolean bCFlag, boolean bMFlag, int sid,
             PcepNai nai) {
         this.st = st;
         this.bFFlag = bFFlag;
         this.bSFlag = bSFlag;
         this.bCFlag = bCFlag;
         this.bMFlag = bMFlag;
-        this.sID = sID;
+        this.sid = sid;
         this.nai = nai;
     }
 
@@ -131,18 +134,19 @@
      * @param bSFlag S flag
      * @param bCFlag C flag
      * @param bMFlag M flag
-     * @param sID segment identifier value
+     * @param sid segment identifier value
      * @param nai NAI associated with SID
      * @return object of SrEroSubObject
      */
-    public static SrEroSubObject of(byte st, boolean bFFlag, boolean bSFlag, boolean bCFlag, boolean bMFlag, int sID,
+    public static SrEroSubObject of(byte st, boolean bFFlag, boolean bSFlag, boolean bCFlag, boolean bMFlag, int sid,
             PcepNai nai) {
-        return new SrEroSubObject(st, bFFlag, bSFlag, bCFlag, bMFlag, sID, nai);
+        return new SrEroSubObject(st, bFFlag, bSFlag, bCFlag, bMFlag, sid, nai);
     }
 
     /**
      * Returns SID type.
-     * @return st sid type
+     *
+     * @return st SID type
      */
     public byte getSt() {
         return st;
@@ -150,6 +154,7 @@
 
     /**
      * Returns bFFlag.
+     *
      * @return bFFlag
      */
     public boolean getFFlag() {
@@ -158,6 +163,7 @@
 
     /**
      * Returns bSFlag.
+     *
      * @return bSFlag
      */
     public boolean getSFlag() {
@@ -166,6 +172,7 @@
 
     /**
      * Returns bCFlag.
+     *
      * @return bCFlag
      */
     public boolean getCFlag() {
@@ -174,6 +181,7 @@
 
     /**
      * Returns bMFlag.
+     *
      * @return bMFlag
      */
     public boolean getMFlag() {
@@ -182,10 +190,11 @@
 
     /**
      * Returns sID.
-     * @return sID
+     *
+     * @return sid
      */
     public int getSid() {
-        return sID;
+        return sid;
     }
 
     /**
@@ -213,7 +222,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(st, bFFlag, bSFlag, bCFlag, bMFlag, sID, nai);
+        return Objects.hash(st, bFFlag, bSFlag, bCFlag, bMFlag, sid, nai);
     }
 
     @Override
@@ -225,7 +234,7 @@
             SrEroSubObject other = (SrEroSubObject) obj;
             return Objects.equals(this.st, other.st) && Objects.equals(this.bFFlag, other.bFFlag)
                     && Objects.equals(this.bSFlag, other.bSFlag) && Objects.equals(this.bCFlag, other.bCFlag)
-                    && Objects.equals(this.bMFlag, other.bMFlag) && Objects.equals(this.sID, other.sID)
+                    && Objects.equals(this.bMFlag, other.bMFlag) && Objects.equals(this.sid, other.sid)
                     && Objects.equals(this.nai, other.nai);
         }
         return false;
@@ -254,7 +263,12 @@
         short tempST = (short) (st << SHIFT_ST);
         temp = (short) (temp | tempST);
         c.writeShort(temp);
-        c.writeInt(sID);
+        if (bMFlag) {
+            int tempSid = (int) sid << 12;
+            c.writeInt(tempSid);
+        } else {
+            c.writeInt(sid);
+        }
         nai.write(c);
 
         return c.writerIndex() - iLenStartIndex;
@@ -281,21 +295,24 @@
 
         st = (byte) (temp >> SHIFT_ST);
 
-        int sID = c.readInt();
+        int sid = c.readInt();
+        if (bMFlag) {
+            sid = sid >> 12;
+        }
         switch (st) {
-        case 0x01:
+        case PcepNaiIpv4NodeId.ST_TYPE:
             nai = PcepNaiIpv4NodeId.read(c);
             break;
-        case 0x02:
+        case PcepNaiIpv6NodeId.ST_TYPE:
             nai = PcepNaiIpv6NodeId.read(c);
             break;
-        case 0x03:
+        case PcepNaiIpv4Adjacency.ST_TYPE:
             nai = PcepNaiIpv4Adjacency.read(c);
             break;
-        case 0x04:
+        case PcepNaiIpv6Adjacency.ST_TYPE:
             nai = PcepNaiIpv6Adjacency.read(c);
             break;
-        case 0x05:
+        case PcepNaiUnnumberedAdjacencyIpv4.ST_TYPE:
             nai = PcepNaiUnnumberedAdjacencyIpv4.read(c);
             break;
         default:
@@ -303,7 +320,7 @@
             break;
         }
 
-        return new SrEroSubObject(st, bFFlag, bSFlag, bCFlag, bMFlag, sID, nai);
+        return new SrEroSubObject(st, bFFlag, bSFlag, bCFlag, bMFlag, sid, nai);
     }
 
     @Override
@@ -316,7 +333,7 @@
                 .add("bSFlag", bSFlag)
                 .add("bCFlag", bCFlag)
                 .add("bMFlag", bMFlag)
-                .add("sID", sID)
+                .add("sid", sid)
                 .add("nAI", nai)
                 .toString();
     }
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SrPceCapabilityTlv.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SrPceCapabilityTlv.java
new file mode 100644
index 0000000..703d0b2
--- /dev/null
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/SrPceCapabilityTlv.java
@@ -0,0 +1,144 @@
+/*
+ * 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.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 SR PCE Capability Tlv.
+ */
+public class SrPceCapabilityTlv implements PcepValueType {
+
+    /*
+     *
+       reference : draft-ietf-pce-segment-routing-06, section 5.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
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+      |            Type=TBD           |            Length=4           |
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+      |         Reserved              |     Flags     |      MSD      |
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+               fig: SR-PCE-CAPABILITY TLV format
+     */
+    protected static final Logger log = LoggerFactory.getLogger(SrPceCapabilityTlv.class);
+
+    public static final short TYPE = 26;
+    public static final short LENGTH = 4;
+
+    private final byte msd;
+
+    /**
+     * Constructor to initialize its parameter.
+     *
+     * @param msd maximum SID depth
+     */
+    public SrPceCapabilityTlv(byte msd) {
+        this.msd = msd;
+    }
+
+    /**
+     * Obtains newly created SrPceCapabilityTlv object.
+     *
+     * @param msd maximum SID depth
+     * @return object of SrPceCapabilityTlv
+     */
+    public static SrPceCapabilityTlv of(final byte msd) {
+        return new SrPceCapabilityTlv(msd);
+    }
+
+    /**
+     * Obtains msd.
+     *
+     * @return msd
+     */
+    public byte msd() {
+        return msd;
+    }
+
+    @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(msd);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof SrPceCapabilityTlv) {
+            SrPceCapabilityTlv other = (SrPceCapabilityTlv) obj;
+            return Objects.equals(msd, other.msd);
+        }
+        return false;
+    }
+
+    @Override
+    public int write(ChannelBuffer c) {
+        int iLenStartIndex = c.writerIndex();
+        c.writeShort(TYPE);
+        c.writeShort(LENGTH);
+        c.writeInt(msd);
+        return c.writerIndex() - iLenStartIndex;
+    }
+
+    /**
+     * Reads the channel buffer and returns object of SrPceCapabilityTlv.
+     *
+     * @param cb channel buffer
+     * @return object of Gmpls-Capability-Tlv
+     */
+    public static SrPceCapabilityTlv read(ChannelBuffer cb) {
+        //read reserved bits
+        cb.readShort();
+        //read flags
+        cb.readByte();
+        return SrPceCapabilityTlv.of(cb.readByte());
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("Type", TYPE)
+                .add("Length", LENGTH)
+                .add("msd", msd)
+                .toString();
+    }
+}
\ No newline at end of file
