diff --git a/internal/pkg/core/common.go b/internal/pkg/core/common.go
index c1e7fbc..f959b7f 100644
--- a/internal/pkg/core/common.go
+++ b/internal/pkg/core/common.go
@@ -18,7 +18,7 @@
 package core
 
 import (
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
 )
 
 var logger log.CLogger
diff --git a/internal/pkg/core/device_handler.go b/internal/pkg/core/device_handler.go
index f342bcf..3be60ec 100644
--- a/internal/pkg/core/device_handler.go
+++ b/internal/pkg/core/device_handler.go
@@ -34,17 +34,17 @@
 	"github.com/golang/protobuf/ptypes"
 	grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware"
 	grpc_opentracing "github.com/grpc-ecosystem/go-grpc-middleware/tracing/opentracing"
-	"github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif"
-	"github.com/opencord/voltha-lib-go/v3/pkg/flows"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-lib-go/v3/pkg/pmmetrics"
+	"github.com/opencord/voltha-lib-go/v4/pkg/adapters/adapterif"
+	"github.com/opencord/voltha-lib-go/v4/pkg/flows"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
+	"github.com/opencord/voltha-lib-go/v4/pkg/pmmetrics"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
 	rsrcMgr "github.com/opencord/voltha-openolt-adapter/internal/pkg/resourcemanager"
-	"github.com/opencord/voltha-protos/v3/go/common"
-	ic "github.com/opencord/voltha-protos/v3/go/inter_container"
-	of "github.com/opencord/voltha-protos/v3/go/openflow_13"
-	oop "github.com/opencord/voltha-protos/v3/go/openolt"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
+	"github.com/opencord/voltha-protos/v4/go/common"
+	ic "github.com/opencord/voltha-protos/v4/go/inter_container"
+	of "github.com/opencord/voltha-protos/v4/go/openflow_13"
+	oop "github.com/opencord/voltha-protos/v4/go/openolt"
+	"github.com/opencord/voltha-protos/v4/go/voltha"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
@@ -52,9 +52,7 @@
 
 // Constants for number of retries and for timeout
 const (
-	MaxRetry       = 10
-	MaxTimeOutInMs = 500
-	InvalidPort    = 0xffffffff
+	InvalidPort = 0xffffffff
 )
 
 //DeviceHandler will interact with the OLT device.
@@ -356,16 +354,16 @@
 
 				// On failure process a backoff timer while watching for stopIndications
 				// events
-				backoff := time.NewTimer(indicationBackoff.NextBackOff())
+				backoffTimer := time.NewTimer(indicationBackoff.NextBackOff())
 				select {
 				case <-dh.stopIndications:
 					logger.Debugw(ctx, "stopping-collecting-indications-for-olt", log.Fields{"device-id": dh.device.Id})
-					if !backoff.Stop() {
-						<-backoff.C
+					if !backoffTimer.Stop() {
+						<-backoffTimer.C
 					}
 					break Loop
-				case <-backoff.C:
-					// backoff expired continue
+				case <-backoffTimer.C:
+					// backoffTimer expired continue
 				}
 				if indications, err = dh.startOpenOltIndicationStream(ctx); err != nil {
 					return err
@@ -720,6 +718,9 @@
 				_ = olterrors.NewErrAdapter("indication-read-failure", log.Fields{"device-id": dh.device.Id}, err).LogAt(log.ErrorLevel)
 			}
 		}()
+
+		go startHeartbeatCheck(ctx, dh)
+
 		return nil
 	}
 
@@ -748,6 +749,9 @@
 	if device.PmConfigs != nil {
 		dh.UpdatePmConfig(ctx, device.PmConfigs)
 	}
+
+	go startHeartbeatCheck(ctx, dh)
+
 	return nil
 }
 
@@ -769,7 +773,7 @@
 	dh.flowMgr = make([]*OpenOltFlowMgr, dh.totalPonPorts)
 	for i := range dh.flowMgr {
 		// Instantiate flow manager
-		if dh.flowMgr[i] = NewFlowManager(ctx, dh, dh.resourceMgr, dh.groupMgr); dh.flowMgr[i] == nil {
+		if dh.flowMgr[i] = NewFlowManager(ctx, dh, dh.resourceMgr, dh.groupMgr, uint32(i)); dh.flowMgr[i] == nil {
 			return olterrors.ErrResourceManagerInstantiating
 		}
 	}
@@ -875,8 +879,6 @@
 	if err := dh.coreProxy.DevicePMConfigUpdate(ctx, dh.metrics.ToPmConfigs()); err != nil {
 		_ = olterrors.NewErrAdapter("error-updating-performance-metrics", log.Fields{"device-id": device.Id}, err).LogAt(log.ErrorLevel)
 	}
-
-	go startHeartbeatCheck(ctx, dh)
 }
 
 //GetOfpDeviceInfo Gets the Ofp information of the given device
@@ -886,7 +888,7 @@
 			MfrDesc:   "VOLTHA Project",
 			HwDesc:    "open_pon",
 			SwDesc:    "open_pon",
-			SerialNum: dh.device.SerialNumber,
+			SerialNum: device.SerialNumber,
 		},
 		SwitchFeatures: &of.OfpSwitchFeatures{
 			NBuffers: 256,
@@ -1328,7 +1330,7 @@
 	}
 	return &oop.SerialNumber{
 		VendorId:       []byte(serialNum[:4]),
-		VendorSpecific: []byte(decodedStr),
+		VendorSpecific: decodedStr,
 	}, nil
 }
 
@@ -1578,17 +1580,13 @@
 	var uniID uint32
 	var err error
 	for _, port := range onu.UniPorts {
-		uniID = UniIDFromPortNum(uint32(port))
+		uniID = UniIDFromPortNum(port)
 		logger.Debugw(ctx, "clearing-resource-data-for-uni-port", log.Fields{"port": port, "uni-id": uniID})
 		/* Delete tech-profile instance from the KV store */
-		if err = dh.flowMgr[onu.IntfID].DeleteTechProfileInstances(ctx, onu.IntfID, onu.OnuID, uniID, onu.SerialNumber); err != nil {
+		if err = dh.flowMgr[onu.IntfID].DeleteTechProfileInstances(ctx, onu.IntfID, onu.OnuID, uniID); err != nil {
 			logger.Debugw(ctx, "failed-to-remove-tech-profile-instance-for-onu", log.Fields{"onu-id": onu.OnuID})
 		}
 		logger.Debugw(ctx, "deleted-tech-profile-instance-for-onu", log.Fields{"onu-id": onu.OnuID})
-		flowIDs := dh.resourceMgr.GetCurrentFlowIDsForOnu(ctx, onu.IntfID, int32(onu.OnuID), int32(uniID))
-		for _, flowID := range flowIDs {
-			dh.resourceMgr.FreeFlowID(ctx, onu.IntfID, int32(onu.OnuID), int32(uniID), flowID)
-		}
 		tpIDList := dh.resourceMgr.GetTechProfileIDForOnu(ctx, onu.IntfID, onu.OnuID, uniID)
 		for _, tpID := range tpIDList {
 			if err = dh.resourceMgr.RemoveMeterIDForOnu(ctx, "upstream", onu.IntfID, onu.OnuID, uniID, tpID); err != nil {
@@ -1605,9 +1603,12 @@
 			logger.Debugw(ctx, "failed-to-remove-tech-profile-id-for-onu", log.Fields{"onu-id": onu.OnuID})
 		}
 		logger.Debugw(ctx, "removed-tech-profile-id-for-onu", log.Fields{"onu-id": onu.OnuID})
-		if err = dh.resourceMgr.DelGemPortPktInOfAllServices(ctx, onu.IntfID, onu.OnuID, uint32(port)); err != nil {
+		if err = dh.resourceMgr.DeletePacketInGemPortForOnu(ctx, onu.IntfID, onu.OnuID, port); err != nil {
 			logger.Debugw(ctx, "failed-to-remove-gemport-pkt-in", log.Fields{"intfid": onu.IntfID, "onuid": onu.OnuID, "uniId": uniID})
 		}
+		if err = dh.resourceMgr.RemoveAllFlowsForIntfOnuUniKey(ctx, onu.IntfID, int32(onu.OnuID), int32(uniID)); err != nil {
+			logger.Debugw(ctx, "failed-to-remove-flow-for", log.Fields{"intfid": onu.IntfID, "onuid": onu.OnuID, "uniId": uniID})
+		}
 	}
 	return nil
 }
@@ -1626,16 +1627,14 @@
 	}
 	logger.Debugw(ctx, "nni-", log.Fields{"nni": nni})
 	for _, nniIntfID := range nni {
-		flowIDs := dh.resourceMgr.GetCurrentFlowIDsForOnu(ctx, uint32(nniIntfID), int32(nniOnuID), int32(nniUniID))
-		logger.Debugw(ctx, "current-flow-ids-for-nni", log.Fields{"flow-ids": flowIDs})
-		for _, flowID := range flowIDs {
-			dh.resourceMgr.FreeFlowID(ctx, uint32(nniIntfID), -1, -1, uint32(flowID))
-		}
 		dh.resourceMgr.RemoveResourceMap(ctx, nniIntfID, int32(nniOnuID), int32(nniUniID))
+		_ = dh.resourceMgr.RemoveAllFlowsForIntfOnuUniKey(ctx, nniIntfID, -1, -1)
+
 	}
 	if err = dh.resourceMgr.DelNNiFromKVStore(ctx); err != nil {
 		return olterrors.NewErrPersistence("clear", "nni", 0, nil, err)
 	}
+
 	return nil
 }
 
@@ -2248,7 +2247,6 @@
 	// Default to PON0
 	var intfID uint32
 	inPort, outPort := getPorts(flow)
-	logger.Debugw(ctx, "increment-flow-remove-count-for-inPort-out-port", log.Fields{"inPort": inPort, "out-port": outPort})
 	if inPort != InvalidPort && outPort != InvalidPort {
 		_, intfID, _, _ = ExtractAccessFromFlow(inPort, outPort)
 	}
diff --git a/internal/pkg/core/device_handler_test.go b/internal/pkg/core/device_handler_test.go
index 1a11b92..311a371 100644
--- a/internal/pkg/core/device_handler_test.go
+++ b/internal/pkg/core/device_handler_test.go
@@ -27,20 +27,20 @@
 
 	"github.com/golang/protobuf/ptypes"
 	"github.com/golang/protobuf/ptypes/any"
-	"github.com/opencord/voltha-lib-go/v3/pkg/db"
-	fu "github.com/opencord/voltha-lib-go/v3/pkg/flows"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-lib-go/v3/pkg/pmmetrics"
-	ponrmgr "github.com/opencord/voltha-lib-go/v3/pkg/ponresourcemanager"
+	"github.com/opencord/voltha-lib-go/v4/pkg/db"
+	fu "github.com/opencord/voltha-lib-go/v4/pkg/flows"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
+	"github.com/opencord/voltha-lib-go/v4/pkg/pmmetrics"
+	ponrmgr "github.com/opencord/voltha-lib-go/v4/pkg/ponresourcemanager"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/config"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/resourcemanager"
 	"github.com/opencord/voltha-openolt-adapter/pkg/mocks"
