diff --git a/internal/pkg/application/application.go b/internal/pkg/application/application.go
index 74b72f8..1f31149 100644
--- a/internal/pkg/application/application.go
+++ b/internal/pkg/application/application.go
@@ -30,14 +30,14 @@
 	"github.com/google/gopacket"
 	"github.com/google/gopacket/layers"
 
+	"voltha-go-controller/database"
 	"voltha-go-controller/internal/pkg/controller"
 	cntlr "voltha-go-controller/internal/pkg/controller"
-	"voltha-go-controller/database"
+	errorCodes "voltha-go-controller/internal/pkg/errorcodes"
 	"voltha-go-controller/internal/pkg/intf"
 	"voltha-go-controller/internal/pkg/of"
 	"voltha-go-controller/internal/pkg/tasks"
 	"voltha-go-controller/internal/pkg/util"
-	errorCodes "voltha-go-controller/internal/pkg/errorcodes"
 	"voltha-go-controller/log"
 )
 
@@ -364,7 +364,7 @@
 		port := key.(string)
 		vp := value.(*VoltPort)
 
-		logger.Infow(ctx, "NNI Discovered. Sending Port UP Ind for UNI", log.Fields{"Port" : port})
+		logger.Infow(ctx, "NNI Discovered. Sending Port UP Ind for UNI", log.Fields{"Port": port})
 		//Ignore if UNI port is not UP
 		if vp.State != PortStateUp {
 			return true
@@ -440,16 +440,24 @@
 	macPortLock sync.RWMutex
 	macPortMap  map[string]string
 
-	IgmpPendingPool map[string]map[*IgmpGroup]bool //[grpkey, map[groupObj]bool]  //mvlan_grpName/IP
-	PendingPoolLock sync.RWMutex
+	IgmpPendingPool       map[string]map[*IgmpGroup]bool //[grpkey, map[groupObj]bool]  //mvlan_grpName/IP
+	PendingPoolLock       sync.RWMutex
+	VnetsToDelete         map[string]bool
+	ServicesToDelete      map[string]bool
+	VoltPortVnetsToDelete map[*VoltPortVnet]bool
+	PortAlarmProfileCache map[string]map[string]int // [portAlarmID][ThresholdLevelString]ThresholdLevel
+	vendorID              string
+	OltFlowServiceConfig  OltFlowService
+	DevicesConfig         sync.Map //[serialNumber]*DeviceConfig
+}
 
-	VnetsToDelete             map[string]bool
-	ServicesToDelete          map[string]bool
-	VoltPortVnetsToDelete     map[*VoltPortVnet]bool
-	PortAlarmProfileCache     map[string]map[string]int // [portAlarmID][ThresholdLevelString]ThresholdLevel
-	vendorID                  string
-	OltFlowServiceConfig      OltFlowService
-	DevicesConfig             sync.Map
+type DeviceConfig struct {
+	SerialNumber       string `json:"id"`
+	HardwareIdentifier string `json:"hardwareIdentifier"`
+	IPAddress          net.IP `json:"ipAddress"`
+	UplinkPort         int    `json:"uplinkPort"`
+	NasID              string `json:"nasId"`
+	NniDhcpTrapVid     int    `json:"nniDhcpTrapVid"`
 }
 
 // PonPortCfg contains NB port config and activeIGMPChannels count
@@ -526,6 +534,79 @@
 	return ponPort
 }
 
