diff --git a/adaptercore/resourcemanager/resourcemanager.go b/adaptercore/resourcemanager/resourcemanager.go
index b7d7737..dc5300a 100755
--- a/adaptercore/resourcemanager/resourcemanager.go
+++ b/adaptercore/resourcemanager/resourcemanager.go
@@ -28,6 +28,7 @@
 	ponrmgr "github.com/opencord/voltha-go/common/ponresourcemanager"
 	"github.com/opencord/voltha-go/db/kvstore"
 	"github.com/opencord/voltha-go/db/model"
+	ofp "github.com/opencord/voltha-protos/go/openflow_13"
 	"github.com/opencord/voltha-protos/go/openolt"
 )
 
@@ -37,6 +38,8 @@
 // BasePathKvStore - service/voltha/openolt/<device_id>
 const BasePathKvStore = "service/voltha/openolt/{%s}"
 
+const TP_ID_PATH_SUFFIX = "tp_id/{%d,%d,%d}"            // tp_id/<(pon_id, onu_id, uni_id)>
+const METER_ID_PATH_SUFFIX = "meter_id/{%d,%d,%d}/{%s}" // meter_id/<(pon_id, onu_id, uni_id)>/<direction>
 // FlowInfo holds the flow information
 type FlowInfo struct {
 	Flow            *openolt.Flow
@@ -58,7 +61,7 @@
 	ResourceMgrs map[uint32]*ponrmgr.PONResourceManager
 }
 