-	ic "github.com/opencord/voltha-protos/v3/go/inter_container"
-	of "github.com/opencord/voltha-protos/v3/go/openflow_13"
-	ofp "github.com/opencord/voltha-protos/v3/go/openflow_13"
-	oop "github.com/opencord/voltha-protos/v3/go/openolt"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
+	ic "github.com/opencord/voltha-protos/v4/go/inter_container"
+	of "github.com/opencord/voltha-protos/v4/go/openflow_13"
+	ofp "github.com/opencord/voltha-protos/v4/go/openflow_13"
+	oop "github.com/opencord/voltha-protos/v4/go/openolt"
+	"github.com/opencord/voltha-protos/v4/go/voltha"
 )
 
 const (
@@ -209,7 +209,7 @@
 	dh.flowMgr = make([]*OpenOltFlowMgr, dh.totalPonPorts)
 	for i := 0; i < int(dh.totalPonPorts); i++ {
 		// Instantiate flow manager
-		if dh.flowMgr[i] = NewFlowManager(ctx, dh, dh.resourceMgr, dh.groupMgr); dh.flowMgr[i] == nil {
+		if dh.flowMgr[i] = NewFlowManager(ctx, dh, dh.resourceMgr, dh.groupMgr, uint32(i)); dh.flowMgr[i] == nil {
 			return nil
 		}
 	}
diff --git a/internal/pkg/core/olt_platform.go b/internal/pkg/core/olt_platform.go
index 897f4cb..b85dd4b 100644
--- a/internal/pkg/core/olt_platform.go
+++ b/internal/pkg/core/olt_platform.go
@@ -20,11 +20,11 @@
 import (
 	"context"
 
-	"github.com/opencord/voltha-lib-go/v3/pkg/flows"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	"github.com/opencord/voltha-lib-go/v4/pkg/flows"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
-	ofp "github.com/opencord/voltha-protos/v3/go/openflow_13"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
+	ofp "github.com/opencord/voltha-protos/v4/go/openflow_13"
+	"github.com/opencord/voltha-protos/v4/go/voltha"
 )
 
 /*=====================================================================
diff --git a/internal/pkg/core/olt_platform_test.go b/internal/pkg/core/olt_platform_test.go
index 7661869..d38b9fb 100644
--- a/internal/pkg/core/olt_platform_test.go
+++ b/internal/pkg/core/olt_platform_test.go
@@ -19,10 +19,10 @@
 
 import (
 	"context"
-	fu "github.com/opencord/voltha-lib-go/v3/pkg/flows"
+	fu "github.com/opencord/voltha-lib-go/v4/pkg/flows"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
-	ofp "github.com/opencord/voltha-protos/v3/go/openflow_13"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
+	ofp "github.com/opencord/voltha-protos/v4/go/openflow_13"
+	"github.com/opencord/voltha-protos/v4/go/voltha"
 	"math"
 	"reflect"
 	"testing"
diff --git a/internal/pkg/core/olt_state_transitions.go b/internal/pkg/core/olt_state_transitions.go
index 58e2251..cad7d65 100644
--- a/internal/pkg/core/olt_state_transitions.go
+++ b/internal/pkg/core/olt_state_transitions.go
@@ -22,7 +22,7 @@
 	"reflect"
 	"runtime"
 
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
 )
 
 // DeviceState OLT Device state
diff --git a/internal/pkg/core/openolt.go b/internal/pkg/core/openolt.go
index 996c0f5..e00e1f0 100644
--- a/internal/pkg/core/openolt.go
+++ b/internal/pkg/core/openolt.go
@@ -22,14 +22,14 @@
 	"sync"
 	"time"
 
-	"github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif"
-	"github.com/opencord/voltha-lib-go/v3/pkg/kafka"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	"github.com/opencord/voltha-lib-go/v4/pkg/adapters/adapterif"
+	"github.com/opencord/voltha-lib-go/v4/pkg/kafka"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/config"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
-	ic "github.com/opencord/voltha-protos/v3/go/inter_container"
-	"github.com/opencord/voltha-protos/v3/go/openflow_13"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
+	ic "github.com/opencord/voltha-protos/v4/go/inter_container"
+	"github.com/opencord/voltha-protos/v4/go/openflow_13"
+	"github.com/opencord/voltha-protos/v4/go/voltha"
 )
 
 //OpenOLT structure holds the OLT information
diff --git a/internal/pkg/core/openolt_eventmgr.go b/internal/pkg/core/openolt_eventmgr.go
index df7b5cf..65b76e6 100644
--- a/internal/pkg/core/openolt_eventmgr.go
+++ b/internal/pkg/core/openolt_eventmgr.go
@@ -23,12 +23,12 @@
 	"fmt"
 	"strconv"
 
-	"github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	"github.com/opencord/voltha-lib-go/v4/pkg/adapters/adapterif"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
-	"github.com/opencord/voltha-protos/v3/go/common"
-	oop "github.com/opencord/voltha-protos/v3/go/openolt"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
+	"github.com/opencord/voltha-protos/v4/go/common"
+	oop "github.com/opencord/voltha-protos/v4/go/openolt"
+	"github.com/opencord/voltha-protos/v4/go/voltha"
 )
 
 const (
diff --git a/internal/pkg/core/openolt_eventmgr_test.go b/internal/pkg/core/openolt_eventmgr_test.go
index 84dff0b..955bee9 100644
--- a/internal/pkg/core/openolt_eventmgr_test.go
+++ b/internal/pkg/core/openolt_eventmgr_test.go
@@ -24,7 +24,7 @@
 	"time"
 
 	"github.com/opencord/voltha-openolt-adapter/pkg/mocks"
-	oop "github.com/opencord/voltha-protos/v3/go/openolt"
+	oop "github.com/opencord/voltha-protos/v4/go/openolt"
 )
 
 func mockEventMgr() *OpenOltEventMgr {
diff --git a/internal/pkg/core/openolt_flowmgr.go b/internal/pkg/core/openolt_flowmgr.go
index b82d7f6..b936a90 100644
--- a/internal/pkg/core/openolt_flowmgr.go
+++ b/internal/pkg/core/openolt_flowmgr.go
@@ -19,26 +19,22 @@
 
 import (
 	"context"
-	"crypto/md5"
 	"encoding/hex"
-	"encoding/json"
 	"errors"
 	"fmt"
-	"github.com/opencord/voltha-lib-go/v3/pkg/flows"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	tp "github.com/opencord/voltha-lib-go/v3/pkg/techprofile"
+	"github.com/opencord/voltha-lib-go/v4/pkg/flows"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
+	tp "github.com/opencord/voltha-lib-go/v4/pkg/techprofile"
 	rsrcMgr "github.com/opencord/voltha-openolt-adapter/internal/pkg/resourcemanager"
-	"github.com/opencord/voltha-protos/v3/go/common"
-	ic "github.com/opencord/voltha-protos/v3/go/inter_container"
-	ofp "github.com/opencord/voltha-protos/v3/go/openflow_13"
-	openoltpb2 "github.com/opencord/voltha-protos/v3/go/openolt"
-	tp_pb "github.com/opencord/voltha-protos/v3/go/tech_profile"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-	"math/big"
+	"github.com/opencord/voltha-protos/v4/go/common"
+	ic "github.com/opencord/voltha-protos/v4/go/inter_container"
+	ofp "github.com/opencord/voltha-protos/v4/go/openflow_13"
+	openoltpb2 "github.com/opencord/voltha-protos/v4/go/openolt"
+	tp_pb "github.com/opencord/voltha-protos/v4/go/tech_profile"
+	"github.com/opencord/voltha-protos/v4/go/voltha"
 	"strings"
 	"sync"
 
-	//deepcopy "github.com/getlantern/deepcopy"
 	"github.com/EagleChen/mapmutex"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
 	"google.golang.org/grpc/codes"
@@ -46,28 +42,11 @@
 )
 
 const (
-	// Flow categories
-
-	//HsiaFlow flow category
-	HsiaFlow = "HSIA_FLOW"
-
-	//EapolFlow flow category
-	EapolFlow = "EAPOL_FLOW"
-
-	//DhcpFlow flow category
-	DhcpFlow = "DHCP_FLOW"
-
-	//MulticastFlow flow category
-	MulticastFlow = "MULTICAST_FLOW"
-
-	//IgmpFlow flow category
-	IgmpFlow = "IGMP_FLOW"
-
 	//IPProtoDhcp flow category
 	IPProtoDhcp = 17
 
-	//IPProtoIgmp flow category
-	IPProtoIgmp = 2
+	//IgmpProto proto value
+	IgmpProto = 2
 
 	//EapEthType eapethtype value
 	EapEthType = 0x888e
@@ -76,9 +55,6 @@
 	//IPv4EthType IPv4 ethernet type value
 	IPv4EthType = 0x800
 
-	//IgmpProto proto value
-	IgmpProto = 2
-
 	//ReservedVlan Transparent Vlan (Masked Vlan, VLAN_ANY in ONOS Flows)
 	ReservedVlan = 4096
 
@@ -164,13 +140,6 @@
 	NoneOnuID = -1
 	//NoneUniID constant
 	NoneUniID = -1
-	//NoneGemPortID constant
-	NoneGemPortID = -1
-
-	// BinaryStringPrefix is binary string prefix
-	BinaryStringPrefix = "0b"
-	// BinaryBit1 is binary bit 1 expressed as a character
-	BinaryBit1 = '1'
 
 	// MapMutex
 	maxRetry  = 300
@@ -178,12 +147,10 @@
 	baseDelay = 10000000
 	factor    = 1.1
 	jitter    = 0.2
-)
 
-type gemPortKey struct {
-	intfID  uint32
-	gemPort uint32
-}
+	bitMapPrefix = "0b"
+	pbit1        = '1'
+)
 
 type tpLockKey struct {
 	intfID uint32
@@ -210,6 +177,15 @@
 	uniID  uint32
 }
 
+// subscriberDataPathFlowIDKey is key to subscriberDataPathFlowIDMap map
+type subscriberDataPathFlowIDKey struct {
+	intfID    uint32
+	onuID     uint32
+	uniID     uint32
+	direction string
+	tpID      uint32
+}
+
 // pendingFlowRemoveData is value stored in pendingFlowRemoveDataPerSubscriber map
 // This holds the number of pending flow removes and also a signal channel to
 // to indicate the receiver when all flow removes are handled
@@ -220,18 +196,25 @@
 
 //OpenOltFlowMgr creates the Structure of OpenOltFlowMgr obj
 type OpenOltFlowMgr struct {
-	techprofile        map[uint32]tp.TechProfileIf
-	deviceHandler      *DeviceHandler
-	grpMgr             *OpenOltGroupMgr
-	resourceMgr        *rsrcMgr.OpenOltResourceMgr
-	onuIdsLock         sync.RWMutex
-	perGemPortLock     *mapmutex.Mutex                    // lock to be used to access the flowsUsedByGemPort map
-	flowsUsedByGemPort map[gemPortKey][]uint32            //gem port id to flow ids
-	packetInGemPort    map[rsrcMgr.PacketInInfoKey]uint32 //packet in gem port local cache
+	ponPortIdx    uint32 // Pon Port this FlowManager is responsible for
+	techprofile   map[uint32]tp.TechProfileIf
+	deviceHandler *DeviceHandler
+	grpMgr        *OpenOltGroupMgr
+	resourceMgr   *rsrcMgr.OpenOltResourceMgr
+
+	onuIdsLock sync.RWMutex // TODO: Do we need this?
+
+	flowsUsedByGemPort    map[uint32][]uint64 // gem port id to flow ids
+	flowsUsedByGemPortKey sync.RWMutex        // lock to be used to access the flowsUsedByGemPort map
+
+	packetInGemPort     map[rsrcMgr.PacketInInfoKey]uint32 //packet in gem port local cache
+	packetInGemPortLock sync.RWMutex
+
 	// TODO create a type rsrcMgr.OnuGemInfos to be used instead of []rsrcMgr.OnuGemInfo
-	onuGemInfo map[uint32][]rsrcMgr.OnuGemInfo //onu, gem and uni info local cache, indexed by IntfId
+	onuGemInfo []rsrcMgr.OnuGemInfo //onu, gem and uni info local cache
 	// We need to have a global lock on the onuGemInfo map
 	onuGemInfoLock sync.RWMutex
+
 	// The mapmutex.Mutex can be fine tuned to use mapmutex.NewCustomizedMapMutex
 	perUserFlowHandleLock *mapmutex.Mutex
 
@@ -242,10 +225,15 @@
 	// management contentions on a per subscriber bases, so we need ensure ordering.
 	pendingFlowRemoveDataPerSubscriber     map[pendingFlowRemoveDataKey]pendingFlowRemoveData
 	pendingFlowRemoveDataPerSubscriberLock sync.RWMutex
+
+	// Map of voltha flowID associated with subscriberDataPathFlowIDKey
+	// This information is not persisted on Kv store and hence should be reconciled on adapter restart
+	subscriberDataPathFlowIDMap     map[subscriberDataPathFlowIDKey]uint64
+	subscriberDataPathFlowIDMapLock sync.RWMutex
 }
 
 //NewFlowManager creates OpenOltFlowMgr object and initializes the parameters
-func NewFlowManager(ctx context.Context, dh *DeviceHandler, rMgr *rsrcMgr.OpenOltResourceMgr, grpMgr *OpenOltGroupMgr) *OpenOltFlowMgr {
+func NewFlowManager(ctx context.Context, dh *DeviceHandler, rMgr *rsrcMgr.OpenOltResourceMgr, grpMgr *OpenOltGroupMgr, ponPortIdx uint32) *OpenOltFlowMgr {
 	logger.Infow(ctx, "initializing-flow-manager", log.Fields{"device-id": dh.device.Id})
 	var flowMgr OpenOltFlowMgr
 	var err error
@@ -261,58 +249,54 @@
 	}
 	flowMgr.onuIdsLock = sync.RWMutex{}
 	flowMgr.pendingFlowRemoveDataPerSubscriberLock = sync.RWMutex{}
-	flowMgr.flowsUsedByGemPort = make(map[gemPortKey][]uint32)
+	flowMgr.flowsUsedByGemPort = make(map[uint32][]uint64)
 	flowMgr.packetInGemPort = make(map[rsrcMgr.PacketInInfoKey]uint32)
-	ponPorts := rMgr.DevInfo.GetPonPorts()
-	flowMgr.onuGemInfo = make(map[uint32][]rsrcMgr.OnuGemInfo, ponPorts)
+	flowMgr.packetInGemPortLock = sync.RWMutex{}
 	flowMgr.onuGemInfoLock = sync.RWMutex{}
 	flowMgr.perUserFlowHandleLock = mapmutex.NewCustomizedMapMutex(maxRetry, maxDelay, baseDelay, factor, jitter)
-	flowMgr.perGemPortLock = mapmutex.NewCustomizedMapMutex(maxRetry, maxDelay, baseDelay, factor, jitter)
 	flowMgr.pendingFlowRemoveDataPerSubscriber = make(map[pendingFlowRemoveDataKey]pendingFlowRemoveData)
+	flowMgr.subscriberDataPathFlowIDMap = make(map[subscriberDataPathFlowIDKey]uint64)
+	flowMgr.subscriberDataPathFlowIDMapLock = sync.RWMutex{}
 	//Load the onugem info cache from kv store on flowmanager start
-	for idx = 0; idx < ponPorts; idx++ {
-		if flowMgr.onuGemInfo[idx], err = rMgr.GetOnuGemInfo(ctx, idx); err != nil {
-			logger.Error(ctx, "failed-to-load-onu-gem-info-cache")
-		}
-		//Load flowID list per gem map per interface from the kvstore.
-		flowMgr.loadFlowIDlistForGem(ctx, idx)
+	if flowMgr.onuGemInfo, err = rMgr.GetOnuGemInfo(ctx, ponPortIdx); err != nil {
+		logger.Error(ctx, "failed-to-load-onu-gem-info-cache")
 	}
+	//Load flowID list per gem map per interface from the kvstore.
+	flowMgr.loadFlowIDlistForGem(ctx, idx)
 	//load interface to multicast queue map from kv store
 	flowMgr.grpMgr.LoadInterfaceToMulticastQueueMap(ctx)
+	flowMgr.reconcileSubscriberDataPathFlowIDMap(ctx)
 	logger.Info(ctx, "initialization-of-flow-manager-success")
 	return &flowMgr
 }
 
 func (f *OpenOltFlowMgr) registerFlow(ctx context.Context, flowFromCore *ofp.OfpFlowStats, deviceFlow *openoltpb2.Flow) error {
-	gemPK := gemPortKey{uint32(deviceFlow.AccessIntfId), uint32(deviceFlow.GemportId)}
-	if f.perGemPortLock.TryLock(gemPK) {
-		logger.Debugw(ctx, "registering-flow-for-device ",
-			log.Fields{
-				"flow":      flowFromCore,
-				"device-id": f.deviceHandler.device.Id})
-		flowIDList, ok := f.flowsUsedByGemPort[gemPK]
-		if !ok {
-			flowIDList = []uint32{deviceFlow.FlowId}
+	if !deviceFlow.ReplicateFlow && deviceFlow.GemportId > 0 {
+		// Flow is not replicated in this case, we need to register the flow for a single gem-port
+		return f.registerFlowIDForGem(ctx, uint32(deviceFlow.AccessIntfId), uint32(deviceFlow.GemportId), flowFromCore)
+	} else if deviceFlow.ReplicateFlow && len(deviceFlow.PbitToGemport) > 0 {
+		// Flow is replicated in this case. We need to register the flow for all the gem-ports it is replicated to.
+		for _, gemPort := range deviceFlow.PbitToGemport {
+			if err := f.registerFlowIDForGem(ctx, uint32(deviceFlow.AccessIntfId), gemPort, flowFromCore); err != nil {
+				return err
+			}
 		}
-		flowIDList = appendUnique(flowIDList, deviceFlow.FlowId)
-		f.flowsUsedByGemPort[gemPK] = flowIDList
-
-		f.perGemPortLock.Unlock(gemPK)
-
-		// update the flowids for a gem to the KVstore
-		return f.resourceMgr.UpdateFlowIDsForGem(ctx, uint32(deviceFlow.AccessIntfId), uint32(deviceFlow.GemportId), flowIDList)
 	}
-	logger.Error(ctx, "failed-to-acquire-per-gem-port-lock",
-		log.Fields{
-			"flow-from-core": flowFromCore,
-			"device-id":      f.deviceHandler.device.Id,
-			"key":            gemPK,
-		})
-	return olterrors.NewErrAdapter("failed-to-acquire-per-gem-port-lock", log.Fields{
-		"flow-from-core": flowFromCore,
-		"device-id":      f.deviceHandler.device.Id,
-		"key":            gemPK,
-	}, nil)
+	return nil
+}
+
+func (f *OpenOltFlowMgr) registerFlowIDForGem(ctx context.Context, accessIntfID uint32, gemPortID uint32, flowFromCore *ofp.OfpFlowStats) error {
+	f.flowsUsedByGemPortKey.Lock()
+	flowIDList, ok := f.flowsUsedByGemPort[gemPortID]
+	if !ok {
+		flowIDList = []uint64{flowFromCore.Id}
+	}
+	flowIDList = appendUnique64bit(flowIDList, flowFromCore.Id)
+	f.flowsUsedByGemPort[gemPortID] = flowIDList
+	f.flowsUsedByGemPortKey.Unlock()
+
+	// update the flowids for a gem to the KVstore
+	return f.resourceMgr.UpdateFlowIDsForGem(ctx, accessIntfID, gemPortID, flowIDList)
 }
 
 func (f *OpenOltFlowMgr) processAddFlow(ctx context.Context, intfID uint32, onuID uint32, uniID uint32, portNo uint32,
@@ -511,7 +495,7 @@
 	TrafficSched := []*tp_pb.TrafficScheduler{f.techprofile[sq.intfID].GetTrafficScheduler(sq.tpInst.(*tp.TechProfile), SchedCfg, TrafficShaping)}
 	TrafficSched[0].TechProfileId = sq.tpID
 
-	if err := f.pushSchedulerQueuesToDevice(ctx, sq, TrafficShaping, TrafficSched); err != nil {
+	if err := f.pushSchedulerQueuesToDevice(ctx, sq, TrafficSched); err != nil {
 		return olterrors.NewErrAdapter("failure-pushing-traffic-scheduler-and-queues-to-device",
 			log.Fields{"intf-id": sq.intfID,
 				"direction": sq.direction,
@@ -534,7 +518,7 @@
 	return nil
 }
 
-func (f *OpenOltFlowMgr) pushSchedulerQueuesToDevice(ctx context.Context, sq schedQueue, TrafficShaping *tp_pb.TrafficShapingInfo, TrafficSched []*tp_pb.TrafficScheduler) error {
+func (f *OpenOltFlowMgr) pushSchedulerQueuesToDevice(ctx context.Context, sq schedQueue, TrafficSched []*tp_pb.TrafficScheduler) error {
 	trafficQueues, err := f.techprofile[sq.intfID].GetTrafficQueues(ctx, sq.tpInst.(*tp.TechProfile), sq.direction)
 
 	if err != nil {
@@ -800,14 +784,14 @@
 		for _, gem := range tpInst.UpstreamGemPortAttributeList {
 			gemPortIDs = append(gemPortIDs, gem.GemportID)
 		}
-		allocIDs = appendUnique(allocIDs, allocID)
+		allocIDs = appendUnique32bit(allocIDs, allocID)
 
 		if tpInstanceExists {
 			return allocID, gemPortIDs, techProfileInstance
 		}
 
 		for _, gemPortID := range gemPortIDs {
-			allgemPortIDs = appendUnique(allgemPortIDs, gemPortID)
+			allgemPortIDs = appendUnique32bit(allgemPortIDs, gemPortID)
 		}
 		logger.Infow(ctx, "allocated-tcont-and-gem-ports",
 			log.Fields{
@@ -824,14 +808,14 @@
 		for _, gem := range tpInst.UpstreamQueueAttributeList {
 			gemPortIDs = append(gemPortIDs, gem.GemportID)
 		}
-		allocIDs = appendUnique(allocIDs, allocID)
+		allocIDs = appendUnique32bit(allocIDs, allocID)
 
 		if tpInstanceExists {
 			return allocID, gemPortIDs, techProfileInstance
 		}
 
 		for _, gemPortID := range gemPortIDs {
-			allgemPortIDs = appendUnique(allgemPortIDs, gemPortID)
+			allgemPortIDs = appendUnique32bit(allgemPortIDs, gemPortID)
 		}
 		logger.Infow(ctx, "allocated-tcont-and-gem-ports",
 			log.Fields{
@@ -879,7 +863,7 @@
 	var tpCount int
 	for _, techRange := range f.resourceMgr.DevInfo.Ranges {
 		for _, intfID := range techRange.IntfIds {
-			f.techprofile[intfID] = f.resourceMgr.ResourceMgrs[uint32(intfID)].TechProfileMgr
+			f.techprofile[intfID] = f.resourceMgr.ResourceMgrs[intfID].TechProfileMgr
 			tpCount++
 			logger.Debugw(ctx, "init-tech-profile-done",
 				log.Fields{
@@ -903,24 +887,24 @@
 	return nil
 }
 
-func (f *OpenOltFlowMgr) addUpstreamDataFlow(ctx context.Context, intfID uint32, onuID uint32, uniID uint32,
+func (f *OpenOltFlowMgr) addUpstreamDataPathFlow(ctx context.Context, intfID uint32, onuID uint32, uniID uint32,
 	portNo uint32, uplinkClassifier map[string]interface{},
 	uplinkAction map[string]interface{}, logicalFlow *ofp.OfpFlowStats,
-	allocID uint32, gemportID uint32, tpID uint32) error {
+	allocID uint32, gemportID uint32, tpID uint32, pbitToGem map[uint32]uint32) error {
 	uplinkClassifier[PacketTagType] = SingleTag
 	logger.Debugw(ctx, "adding-upstream-data-flow",
 		log.Fields{
 			"uplinkClassifier": uplinkClassifier,
 			"uplinkAction":     uplinkAction})
-	return f.addHSIAFlow(ctx, intfID, onuID, uniID, portNo, uplinkClassifier, uplinkAction,
-		Upstream, logicalFlow, allocID, gemportID, tpID)
+	return f.addSymmetricDataPathFlow(ctx, intfID, onuID, uniID, portNo, uplinkClassifier, uplinkAction,
+		Upstream, logicalFlow, allocID, gemportID, tpID, pbitToGem)
 	/* TODO: Install Secondary EAP on the subscriber vlan */
 }
 
-func (f *OpenOltFlowMgr) addDownstreamDataFlow(ctx context.Context, intfID uint32, onuID uint32, uniID uint32,
+func (f *OpenOltFlowMgr) addDownstreamDataPathFlow(ctx context.Context, intfID uint32, onuID uint32, uniID uint32,
 	portNo uint32, downlinkClassifier map[string]interface{},
 	downlinkAction map[string]interface{}, logicalFlow *ofp.OfpFlowStats,
-	allocID uint32, gemportID uint32, tpID uint32) error {
+	allocID uint32, gemportID uint32, tpID uint32, pbitToGem map[uint32]uint32) error {
 	downlinkClassifier[PacketTagType] = DoubleTag
 	logger.Debugw(ctx, "adding-downstream-data-flow",
 		log.Fields{
@@ -956,20 +940,21 @@
 			"device-id": f.deviceHandler.device.Id}, nil).Log()
 	}
 
-	return f.addHSIAFlow(ctx, intfID, onuID, uniID, portNo, downlinkClassifier, downlinkAction,
-		Downstream, logicalFlow, allocID, gemportID, tpID)
+	return f.addSymmetricDataPathFlow(ctx, intfID, onuID, uniID, portNo, downlinkClassifier, downlinkAction,
+		Downstream, logicalFlow, allocID, gemportID, tpID, pbitToGem)
 }
 
-func (f *OpenOltFlowMgr) addHSIAFlow(ctx context.Context, intfID uint32, onuID uint32, uniID uint32, portNo uint32, classifier map[string]interface{},
+func (f *OpenOltFlowMgr) addSymmetricDataPathFlow(ctx context.Context, intfID uint32, onuID uint32, uniID uint32, portNo uint32, classifier map[string]interface{},
 	action map[string]interface{}, direction string, logicalFlow *ofp.OfpFlowStats,
-	allocID uint32, gemPortID uint32, tpID uint32) error {
-	/* One of the OLT platform (Broadcom BAL) requires that symmetric
-	   flows require the same flow_id to be used across UL and DL.
-	   Since HSIA flow is the only symmetric flow currently, we need to
-	   re-use the flow_id across both direction. The 'flow_category'
-	   takes priority over flow_cookie to find any available HSIA_FLOW
-	   id for the ONU.
-	*/
+	allocID uint32, gemPortID uint32, tpID uint32, pbitToGem map[uint32]uint32) error {
+
+	var inverseDirection string
+	if direction == Upstream {
+		inverseDirection = Downstream
+	} else {
+		inverseDirection = Upstream
+	}
+
 	logger.Infow(ctx, "adding-hsia-flow",
 		log.Fields{
 			"intf-id":     intfID,
@@ -982,35 +967,8 @@
 			"alloc-id":    allocID,
 			"gemport-id":  gemPortID,
 			"logicalflow": *logicalFlow})
-	var vlanPbit uint32 = 0xff // means no pbit
-	var vlanVid uint32
-	if _, ok := classifier[VlanPcp]; ok {
-		vlanPbit = classifier[VlanPcp].(uint32)
-		logger.Debugw(ctx, "found-pbit-in-flow",
-			log.Fields{
-				"vlan-pbit": vlanPbit,
-				"intf-id":   intfID,
-				"onu-id":    onuID,
-				"device-id": f.deviceHandler.device.Id})
-	} else {
-		logger.Debugw(ctx, "pbit-not-found-in-flow",
-			log.Fields{
-				"vlan-pcp":  VlanPcp,
-				"intf-id":   intfID,
-				"onu-id":    onuID,
-				"device-id": f.deviceHandler.device.Id})
-	}
-	if _, ok := classifier[VlanVid]; ok {
-		vlanVid = classifier[VlanVid].(uint32)
-		logger.Debugw(ctx, "found-vlan-in-the-flow",
-			log.Fields{
-				"vlan-vid":  vlanVid,
-				"intf-id":   intfID,
-				"onu-id":    onuID,
-				"device-id": f.deviceHandler.device.Id})
-	}
-	flowStoreCookie := getFlowStoreCookie(ctx, classifier, gemPortID)
-	if present := f.resourceMgr.IsFlowCookieOnKVStore(ctx, uint32(intfID), int32(onuID), int32(uniID), flowStoreCookie); present {
+
+	if present := f.resourceMgr.IsFlowOnKvStore(ctx, intfID, int32(onuID), int32(uniID), logicalFlow.Id); present {
 		logger.Infow(ctx, "flow-already-exists",
 			log.Fields{
 				"device-id": f.deviceHandler.device.Id,
@@ -1018,16 +976,6 @@
 				"onu-id":    onuID})
 		return nil
 	}
-	flowID, err := f.resourceMgr.GetFlowID(ctx, intfID, int32(onuID), int32(uniID), gemPortID, flowStoreCookie, HsiaFlow, vlanVid, vlanPbit)
-	if err != nil {
-		return olterrors.NewErrNotFound("hsia-flow-id",
-			log.Fields{
-				"direction": direction,
-				"device-id": f.deviceHandler.device.Id,
-				"intf-id":   intfID,
-				"onu-id":    onuID,
-			}, err).Log()
-	}
 	classifierProto, err := makeOpenOltClassifierField(classifier)
 	if err != nil {
 		return olterrors.NewErrInvalidValue(log.Fields{"classifier": classifier, "device-id": f.deviceHandler.device.Id}, err).Log()
@@ -1053,23 +1001,36 @@
 				"device-id":  f.deviceHandler.device.Id,
 			}, err).Log()
 	}
+
+	// Get symmetric flowID if it exists
+	// This symmetric flowID will be needed by agent software to use the same device flow-id that was used for the
+	// symmetric flow earlier
+	// symmetric flowID 0 is considered by agent as non-existent symmetric flow
+	keySymm := subscriberDataPathFlowIDKey{intfID: intfID, onuID: onuID, uniID: uniID, direction: inverseDirection, tpID: tpID}
+	f.subscriberDataPathFlowIDMapLock.RLock()
+	symmFlowID := f.subscriberDataPathFlowIDMap[keySymm]
+	f.subscriberDataPathFlowIDMapLock.RUnlock()
+
 	flow := openoltpb2.Flow{AccessIntfId: int32(intfID),
-		OnuId:         int32(onuID),
-		UniId:         int32(uniID),
-		FlowId:        flowID,
-		FlowType:      direction,
-		AllocId:       int32(allocID),
-		NetworkIntfId: int32(networkIntfID),
-		GemportId:     int32(gemPortID),
-		Classifier:    classifierProto,
-		Action:        actionProto,
-		Priority:      int32(logicalFlow.Priority),
-		Cookie:        logicalFlow.Cookie,
-		PortNo:        portNo,
-		TechProfileId: tpID,
+		OnuId:           int32(onuID),
+		UniId:           int32(uniID),
+		FlowId:          logicalFlow.Id,
+		FlowType:        direction,
+		AllocId:         int32(allocID),
+		NetworkIntfId:   int32(networkIntfID),
+		GemportId:       int32(gemPortID),
+		Classifier:      classifierProto,
+		Action:          actionProto,
+		Priority:        int32(logicalFlow.Priority),
+		Cookie:          logicalFlow.Cookie,
+		PortNo:          portNo,
+		TechProfileId:   tpID,
+		ReplicateFlow:   len(pbitToGem) > 0,
+		PbitToGemport:   pbitToGem,
+		SymmetricFlowId: symmFlowID,
 	}
 	if err := f.addFlowToDevice(ctx, logicalFlow, &flow); err != nil {
-		return olterrors.NewErrFlowOp("add", flowID, nil, err).Log()
+		return olterrors.NewErrFlowOp("add", logicalFlow.Id, nil, err).Log()
 	}
 	logger.Infow(ctx, "hsia-flow-added-to-device-successfully",
 		log.Fields{"direction": direction,
@@ -1077,24 +1038,28 @@
 			"flow":      flow,
 			"intf-id":   intfID,
 			"onu-id":    onuID})
-	flowsToKVStore := f.getUpdatedFlowInfo(ctx, &flow, flowStoreCookie, HsiaFlow, flowID, logicalFlow.Id)
-	if err := f.updateFlowInfoToKVStore(ctx, flow.AccessIntfId,
-		flow.OnuId,
-		flow.UniId,
-		flow.FlowId /*flowCategory,*/, flowsToKVStore); err != nil {
-		return olterrors.NewErrPersistence("update", "flow", flowID,
+	flowInfo := rsrcMgr.FlowInfo{Flow: &flow, IsSymmtricFlow: true}
+	if err := f.resourceMgr.UpdateFlowIDInfo(ctx, uint32(flow.AccessIntfId), flow.OnuId, flow.UniId, flow.FlowId, flowInfo); err != nil {
+		return olterrors.NewErrPersistence("update", "flow", logicalFlow.Id,
 			log.Fields{
 				"flow":      flow,
 				"device-id": f.deviceHandler.device.Id,
 				"intf-id":   intfID,
 				"onu-id":    onuID}, err).Log()
 	}
+
+	// Update the current flowID to the map
+	keyCurr := subscriberDataPathFlowIDKey{intfID: intfID, onuID: onuID, uniID: uniID, direction: direction, tpID: tpID}
+	f.subscriberDataPathFlowIDMapLock.Lock()
+	f.subscriberDataPathFlowIDMap[keyCurr] = logicalFlow.Id
+	f.subscriberDataPathFlowIDMapLock.Unlock()
+
 	return nil
 }
 
 func (f *OpenOltFlowMgr) addDHCPTrapFlow(ctx context.Context, intfID uint32, onuID uint32, uniID uint32, portNo uint32,
 	classifier map[string]interface{}, action map[string]interface{}, logicalFlow *ofp.OfpFlowStats, allocID uint32,
-	gemPortID uint32, tpID uint32) error {
+	gemPortID uint32, tpID uint32, pbitToGem map[uint32]uint32) error {
 
 	networkIntfID, err := getNniIntfID(ctx, classifier, action)
 	if err != nil {
@@ -1115,8 +1080,7 @@
 	classifier[UDPDst] = uint32(67)
 	classifier[PacketTagType] = SingleTag
 
-	flowStoreCookie := getFlowStoreCookie(ctx, classifier, gemPortID)
-	if present := f.resourceMgr.IsFlowCookieOnKVStore(ctx, uint32(intfID), int32(onuID), int32(uniID), flowStoreCookie); present {
+	if present := f.resourceMgr.IsFlowOnKvStore(ctx, intfID, int32(onuID), int32(uniID), logicalFlow.Id); present {
 		logger.Infow(ctx, "flow-exists--not-re-adding",
 			log.Fields{
 				"device-id": f.deviceHandler.device.Id,
@@ -1125,23 +1089,11 @@
 		return nil
 	}
 
-	flowID, err := f.resourceMgr.GetFlowID(ctx, intfID, int32(onuID), int32(uniID), gemPortID, flowStoreCookie, DhcpFlow, 0 /*classifier[VLAN_PCP].(uint32)*/)
-
-	if err != nil {
-		return olterrors.NewErrNotFound("flow",
-			log.Fields{
-				"interface-id": intfID,
-				"gem-port":     gemPortID,
-				"cookie":       flowStoreCookie,
-				"device-id":    f.deviceHandler.device.Id},
-			err).Log()
-	}
-
 	logger.Debugw(ctx, "creating-ul-dhcp-flow",
 		log.Fields{
 			"ul_classifier": classifier,
 			"ul_action":     action,
-			"uplinkFlowId":  flowID,
+			"uplinkFlowId":  logicalFlow.Id,
 			"intf-id":       intfID,
 			"onu-id":        onuID,
 			"device-id":     f.deviceHandler.device.Id})
@@ -1159,7 +1111,7 @@
 	dhcpFlow := openoltpb2.Flow{AccessIntfId: int32(intfID),
 		OnuId:         int32(onuID),
 		UniId:         int32(uniID),
-		FlowId:        flowID,
+		FlowId:        logicalFlow.Id,
 		FlowType:      Upstream,
 		AllocId:       int32(allocID),
 		NetworkIntfId: int32(networkIntfID),
@@ -1170,21 +1122,20 @@
 		Cookie:        logicalFlow.Cookie,
 		PortNo:        portNo,
 		TechProfileId: tpID,
+		ReplicateFlow: len(pbitToGem) > 0,
+		PbitToGemport: pbitToGem,
 	}
 	if err := f.addFlowToDevice(ctx, logicalFlow, &dhcpFlow); err != nil {
-		return olterrors.NewErrFlowOp("add", flowID, log.Fields{"dhcp-flow": dhcpFlow}, err).Log()
+		return olterrors.NewErrFlowOp("add", logicalFlow.Id, log.Fields{"dhcp-flow": dhcpFlow}, err).Log()
 	}
 	logger.Infow(ctx, "dhcp-ul-flow-added-to-device-successfully",
 		log.Fields{
 			"device-id": f.deviceHandler.device.Id,
-			"flow-id":   flowID,
+			"flow-id":   logicalFlow.Id,
 			"intf-id":   intfID,
 			"onu-id":    onuID})
-	flowsToKVStore := f.getUpdatedFlowInfo(ctx, &dhcpFlow, flowStoreCookie, "DHCP", flowID, logicalFlow.Id)
-	if err := f.updateFlowInfoToKVStore(ctx, dhcpFlow.AccessIntfId,
-		dhcpFlow.OnuId,
-		dhcpFlow.UniId,
-		dhcpFlow.FlowId, flowsToKVStore); err != nil {
+	flowInfo := rsrcMgr.FlowInfo{Flow: &dhcpFlow}
+	if err := f.resourceMgr.UpdateFlowIDInfo(ctx, uint32(dhcpFlow.AccessIntfId), dhcpFlow.OnuId, dhcpFlow.UniId, dhcpFlow.FlowId, flowInfo); err != nil {
 		return olterrors.NewErrPersistence("update", "flow", dhcpFlow.FlowId,
 			log.Fields{
 				"flow":      dhcpFlow,
@@ -1196,13 +1147,13 @@
 
 //addIGMPTrapFlow creates IGMP trap-to-host flow
 func (f *OpenOltFlowMgr) addIGMPTrapFlow(ctx context.Context, intfID uint32, onuID uint32, uniID uint32, portNo uint32, classifier map[string]interface{},
-	action map[string]interface{}, logicalFlow *ofp.OfpFlowStats, allocID uint32, gemPortID uint32, tpID uint32) error {
-	return f.addUpstreamTrapFlow(ctx, intfID, onuID, uniID, portNo, classifier, action, logicalFlow, allocID, gemPortID, IgmpFlow, tpID)
+	action map[string]interface{}, logicalFlow *ofp.OfpFlowStats, allocID uint32, gemPortID uint32, tpID uint32, pbitToGem map[uint32]uint32) error {
+	return f.addUpstreamTrapFlow(ctx, intfID, onuID, uniID, portNo, classifier, action, logicalFlow, allocID, gemPortID, tpID, pbitToGem)
 }
 
 //addUpstreamTrapFlow creates a trap-to-host flow
 func (f *OpenOltFlowMgr) addUpstreamTrapFlow(ctx context.Context, intfID uint32, onuID uint32, uniID uint32, portNo uint32, classifier map[string]interface{},
-	action map[string]interface{}, logicalFlow *ofp.OfpFlowStats, allocID uint32, gemPortID uint32, flowType string, tpID uint32) error {
+	action map[string]interface{}, logicalFlow *ofp.OfpFlowStats, allocID uint32, gemPortID uint32, tpID uint32, pbitToGem map[uint32]uint32) error {
 
 	networkIntfID, err := getNniIntfID(ctx, classifier, action)
 	if err != nil {
@@ -1223,32 +1174,16 @@
 	classifier[PacketTagType] = SingleTag
 	delete(classifier, VlanVid)
 
-	flowStoreCookie := getFlowStoreCookie(ctx, classifier, gemPortID)
-	if present := f.resourceMgr.IsFlowCookieOnKVStore(ctx, uint32(networkIntfID), int32(onuID), int32(uniID), flowStoreCookie); present {
+	if present := f.resourceMgr.IsFlowOnKvStore(ctx, networkIntfID, int32(onuID), int32(uniID), logicalFlow.Id); present {
 		logger.Infow(ctx, "flow-exists-not-re-adding", log.Fields{"device-id": f.deviceHandler.device.Id})
 		return nil
 	}
 
-	flowID, err := f.resourceMgr.GetFlowID(ctx, intfID, int32(onuID), int32(uniID), gemPortID, flowStoreCookie, flowType, 0, 0 /*classifier[VLAN_PCP].(uint32)*/)
-
-	if err != nil {
-		return olterrors.NewErrNotFound("flow-id",
-			log.Fields{
-				"intf-id":   intfID,
-				"oni-id":    onuID,
-				"cookie":    flowStoreCookie,
-				"flow-type": flowType,
-				"device-id": f.deviceHandler.device.Id,
-				"onu-id":    onuID},
-			err).Log()
-	}
-
 	logger.Debugw(ctx, "creating-upstream-trap-flow",
 		log.Fields{
 			"ul_classifier": classifier,
 			"ul_action":     action,
-			"uplinkFlowId":  flowID,
-			"flowType":      flowType,
+			"uplinkFlowId":  logicalFlow.Id,
 			"device-id":     f.deviceHandler.device.Id,
 			"intf-id":       intfID,
 			"onu-id":        onuID})
@@ -1269,7 +1204,7 @@
 	flow := openoltpb2.Flow{AccessIntfId: int32(intfID),
 		OnuId:         int32(onuID),
 		UniId:         int32(uniID),
-		FlowId:        flowID,
+		FlowId:        logicalFlow.Id,
 		FlowType:      Upstream,
 		AllocId:       int32(allocID),
 		NetworkIntfId: int32(networkIntfID),
@@ -1280,18 +1215,16 @@
 		Cookie:        logicalFlow.Cookie,
 		PortNo:        portNo,
 		TechProfileId: tpID,
+		ReplicateFlow: len(pbitToGem) > 0,
+		PbitToGemport: pbitToGem,
 	}
 
 	if err := f.addFlowToDevice(ctx, logicalFlow, &flow); err != nil {
-		return olterrors.NewErrFlowOp("add", flowID, log.Fields{"flow": flow, "device-id": f.deviceHandler.device.Id}, err).Log()
+		return olterrors.NewErrFlowOp("add", logicalFlow.Id, log.Fields{"flow": flow, "device-id": f.deviceHandler.device.Id}, err).Log()
 	}
-	logger.Infof(ctx, "%s ul-flow-added-to-device-successfully", flowType)
 
-	flowsToKVStore := f.getUpdatedFlowInfo(ctx, &flow, flowStoreCookie, flowType, flowID, logicalFlow.Id)
-	if err := f.updateFlowInfoToKVStore(ctx, flow.AccessIntfId,
-		flow.OnuId,
-		flow.UniId,
-		flow.FlowId, flowsToKVStore); err != nil {
+	flowInfo := rsrcMgr.FlowInfo{Flow: &flow}
+	if err := f.resourceMgr.UpdateFlowIDInfo(ctx, uint32(flow.AccessIntfId), flow.OnuId, flow.UniId, flow.FlowId, flowInfo); err != nil {
 		return olterrors.NewErrPersistence("update", "flow", flow.FlowId, log.Fields{"flow": flow, "device-id": f.deviceHandler.device.Id}, err).Log()
 	}
 
@@ -1301,7 +1234,7 @@
 // Add EAPOL flow to  device with mac, vlanId as classifier for upstream and downstream
 func (f *OpenOltFlowMgr) addEAPOLFlow(ctx context.Context, intfID uint32, onuID uint32, uniID uint32, portNo uint32,
 	classifier map[string]interface{}, action map[string]interface{}, logicalFlow *ofp.OfpFlowStats, allocID uint32,
-	gemPortID uint32, vlanID uint32, tpID uint32) error {
+	gemPortID uint32, vlanID uint32, tpID uint32, pbitToGem map[uint32]uint32) error {
 	logger.Infow(ctx, "adding-eapol-to-device",
 		log.Fields{
 			"intf-id":    intfID,
@@ -1322,8 +1255,7 @@
 	uplinkClassifier[VlanPcp] = classifier[VlanPcp]
 	// Fill action
 	uplinkAction[TrapToHost] = true
-	flowStoreCookie := getFlowStoreCookie(ctx, uplinkClassifier, gemPortID)
-	if present := f.resourceMgr.IsFlowCookieOnKVStore(ctx, uint32(intfID), int32(onuID), int32(uniID), flowStoreCookie); present {
+	if present := f.resourceMgr.IsFlowOnKvStore(ctx, intfID, int32(onuID), int32(uniID), logicalFlow.Id); present {
 		logger.Infow(ctx, "flow-exists-not-re-adding", log.Fields{
 			"device-id": f.deviceHandler.device.Id,
 			"onu-id":    onuID,
@@ -1331,21 +1263,11 @@
 		return nil
 	}
 	//Add Uplink EAPOL Flow
-	uplinkFlowID, err := f.resourceMgr.GetFlowID(ctx, intfID, int32(onuID), int32(uniID), gemPortID, flowStoreCookie, "", 0, 0)
-	if err != nil {
-		return olterrors.NewErrNotFound("flow-id",
-			log.Fields{
-				"intf-id":   intfID,
-				"onu-id":    onuID,
-				"coookie":   flowStoreCookie,
-				"device-id": f.deviceHandler.device.Id},
-			err).Log()
-	}
 	logger.Debugw(ctx, "creating-ul-eapol-flow",
 		log.Fields{
 			"ul_classifier": uplinkClassifier,
 			"ul_action":     uplinkAction,
-			"uplinkFlowId":  uplinkFlowID,
+			"uplinkFlowId":  logicalFlow.Id,
 			"device-id":     f.deviceHandler.device.Id,
 			"intf-id":       intfID,
 			"onu-id":        onuID})
@@ -1380,7 +1302,7 @@
 	upstreamFlow := openoltpb2.Flow{AccessIntfId: int32(intfID),
 		OnuId:         int32(onuID),
 		UniId:         int32(uniID),
-		FlowId:        uplinkFlowID,
+		FlowId:        logicalFlow.Id,
 		FlowType:      Upstream,
 		AllocId:       int32(allocID),
 		NetworkIntfId: int32(networkIntfID),
@@ -1391,9 +1313,11 @@
 		Cookie:        logicalFlow.Cookie,
 		PortNo:        portNo,
 		TechProfileId: tpID,
+		ReplicateFlow: len(pbitToGem) > 0,
+		PbitToGemport: pbitToGem,
 	}
 	if err := f.addFlowToDevice(ctx, logicalFlow, &upstreamFlow); err != nil {
-		return olterrors.NewErrFlowOp("add", uplinkFlowID, log.Fields{"flow": upstreamFlow}, err).Log()
+		return olterrors.NewErrFlowOp("add", logicalFlow.Id, log.Fields{"flow": upstreamFlow}, err).Log()
 	}
 	logger.Infow(ctx, "eapol-ul-flow-added-to-device-successfully",
 		log.Fields{
@@ -1401,14 +1325,8 @@
 			"onu-id":    onuID,
 			"intf-id":   intfID,
 		})
-	flowCategory := "EAPOL"
-	flowsToKVStore := f.getUpdatedFlowInfo(ctx, &upstreamFlow, flowStoreCookie, flowCategory, uplinkFlowID, logicalFlow.Id)
-	if err := f.updateFlowInfoToKVStore(ctx, upstreamFlow.AccessIntfId,
-		upstreamFlow.OnuId,
-		upstreamFlow.UniId,
-		upstreamFlow.FlowId,
-		/* lowCategory, */
-		flowsToKVStore); err != nil {
+	flowInfo := rsrcMgr.FlowInfo{Flow: &upstreamFlow}
+	if err := f.resourceMgr.UpdateFlowIDInfo(ctx, uint32(upstreamFlow.AccessIntfId), upstreamFlow.OnuId, upstreamFlow.UniId, upstreamFlow.FlowId, flowInfo); err != nil {
 		return olterrors.NewErrPersistence("update", "flow", upstreamFlow.FlowId,
 			log.Fields{
 				"flow":      upstreamFlow,
@@ -1498,7 +1416,7 @@
 }
 
 // DeleteTechProfileInstances removes the tech profile instances from persistent storage
-func (f *OpenOltFlowMgr) DeleteTechProfileInstances(ctx context.Context, intfID uint32, onuID uint32, uniID uint32, sn string) error {
+func (f *OpenOltFlowMgr) DeleteTechProfileInstances(ctx context.Context, intfID uint32, onuID uint32, uniID uint32) error {
 	tpIDList := f.resourceMgr.GetTechProfileIDForOnu(ctx, intfID, onuID, uniID)
 	uniPortName := getUniPortPath(f.deviceHandler.device.Id, intfID, int32(onuID), int32(uniID))
 
@@ -1528,92 +1446,6 @@
 	return nil
 }
 
-func getFlowStoreCookie(ctx context.Context, classifier map[string]interface{}, gemPortID uint32) uint64 {
-	if len(classifier) == 0 { // should never happen
-		logger.Error(ctx, "invalid-classfier-object")
-		return 0
-	}
-	logger.Debugw(ctx, "generating-flow-store-cookie",
-		log.Fields{
-			"classifier": classifier,
-			"gemport-id": gemPortID})
-	var jsonData []byte
-	var flowString string
-	var err error
-	// TODO: Do we need to marshall ??
-	if jsonData, err = json.Marshal(classifier); err != nil {
-		logger.Error(ctx, "failed-to-encode-classifier")
-		return 0
-	}
-	flowString = string(jsonData)
-	if gemPortID != 0 {
-		flowString = fmt.Sprintf("%s%s", string(jsonData), string(gemPortID))
-	}
-	h := md5.New()
-	_, _ = h.Write([]byte(flowString))
-	hash := big.NewInt(0)
-	hash.SetBytes(h.Sum(nil))
-	generatedHash := hash.Uint64()
-	logger.Debugw(ctx, "hash-generated", log.Fields{"hash": generatedHash})
-	return generatedHash
-}
-
-func (f *OpenOltFlowMgr) getUpdatedFlowInfo(ctx context.Context, flow *openoltpb2.Flow, flowStoreCookie uint64, flowCategory string, deviceFlowID uint32, logicalFlowID uint64) *[]rsrcMgr.FlowInfo {
-	var flows = []rsrcMgr.FlowInfo{{Flow: flow, FlowCategory: flowCategory, FlowStoreCookie: flowStoreCookie, LogicalFlowID: logicalFlowID}}
-	var intfID uint32
-	/* For flows which trap out of the NNI, the AccessIntfId is invalid
-	   (set to -1). In such cases, we need to refer to the NetworkIntfId .
-	*/
-	if flow.AccessIntfId != -1 {
-		intfID = uint32(flow.AccessIntfId)
-	} else {
-		intfID = uint32(flow.NetworkIntfId)
-	}
-	// Get existing flows matching flowid for given subscriber from KV store
-	existingFlows := f.resourceMgr.GetFlowIDInfo(ctx, intfID, flow.OnuId, flow.UniId, flow.FlowId)
-	if existingFlows != nil {
-		logger.Debugw(ctx, "flow-exists-for-given-flowID--appending-it-to-current-flow",
-			log.Fields{
-				"flow-id":   flow.FlowId,
-				"device-id": f.deviceHandler.device.Id,
-				"intf-id":   intfID,
-				"onu-id":    flow.OnuId})
-		//for _, f := range *existingFlows {
-		//	flows = append(flows, f)
-		//}
-		flows = append(flows, *existingFlows...)
-	}
-	logger.Debugw(ctx, "updated-flows-for-given-flowID-and-onuid",
-		log.Fields{
-			"updatedflow": flows,
-			"flow-id":     flow.FlowId,
-			"onu-id":      flow.OnuId,
-			"device-id":   f.deviceHandler.device.Id})
-	return &flows
-}
-
-func (f *OpenOltFlowMgr) updateFlowInfoToKVStore(ctx context.Context, intfID int32, onuID int32, uniID int32, flowID uint32, flows *[]rsrcMgr.FlowInfo) error {
-	logger.Debugw(ctx, "storing-flow(s)-into-kv-store", log.Fields{
-		"flow-id":   flowID,
-		"device-id": f.deviceHandler.device.Id,
-		"intf-id":   intfID,
-		"onu-id":    onuID})
-	if err := f.resourceMgr.UpdateFlowIDInfo(ctx, intfID, onuID, uniID, flowID, flows); err != nil {
-		logger.Warnw(ctx, "error-while-storing-flow-into-kv-store", log.Fields{
-			"device-id": f.deviceHandler.device.Id,
-			"onu-id":    onuID,
-			"intf-id":   intfID,
-			"flow-id":   flowID})
-		return err
-	}
-	logger.Infow(ctx, "stored-flow(s)-into-kv-store-successfully!", log.Fields{
-		"device-id": f.deviceHandler.device.Id,
-		"onu-id":    onuID,
-		"intf-id":   intfID,
-		"flow-id":   flowID})
-	return nil
-}
-
 func (f *OpenOltFlowMgr) addFlowToDevice(ctx context.Context, logicalFlow *ofp.OfpFlowStats, deviceFlow *openoltpb2.Flow) error {
 
 	var intfID uint32
@@ -1623,7 +1455,8 @@
 	if deviceFlow.AccessIntfId != -1 {
 		intfID = uint32(deviceFlow.AccessIntfId)
 	} else {
-		// REVIST : Why ponport is given as network port?
+		// We need to log the valid interface ID.
+		// For trap-on-nni flows, the access_intf_id is invalid (-1), so choose the network_intf_id.
 		intfID = uint32(deviceFlow.NetworkIntfId)
 	}
 
@@ -1649,21 +1482,22 @@
 				"device-flow": deviceFlow,
 				"device-id":   f.deviceHandler.device.Id,
 				"intf-id":     intfID})
-		f.resourceMgr.FreeFlowID(ctx, intfID, deviceFlow.OnuId, deviceFlow.UniId, deviceFlow.FlowId)
 		return err
 	}
-	if deviceFlow.GemportId != -1 {
-		// No need to register the flow if it is a trap on nni flow.
-		if err := f.registerFlow(ctx, logicalFlow, deviceFlow); err != nil {
-			logger.Errorw(ctx, "failed-to-register-flow", log.Fields{"err": err})
-			return err
-		}
-	}
 	logger.Infow(ctx, "flow-added-to-device-successfully ",
 		log.Fields{
 			"flow":      *deviceFlow,
 			"device-id": f.deviceHandler.device.Id,
 			"intf-id":   intfID})
+
+	// Case of trap-on-nni flow when deviceFlow.AccessIntfId is invalid (-1)
+	if deviceFlow.AccessIntfId != -1 {
+		// No need to register the flow if it is a trap on nni flow.
+		if err := f.registerFlow(ctx, logicalFlow, deviceFlow); err != nil {
+			logger.Errorw(ctx, "failed-to-register-flow", log.Fields{"err": err})
+			return err
+		}
+	}
 	return nil
 }
 
@@ -1723,24 +1557,11 @@
 	if err != nil {
 		return olterrors.NewErrInvalidValue(log.Fields{"nni-port-number": portNo}, err).Log()
 	}
-	var flowStoreCookie = getFlowStoreCookie(ctx, classifierInfo, uint32(0))
-	if present := f.resourceMgr.IsFlowCookieOnKVStore(ctx, uint32(networkInterfaceID), int32(onuID), int32(uniID), flowStoreCookie); present {
+	if present := f.resourceMgr.IsFlowOnKvStore(ctx, networkInterfaceID, int32(onuID), int32(uniID), flow.Id); present {
 		logger.Infow(ctx, "flow-exists--not-re-adding", log.Fields{"device-id": f.deviceHandler.device.Id})
 		return nil
 	}
-	flowID, err := f.resourceMgr.GetFlowID(ctx, uint32(networkInterfaceID), int32(onuID), int32(uniID), uint32(gemPortID), flowStoreCookie, "", 0)
 
-	if err != nil {
-		return olterrors.NewErrNotFound("flow-id",
-			log.Fields{
-				"interface-id": networkInterfaceID,
-				"onu-id":       onuID,
-				"uni-id":       uniID,
-				"gem-port-id":  gemPortID,
-				"cookie":       flowStoreCookie,
-				"device-id":    f.deviceHandler.device.Id},
-			err)
-	}
 	classifierProto, err := makeOpenOltClassifierField(classifierInfo)
 	if err != nil {
 		return olterrors.NewErrInvalidValue(
@@ -1767,7 +1588,7 @@
 	downstreamflow := openoltpb2.Flow{AccessIntfId: int32(-1), // AccessIntfId not required
 		OnuId:         int32(onuID), // OnuId not required
 		UniId:         int32(uniID), // UniId not used
-		FlowId:        flowID,
+		FlowId:        flow.Id,
 		FlowType:      Downstream,
 		NetworkIntfId: int32(networkInterfaceID),
 		GemportId:     int32(gemPortID),
@@ -1777,7 +1598,7 @@
 		Cookie:        flow.Cookie,
 		PortNo:        portNo}
 	if err := f.addFlowToDevice(ctx, flow, &downstreamflow); err != nil {
-		return olterrors.NewErrFlowOp("add", flowID,
+		return olterrors.NewErrFlowOp("add", flow.Id,
 			log.Fields{
 				"flow":      downstreamflow,
 				"device-id": f.deviceHandler.device.Id}, err)
@@ -1786,13 +1607,10 @@
 		log.Fields{
 			"device-id": f.deviceHandler.device.Id,
 			"onu-id":    onuID,
-			"flow-id":   flowID})
-	flowsToKVStore := f.getUpdatedFlowInfo(ctx, &downstreamflow, flowStoreCookie, "", flowID, flow.Id)
-	if err := f.updateFlowInfoToKVStore(ctx, int32(networkInterfaceID),
-		int32(onuID),
-		int32(uniID),
-		flowID, flowsToKVStore); err != nil {
-		return olterrors.NewErrPersistence("update", "flow", flowID,
+			"flow-id":   flow.Id})
+	flowInfo := rsrcMgr.FlowInfo{Flow: &downstreamflow}
+	if err := f.resourceMgr.UpdateFlowIDInfo(ctx, networkInterfaceID, int32(onuID), int32(uniID), flow.Id, flowInfo); err != nil {
+		return olterrors.NewErrPersistence("update", "flow", flow.Id,
 			log.Fields{
 				"flow":      downstreamflow,
 				"device-id": f.deviceHandler.device.Id}, err)
@@ -1955,9 +1773,9 @@
 			"intf-id":     intfID,
 			"onu-id":      onuID,
 			"device-id":   f.deviceHandler.device.Id,
-			"onu-gem":     f.onuGemInfo[intfID]})
+			"onu-gem":     f.onuGemInfo})
 
-	onugem := f.onuGemInfo[intfID]
+	onugem := f.onuGemInfo
 deleteLoop:
 	for i, onu := range onugem {
 		if onu.OnuID == onuID {
@@ -1984,8 +1802,7 @@
 //clearResources clears pon resources in kv store and the device
 // nolint: gocyclo
 func (f *OpenOltFlowMgr) clearResources(ctx context.Context, flow *ofp.OfpFlowStats, Intf uint32, onuID int32, uniID int32,
-	gemPortID int32, flowID uint32, flowDirection string,
-	portNum uint32, updatedFlows []rsrcMgr.FlowInfo) error {
+	gemPortID int32, flowID uint64, portNum uint32) error {
 
 	tpID, err := getTpIDFromFlow(ctx, flow)
 	if err != nil {
@@ -1998,174 +1815,133 @@
 				"device-id": f.deviceHandler.device.Id}, err)
 	}
 
-	if len(updatedFlows) >= 0 {
-		// There are still flows referencing the same flow_id.
-		// So the flow should not be freed yet.
-		// For ex: Case of HSIA where same flow is shared
-		// between DS and US.
-		if err := f.updateFlowInfoToKVStore(ctx, int32(Intf), int32(onuID), int32(uniID), flowID, &updatedFlows); err != nil {
-			_ = olterrors.NewErrPersistence("update", "flow", flowID,
-				log.Fields{
-					"flow":      updatedFlows,
-					"device-id": f.deviceHandler.device.Id}, err).Log()
+	uni := getUniPortPath(f.deviceHandler.device.Id, Intf, onuID, uniID)
+	tpPath := f.getTPpath(ctx, Intf, uni, tpID)
+	logger.Debugw(ctx, "getting-techprofile-instance-for-subscriber",
+		log.Fields{
+			"tpPath":    tpPath,
+			"device-id": f.deviceHandler.device.Id})
+	techprofileInst, err := f.techprofile[Intf].GetTPInstanceFromKVStore(ctx, tpID, tpPath)
+	if err != nil || techprofileInst == nil { // This should not happen, something wrong in KV backend transaction
+		return olterrors.NewErrNotFound("tech-profile-in-kv-store",
+			log.Fields{
+				"tp-id": tpID,
+				"path":  tpPath}, err)
+	}
+
+	used := f.isGemPortUsedByAnotherFlow(uint32(gemPortID))
+
+	if used {
+		f.flowsUsedByGemPortKey.Lock()
+		defer f.flowsUsedByGemPortKey.Unlock()
+
+		flowIDs := f.flowsUsedByGemPort[uint32(gemPortID)]
+		for i, flowIDinMap := range flowIDs {
+			if flowIDinMap == flowID {
+				flowIDs = append(flowIDs[:i], flowIDs[i+1:]...)
+				// everytime flowsUsedByGemPort cache is updated the same should be updated
+				// in kv store by calling UpdateFlowIDsForGem
+				f.flowsUsedByGemPort[uint32(gemPortID)] = flowIDs
+				if err := f.resourceMgr.UpdateFlowIDsForGem(ctx, Intf, uint32(gemPortID), flowIDs); err != nil {
+					return err
+				}
+				break
+			}
 		}
-		if len(updatedFlows) == 0 {
-			logger.Debugw(ctx, "releasing-flow-id-to-resource-manager",
+		logger.Debugw(ctx, "gem-port-id-is-still-used-by-other-flows",
+			log.Fields{
+				"gemport-id":  gemPortID,
+				"usedByFlows": flowIDs,
+				"device-id":   f.deviceHandler.device.Id})
+		return nil
+	}
+	logger.Debugf(ctx, "gem-port-id %d is-not-used-by-another-flow--releasing-the-gem-port", gemPortID)
+	f.resourceMgr.RemoveGemPortIDForOnu(ctx, Intf, uint32(onuID), uint32(uniID), uint32(gemPortID))
+	// TODO: The TrafficQueue corresponding to this gem-port also should be removed immediately.
+	// But it is anyway eventually  removed later when the TechProfile is freed, so not a big issue for now.
+	f.resourceMgr.RemoveGEMportPonportToOnuMapOnKVStore(ctx, uint32(gemPortID), Intf)
+	f.deleteGemPortFromLocalCache(ctx, Intf, uint32(onuID), uint32(gemPortID))
+	f.onuIdsLock.Lock() // TODO: What is this lock?
+
+	//everytime an entry is deleted from flowsUsedByGemPort cache, the same should be updated in kv as well
+	// by calling DeleteFlowIDsForGem
+	f.flowsUsedByGemPortKey.Lock()
+	delete(f.flowsUsedByGemPort, uint32(gemPortID))
+	f.flowsUsedByGemPortKey.Unlock()
+	f.resourceMgr.DeleteFlowIDsForGem(ctx, Intf, uint32(gemPortID))
+	f.resourceMgr.FreeGemPortID(ctx, Intf, uint32(onuID), uint32(uniID), uint32(gemPortID))
+
+	f.onuIdsLock.Unlock()
+
+	// Delete the gem port on the ONU.
+	if err := f.sendDeleteGemPortToChild(ctx, Intf, uint32(onuID), uint32(uniID), uint32(gemPortID), tpPath); err != nil {
+		logger.Errorw(ctx, "error-processing-delete-gem-port-towards-onu",
+			log.Fields{
+				"err":        err,
+				"intf":       Intf,
+				"onu-id":     onuID,
+				"uni-id":     uniID,
+				"device-id":  f.deviceHandler.device.Id,
+				"gemport-id": gemPortID})
+	}
+	switch techprofileInst := techprofileInst.(type) {
+	case *tp.TechProfile:
+		ok, _ := f.isTechProfileUsedByAnotherGem(ctx, Intf, uint32(onuID), uint32(uniID), tpID, techprofileInst, uint32(gemPortID))
+		if !ok {
+			if err := f.resourceMgr.RemoveTechProfileIDForOnu(ctx, Intf, uint32(onuID), uint32(uniID), tpID); err != nil {
+				logger.Warn(ctx, err)
+			}
+			if err := f.DeleteTechProfileInstance(ctx, Intf, uint32(onuID), uint32(uniID), "", tpID); err != nil {
+				logger.Warn(ctx, err)
+			}
+			if err := f.RemoveSchedulerQueues(ctx, schedQueue{direction: tp_pb.Direction_UPSTREAM, intfID: Intf, onuID: uint32(onuID), uniID: uint32(uniID), tpID: tpID, uniPort: portNum, tpInst: techprofileInst}); err != nil {
+				logger.Warn(ctx, err)
+			}
+			if err := f.RemoveSchedulerQueues(ctx, schedQueue{direction: tp_pb.Direction_DOWNSTREAM, intfID: Intf, onuID: uint32(onuID), uniID: uint32(uniID), tpID: tpID, uniPort: portNum, tpInst: techprofileInst}); err != nil {
+				logger.Warn(ctx, err)
+			}
+			f.resourceMgr.FreeAllocID(ctx, Intf, uint32(onuID), uint32(uniID), techprofileInst.UsScheduler.AllocID)
+			// Delete the TCONT on the ONU.
+			if err := f.sendDeleteTcontToChild(ctx, Intf, uint32(onuID), uint32(uniID), techprofileInst.UsScheduler.AllocID, tpPath); err != nil {
+				logger.Errorw(ctx, "error-processing-delete-tcont-towards-onu",
+					log.Fields{
+						"intf":      Intf,
+						"onu-id":    onuID,
+						"uni-id":    uniID,
+						"device-id": f.deviceHandler.device.Id,
+						"alloc-id":  techprofileInst.UsScheduler.AllocID})
+			}
+		}
+	case *tp.EponProfile:
+		if err := f.resourceMgr.RemoveTechProfileIDForOnu(ctx, Intf, uint32(onuID), uint32(uniID), tpID); err != nil {
+			logger.Warn(ctx, err)
+		}
+		if err := f.DeleteTechProfileInstance(ctx, Intf, uint32(onuID), uint32(uniID), "", tpID); err != nil {
+			logger.Warn(ctx, err)
+		}
+		f.resourceMgr.FreeAllocID(ctx, Intf, uint32(onuID), uint32(uniID), techprofileInst.AllocID)
+		// Delete the TCONT on the ONU.
+		if err := f.sendDeleteTcontToChild(ctx, Intf, uint32(onuID), uint32(uniID), techprofileInst.AllocID, tpPath); err != nil {
+			logger.Errorw(ctx, "error-processing-delete-tcont-towards-onu",
 				log.Fields{
-					"Intf":      Intf,
+					"intf":      Intf,
 					"onu-id":    onuID,
 					"uni-id":    uniID,
-					"flow-id":   flowID,
-					"device-id": f.deviceHandler.device.Id})
-			f.resourceMgr.FreeFlowID(ctx, Intf, int32(onuID), int32(uniID), flowID)
-
-			uni := getUniPortPath(f.deviceHandler.device.Id, Intf, onuID, uniID)
-			tpPath := f.getTPpath(ctx, Intf, uni, tpID)
-			logger.Debugw(ctx, "getting-techprofile-instance-for-subscriber",
-				log.Fields{
-					"TP-PATH":   tpPath,
-					"device-id": f.deviceHandler.device.Id})
-			techprofileInst, err := f.techprofile[Intf].GetTPInstanceFromKVStore(ctx, tpID, tpPath)
-			if err != nil || techprofileInst == nil { // This should not happen, something wrong in KV backend transaction
-				return olterrors.NewErrNotFound("tech-profile-in-kv-store",
-					log.Fields{
-						"tp-id": tpID,
-						"path":  tpPath}, err)
-			}
-
-			gemPK := gemPortKey{Intf, uint32(gemPortID)}
-			used, err := f.isGemPortUsedByAnotherFlow(ctx, gemPK)
-			if err != nil {
-				return err
-			}
-			if used {
-				if f.perGemPortLock.TryLock(gemPK) {
-					flowIDs := f.flowsUsedByGemPort[gemPK]
-					for i, flowIDinMap := range flowIDs {
-						if flowIDinMap == flowID {
-							flowIDs = append(flowIDs[:i], flowIDs[i+1:]...)
-							// everytime flowsUsedByGemPort cache is updated the same should be updated
-							// in kv store by calling UpdateFlowIDsForGem
-							f.flowsUsedByGemPort[gemPK] = flowIDs
-							if err := f.resourceMgr.UpdateFlowIDsForGem(ctx, Intf, uint32(gemPortID), flowIDs); err != nil {
-								return err
-							}
-							break
-						}
-					}
-					logger.Debugw(ctx, "gem-port-id-is-still-used-by-other-flows",
-						log.Fields{
-							"gemport-id":  gemPortID,
-							"usedByFlows": flowIDs,
-							"device-id":   f.deviceHandler.device.Id})
-					f.perGemPortLock.Unlock(gemPK)
-					return nil
-				}
-
-				logger.Error(ctx, "failed-to-acquire-per-gem-port-lock",
-					log.Fields{
-						"gemport-id": gemPortID,
-						"device-id":  f.deviceHandler.device.Id,
-						"key":        gemPK,
-					})
-				return olterrors.NewErrAdapter("failed-to-acquire-per-gem-port-lock", log.Fields{
-					"gemport-id": gemPortID,
-					"device-id":  f.deviceHandler.device.Id,
-					"key":        gemPK,
-				}, nil)
-			}
-			logger.Debugf(ctx, "gem-port-id %d is-not-used-by-another-flow--releasing-the-gem-port", gemPortID)
-			f.resourceMgr.RemoveGemPortIDForOnu(ctx, Intf, uint32(onuID), uint32(uniID), uint32(gemPortID))
-			// TODO: The TrafficQueue corresponding to this gem-port also should be removed immediately.
-			// But it is anyway eventually  removed later when the TechProfile is freed, so not a big issue for now.
-			f.resourceMgr.RemoveGEMportPonportToOnuMapOnKVStore(ctx, uint32(gemPortID), Intf)
-			f.deleteGemPortFromLocalCache(ctx, Intf, uint32(onuID), uint32(gemPortID))
-			f.onuIdsLock.Lock()
-			//everytime an entry is deleted from flowsUsedByGemPort cache, the same should be updated in kv as well
-			// by calling DeleteFlowIDsForGem
-			if f.perGemPortLock.TryLock(gemPK) {
-				delete(f.flowsUsedByGemPort, gemPK)
-				f.perGemPortLock.Unlock(gemPK)
-			} else {
-				logger.Error(ctx, "failed-to-acquire-per-gem-port-lock",
-					log.Fields{
-						"device-id": f.deviceHandler.device.Id,
-						"key":       gemPK,
-					})
-			}
-			f.resourceMgr.DeleteFlowIDsForGem(ctx, Intf, uint32(gemPortID))
-			f.resourceMgr.FreeGemPortID(ctx, Intf, uint32(onuID), uint32(uniID), uint32(gemPortID))
-			f.onuIdsLock.Unlock()
-			// Delete the gem port on the ONU.
-			if err := f.sendDeleteGemPortToChild(ctx, Intf, uint32(onuID), uint32(uniID), uint32(gemPortID), tpPath); err != nil {
-				logger.Errorw(ctx, "error-processing-delete-gem-port-towards-onu",
-					log.Fields{
-						"err":        err,
-						"intf":       Intf,
-						"onu-id":     onuID,
-						"uni-id":     uniID,
-						"device-id":  f.deviceHandler.device.Id,
-						"gemport-id": gemPortID})
-			}
-			switch techprofileInst := techprofileInst.(type) {
-			case *tp.TechProfile:
-				ok, _ := f.isTechProfileUsedByAnotherGem(ctx, Intf, uint32(onuID), uint32(uniID), tpID, techprofileInst, uint32(gemPortID))
-				if !ok {
-					if err := f.resourceMgr.RemoveTechProfileIDForOnu(ctx, Intf, uint32(onuID), uint32(uniID), tpID); err != nil {
-						logger.Warn(ctx, err)
-					}
-					if err := f.DeleteTechProfileInstance(ctx, Intf, uint32(onuID), uint32(uniID), "", tpID); err != nil {
-						logger.Warn(ctx, err)
-					}
-					if err := f.RemoveSchedulerQueues(ctx, schedQueue{direction: tp_pb.Direction_UPSTREAM, intfID: Intf, onuID: uint32(onuID), uniID: uint32(uniID), tpID: tpID, uniPort: portNum, tpInst: techprofileInst}); err != nil {
-						logger.Warn(ctx, err)
-					}
-					if err := f.RemoveSchedulerQueues(ctx, schedQueue{direction: tp_pb.Direction_DOWNSTREAM, intfID: Intf, onuID: uint32(onuID), uniID: uint32(uniID), tpID: tpID, uniPort: portNum, tpInst: techprofileInst}); err != nil {
-						logger.Warn(ctx, err)
-					}
-					f.resourceMgr.FreeAllocID(ctx, Intf, uint32(onuID), uint32(uniID), techprofileInst.UsScheduler.AllocID)
-					// Delete the TCONT on the ONU.
-					if err := f.sendDeleteTcontToChild(ctx, Intf, uint32(onuID), uint32(uniID), uint32(techprofileInst.UsScheduler.AllocID), tpPath); err != nil {
-						logger.Errorw(ctx, "error-processing-delete-tcont-towards-onu",
-							log.Fields{
-								"intf":      Intf,
-								"onu-id":    onuID,
-								"uni-id":    uniID,
-								"device-id": f.deviceHandler.device.Id,
-								"alloc-id":  techprofileInst.UsScheduler.AllocID})
-					}
-				}
-			case *tp.EponProfile:
-				if err := f.resourceMgr.RemoveTechProfileIDForOnu(ctx, Intf, uint32(onuID), uint32(uniID), tpID); err != nil {
-					logger.Warn(ctx, err)
-				}
-				if err := f.DeleteTechProfileInstance(ctx, Intf, uint32(onuID), uint32(uniID), "", tpID); err != nil {
-					logger.Warn(ctx, err)
-				}
-				f.resourceMgr.FreeAllocID(ctx, Intf, uint32(onuID), uint32(uniID), techprofileInst.AllocID)
-				// Delete the TCONT on the ONU.
-				if err := f.sendDeleteTcontToChild(ctx, Intf, uint32(onuID), uint32(uniID), uint32(techprofileInst.AllocID), tpPath); err != nil {
-					logger.Errorw(ctx, "error-processing-delete-tcont-towards-onu",
-						log.Fields{
-							"intf":      Intf,
-							"onu-id":    onuID,
-							"uni-id":    uniID,
-							"device-id": f.deviceHandler.device.Id,
-							"alloc-id":  techprofileInst.AllocID})
-				}
-			default:
-				logger.Errorw(ctx, "error-unknown-tech",
-					log.Fields{
-						"techprofileInst": techprofileInst})
-			}
+					"device-id": f.deviceHandler.device.Id,
+					"alloc-id":  techprofileInst.AllocID})
 		}
+	default:
+		logger.Errorw(ctx, "error-unknown-tech",
+			log.Fields{
+				"techprofileInst": techprofileInst})
 	}
+
 	return nil
 }
 
 // nolint: gocyclo
-func (f *OpenOltFlowMgr) clearFlowFromResourceManager(ctx context.Context, flow *ofp.OfpFlowStats, flowDirection string) {
-
+func (f *OpenOltFlowMgr) clearFlowFromResourceManager(ctx context.Context, flow *ofp.OfpFlowStats, flowDirection string) error {
+	var flowInfo *rsrcMgr.FlowInfo
 	logger.Infow(ctx, "clear-flow-from-resource-manager",
 		log.Fields{
 			"flowDirection": flowDirection,
@@ -2173,8 +1949,7 @@
 			"device-id":     f.deviceHandler.device.Id})
 
 	if flowDirection == Multicast {
-		f.clearMulticastFlowFromResourceManager(ctx, flow)
-		return
+		return f.clearMulticastFlowFromResourceManager(ctx, flow)
 	}
 
 	classifierInfo := make(map[string]interface{})
@@ -2182,7 +1957,7 @@
 	portNum, Intf, onu, uni, inPort, ethType, err := FlowExtractInfo(ctx, flow, flowDirection)
 	if err != nil {
 		logger.Error(ctx, err)
-		return
+		return err
 	}
 
 	onuID := int32(onu)
@@ -2211,61 +1986,79 @@
 				log.Fields{
 					"port-number": inPort,
 					"error":       err})
-			return
+			return err
 		}
 	}
-	flowIds := f.resourceMgr.GetCurrentFlowIDsForOnu(ctx, Intf, onuID, uniID)
-	for _, flowID := range flowIds {
-		flowInfo := f.resourceMgr.GetFlowIDInfo(ctx, Intf, onuID, uniID, flowID)
-		if flowInfo == nil {
-			logger.Debugw(ctx, "no-flowinfo-found-in-kv-store",
-				log.Fields{
-					"intf":    Intf,
-					"onu-id":  onuID,
-					"uni-id":  uniID,
-					"flow-id": flowID})
-			return
+	if flowInfo = f.resourceMgr.GetFlowIDInfo(ctx, Intf, onuID, uniID, flow.Id); flowInfo == nil {
+		logger.Errorw(ctx, "flow-info-not-found-for-flow-to-be-removed", log.Fields{"flow-id": flow.Id, "intf-id": Intf, "onu-id": onuID, "uni-id": uniID})
+		return olterrors.NewErrPersistence("remove", "flow", flow.Id, log.Fields{"flow": flow}, err)
+	}
+	removeFlowMessage := openoltpb2.Flow{FlowId: flowInfo.Flow.FlowId, FlowType: flowInfo.Flow.FlowType}
+	logger.Debugw(ctx, "flow-to-be-deleted", log.Fields{"flow": flowInfo.Flow})
+	if err = f.removeFlowFromDevice(ctx, &removeFlowMessage, flow.Id); err != nil {
+		return err
+	}
+	if err = f.resourceMgr.RemoveFlowIDInfo(ctx, Intf, onuID, uniID, flow.Id); err != nil {
+		logger.Errorw(ctx, "failed-to-remove-flow-on-kv-store", log.Fields{"error": err})
+		return err
+	}
+	if !flowInfo.Flow.ReplicateFlow {
+		if err = f.clearResources(ctx, flow, Intf, onuID, uniID, flowInfo.Flow.GemportId, flowInfo.Flow.FlowId, portNum); err != nil {
+			logger.Error(ctx, "failed-to-clear-resources-for-flow", log.Fields{
+				"flow-id":        flow.Id,
+				"stored-flow":    flowInfo.Flow,
+				"device-id":      f.deviceHandler.device.Id,
+				"stored-flow-id": flowInfo.Flow.FlowId,
+				"onu-id":         onuID,
+				"intf":           Intf,
+			})
+			return err
 		}
-
-		updatedFlows := *flowInfo
-		for i, storedFlow := range updatedFlows {
-			if flow.Id == storedFlow.LogicalFlowID {
-				removeFlowMessage := openoltpb2.Flow{FlowId: storedFlow.Flow.FlowId, FlowType: storedFlow.Flow.FlowType}
-				logger.Debugw(ctx, "flow-to-be-deleted", log.Fields{"flow": storedFlow})
-				// DKB
-				if err = f.removeFlowFromDevice(ctx, &removeFlowMessage, flow.Id); err != nil {
-					logger.Errorw(ctx, "failed-to-remove-flow", log.Fields{"error": err})
-					return
-				}
-				logger.Info(ctx, "flow-removed-from-device-successfully", log.Fields{
+	} else {
+		gems := make([]uint32, 0)
+		for _, gem := range flowInfo.Flow.PbitToGemport {
+			gems = appendUnique32bit(gems, gem)
+		}
+		logger.Debugw(ctx, "gems-to-be-cleared", log.Fields{"gems": gems})
+		for _, gem := range gems {
+			if err = f.clearResources(ctx, flow, Intf, onuID, uniID, int32(gem), flowInfo.Flow.FlowId, portNum); err != nil {
+				logger.Error(ctx, "failed-to-clear-resources-for-flow", log.Fields{
 					"flow-id":        flow.Id,
-					"stored-flow":    storedFlow,
+					"stored-flow":    flowInfo.Flow,
 					"device-id":      f.deviceHandler.device.Id,
-					"stored-flow-id": flowID,
+					"stored-flow-id": flowInfo.Flow.FlowId,
 					"onu-id":         onuID,
 					"intf":           Intf,
+					"gem":            gem,
 				})
-				//Remove the Flow from FlowInfo
-				updatedFlows = append(updatedFlows[:i], updatedFlows[i+1:]...)
-				if err = f.clearResources(ctx, flow, Intf, onuID, uniID, storedFlow.Flow.GemportId,
-					flowID, flowDirection, portNum, updatedFlows); err != nil {
-					logger.Error(ctx, "failed-to-clear-resources-for-flow", log.Fields{
-						"flow-id":        flow.Id,
-						"stored-flow":    storedFlow,
-						"device-id":      f.deviceHandler.device.Id,
-						"stored-flow-id": flowID,
-						"onu-id":         onuID,
-						"intf":           Intf,
-					})
-					return
-				}
+				return err
 			}
 		}
 	}
+
+	// If datapath flow, clear the symmetric flow data from the subscriberDataPathFlowIDMap map
+	if isDatapathFlow(flow) {
+		if tpID, err := getTpIDFromFlow(ctx, flow); err != nil {
+			var inverseDirection string
+			if flowDirection == Upstream {
+				inverseDirection = Downstream
+			} else {
+				inverseDirection = Upstream
+			}
+
+			keySymm := subscriberDataPathFlowIDKey{intfID: Intf, onuID: uint32(onuID), uniID: uint32(uniID), direction: inverseDirection, tpID: tpID}
+			delete(f.subscriberDataPathFlowIDMap, keySymm)
+		}
+	}
+	return nil
 }
 
 //RemoveFlow removes the flow from the device
 func (f *OpenOltFlowMgr) RemoveFlow(ctx context.Context, flow *ofp.OfpFlowStats) error {
+
+	f.incrementActiveFlowRemoveCount(ctx, flow)
+	defer f.decrementActiveFlowRemoveCount(ctx, flow)
+
 	logger.Infow(ctx, "removing-flow", log.Fields{"flow": *flow})
 	var direction string
 	actionInfo := make(map[string]interface{})
@@ -2282,13 +2075,9 @@
 		}
 	}
 
-	f.incrementActiveFlowRemoveCount(ctx, flow)
-	defer f.decrementActiveFlowRemoveCount(ctx, flow)
-
 	if flows.HasGroup(flow) {
 		direction = Multicast
-		f.clearFlowFromResourceManager(ctx, flow, direction)
-		return nil
+		return f.clearFlowFromResourceManager(ctx, flow, direction)
 	} else if IsUpstream(actionInfo[Output].(uint32)) {
 		direction = Upstream
 	} else {
@@ -2304,7 +2093,7 @@
 
 	// Serialize flow removes on a per subscriber basis
 	if f.perUserFlowHandleLock.TryLock(userKey) {
-		f.clearFlowFromResourceManager(ctx, flow, direction) //TODO: Take care of the limitations
+		err = f.clearFlowFromResourceManager(ctx, flow, direction) //TODO: Take care of the limitations
 		f.perUserFlowHandleLock.Unlock(userKey)
 	} else {
 		// Ideally this should never happen
@@ -2312,7 +2101,7 @@
 		return errors.New("failed-to-acquire-per-user-lock")
 	}
 
-	return nil
+	return err
 }
 
 //isIgmpTrapDownstreamFlow return true if the flow is a downsteam IGMP trap-to-host flow; false otherwise
@@ -2421,7 +2210,7 @@
 		logger.Debugw(ctx, "downstream-flow-meter-id", log.Fields{"ds-meter-id": DsMeterID})
 
 	}
-	return f.processAddFlow(ctx, intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, uint32(TpID), UsMeterID, DsMeterID, flowMetadata)
+	return f.processAddFlow(ctx, intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, TpID, UsMeterID, DsMeterID, flowMetadata)
 }
 
 //WaitForFlowRemoveToFinishForSubscriber blocks until flow removes are complete for a given subscriber
@@ -2457,54 +2246,23 @@
 	if err != nil {
 		return olterrors.NewErrNotFound("multicast-in-port", log.Fields{"classifier": classifierInfo}, err)
 	}
-	//this variable acts like a switch. When it is set, multicast flows are classified by eth_dst.
-	//otherwise, classification is based on ipv4_dst by default.
-	//the variable can be configurable in the future; it can be read from a configuration path in the kv store.
-	mcastFlowClassificationByEthDst := false
 
-	if mcastFlowClassificationByEthDst {
-		//replace ipDst with ethDst
-		if ipv4Dst, ok := classifierInfo[Ipv4Dst]; ok &&
-			flows.IsMulticastIp(ipv4Dst.(uint32)) {
-			// replace ipv4_dst classifier with eth_dst
-			multicastMac := flows.ConvertToMulticastMacBytes(ipv4Dst.(uint32))
-			delete(classifierInfo, Ipv4Dst)
-			classifierInfo[EthDst] = multicastMac
-			logger.Debugw(ctx, "multicast-ip-to-mac-conversion-success",
-				log.Fields{
-					"ip:":  ipv4Dst.(uint32),
-					"mac:": multicastMac})
-		}
-	}
 	delete(classifierInfo, EthType)
 
 	onuID := NoneOnuID
 	uniID := NoneUniID
-	gemPortID := NoneGemPortID
 
-	flowStoreCookie := getFlowStoreCookie(ctx, classifierInfo, uint32(0))
-	if present := f.resourceMgr.IsFlowCookieOnKVStore(ctx, uint32(networkInterfaceID), int32(onuID), int32(uniID), flowStoreCookie); present {
+	if present := f.resourceMgr.IsFlowOnKvStore(ctx, networkInterfaceID, int32(onuID), int32(uniID), flow.Id); present {
 		logger.Infow(ctx, "multicast-flow-exists-not-re-adding", log.Fields{"classifier-info": classifierInfo})
 		return nil
 	}
-	flowID, err := f.resourceMgr.GetFlowID(ctx, uint32(networkInterfaceID), int32(onuID), int32(uniID), uint32(gemPortID), flowStoreCookie, "", 0, 0)
-	if err != nil {
-		return olterrors.NewErrNotFound("multicast-flow-id",
-			log.Fields{
-				"interface-id": networkInterfaceID,
-				"onu-id":       onuID,
-				"uni-id":       uniID,
-				"gem-port-id":  gemPortID,
-				"cookie":       flowStoreCookie},
-			err)
-	}
 	classifierProto, err := makeOpenOltClassifierField(classifierInfo)
 	if err != nil {
 		return olterrors.NewErrInvalidValue(log.Fields{"classifier": classifierInfo}, err)
 	}
 	groupID := actionInfo[GroupID].(uint32)
 	multicastFlow := openoltpb2.Flow{
-		FlowId:        flowID,
+		FlowId:        flow.Id,
 		FlowType:      Multicast,
 		NetworkIntfId: int32(networkInterfaceID),
 		GroupId:       groupID,
@@ -2513,7 +2271,7 @@
 		Cookie:        flow.Cookie}
 
 	if err := f.addFlowToDevice(ctx, flow, &multicastFlow); err != nil {
-		return olterrors.NewErrFlowOp("add", flowID, log.Fields{"flow": multicastFlow}, err)
+		return olterrors.NewErrFlowOp("add", flow.Id, log.Fields{"flow": multicastFlow}, err)
 	}
 	logger.Info(ctx, "multicast-flow-added-to-device-successfully")
 	//get cached group
@@ -2528,12 +2286,9 @@
 		}
 	}
 
-	flowsToKVStore := f.getUpdatedFlowInfo(ctx, &multicastFlow, flowStoreCookie, MulticastFlow, flowID, flow.Id)
-	if err = f.updateFlowInfoToKVStore(ctx, int32(networkInterfaceID),
-		int32(onuID),
-		int32(uniID),
-		flowID, flowsToKVStore); err != nil {
-		return olterrors.NewErrPersistence("update", "flow", flowID, log.Fields{"flow": multicastFlow}, err)
+	flowInfo := rsrcMgr.FlowInfo{Flow: &multicastFlow}
+	if err = f.resourceMgr.UpdateFlowIDInfo(ctx, networkInterfaceID, int32(onuID), int32(uniID), flow.Id, flowInfo); err != nil {
+		return olterrors.NewErrPersistence("update", "flow", flow.Id, log.Fields{"flow": multicastFlow}, err)
 	}
 	return nil
 }
@@ -2596,7 +2351,7 @@
 
 	f.onuGemInfoLock.Lock()
 	defer f.onuGemInfoLock.Unlock()
-	onugem := f.onuGemInfo[intfID]
+	onugem := f.onuGemInfo
 	// If the ONU already exists in onuGemInfo list, nothing to do
 	for _, onu := range onugem {
 		if onu.OnuID == onuID && onu.SerialNumber == serialNum {
@@ -2608,7 +2363,7 @@
 	}
 
 	onu := rsrcMgr.OnuGemInfo{OnuID: onuID, SerialNumber: serialNum, IntfID: intfID}
-	f.onuGemInfo[intfID] = append(f.onuGemInfo[intfID], onu)
+	f.onuGemInfo = append(f.onuGemInfo, onu)
 	if err := f.resourceMgr.AddOnuGemInfo(ctx, intfID, onu); err != nil {
 		return err
 	}
@@ -2634,8 +2389,8 @@
 			"intf-id":     intfID,
 			"onu-id":      onuID,
 			"device-id":   f.deviceHandler.device.Id,
-			"onu-gem":     f.onuGemInfo[intfID]})
-	onugem := f.onuGemInfo[intfID]
+			"onu-gem":     f.onuGemInfo})
+	onugem := f.onuGemInfo
 	// update the gem to the local cache as well as to kv strore
 	for idx, onu := range onugem {
 		if onu.OnuID == onuID {
@@ -2650,7 +2405,7 @@
 				}
 			}
 			onugem[idx].GemPorts = append(onugem[idx].GemPorts, gemPort)
-			f.onuGemInfo[intfID] = onugem
+			f.onuGemInfo = onugem
 			break
 		}
 	}
@@ -2670,7 +2425,7 @@
 			"intf-id":     intfID,
 			"onu-id":      onuID,
 			"device-id":   f.deviceHandler.device.Id,
-			"onu-gem":     f.onuGemInfo[intfID]})
+			"onu-gem":     f.onuGemInfo})
 }
 
 // This function Lookup maps  by serialNumber or (intfId, gemPort)
@@ -2681,14 +2436,14 @@
 	f.onuGemInfoLock.RLock()
 	defer f.onuGemInfoLock.RUnlock()
 
-	logger.Infow(ctx, "getting-onu-id-from-gem-port-and-pon-port",
+	logger.Debugw(ctx, "getting-onu-id-from-gem-port-and-pon-port",
 		log.Fields{
 			"device-id":   f.deviceHandler.device.Id,
-			"onu-geminfo": f.onuGemInfo[intfID],
+			"onu-geminfo": f.onuGemInfo,
 			"intf-id":     intfID,
 			"gemport-id":  gemPortID})
 	// get onuid from the onugem info cache
-	onugem := f.onuGemInfo[intfID]
+	onugem := f.onuGemInfo
 
 	for _, onu := range onugem {
 		for _, gem := range onu.GemPorts {
@@ -2749,11 +2504,11 @@
 		return 0, err
 	}
 
-	f.onuGemInfoLock.RLock()
-	defer f.onuGemInfoLock.RUnlock()
 	pktInkey := rsrcMgr.PacketInInfoKey{IntfID: intfID, OnuID: onuID, LogicalPort: portNum, VlanID: ctag, Priority: priority}
 	var ok bool
+	f.packetInGemPortLock.RLock()
 	gemPortID, ok = f.packetInGemPort[pktInkey]
+	f.packetInGemPortLock.RUnlock()
 	if ok {
 		logger.Debugw(ctx, "found-gemport-for-pktin-key",
 			log.Fields{
@@ -2766,7 +2521,9 @@
 	gemPortID, err = f.resourceMgr.GetGemPortFromOnuPktIn(ctx, pktInkey)
 	if err == nil {
 		if gemPortID != 0 {
+			f.packetInGemPortLock.Lock()
 			f.packetInGemPort[pktInkey] = gemPortID
+			f.packetInGemPortLock.Unlock()
 			logger.Infow(ctx, "found-gem-port-from-kv-store-and-updating-cache-with-gemport",
 				log.Fields{
 					"pktinkey": pktInkey,
@@ -2781,159 +2538,6 @@
 
 }
 
-// nolint: gocyclo
-func installFlowOnAllGemports(ctx context.Context,
-	f1 func(ctx context.Context, intfId uint32, onuId uint32, uniId uint32,
-		portNo uint32, classifier map[string]interface{}, action map[string]interface{},
-		logicalFlow *ofp.OfpFlowStats, allocId uint32, gemPortId uint32, tpID uint32) error,
-	f2 func(ctx context.Context, intfId uint32, onuId uint32, uniId uint32, portNo uint32,
-		classifier map[string]interface{}, action map[string]interface{},
-		logicalFlow *ofp.OfpFlowStats, allocId uint32, gemPortId uint32, vlanId uint32,
-		tpID uint32) error,
-	args map[string]uint32,
-	classifier map[string]interface{}, action map[string]interface{},
-	logicalFlow *ofp.OfpFlowStats,
-	gemPorts []uint32,
-	TpInst interface{},
-	FlowType string,
-	direction string,
-	tpID uint32,
-	vlanID ...uint32) {
-	logger.Debugw(ctx, "installing-flow-on-all-gem-ports",
-		log.Fields{
-			"FlowType": FlowType,
-			"gemPorts": gemPorts,
-			"vlan":     vlanID})
-
-	// The bit mapping for a gemport is expressed in tech-profile as a binary string. For example, 0b00000001
-	// We need to trim prefix "0b", before further processing
-	// Once the "0b" prefix is trimmed, we iterate each character in the string to identify which index
-	// in the string is set to binary bit 1 (expressed as char '1' in the binary string).
-
-	// If a particular character in the string is set to '1', identify the index of this character from
-	// the LSB position which marks the PCP bit consumed by the given gem port.
-	// This PCP bit now becomes a classifier in the flow.
-
-	switch TpInst := TpInst.(type) {
-	case *tp.TechProfile:
-		attributes := TpInst.DownstreamGemPortAttributeList
-		if direction == Upstream {
-			attributes = TpInst.UpstreamGemPortAttributeList
-		}
-
-		for _, gemPortAttribute := range attributes {
-			if direction == Downstream && strings.ToUpper(gemPortAttribute.IsMulticast) == "TRUE" {
-				continue
-			}
-			gemPortID := gemPortAttribute.GemportID
-			if allPbitsMarked(gemPortAttribute.PbitMap) {
-				classifier[VlanPcp] = uint32(VlanPCPMask)
-				if FlowType == DhcpFlow || FlowType == IgmpFlow || FlowType == HsiaFlow {
-					if err := f1(ctx, args["intfId"], args["onuId"], args["uniId"], args["portNo"], classifier, action, logicalFlow, args["allocId"], gemPortID, tpID); err != nil {
-						logger.Warn(ctx, err)
-					}
-				} else if FlowType == EapolFlow {
-					if err := f2(ctx, args["intfId"], args["onuId"], args["uniId"], args["portNo"], classifier, action, logicalFlow, args["allocId"], gemPortID, vlanID[0], tpID); err != nil {
-						logger.Warn(ctx, err)
-					}
-				}
-			} else {
-				for pos, pbitSet := range strings.TrimPrefix(gemPortAttribute.PbitMap, BinaryStringPrefix) {
-					if pbitSet == BinaryBit1 {
-						classifier[VlanPcp] = uint32(len(strings.TrimPrefix(gemPortAttribute.PbitMap, BinaryStringPrefix))) - 1 - uint32(pos)
-						if FlowType == DhcpFlow || FlowType == IgmpFlow || FlowType == HsiaFlow {
-							if err := f1(ctx, args["intfId"], args["onuId"], args["uniId"], args["portNo"], classifier, action, logicalFlow, args["allocId"], gemPortID, tpID); err != nil {
-								logger.Warn(ctx, err)
-							}
-						} else if FlowType == EapolFlow {
-							if err := f2(ctx, args["intfId"], args["onuId"], args["uniId"], args["portNo"], classifier, action, logicalFlow, args["allocId"], gemPortID, vlanID[0], tpID); err != nil {
-								logger.Warn(ctx, err)
-							}
-						}
-					}
-				}
-			}
-		}
-	case *tp.EponProfile:
-		if direction == Upstream {
-			attributes := TpInst.UpstreamQueueAttributeList
-			for _, queueAttribute := range attributes {
-				gemPortID := queueAttribute.GemportID
-				if allPbitsMarked(queueAttribute.PbitMap) {
-					classifier[VlanPcp] = uint32(VlanPCPMask)
-					if FlowType == DhcpFlow || FlowType == IgmpFlow || FlowType == HsiaFlow {
-						if err := f1(ctx, args["intfId"], args["onuId"], args["uniId"], args["portNo"], classifier, action, logicalFlow, args["allocId"], gemPortID, tpID); err != nil {
-							logger.Warn(ctx, err)
-						}
-					} else if FlowType == EapolFlow {
-						if err := f2(ctx, args["intfId"], args["onuId"], args["uniId"], args["portNo"], classifier, action, logicalFlow, args["allocId"], gemPortID, vlanID[0], tpID); err != nil {
-							logger.Warn(ctx, err)
-						}
-					}
-				} else {
-					for pos, pbitSet := range strings.TrimPrefix(queueAttribute.PbitMap, BinaryStringPrefix) {
-						if pbitSet == BinaryBit1 {
-							classifier[VlanPcp] = uint32(len(strings.TrimPrefix(queueAttribute.PbitMap, BinaryStringPrefix))) - 1 - uint32(pos)
-							if FlowType == DhcpFlow || FlowType == IgmpFlow || FlowType == HsiaFlow {
-								if err := f1(ctx, args["intfId"], args["onuId"], args["uniId"], args["portNo"], classifier, action, logicalFlow, args["allocId"], gemPortID, tpID); err != nil {
-									logger.Warn(ctx, err)
-								}
-							} else if FlowType == EapolFlow {
-								if err := f2(ctx, args["intfId"], args["onuId"], args["uniId"], args["portNo"], classifier, action, logicalFlow, args["allocId"], gemPortID, vlanID[0], tpID); err != nil {
-									logger.Warn(ctx, err)
-								}
-							}
-						}
-					}
-				}
-			}
-		} else {
-			attributes := TpInst.DownstreamQueueAttributeList
-			for _, queueAttribute := range attributes {
-				gemPortID := queueAttribute.GemportID
-				if allPbitsMarked(queueAttribute.PbitMap) {
-					classifier[VlanPcp] = uint32(VlanPCPMask)
-					if FlowType == DhcpFlow || FlowType == IgmpFlow || FlowType == HsiaFlow {
-						if err := f1(ctx, args["intfId"], args["onuId"], args["uniId"], args["portNo"], classifier, action, logicalFlow, args["allocId"], gemPortID, tpID); err != nil {
-							logger.Warn(ctx, err)
-						}
-					} else if FlowType == EapolFlow {
-						if err := f2(ctx, args["intfId"], args["onuId"], args["uniId"], args["portNo"], classifier, action, logicalFlow, args["allocId"], gemPortID, vlanID[0], tpID); err != nil {
-							logger.Warn(ctx, err)
-						}
-					}
-				} else {
-					for pos, pbitSet := range strings.TrimPrefix(queueAttribute.PbitMap, BinaryStringPrefix) {
-						if pbitSet == BinaryBit1 {
-							classifier[VlanPcp] = uint32(len(strings.TrimPrefix(queueAttribute.PbitMap, BinaryStringPrefix))) - 1 - uint32(pos)
-							if FlowType == DhcpFlow || FlowType == IgmpFlow || FlowType == HsiaFlow {
-								if err := f1(ctx, args["intfId"], args["onuId"], args["uniId"], args["portNo"], classifier, action, logicalFlow, args["allocId"], gemPortID, tpID); err != nil {
-									logger.Warn(ctx, err)
-								}
-							} else if FlowType == EapolFlow {
-								if err := f2(ctx, args["intfId"], args["onuId"], args["uniId"], args["portNo"], classifier, action, logicalFlow, args["allocId"], gemPortID, vlanID[0], tpID); err != nil {
-									logger.Warn(ctx, err)
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-	default:
-		logger.Errorw(ctx, "unknown-tech", log.Fields{"tpInst": TpInst})
-	}
-}
-
-func allPbitsMarked(pbitMap string) bool {
-	for pos, pBit := range pbitMap {
-		if pos >= 2 && pBit != BinaryBit1 {
-			return false
-		}
-	}
-	return true
-}
-
 func (f *OpenOltFlowMgr) addDHCPTrapFlowOnNNI(ctx context.Context, logicalFlow *ofp.OfpFlowStats, classifier map[string]interface{}, portNo uint32) error {
 	logger.Debug(ctx, "adding-trap-dhcp-of-nni-flow")
 	action := make(map[string]interface{})
@@ -2963,22 +2567,11 @@
 			err)
 	}
 
-	flowStoreCookie := getFlowStoreCookie(ctx, classifier, uint32(0))
-	if present := f.resourceMgr.IsFlowCookieOnKVStore(ctx, uint32(networkInterfaceID), int32(onuID), int32(uniID), flowStoreCookie); present {
+	if present := f.resourceMgr.IsFlowOnKvStore(ctx, networkInterfaceID, int32(onuID), int32(uniID), logicalFlow.Id); present {
 		logger.Info(ctx, "flow-exists-not-re-adding")
 		return nil
 	}
-	flowID, err := f.resourceMgr.GetFlowID(ctx, uint32(networkInterfaceID), int32(onuID), int32(uniID), uint32(gemPortID), flowStoreCookie, "", 0, 0)
-	if err != nil {
-		return olterrors.NewErrNotFound("dhcp-trap-nni-flow-id",
-			log.Fields{
-				"interface-id": networkInterfaceID,
-				"onu-id":       onuID,
-				"uni-id":       uniID,
-				"gem-port-id":  gemPortID,
-				"cookie":       flowStoreCookie},
-			err)
-	}
+
 	classifierProto, err := makeOpenOltClassifierField(classifier)
 	if err != nil {
 		return olterrors.NewErrInvalidValue(log.Fields{"classifier": classifier}, err)
@@ -2992,7 +2585,7 @@
 	downstreamflow := openoltpb2.Flow{AccessIntfId: int32(-1), // AccessIntfId not required
 		OnuId:         int32(onuID), // OnuId not required
 		UniId:         int32(uniID), // UniId not used
-		FlowId:        flowID,
+		FlowId:        logicalFlow.Id,
 		FlowType:      Downstream,
 		AllocId:       int32(allocID), // AllocId not used
 		NetworkIntfId: int32(networkInterfaceID),
@@ -3003,15 +2596,12 @@
 		Cookie:        logicalFlow.Cookie,
 		PortNo:        portNo}
 	if err := f.addFlowToDevice(ctx, logicalFlow, &downstreamflow); err != nil {
-		return olterrors.NewErrFlowOp("add", flowID, log.Fields{"flow": downstreamflow}, err)
+		return olterrors.NewErrFlowOp("add", logicalFlow.Id, log.Fields{"flow": downstreamflow}, err)
 	}
 	logger.Info(ctx, "dhcp-trap-on-nni-flow-added–to-device-successfully")
-	flowsToKVStore := f.getUpdatedFlowInfo(ctx, &downstreamflow, flowStoreCookie, "", flowID, logicalFlow.Id)
-	if err := f.updateFlowInfoToKVStore(ctx, int32(networkInterfaceID),
-		int32(onuID),
-		int32(uniID),
-		flowID, flowsToKVStore); err != nil {
-		return olterrors.NewErrPersistence("update", "flow", flowID, log.Fields{"flow": downstreamflow}, err)
+	flowInfo := rsrcMgr.FlowInfo{Flow: &downstreamflow}
+	if err := f.resourceMgr.UpdateFlowIDInfo(ctx, networkInterfaceID, int32(onuID), int32(uniID), logicalFlow.Id, flowInfo); err != nil {
+		return olterrors.NewErrPersistence("update", "flow", logicalFlow.Id, log.Fields{"flow": downstreamflow}, err)
 	}
 	return nil
 }
@@ -3070,22 +2660,11 @@
 			"action":     action},
 			err)
 	}
-	flowStoreCookie := getFlowStoreCookie(ctx, classifier, uint32(0))
-	if present := f.resourceMgr.IsFlowCookieOnKVStore(ctx, uint32(networkInterfaceID), int32(onuID), int32(uniID), flowStoreCookie); present {
+	if present := f.resourceMgr.IsFlowOnKvStore(ctx, networkInterfaceID, int32(onuID), int32(uniID), logicalFlow.Id); present {
 		logger.Info(ctx, "igmp-flow-exists-not-re-adding")
 		return nil
 	}
-	flowID, err := f.resourceMgr.GetFlowID(ctx, uint32(networkInterfaceID), int32(onuID), int32(uniID), uint32(gemPortID), flowStoreCookie, "", 0, 0)
-	if err != nil {
-		return olterrors.NewErrNotFound("igmp-flow-id",
-			log.Fields{
-				"interface-id": networkInterfaceID,
-				"onu-id":       onuID,
-				"uni-id":       uniID,
-				"gem-port-id":  gemPortID,
-				"cookie":       flowStoreCookie},
-			err)
-	}
+
 	classifierProto, err := makeOpenOltClassifierField(classifier)
 	if err != nil {
 		return olterrors.NewErrInvalidValue(log.Fields{"classifier": classifier}, err)
@@ -3099,7 +2678,7 @@
 	downstreamflow := openoltpb2.Flow{AccessIntfId: int32(-1), // AccessIntfId not required
 		OnuId:         int32(onuID), // OnuId not required
 		UniId:         int32(uniID), // UniId not used
-		FlowId:        flowID,
+		FlowId:        logicalFlow.Id,
 		FlowType:      Downstream,
 		AllocId:       int32(allocID), // AllocId not used
 		NetworkIntfId: int32(networkInterfaceID),
@@ -3110,15 +2689,12 @@
 		Cookie:        logicalFlow.Cookie,
 		PortNo:        portNo}
 	if err := f.addFlowToDevice(ctx, logicalFlow, &downstreamflow); err != nil {
-		return olterrors.NewErrFlowOp("add", flowID, log.Fields{"flow": downstreamflow}, err)
+		return olterrors.NewErrFlowOp("add", logicalFlow.Id, log.Fields{"flow": downstreamflow}, err)
 	}
 	logger.Info(ctx, "igmp-trap-on-nni-flow-added-to-device-successfully")
-	flowsToKVStore := f.getUpdatedFlowInfo(ctx, &downstreamflow, flowStoreCookie, "", flowID, logicalFlow.Id)
-	if err := f.updateFlowInfoToKVStore(ctx, int32(networkInterfaceID),
-		int32(onuID),
-		int32(uniID),
-		flowID, flowsToKVStore); err != nil {
-		return olterrors.NewErrPersistence("update", "flow", flowID, log.Fields{"flow": downstreamflow}, err)
+	flowInfo := rsrcMgr.FlowInfo{Flow: &downstreamflow}
+	if err := f.resourceMgr.UpdateFlowIDInfo(ctx, networkInterfaceID, int32(onuID), int32(uniID), logicalFlow.Id, flowInfo); err != nil {
+		return olterrors.NewErrPersistence("update", "flow", logicalFlow.Id, log.Fields{"flow": downstreamflow}, err)
 	}
 	return nil
 }
@@ -3145,6 +2721,37 @@
 	uniID := args[UniID]
 	portNo := args[PortNo]
 	allocID := args[AllocID]
+	pbitToGem := make(map[uint32]uint32)
+
+	if len(gemPorts) == 1 {
+		// If there is only single gemport use that and do not populate pbitToGem map
+		gemPort = gemPorts[0]
+	} else if pcp, ok := classifierInfo[VlanPcp]; !ok {
+		for idx, gemID := range gemPorts {
+			switch TpInst := TpInst.(type) {
+			case *tp.TechProfile:
+				pBitMap := TpInst.UpstreamGemPortAttributeList[idx].PbitMap
+				// Trim the bitMapPrefix form the binary string and then iterate each character in the binary string.
+				// If the character is set to pbit1, extract the pcp value from the position of this character in the string.
+				// Update the pbitToGem map with key being the pcp bit and the value being the gemPortID that consumes
+				// this pcp bit traffic.
+				for pos, pbitSet := range strings.TrimPrefix(pBitMap, bitMapPrefix) {
+					if pbitSet == pbit1 {
+						pcp := uint32(len(strings.TrimPrefix(pBitMap, bitMapPrefix))) - 1 - uint32(pos)
+						pbitToGem[pcp] = gemID
+					}
+				}
+			default:
+				logger.Errorw(ctx, "unsupported-tech", log.Fields{"tpInst": TpInst})
+				return
+			}
+		}
+	} else { // Extract the exact gemport which maps to the PCP classifier in the flow
+		gemPort = f.techprofile[intfID].GetGemportIDForPbit(ctx, TpInst,
+			tp_pb.Direction_UPSTREAM,
+			pcp.(uint32))
+	}
+
 	if ipProto, ok := classifierInfo[IPProto]; ok {
 		if ipProto.(uint32) == IPProtoDhcp {
 			logger.Infow(ctx, "adding-dhcp-flow", log.Fields{
@@ -3154,18 +2761,9 @@
 				"onu-id":   onuID,
 				"uni-id":   uniID,
 			})
-			if pcp, ok := classifierInfo[VlanPcp]; ok {
-				gemPort = f.techprofile[intfID].GetGemportIDForPbit(ctx, TpInst,
-					tp_pb.Direction_UPSTREAM,
-					pcp.(uint32))
-				//Adding DHCP upstream flow
-
-				if err := f.addDHCPTrapFlow(ctx, intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, allocID, gemPort, tpID); err != nil {
-					logger.Warn(ctx, err)
-				}
-			} else {
-				//Adding DHCP upstream flow to all gemports
-				installFlowOnAllGemports(ctx, f.addDHCPTrapFlow, nil, args, classifierInfo, actionInfo, flow, gemPorts, TpInst, DhcpFlow, Upstream, tpID)
+			//Adding DHCP upstream flow
+			if err := f.addDHCPTrapFlow(ctx, intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, allocID, gemPort, tpID, pbitToGem); err != nil {
+				logger.Warn(ctx, err)
 			}
 
 		} else if ipProto.(uint32) == IgmpProto {
@@ -3175,16 +2773,8 @@
 					"onu-id":           onuID,
 					"uni-id":           uniID,
 					"classifier-info:": classifierInfo})
-			if pcp, ok := classifierInfo[VlanPcp]; ok {
-				gemPort = f.techprofile[intfID].GetGemportIDForPbit(ctx, TpInst,
-					tp_pb.Direction_UPSTREAM,
-					pcp.(uint32))
-				if err := f.addIGMPTrapFlow(ctx, intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, allocID, gemPort, tpID); err != nil {
-					logger.Warn(ctx, err)
-				}
-			} else {
-				//Adding IGMP upstream flow to all gem ports
-				installFlowOnAllGemports(ctx, f.addIGMPTrapFlow, nil, args, classifierInfo, actionInfo, flow, gemPorts, TpInst, IgmpFlow, Upstream, tpID)
+			if err := f.addIGMPTrapFlow(ctx, intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, allocID, gemPort, tpID, pbitToGem); err != nil {
+				logger.Warn(ctx, err)
 			}
 		} else {
 			logger.Errorw(ctx, "invalid-classifier-to-handle", log.Fields{"classifier": classifierInfo, "action": actionInfo})
@@ -3203,16 +2793,8 @@
 			} else {
 				vlanID = DefaultMgmtVlan
 			}
-			if pcp, ok := classifierInfo[VlanPcp]; ok {
-				gemPort = f.techprofile[intfID].GetGemportIDForPbit(ctx, TpInst,
-					tp_pb.Direction_UPSTREAM,
-					pcp.(uint32))
-
-				if err := f.addEAPOLFlow(ctx, intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, allocID, gemPort, vlanID, tpID); err != nil {
-					logger.Warn(ctx, err)
-				}
-			} else {
-				installFlowOnAllGemports(ctx, nil, f.addEAPOLFlow, args, classifierInfo, actionInfo, flow, gemPorts, TpInst, EapolFlow, Upstream, tpID, vlanID)
+			if err := f.addEAPOLFlow(ctx, intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, allocID, gemPort, vlanID, tpID, pbitToGem); err != nil {
+				logger.Warn(ctx, err)
 			}
 		}
 	} else if _, ok := actionInfo[PushVlan]; ok {
@@ -3221,17 +2803,9 @@
 			"onu-id":  onuID,
 			"uni-id":  uniID,
 		})
-		if pcp, ok := classifierInfo[VlanPcp]; ok {
-			gemPort = f.techprofile[intfID].GetGemportIDForPbit(ctx, TpInst,
-				tp_pb.Direction_UPSTREAM,
-				pcp.(uint32))
-			//Adding HSIA upstream flow
-			if err := f.addUpstreamDataFlow(ctx, intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, allocID, gemPort, tpID); err != nil {
-				logger.Warn(ctx, err)
-			}
-		} else {
-			//Adding HSIA upstream flow to all gemports
-			installFlowOnAllGemports(ctx, f.addUpstreamDataFlow, nil, args, classifierInfo, actionInfo, flow, gemPorts, TpInst, HsiaFlow, Upstream, tpID)
+		//Adding HSIA upstream flow
+		if err := f.addUpstreamDataPathFlow(ctx, intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, allocID, gemPort, tpID, pbitToGem); err != nil {
+			logger.Warn(ctx, err)
 		}
 	} else if _, ok := actionInfo[PopVlan]; ok {
 		logger.Infow(ctx, "adding-downstream-data-rule", log.Fields{
@@ -3239,17 +2813,9 @@
 			"onu-id":  onuID,
 			"uni-id":  uniID,
 		})
-		if pcp, ok := classifierInfo[VlanPcp]; ok {
-			gemPort = f.techprofile[intfID].GetGemportIDForPbit(ctx, TpInst,
-				tp_pb.Direction_DOWNSTREAM,
-				pcp.(uint32))
-			//Adding HSIA downstream flow
-			if err := f.addDownstreamDataFlow(ctx, intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, allocID, gemPort, tpID); err != nil {
-				logger.Warn(ctx, err)
-			}
-		} else {
-			//Adding HSIA downstream flow to all gemports
-			installFlowOnAllGemports(ctx, f.addDownstreamDataFlow, nil, args, classifierInfo, actionInfo, flow, gemPorts, TpInst, HsiaFlow, Downstream, tpID)
+		//Adding HSIA downstream flow
+		if err := f.addDownstreamDataPathFlow(ctx, intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, allocID, gemPort, tpID, pbitToGem); err != nil {
+			logger.Warn(ctx, err)
 		}
 	} else {
 		logger.Errorw(ctx, "invalid-flow-type-to-handle",
@@ -3270,21 +2836,12 @@
 	}()
 }
 
-func (f *OpenOltFlowMgr) isGemPortUsedByAnotherFlow(ctx context.Context, gemPK gemPortKey) (bool, error) {
-	if f.perGemPortLock.TryLock(gemPK) {
-		flowIDList := f.flowsUsedByGemPort[gemPK]
-		f.perGemPortLock.Unlock(gemPK)
-		return len(flowIDList) > 1, nil
-	}
-	logger.Error(ctx, "failed-to-acquire-per-gem-port-lock",
-		log.Fields{
-			"device-id": f.deviceHandler.device.Id,
-			"key":       gemPK,
-		})
-	return false, olterrors.NewErrAdapter("failed-to-acquire-per-gem-port-lock", log.Fields{
-		"device-id": f.deviceHandler.device.Id,
-		"key":       gemPK,
-	}, nil)
+func (f *OpenOltFlowMgr) isGemPortUsedByAnotherFlow(gemPortID uint32) bool {
+	f.flowsUsedByGemPortKey.RLock()
+	flowIDList := f.flowsUsedByGemPort[gemPortID]
+	f.flowsUsedByGemPortKey.RUnlock()
+	return len(flowIDList) > 1
+
 }
 
 func (f *OpenOltFlowMgr) isTechProfileUsedByAnotherGem(ctx context.Context, ponIntf uint32, onuID uint32, uniID uint32, tpID uint32, tpInst *tp.TechProfile, gemPortID uint32) (bool, uint32) {
@@ -3299,10 +2856,10 @@
 	}
 	if tpInst.InstanceCtrl.Onu == "single-instance" {
 		// The TP information for the given TP ID, PON ID, ONU ID, UNI ID should be removed.
-		if err := f.resourceMgr.RemoveTechProfileIDForOnu(ctx, ponIntf, uint32(onuID), uint32(uniID), tpID); err != nil {
+		if err := f.resourceMgr.RemoveTechProfileIDForOnu(ctx, ponIntf, onuID, uniID, tpID); err != nil {
 			logger.Warn(ctx, err)
 		}
-		if err := f.DeleteTechProfileInstance(ctx, ponIntf, uint32(onuID), uint32(uniID), "", tpID); err != nil {
+		if err := f.DeleteTechProfileInstance(ctx, ponIntf, onuID, uniID, "", tpID); err != nil {
 			logger.Warn(ctx, err)
 		}
 
@@ -3516,7 +3073,16 @@
 	return uint32(TpID), nil
 }
 
-func appendUnique(slice []uint32, item uint32) []uint32 {
+func appendUnique64bit(slice []uint64, item uint64) []uint64 {
+	for _, sliceElement := range slice {
+		if sliceElement == item {
+			return slice
+		}
+	}
+	return append(slice, item)
+}
+
+func appendUnique32bit(slice []uint32, item uint32) []uint32 {
 	for _, sliceElement := range slice {
 		if sliceElement == item {
 			return slice
@@ -3565,10 +3131,10 @@
 	}
 	pktInkey := rsrcMgr.PacketInInfoKey{IntfID: intfID, OnuID: onuID, LogicalPort: logicalPort, VlanID: cTag, Priority: priority}
 
-	f.onuGemInfoLock.Lock()
-	defer f.onuGemInfoLock.Unlock()
-
+	f.packetInGemPortLock.RLock()
 	lookupGemPort, ok := f.packetInGemPort[pktInkey]
+	f.packetInGemPortLock.RUnlock()
+
 	if ok {
 		if lookupGemPort == gemPort {
 			logger.Infow(ctx, "pktin-key/value-found-in-cache--no-need-to-update-kv--assume-both-in-sync",
@@ -3578,7 +3144,9 @@
 			return
 		}
 	}
+	f.packetInGemPortLock.Lock()
 	f.packetInGemPort[pktInkey] = gemPort
+	f.packetInGemPortLock.Unlock()
 
 	f.resourceMgr.UpdateGemPortForPktIn(ctx, pktInkey, gemPort)
 	logger.Infow(ctx, "pktin-key-not-found-in-local-cache-value-is-different--updating-cache-and-kv-store",
@@ -3620,7 +3188,7 @@
 	f.onuGemInfoLock.Lock()
 	defer f.onuGemInfoLock.Unlock()
 
-	onugem := f.onuGemInfo[intfID]
+	onugem := f.onuGemInfo
 	for idx, onu := range onugem {
 		if onu.OnuID == onuID {
 			for _, uni := range onu.UniPorts {
@@ -3630,7 +3198,7 @@
 				}
 			}
 			onugem[idx].UniPorts = append(onugem[idx].UniPorts, portNum)
-			f.onuGemInfo[intfID] = onugem
+			f.onuGemInfo = onugem
 		}
 	}
 	f.resourceMgr.AddUniPortToOnuInfo(ctx, intfID, onuID, portNum)
@@ -3643,89 +3211,61 @@
 		logger.Error(ctx, "failed-to-get-flowid-list-per-gem", log.Fields{"intf": intf})
 		return
 	}
+	f.flowsUsedByGemPortKey.Lock()
 	for gem, FlowIDs := range flowIDsList {
-		gemPK := gemPortKey{intf, uint32(gem)}
-		if f.perGemPortLock.TryLock(gemPK) {
-			f.flowsUsedByGemPort[gemPK] = FlowIDs
-			f.perGemPortLock.Unlock(gemPK)
-		} else {
-			logger.Error(ctx, "failed-to-acquire-per-gem-port-lock",
-				log.Fields{
-					"intf-id":   intf,
-					"device-id": f.deviceHandler.device.Id,
-					"key":       gemPK,
-				})
-		}
+		f.flowsUsedByGemPort[gem] = FlowIDs
 	}
+	f.flowsUsedByGemPortKey.Unlock()
 }
 
 //clearMulticastFlowFromResourceManager  removes a multicast flow from the KV store and
 // clears resources reserved for this multicast flow
-func (f *OpenOltFlowMgr) clearMulticastFlowFromResourceManager(ctx context.Context, flow *ofp.OfpFlowStats) {
+func (f *OpenOltFlowMgr) clearMulticastFlowFromResourceManager(ctx context.Context, flow *ofp.OfpFlowStats) error {
 	classifierInfo := make(map[string]interface{})
+	var flowInfo *rsrcMgr.FlowInfo
 	formulateClassifierInfoFromFlow(ctx, classifierInfo, flow)
 	networkInterfaceID, err := f.getNNIInterfaceIDOfMulticastFlow(ctx, classifierInfo)
 
 	if err != nil {
 		logger.Warnw(ctx, "no-inport-found--cannot-release-resources-of-the-multicast-flow", log.Fields{"flowId:": flow.Id})
-		return
+		return err
 	}
 
 	var onuID = int32(NoneOnuID)
 	var uniID = int32(NoneUniID)
-	var flowID uint32
-
-	flowIds := f.resourceMgr.GetCurrentFlowIDsForOnu(ctx, networkInterfaceID, onuID, uniID)
-
-	for _, flowID = range flowIds {
-		flowInfo := f.resourceMgr.GetFlowIDInfo(ctx, networkInterfaceID, onuID, uniID, flowID)
-		if flowInfo == nil {
-			logger.Debugw(ctx, "no-multicast-flowinfo-found-in-the-kv-store",
-				log.Fields{
-					"intf":    networkInterfaceID,
-					"onu-id":  onuID,
-					"uni-id":  uniID,
-					"flow-id": flowID})
-			continue
-		}
-		updatedFlows := *flowInfo
-		for i, storedFlow := range updatedFlows {
-			if flow.Id == storedFlow.LogicalFlowID {
-				removeFlowMessage := openoltpb2.Flow{FlowId: storedFlow.Flow.FlowId, FlowType: storedFlow.Flow.FlowType}
-				logger.Debugw(ctx, "multicast-flow-to-be-deleted",
-					log.Fields{
-						"flow":      storedFlow,
-						"flow-id":   flow.Id,
-						"device-id": f.deviceHandler.device.Id})
-				//remove from device
-				if err := f.removeFlowFromDevice(ctx, &removeFlowMessage, flow.Id); err != nil {
-					// DKB
-					logger.Errorw(ctx, "failed-to-remove-multicast-flow",
-						log.Fields{
-							"flow-id": flow.Id,
-							"error":   err})
-					return
-				}
-				logger.Infow(ctx, "multicast-flow-removed-from-device-successfully", log.Fields{"flow-id": flow.Id})
-				//Remove the Flow from FlowInfo
-				updatedFlows = append(updatedFlows[:i], updatedFlows[i+1:]...)
-				if err := f.updateFlowInfoToKVStore(ctx, int32(networkInterfaceID), NoneOnuID, NoneUniID, flowID, &updatedFlows); err != nil {
-					logger.Errorw(ctx, "failed-to-delete-multicast-flow-from-the-kv-store",
-						log.Fields{"flow": storedFlow,
-							"err": err})
-					return
-				}
-				//release flow id
-				logger.Debugw(ctx, "releasing-multicast-flow-id",
-					log.Fields{"flow-id": flowID,
-						"interfaceID": networkInterfaceID})
-				f.resourceMgr.FreeFlowID(ctx, uint32(networkInterfaceID), NoneOnuID, NoneUniID, flowID)
-			}
-		}
+	var flowID uint64
+	if flowInfo = f.resourceMgr.GetFlowIDInfo(ctx, networkInterfaceID, onuID, uniID, flow.Id); flowInfo == nil {
+		return olterrors.NewErrPersistence("remove", "flow", flow.Id,
+			log.Fields{
+				"flow":      flow,
+				"device-id": f.deviceHandler.device.Id,
+				"intf-id":   networkInterfaceID,
+				"onu-id":    onuID}, err).Log()
 	}
+	removeFlowMessage := openoltpb2.Flow{FlowId: flow.Id, FlowType: flowInfo.Flow.FlowType}
+	logger.Debugw(ctx, "multicast-flow-to-be-deleted",
+		log.Fields{
+			"flow":      flowInfo.Flow,
+			"flow-id":   flow.Id,
+			"device-id": f.deviceHandler.device.Id})
+	// Remove from device
+	if err := f.removeFlowFromDevice(ctx, &removeFlowMessage, flow.Id); err != nil {
+		// DKB
+		logger.Errorw(ctx, "failed-to-remove-multicast-flow",
+			log.Fields{
+				"flow-id": flow.Id,
+				"error":   err})
+		return err
+	}
+	// Remove flow from KV store
+	return f.resourceMgr.RemoveFlowIDInfo(ctx, networkInterfaceID, onuID, uniID, flowID)
 }
 
 func (f *OpenOltFlowMgr) incrementActiveFlowRemoveCount(ctx context.Context, flow *ofp.OfpFlowStats) {
+
+	f.pendingFlowRemoveDataPerSubscriberLock.Lock()
+	defer f.pendingFlowRemoveDataPerSubscriberLock.Unlock()
+
 	inPort, outPort := getPorts(flow)
 	logger.Debugw(ctx, "increment-flow-remove-count-for-inPort-out-port", log.Fields{"inPort": inPort, "out-port": outPort})
 	if inPort != InvalidPort && outPort != InvalidPort {
@@ -3733,8 +3273,6 @@
 		key := pendingFlowRemoveDataKey{intfID: intfID, onuID: onuID, uniID: uniID}
 		logger.Debugw(ctx, "increment-flow-remove-count-for-subscriber", log.Fields{"intf-id": intfID, "onu-id": onuID, "uni-id": uniID})
 
-		f.pendingFlowRemoveDataPerSubscriberLock.Lock()
-		defer f.pendingFlowRemoveDataPerSubscriberLock.Unlock()
 		flowRemoveData, ok := f.pendingFlowRemoveDataPerSubscriber[key]
 		if !ok {
 			flowRemoveData = pendingFlowRemoveData{
@@ -3752,15 +3290,16 @@
 }
 
 func (f *OpenOltFlowMgr) decrementActiveFlowRemoveCount(ctx context.Context, flow *ofp.OfpFlowStats) {
+	f.pendingFlowRemoveDataPerSubscriberLock.Lock()
+	defer f.pendingFlowRemoveDataPerSubscriberLock.Unlock()
+
 	inPort, outPort := getPorts(flow)
 	logger.Debugw(ctx, "decrement-flow-remove-count-for-inPort-out-port", log.Fields{"inPort": inPort, "out-port": outPort})
 	if inPort != InvalidPort && outPort != InvalidPort {
-		_, intfID, onuID, uniID := ExtractAccessFromFlow(uint32(inPort), uint32(outPort))
+		_, intfID, onuID, uniID := ExtractAccessFromFlow(inPort, outPort)
 		key := pendingFlowRemoveDataKey{intfID: intfID, onuID: onuID, uniID: uniID}
 		logger.Debugw(ctx, "decrement-flow-remove-count-for-subscriber", log.Fields{"intf-id": intfID, "onu-id": onuID, "uni-id": uniID})
 
-		f.pendingFlowRemoveDataPerSubscriberLock.Lock()
-		defer f.pendingFlowRemoveDataPerSubscriberLock.Unlock()
 		if val, ok := f.pendingFlowRemoveDataPerSubscriber[key]; !ok {
 			logger.Fatalf(ctx, "flow-remove-key-not-found", log.Fields{"intf-id": intfID, "onu-id": onuID, "uni-id": uniID})
 		} else {
@@ -3806,3 +3345,54 @@
 		logger.Debugw(ctx, "all-flows-cleared--handling-flow-add-now", log.Fields{"intf-id": intfID, "onu-id": onuID, "uni-id": uniID})
 	}
 }
+
+// reconcileSubscriberDataPathFlowIDMap reconciles subscriberDataPathFlowIDMap from KV store
+func (f *OpenOltFlowMgr) reconcileSubscriberDataPathFlowIDMap(ctx context.Context) {
+	onuGemInfo, err := f.resourceMgr.GetOnuGemInfo(ctx, f.ponPortIdx)
+	if err != nil {
+		_ = olterrors.NewErrNotFound("onu", log.Fields{
+			"pon-port": f.ponPortIdx}, err).Log()
+		return
+	}
+
+	f.subscriberDataPathFlowIDMapLock.Lock()
+	defer f.subscriberDataPathFlowIDMapLock.Unlock()
+
+	for _, onu := range onuGemInfo {
+		for _, uniID := range onu.UniPorts {
+			flowIDs, err := f.resourceMgr.GetCurrentFlowIDsForOnu(ctx, onu.IntfID, int32(onu.OnuID), int32(uniID))
+			if err != nil {
+				logger.Fatalf(ctx, "failed-to-read-flow-ids-of-onu-during-reconciliation")
+			}
+			for _, flowID := range flowIDs {
+				flowInfo := f.resourceMgr.GetFlowIDInfo(ctx, onu.IntfID, int32(onu.OnuID), int32(uniID), flowID)
+				if flowInfo == nil {
+					// Error is already logged in the called function
+					continue
+				}
+				if flowInfo.Flow.Classifier.PktTagType == DoubleTag &&
+					flowInfo.Flow.FlowType == Downstream &&
+					flowInfo.Flow.Classifier.OVid > 0 &&
+					flowInfo.Flow.TechProfileId > 0 {
+					key := subscriberDataPathFlowIDKey{intfID: onu.IntfID, onuID: onu.OnuID, uniID: uniID, direction: flowInfo.Flow.FlowType, tpID: flowInfo.Flow.TechProfileId}
+					if _, ok := f.subscriberDataPathFlowIDMap[key]; !ok {
+						f.subscriberDataPathFlowIDMap[key] = flowInfo.Flow.FlowId
+					}
+				} else if flowInfo.Flow.Classifier.PktTagType == SingleTag &&
+					flowInfo.Flow.FlowType == Upstream &&
+					flowInfo.Flow.Action.OVid > 0 &&
+					flowInfo.Flow.TechProfileId > 0 {
+					key := subscriberDataPathFlowIDKey{intfID: onu.IntfID, onuID: onu.OnuID, uniID: uniID, direction: flowInfo.Flow.FlowType, tpID: flowInfo.Flow.TechProfileId}
+					if _, ok := f.subscriberDataPathFlowIDMap[key]; !ok {
+						f.subscriberDataPathFlowIDMap[key] = flowInfo.Flow.FlowId
+					}
+				}
+			}
+		}
+	}
+}
+
+// isDatapathFlow declares a flow as datapath flow if it is not a controller bound flow and the flow does not have group
+func isDatapathFlow(flow *ofp.OfpFlowStats) bool {
+	return !IsControllerBoundFlow(flows.GetOutPort(flow)) && !flows.HasGroup(flow)
+}
diff --git a/internal/pkg/core/openolt_flowmgr_test.go b/internal/pkg/core/openolt_flowmgr_test.go
index b75bfac..9464830 100644
--- a/internal/pkg/core/openolt_flowmgr_test.go
+++ b/internal/pkg/core/openolt_flowmgr_test.go
@@ -27,19 +27,19 @@
 	"testing"
 	"time"
 
-	"github.com/opencord/voltha-protos/v3/go/voltha"
+	"github.com/opencord/voltha-protos/v4/go/voltha"
 
-	"github.com/opencord/voltha-lib-go/v3/pkg/db"
-	fu "github.com/opencord/voltha-lib-go/v3/pkg/flows"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	tp "github.com/opencord/voltha-lib-go/v3/pkg/techprofile"
+	"github.com/opencord/voltha-lib-go/v4/pkg/db"
+	fu "github.com/opencord/voltha-lib-go/v4/pkg/flows"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
+	tp "github.com/opencord/voltha-lib-go/v4/pkg/techprofile"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/resourcemanager"
 	rsrcMgr "github.com/opencord/voltha-openolt-adapter/internal/pkg/resourcemanager"
 	"github.com/opencord/voltha-openolt-adapter/pkg/mocks"
-	ofp "github.com/opencord/voltha-protos/v3/go/openflow_13"
-	"github.com/opencord/voltha-protos/v3/go/openolt"
-	openoltpb2 "github.com/opencord/voltha-protos/v3/go/openolt"
-	tp_pb "github.com/opencord/voltha-protos/v3/go/tech_profile"
+	ofp "github.com/opencord/voltha-protos/v4/go/openflow_13"
+	"github.com/opencord/voltha-protos/v4/go/openolt"
+	openoltpb2 "github.com/opencord/voltha-protos/v4/go/openolt"
+	tp_pb "github.com/opencord/voltha-protos/v4/go/tech_profile"
 )
 
 var flowMgr []*OpenOltFlowMgr
@@ -604,7 +604,7 @@
 
 	// clean the flowMgr
 	for i := 0; i < intfNum; i++ {
-		flowMgr[i].onuGemInfo = make(map[uint32][]rsrcMgr.OnuGemInfo, intfNum)
+		flowMgr[i].onuGemInfo = make([]rsrcMgr.OnuGemInfo, 0)
 	}
 
 	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
@@ -637,13 +637,13 @@
 
 	// check that each entry of onuGemInfo has the correct number of ONUs
 	for i := 0; i < intfNum; i++ {
-		lenofOnu := len(flowMgr[i].onuGemInfo[uint32(i)])
+		lenofOnu := len(flowMgr[i].onuGemInfo)
 		if onuNum != lenofOnu {
 			t.Errorf("OnuGemInfo length is not as expected len = %d, want %d", lenofOnu, onuNum)
 		}
 
 		for o := 1; o <= onuNum; o++ {
-			lenOfGemPorts := len(flowMgr[i].onuGemInfo[uint32(i)][o-1].GemPorts)
+			lenOfGemPorts := len(flowMgr[i].onuGemInfo[o-1].GemPorts)
 			// check that each onuEntry has 1 gemPort
 			if lenOfGemPorts != 1 {
 				t.Errorf("Expected 1 GemPort per ONU, found %d", lenOfGemPorts)
@@ -651,7 +651,7 @@
 
 			// check that the value of the gemport is correct
 			gemID, _ := strconv.Atoi(fmt.Sprintf("90%d%d", i, o-1))
-			currentValue := flowMgr[i].onuGemInfo[uint32(i)][o-1].GemPorts[0]
+			currentValue := flowMgr[i].onuGemInfo[o-1].GemPorts[0]
 			if uint32(gemID) != currentValue {
 				t.Errorf("Expected GemPort value to be %d, found %d", gemID, currentValue)
 			}
@@ -698,11 +698,11 @@
 			for _, gemPortDeleted := range tt.args.gemPortIDsToBeDeleted {
 				flowMgr[tt.args.intfID].deleteGemPortFromLocalCache(ctx, tt.args.intfID, tt.args.onuID, gemPortDeleted)
 			}
-			lenofGemPorts := len(flowMgr[tt.args.intfID].onuGemInfo[tt.args.intfID][0].GemPorts)
+			lenofGemPorts := len(flowMgr[tt.args.intfID].onuGemInfo[0].GemPorts)
 			if lenofGemPorts != tt.args.finalLength {
 				t.Errorf("GemPorts length is not as expected len = %d, want %d", lenofGemPorts, tt.args.finalLength)
 			}
-			gemPorts := flowMgr[tt.args.intfID].onuGemInfo[tt.args.intfID][0].GemPorts
+			gemPorts := flowMgr[tt.args.intfID].onuGemInfo[0].GemPorts
 			if !reflect.DeepEqual(tt.args.gemPortIDsRemaining, gemPorts) {
 				t.Errorf("GemPorts are not as expected = %v, want %v", gemPorts, tt.args.gemPortIDsRemaining)
 			}
@@ -964,11 +964,6 @@
 		return
 	}
 
-	//ofpMeterConfig := &ofp.OfpMeterConfig{Flags: 1, MeterId: 1}
-	//flowMetadata := &voltha.FlowMetadata{
-	//	Meters: []*ofp.OfpMeterConfig{ofpMeterConfig},
-	//}
-
 	TpInst := &tp.TechProfile{
 		Name:                 "Test-Tech-Profile",
 		SubscriberIdentifier: "257",
@@ -980,6 +975,39 @@
 			Uni: "16",
 		},
 	}
+	TpInst.UsScheduler.Priority = 1
+	TpInst.UsScheduler.Direction = "upstream"
+	TpInst.UsScheduler.AllocID = 1
+	TpInst.UsScheduler.AdditionalBw = "None"
+	TpInst.UsScheduler.QSchedPolicy = "PQ"
+	TpInst.UsScheduler.Weight = 4
+
+	TpInst.DsScheduler.Priority = 1
+	TpInst.DsScheduler.Direction = "upstream"
+	TpInst.DsScheduler.AllocID = 1
+	TpInst.DsScheduler.AdditionalBw = "None"
+	TpInst.DsScheduler.QSchedPolicy = "PQ"
+	TpInst.DsScheduler.Weight = 4
+
+	TpInst.UpstreamGemPortAttributeList = make([]tp.IGemPortAttribute, 4)
+	TpInst.UpstreamGemPortAttributeList[0].GemportID = 1
+	TpInst.UpstreamGemPortAttributeList[0].PbitMap = "0b00000011"
+	TpInst.UpstreamGemPortAttributeList[0].GemportID = 2
+	TpInst.UpstreamGemPortAttributeList[0].PbitMap = "0b00001100"
+	TpInst.UpstreamGemPortAttributeList[0].GemportID = 3
+	TpInst.UpstreamGemPortAttributeList[0].PbitMap = "0b00110000"
+	TpInst.UpstreamGemPortAttributeList[0].GemportID = 4
+	TpInst.UpstreamGemPortAttributeList[0].PbitMap = "0b11000000"
+
+	TpInst.DownstreamGemPortAttributeList = make([]tp.IGemPortAttribute, 4)
+	TpInst.DownstreamGemPortAttributeList[0].GemportID = 1
+	TpInst.DownstreamGemPortAttributeList[0].PbitMap = "0b00000011"
+	TpInst.DownstreamGemPortAttributeList[0].GemportID = 2
+	TpInst.DownstreamGemPortAttributeList[0].PbitMap = "0b00001100"
+	TpInst.DownstreamGemPortAttributeList[0].GemportID = 3
+	TpInst.DownstreamGemPortAttributeList[0].PbitMap = "0b00110000"
+	TpInst.DownstreamGemPortAttributeList[0].GemportID = 4
+	TpInst.DownstreamGemPortAttributeList[0].PbitMap = "0b11000000"
 
 	type args struct {
 		args           map[string]uint32
@@ -1014,7 +1042,7 @@
 				uniID:          16,
 				portNo:         1,
 				TpInst:         TpInst,
-				allocID:        []uint32{0x8001, 0x8002, 0x8003, 0x8004},
+				allocID:        []uint32{0x8001},
 				gemPorts:       []uint32{1, 2, 3, 4},
 				TpID:           64,
 				uni:            "16",
@@ -1033,7 +1061,7 @@
 				uniID:          16,
 				portNo:         1,
 				TpInst:         TpInst,
-				allocID:        []uint32{0x8001, 0x8002, 0x8003, 0x8004},
+				allocID:        []uint32{0x8001},
 				gemPorts:       []uint32{1, 2, 3, 4},
 				TpID:           64,
 				uni:            "16",
@@ -1052,7 +1080,7 @@
 				uniID:          16,
 				portNo:         1,
 				TpInst:         TpInst,
-				allocID:        []uint32{0x8001, 0x8002, 0x8003, 0x8004},
+				allocID:        []uint32{0x8001},
 				gemPorts:       []uint32{1, 2, 3, 4},
 				TpID:           64,
 				uni:            "16",
@@ -1071,7 +1099,7 @@
 				uniID:          16,
 				portNo:         1,
 				TpInst:         TpInst,
-				allocID:        []uint32{0x8001, 0x8002, 0x8003, 0x8004},
+				allocID:        []uint32{0x8001},
 				gemPorts:       []uint32{1, 2, 3, 4},
 				TpID:           64,
 				uni:            "16",
diff --git a/internal/pkg/core/openolt_groupmgr.go b/internal/pkg/core/openolt_groupmgr.go
index d14d24b..a87073b 100644
--- a/internal/pkg/core/openolt_groupmgr.go
+++ b/internal/pkg/core/openolt_groupmgr.go
@@ -16,12 +16,12 @@
 
 import (
 	"context"
-	"github.com/opencord/voltha-lib-go/v3/pkg/flows"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	"github.com/opencord/voltha-lib-go/v4/pkg/flows"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
 	rsrcMgr "github.com/opencord/voltha-openolt-adapter/internal/pkg/resourcemanager"
-	ofp "github.com/opencord/voltha-protos/v3/go/openflow_13"
-	openoltpb2 "github.com/opencord/voltha-protos/v3/go/openolt"
+	ofp "github.com/opencord/voltha-protos/v4/go/openflow_13"
+	openoltpb2 "github.com/opencord/voltha-protos/v4/go/openolt"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
 	"sync"
@@ -75,7 +75,7 @@
 	}
 	// group members not created yet. So let's store the group
 	if err := g.resourceMgr.AddFlowGroupToKVStore(ctx, group, true); err != nil {
-		return olterrors.NewErrPersistence("add", "flow-group", group.Desc.GroupId, log.Fields{"group": group}, err)
+		return olterrors.NewErrPersistence("add", "flow-group", uint64(group.Desc.GroupId), log.Fields{"group": group}, err)
 	}
 	logger.Infow(ctx, "add-group-operation-performed-on-the-device-successfully ", log.Fields{"groupToOlt": groupToOlt})
 	return nil
@@ -99,7 +99,7 @@
 	}
 	//remove group from the store
 	if err := g.resourceMgr.RemoveFlowGroupFromKVStore(ctx, group.Desc.GroupId, false); err != nil {
-		return olterrors.NewErrPersistence("delete", "flow-group", group.Desc.GroupId, log.Fields{"group": group}, err)
+		return olterrors.NewErrPersistence("delete", "flow-group", uint64(group.Desc.GroupId), log.Fields{"group": group}, err)
 	}
 	logger.Debugw(ctx, "delete-group-operation-performed-on-the-device-successfully ", log.Fields{"groupToOlt": groupToOlt})
 	return nil
@@ -159,7 +159,7 @@
 	//save the modified group
 	if errAdd == nil && errRemoved == nil {
 		if err := g.resourceMgr.AddFlowGroupToKVStore(ctx, group, false); err != nil {
-			return olterrors.NewErrPersistence("add", "flow-group", group.Desc.GroupId, log.Fields{"group": group}, err)
+			return olterrors.NewErrPersistence("add", "flow-group", uint64(group.Desc.GroupId), log.Fields{"group": group}, err)
 		}
 		logger.Infow(ctx, "modify-group-was-success--storing-group",
 			log.Fields{
diff --git a/internal/pkg/core/openolt_test.go b/internal/pkg/core/openolt_test.go
index 08c2f52..cf08161 100644
--- a/internal/pkg/core/openolt_test.go
+++ b/internal/pkg/core/openolt_test.go
@@ -28,16 +28,16 @@
 	"reflect"
 	"testing"
 
-	com "github.com/opencord/voltha-lib-go/v3/pkg/adapters/common"
-	fu "github.com/opencord/voltha-lib-go/v3/pkg/flows"
-	"github.com/opencord/voltha-lib-go/v3/pkg/kafka"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	com "github.com/opencord/voltha-lib-go/v4/pkg/adapters/common"
+	fu "github.com/opencord/voltha-lib-go/v4/pkg/flows"
+	"github.com/opencord/voltha-lib-go/v4/pkg/kafka"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/config"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
-	ic "github.com/opencord/voltha-protos/v3/go/inter_container"
-	"github.com/opencord/voltha-protos/v3/go/openflow_13"
-	ofp "github.com/opencord/voltha-protos/v3/go/openflow_13"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
+	ic "github.com/opencord/voltha-protos/v4/go/inter_container"
+	"github.com/opencord/voltha-protos/v4/go/openflow_13"
+	ofp "github.com/opencord/voltha-protos/v4/go/openflow_13"
+	"github.com/opencord/voltha-protos/v4/go/voltha"
 )
 
 // mocks the OpenOLT struct.
diff --git a/internal/pkg/core/statsmanager.go b/internal/pkg/core/statsmanager.go
index 53f81ab..cf6af12 100755
--- a/internal/pkg/core/statsmanager.go
+++ b/internal/pkg/core/statsmanager.go
@@ -24,10 +24,10 @@
 	"sync"
 	"time"
 
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
-	"github.com/opencord/voltha-protos/v3/go/openolt"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
+	"github.com/opencord/voltha-protos/v4/go/openolt"
+	"github.com/opencord/voltha-protos/v4/go/voltha"
 )
 
 var mutex = &sync.Mutex{}
diff --git a/internal/pkg/core/statsmanager_test.go b/internal/pkg/core/statsmanager_test.go
index 0155330..438d117 100644
--- a/internal/pkg/core/statsmanager_test.go
+++ b/internal/pkg/core/statsmanager_test.go
@@ -23,8 +23,8 @@
 	"reflect"
 	"testing"
 
-	"github.com/opencord/voltha-protos/v3/go/openolt"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
+	"github.com/opencord/voltha-protos/v4/go/openolt"
+	"github.com/opencord/voltha-protos/v4/go/voltha"
 )
 
 func TestOpenOltStatisticsMgr_PortStatisticsIndication(t *testing.T) {
diff --git a/internal/pkg/olterrors/common.go b/internal/pkg/olterrors/common.go
index 7709046..fa427a7 100644
--- a/internal/pkg/olterrors/common.go
+++ b/internal/pkg/olterrors/common.go
@@ -18,7 +18,7 @@
 package olterrors
 
 import (
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
 )
 
 var logger log.CLogger
diff --git a/internal/pkg/olterrors/olterrors.go b/internal/pkg/olterrors/olterrors.go
index 214c206..c5790ac 100644
--- a/internal/pkg/olterrors/olterrors.go
+++ b/internal/pkg/olterrors/olterrors.go
@@ -21,7 +21,7 @@
 	"context"
 	"encoding/json"
 	"fmt"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
 	"strings"
 )
 
@@ -203,7 +203,7 @@
 }
 
 // NewErrPersistence constructs a new error based on the given values
-func NewErrPersistence(operation, entityType string, ID uint32, fields log.Fields, wrapped error) LoggableError {
+func NewErrPersistence(operation, entityType string, ID uint64, fields log.Fields, wrapped error) LoggableError {
 	return &ErrPersistence{
 		ErrAdapter{
 			name: "unable-to-persist",
@@ -265,7 +265,7 @@
 }
 
 // NewErrFlowOp constructs a new error based on the given values
-func NewErrFlowOp(operation string, ID uint32, fields log.Fields, wrapped error) LoggableError {
+func NewErrFlowOp(operation string, ID uint64, fields log.Fields, wrapped error) LoggableError {
 	return &ErrPersistence{
 		ErrAdapter{
 			name: "unable-to-perform-flow-operation",
diff --git a/internal/pkg/resourcemanager/common.go b/internal/pkg/resourcemanager/common.go
index 45fa180..5b6eedf 100644
--- a/internal/pkg/resourcemanager/common.go
+++ b/internal/pkg/resourcemanager/common.go
@@ -18,7 +18,7 @@
 package resourcemanager
 
 import (
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
 )
 
 var logger log.CLogger
diff --git a/internal/pkg/resourcemanager/resourcemanager.go b/internal/pkg/resourcemanager/resourcemanager.go
index 3f642cf..abfb73d 100755
--- a/internal/pkg/resourcemanager/resourcemanager.go
+++ b/internal/pkg/resourcemanager/resourcemanager.go
@@ -23,17 +23,18 @@
 	"errors"
 	"fmt"
 	"strconv"
+	"strings"
 	"sync"
 	"time"
 
 	"github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
 
-	"github.com/opencord/voltha-lib-go/v3/pkg/db"
-	"github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	ponrmgr "github.com/opencord/voltha-lib-go/v3/pkg/ponresourcemanager"
-	ofp "github.com/opencord/voltha-protos/v3/go/openflow_13"
-	"github.com/opencord/voltha-protos/v3/go/openolt"
+	"github.com/opencord/voltha-lib-go/v4/pkg/db"
+	"github.com/opencord/voltha-lib-go/v4/pkg/db/kvstore"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
+	ponrmgr "github.com/opencord/voltha-lib-go/v4/pkg/ponresourcemanager"
+	ofp "github.com/opencord/voltha-protos/v4/go/openflow_13"
+	"github.com/opencord/voltha-protos/v4/go/openolt"
 )
 
 const (
@@ -47,11 +48,12 @@
 	MeterIDPathSuffix = "{%d,%d,%d}/{%d}/meter_id/{%s}"
 	//NnniIntfID - nniintfids
 	NnniIntfID = "nniintfids"
-	//OnuPacketINPathPrefix to be used as prefix for keys to be used to store packet-in gem ports
-	OnuPacketINPathPrefix = "onu_packetin/{%d,%d,%d"
-	// OnuPacketINPath path on the kvstore to store packetin gemport,which will be used for packetin, pcketout
-	//format: onu_packetin/<intfid>,<onuid>,<logicalport>,<vlanId>,<priority>
-	OnuPacketINPath = OnuPacketINPathPrefix + ",%d,%d}"
+	// OnuPacketINPathPrefix - path prefix where ONU packet-in vlanID/PCP is stored
+	//format: onu_packetin/{<intfid>,<onuid>,<logicalport>}
+	OnuPacketINPathPrefix = "onu_packetin/{%d,%d,%d}"
+	// OnuPacketINPath path on the kvstore to store packetin gemport,which will be used for packetin, packetout
+	//format: onu_packetin/{<intfid>,<onuid>,<logicalport>}/{<vlanId>,<priority>}
+	OnuPacketINPath = OnuPacketINPathPrefix + "/{%d,%d}"
 	//FlowIDsForGem flowids_per_gem/<intfid>
 	FlowIDsForGem = "flowids_per_gem/{%d}"
 	//McastQueuesForIntf multicast queues for pon interfaces
@@ -68,14 +70,19 @@
 	// We preserve the groups under "FlowGroupsCached" directory in the KV store temporarily. Having set members,
 	// we remove the group from the cached group store.
 	FlowGroupCached = "flow_groups_cached/{%d}"
+
+	//FlowIDPath - Path on the KV store for storing list of Flow IDs for a given subscriber
+	//Format: BasePathKvStore/<(pon_intf_id, onu_id, uni_id)>/flow_ids
+	FlowIDPath = "{%s}/flow_ids"
+	//FlowIDInfoPath - Used to store more metadata associated with the flow_id
+	//Format: BasePathKvStore/<(pon_intf_id, onu_id, uni_id)>/flow_id_info/<flow_id>
+	FlowIDInfoPath = "{%s}/flow_id_info/{%d}"
 )
 
 // FlowInfo holds the flow information
 type FlowInfo struct {
-	Flow            *openolt.Flow
-	FlowStoreCookie uint64
-	FlowCategory    string
-	LogicalFlowID   uint64
+	Flow           *openolt.Flow
+	IsSymmtricFlow bool
 }
 
 // OnuGemInfo holds onu information along with gem port list and uni port list
@@ -119,12 +126,6 @@
 	AllocIDMgmtLock []sync.RWMutex
 	// This protects concurrent onu_id allocate/delete calls on a per PON port basis
 	OnuIDMgmtLock []sync.RWMutex
-	// This protects concurrent flow_id allocate/delete calls. We do not need this on a
-	// per PON port basis as flow IDs are unique across the OLT.
-	FlowIDMgmtLock sync.RWMutex
-
-	// This protects concurrent access to flowids_per_gem info stored on KV store
-	flowIDToGemInfoLock sync.RWMutex
 }
 
 func newKVClient(ctx context.Context, storeType string, address string, timeout time.Duration) (kvstore.Client, error) {
@@ -164,6 +165,7 @@
 func NewResourceMgr(ctx context.Context, deviceID string, KVStoreAddress string, kvStoreType string, deviceType string, devInfo *openolt.DeviceInfo) *OpenOltResourceMgr {
 	var ResourceMgr OpenOltResourceMgr
 	logger.Debugf(ctx, "Init new resource manager , address: %s, device-id: %s", KVStoreAddress, deviceID)
+	ResourceMgr.DeviceID = deviceID
 	ResourceMgr.Address = KVStoreAddress
 	ResourceMgr.DeviceType = deviceType
 	ResourceMgr.DevInfo = devInfo
@@ -249,7 +251,7 @@
 			GlobalPONRsrcMgr = RsrcMgrsByTech[technology]
 		}
 		for _, IntfID := range TechRange.IntfIds {
-			ResourceMgr.ResourceMgrs[uint32(IntfID)] = RsrcMgrsByTech[technology]
+			ResourceMgr.ResourceMgrs[IntfID] = RsrcMgrsByTech[technology]
 		}
 		// self.initialize_device_resource_range_and_pool(resource_mgr, global_resource_mgr, arange)
 		InitializeDeviceResourceRangeAndPool(ctx, RsrcMgrsByTech[technology], GlobalPONRsrcMgr,
@@ -446,16 +448,16 @@
 		return 0, err
 	}
 	// Get ONU id for a provided pon interface ID.
-	ONUID, err := RsrcMgr.ResourceMgrs[ponIntfID].GetResourceID(ctx, ponIntfID,
+	onuID, err := RsrcMgr.ResourceMgrs[ponIntfID].GetResourceID(ctx, ponIntfID,
 		ponrmgr.ONU_ID, 1)
 	if err != nil {
 		logger.Errorf(ctx, "Failed to get resource for interface %d for type %s",
 			ponIntfID, ponrmgr.ONU_ID)
 		return 0, err
 	}
-	if ONUID != nil {
-		RsrcMgr.ResourceMgrs[ponIntfID].InitResourceMap(ctx, fmt.Sprintf("%d,%d", ponIntfID, ONUID[0]))
-		return ONUID[0], err
+	if onuID != nil {
+		RsrcMgr.ResourceMgrs[ponIntfID].InitResourceMap(ctx, fmt.Sprintf("%d,%d", ponIntfID, onuID[0]))
+		return onuID[0], err
 	}
 
 	return 0, err // return OnuID 0 on error
@@ -464,81 +466,170 @@
 // GetFlowIDInfo returns the slice of flow info of the given pon-port
 // Note: For flows which trap from the NNI and not really associated with any particular
 // ONU (like LLDP), the onu_id and uni_id is set as -1. The intf_id is the NNI intf_id.
-func (RsrcMgr *OpenOltResourceMgr) GetFlowIDInfo(ctx context.Context, ponIntfID uint32, onuID int32, uniID int32, flowID uint32) *[]FlowInfo {
-	var flows []FlowInfo
+func (RsrcMgr *OpenOltResourceMgr) GetFlowIDInfo(ctx context.Context, ponIntfID uint32, onuID int32, uniID int32, flowID uint64) *FlowInfo {
+	var flowInfo FlowInfo
 
-	FlowPath := fmt.Sprintf("%d,%d,%d", ponIntfID, onuID, uniID)
-	if err := RsrcMgr.ResourceMgrs[ponIntfID].GetFlowIDInfo(ctx, FlowPath, flowID, &flows); err != nil {
-		logger.Errorw(ctx, "Error while getting flows from KV store", log.Fields{"flowId": flowID})
+	subs := fmt.Sprintf("%d,%d,%d", ponIntfID, onuID, uniID)
+	Path := fmt.Sprintf(FlowIDInfoPath, subs, flowID)
+	value, err := RsrcMgr.KVStore.Get(ctx, Path)
+	if err == nil {
+		if value != nil {
+			Val, err := toByte(value.Value)
+			if err != nil {
+				logger.Errorw(ctx, "Failed to convert flowinfo into byte array", log.Fields{"error": err, "subs": subs})
+				return nil
+			}
+			if err = json.Unmarshal(Val, &flowInfo); err != nil {
+				logger.Errorw(ctx, "Failed to unmarshal", log.Fields{"error": err, "subs": subs})
+				return nil
+			}
+		}
+	}
+	if flowInfo.Flow == nil {
+		logger.Debugw(ctx, "No flowInfo found in KV store", log.Fields{"subs": subs})
 		return nil
 	}
-	if len(flows) == 0 {
-		logger.Debugw(ctx, "No flowInfo found in KV store", log.Fields{"flowPath": FlowPath})
-		return nil
-	}
-	return &flows
+	return &flowInfo
 }
 
 // GetCurrentFlowIDsForOnu fetches flow ID from the resource manager
 // Note: For flows which trap from the NNI and not really associated with any particular
 // ONU (like LLDP), the onu_id and uni_id is set as -1. The intf_id is the NNI intf_id.
-func (RsrcMgr *OpenOltResourceMgr) GetCurrentFlowIDsForOnu(ctx context.Context, PONIntfID uint32, ONUID int32, UNIID int32) []uint32 {
+func (RsrcMgr *OpenOltResourceMgr) GetCurrentFlowIDsForOnu(ctx context.Context, ponIntfID uint32, onuID int32, uniID int32) ([]uint64, error) {
 
-	FlowPath := fmt.Sprintf("%d,%d,%d", PONIntfID, ONUID, UNIID)
-	if mgrs, exist := RsrcMgr.ResourceMgrs[PONIntfID]; exist {
-		return mgrs.GetCurrentFlowIDsForOnu(ctx, FlowPath)
+	subs := fmt.Sprintf("%d,%d,%d", ponIntfID, onuID, uniID)
+	path := fmt.Sprintf(FlowIDPath, subs)
+
+	var data []uint64
+	value, err := RsrcMgr.KVStore.Get(ctx, path)
+	if err == nil {
+		if value != nil {
+			Val, _ := toByte(value.Value)
+			if err = json.Unmarshal(Val, &data); err != nil {
+				logger.Error(ctx, "Failed to unmarshal")
+				return nil, err
+			}
+		}
 	}
-	return nil
+	return data, nil
 }
 
 // UpdateFlowIDInfo updates flow info for the given pon interface, onu id, and uni id
 // Note: For flows which trap from the NNI and not really associated with any particular
 // ONU (like LLDP), the onu_id and uni_id is set as -1. The intf_id is the NNI intf_id.
-func (RsrcMgr *OpenOltResourceMgr) UpdateFlowIDInfo(ctx context.Context, ponIntfID int32, onuID int32, uniID int32,
-	flowID uint32, flowData *[]FlowInfo) error {
-	FlowPath := fmt.Sprintf("%d,%d,%d", ponIntfID, onuID, uniID)
-	return RsrcMgr.ResourceMgrs[uint32(ponIntfID)].UpdateFlowIDInfoForOnu(ctx, FlowPath, flowID, *flowData)
+func (RsrcMgr *OpenOltResourceMgr) UpdateFlowIDInfo(ctx context.Context, ponIntfID uint32, onuID int32, uniID int32,
+	flowID uint64, flowData FlowInfo) error {
+
+	subs := fmt.Sprintf("%d,%d,%d", ponIntfID, onuID, uniID)
+	path := fmt.Sprintf(FlowIDInfoPath, subs, flowID)
+
+	var value []byte
+	var err error
+	value, err = json.Marshal(flowData)
+	if err != nil {
+		logger.Errorf(ctx, "failed to Marshal, resource path %s", path)
+		return err
+	}
+
+	if err = RsrcMgr.KVStore.Put(ctx, path, value); err != nil {
+		logger.Errorf(ctx, "Failed to update resource %s", path)
+	}
+
+	// Update the flowID list for the ONU
+	if err = RsrcMgr.UpdateFlowIDForOnu(ctx, ponIntfID, onuID, uniID, flowID, true); err != nil {
+		// If the operation fails, try to remove FlowInfo from the KV store
+		_ = RsrcMgr.KVStore.Delete(ctx, path)
+		return err
+	}
+	return err
 }
 
-// GetFlowID return flow ID for a given pon interface id, onu id and uni id
-func (RsrcMgr *OpenOltResourceMgr) GetFlowID(ctx context.Context, ponIntfID uint32, ONUID int32, uniID int32,
-	gemportID uint32,
-	flowStoreCookie uint64,
-	flowCategory string, vlanVid uint32, vlanPcp ...uint32) (uint32, error) {
+// UpdateFlowIDForOnu updates the flow_id list of the ONU (add or remove flow_id from the list)
+func (RsrcMgr *OpenOltResourceMgr) UpdateFlowIDForOnu(ctx context.Context, ponIntfID uint32, onuID int32, uniID int32, flowID uint64, add bool) error {
+	/*
+	   Update the flow_id list of the ONU (add or remove flow_id from the list)
+	   :param pon_intf_onu_id: reference of PON interface id and onu id
+	   :param flow_id: flow ID
+	   :param add: Boolean flag to indicate whether the flow_id should be
+	               added or removed from the list. Defaults to adding the flow.
+	*/
+	var Value []byte
+	var err error
+	var retVal bool
+	var idx uint64
+	subs := fmt.Sprintf("%d,%d,%d", ponIntfID, onuID, uniID)
+	path := fmt.Sprintf(FlowIDPath, subs)
+	flowIDs, err := RsrcMgr.GetCurrentFlowIDsForOnu(ctx, ponIntfID, onuID, uniID)
+	if err != nil {
+		// Error logged in the called function
+		return err
+	}
+
+	if add {
+		if retVal, _ = checkForFlowIDInList(flowIDs, flowID); retVal {
+			return nil
+		}
+		flowIDs = append(flowIDs, flowID)
+	} else {
+		if retVal, idx = checkForFlowIDInList(flowIDs, flowID); !retVal {
+			return nil
+		}
+		// delete the index and shift
+		flowIDs = append(flowIDs[:idx], flowIDs[idx+1:]...)
+	}
+	Value, err = json.Marshal(flowIDs)
+	if err != nil {
+		logger.Error(ctx, "Failed to Marshal")
+		return err
+	}
+
+	if err = RsrcMgr.KVStore.Put(ctx, path, Value); err != nil {
+		logger.Errorf(ctx, "Failed to update resource %s", path)
+		return err
+	}
+	return err
+}
+
+// RemoveFlowIDInfo remove flow info for the given pon interface, onu id, and uni id
+// Note: For flows which trap from the NNI and not really associated with any particular
+// ONU (like LLDP), the onu_id and uni_id is set as -1. The intf_id is the NNI intf_id.
+func (RsrcMgr *OpenOltResourceMgr) RemoveFlowIDInfo(ctx context.Context, ponIntfID uint32, onuID int32, uniID int32,
+	flowID uint64) error {
+
+	subs := fmt.Sprintf("%d,%d,%d", ponIntfID, onuID, uniID)
+	path := fmt.Sprintf(FlowIDInfoPath, subs, flowID)
 
 	var err error
-	FlowPath := fmt.Sprintf("%d,%d,%d", ponIntfID, ONUID, uniID)
+	if err = RsrcMgr.KVStore.Delete(ctx, path); err != nil {
+		logger.Errorf(ctx, "Failed to delete resource %s", path)
+		return err
+	}
 
-	RsrcMgr.FlowIDMgmtLock.Lock()
-	defer RsrcMgr.FlowIDMgmtLock.Unlock()
+	// Update the flowID list for the ONU
+	err = RsrcMgr.UpdateFlowIDForOnu(ctx, ponIntfID, onuID, uniID, flowID, false)
 
-	FlowIDs := RsrcMgr.ResourceMgrs[ponIntfID].GetCurrentFlowIDsForOnu(ctx, FlowPath)
-	if FlowIDs != nil {
-		logger.Debugw(ctx, "Found flowId(s) for this ONU", log.Fields{"pon": ponIntfID, "ONUID": ONUID, "uniID": uniID, "KVpath": FlowPath})
-		for _, flowID := range FlowIDs {
-			FlowInfo := RsrcMgr.GetFlowIDInfo(ctx, ponIntfID, int32(ONUID), int32(uniID), uint32(flowID))
-			er := getFlowIDFromFlowInfo(ctx, FlowInfo, flowID, gemportID, flowStoreCookie, flowCategory, vlanVid, vlanPcp...)
-			if er == nil {
-				logger.Debugw(ctx, "Found flowid for the vlan, pcp, and gem",
-					log.Fields{"flowID": flowID, "vlanVid": vlanVid, "vlanPcp": vlanPcp, "gemPortID": gemportID})
-				return flowID, er
-			}
+	return err
+}
+
+// RemoveAllFlowsForIntfOnuUniKey removes flow info for the given interface, onu id, and uni id
+func (RsrcMgr *OpenOltResourceMgr) RemoveAllFlowsForIntfOnuUniKey(ctx context.Context, intf uint32, onuID int32, uniID int32) error {
+	flowIDs, err := RsrcMgr.GetCurrentFlowIDsForOnu(ctx, intf, onuID, uniID)
+	if err != nil {
+		// error logged in the called function
+		return err
+	}
+	for _, flID := range flowIDs {
+		if err := RsrcMgr.RemoveFlowIDInfo(ctx, intf, onuID, uniID, flID); err != nil {
+			logger.Errorw(ctx, "failed-to-delete-flow-id-info", log.Fields{"intf": intf, "onuID": onuID, "uniID": uniID, "flowID": flID})
 		}
 	}
-	logger.Debug(ctx, "No matching flows with flow cookie or flow category, allocating new flowid")
-	FlowIDs, err = RsrcMgr.ResourceMgrs[ponIntfID].GetResourceID(ctx, ponIntfID,
-		ponrmgr.FLOW_ID, 1)
-	if err != nil {
-		logger.Errorf(ctx, "Failed to get resource for interface %d for type %s",
-			ponIntfID, ponrmgr.FLOW_ID)
-		return uint32(0), err
+	subs := fmt.Sprintf("%d,%d,%d", intf, onuID, uniID)
+	path := fmt.Sprintf(FlowIDPath, subs)
+	if err := RsrcMgr.KVStore.Delete(ctx, path); err != nil {
+		logger.Errorf(ctx, "Failed to delete resource %s", path)
+		return err
 	}
-	if FlowIDs != nil {
-		_ = RsrcMgr.ResourceMgrs[ponIntfID].UpdateFlowIDForOnu(ctx, FlowPath, FlowIDs[0], true)
-		return FlowIDs[0], err
-	}
-
-	return 0, err
+	return nil
 }
 
 // GetAllocID return the first Alloc ID for a given pon interface id and onu id and then update the resource map on
@@ -738,47 +829,6 @@
 	}
 }
 
-// FreeFlowID returns the free flow id for a given interface, onu id and uni id
-func (RsrcMgr *OpenOltResourceMgr) FreeFlowID(ctx context.Context, IntfID uint32, onuID int32,
-	uniID int32, FlowID uint32) {
-	var IntfONUID string
-	var err error
-
-	RsrcMgr.FlowIDMgmtLock.Lock()
-	defer RsrcMgr.FlowIDMgmtLock.Unlock()
-
-	FlowIds := make([]uint32, 0)
-	FlowIds = append(FlowIds, FlowID)
-	IntfONUID = fmt.Sprintf("%d,%d,%d", IntfID, onuID, uniID)
-	err = RsrcMgr.ResourceMgrs[IntfID].UpdateFlowIDForOnu(ctx, IntfONUID, FlowID, false)
-	if err != nil {
-		logger.Errorw(ctx, "Failed to Update flow id  for", log.Fields{"intf": IntfONUID})
-	}
-	RsrcMgr.ResourceMgrs[IntfID].RemoveFlowIDInfo(ctx, IntfONUID, FlowID)
-
-	RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(ctx, IntfID, ponrmgr.FLOW_ID, FlowIds)
-}
-
-// FreeFlowIDs releases the flow Ids
-func (RsrcMgr *OpenOltResourceMgr) FreeFlowIDs(ctx context.Context, IntfID uint32, onuID uint32,
-	uniID uint32, FlowID []uint32) {
-	RsrcMgr.FlowIDMgmtLock.Lock()
-	defer RsrcMgr.FlowIDMgmtLock.Unlock()
-
-	RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(ctx, IntfID, ponrmgr.FLOW_ID, FlowID)
-
-	var IntfOnuIDUniID string
-	var err error
-	for _, flow := range FlowID {
-		IntfOnuIDUniID = fmt.Sprintf("%d,%d,%d", IntfID, onuID, uniID)
-		err = RsrcMgr.ResourceMgrs[IntfID].UpdateFlowIDForOnu(ctx, IntfOnuIDUniID, flow, false)
-		if err != nil {
-			logger.Errorw(ctx, "Failed to Update flow id for", log.Fields{"intf": IntfOnuIDUniID})
-		}
-		RsrcMgr.ResourceMgrs[IntfID].RemoveFlowIDInfo(ctx, IntfOnuIDUniID, flow)
-	}
-}
-
 // FreeAllocID frees AllocID on the PON resource pool and also frees the allocID association
 // for the given OLT device.
 func (RsrcMgr *OpenOltResourceMgr) FreeAllocID(ctx context.Context, IntfID uint32, onuID uint32,
@@ -826,13 +876,6 @@
 		GEMPortIDs)
 	RsrcMgr.GemPortIDMgmtLock[intfID].Unlock()
 
-	RsrcMgr.FlowIDMgmtLock.Lock()
-	FlowIDs := RsrcMgr.ResourceMgrs[intfID].GetCurrentFlowIDsForOnu(ctx, IntfOnuIDUniID)
-	RsrcMgr.ResourceMgrs[intfID].FreeResourceID(ctx, intfID,
-		ponrmgr.FLOW_ID,
-		FlowIDs)
-	RsrcMgr.FlowIDMgmtLock.Unlock()
-
 	// Clear resource map associated with (pon_intf_id, gemport_id) tuple.
 	RsrcMgr.ResourceMgrs[intfID].RemoveResourceMap(ctx, IntfOnuIDUniID)
 	// Clear the ONU Id associated with the (pon_intf_id, gemport_id) tuple.
@@ -841,25 +884,21 @@
 	}
 }
 
-// IsFlowCookieOnKVStore checks if the given flow cookie is present on the kv store
-// Returns true if the flow cookie is found, otherwise it returns false
-func (RsrcMgr *OpenOltResourceMgr) IsFlowCookieOnKVStore(ctx context.Context, ponIntfID uint32, onuID int32, uniID int32,
-	flowStoreCookie uint64) bool {
+// IsFlowOnKvStore checks if the given flowID is present on the kv store
+// Returns true if the flowID is found, otherwise it returns false
+func (RsrcMgr *OpenOltResourceMgr) IsFlowOnKvStore(ctx context.Context, ponIntfID uint32, onuID int32, uniID int32,
+	flowID uint64) bool {
 
-	FlowPath := fmt.Sprintf("%d,%d,%d", ponIntfID, onuID, uniID)
-	FlowIDs := RsrcMgr.ResourceMgrs[ponIntfID].GetCurrentFlowIDsForOnu(ctx, FlowPath)
+	FlowIDs, err := RsrcMgr.GetCurrentFlowIDsForOnu(ctx, ponIntfID, onuID, uniID)
+	if err != nil {
+		// error logged in the called function
+		return false
+	}
 	if FlowIDs != nil {
-		logger.Debugw(ctx, "Found flowId(s) for this ONU", log.Fields{"pon": ponIntfID, "onuID": onuID, "uniID": uniID, "KVpath": FlowPath})
-		for _, flowID := range FlowIDs {
-			FlowInfo := RsrcMgr.GetFlowIDInfo(ctx, ponIntfID, int32(onuID), int32(uniID), uint32(flowID))
-			if FlowInfo != nil {
-				logger.Debugw(ctx, "Found flows", log.Fields{"flows": *FlowInfo, "flowId": flowID})
-				for _, Info := range *FlowInfo {
-					if Info.FlowStoreCookie == flowStoreCookie {
-						logger.Debug(ctx, "Found flow matching with flowStore cookie", log.Fields{"flowId": flowID, "flowStoreCookie": flowStoreCookie})
-						return true
-					}
-				}
+		logger.Debugw(ctx, "Found flowId(s) for this ONU", log.Fields{"pon": ponIntfID, "onuID": onuID, "uniID": uniID})
+		for _, id := range FlowIDs {
+			if flowID == id {
+				return true
 			}
 		}
 	}
@@ -1017,57 +1056,6 @@
 	return nil
 }
 
-func getFlowIDFromFlowInfo(ctx context.Context, FlowInfo *[]FlowInfo, flowID, gemportID uint32, flowStoreCookie uint64, flowCategory string,
-	vlanVid uint32, vlanPcp ...uint32) error {
-	if FlowInfo != nil {
-		for _, Info := range *FlowInfo {
-			if int32(gemportID) == Info.Flow.GemportId && flowCategory != "" && Info.FlowCategory == flowCategory {
-				logger.Debug(ctx, "Found flow matching with flow category", log.Fields{"flowId": flowID, "FlowCategory": flowCategory})
-				if Info.FlowCategory == "HSIA_FLOW" {
-					if err := checkVlanAndPbitEqualityForFlows(vlanVid, Info, vlanPcp[0]); err == nil {
-						return nil
-					}
-				}
-			}
-			if int32(gemportID) == Info.Flow.GemportId && flowStoreCookie != 0 && Info.FlowStoreCookie == flowStoreCookie {
-				if flowCategory != "" && Info.FlowCategory == flowCategory {
-					logger.Debug(ctx, "Found flow matching with flow category", log.Fields{"flowId": flowID, "FlowCategory": flowCategory})
-					return nil
-				}
-			}
-		}
-	}
-	logger.Debugw(ctx, "the flow can be related to a different service", log.Fields{"flow_info": FlowInfo})
-	return errors.New("invalid flow-info")
-}
-
-func checkVlanAndPbitEqualityForFlows(vlanVid uint32, Info FlowInfo, vlanPcp uint32) error {
-	if err := checkVlanEqualityForFlows(vlanVid, Info); err != nil {
-		return err
-	}
-
-	//flow has remark action and pbits
-	if Info.Flow.Action.Cmd.RemarkInnerPbits || Info.Flow.Action.Cmd.RemarkOuterPbits {
-		if vlanPcp == Info.Flow.Action.OPbits || vlanPcp == Info.Flow.Action.IPbits {
-			return nil
-		}
-	} else if vlanPcp == Info.Flow.Classifier.OPbits {
-		//no remark action but flow has pbits
-		return nil
-	} else if vlanPcp == 0xff || Info.Flow.Classifier.OPbits == 0xff {
-		// no pbit found
-		return nil
-	}
-	return errors.New("not found in terms of pbit equality")
-}
-
-func checkVlanEqualityForFlows(vlanVid uint32, Info FlowInfo) error {
-	if vlanVid == Info.Flow.Action.OVid || vlanVid == Info.Flow.Classifier.IVid {
-		return nil
-	}
-	return errors.New("not found in terms of vlan_id equality")
-}
-
 //AddGemToOnuGemInfo adds gemport to onugem info kvstore
 func (RsrcMgr *OpenOltResourceMgr) AddGemToOnuGemInfo(ctx context.Context, intfID uint32, onuID uint32, gemPort uint32) error {
 	var onuGemData []OnuGemInfo
@@ -1122,14 +1110,14 @@
 
 	if err = RsrcMgr.ResourceMgrs[IntfID].GetOnuGemInfo(ctx, IntfID, &onuGemData); err != nil {
 		logger.Errorf(ctx, "failed to get onuifo for intfid %d", IntfID)
-		return olterrors.NewErrPersistence("get", "OnuGemInfo", IntfID,
+		return olterrors.NewErrPersistence("get", "OnuGemInfo", uint64(IntfID),
 			log.Fields{"onuGem": onuGem, "intfID": IntfID}, err)
 	}
 	onuGemData = append(onuGemData, onuGem)
 	err = RsrcMgr.ResourceMgrs[IntfID].AddOnuGemInfo(ctx, IntfID, onuGemData)
 	if err != nil {
 		logger.Error(ctx, "Failed to add onugem to kv store")
-		return olterrors.NewErrPersistence("set", "OnuGemInfo", IntfID,
+		return olterrors.NewErrPersistence("set", "OnuGemInfo", uint64(IntfID),
 			log.Fields{"onuGemData": onuGemData, "intfID": IntfID}, err)
 	}
 
@@ -1212,26 +1200,30 @@
 	return gemPort, nil
 }
 
-//DelGemPortPktInOfAllServices deletes the gemports from  pkt in path for all services
-func (RsrcMgr *OpenOltResourceMgr) DelGemPortPktInOfAllServices(ctx context.Context, intfID uint32, onuID uint32, logicalPort uint32) error {
+//DeletePacketInGemPortForOnu deletes the packet-in gemport for ONU
+func (RsrcMgr *OpenOltResourceMgr) DeletePacketInGemPortForOnu(ctx context.Context, intfID uint32, onuID uint32, logicalPort uint32) error {
 
-	//retrieve stored gem port from the store first.
-	Path := fmt.Sprintf(OnuPacketINPathPrefix, intfID, onuID, logicalPort)
-	logger.Debugf(ctx, "getting flows from the path:%s", Path)
-	Value, err := RsrcMgr.KVStore.List(ctx, Path)
+	path := fmt.Sprintf(OnuPacketINPathPrefix, intfID, onuID, logicalPort)
+	value, err := RsrcMgr.KVStore.List(ctx, path)
 	if err != nil {
-		logger.Errorf(ctx, "failed to get flows from kvstore for path %s", Path)
-		return errors.New("failed to get flows from kvstore for path " + Path)
+		logger.Errorf(ctx, "failed-to-read-value-from-path-%s", path)
+		return errors.New("failed-to-read-value-from-path-" + path)
 	}
-	logger.Debugf(ctx, "%d flows retrieved from the path:%s", len(Value), Path)
 
 	//remove them one by one
-	for key := range Value {
+	for key := range value {
+		// Formulate the right key path suffix ti be delete
+		stringToBeReplaced := fmt.Sprintf(BasePathKvStore, RsrcMgr.DeviceID) + "/"
+		replacedWith := ""
+		key = strings.Replace(key, stringToBeReplaced, replacedWith, 1)
+
+		logger.Debugf(ctx, "removing-key-%s", key)
 		if err := RsrcMgr.KVStore.Delete(ctx, key); err != nil {
-			logger.Errorf(ctx, "Falied to remove resource %s", key)
+			logger.Errorf(ctx, "failed-to-remove-resource-%s", key)
 			return err
 		}
 	}
+
 	return nil
 }
 
@@ -1306,7 +1298,7 @@
 }
 
 //UpdateFlowIDsForGem updates flow id per gemport
-func (RsrcMgr *OpenOltResourceMgr) UpdateFlowIDsForGem(ctx context.Context, intf uint32, gem uint32, flowIDs []uint32) error {
+func (RsrcMgr *OpenOltResourceMgr) UpdateFlowIDsForGem(ctx context.Context, intf uint32, gem uint32, flowIDs []uint64) error {
 	var val []byte
 	path := fmt.Sprintf(FlowIDsForGem, intf)
 
@@ -1316,7 +1308,7 @@
 		return err
 	}
 	if flowsForGem == nil {
-		flowsForGem = make(map[uint32][]uint32)
+		flowsForGem = make(map[uint32][]uint64)
 	}
 	flowsForGem[gem] = flowIDs
 	val, err = json.Marshal(flowsForGem)
@@ -1325,8 +1317,6 @@
 		return err
 	}
 
-	RsrcMgr.flowIDToGemInfoLock.Lock()
-	defer RsrcMgr.flowIDToGemInfoLock.Unlock()
 	if err = RsrcMgr.KVStore.Put(ctx, path, val); err != nil {
 		logger.Errorw(ctx, "Failed to put to kvstore", log.Fields{"error": err, "path": path, "value": val})
 		return err
@@ -1358,21 +1348,17 @@
 		return
 	}
 
-	RsrcMgr.flowIDToGemInfoLock.Lock()
-	defer RsrcMgr.flowIDToGemInfoLock.Unlock()
 	if err = RsrcMgr.KVStore.Put(ctx, path, val); err != nil {
 		logger.Errorw(ctx, "Failed to put to kvstore", log.Fields{"error": err, "path": path, "value": val})
 	}
 }
 
 //GetFlowIDsGemMapForInterface gets flowids per gemport and interface
-func (RsrcMgr *OpenOltResourceMgr) GetFlowIDsGemMapForInterface(ctx context.Context, intf uint32) (map[uint32][]uint32, error) {
+func (RsrcMgr *OpenOltResourceMgr) GetFlowIDsGemMapForInterface(ctx context.Context, intf uint32) (map[uint32][]uint64, error) {
 	path := fmt.Sprintf(FlowIDsForGem, intf)
-	var flowsForGem map[uint32][]uint32
+	var flowsForGem map[uint32][]uint64
 	var val []byte
-	RsrcMgr.flowIDToGemInfoLock.RLock()
 	value, err := RsrcMgr.KVStore.Get(ctx, path)
-	RsrcMgr.flowIDToGemInfoLock.RUnlock()
 	if err != nil {
 		logger.Error(ctx, "failed to get data from kv store")
 		return nil, err
@@ -1393,8 +1379,7 @@
 //DeleteIntfIDGempMapPath deletes the intf id path used to store flow ids per gem to kvstore.
 func (RsrcMgr *OpenOltResourceMgr) DeleteIntfIDGempMapPath(ctx context.Context, intf uint32) {
 	path := fmt.Sprintf(FlowIDsForGem, intf)
-	RsrcMgr.flowIDToGemInfoLock.Lock()
-	defer RsrcMgr.flowIDToGemInfoLock.Unlock()
+
 	if err := RsrcMgr.KVStore.Delete(ctx, path); err != nil {
 		logger.Errorw(ctx, "Failed to delete nni interfaces from kv store", log.Fields{"path": path})
 	}
@@ -1538,3 +1523,32 @@
 	}
 	return false, groupInfo, nil
 }
+
+// toByte converts an interface value to a []byte.  The interface should either be of
+// a string type or []byte.  Otherwise, an error is returned.
+func toByte(value interface{}) ([]byte, error) {
+	switch t := value.(type) {
+	case []byte:
+		return value.([]byte), nil
+	case string:
+		return []byte(value.(string)), nil
+	default:
+		return nil, fmt.Errorf("unexpected-type-%T", t)
+	}
+}
+
+func checkForFlowIDInList(FlowIDList []uint64, FlowID uint64) (bool, uint64) {
+	/*
+	   Check for a flow id in a given list of flow IDs.
+	   :param FLowIDList: List of Flow IDs
+	   :param FlowID: Flowd to check in the list
+	   : return true and the index if present false otherwise.
+	*/
+
+	for idx := range FlowIDList {
+		if FlowID == FlowIDList[idx] {
+			return true, uint64(idx)
+		}
+	}
+	return false, 0
+}
diff --git a/internal/pkg/resourcemanager/resourcemanager_test.go b/internal/pkg/resourcemanager/resourcemanager_test.go
index 562bc08..fd69e94 100644
--- a/internal/pkg/resourcemanager/resourcemanager_test.go
+++ b/internal/pkg/resourcemanager/resourcemanager_test.go
@@ -27,13 +27,13 @@
 	"context"
 	"encoding/json"
 	"errors"
-	"github.com/opencord/voltha-lib-go/v3/pkg/db"
-	"github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore"
-	fu "github.com/opencord/voltha-lib-go/v3/pkg/flows"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	ponrmgr "github.com/opencord/voltha-lib-go/v3/pkg/ponresourcemanager"
-	ofp "github.com/opencord/voltha-protos/v3/go/openflow_13"
-	"github.com/opencord/voltha-protos/v3/go/openolt"
+	"github.com/opencord/voltha-lib-go/v4/pkg/db"
+	"github.com/opencord/voltha-lib-go/v4/pkg/db/kvstore"
+	fu "github.com/opencord/voltha-lib-go/v4/pkg/flows"
+	"github.com/opencord/voltha-lib-go/v4/pkg/log"
+	ponrmgr "github.com/opencord/voltha-lib-go/v4/pkg/ponresourcemanager"
+	ofp "github.com/opencord/voltha-protos/v4/go/openflow_13"
+	"github.com/opencord/voltha-protos/v4/go/openolt"
 	"reflect"
 	"strconv"
 	"strings"
@@ -315,55 +315,6 @@
 	}
 }
 
-func TestOpenOltResourceMgr_FreeFlowID(t *testing.T) {
-	type args struct {
-		IntfID uint32
-		onuID  int32
-		uniID  int32
-		FlowID uint32
-	}
-	tests := []struct {
-		name   string
-		fields *fields
-		args   args
-	}{
-		{"FreeFlowID-1", getResMgr(), args{1, 2, 2, 2}},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			RsrcMgr := testResMgrObject(tt.fields)
-			ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
-			defer cancel()
-			RsrcMgr.FreeFlowID(ctx, tt.args.IntfID, tt.args.onuID, tt.args.uniID, tt.args.FlowID)
-		})
-	}
-}
-
-func TestOpenOltResourceMgr_FreeFlowIDs(t *testing.T) {
-
-	type args struct {
-		IntfID uint32
-		onuID  uint32
-		uniID  uint32
-		FlowID []uint32
-	}
-	tests := []struct {
-		name   string
-		fields *fields
-		args   args
-	}{
-		{"FreeFlowIDs-1", getResMgr(), args{1, 2, 2, []uint32{1, 2}}},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			RsrcMgr := testResMgrObject(tt.fields)
-			ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
-			defer cancel()
-			RsrcMgr.FreeFlowIDs(ctx, tt.args.IntfID, tt.args.onuID, tt.args.uniID, tt.args.FlowID)
-		})
-	}
-}
-
 func TestOpenOltResourceMgr_FreePONResourcesForONU(t *testing.T) {
 	type args struct {
 		intfID uint32
@@ -473,16 +424,20 @@
 		name   string
 		fields *fields
 		args   args
-		want   []uint32
+		want   []uint64
 	}{
-		{"GetCurrentFlowIDsForOnu-1", getResMgr(), args{1, 2, 2}, []uint32{}},
+		{"GetCurrentFlowIDsForOnu-1", getResMgr(), args{1, 2, 2}, []uint64{1, 2}},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			RsrcMgr := testResMgrObject(tt.fields)
 			ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
 			defer cancel()
-			if got := RsrcMgr.GetCurrentFlowIDsForOnu(ctx, tt.args.PONIntfID, tt.args.ONUID, tt.args.UNIID); reflect.TypeOf(got) != reflect.TypeOf(tt.want) {
+			got, err := RsrcMgr.GetCurrentFlowIDsForOnu(ctx, tt.args.PONIntfID, tt.args.ONUID, tt.args.UNIID)
+			if err != nil {
+				t.Errorf("GetCurrentFlowIDsForOnu() returned error")
+			}
+			if reflect.TypeOf(got) != reflect.TypeOf(tt.want) {
 				t.Errorf("GetCurrentFlowIDsForOnu() = %v, want %v", got, tt.want)
 			}
 		})
@@ -515,45 +470,6 @@
 	}
 }
 
-func TestOpenOltResourceMgr_GetFlowID(t *testing.T) {
-
-	type args struct {
-		ponIntfID       uint32
-		ONUID           int32
-		uniID           int32
-		gemportID       uint32
-		flowStoreCookie uint64
-		flowCategory    string
-		vlanVid         uint32
-		vlanPcp         []uint32
-	}
-	tests := []struct {
-		name    string
-		fields  *fields
-		args    args
-		want    uint32
-		wantErr error
-	}{
-		{"GetFlowID-1", getResMgr(), args{1, 2, 2, 2, 2,
-			"HSIA", 33, nil}, 0, errors.New("failed to get flows")},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			RsrcMgr := testResMgrObject(tt.fields)
-			ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
-			defer cancel()
-			got, err := RsrcMgr.GetFlowID(ctx, tt.args.ponIntfID, tt.args.ONUID, tt.args.uniID, tt.args.gemportID, tt.args.flowStoreCookie, tt.args.flowCategory, tt.args.vlanVid, tt.args.vlanPcp...)
-			if err != nil && reflect.TypeOf(err) != reflect.TypeOf(tt.wantErr) {
-				t.Errorf("GetFlowID() error = %v, wantErr %v", err, tt.wantErr)
-				return
-			}
-			if reflect.TypeOf(got) != reflect.TypeOf(tt.want) {
-				t.Errorf("GetFlowID() got = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
-
 func TestOpenOltResourceMgr_GetGEMPortID(t *testing.T) {
 	type args struct {
 		ponPort    uint32
@@ -675,33 +591,6 @@
 	}
 }
 
-func TestOpenOltResourceMgr_IsFlowCookieOnKVStore(t *testing.T) {
-	type args struct {
-		ponIntfID       uint32
-		onuID           int32
-		uniID           int32
-		flowStoreCookie uint64
-	}
-	tests := []struct {
-		name   string
-		fields *fields
-		args   args
-		want   bool
-	}{
-		{"IsFlowCookieOnKVStore-1", getResMgr(), args{1, 2, 2, 2}, false},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			RsrcMgr := testResMgrObject(tt.fields)
-			ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
-			defer cancel()
-			if got := RsrcMgr.IsFlowCookieOnKVStore(ctx, tt.args.ponIntfID, tt.args.onuID, tt.args.uniID, tt.args.flowStoreCookie); got != tt.want {
-				t.Errorf("IsFlowCookieOnKVStore() = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
-
 func TestOpenOltResourceMgr_RemoveMeterIDForOnu(t *testing.T) {
 
 	type args struct {
@@ -795,8 +684,8 @@
 		ponIntfID int32
 		onuID     int32
 		uniID     int32
-		flowID    uint32
-		flowData  *[]FlowInfo
+		flowID    uint64
+		flowData  FlowInfo
 	}
 	tests := []struct {
 		name    string
@@ -804,14 +693,14 @@
 		args    args
 		wantErr error
 	}{
-		{"UpdateFlowIDInfo-1", getResMgr(), args{1, 2, 2, 2, &[]FlowInfo{}}, errors.New("")},
+		{"UpdateFlowIDInfo-1", getResMgr(), args{1, 2, 2, 2, FlowInfo{}}, errors.New("")},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			RsrcMgr := testResMgrObject(tt.fields)
 			ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
 			defer cancel()
-			if err := RsrcMgr.UpdateFlowIDInfo(ctx, tt.args.ponIntfID, tt.args.onuID, tt.args.uniID, tt.args.flowID, tt.args.flowData); err != nil && reflect.TypeOf(err) != reflect.TypeOf(tt.wantErr) {
+			if err := RsrcMgr.UpdateFlowIDInfo(ctx, uint32(tt.args.ponIntfID), tt.args.onuID, tt.args.uniID, tt.args.flowID, tt.args.flowData); err != nil && reflect.TypeOf(err) != reflect.TypeOf(tt.wantErr) {
 				t.Errorf("UpdateFlowIDInfo() error = %v, wantErr %v", err, tt.wantErr)
 			}
 		})
@@ -958,77 +847,6 @@
 	}
 }
 
-func Test_getFlowIDFromFlowInfo(t *testing.T) {
-	type args struct {
-		FlowInfo        *[]FlowInfo
-		flowID          uint32
-		gemportID       uint32
-		flowStoreCookie uint64
-		flowCategory    string
-		vlanVid         uint32
-		vlanPcp         []uint32
-	}
-	flowInfo := &[]FlowInfo{
-		{
-			&openolt.Flow{
-				FlowId:    1,
-				GemportId: 1,
-				Classifier: &openolt.Classifier{
-					OPbits: 1,
-					OVid:   33,
-				},
-				Action: &openolt.Action{
-					Cmd: &openolt.ActionCmd{
-						AddOuterTag: true,
-					},
-					OVid: 7,
-				},
-			},
-			1,
-			"HSIA_FLOW",
-			2000,
-		},
-		{
-			&openolt.Flow{
-				GemportId: 1,
-				Classifier: &openolt.Classifier{
-					OVid: 0,
-				},
-				Action: &openolt.Action{
-					Cmd: &openolt.ActionCmd{
-						TrapToHost: true,
-					},
-				},
-			},
-			1,
-			"EAPOL",
-			3000,
-		},
-	}
-	tests := []struct {
-		name    string
-		args    args
-		wantErr error
-	}{
-		{"getFlowIdFromFlowInfo-1", args{}, errors.New("invalid flow-info")},
-		{"getFlowIdFromFlowInfo-2", args{flowInfo, 1, 1, 1,
-			"HSIA_FLOW", 33, []uint32{1, 2}}, errors.New("invalid flow-info")},
-		{"getFlowIdFromFlowInfo-2", args{flowInfo, 1, 1, 1,
-			"EAPOL", 33, []uint32{1, 2}}, errors.New("invalid flow-info")},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			err := getFlowIDFromFlowInfo(context.Background(), tt.args.FlowInfo, tt.args.flowID, tt.args.gemportID, tt.args.flowStoreCookie, tt.args.flowCategory, tt.args.vlanVid, tt.args.vlanPcp...)
-			if reflect.TypeOf(err) != reflect.TypeOf(tt.wantErr) && err != nil {
-				t.Errorf("getFlowIDFromFlowInfo() error = %v, wantErr %v", err, tt.wantErr)
-			}
-			if err == nil {
-				t.Log("return'd nil")
-			}
-		})
-	}
-}
-
 func Test_newKVClient(t *testing.T) {
 	type args struct {
 		storeType string