+// RestoreDeviceConfigFromDb to restore vnet from port
+func (va *VoltApplication) RestoreDeviceConfigFromDb(cntx context.Context) {
+	// VNETS must be learnt first
+	dConfig, _ := db.GetDeviceConfig(cntx)
+	for _, device := range dConfig {
+		b, ok := device.Value.([]byte)
+		if !ok {
+			logger.Warn(ctx, "The value type is not []byte")
+			continue
+		}
+		devConfig := DeviceConfig{}
+		err := json.Unmarshal(b, &devConfig)
+		if err != nil {
+			logger.Warn(ctx, "Unmarshal of device configuration failed")
+			continue
+		}
+		logger.Debugw(ctx, "Retrieved device config", log.Fields{"Device Config": devConfig})
+		if err := va.AddDeviceConfig(cntx, devConfig.SerialNumber, devConfig.HardwareIdentifier, devConfig.NasID, devConfig.IPAddress, devConfig.UplinkPort, devConfig.NniDhcpTrapVid); err != nil {
+			logger.Warnw(ctx, "Add device config failed", log.Fields{"DeviceConfig": devConfig, "Error": err})
+		}
+
+	}
+}
+
+// WriteDeviceConfigToDb writes sb device config to kv store
+func (dc *DeviceConfig) WriteDeviceConfigToDb(cntx context.Context, serialNum string, deviceConfig *DeviceConfig) error {
+	b, err := json.Marshal(deviceConfig)
+	if err != nil {
+		logger.Errorw(ctx, "deviceConfig-marshal-failed", log.Fields{"err": err})
+		return err
+	}
+	dberr := db.PutDeviceConfig(cntx, serialNum, string(b))
+	if dberr != nil {
+		logger.Errorw(ctx, "update device config failed", log.Fields{"err": err})
+		return dberr
+	}
+	return nil
+}
+
+func (va *VoltApplication) AddDeviceConfig(cntx context.Context, serialNum, hardwareIdentifier, nasID string, ipAddress net.IP, uplinkPort, nniDhcpTrapId int) error {
+	var dc *DeviceConfig
+
+	d := va.GetDeviceConfig(serialNum)
+	if d == nil {
+		deviceConfig := &DeviceConfig{
+			SerialNumber:       serialNum,
+			HardwareIdentifier: hardwareIdentifier,
+			NasID:              nasID,
+			UplinkPort:         uplinkPort,
+			IPAddress:          ipAddress,
+			NniDhcpTrapVid:     nniDhcpTrapId,
+		}
+		va.DevicesConfig.Store(serialNum, deviceConfig)
+		err := dc.WriteDeviceConfigToDb(cntx, serialNum, deviceConfig)
+		if err != nil {
+			logger.Errorw(ctx, "DB update for device config failed", log.Fields{"err": err})
+			return err
+		}
+	} else {
+		logger.Errorw(ctx, "Device config already exist", log.Fields{"DeviceID": serialNum})
+		return errors.New("Device config already exist")
+	}
+	return nil
+}
+
+// GetDeviceConfig to get a device config.
+func (va *VoltApplication) GetDeviceConfig(serNum string) *DeviceConfig {
+	if d, ok := va.DevicesConfig.Load(serNum); ok {
+		return d.(*DeviceConfig)
+	}
+	return nil
+}
+
 // UpdatePortToNbDevice Adds pon port to NB Device and DB
 func (nbd *NbDevice) UpdatePortToNbDevice(cntx context.Context, portID, allowedChannels uint32, enableMulticastKPI bool, portAlarmProfileID string) *PonPortCfg {
 
@@ -704,6 +785,8 @@
 	va.RestoreUpgradeStatus(cntx)
 	logger.Info(ctx, "Reading OltFlowService from DB")
 	va.RestoreOltFlowService(cntx)
+	logger.Info(ctx, "Reading device config from DB")
+	va.RestoreDeviceConfigFromDb(cntx)
 	logger.Info(ctx, "Reconciled from DB")
 }
 
