diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepSrpObject.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepSrpObject.java
index 9fc2277..bd44c36 100755
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepSrpObject.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepSrpObject.java
@@ -57,6 +57,20 @@
     void setRFlag(boolean bRFlag);
 
     /**
+     * Returns S flag of SRP Object.
+     *
+     * @return S flag of SRP Object
+     */
+    boolean getSFlag();
+
+    /**
+     * Sets S(sync) flag with specified value.
+     *
+     * @param bSFlag S Flag of SRP Object
+     */
+    void setSFlag(boolean bSFlag);
+
+    /**
      * sets the optional TLvs.
      *
      * @param llOptionalTlv list of optional tlvs
@@ -130,6 +144,13 @@
         boolean getRFlag();
 
         /**
+         * Returns S(sync) flag of SRP Object.
+         *
+         * @return S flag of SRP Object
+         */
+        boolean getSFlag();
+
+        /**
          * Sets R flag and returns its builder.
          *
          * @param bRFlag R flag
@@ -138,6 +159,14 @@
         Builder setRFlag(boolean bRFlag);
 
         /**
+         * Sets S flag and returns its builder.
+         *
+         * @param bSFlag S flag
+         * @return Builder by setting S flag
+         */
+        Builder setSFlag(boolean bSFlag);
+
+        /**
          * Returns list of optional tlvs.
          *
          * @return llOptionalTlv list of optional tlvs
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepSrpObjectVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepSrpObjectVer1.java
index 889c354..b88a1a4 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepSrpObjectVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepSrpObjectVer1.java
@@ -43,7 +43,7 @@
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Object-Class  |   OT  |Res|P|I|   Object Length (bytes)       |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |                          Flags                              |R|
+    |                          Flags                            |S|R|
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                        SRP-ID-number                          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -60,7 +60,7 @@
     public static final byte SRP_OBJECT_VERSION = 1;
     public static final short SRP_OBJ_MINIMUM_LENGTH = 12;
     public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
-    public static final boolean DEFAULT_RFLAG = false;
+    public static final boolean FLAG_DEFAULT_VALUE = false;
 
     static final PcepObjectHeader DEFAULT_SRP_OBJECT_HEADER = new PcepObjectHeader(SRP_OBJ_CLASS, SRP_OBJ_TYPE,
             PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, SRP_OBJ_MINIMUM_LENGTH);
@@ -68,6 +68,7 @@
     private PcepObjectHeader srpObjHeader;
     private static int flags;
     private boolean bRFlag;
+    private boolean bSFlag;
     private int srpId;
 
     //Optional TLV
@@ -80,14 +81,16 @@
      *
      * @param srpObjHeader srp object header
      * @param bRFlag R flag
+     * @param bSFlag S (sync) flag
      * @param srpID srp Id
      * @param llOptionalTlv list of optional tlv
      */
-    public PcepSrpObjectVer1(PcepObjectHeader srpObjHeader, boolean bRFlag, int srpID,
+    public PcepSrpObjectVer1(PcepObjectHeader srpObjHeader, boolean bRFlag, boolean bSFlag, int srpID,
             LinkedList<PcepValueType> llOptionalTlv) {
 
         this.srpObjHeader = srpObjHeader;
         this.bRFlag = bRFlag;
+        this.bSFlag = bSFlag;
         this.srpId = srpID;
         this.llOptionalTlv = llOptionalTlv;
     }
@@ -111,6 +114,11 @@
         this.bRFlag = bRFlag;
     }
 