-func newKVClient(storeType, address string, timeout uint32) (kvstore.Client, error) {
+func newKVClient(storeType string, address string, timeout uint32) (kvstore.Client, error) {
 	log.Infow("kv-store-type", log.Fields{"store": storeType})
 	switch storeType {
 	case "consul":
@@ -413,8 +416,9 @@
 
 // GetFlowID return flow ID for a given pon interface id, onu id and uni id
 func (RsrcMgr *OpenOltResourceMgr) GetFlowID(ponIntfID uint32, ONUID uint32, uniID uint32,
+	gemportID uint32,
 	flowStoreCookie uint64,
-	flowCategory string) (uint32, error) {
+	flowCategory string, vlanPcp ...uint32) (uint32, error) {
 
 	var err error
 	FlowPath := fmt.Sprintf("%d,%d,%d", ponIntfID, ONUID, uniID)
@@ -425,13 +429,18 @@
 			FlowInfo := RsrcMgr.GetFlowIDInfo(ponIntfID, ONUID, uniID, uint32(flowID))
 			if FlowInfo != nil {
 				for _, Info := range *FlowInfo {
-					if flowCategory != "" && Info.FlowCategory == flowCategory {
-						log.Debug("Found flow matching with flow category", log.Fields{"flowId": flowID, "flowCategory": flowCategory})
-						return flowID, nil
+					if int32(gemportID) == Info.Flow.GemportId && flowCategory != "" && Info.FlowCategory == flowCategory {
+						log.Debug("Found flow matching with flow catagory", log.Fields{"flowId": flowID, "FlowCategory": flowCategory})
+						if Info.FlowCategory == "HSIA_FLOW" && Info.Flow.Classifier.OPbits == vlanPcp[0] {
+							log.Debug("Found matching vlan pcp ", log.Fields{"flowId": flowID, "Vlanpcp": vlanPcp[0]})
+							return flowID, nil
+						}
 					}
-					if flowStoreCookie != 0 && Info.FlowStoreCookie == flowStoreCookie {
-						log.Debug("Found flow matching with flowStore cookie", log.Fields{"flowId": flowID, "flowStoreCookie": flowStoreCookie})
-						return flowID, nil
+					if int32(gemportID) == Info.Flow.GemportId && flowStoreCookie != 0 && Info.FlowStoreCookie == flowStoreCookie {
+						if flowCategory != "" && Info.FlowCategory == flowCategory {
+							log.Debug("Found flow matching with flow catagory", log.Fields{"flowId": flowID, "FlowCategory": flowCategory})
+							return flowID, nil
+						}
 					}
 				}
 			}
@@ -694,3 +703,109 @@
 	}
 	return false
 }
+
+func (RMgr *OpenOltResourceMgr) GetTechProfileIdForOnu(IntfId uint32, OnuId uint32, UniId uint32) uint32 {
+	Path := fmt.Sprintf(TP_ID_PATH_SUFFIX, IntfId, OnuId, UniId)
+	var Data uint32
+	Value, err := RMgr.KVStore.Get(Path)
+	if err == nil {
+		if Value != nil {
+			Val, err := kvstore.ToByte(Value.Value)
+			if err != nil {
+				log.Errorw("Failed to convert into byte array", log.Fields{"error": err})
+				return Data
+			}
+			if err = json.Unmarshal(Val, &Data); err != nil {
+				log.Error("Failed to unmarshal", log.Fields{"error": err})
+				return Data
+			}
+		}
+	} else {
+		log.Errorf("Failed to get TP id from kvstore for path %s", Path)
+	}
+	log.Debugf("Getting TP id %d from path %s", Data, Path)
+	return Data
+
+}
+
+func (RMgr *OpenOltResourceMgr) RemoveTechProfileIdForOnu(IntfId uint32, OnuId uint32, UniId uint32) error {
+	IntfOnuUniId := fmt.Sprintf(TP_ID_PATH_SUFFIX, IntfId, OnuId, UniId)
+	if err := RMgr.KVStore.Delete(IntfOnuUniId); err != nil {
+		log.Error("Failed to delete techprofile id resource %s in KV store", IntfOnuUniId)
+		return err
+	}
+	return nil
+}
+
+func (RMgr *OpenOltResourceMgr) UpdateTechProfileIdForOnu(IntfId uint32, OnuId uint32,
+	UniId uint32, TpId uint32) error {
+	var Value []byte
+	var err error
+
+	IntfOnuUniId := fmt.Sprintf(TP_ID_PATH_SUFFIX, IntfId, OnuId, UniId)
+	log.Debugf("updating tp id %d on path %s", TpId, IntfOnuUniId)
+	Value, err = json.Marshal(TpId)
+	if err != nil {
+		log.Error("failed to Marshal")
+		return err
+	}
+	if err = RMgr.KVStore.Put(IntfOnuUniId, Value); err != nil {
+		log.Errorf("Failed to update resource %s", IntfOnuUniId)
+		return err
+	}
+	return err
+}
+
+func (RMgr *OpenOltResourceMgr) UpdateMeterIdForOnu(Direction string, IntfId uint32, OnuId uint32,
+	UniId uint32, MeterConfig *ofp.OfpMeterConfig) error {
+	var Value []byte
+	var err error
+
+	IntfOnuUniId := fmt.Sprintf(METER_ID_PATH_SUFFIX, IntfId, OnuId, UniId, Direction)
+	Value, err = json.Marshal(*MeterConfig)
+	if err != nil {
+		log.Error("failed to Marshal meter config")
+		return err
+	}
+	if err = RMgr.KVStore.Put(IntfOnuUniId, Value); err != nil {
+		log.Errorf("Failed to store meter into KV store %s", IntfOnuUniId)
+		return err
+	}
+	return err
+}
+
+func (RMgr *OpenOltResourceMgr) GetMeterIdForOnu(Direction string, IntfId uint32, OnuId uint32, UniId uint32) (*ofp.OfpMeterConfig, error) {
+	Path := fmt.Sprintf(METER_ID_PATH_SUFFIX, IntfId, OnuId, UniId, Direction)
+	var meterConfig ofp.OfpMeterConfig
+	Value, err := RMgr.KVStore.Get(Path)
+	if err == nil {
+		if Value != nil {
+			log.Debug("Found meter in KV store", log.Fields{"Direction": Direction})
+			Val, err := kvstore.ToByte(Value.Value)
+			if err != nil {
+				log.Errorw("Failed to convert into byte array", log.Fields{"error": err})
+				return nil, err
+			}
+			if err = json.Unmarshal(Val, &meterConfig); err != nil {
+				log.Error("Failed to unmarshal meterconfig", log.Fields{"error": err})
+				return nil, err
+			}
+		} else {
+			log.Debug("meter-does-not-exists-in-KVStore")
+			return nil, err
+		}
+	} else {
+		log.Errorf("Failed to get Meter config from kvstore for path %s", Path)
+
+	}
+	return &meterConfig, err
+}
+
+func (RMgr *OpenOltResourceMgr) RemoveMeterIdForOnu(Direction string, IntfId uint32, OnuId uint32, UniId uint32) error {
+	Path := fmt.Sprintf(METER_ID_PATH_SUFFIX, IntfId, OnuId, UniId, Direction)
+	if err := RMgr.KVStore.Delete(Path); err != nil {
+		log.Errorf("Failed to delete meter id %s from kvstore ", Path)
+		return err
+	}
+	return nil
+}