@@ -842,8 +925,8 @@
 		}
 		// if RemoveFlowsOnDisable is flase, then flows will be existing till port delete. Remove the flows now
 		if !va.OltFlowServiceConfig.RemoveFlowsOnDisable {
-		        vpvs, ok := va.VnetsByPort.Load(port)
-		        if !ok || nil == vpvs || len(vpvs.([]*VoltPortVnet)) == 0 {
+			vpvs, ok := va.VnetsByPort.Load(port)
+			if !ok || nil == vpvs || len(vpvs.([]*VoltPortVnet)) == 0 {
 				logger.Infow(ctx, "No VNETs on port", log.Fields{"Device": device, "Port": port})
 			} else {
 				for _, vpv := range vpvs.([]*VoltPortVnet) {
@@ -1311,14 +1394,6 @@
 		return
 	}
 
-/*
-	if p.Type != VoltPortTypeNni {
-		// Process port up indication
-		indTask := cntlr.NewAddPortInd(p.Name, msgbus.PortUp, d.SerialNum, true, getServiceList(port))
-		cntlr.GetController().PostIndication(device, indTask)
-	}
-*/
-
 	for _, vpv := range vpvs.([]*VoltPortVnet) {
 		vpv.VpvLock.Lock()
 		//If no service is activated drop the portUpInd
@@ -1424,13 +1499,7 @@
 		//msgbus.ProcessPortInd(msgbus.PortDown, d.SerialNum, p.Name, false, getServiceList(port))
 		return
 	}
-/*
-	if p.Type != VoltPortTypeNni {
-		// Process port down indication
-		indTask := cntlr.NewAddPortInd(p.Name, msgbus.PortDown, d.SerialNum, true, getServiceList(port))
-		cntlr.GetController().PostIndication(device, indTask)
-	}
-*/
+
 	for _, vpv := range vpvs.([]*VoltPortVnet) {
 		vpv.VpvLock.Lock()
 		vpv.PortDownInd(cntx, device, port, false)
@@ -1670,46 +1739,6 @@
 	cookie := subFlow.Cookie
 	uniPort := cookie >> 16 & 0xFFFFFFFF
 	logger.Errorw(ctx, "Flow Failure Notification", log.Fields{"uniPort": uniPort, "Cookie": cookie})
-/*
-	device := flowStatus.Device
-	priority := subFlow.Priority
-	isIgmp := false
-	var devSerialNum string
-	var service *VoltService
-
-	if subFlow.Match.L4Protocol == of.IPProtocolIgmp {
-		isIgmp = true
-	} else if priority != of.HsiaFlowPriority {
-		logger.Info(ctx, "Not HSIA flow, ignoring the failure notification")
-		return
-	}
-
-	cookie := subFlow.Cookie
-	pbit := subFlow.Pbits
-	uniPort := cookie >> 16 & 0xFFFFFFFF
-	portName, _ := GetApplication().GetPortName(uint32(uniPort))
-	portState := msgbus.PortDown
-	logger.Errorw(ctx, "Construct Flow Failure Notification", log.Fields{"uniPort": uniPort, "Cookie": cookie, "Pbit": pbit, "isIgmp": isIgmp})
-
-	if isIgmp {
-		cvlan := subFlow.TableMetadata & 0xFFFF
-		service = GetApplication().GetMatchingMcastService(portName, device, of.VlanType(cvlan))
-	} else {
-		service = GetApplication().GetServiceNameFromCookie(cookie, portName, uint8(pbit), device, subFlow.TableMetadata)
-	}
-	var trigger infra.Reason
-	if nil != service {
-		logger.Errorw(ctx, "Sending Flow Failure Notification", log.Fields{"uniPort": uniPort, "Cookie": cookie, "Pbit": pbit, "Service": service.Name, "ErrorCode": flowStatus.Status})
-		if vd := GetApplication().GetDevice(device); vd != nil {
-			devSerialNum = vd.SerialNum
-			if portSt, _ := GetApplication().GetPortState(service.Port); portSt == PortStateUp {
-				portState = msgbus.PortUp
-			}
-			trigger = service.getSrvDeactTrigger(vd, portState)
-		}
-		msgbus.PostAccessConfigInd(msgbus.Failed, devSerialNum, msgbus.HSIA, service.Name, int(flowStatus.Status), subFlow.ErrorReason, trigger, portState)
-	}
-*/
 }
 
 //UpdateMvlanProfilesForDevice to update mvlan profile for device
@@ -2042,25 +2071,6 @@
 				vs.DelHsiaFlows(cntx)
 				if vs.ForceDelete {
 					vs.DelFromDb(cntx)
-					/*
-					portState := msgbus.PortDown
-					if d, err := va.GetDeviceFromPort(vs.Port); d != nil {
-
-						if portSt, _ := GetApplication().GetPortState(vs.Port); portSt == PortStateUp {
-							portState = msgbus.PortUp
-						}
-						indTask := cntlr.NewAddServiceIndTask(vs.Name, d.SerialNum, msgbus.DelHSIA, msgbus.Success, "", portState, infra.DelHSIAFromNB)
-						cntlr.GetController().PostIndication(d.Name, indTask)
-					} else {
-						// Port Not found can occur during ONU movement. However, port delete had already handled flow deletion,
-						// hence indication can be sent immediately
-						var devSrNo string
-						logger.Errorw(ctx, "Device/Port not found. Send indication directly", log.Fields{"serviceName": vs.Name, "error": err})
-						if vd := va.GetDevice(vs.Device); vd != nil {
-							devSrNo = vd.SerialNum
-						}
-						msgbus.PostAccessConfigInd(msgbus.Success, devSrNo, msgbus.DelHSIA, vs.Name, 0, "", infra.DelHSIAFromNB, portState)
-					}*/
 				}
 			}
 		} else {
@@ -2100,13 +2110,13 @@
 }
 
 type OltFlowService struct {
-        EnableDhcpOnNni      bool `json:"enableDhcpOnNni"`
-        DefaultTechProfileId int  `json:"defaultTechProfileId"`
-        EnableIgmpOnNni      bool `json:"enableIgmpOnNni"`
-        EnableEapol          bool `json:"enableEapol"`
-        EnableDhcpV6         bool `json:"enableDhcpV6"`
-        EnableDhcpV4         bool `json:"enableDhcpV4"`
-        RemoveFlowsOnDisable bool `json:"removeFlowsOnDisable"`
+	EnableDhcpOnNni      bool `json:"enableDhcpOnNni"`
+	DefaultTechProfileId int  `json:"defaultTechProfileId"`
+	EnableIgmpOnNni      bool `json:"enableIgmpOnNni"`
+	EnableEapol          bool `json:"enableEapol"`
+	EnableDhcpV6         bool `json:"enableDhcpV6"`
+	EnableDhcpV4         bool `json:"enableDhcpV4"`
+	RemoveFlowsOnDisable bool `json:"removeFlowsOnDisable"`
 }
 
 func (va *VoltApplication) UpdateOltFlowService(cntx context.Context, oltFlowService OltFlowService) {
@@ -2119,6 +2129,7 @@
 	}
 	_ = db.PutOltFlowService(cntx, string(b))
 }
