diff --git a/database/common.go b/database/common.go
new file mode 100644
index 0000000..653fccc
--- /dev/null
+++ b/database/common.go
@@ -0,0 +1,147 @@
+/*
+* Copyright 2022-present Open Networking Foundation
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+// This implementation of database assumes that it is working for
+// Open ONU adapter. Thus, it assumes some base path for all the
+// database operations. For all database operations, the key passed is
+// added to the database base path.
+
+package database
+
+import "fmt"
+
+const (
+	// PresentVersion represnts the Present version
+	// Modify this as we give Major version releases
+	PresentVersion = "v1"
+	// PreviousVersion represnts the Previous version
+	PreviousVersion = "v1"
+)
+
+//These are present path where different database elements are store in database
+//In case any of these paths change, update the present and previous version
+const (
+	BasePath               string = "service/vgc/%s/"
+	ServicePath            string = "services/"
+	DevicePath             string = "devices/%s/"
+	DevicePortPath         string = DevicePath + "ports/"
+	DeviceFlowPath         string = DevicePath + "flows/"
+	DeviceGroupPath        string = DevicePath + "groups/"
+	DeviceMeterPath        string = DevicePath + "meters/"
+	VnetPath               string = "vnets/"
+	VpvPath                string = "vpvs/"
+	MvlanPath              string = "mvlans/"
+	MeterPath              string = "meters/"
+	IgmpConfPath           string = "igmp/conf/"
+	IgmpGroupPath          string = "igmp/groups/"
+	IgmpDevicePath         string = "igmp/devices/"
+	IgmpChannelPath        string = "igmp/channels/"
+	IgmpPortPath           string = "igmp/ports/"
+	IgmpProfPath           string = "igmp/prof/"
+	McastConfigPath        string = "igmp/mcastconfig/"
+	MigrationInfoPath      string = "data/migration/"
+	LogLevelPath           string = "log-level/"
+	HealthPath             string = "health/"
+	PonCounterPath         string = "pon-counter/"
+	OltIgmpCounterPath     string = "olt-igmp-counter/"
+	ChannelCounterPath     string = "channel-counter/"
+	ServiceCounterPath     string = "service-counter/"
+	NbDevicePath           string = "nb-device/"
+	DeviceFlowHashPath     string = DevicePath + "flowhash"
+	PortAlarmProfilePath   string = "port-alarm-profile/"
+	PortAlarmDataPath      string = DevicePortPath + "portalarmdata/"
+	SubAlarmDataPath       string = DevicePath + "sub-alarm-data/"
+	ServicesMigrateReqPath string = DevicePath + "migrateServicesReq/"
+)
+
+//PresentVersionMap - map of present version for all database tables
+var PresentVersionMap = map[string]string{
+	ServicePath:            "v3",
+	DevicePath:             "v1",
+	DevicePortPath:         "v1",
+	DeviceFlowPath:         "v1",
+	DeviceGroupPath:        "v1",
+	DeviceMeterPath:        "v1",
+	VnetPath:               "v3",
+	VpvPath:                "v3",
+	MvlanPath:              "v3",
+	MeterPath:              "v1",
+	IgmpConfPath:           "v2",
+	IgmpGroupPath:          "v1",
+	IgmpDevicePath:         "v1",
+	IgmpChannelPath:        "v1",
+	IgmpPortPath:           "v1",
+	IgmpProfPath:           "v1",
+	McastConfigPath:        "v1",
+	MigrationInfoPath:      "v1",
+	LogLevelPath:           "v1",
+	HealthPath:             "v1",
+	PonCounterPath:         "v1",
+	OltIgmpCounterPath:     "v1",
+	ChannelCounterPath:     "v1",
+	ServiceCounterPath:     "v1",
+	NbDevicePath:           "v1",
+	DeviceFlowHashPath:     "v1",
+	PortAlarmProfilePath:   "v1",
+	PortAlarmDataPath:      "v1",
+	SubAlarmDataPath:       "v1",
+	ServicesMigrateReqPath: "v1",
+}
+
+//PreviousVersionMap - map of previous version for all database tables
+var PreviousVersionMap = map[string]string{
+	ServicePath:            "v2",
+	DevicePath:             "v1",
+	DevicePortPath:         "v1",
+	DeviceFlowPath:         "v1",
+	DeviceGroupPath:        "v1",
+	DeviceMeterPath:        "v1",
+	VnetPath:               "v2",
+	VpvPath:                "v2",
+	MvlanPath:              "v2",
+	MeterPath:              "v1",
+	IgmpConfPath:           "v1",
+	IgmpGroupPath:          "v1",
+	IgmpDevicePath:         "v1",
+	IgmpChannelPath:        "v1",
+	IgmpPortPath:           "v1",
+	IgmpProfPath:           "v1",
+	McastConfigPath:        "v1",
+	MigrationInfoPath:      "v1",
+	LogLevelPath:           "v1",
+	HealthPath:             "v1",
+	PonCounterPath:         "v1",
+	OltIgmpCounterPath:     "v1",
+	ChannelCounterPath:     "v1",
+	ServiceCounterPath:     "v1",
+	NbDevicePath:           "v1",
+	DeviceFlowHashPath:     "v1",
+	PortAlarmProfilePath:   "v1",
+	PortAlarmDataPath:      "v1",
+	SubAlarmDataPath:       "v1",
+	ServicesMigrateReqPath: "v1",
+}
+
+//DBVersionMap - Version of tables present in DB
+var DBVersionMap = PreviousVersionMap
+
+// GetModuleKeypath returns the DB keypath for particular module along with version
+func GetModuleKeypath(key, ver string) string {
+	return fmt.Sprintf(BasePath, ver) + key
+}
+
+// GetKeyPath returns the base path for the given key along with version
+func GetKeyPath(key string) string {
+	return fmt.Sprintf(BasePath, PresentVersionMap[key]) + key
+}
diff --git a/database/database.go b/database/database.go
new file mode 100644
index 0000000..11040b0
--- /dev/null
+++ b/database/database.go
@@ -0,0 +1,1048 @@
+/*
+* Copyright 2022-present Open Networking Foundation
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+// This implementation of database assumes that it is working for
+// Open ONU adapter. Thus, it assumes some base path for all the
+// database operations. For all database operations, the key passed is
+// added to the database base path.
+
+package database
+
+import (
+	"context"
+	"errors"
+	"net"
+	"strconv"
+	"time"
+	"fmt"
+
+	"voltha-go-controller/internal/pkg/of"
+	"github.com/opencord/voltha-lib-go/v7/pkg/db/kvstore"
+	"github.com/opencord/voltha-lib-go/v7/pkg/log"
+)
+
+var logger log.CLogger
+var ctx = context.TODO()
+
+// Database structure
+type Database struct {
+	storeType string
+	address   string
+	//timeout   uint32
+	kvc       kvstore.Client
+}
+
+// Initialize the database module. The database module runs as a singleton
+// object and is initialized when the adapter is created.
+func Initialize(storeType string, address string, timeout int) (*Database, error) {
+	var err error
+	var database Database
+	logger.Infow(ctx, "kv-store-type", log.Fields{"store": storeType})
+	database.address = address
+	database.storeType = storeType
+	switch storeType {
+	case "redis":
+		database.kvc, err = kvstore.NewRedisClient(address, time.Duration(timeout), false)
+		return &database, err
+	}
+	return &database, errors.New("unsupported-kv-store")
+}
+
+// Utility function that retrieves value for a key. It is assumed that
+// the information is always a string and the data retrieved is returned
+// as a string
+
+// Put to add value to database
+func (db *Database) Put(fullKeyPath, value string) error {
+	return db.kvc.Put(context.Background(), fullKeyPath, value)
+}
+
+// Get to retrieve value from database
+func (db *Database) Get(key string) (string, error) {
+	kv, err := db.kvc.Get(context.Background(), key)
+	if err != nil {
+		return "", err
+	}
+	if kv != nil {
+		return string(kv.Value.([]byte)), nil
+	}
+	return "", errors.New("Value not found")
+}
+
+// Del to delete value from database
+func (db *Database) Del(fullPath string) error {
+	if err := db.kvc.Delete(context.Background(), fullPath); err != nil {
+		logger.Errorf(ctx, "The path doesn't exist", log.Fields{"key": fullPath, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// DeleteAll to delete all value from database
+func (db *Database) DeleteAll(fullPath string) error {
+	if err := db.kvc.DeleteWithPrefix(context.Background(), fullPath); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": fullPath, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// DeleteAllUnderHashKey to delete all values under hash key
+func (db *Database) DeleteAllUnderHashKey(hashKeyPrefix string) error {
+	if err := db.kvc.Delete(context.Background(), hashKeyPrefix); err != nil {
+		logger.Errorf(ctx, "The key path doesn't exist", log.Fields{"key": hashKeyPrefix, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// List to list the values
+func (db *Database) List(key string) (map[string]*kvstore.KVPair, error) {
+	kv, err := db.kvc.List(context.Background(), key)
+	if err != nil {
+		return nil, err
+	}
+	if kv != nil {
+		return kv, nil
+	}
+	return nil, errors.New("Value not found")
+}
+
+// OLT specific database items
+
+// GetOlt to get olt info
+func (db *Database) GetOlt(deviceID string) (string, error) {
+	key := fmt.Sprintf(GetKeyPath(DevicePath), deviceID)
+	return db.Get(key)
+}
+
+// PutOlt to add olt info
+func (db *Database) PutOlt(deviceID string, value string) error {
+	key := fmt.Sprintf(GetKeyPath(DevicePath), deviceID)
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelOlt to delete olt info
+func (db *Database) DelOlt(deviceID string) error {
+	key := fmt.Sprintf(GetKeyPath(DevicePath), deviceID)
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// Flows specific database actions
+
+// PutFlow to add flow
+func (db *Database) PutFlow(deviceID string, flowID uint64, value string) error {
+	key := fmt.Sprintf(GetKeyPath(DeviceFlowPath), deviceID) + strconv.FormatUint(flowID, 10)
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// GetFlow to get flow
+func (db *Database) GetFlow(deviceID string, flowID uint64) (string, error) {
+	key := fmt.Sprintf(GetKeyPath(DeviceFlowPath), deviceID) + strconv.FormatUint(flowID, 10)
+	return db.Get(key)
+}
+
+// GetFlows to get multiple flows
+func (db *Database) GetFlows(deviceID string) (map[string]*kvstore.KVPair, error) {
+	key := fmt.Sprintf(GetKeyPath(DeviceFlowPath), deviceID)
+	return db.List(key)
+}
+
+// DelFlow to delete flow
+func (db *Database) DelFlow(deviceID string, flowID uint64) error {
+	key := fmt.Sprintf(GetKeyPath(DeviceFlowPath), deviceID) + strconv.FormatUint(flowID, 10)
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// Group specific database actions
+
+// PutGroup to add group info
+func (db *Database) PutGroup(deviceID string, groupID uint32, value string) error {
+	key := fmt.Sprintf(GetKeyPath(DeviceGroupPath), deviceID) + strconv.FormatUint(uint64(groupID), 10)
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// GetGroup to get group info
+func (db *Database) GetGroup(deviceID string, groupID uint32) (string, error) {
+	key := fmt.Sprintf(GetKeyPath(DeviceGroupPath), deviceID) + strconv.FormatUint(uint64(groupID), 10)
+	return db.Get(key)
+}
+
+// GetGroups to get multiple group info
+func (db *Database) GetGroups(deviceID string) (map[string]*kvstore.KVPair, error) {
+	key := fmt.Sprintf(GetKeyPath(DeviceGroupPath), deviceID)
+	logger.Infow(ctx, "key", log.Fields{"Key": key})
+	return db.List(key)
+}
+
+// DelGroup to delete group info
+func (db *Database) DelGroup(deviceID string, groupID uint32) error {
+	key := fmt.Sprintf(GetKeyPath(DeviceGroupPath), deviceID) + strconv.FormatUint(uint64(groupID), 10)
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// DelAllGroup to delete all group info
+func (db *Database) DelAllGroup(deviceID string) error {
+	key := fmt.Sprintf(GetKeyPath(DeviceGroupPath), deviceID)
+	if err := db.DeleteAllUnderHashKey(key); err != nil {
+		logger.Warnf(ctx, "Delete All failed: The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	logger.Infow(ctx, "Deleting all the groups for device", log.Fields{"device": deviceID})
+	return nil
+}
+
+// DelAllPorts to delete all ports info
+func (db *Database) DelAllPorts(device string) error {
+	key := fmt.Sprintf(GetKeyPath(DevicePortPath), device)
+	if err := db.DeleteAllUnderHashKey(key); err != nil {
+		logger.Warnf(ctx, "Delete All failed: The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	logger.Infow(ctx, "Deleting all the ports for device", log.Fields{"device": device})
+	return nil
+}
+
+// Ports specific database actions
+
+// PutPort to add port info
+func (db *Database) PutPort(deviceID string, portID uint32, value string) error {
+	key := fmt.Sprintf(GetKeyPath(DevicePortPath), deviceID) + strconv.FormatUint(uint64(portID), 10)
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// GetPort to get port info
+func (db *Database) GetPort(deviceID string, portID uint32) (string, error) {
+	key := fmt.Sprintf(GetKeyPath(DevicePortPath), deviceID) + strconv.FormatUint(uint64(portID), 10)
+	return db.Get(key)
+}
+
+// GetPorts to get multiple ports info
+func (db *Database) GetPorts(deviceID string) (map[string]*kvstore.KVPair, error) {
+	key := fmt.Sprintf(GetKeyPath(DevicePortPath), deviceID)
+	return db.List(key)
+}
+
+// DelPort to delete port info
+func (db *Database) DelPort(deviceID string, portID uint32) error {
+	key := fmt.Sprintf(GetKeyPath(DevicePortPath), deviceID) + strconv.FormatUint(uint64(portID), 10)
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// Device meter specific database actions
+
+// PutDeviceMeter to add device meter info
+func (db *Database) PutDeviceMeter(deviceID string, meterID uint32, value string) error {
+	key := fmt.Sprintf(GetKeyPath(DeviceMeterPath), deviceID) + strconv.FormatUint(uint64(meterID), 10)
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// GetDeviceMeter to get device meter info
+func (db *Database) GetDeviceMeter(deviceID string, meterID uint32) (string, error) {
+	key := fmt.Sprintf(GetKeyPath(DeviceMeterPath), deviceID) + strconv.FormatUint(uint64(meterID), 10)
+	return db.Get(key)
+}
+
+// GetDeviceMeters to get multiple device meter info
+func (db *Database) GetDeviceMeters(deviceID string) (map[string]*kvstore.KVPair, error) {
+	key := fmt.Sprintf(GetKeyPath(DeviceMeterPath), deviceID)
+	return db.List(key)
+}
+
+// DelDeviceMeter to delete device meter info
+func (db *Database) DelDeviceMeter(deviceID string, meterID uint32) error {
+	key := fmt.Sprintf(GetKeyPath(DeviceMeterPath), deviceID) + strconv.FormatUint(uint64(meterID), 10)
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// Service specific database actions
+
+// GetServices to get multiple services info
+func (db *Database) GetServices() (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(ServicePath)
+	return db.List(key)
+}
+
+// GetService to get service info
+func (db *Database) GetService(name string) (string, error) {
+	key := GetKeyPath(ServicePath) + name
+	return db.Get(key)
+}
+
+// PutService to add service info
+func (db *Database) PutService(name string, value string) error {
+	key := GetKeyPath(ServicePath) + name
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelService to delete service info
+func (db *Database) DelService(name string) error {
+	key := GetKeyPath(ServicePath) + name
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// Virtual networks specific database actions
+
+// GetVnets to get multiple vnets info
+func (db *Database) GetVnets() (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(VnetPath)
+	return db.List(key)
+}
+
+// GetVnet to get vnet info
+func (db *Database) GetVnet(name string) (string, error) {
+	key := GetKeyPath(VnetPath) + name
+	return db.Get(key)
+}
+
+// PutVnet to add vnet info
+func (db *Database) PutVnet(name string, value string) error {
+	key := GetKeyPath(VnetPath) + name
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelVnet to delete vnet info
+func (db *Database) DelVnet(name string) error {
+	key := GetKeyPath(VnetPath) + name
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// Virtual networks on ports specific database actions
+
+// GetVpvs to get multiple vpvs info
+func (db *Database) GetVpvs() (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(VpvPath)
+	return db.List(key)
+}
+
+// GetVpv to get vpv info
+func (db *Database) GetVpv(port string, SVlan uint16, CVlan uint16, UniVlan uint16) (string, error) {
+	name := port + fmt.Sprintf("-%v-%v-%v", SVlan, CVlan, UniVlan)
+	key := GetKeyPath(VpvPath) + name
+	return db.Get(key)
+}
+
+// PutVpv to add vpv info
+func (db *Database) PutVpv(port string, SVlan uint16, CVlan uint16, UniVlan uint16, value string) error {
+	name := port + fmt.Sprintf("-%v-%v-%v", SVlan, CVlan, UniVlan)
+	key := GetKeyPath(VpvPath) + name
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelVpv to delete vpv info
+func (db *Database) DelVpv(port string, SVlan uint16, CVlan uint16, UniVlan uint16) error {
+	name := port + fmt.Sprintf("-%v-%v-%v", SVlan, CVlan, UniVlan)
+	key := GetKeyPath(VpvPath) + name
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// Virtual networks on ports specific database actions
+
+// GetMvlans to get multiple mvlans info
+func (db *Database) GetMvlans() (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(MvlanPath)
+	return db.List(key)
+}
+
+// GetMvlan to get mvlan info
+func (db *Database) GetMvlan(mvlan uint16) (string, error) {
+	name := strconv.FormatInt(int64(mvlan), 10)
+	key := GetKeyPath(MvlanPath) + name
+	return db.Get(key)
+}
+
+// PutMvlan to add mvlan info
+func (db *Database) PutMvlan(mvlan uint16, value string) error {
+	name := strconv.FormatInt(int64(mvlan), 10)
+	key := GetKeyPath(MvlanPath) + name
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelMvlan to delete mvlan info
+func (db *Database) DelMvlan(mvlan uint16) error {
+	name := strconv.FormatInt(int64(mvlan), 10)
+	key := GetKeyPath(MvlanPath) + name
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// database specific actions on IGMP config
+
+// DelIGMPCfg to delete icmp config
+func (db *Database) DelIGMPCfg() error {
+	key := GetKeyPath(IgmpConfPath)
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// database specific actions on IGMP Profile
+
+// GetIgmpProfiles to get multiple igmp profile info
+func (db *Database) GetIgmpProfiles() (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(IgmpProfPath)
+	return db.List(key)
+}
+
+// GetIgmpProfile to get igmp profile info
+func (db *Database) GetIgmpProfile(name string) (string, error) {
+	key := GetKeyPath(IgmpProfPath) + name
+	return db.Get(key)
+}
+
+// PutIgmpProfile to put igmp profile info
+func (db *Database) PutIgmpProfile(name string, value string) error {
+	key := GetKeyPath(IgmpProfPath) + name
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelIgmpProfile to delete igmp profile
+func (db *Database) DelIgmpProfile(name string) error {
+	key := GetKeyPath(IgmpProfPath) + name
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// database specific actions on Mcast config Info
+
+// GetMcastConfigs to get multiple mcast config info
+func (db *Database) GetMcastConfigs() (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(McastConfigPath)
+	return db.List(key)
+}
+
+// GetMcastConfig to get igmp profile info
+func (db *Database) GetMcastConfig(name string) (string, error) {
+	key := GetKeyPath(McastConfigPath) + name
+	return db.Get(key)
+}
+
+// PutMcastConfig to put igmp profile info
+func (db *Database) PutMcastConfig(name string, value string) error {
+	key := GetKeyPath(McastConfigPath) + name
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelMcastConfig to delete igmp profile
+func (db *Database) DelMcastConfig(name string) error {
+	key := GetKeyPath(McastConfigPath) + name
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// database specific actions on health
+
+// GetHealth to get health info
+func (db *Database) GetHealth() (string, error) {
+	key := GetKeyPath(HealthPath)
+	return db.Get(key)
+}
+
+// PutHealth to add health info
+func (db *Database) PutHealth(value string) error {
+	key := GetKeyPath(HealthPath)
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelHealth to delete health info
+func (db *Database) DelHealth() error {
+	key := GetKeyPath(HealthPath)
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// Meters
+
+// GetMeters to get multiple meters info
+func (db *Database) GetMeters() (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(MeterPath)
+	return db.List(key)
+}
+
+// GetMeter to get meter info
+func (db *Database) GetMeter(name string) (string, error) {
+	key := GetKeyPath(MeterPath) + name
+	return db.Get(key)
+}
+
+// PutMeter to add meter info
+func (db *Database) PutMeter(name string, value string) error {
+	key := GetKeyPath(MeterPath) + name
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelMeter to delete meter info
+func (db *Database) DelMeter(name string) error {
+	key := GetKeyPath(MeterPath) + name
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// DelAllMeter to delete meter info
+func (db *Database) DelAllMeter(device string) error {
+	key := GetKeyPath(DevicePath) + device + "/" + MeterPath
+	if err := db.DeleteAllUnderHashKey(key); err != nil {
+		logger.Warnf(ctx, "Delete All failed: The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	logger.Infow(ctx, "Deleting all the meters for device", log.Fields{"device": device})
+	return nil
+}
+
+// IGMP groups
+
+// GetIgmpGroups to get multiple igmp groups info
+func (db *Database) GetIgmpGroups() (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(IgmpGroupPath)
+	return db.List(key)
+}
+
+// GetIgmpGroup to get igmp group info
+func (db *Database) GetIgmpGroup(id string) (string, error) {
+	key := GetKeyPath(IgmpGroupPath) + id
+	return db.Get(key)
+}
+
+// PutIgmpGroup to add igmp group info
+func (db *Database) PutIgmpGroup(id string, value string) error {
+	key := GetKeyPath(IgmpGroupPath) + id
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelIgmpGroup to delete igmp group info
+func (db *Database) DelIgmpGroup(id string) error {
+	key := GetKeyPath(IgmpGroupPath) + id
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Warnf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// IGMP group devices
+
+// GetAllIgmpDevices to get multiple igmp devices info
+func (db *Database) GetAllIgmpDevices() (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(IgmpDevicePath)
+	return db.List(key)
+}
+
+// GetPrevIgmpDevices to get previous igmp devices
+func (db *Database) GetPrevIgmpDevices(mvlan of.VlanType, gid string) (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(IgmpDevicePath) + mvlan.String() + "/" + gid + "/"
+	return db.List(key)
+}
+
+// GetIgmpDevices to get igmp devices
+func (db *Database) GetIgmpDevices(mvlan of.VlanType, gid string, gip net.IP) (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(IgmpDevicePath) + mvlan.String() + "/" + gid + "/" + gip.String() + "/"
+	return db.List(key)
+}
+
+// GetIgmpDevice to get igmp device
+func (db *Database) GetIgmpDevice(mvlan of.VlanType, gid string, gip net.IP, device string) (string, error) {
+	key := GetKeyPath(IgmpDevicePath) + mvlan.String() + "/" + gid + "/" + gip.String() + "/" + device
+	return db.Get(key)
+}
+
+// PutIgmpDevice to add igmp device
+func (db *Database) PutIgmpDevice(mvlan of.VlanType, gid string, gip net.IP, device string, value string) error {
+	key := GetKeyPath(IgmpDevicePath) + mvlan.String() + "/" + gid + "/" + gip.String() + "/" + device
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelIgmpDevice to delete igmp device
+func (db *Database) DelIgmpDevice(mvlan of.VlanType, gid string, gip net.IP, device string) error {
+	key := GetKeyPath(IgmpDevicePath) + mvlan.String() + "/" + gid + "/" + gip.String() + "/" + device
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Warnf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// IGMP group channels
+
+// GetAllIgmpChannels to get all igmp channels
+func (db *Database) GetAllIgmpChannels() (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(IgmpChannelPath)
+	return db.List(key)
+}
+
+// GetPrevIgmpChannels to get previous igmp channels
+func (db *Database) GetPrevIgmpChannels(gName, device string) (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(IgmpChannelPath) + gName + "/" + device + "/"
+	return db.List(key)
+}
+
+// GetIgmpChannels to get multiple igmp channels
+func (db *Database) GetIgmpChannels(mvlan of.VlanType, gName, device string) (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(IgmpChannelPath) + mvlan.String() + "/" + gName + "/" + device + "/"
+	return db.List(key)
+}
+
+// GetIgmpChannel to get igmp channel
+func (db *Database) GetIgmpChannel(mvlan of.VlanType, gName string, device string, gip net.IP) (string, error) {
+	key := GetKeyPath(IgmpChannelPath) + mvlan.String() + "/" + gName + "/" + device + "/" + gip.String()
+	return db.Get(key)
+}
+
+// PutIgmpChannel to add igmp channel info
+func (db *Database) PutIgmpChannel(mvlan of.VlanType, gName string, device string, gip net.IP, value string) error {
+	key := GetKeyPath(IgmpChannelPath) + mvlan.String() + "/" + gName + "/" + device + "/" + gip.String()
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelIgmpChannel to delete igmp channel info
+func (db *Database) DelIgmpChannel(mvlan of.VlanType, gName string, device string, gip net.IP) error {
+	key := GetKeyPath(IgmpChannelPath) + mvlan.String() + "/" + gName + "/" + device + "/" + gip.String()
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Warnf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// IGMP group receivers
+
+// GetAllIgmpRcvrs to get all igmp receivers info
+func (db *Database) GetAllIgmpRcvrs() (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(IgmpPortPath)
+	return db.List(key)
+}
+
+// GetPrevIgmpRcvrs to get previous igmp receivers info
+func (db *Database) GetPrevIgmpRcvrs(gip net.IP, device string) (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(IgmpPortPath) + gip.String() + "/" + device + "/"
+	return db.List(key)
+}
+
+// GetIgmpRcvrs to get multiple igmp receivers info
+func (db *Database) GetIgmpRcvrs(mvlan of.VlanType, gip net.IP, device string) (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(IgmpPortPath) + mvlan.String() + "/" + gip.String() + "/" + device + "/"
+	return db.List(key)
+}
+
+// GetIgmpRcvr to get igmp receiver info
+func (db *Database) GetIgmpRcvr(mvlan of.VlanType, gip net.IP, device string, rcvr string) (string, error) {
+	key := GetKeyPath(IgmpPortPath) + mvlan.String() + "/" + gip.String() + "/" + device + "/" + rcvr
+	return db.Get(key)
+}
+
+// PutIgmpRcvr to add igmp receiver info
+func (db *Database) PutIgmpRcvr(mvlan of.VlanType, gip net.IP, device string, rcvr string, value string) error {
+	key := GetKeyPath(IgmpPortPath) + mvlan.String() + "/" + gip.String() + "/" + device + "/" + rcvr
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelIgmpRcvr to delete igmp receiver info
+func (db *Database) DelIgmpRcvr(mvlan of.VlanType, gip net.IP, device string, rcvr string) error {
+	key := GetKeyPath(IgmpPortPath) + mvlan.String() + "/" + gip.String() + "/" + device + "/" + rcvr
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Warnf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// DelAllIgmpRcvr to delete all igmp receiver info
+func (db *Database) DelAllIgmpRcvr(mvlan of.VlanType, gip net.IP, device string) error {
+	key := GetKeyPath(IgmpPortPath) + mvlan.String() + "/" + gip.String() + "/" + device + "/"
+	if err := db.DeleteAll(key); err != nil {
+		logger.Warnf(ctx, "Delete All failed: The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// DelAllRoutesForDevice to delete all routes for device
+func (db *Database) DelAllRoutesForDevice(device string) error {
+	/* service/vgc/v1/devices/<deviceID>/flows/ */
+	logger.Infow(ctx, "Deleting all the flows for device", log.Fields{"device": device})
+	key := fmt.Sprintf(GetKeyPath(DeviceFlowPath), device)
+	if err := db.DeleteAllUnderHashKey(key); err != nil {
+		logger.Warnf(ctx, "Delete All failed: The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// PutNbDevicePort to add device port info
+func (db *Database) PutNbDevicePort(device string, ponPortID uint32, value string) {
+	key := GetKeyPath(NbDevicePath) + device + "/pon-port/" + fmt.Sprintf("%v", ponPortID)
+
+	if err := db.kvc.Put(context.Background(), key, value); err != nil {
+		logger.Warnf(ctx, "Put Device Port failed", key)
+	}
+}
+
+// DelNbDevicePort to delete device port
+func (db *Database) DelNbDevicePort(device string, ponPortID uint32) {
+	key := GetKeyPath(NbDevicePath) + device + "/pon-port/" + fmt.Sprintf("%v", ponPortID)
+
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Warnf(ctx, "Delete Device Port failed", key)
+	}
+}
+
+// GetAllNbPorts to get all ports info
+func (db *Database) GetAllNbPorts(deviceID string) (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(NbDevicePath) + deviceID + "/pon-port/"
+	return db.List(key)
+}
+
+//Functions for migration database
+
+// GetMigrationInfo to get migration info
+func (db *Database) GetMigrationInfo() (string, error) {
+	key := GetKeyPath(MigrationInfoPath)
+	return db.Get(key)
+}
+
+// PutMigrationInfo to add migration info
+func (db *Database) PutMigrationInfo(value string) error {
+	key := GetKeyPath(MigrationInfoPath)
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelMigrationInfo to delete migration info
+func (db *Database) DelMigrationInfo() error {
+	key := GetKeyPath(MigrationInfoPath)
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+//PON counters
+
+// GetAllPonCounters to get all pon counters info
+func (db *Database) GetAllPonCounters(device string) (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(PonCounterPath) + device
+	return db.List(key)
+}
+
+// GetPonCounter to get pon counter info
+func (db *Database) GetPonCounter(device, ponID string) (string, error) {
+	key := GetKeyPath(PonCounterPath) + device + "/" + ponID
+	return db.Get(key)
+}
+
+// PutPonCounter to add pon counter info
+func (db *Database) PutPonCounter(device, ponID, value string) error {
+	key := GetKeyPath(PonCounterPath) + device + "/" + ponID
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelPonCounter to delete pon counter info
+func (db *Database) DelPonCounter(device, ponID string) error {
+	key := GetKeyPath(PonCounterPath) + device + "/" + ponID
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+//PON Channel counters
+
+// GetAllPonChannelCounters to get all pon channel counters
+func (db *Database) GetAllPonChannelCounters(device, ponID string) (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(PonCounterPath) + device + "/" + ponID + "/" + ChannelCounterPath
+	return db.List(key)
+}
+
+// GetPonChannelCounter to get pon channel counter
+func (db *Database) GetPonChannelCounter(device, ponID, channel string) (string, error) {
+	key := GetKeyPath(PonCounterPath) + device + "/" + ponID + "/" + ChannelCounterPath + channel
+	return db.Get(key)
+}
+
+// PutPonChannelCounter to add pon channel counter
+func (db *Database) PutPonChannelCounter(device, ponID, channel, value string) error {
+	key := GetKeyPath(PonCounterPath) + device + "/" + ponID + "/" + ChannelCounterPath + channel
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelPonChannelCounter to delete pon channel counter
+func (db *Database) DelPonChannelCounter(device, ponID, channel string) error {
+	key := GetKeyPath(PonCounterPath) + device + "/" + ponID + "/" + ChannelCounterPath + channel
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// DelAllPONCounters to delete all pon channel counters
+func (db *Database) DelAllPONCounters(device string) error {
+	key := GetKeyPath(PonCounterPath) + device + "/"
+	return db.DeleteAll(key)
+}
+
+// DelPONCounters to delete pon counters
+func (db *Database) DelPONCounters(device string, ponID string) {
+	key := GetKeyPath(PonCounterPath) + device + "/" + ponID + "/"
+	if err := db.DeleteAll(key); err != nil {
+		logger.Warnf(ctx, "Delete Pon counters failed", key)
+	}
+	//DeletePonCounter(device, ponID)
+}
+
+// PutOltIgmpCounters to add Olt Igmp counter info
+func (db *Database) PutOltIgmpCounters(device, value string) error {
+	key := GetKeyPath(OltIgmpCounterPath) + device
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// GetOltIgmpCounter to get Olt Igmp counter info
+func (db *Database) GetOltIgmpCounter(device string) (string, error) {
+	key := GetKeyPath(OltIgmpCounterPath) + device
+	return db.Get(key)
+}
+
+//Service Channel counters
+
+// GetAllServiceChannelCounters to get all service channel counters info
+func (db *Database) GetAllServiceChannelCounters(serviceName string) (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(ServiceCounterPath) + serviceName + "/" + ChannelCounterPath
+	return db.List(key)
+}
+
+// GetServiceChannelCounter to get service channel counter info
+func (db *Database) GetServiceChannelCounter(serviceName, channel string) (string, error) {
+	key := GetKeyPath(ServiceCounterPath) + serviceName + "/" + ChannelCounterPath + channel
+	return db.Get(key)
+}
+
+// PutServiceChannelCounter to add service channel counter
+func (db *Database) PutServiceChannelCounter(serviceName, channel, value string) error {
+	key := GetKeyPath(ServiceCounterPath) + serviceName + "/" + ChannelCounterPath + channel
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// DelServiceChannelCounter to delete service channel counter
+func (db *Database) DelServiceChannelCounter(serviceName, channel string) error {
+	key := GetKeyPath(ServiceCounterPath) + serviceName + "/" + ChannelCounterPath + channel
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// DelAllServiceChannelCounter to delete all service channel counter
+func (db *Database) DelAllServiceChannelCounter(serviceName string) error {
+	key := GetKeyPath(ServiceCounterPath) + serviceName + "/" + ChannelCounterPath
+	return db.DeleteAllUnderHashKey(key)
+}
+
+// OltExists to know if the ONU is added to the database
+func (db *Database) OltExists(deviceID string) bool {
+	if _, err := db.GetOlt(deviceID); err != nil {
+		return false
+	}
+	return true
+
+}
+
+// PutFlowHash to add flowhash for the device
+func (db *Database) PutFlowHash(deviceID string, value string) error {
+	key := fmt.Sprintf(GetKeyPath(DeviceFlowPath), deviceID)
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// GetFlowHash gets the flow hash for the device
+func (db *Database) GetFlowHash(deviceID string) (string, error) {
+	key := fmt.Sprintf(GetKeyPath(DeviceFlowPath), deviceID)
+	return db.Get(key)
+}
+
+// PutPortAlarmProfile to add port alarm profile
+func (db *Database) PutPortAlarmProfile(portAlarmProfileID string, value string) {
+	key := GetKeyPath(PortAlarmProfilePath) + fmt.Sprintf("%v", portAlarmProfileID)
+	if err := db.kvc.Put(context.Background(), key, value); err != nil {
+		logger.Warnf(ctx, "Put PortAlarmProfile failed", key)
+	}
+}
+
+// DelPortAlarmProfile to delete port alarm profile
+func (db *Database) DelPortAlarmProfile(portAlarmProfileID string) {
+	key := GetKeyPath(PortAlarmProfilePath) + fmt.Sprintf("%v", portAlarmProfileID)
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Warnf(ctx, "Delete PortAlarmProfile failed", key)
+	}
+}
+
+// GetPortAlarmProfile to get port alarm profile
+func (db *Database) GetPortAlarmProfile(portAlarmProfileID string) (map[string]*kvstore.KVPair, error) {
+	key := GetKeyPath(PortAlarmProfilePath) + fmt.Sprintf("%v", portAlarmProfileID)
+	return db.List(key)
+}
+
+// PutPortAlarmData to add port alarm data
+func (db *Database) PutPortAlarmData(deviceID string, portID uint32, value string) {
+	key := fmt.Sprintf(GetKeyPath(PortAlarmDataPath), deviceID) + fmt.Sprintf("%v", portID)
+	if err := db.kvc.Put(context.Background(), key, value); err != nil {
+		logger.Warnf(ctx, "Put PortAlarmData failed", key)
+	}
+}
+
+// DelPortAlarmData to delete port alarm data
+func (db *Database) DelPortAlarmData(deviceID string, portID uint32) {
+	key := fmt.Sprintf(GetKeyPath(PortAlarmDataPath), deviceID) + fmt.Sprintf("%v", portID)
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Warnf(ctx, "Delete PortAlarmData failed", key)
+	}
+}
+
+// GetPortAlarmData to get port alarm data
+func (db *Database) GetPortAlarmData(deviceID string, portID uint32) (string, error) {
+	key := fmt.Sprintf(GetKeyPath(PortAlarmDataPath), deviceID) + fmt.Sprintf("%v", portID)
+	return db.Get(key)
+}
+
+// GetAllPortAlarmData to get port alarm data for all ports
+func (db *Database) GetAllPortAlarmData(deviceID string) (map[string]*kvstore.KVPair, error) {
+	key := fmt.Sprintf(GetKeyPath(PortAlarmDataPath), deviceID)
+	return db.List(key)
+}
+
+// PutSubAlarmData to add subscriber alarm data
+func (db *Database) PutSubAlarmData(deviceID string, portName string, value string) {
+	key := fmt.Sprintf(GetKeyPath(SubAlarmDataPath), deviceID) + fmt.Sprintf("%v", portName)
+	if err := db.kvc.Put(context.Background(), key, value); err != nil {
+		logger.Warnf(ctx, "Put Subscriber AlarmData failed", key)
+	}
+}
+
+// DelSubAlarmData to delete subscriber alarm data
+func (db *Database) DelSubAlarmData(deviceID string, portName string) {
+	key := fmt.Sprintf(GetKeyPath(SubAlarmDataPath), deviceID) + fmt.Sprintf("%v", portName)
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Warnf(ctx, "Delete Subscriber AlarmData failed", key)
+	}
+}
+
+// GetSubAlarmData to get subscriber alarm data
+func (db *Database) GetSubAlarmData(deviceID string, portName string) (string, error) {
+	key := fmt.Sprintf(GetKeyPath(SubAlarmDataPath), deviceID) + fmt.Sprintf("%v", portName)
+	return db.Get(key)
+}
+
+// GetAllSubAlarmData to get sub alarm data for all subscribers
+func (db *Database) GetAllSubAlarmData(deviceID string) (map[string]*kvstore.KVPair, error) {
+	key := fmt.Sprintf(GetKeyPath(SubAlarmDataPath), deviceID)
+	return db.List(key)
+}
+
+// Migrate Service req specific database actions
+
+// PutMigrateServicesReq to add MigrateServicesReq info
+func (db *Database) PutMigrateServicesReq(deviceID string, vnet string, value string) error {
+	key := fmt.Sprintf(GetKeyPath(ServicesMigrateReqPath), deviceID) + vnet
+	return db.kvc.Put(context.Background(), key, value)
+}
+
+// GetMigrateServicesReq to get MigrateServicesReq info
+func (db *Database) GetMigrateServicesReq(deviceID string, vnet string) (string, error) {
+	key := fmt.Sprintf(GetKeyPath(ServicesMigrateReqPath), deviceID) + vnet
+	return db.Get(key)
+}
+
+// GetAllMigrateServicesReq to get multiple MigrateServicesReq info
+func (db *Database) GetAllMigrateServicesReq(deviceID string) (map[string]*kvstore.KVPair, error) {
+	key := fmt.Sprintf(GetKeyPath(ServicesMigrateReqPath), deviceID)
+	return db.List(key)
+}
+
+// DelMigrateServicesReq to delete MigrateServicesReq info
+func (db *Database) DelMigrateServicesReq(deviceID string, vnet string) error {
+	key := fmt.Sprintf(GetKeyPath(ServicesMigrateReqPath), deviceID) + vnet
+	if err := db.kvc.Delete(context.Background(), key); err != nil {
+		logger.Errorf(ctx, "The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	return nil
+}
+
+// DelAllMigrateServicesReq to delete all MigrateServicesReq info
+func (db *Database) DelAllMigrateServicesReq(deviceID string) error {
+	key := fmt.Sprintf(GetKeyPath(ServicesMigrateReqPath), deviceID)
+	if err := db.DeleteAllUnderHashKey(key); err != nil {
+		logger.Warnf(ctx, "Delete All failed: The key doesn't exist", log.Fields{"key": key, "Error": err})
+		return err
+	}
+	logger.Infow(ctx, "Deleting all the Update Vnet Requests for device", log.Fields{"device": deviceID})
+	return nil
+}
+
+func init() {
+	// Setup this package so that it's log level can be modified at run time
+	var err error
+	logger, err = log.RegisterPackage(log.JSON, log.ErrorLevel, log.Fields{})
+	if err != nil {
+		panic(err)
+	}
+}
diff --git a/database/dbintf.go b/database/dbintf.go
new file mode 100644
index 0000000..b8b491f
--- /dev/null
+++ b/database/dbintf.go
@@ -0,0 +1,165 @@
+/*
+* Copyright 2022-present Open Networking Foundation
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package database
+
+import (
+	"net"
+
+	"voltha-go-controller/internal/pkg/of"
+	"github.com/opencord/voltha-lib-go/v7/pkg/db/kvstore"
+)
+
+var dbObj DBIntf
+
+// DBIntf defines db related methods
+type DBIntf interface {
+	Get(key string) (string, error)
+	Put(fullKeyPath string, value string) error
+	Del(path string) error
+	List(key string) (map[string]*kvstore.KVPair, error)
+	DeleteAll(path string) error
+	DeleteAllUnderHashKey(hashKeyPrefix string) error
+	GetOlt(deviceID string) (string, error)
+	PutOlt(deviceID string, value string) error
+	DelOlt(deviceID string) error
+	GetFlow(deviceID string, flowID uint64) (string, error)
+	GetFlows(deviceID string) (map[string]*kvstore.KVPair, error)
+	PutFlow(deviceID string, flowID uint64, value string) error
+	DelFlow(deviceID string, flowID uint64) error
+	PutGroup(deviceID string, groupID uint32, value string) error
+	GetGroup(deviceID string, groupID uint32) (string, error)
+	GetGroups(deviceID string) (map[string]*kvstore.KVPair, error)
+	DelGroup(deviceID string, groupID uint32) error
+	DelAllGroup(string) error
+	DelAllPorts(deviceID string) error
+	DelPort(deviceID string, portID uint32) error
+	PutPort(deviceID string, portID uint32, value string) error
+	GetPort(deviceID string, portID uint32) (string, error)
+	GetPorts(deviceID string) (map[string]*kvstore.KVPair, error)
+	PutDeviceMeter(deviceID string, meterID uint32, value string) error
+	GetDeviceMeter(deviceID string, meterID uint32) (string, error)
+	GetDeviceMeters(deviceID string) (map[string]*kvstore.KVPair, error)
+	DelDeviceMeter(deviceID string, meterID uint32) error
+	GetService(name string) (string, error)
+	GetServices() (map[string]*kvstore.KVPair, error)
+	PutService(name string, value string) error
+	DelService(name string) error
+	GetVnets() (map[string]*kvstore.KVPair, error)
+	GetVnet(name string) (string, error)
+	PutVnet(name string, value string) error
+	DelVnet(name string) error
+	GetVpvs() (map[string]*kvstore.KVPair, error)
+	GetVpv(port string, SVlan uint16, CVlan uint16, UniVlan uint16) (string, error)
+	PutVpv(port string, SVlan uint16, CVlan uint16, UniVlan uint16, value string) error
+	DelVpv(port string, SVlan uint16, CVlan uint16, UniVlan uint16) error
+	GetMvlans() (map[string]*kvstore.KVPair, error)
+	GetMvlan(mvlan uint16) (string, error)
+	PutMvlan(mvlan uint16, value string) error
+	DelMvlan(mvlan uint16) error
+	DelIGMPCfg() error
+	GetHealth() (string, error)
+	PutHealth(value string) error
+	DelHealth() error
+	GetMeters() (map[string]*kvstore.KVPair, error)
+	GetMeter(name string) (string, error)
+	PutMeter(name string, value string) error
+	DelMeter(name string) error
+	DelAllMeter(device string) error
+	GetIgmpGroups() (map[string]*kvstore.KVPair, error)
+	GetIgmpGroup(id string) (string, error)
+	PutIgmpGroup(id string, value string) error
+	DelIgmpGroup(id string) error
+	GetAllIgmpDevices() (map[string]*kvstore.KVPair, error)
+	GetPrevIgmpDevices(mvlan of.VlanType, gid string) (map[string]*kvstore.KVPair, error)
+	GetIgmpDevices(mvlan of.VlanType, gid string, gip net.IP) (map[string]*kvstore.KVPair, error)
+	GetIgmpDevice(mvlan of.VlanType, gid string, gip net.IP, device string) (string, error)
+	PutIgmpDevice(mvlan of.VlanType, gid string, gip net.IP, device string, value string) error
+	DelIgmpDevice(mvlan of.VlanType, gid string, gip net.IP, device string) error
+	GetAllIgmpChannels() (map[string]*kvstore.KVPair, error)
+	GetPrevIgmpChannels(gname string, device string) (map[string]*kvstore.KVPair, error)
+	GetIgmpChannels(mvlan of.VlanType, gname string, device string) (map[string]*kvstore.KVPair, error)
+	GetIgmpChannel(mvlan of.VlanType, gName string, device string, gip net.IP) (string, error)
+	PutIgmpChannel(mvlan of.VlanType, gName string, device string, gip net.IP, value string) error
+	DelIgmpChannel(mvlan of.VlanType, gName string, device string, gip net.IP) error
+	GetAllIgmpRcvrs() (map[string]*kvstore.KVPair, error)
+	GetPrevIgmpRcvrs(gip net.IP, device string) (map[string]*kvstore.KVPair, error)
+	GetIgmpRcvrs(mvlan of.VlanType, gip net.IP, device string) (map[string]*kvstore.KVPair, error)
+	GetIgmpRcvr(mvlan of.VlanType, gip net.IP, device string, rcvr string) (string, error)
+	PutIgmpRcvr(mvlan of.VlanType, gip net.IP, device string, rcvr string, value string) error
+	DelIgmpRcvr(mvlan of.VlanType, gip net.IP, device string, rcvr string) error
+	DelAllIgmpRcvr(mvlan of.VlanType, gip net.IP, device string) error
+	DelAllRoutesForDevice(device string) error
+	DelNbDevicePort(device string, ponPortID uint32)
+	GetAllNbPorts(deviceID string) (map[string]*kvstore.KVPair, error)
+	GetMigrationInfo() (string, error)
+	PutMigrationInfo(value string) error
+	DelMigrationInfo() error
+	GetAllPonCounters(device string) (map[string]*kvstore.KVPair, error)
+	GetPonCounter(device string, ponID string) (string, error)
+	PutPonCounter(device string, ponID string, value string) error
+	DelPonCounter(device string, ponID string) error
+	GetAllPonChannelCounters(device string, ponID string) (map[string]*kvstore.KVPair, error)
+	GetPonChannelCounter(device string, ponID string, channel string) (string, error)
+	PutNbDevicePort(device string, ponPortID uint32, value string)
+	PutPonChannelCounter(device string, ponID string, channel string, value string) error
+	DelPonChannelCounter(device string, ponID string, channel string) error
+	DelAllPONCounters(device string) error
+	DelPONCounters(device string, ponID string)
+	GetAllServiceChannelCounters(serviceName string) (map[string]*kvstore.KVPair, error)
+	GetServiceChannelCounter(serviceName string, channel string) (string, error)
+	PutServiceChannelCounter(serviceName string, channel string, value string) error
+	DelServiceChannelCounter(serviceName string, channel string) error
+	DelAllServiceChannelCounter(serviceName string) error
+	PutOltIgmpCounters(device string, value string) error
+	GetOltIgmpCounter(device string) (string, error)
+	PutFlowHash(deviceID string, value string) error
+	GetFlowHash(deviceID string) (string, error)
+	OltExists(deviceID string) bool
+	GetIgmpProfiles() (map[string]*kvstore.KVPair, error)
+	GetIgmpProfile(name string) (string, error)
+	PutIgmpProfile(name string, value string) error
+	DelIgmpProfile(name string) error
+	GetMcastConfigs() (map[string]*kvstore.KVPair, error)
+	GetMcastConfig(name string) (string, error)
+	PutMcastConfig(name string, value string) error
+	DelMcastConfig(name string) error
+	PutPortAlarmProfile(portAlarmProfileID string, value string)
+	GetPortAlarmProfile(portAlarmProfileID string) (map[string]*kvstore.KVPair, error)
+	DelPortAlarmProfile(portAlarmProfileID string)
+	PutPortAlarmData(deviceID string, portID uint32, value string)
+	GetPortAlarmData(deviceID string, portID uint32) (string, error)
+	DelPortAlarmData(deviceID string, portID uint32)
+	GetAllPortAlarmData(deviceID string) (map[string]*kvstore.KVPair, error)
+	PutSubAlarmData(deviceID string, portName string, value string)
+	GetSubAlarmData(deviceID string, portName string) (string, error)
+	DelSubAlarmData(deviceID string, portName string)
+	GetAllSubAlarmData(deviceID string) (map[string]*kvstore.KVPair, error)
+	PutMigrateServicesReq(deviceID string, vlan string, value string) error
+	GetMigrateServicesReq(deviceID string, vlan string) (string, error)
+	GetAllMigrateServicesReq(deviceID string) (map[string]*kvstore.KVPair, error)
+	DelMigrateServicesReq(deviceID string, vlan string) error
+	DelAllMigrateServicesReq(deviceID string) error
+}
+
+//GetDatabase - returns databse operation based on configuration
+func GetDatabase() DBIntf {
+	return dbObj
+}
+
+//SetDatabase - sets the DB object based on the type
+func SetDatabase(df DBIntf) {
+	dbObj = df
+}