+    @Override
+    public void setSFlag(boolean bSFlag) {
+        this.bSFlag = bSFlag;
+    }
+
     /**
      * Returns SRP object header.
      *
@@ -131,6 +139,11 @@
     }
 
     @Override
+    public boolean getSFlag() {
+        return this.bSFlag;
+    }
+
+    @Override
     public void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
         this.llOptionalTlv = llOptionalTlv;
 
@@ -153,6 +166,7 @@
         log.debug("SrpObject::read");
         PcepObjectHeader srpObjHeader;
         boolean bRFlag;
+        boolean bSFlag;
 
         int srpID;
         int flags;
@@ -167,12 +181,13 @@
         //take only SrpObject buffer.
         ChannelBuffer tempCb = cb.readBytes(srpObjHeader.getObjLen() - MINIMUM_COMMON_HEADER_LENGTH);
         flags = tempCb.readInt();
-        bRFlag = 0 < flags;
+        bRFlag = 0 < (flags & 0x1);
+        bSFlag = 0 < ((flags >> 1) & 0x1);
         srpID = tempCb.readInt();
 
         llOptionalTlv = parseOptionalTlv(tempCb);
 
-        return new PcepSrpObjectVer1(srpObjHeader, bRFlag, srpID, llOptionalTlv);
+        return new PcepSrpObjectVer1(srpObjHeader, bRFlag, bSFlag, srpID, llOptionalTlv);
     }
 
     @Override
@@ -187,6 +202,7 @@
         byte bFlag;
 
         bFlag = (bRFlag) ? BBIT_SET : BBIT_RESET;
+        bFlag |= (((bSFlag) ? BBIT_SET : BBIT_RESET) << 1);
 
         cb.writeInt(bFlag);
 
@@ -292,10 +308,12 @@
         private boolean bIsHeaderSet = false;
         private boolean bIsSrpIdset = false;
         private boolean bIsRFlagSet = false;
+        private boolean bIsSFlagSet = false;
 
         private PcepObjectHeader srpObjHeader;
         private int srpId;
         private boolean bRFlag;
+        private boolean bSFlag;
         LinkedList<PcepValueType> llOptionalTlv = new LinkedList<>();
 
         private boolean bIsPFlagSet = false;
@@ -308,7 +326,8 @@
         public PcepSrpObject build() throws PcepParseException {
             PcepObjectHeader srpObjHeader = this.bIsHeaderSet ? this.srpObjHeader : DEFAULT_SRP_OBJECT_HEADER;
 
-            boolean bRFlag = this.bIsRFlagSet ? this.bRFlag : DEFAULT_RFLAG;
+            boolean bRFlag = this.bIsRFlagSet ? this.bRFlag : FLAG_DEFAULT_VALUE;
+            boolean bSFlag = this.bIsSFlagSet ? this.bSFlag : FLAG_DEFAULT_VALUE;
 
             if (!this.bIsSrpIdset) {
                 throw new PcepParseException("SrpID not set while building SRP Object.");
@@ -322,7 +341,7 @@
                 srpObjHeader.setIFlag(bIFlag);
             }
 
-            return new PcepSrpObjectVer1(srpObjHeader, bRFlag, this.srpId, this.llOptionalTlv);
+            return new PcepSrpObjectVer1(srpObjHeader, bRFlag, bSFlag, this.srpId, this.llOptionalTlv);
         }
 
         @Override
@@ -362,6 +381,18 @@
         }
 
         @Override
+        public boolean getSFlag() {
+            return this.bSFlag;
+        }
+
+        @Override
+        public Builder setSFlag(boolean bSFlag) {
+            this.bSFlag = bSFlag;
+            this.bIsSFlagSet = true;
+            return this;
+        }
+
+        @Override
         public Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
             this.llOptionalTlv = llOptionalTlv;
             return this;
@@ -392,6 +423,7 @@
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
                 .add("RFlag", bRFlag)
+                .add("SFlag", bSFlag)
                 .add("SRPID", srpId)
                 .add("OptionalTlvList", llOptionalTlv)
                 .toString();
diff --git a/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java b/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java
index 6d0ad11..f8c3ec0 100644
--- a/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java
+++ b/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java
@@ -74,6 +74,9 @@
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 
+import static org.onosproject.pcep.controller.PcepSyncStatus.IN_SYNC;
+import static org.onosproject.pcep.controller.PcepSyncStatus.SYNCED;
+import static com.google.common.base.Preconditions.checkNotNull;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -188,7 +191,13 @@
 
     //Pushes node labels to the specified device.
     private void pushGlobalNodeLabel(DeviceId deviceId, LabelResourceId labelId,
-            IpPrefix ipPrefix, Objective.Operation type) throws PcepParseException {
+            IpPrefix ipPrefix, Objective.Operation type, boolean isBos) throws PcepParseException {
+
+        checkNotNull(deviceId);
+        checkNotNull(labelId);
+        checkNotNull(ipPrefix);
+        checkNotNull(type);
+
         PcepClient pc = getPcepClient(deviceId);
         if (pc == null) {
             log.error("PCEP client not found");
@@ -201,7 +210,20 @@
                                       .setNodeID(ipPrefix.address().getIp4Address().toInt())
                                       .build();
 
-        PcepSrpObject srpObj = getSrpObject(pc, type);
+        boolean bSFlag = false;
+        if (pc.labelDbSyncStatus() == IN_SYNC) {
+            if (isBos) {
+                /*
+                 * Now the sync is completed.
+                 * Need to send label DB end-of-sync msg, i.e. S flag in SRP id is reset.
+                 */
+                pc.setLabelDbSyncStatus(SYNCED);
+            } else {
+                bSFlag = true;
+            }
+        }
+
+        PcepSrpObject srpObj = getSrpObject(pc, type, bSFlag);
 
         //Global NODE-SID as label object
         PcepLabelObject labelObject = pc.factory().buildLabelObject()