+
 // RestoreOltFlowService to read from the DB and restore olt flow service config
 func (va *VoltApplication) RestoreOltFlowService(cntx context.Context) {
 	oltflowService, err := db.GetOltFlowService(cntx)
@@ -2134,26 +2145,17 @@
 	logger.Infow(ctx, "updated OltFlowServiceConfig from DB", log.Fields{"OltFlowServiceConfig": va.OltFlowServiceConfig})
 }
 
-type DeviceConfig struct {
-	SerialNumber       string
-	UplinkPort         int
-	HardwareIdentifier string
-	IPAddress          net.IP
-	NasID              string
-	NniDhcpTrapVid     int
-}
-
 func (va *VoltApplication) UpdateDeviceConfig(cntx context.Context, sn, mac, nasID string, port, dhcpVid int, ip net.IP) {
 	if d, ok := va.DevicesConfig.Load(sn); ok {
 		logger.Infow(ctx, "Device configuration already exists", log.Fields{"DeviceInfo": d})
 	}
-	d := DeviceConfig {
-		SerialNumber       : sn,
-		UplinkPort         : port,
-		HardwareIdentifier : mac,
-		IPAddress          : ip,
-		NasID              : nasID,
-		NniDhcpTrapVid     : dhcpVid,
+	d := DeviceConfig{
+		SerialNumber:       sn,
+		UplinkPort:         port,
+		HardwareIdentifier: mac,
+		IPAddress:          ip,
+		NasID:              nasID,
+		NniDhcpTrapVid:     dhcpVid,
 	}
 	logger.Infow(ctx, "Added OLT configurations", log.Fields{"DeviceInfo": d})
 	va.DevicesConfig.Store(sn, d)
diff --git a/internal/pkg/application/igmp.go b/internal/pkg/application/igmp.go
index a63370d..91afdf8 100644
--- a/internal/pkg/application/igmp.go
+++ b/internal/pkg/application/igmp.go
@@ -11,7 +11,7 @@
 * 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 application
 
@@ -21,16 +21,16 @@
 	"errors"
 	"net"
 	"reflect"
-	"voltha-go-controller/internal/pkg/types"
 	"strings"
 	"sync"
 	"time"
+	common "voltha-go-controller/internal/pkg/types"
 
 	"github.com/google/gopacket"
 	"github.com/google/gopacket/layers"
 
-	cntlr "voltha-go-controller/internal/pkg/controller"
 	"voltha-go-controller/database"
+	cntlr "voltha-go-controller/internal/pkg/controller"
 	"voltha-go-controller/internal/pkg/of"
 	"voltha-go-controller/log"
 )
@@ -865,7 +865,7 @@
 			vp := vd.GetPort(port)
 			if vp == nil || vp.State != PortStateUp {
 				logger.Warnw(ctx, "Join received from a Port that is DOWN or not present",
-						log.Fields{"Port": port})
+					log.Fields{"Port": port})
 				ig.IgmpGroupLock.Unlock()
 				return
 			}
@@ -882,7 +882,7 @@
 				vp := vd.GetPort(port)
 				if vp == nil || vp.State != PortStateUp {
 					logger.Warnw(ctx, "Join received from a Port that is DOWN or not present",
-							log.Fields{"Port": port})
+						log.Fields{"Port": port})
 					ig.IgmpGroupLock.Unlock()
 					return
 				}
@@ -1015,7 +1015,7 @@
 					vp := vd.GetPort(port)
 					if vp == nil || vp.State != PortStateUp {
 						logger.Warnw(ctx, "Join received from a Port that is DOWN or not present",
-								log.Fields{"Port": port})
+							log.Fields{"Port": port})
 						ig.IgmpGroupLock.Unlock()
 						return
 					}
@@ -1033,7 +1033,7 @@
 						vp := vd.GetPort(port)
 						if vp == nil || vp.State != PortStateUp {
 							logger.Warnw(ctx, "Join received from a Port that is DOWN or not present",
-									log.Fields{"Port": port})
+								log.Fields{"Port": port})
 							ig.IgmpGroupLock.Unlock()
 							return
 						}
@@ -1678,23 +1678,48 @@
 	va.IgmpProfilesByName.Delete(name)
 }
 