@@ -224,26 +246,35 @@
         pc.sendMessage(labelMsg);
     }
 
-    private PcepSrpObject getSrpObject(PcepClient pc, Objective.Operation type) throws PcepParseException {
+    private PcepSrpObject getSrpObject(PcepClient pc, Objective.Operation type, boolean bSFlag)
+            throws PcepParseException {
         PcepSrpObject srpObj;
-        if (type.equals(Objective.Operation.ADD)) {
-            srpObj = pc.factory().buildSrpObject()
-                    .setRFlag(false)
-                    .setSrpID(SrpIdGenerators.create())
-                    .build();
-        } else {
-            //To cleanup labels, R bit is set
-            srpObj = pc.factory().buildSrpObject()
-                    .setRFlag(true)
-                    .setSrpID(SrpIdGenerators.create())
-                    .build();
+        boolean bRFlag = false;
+
+        if (!type.equals(Objective.Operation.ADD)) {
+            // To cleanup labels, R bit is set
+            bRFlag = true;
         }
+
+        srpObj = pc.factory().buildSrpObject()
+                .setRFlag(bRFlag)
+                .setSFlag(bSFlag)
+                .setSrpID(SrpIdGenerators.create())
+                .build();
+
         return srpObj;
     }
 
     //Pushes adjacency labels to the specified device.
     private void pushAdjacencyLabel(DeviceId deviceId, LabelResourceId labelId,
             PortNumber srcPortNum, PortNumber dstPortNum, Objective.Operation type) throws PcepParseException {
+
+        checkNotNull(deviceId);
+        checkNotNull(labelId);
+        checkNotNull(srcPortNum);
+        checkNotNull(dstPortNum);
+        checkNotNull(type);
+
         PcepClient pc = getPcepClient(deviceId);
         if (pc == null) {
             log.error("PCEP client not found");
@@ -262,7 +293,7 @@
                                                   .seLocalIPv4Address((int) srcPortNo)
                                                   .build();
 
-        PcepSrpObject srpObj = getSrpObject(pc, type);
+        PcepSrpObject srpObj = getSrpObject(pc, type, false);
 
         //Adjacency label object
         PcepLabelObject labelObject = pc.factory().buildLabelObject()
@@ -290,6 +321,13 @@
             PortNumber portNum, TunnelId tunnelId,
             Boolean isBos, Long labelType, Objective.Operation type) throws PcepParseException {
 
+        checkNotNull(deviceId);
+        checkNotNull(labelId);
+        checkNotNull(portNum);
+        checkNotNull(tunnelId);
+        checkNotNull(labelType);
+        checkNotNull(type);
+
         PcepClient pc = getPcepClient(deviceId);
         if (pc == null) {
             log.error("PCEP client not found");
@@ -335,7 +373,7 @@
         //Add OUT label object in case of transit node
         labelObjects.add(labelObj);
 
-        srpObj = getSrpObject(pc, type);
+        srpObj = getSrpObject(pc, type, false);
 
         String lspId = tunnel.annotations().value(PcepAnnotationKeys.PLSP_ID);
         String plspId = tunnel.annotations().value(PcepAnnotationKeys.LOCAL_LSP_ID);