-//DelIgmpProfile for addition of IGMP Profile
-func (va *VoltApplication) DelIgmpProfile(cntx context.Context, igmpProfileConfig *common.IGMPConfig) error {
+// TODO - DelIgmpProfile for deleting IGMP Profile based on profile Id
+// func (va *VoltApplication) DelIgmpProfile(cntx context.Context, igmpProfileConfig *common.IGMPConfig) error {
+// 	// Deletion of default igmp profile is blocked from submgr. Keeping additional check for safety.
+// 	if igmpProfileConfig.ProfileID == DefaultIgmpProfID {
+// 		logger.Info(ctx, "Resetting default IGMP profile")
+// 		va.resetIgmpProfileToDefault(cntx)
+// 		return nil
+// 	}
+// 	igmpProfile := va.checkIgmpProfileMap(igmpProfileConfig.ProfileID)
+// 	if igmpProfile == nil {
+// 		logger.Warnw(ctx, "Igmp Profile not found. Unable to delete", log.Fields{"Profile ID": igmpProfileConfig.ProfileID})
+// 		return nil
+// 	}
+
+// 	va.deleteIgmpProfileMap(igmpProfileConfig.ProfileID)
+
+// 	_ = db.DelIgmpProfile(cntx, igmpProfileConfig.ProfileID)
+
+// 	return nil
+// }
+
+// DelIgmpProfile for deleting IGMP Profile based on profile Id
+func (va *VoltApplication) DelIgmpProfile(cntx context.Context, profileID string) error {
 	// Deletion of default igmp profile is blocked from submgr. Keeping additional check for safety.
-	if igmpProfileConfig.ProfileID == DefaultIgmpProfID {
+	if profileID == DefaultIgmpProfID {
 		logger.Info(ctx, "Resetting default IGMP profile")
 		va.resetIgmpProfileToDefault(cntx)
 		return nil
 	}
-	igmpProfile := va.checkIgmpProfileMap(igmpProfileConfig.ProfileID)
+	igmpProfile := va.checkIgmpProfileMap(profileID)
 	if igmpProfile == nil {
-		logger.Warnw(ctx, "Igmp Profile not found. Unable to delete", log.Fields{"Profile ID": igmpProfileConfig.ProfileID})
+		logger.Warnw(ctx, "Igmp Profile not found. Unable to delete", log.Fields{"Profile ID": profileID})
 		return nil
 	}
 
-	va.deleteIgmpProfileMap(igmpProfileConfig.ProfileID)
+	va.deleteIgmpProfileMap(profileID)
 
-	_ = db.DelIgmpProfile(cntx, igmpProfileConfig.ProfileID)
+	err := db.DelIgmpProfile(cntx, profileID)
+	if err != nil {
+		logger.Errorw(ctx, "Failed to delete Igmp profile from DB", log.Fields{"Error": err})
+		return err
+	}
 
 	return nil
 }
diff --git a/internal/pkg/application/vnets.go b/internal/pkg/application/vnets.go
index 1313490..a95104c 100644
--- a/internal/pkg/application/vnets.go
+++ b/internal/pkg/application/vnets.go
@@ -16,25 +16,27 @@
 package application
 
 import (
+	"context"
 	"encoding/json"
 	"errors"
-	"context"
 	"net"
-	infraerrorCodes "voltha-go-controller/internal/pkg/errorcodes"
 	"strconv"
 	"sync"
 	"time"
 
+	//errorCodes "voltha-go-controller/internal/pkg/errorcodes"
+
 	"github.com/google/gopacket"
 	"github.com/google/gopacket/layers"
 	"go.uber.org/atomic"
 
+	"voltha-go-controller/database"
 	"voltha-go-controller/internal/pkg/controller"
 	cntlr "voltha-go-controller/internal/pkg/controller"
-	"voltha-go-controller/database"
+
+	errorCodes "voltha-go-controller/internal/pkg/errorcodes"
 	"voltha-go-controller/internal/pkg/of"
 	"voltha-go-controller/internal/pkg/util"
-	errorCodes "voltha-go-controller/internal/pkg/errorcodes"
 	"voltha-go-controller/log"
 )
 
@@ -223,7 +225,7 @@
 	vv.Version = database.PresentVersionMap[database.VnetPath]
 	logger.Debugw(ctx, "Updating VNET....", log.Fields{"vnet": vv})
 	if b, err := json.Marshal(vv); err == nil {
-		if err:= db.PutVnet(cntx, vv.Name, string(b)); err != nil {
+		if err := db.PutVnet(cntx, vv.Name, string(b)); err != nil {
 			logger.Warnw(ctx, "Add Vnet to DB failed", log.Fields{"vnet name": vv.Name, "Error": err})
 		}
 	}
@@ -652,7 +654,7 @@
 	// If the only Igmp Enabled service is removed, remove the Igmp trap flow along with it
 	if service.IgmpEnabled {
 		if err := vpv.DelIgmpFlows(cntx); err != nil {
-			statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+			statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 			vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 		}
 
@@ -775,8 +777,18 @@
 		return
 	}
 
-	if vp := device.GetPort(port); vp != nil {
+	if nniPort := device.GetPort(nni); nniPort != nil {
+		//If NNI port is not mached to nb nni port dont send flows
+		devConfig := GetApplication().GetDeviceConfig(device.SerialNum)
+		if devConfig != nil {
+			if devConfig.UplinkPort != int(nniPort.ID) {
+				logger.Errorw(ctx, "NNI port not configured from NB, not pushing flows", log.Fields{"NNI Port": devConfig.UplinkPort, "NB NNI port": nniPort.ID})
+				return
+			}
+		}
+	}
 
+	if vp := device.GetPort(port); vp != nil {
 		if vpv.PonPort != 0xFF && vpv.PonPort != vp.PonPort {
 			logger.Errorw(ctx, "UNI port discovered on wrong PON Port. Dropping Flow Config for VPV", log.Fields{"Device": device.Name, "Port": port, "DetectedPon": vp.PonPort, "ExpectedPon": vpv.PonPort, "Vnet": vpv.VnetName})
 			return
@@ -835,7 +847,7 @@
 		logger.Infow(ctx, "Port Up - IGMP Flows", log.Fields{"Device": device.Name, "Port": port})
 		vpv.RangeOnServices(cntx, AddSvcUsMeterToDevice)
 		if err := vpv.AddIgmpFlows(cntx); err != nil {
-			statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+			statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 			vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 		}
 
@@ -916,7 +928,7 @@
 	_, err := GetApplication().GetDeviceFromPort(vpv.Port)
 	if err != nil {
 		logger.Warnw(ctx, "Not pushing Service Flows: Error Getting Device", log.Fields{"Reason": err.Error()})
-		statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+		statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 		return
 	}
@@ -1072,10 +1084,10 @@
 		}
 	}
 
-	_, err := GetApplication().GetDeviceFromPort(vpv.Port)
+	voltDevice, err := GetApplication().GetDeviceFromPort(vpv.Port)
 	if err != nil {
 		logger.Warnw(ctx, "Not pushing Service Flows: Error Getting Device", log.Fields{"Reason": err.Error()})
-		//statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+		//statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 		//TODO-COMM: 		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 		return
 	}
@@ -1083,6 +1095,14 @@
 		logger.Warn(ctx, "Not pushing Service Flows: Service Not activated")
 		return
 	}
+
+	//If NNI port is not mached to nb nni port
+	devConfig := GetApplication().GetDeviceConfig(voltDevice.SerialNum)
+
+	if strconv.Itoa(devConfig.UplinkPort) != voltDevice.NniPort {
+		logger.Errorw(ctx, "NNI port mismatch", log.Fields{"NNI Port": devConfig.UplinkPort, "NB NNI port": voltDevice.NniPort})
+		return
+	}
 	//Push Service Flows if DHCP relay is not configured
 	//or already DHCP flows are configured for the VPV
 	//to which the serivce is associated
@@ -1090,7 +1110,7 @@
 		if NonZeroMacAddress(vpv.MacAddr) || svc.MacLearning == MacLearningNone {
 			svc.AddHsiaFlows(cntx)
 		} else {
-			if err:= svc.AddUsHsiaFlows(cntx); err != nil {
+			if err := svc.AddUsHsiaFlows(cntx); err != nil {
 				logger.Warnw(ctx, "Add US hsia flow failed", log.Fields{"service": svc.Name, "Error": err})
 			}
 		}
@@ -1102,7 +1122,7 @@
 	if svc.IgmpEnabled && vpv.FlowsApplied {
 		logger.Infow(ctx, "Add Service - IGMP Flows", log.Fields{"Device": vpv.Device, "Port": vpv.Port})
 		if err := vpv.AddIgmpFlows(cntx); err != nil {
-			statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+			statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 			vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 		}
 
@@ -1149,7 +1169,7 @@
 // AddUsHsiaFlows to add upstream hsia flows
 func AddUsHsiaFlows(cntx context.Context, key, value interface{}) bool {
 	svc := value.(*VoltService)
-	if err:= svc.AddUsHsiaFlows(cntx); err != nil {
+	if err := svc.AddUsHsiaFlows(cntx); err != nil {
 		logger.Warnw(ctx, "Add US hsia flow failed", log.Fields{"service": svc.Name, "Error": err})
 	}
 	return true
@@ -1158,7 +1178,7 @@
 // AddDsHsiaFlows to add downstream hsia flows
 func AddDsHsiaFlows(cntx context.Context, key, value interface{}) bool {
 	svc := value.(*VoltService)
-	if err:= svc.AddDsHsiaFlows(cntx); err != nil {
+	if err := svc.AddDsHsiaFlows(cntx); err != nil {
 		logger.Warnw(ctx, "Add DS hsia flow failed", log.Fields{"service": svc.Name, "Error": err})
 	}
 	return true
@@ -1185,7 +1205,7 @@
 // DelDsHsiaFlows to delete hsia flows
 func DelDsHsiaFlows(cntx context.Context, key, value interface{}) bool {
 	svc := value.(*VoltService)
-	if err:= svc.DelDsHsiaFlows(cntx); err != nil {
+	if err := svc.DelDsHsiaFlows(cntx); err != nil {
 		logger.Warnw(ctx, "Delete DS hsia flow failed", log.Fields{"service": svc.Name, "Error": err})
 	}
 	return true
@@ -1194,7 +1214,7 @@
 // DelUsHsiaFlows to delete upstream hsia flows
 func DelUsHsiaFlows(cntx context.Context, key, value interface{}) bool {
 	svc := value.(*VoltService)
-	if err:= svc.DelUsHsiaFlows(cntx); err != nil {
+	if err := svc.DelUsHsiaFlows(cntx); err != nil {
 		logger.Warnw(ctx, "Delete US hsia flow failed", log.Fields{"service": svc.Name, "Error": err})
 	}
 	return true
@@ -1226,11 +1246,11 @@
 	if !vpv.FlowsApplied || vgcRebooted {
 		if vpv.DhcpRelay {
 			if err := vpv.AddUsDhcpFlows(cntx); err != nil {
-				statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+				statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 				vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 			}
 			if err := vpv.AddDsDhcpFlows(cntx); err != nil {
-				statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+				statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 				vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 			}
 			logger.Infow(ctx, "ICMPv6 MC Group modification will not be triggered to rwcore for ",
@@ -1238,18 +1258,18 @@
 			//vpv.updateICMPv6McGroup(true)
 		} else if vpv.ArpRelay {
 			if err := vpv.AddUsArpFlows(cntx); err != nil {
-				statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+				statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 				vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 			}
 			logger.Info(ctx, "ARP trap rules not added in downstream direction")
 
 		} else if vpv.PppoeIa {
 			if err := vpv.AddUsPppoeFlows(cntx); err != nil {
-				statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+				statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 				vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 			}
 			if err := vpv.AddDsPppoeFlows(cntx); err != nil {
-				statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+				statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 				vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 			}
 		}
@@ -1264,36 +1284,36 @@
 	// Delete HSIA & DHCP flows before deleting IGMP flows
 	if vpv.FlowsApplied || vgcRebooted {
 		if vpv.DhcpRelay {
-			if err:= vpv.DelUsDhcpFlows(cntx); err != nil {
+			if err := vpv.DelUsDhcpFlows(cntx); err != nil {
 				logger.Warnw(ctx, "Delete US hsia flow failed", log.Fields{"port": vpv.Port, "SVlan": vpv.SVlan, "CVlan": vpv.CVlan,
 					"UniVlan": vpv.UniVlan, "Error": err})
 			}
 			logger.Infow(ctx, "ICMPv6 MC Group modification will not be triggered to rwcore  for ",
 				log.Fields{"port": vpv.Port})
 			if err := vpv.DelDsDhcpFlows(cntx); err != nil {
-				statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+				statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 				vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 			}
 			//vpv.updateICMPv6McGroup(false)
 		} else if vpv.ArpRelay {
 			if err := vpv.DelUsArpFlows(cntx); err != nil {
-				statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+				statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 				vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 			}
 		} else if vpv.PppoeIa {
 			if err := vpv.DelUsPppoeFlows(cntx); err != nil {
-				statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+				statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 				vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 			}
 			if err := vpv.DelDsPppoeFlows(cntx); err != nil {
-				statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+				statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 				vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 			}
 		}
 		vpv.FlowsApplied = false
 		vpv.WriteToDb(cntx)
 	}
-	if err:= vpv.DelIgmpFlows(cntx); err != nil {
+	if err := vpv.DelIgmpFlows(cntx); err != nil {
 		logger.Warnw(ctx, "Delete igmp flow failed", log.Fields{"port": vpv.Port, "SVlan": vpv.SVlan, "CVlan": vpv.CVlan,
 			"UniVlan": vpv.UniVlan, "Error": err})
 	}
@@ -1334,33 +1354,16 @@
 		logger.Debugw(ctx, "Adding US DHCP flows", log.Fields{"Device": device})
 		if err1 := vpv.PushFlows(cntx, vd, flows); err1 != nil {
 			//push ind here ABHI
-			statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err1)
+			statusCode, statusMessage := errorCodes.GetErrorInfo(err1)
 			vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 		}
 	} else {
 		logger.Errorw(ctx, "US DHCP Flow Add Failed", log.Fields{"Reason": err.Error(), "Device": device})
 		//push ind here ABHI
-		statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+		statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 
 	}
-	/*
-	flows, err = vpv.BuildUsDhcp6Flows()
-	if err == nil {
-		logger.Debugw(ctx, "Adding US DHCP6 flows", log.Fields{"Device": device})
-		if err1 := vpv.PushFlows(vd, flows); err1 != nil {
-			//pussh ind here ABHI
-			statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err1)
-			vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
-
-		}
-	} else {
-		logger.Errorw(ctx, "US DHCP6 Flow Add Failed", log.Fields{"Reason": err.Error(), "Device": device})
-		//push ind here ABHI
-		statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
-		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
-
-	}*/
 	return nil
 }
 
@@ -1388,33 +1391,17 @@
 	if err == nil {
 		if err1 := vpv.PushFlows(cntx, vd, flows); err1 != nil {
 			//push ind here and procced
-			statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err1)
+			statusCode, statusMessage := errorCodes.GetErrorInfo(err1)
 			vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 
 		}
 	} else {
 		logger.Errorw(ctx, "DS DHCP Flow Add Failed", log.Fields{"Reason": err.Error()})
 		//send ind here and proceed
-		statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+		statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 
 	}
-	/*
-	flows, err = vpv.BuildDsDhcp6Flows()
-	if err == nil {
-		if err1 := vpv.PushFlows(vd, flows); err1 != nil {
-			//push ind and proceed
-			statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err1)
-			vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
-
-		}
-	} else {
-		logger.Errorw(ctx, "DS DHCP6 Flow Add Failed", log.Fields{"Reason": err.Error()})
-		//Send ind here and proceed
-		statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
-		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
-
-	}*/
 	if GetApplication().GetVendorID() != Radisys {
 		vd.GlobalDhcpFlowAdded = true
 	}
@@ -1424,12 +1411,12 @@
 // DelDhcpFlows deletes both US & DS DHCP flows applied for this Vnet instantiated on the port
 func (vpv *VoltPortVnet) DelDhcpFlows(cntx context.Context) {
 	if err := vpv.DelUsDhcpFlows(cntx); err != nil {
-		statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+		statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 	}
 
 	if err := vpv.DelDsDhcpFlows(cntx); err != nil {
-		statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+		statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 	}
 }
@@ -1445,15 +1432,10 @@
 
 	err = vpv.delDhcp4Flows(cntx, device)
 	if err != nil {
-		statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+		statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 	}
-	/*
-	err = vpv.delDhcp6Flows(device)
-	if err != nil {
-		statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
-		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
-	}*/
+
 	return nil
 }
 
@@ -1465,16 +1447,6 @@
 	logger.Errorw(ctx, "US DHCP Flow Delete Failed", log.Fields{"Reason": err.Error()})
 	return err
 }
-/*
-func (vpv *VoltPortVnet) delDhcp6Flows(device *VoltDevice) error {
-	flows, err := vpv.BuildUsDhcp6Flows()
-	if err == nil {
-		return vpv.RemoveFlows(device, flows)
-	}
-	logger.Errorw(ctx, "US DHCP6 Flow Delete Failed", log.Fields{"Reason": err.Error()})
-	return err
-
-}*/
 
 // DelDsDhcpFlows delete the DHCP flows applied for this Vnet instantiated on the port
 // Write the status of the VPV to the DB once the delete is scheduled
@@ -1486,15 +1458,15 @@
 	}
 	err = vpv.delDsDhcp4Flows(cntx, device)
 	if err != nil {
-		statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
+		statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 	}
 	/*
-	err = vpv.delDsDhcp6Flows(device)
-	if err != nil {
-		statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
-		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
-	}*/
+		err = vpv.delDsDhcp6Flows(device)
+		if err != nil {
+			statusCode, statusMessage := errorCodes.GetErrorInfo(err)
+			vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
+		}*/
 	return nil
 }
 
@@ -2126,14 +2098,8 @@
 	subFlow := of.NewVoltSubFlow()
 	subFlow.SetTableID(0)
 
-        if GetApplication().GetVendorID() == Radisys {
-                if err := vpv.setUsMatchVlan(subFlow); err != nil {
-                        return nil, err
-                }
-        } else {
-                subFlow.SetMatchVlan(vpv.UniVlan)
-                subFlow.SetSetVlan(vpv.CVlan)
-        }
+	subFlow.SetMatchVlan(vpv.UniVlan)
+	subFlow.SetSetVlan(vpv.CVlan)
 
 	uniport, err := GetApplication().GetPortID(vpv.Port)
 	if err != nil {
@@ -3226,7 +3192,7 @@
 func (vv *VoltVnet) JsonMarshal() ([]byte, error) {
 	return json.Marshal(VoltVnet{
 		VnetConfig: vv.VnetConfig,
-		Version: vv.Version,
+		Version:    vv.Version,
 		VnetOper: VnetOper{
 			PendingDeleteFlow:     vv.VnetOper.PendingDeleteFlow,
 			DeleteInProgress:      vv.VnetOper.DeleteInProgress,
