Fixing golang linters for VGC

Change-Id: I386d232c74ab47e24d92c18800dc144120b920da
diff --git a/internal/pkg/application/application.go b/internal/pkg/application/application.go
index 73a88a9..85f06be 100644
--- a/internal/pkg/application/application.go
+++ b/internal/pkg/application/application.go
@@ -146,13 +146,13 @@
 // as the identity. The SB is abstracted by VPAgent and the VPAgent transacts
 // using name as identity
 type VoltPort struct {
-	ID                       uint32
 	Name                     string
 	Device                   string
 	PonPort                  uint32
+	ActiveChannels           uint32
+	ID                       uint32
 	Type                     VoltPortType
 	State                    PortState
-	ActiveChannels           uint32
 	ChannelPerSubAlarmRaised bool
 }
 
@@ -191,31 +191,31 @@
 
 // VoltDevice fields :
 // Name:         This is the name presented by the device/VOLTHA. This doesn't
-//               have any relation to the physical device
+// have any relation to the physical device
 // SerialNum:    This is the serial number of the device and can be used to
-//               correlate the devices
+// correlate the devices
 // NniPort:      The identity of the NNI port
 // Ports:        List of all ports added to the device
 type VoltDevice struct {
-	Name                         string
-	SerialNum                    string
-	State                        controller.DeviceState
-	SouthBoundID                 string
-	NniPort                      string
-	Ports                        sync.Map
-	VlanPortStatus               sync.Map
-	VpvsBySvlan                  *util.ConcurrentMap // map[svlan]map[vnet_port]*VoltPortVnet
-	IgmpDsFlowAppliedForMvlan    map[uint16]bool
-	ConfiguredVlanForDeviceFlows *util.ConcurrentMap //map[string]map[string]bool
-	icmpv6GroupAdded             bool
-	ActiveChannelsPerPon         sync.Map            // [PonPortID]*PonPortCfg
-	ActiveChannelCountLock       sync.Mutex          // This lock is used to update ActiveIGMPChannels
-	PonPortList                  sync.Map            // [PonPortID]map[string]string
 	FlowAddEventMap              *util.ConcurrentMap //map[string]*FlowEvent
 	FlowDelEventMap              *util.ConcurrentMap //map[string]*FlowEvent
 	MigratingServices            *util.ConcurrentMap //<vnetID,<RequestID, MigrateServicesRequest>>
-	GlobalDhcpFlowAdded          bool
+	VpvsBySvlan                  *util.ConcurrentMap // map[svlan]map[vnet_port]*VoltPortVnet
+	ConfiguredVlanForDeviceFlows *util.ConcurrentMap //map[string]map[string]bool
+	IgmpDsFlowAppliedForMvlan    map[uint16]bool
+	State                        controller.DeviceState
+	SouthBoundID                 string
+	NniPort                      string
+	Name                         string
+	SerialNum                    string
+	Ports                        sync.Map
+	VlanPortStatus               sync.Map
+	ActiveChannelsPerPon         sync.Map   // [PonPortID]*PonPortCfg
+	PonPortList                  sync.Map   // [PonPortID]map[string]string
+	ActiveChannelCountLock       sync.Mutex // This lock is used to update ActiveIGMPChannels
 	NniDhcpTrapVid               of.VlanType
+	GlobalDhcpFlowAdded          bool
+	icmpv6GroupAdded             bool
 }
 
 // NewVoltDevice : Constructor for the device
@@ -243,7 +243,7 @@
 	return &d
 }
 
-//GetAssociatedVpvsForDevice - return the associated VPVs for given device & svlan
+// GetAssociatedVpvsForDevice - return the associated VPVs for given device & svlan
 func (va *VoltApplication) GetAssociatedVpvsForDevice(device string, svlan of.VlanType) *util.ConcurrentMap {
 	if d := va.GetDevice(device); d != nil {
 		return d.GetAssociatedVpvs(svlan)
@@ -251,10 +251,9 @@
 	return nil
 }
 
-//AssociateVpvsToDevice - updates the associated VPVs for given device & svlan
+// AssociateVpvsToDevice - updates the associated VPVs for given device & svlan
 func (va *VoltApplication) AssociateVpvsToDevice(device string, vpv *VoltPortVnet) {
 	if d := va.GetDevice(device); d != nil {
-
 		vpvMap := d.GetAssociatedVpvs(vpv.SVlan)
 		vpvMap.Set(vpv, true)
 		d.VpvsBySvlan.Set(vpv.SVlan, vpvMap)
@@ -264,7 +263,7 @@
 	logger.Errorw(ctx, "Set VPVMap failed: Device Not Found", log.Fields{"Svlan": vpv.SVlan, "Device": device})
 }
 
-//DisassociateVpvsFromDevice - disassociated VPVs from given device & svlan
+// DisassociateVpvsFromDevice - disassociated VPVs from given device & svlan
 func (va *VoltApplication) DisassociateVpvsFromDevice(device string, vpv *VoltPortVnet) {
 	if d := va.GetDevice(device); d != nil {
 		vpvMap := d.GetAssociatedVpvs(vpv.SVlan)
@@ -276,9 +275,8 @@
 	logger.Errorw(ctx, "Remove VPVMap failed: Device Not Found", log.Fields{"Svlan": vpv.SVlan, "Device": device})
 }
 
-//GetAssociatedVpvs - returns the associated VPVs for the given Svlan
+// GetAssociatedVpvs - returns the associated VPVs for the given Svlan
 func (d *VoltDevice) GetAssociatedVpvs(svlan of.VlanType) *util.ConcurrentMap {
-
 	var vpvMap *util.ConcurrentMap
 	var mapIntf interface{}
 	var ok bool
@@ -358,7 +356,6 @@
 
 // pushFlowsForUnis to send port-up-indication for uni ports.
 func (d *VoltDevice) pushFlowsForUnis(cntx context.Context) {
-
 	logger.Info(ctx, "NNI Discovered, Sending Port UP Ind for UNIs")
 	d.Ports.Range(func(key, value interface{}) bool {
 		port := key.(string)
@@ -380,7 +377,6 @@
 			vpv.VpvLock.Lock()
 			vpv.PortUpInd(cntx, d, port)
 			vpv.VpvLock.Unlock()
-
 		}
 		return true
 	})
@@ -398,57 +394,56 @@
 
 // VoltApplication fields :
 // ServiceByName - Stores the services by the name as key
-//                 A record of NB configuration.
+// A record of NB configuration.
 // VnetsByPort   - Stores the VNETs by the ports configured
-//                 from NB. A record of NB configuration.
+// from NB. A record of NB configuration.
 // VnetsByTag    - Stores the VNETs by the VLANS configured
-//                 from NB. A record of NB configuration.
+// from NB. A record of NB configuration.
 // VnetsByName   - Stores the VNETs by the name configured
-//                 from NB. A record of NB configuration.
+// from NB. A record of NB configuration.
 // DevicesDisc   - Stores the devices discovered from SB.
-//                 Should be updated only by events from SB
+// Should be updated only by events from SB
 // PortsDisc     - Stores the ports discovered from SB.
-//                 Should be updated only by events from SB
+// Should be updated only by events from SB
 type VoltApplication struct {
-	ServiceByName       sync.Map // [serName]*VoltService
-	VnetsByPort         sync.Map // [portName][]*VoltPortVnet
-	VnetsByTag          sync.Map // [svlan-cvlan-uvlan]*VoltVnet
-	VnetsByName         sync.Map // [vnetName]*VoltVnet
-	VnetsBySvlan        *util.ConcurrentMap
-	DevicesDisc         sync.Map
-	PortsDisc           sync.Map
-	IgmpGroups          sync.Map // [grpKey]*IgmpGroup
-	IgmpGroupIds        []*IgmpGroup
-	MvlanProfilesByTag  sync.Map
-	MvlanProfilesByName sync.Map
-	Icmpv6Receivers     sync.Map
 	MeterMgr
-	IgmpTasks           tasks.Tasks
-	IndicationsTasks    tasks.Tasks
-	MulticastAlarmTasks tasks.Tasks
-	portLock            sync.Mutex
-	DataMigrationInfo   DataMigration
-	DeviceCounters      sync.Map //[logicalDeviceId]*DeviceCounters
-	ServiceCounters     sync.Map //[serviceName]*ServiceCounters
-	NbDevice            sync.Map // [OLTSouthBoundID]*NbDevice
-	IgmpKPIsTasks       tasks.Tasks
-	pppoeTasks          tasks.Tasks
-	IgmpProfilesByName  sync.Map
-	OltIgmpInfoBySerial sync.Map
-	McastConfigMap      sync.Map //[OltSerialNo_MvlanProfileID]*McastConfig
-	// MacAddress-Port MAP to avoid swap of mac accross ports.
-	macPortLock sync.RWMutex
-	macPortMap  map[string]string
-
+	DataMigrationInfo     DataMigration
+	VnetsBySvlan          *util.ConcurrentMap
+	IgmpGroupIds          []*IgmpGroup
+	VoltPortVnetsToDelete map[*VoltPortVnet]bool
 	IgmpPendingPool       map[string]map[*IgmpGroup]bool //[grpkey, map[groupObj]bool]  //mvlan_grpName/IP
-	PendingPoolLock       sync.RWMutex
+	macPortMap            map[string]string
 	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
+	ServiceByName         sync.Map // [serName]*VoltService
+	VnetsByPort           sync.Map // [portName][]*VoltPortVnet
+	VnetsByTag            sync.Map // [svlan-cvlan-uvlan]*VoltVnet
+	VnetsByName           sync.Map // [vnetName]*VoltVnet
+	DevicesDisc           sync.Map
+	PortsDisc             sync.Map
+	IgmpGroups            sync.Map // [grpKey]*IgmpGroup
+	MvlanProfilesByTag    sync.Map
+	MvlanProfilesByName   sync.Map
+	Icmpv6Receivers       sync.Map
+	DeviceCounters        sync.Map //[logicalDeviceId]*DeviceCounters
+	ServiceCounters       sync.Map //[serviceName]*ServiceCounters
+	NbDevice              sync.Map // [OLTSouthBoundID]*NbDevice
+	OltIgmpInfoBySerial   sync.Map
+	McastConfigMap        sync.Map //[OltSerialNo_MvlanProfileID]*McastConfig
 	DevicesConfig         sync.Map //[serialNumber]*DeviceConfig
+	IgmpProfilesByName    sync.Map
+	IgmpTasks             tasks.Tasks
+	IndicationsTasks      tasks.Tasks
+	MulticastAlarmTasks   tasks.Tasks
+	IgmpKPIsTasks         tasks.Tasks
+	pppoeTasks            tasks.Tasks
+	OltFlowServiceConfig  OltFlowService
+	PendingPoolLock       sync.RWMutex
+	// MacAddress-Port MAP to avoid swap of mac across ports.
+	macPortLock sync.RWMutex
+	portLock    sync.Mutex
 }
 
 type DeviceConfig struct {
@@ -462,11 +457,11 @@
 
 // PonPortCfg contains NB port config and activeIGMPChannels count
 type PonPortCfg struct {
+	PortAlarmProfileID string
 	PortID             uint32
 	MaxActiveChannels  uint32
 	ActiveIGMPChannels uint32
 	EnableMulticastKPI bool
-	PortAlarmProfileID string
 }
 
 // NbDevice OLT Device info
@@ -477,7 +472,6 @@
 
 // RestoreNbDeviceFromDb restores the NB Device in case of VGC pod restart.
 func (va *VoltApplication) RestoreNbDeviceFromDb(cntx context.Context, deviceID string) *NbDevice {
-
 	nbDevice := NewNbDevice()
 	nbDevice.SouthBoundID = deviceID
 
@@ -522,7 +516,6 @@
 // AddPortToNbDevice Adds pon port to NB Device and DB
 func (nbd *NbDevice) AddPortToNbDevice(cntx context.Context, portID, allowedChannels uint32,
 	enableMulticastKPI bool, portAlarmProfileID string) *PonPortCfg {
-
 	ponPort := &PonPortCfg{
 		PortID:             portID,
 		MaxActiveChannels:  allowedChannels,
@@ -554,7 +547,6 @@
 		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})
 		}
-
 	}
 }
 
@@ -573,7 +565,7 @@
 	return nil
 }
 
-func (va *VoltApplication) AddDeviceConfig(cntx context.Context, serialNum, hardwareIdentifier, nasID, ipAddress, uplinkPort string, nniDhcpTrapId int) error {
+func (va *VoltApplication) AddDeviceConfig(cntx context.Context, serialNum, hardwareIdentifier, nasID, ipAddress, uplinkPort string, nniDhcpTrapID int) error {
 	var dc *DeviceConfig
 
 	deviceConfig := &DeviceConfig{
@@ -582,7 +574,7 @@
 		NasID:              nasID,
 		UplinkPort:         uplinkPort,
 		IPAddress:          ipAddress,
-		NniDhcpTrapVid:     nniDhcpTrapId,
+		NniDhcpTrapVid:     nniDhcpTrapID,
 	}
 	va.DevicesConfig.Store(serialNum, deviceConfig)
 	err := dc.WriteDeviceConfigToDb(cntx, serialNum, deviceConfig)
@@ -594,7 +586,7 @@
 	// If device is already discovered update the VoltDevice structure
 	device, id := va.GetDeviceBySerialNo(serialNum)
 	if device != nil {
-		device.NniDhcpTrapVid = of.VlanType(nniDhcpTrapId)
+		device.NniDhcpTrapVid = of.VlanType(nniDhcpTrapID)
 		va.DevicesDisc.Store(id, device)
 	}
 
@@ -611,7 +603,6 @@
 
 // UpdatePortToNbDevice Adds pon port to NB Device and DB
 func (nbd *NbDevice) UpdatePortToNbDevice(cntx context.Context, portID, allowedChannels uint32, enableMulticastKPI bool, portAlarmProfileID string) *PonPortCfg {
-
 	p, exists := nbd.PonPorts.Load(portID)
 	if !exists {
 		logger.Errorw(ctx, "PON port not exists in nb-device", log.Fields{"portID": portID})
@@ -631,7 +622,6 @@
 
 // DeletePortFromNbDevice Deletes pon port from NB Device and DB
 func (nbd *NbDevice) DeletePortFromNbDevice(cntx context.Context, portID uint32) {
-
 	if _, ok := nbd.PonPorts.Load(portID); ok {
 		nbd.PonPorts.Delete(portID)
 	}
@@ -670,9 +660,8 @@
 	return &va
 }
 
-//GetFlowEventRegister - returs the register based on flow mod type
+// GetFlowEventRegister - returs the register based on flow mod type
 func (d *VoltDevice) GetFlowEventRegister(flowModType of.Command) (*util.ConcurrentMap, error) {
-
 	switch flowModType {
 	case of.CommandDel:
 		return d.FlowDelEventMap, nil
@@ -750,7 +739,7 @@
 	va.IgmpGroupIds = append([]*IgmpGroup{ig}, va.IgmpGroupIds[0:]...)
 }
 
-//RestoreUpgradeStatus - gets upgrade/migration status from DB and updates local flags
+// RestoreUpgradeStatus - gets upgrade/migration status from DB and updates local flags
 func (va *VoltApplication) RestoreUpgradeStatus(cntx context.Context) {
 	Migrate := new(DataMigration)
 	if err := GetMigrationInfo(cntx, Migrate); err == nil {
@@ -792,7 +781,7 @@
 	logger.Info(ctx, "Reconciled from DB")
 }
 
-// InitStaticConfig to initialise static config.
+// InitStaticConfig to initialize static config.
 func (va *VoltApplication) InitStaticConfig() {
 	va.InitIgmpSrcMac()
 }
@@ -949,7 +938,7 @@
 	}
 }
 
-//PortUpdateInd Updates port Id incase of ONU movement
+// PortUpdateInd Updates port Id incase of ONU movement
 func (va *VoltApplication) PortUpdateInd(device string, portName string, id uint32) {
 	logger.Infow(ctx, "Received Port Ind: Update", log.Fields{"Device": device, "Port": portName})
 	va.portLock.Lock()
@@ -965,7 +954,6 @@
 // AddNbPonPort Add pon port to nbDevice
 func (va *VoltApplication) AddNbPonPort(cntx context.Context, oltSbID string, portID, maxAllowedChannels uint32,
 	enableMulticastKPI bool, portAlarmProfileID string) error {
-
 	var nbd *NbDevice
 	nbDevice, ok := va.NbDevice.Load(oltSbID)
 
@@ -996,7 +984,6 @@
 
 // UpdateNbPonPort update pon port to nbDevice
 func (va *VoltApplication) UpdateNbPonPort(cntx context.Context, oltSbID string, portID, maxAllowedChannels uint32, enableMulticastKPI bool, portAlarmProfileID string) error {
-
 	var nbd *NbDevice
 	nbDevice, ok := va.NbDevice.Load(oltSbID)
 
@@ -1078,7 +1065,6 @@
 
 // NniDownInd process for Nni down indication.
 func (va *VoltApplication) NniDownInd(cntx context.Context, deviceID string, devSrNo string) {
-
 	logger.Debugw(ctx, "NNI Down Ind", log.Fields{"device": devSrNo})
 
 	handleIgmpDsFlows := func(key interface{}, value interface{}) bool {
@@ -1124,7 +1110,6 @@
 		d.State = controller.DeviceStateREBOOTED
 	}
 	va.HandleFlowClearFlag(cntx, device, serialNum, southBoundID)
-
 }
 
 // DeviceDisableInd handles device deactivation process
@@ -1143,7 +1128,6 @@
 
 // ProcessIgmpDSFlowForMvlan for processing Igmp DS flow for device
 func (va *VoltApplication) ProcessIgmpDSFlowForMvlan(cntx context.Context, d *VoltDevice, mvp *MvlanProfile, addFlow bool) {
-
 	logger.Debugw(ctx, "Process IGMP DS Flows for MVlan", log.Fields{"device": d.Name, "Mvlan": mvp.Mvlan, "addFlow": addFlow})
 	portState := false
 	p := d.GetPort(d.NniPort)
@@ -1299,13 +1283,12 @@
 	}
 }
 
-//NniVlanIndToIgmp - Trigger receiver up indication to all ports with igmp enabled
-//and has the provided mvlan
+// NniVlanIndToIgmp - Trigger receiver up indication to all ports with igmp enabled
+// and has the provided mvlan
 func (va *VoltApplication) NniVlanIndToIgmp(device *VoltDevice, mvp *MvlanProfile) {
-
 	logger.Infow(ctx, "Sending Igmp Receiver UP indication for all Services", log.Fields{"Vlan": mvp.Mvlan})
 
-	//Trigger nni indication for receiver only for first time
+	// Trigger nni indication for receiver only for first time
 	if device.IgmpDsFlowAppliedForMvlan[uint16(mvp.Mvlan)] {
 		return
 	}
@@ -1318,7 +1301,7 @@
 				return true
 			}
 			for _, vpv := range vpvs.([]*VoltPortVnet) {
-				//Send indication only for subscribers with the received mvlan profile
+				// Send indication only for subscribers with the received mvlan profile
 				if vpv.IgmpEnabled && vpv.MvlanProfileName == mvp.Name {
 					vpv.services.Range(ReceiverUpInd)
 				}
@@ -1343,7 +1326,7 @@
 		return
 	}
 
-	//Fixme: If Port Update Comes in large numbers, this will result in slow update per device
+	// Fixme: If Port Update Comes in large numbers, this will result in slow update per device
 	va.portLock.Lock()
 	// Do not defer the port mutex unlock here
 	// Some of the following func calls needs the port lock, so defering the lock here
@@ -1360,7 +1343,6 @@
 
 	logger.Infow(ctx, "Received SouthBound Port Ind: UP", log.Fields{"Device": device, "PortName": port, "PortId": p.ID})
 	if p.Type == VoltPortTypeNni {
-
 		logger.Warnw(ctx, "Received NNI Port Ind: UP", log.Fields{"Device": device, "PortName": port, "PortId": p.ID})
 		//va.PushDevFlowForDevice(d)
 		//Build Igmp TrapFlowRule
@@ -1373,7 +1355,7 @@
 		return
 	}
 
-	//If NNI port is not UP, do not push Flows
+	// If NNI port is not UP, do not push Flows
 	if d.NniPort == "" {
 		logger.Warnw(ctx, "NNI port not UP. Not sending Port UP Ind for VPVs", log.Fields{"NNI": d.NniPort})
 		return
@@ -1383,7 +1365,7 @@
 	if vpvList[0].PonPort != 0xFF && vpvList[0].PonPort != p.PonPort {
 		logger.Errorw(ctx, "UNI port discovered on wrong PON Port. Dropping Port Indication", log.Fields{"Device": device, "Port": port, "DetectedPon": p.PonPort, "ExpectedPon": vpvList[0].PonPort})
 
-		//Remove the flow (if any) which are already installed - Valid for PON switching when VGC pod is DOWN
+		// Remove the flow (if any) which are already installed - Valid for PON switching when VGC pod is DOWN
 		for _, vpv := range vpvs.([]*VoltPortVnet) {
 			vpv.VpvLock.Lock()
 			logger.Warnw(ctx, "Removing existing VPVs/Services flows for for Subscriber: UNI Detected on wrong PON", log.Fields{"Port": vpv.Port, "Vnet": vpv.VnetName})
@@ -1398,9 +1380,9 @@
 
 	for _, vpv := range vpvs.([]*VoltPortVnet) {
 		vpv.VpvLock.Lock()
-		//If no service is activated drop the portUpInd
+		// If no service is activated drop the portUpInd
 		if vpv.IsServiceActivated(cntx) {
-			//Do not trigger indication for the vpv which is already removed from vpv list as
+			// Do not trigger indication for the vpv which is already removed from vpv list as
 			// part of service delete (during the lock wait duration)
 			// In that case, the services associated wil be zero
 			if vpv.servicesCount.Load() != 0 {
@@ -1435,7 +1417,7 @@
 
 }*/
 
-//ReceiverUpInd - Send receiver up indication for service with Igmp enabled
+// ReceiverUpInd - Send receiver up indication for service with Igmp enabled
 func ReceiverUpInd(key, value interface{}) bool {
 	svc := value.(*VoltService)
 	var vlan of.VlanType
@@ -1445,7 +1427,7 @@
 		return false
 	}
 
-	//Send port up indication to igmp only for service with igmp enabled
+	// Send port up indication to igmp only for service with igmp enabled
 	if svc.IgmpEnabled {
 		if svc.VlanControl == ONUCVlan || svc.VlanControl == ONUCVlanOLTSVlan {
 			vlan = svc.CVlan
@@ -1470,7 +1452,7 @@
 		logger.Warnw(ctx, "Device Not Found - Dropping Port Ind: DOWN", log.Fields{"Device": device, "Port": port})
 		return
 	}
-	//Fixme: If Port Update Comes in large numbers, this will result in slow update per device
+	// Fixme: If Port Update Comes in large numbers, this will result in slow update per device
 	va.portLock.Lock()
 	// Do not defer the port mutex unlock here
 	// Some of the following func calls needs the port lock, so defering the lock here
@@ -1656,7 +1638,7 @@
 		for k := range dev.(*VoltDevice).IgmpDsFlowAppliedForMvlan {
 			delete(dev.(*VoltDevice).IgmpDsFlowAppliedForMvlan, k)
 		}
-		//Delete group 1 - ICMPv6/ARP group
+		// Delete group 1 - ICMPv6/ARP group
 		if err := ProcessIcmpv6McGroup(deviceID, true); err != nil {
 			logger.Errorw(ctx, "ProcessIcmpv6McGroup failed", log.Fields{"Device": deviceID, "Error": err})
 		}
@@ -1676,7 +1658,7 @@
 
 				if vpv.IgmpEnabled {
 					va.ReceiverDownInd(cntx, vpv.Device, vpv.Port)
-					//Also clear service igmp stats
+					// Also clear service igmp stats
 					vpv.ClearServiceCounters(cntx)
 				}
 			}
@@ -1685,15 +1667,15 @@
 	}
 	va.VnetsByPort.Range(getVpvs)
 
-	//Clear Static Group
+	// Clear Static Group
 	va.ReceiverDownInd(cntx, deviceID, StaticPort)
 
 	logger.Warnw(ctx, "All flags cleared for device", log.Fields{"Device": deviceID})
 
-	//Reset pending group pool
+	// Reset pending group pool
 	va.RemovePendingGroups(cntx, deviceID, true)
 
-	//Process all Migrate Service Request - force udpate all profiles since resources are already cleaned up
+	// Process all Migrate Service Request - force udpate all profiles since resources are already cleaned up
 	if dev != nil {
 		triggerForceUpdate := func(key, value interface{}) bool {
 			msrList := value.(*util.ConcurrentMap)
@@ -1711,15 +1693,14 @@
 	}
 }
 
-//GetPonPortIDFromUNIPort to get pon port id from uni port
+// GetPonPortIDFromUNIPort to get pon port id from uni port
 func GetPonPortIDFromUNIPort(uniPortID uint32) uint32 {
 	ponPortID := (uniPortID & 0x0FF00000) >> 20
 	return ponPortID
 }
 
-//ProcessFlowModResultIndication - Processes Flow mod operation indications from controller
+// ProcessFlowModResultIndication - Processes Flow mod operation indications from controller
 func (va *VoltApplication) ProcessFlowModResultIndication(cntx context.Context, flowStatus intf.FlowStatus) {
-
 	d := va.GetDevice(flowStatus.Device)
 	if d == nil {
 		logger.Errorw(ctx, "Dropping Flow Mod Indication. Device not found", log.Fields{"Cookie": flowStatus.Cookie, "Device": flowStatus.Device})
@@ -1743,9 +1724,8 @@
 	logger.Errorw(ctx, "Flow Failure Notification", log.Fields{"uniPort": uniPort, "Cookie": cookie})
 }
 
-//UpdateMvlanProfilesForDevice to update mvlan profile for device
+// UpdateMvlanProfilesForDevice to update mvlan profile for device
 func (va *VoltApplication) UpdateMvlanProfilesForDevice(cntx context.Context, device string) {
-
 	checkAndAddMvlanUpdateTask := func(key, value interface{}) bool {
 		mvp := value.(*MvlanProfile)
 		if mvp.IsUpdateInProgressForDevice(device) {
@@ -1779,16 +1759,13 @@
 
 // UpdateDeviceSerialNumberList to update the device serial number list after device serial number is updated for vnet and mvlan
 func (va *VoltApplication) UpdateDeviceSerialNumberList(oldOltSlNo string, newOltSlNo string) {
-
 	voltDevice, _ := va.GetDeviceBySerialNo(oldOltSlNo)
 
 	if voltDevice != nil {
 		// Device is present with old serial number ID
 		logger.Errorw(ctx, "OLT Migration cannot be completed as there are dangling devices", log.Fields{"Serial Number": oldOltSlNo})
-
 	} else {
 		logger.Infow(ctx, "No device present with old serial number", log.Fields{"Serial Number": oldOltSlNo})
-
 		// Add Serial Number to Blocked Devices List.
 		cntlr.GetController().AddBlockedDevices(oldOltSlNo)
 		cntlr.GetController().AddBlockedDevices(newOltSlNo)
@@ -1824,14 +1801,12 @@
 		// Clear the serial number from Blocked Devices List
 		cntlr.GetController().DelBlockedDevices(oldOltSlNo)
 		cntlr.GetController().DelBlockedDevices(newOltSlNo)
-
 	}
 }
 
 // GetVpvsForDsPkt to get vpv for downstream packets
 func (va *VoltApplication) GetVpvsForDsPkt(cvlan of.VlanType, svlan of.VlanType, clientMAC net.HardwareAddr,
 	pbit uint8) ([]*VoltPortVnet, error) {
-
 	var matchVPVs []*VoltPortVnet
 	findVpv := func(key, value interface{}) bool {
 		vpvs := value.([]*VoltPortVnet)
@@ -1899,7 +1874,7 @@
 	}
 }
 
-//AddGroupToPendingPool - adds the IgmpGroup with active group table entry to global pending pool
+// AddGroupToPendingPool - adds the IgmpGroup with active group table entry to global pending pool
 func (va *VoltApplication) AddGroupToPendingPool(ig *IgmpGroup) {
 	var grpMap map[*IgmpGroup]bool
 	var ok bool
@@ -1925,7 +1900,7 @@
 	}
 }
 
-//RemoveGroupFromPendingPool - removes the group from global pending group pool
+// RemoveGroupFromPendingPool - removes the group from global pending group pool
 func (va *VoltApplication) RemoveGroupFromPendingPool(device string, ig *IgmpGroup) bool {
 	GetApplication().PendingPoolLock.Lock()
 	defer GetApplication().PendingPoolLock.Unlock()
@@ -1940,7 +1915,7 @@
 	return false
 }
 
-//RemoveGroupsFromPendingPool - removes the group from global pending group pool
+// RemoveGroupsFromPendingPool - removes the group from global pending group pool
 func (va *VoltApplication) RemoveGroupsFromPendingPool(cntx context.Context, device string, mvlan of.VlanType) {
 	GetApplication().PendingPoolLock.Lock()
 	defer GetApplication().PendingPoolLock.Unlock()
@@ -1951,7 +1926,7 @@
 	va.RemoveGroupListFromPendingPool(cntx, key)
 }
 
-//RemoveGroupListFromPendingPool - removes the groups for provided key
+// RemoveGroupListFromPendingPool - removes the groups for provided key
 // 1. Deletes the group from device
 // 2. Delete the IgmpGroup obj and release the group ID to pool
 // Note: Make sure to obtain PendingPoolLock lock before calling this func
@@ -1966,18 +1941,16 @@
 	}
 }
 
-//RemoveGroupDevicesFromPendingPool - removes the group from global pending group pool
+// RemoveGroupDevicesFromPendingPool - removes the group from global pending group pool
 func (va *VoltApplication) RemoveGroupDevicesFromPendingPool(ig *IgmpGroup) {
-
 	logger.Infow(ctx, "Removing IgmpGroup for all devices from Global Pending Pool", log.Fields{"GroupID": ig.GroupID, "GroupName": ig.GroupName, "GroupAddr": ig.GroupAddr, "PendingDevices": len(ig.Devices)})
 	for device := range ig.PendingGroupForDevice {
 		va.RemoveGroupFromPendingPool(device, ig)
 	}
 }
 
-//GetGroupFromPendingPool - Returns IgmpGroup obj from global pending pool
+// GetGroupFromPendingPool - Returns IgmpGroup obj from global pending pool
 func (va *VoltApplication) GetGroupFromPendingPool(mvlan of.VlanType, device string) *IgmpGroup {
-
 	var ig *IgmpGroup
 
 	va.PendingPoolLock.Lock()
@@ -1986,43 +1959,42 @@
 	key := getPendingPoolKey(mvlan, device)
 	logger.Infow(ctx, "Getting IgmpGroup from Global Pending Pool", log.Fields{"Device": device, "Mvlan": mvlan.String(), "Key": key})
 
-	//Gets all IgmpGrp Obj for the device
+	// Gets all IgmpGrp Obj for the device
 	grpMap, ok := va.IgmpPendingPool[key]
 	if !ok || len(grpMap) == 0 {
 		logger.Infow(ctx, "Matching IgmpGroup not found in Global Pending Pool", log.Fields{"Device": device, "Mvlan": mvlan.String()})
 		return nil
 	}
 
-	//Gets a random obj from available grps
+	// Gets a random obj from available grps
 	for ig = range grpMap {
-
-		//Remove grp obj reference from all devices associated in pending pool
+		// Remove grp obj reference from all devices associated in pending pool
 		for dev := range ig.Devices {
 			key := getPendingPoolKey(mvlan, dev)
 			delete(va.IgmpPendingPool[key], ig)
 		}
 
-		//Safety check to avoid re-allocating group already in use
+		// Safety check to avoid re-allocating group already in use
 		if ig.NumDevicesActive() == 0 {
 			return ig
 		}
 
-		//Iteration will continue only if IG is not allocated
+		// Iteration will continue only if IG is not allocated
 	}
 	return nil
 }
 
-//RemovePendingGroups - removes all pending groups for provided reference from global pending pool
+// RemovePendingGroups - removes all pending groups for provided reference from global pending pool
 // reference - mvlan/device ID
 // isRefDevice - true  - Device as reference
-//               false - Mvlan as reference
+// false - Mvlan as reference
 func (va *VoltApplication) RemovePendingGroups(cntx context.Context, reference string, isRefDevice bool) {
 	va.PendingPoolLock.Lock()
 	defer va.PendingPoolLock.Unlock()
 
 	logger.Infow(ctx, "Removing IgmpGroups from Global Pending Pool", log.Fields{"Reference": reference, "isRefDevice": isRefDevice})
 
-	//Pending Pool key: "<mvlan>_<DeviceID>""
+	// Pending Pool key: "<mvlan>_<DeviceID>""
 	paramPosition := 0
 	if isRefDevice {
 		paramPosition = 1
@@ -2053,7 +2025,7 @@
 	va.IgmpGroups.Range(removeExpiredGroups)
 }
 
-//TriggerPendingProfileDeleteReq - trigger pending profile delete request
+// TriggerPendingProfileDeleteReq - trigger pending profile delete request
 func (va *VoltApplication) TriggerPendingProfileDeleteReq(cntx context.Context, device string) {
 	va.TriggerPendingServiceDeleteReq(cntx, device)
 	va.TriggerPendingVpvDeleteReq(cntx, device)
@@ -2061,9 +2033,8 @@
 	logger.Warnw(ctx, "All Pending Profile Delete triggered for device", log.Fields{"Device": device})
 }
 
-//TriggerPendingServiceDeleteReq - trigger pending service delete request
+// TriggerPendingServiceDeleteReq - trigger pending service delete request
 func (va *VoltApplication) TriggerPendingServiceDeleteReq(cntx context.Context, device string) {
-
 	logger.Warnw(ctx, "Pending Services to be deleted", log.Fields{"Count": len(va.ServicesToDelete)})
 	for serviceName := range va.ServicesToDelete {
 		logger.Debugw(ctx, "Trigger Service Delete", log.Fields{"Service": serviceName})
@@ -2081,9 +2052,8 @@
 	}
 }
 
-//TriggerPendingVpvDeleteReq - trigger pending VPV delete request
+// TriggerPendingVpvDeleteReq - trigger pending VPV delete request
 func (va *VoltApplication) TriggerPendingVpvDeleteReq(cntx context.Context, device string) {
-
 	logger.Warnw(ctx, "Pending VPVs to be deleted", log.Fields{"Count": len(va.VoltPortVnetsToDelete)})
 	for vpv := range va.VoltPortVnetsToDelete {
 		if vpv.Device == device {
@@ -2093,9 +2063,8 @@
 	}
 }
 
-//TriggerPendingVnetDeleteReq - trigger pending vnet delete request
+// TriggerPendingVnetDeleteReq - trigger pending vnet delete request
 func (va *VoltApplication) TriggerPendingVnetDeleteReq(cntx context.Context, device string) {
-
 	logger.Warnw(ctx, "Pending Vnets to be deleted", log.Fields{"Count": len(va.VnetsToDelete)})
 	for vnetName := range va.VnetsToDelete {
 		if vnetIntf, _ := va.VnetsByName.Load(vnetName); vnetIntf != nil {
@@ -2112,8 +2081,8 @@
 }
 
 type OltFlowService struct {
+	DefaultTechProfileID int  `json:"defaultTechProfileId"`
 	EnableDhcpOnNni      bool `json:"enableDhcpOnNni"`
-	DefaultTechProfileId int  `json:"defaultTechProfileId"`
 	EnableIgmpOnNni      bool `json:"enableIgmpOnNni"`
 	EnableEapol          bool `json:"enableEapol"`
 	EnableDhcpV6         bool `json:"enableDhcpV6"`
diff --git a/internal/pkg/application/dhcprelay.go b/internal/pkg/application/dhcprelay.go
index e32a7d0..346bd3d 100644
--- a/internal/pkg/application/dhcprelay.go
+++ b/internal/pkg/application/dhcprelay.go
@@ -107,11 +107,11 @@
 // to the network. It supports two VLANs as its identify. If a single VLAN or
 // no VLAN is to be used, those two should be passed as 4096 (VlanNone)
 type DhcpRelayVnet struct {
-	OuterVlan   uint16
-	InnerVlan   uint16
 	sessions    map[[6]byte]IDhcpRelaySession
 	sessionsv6  map[[MaxLenDhcpv6DUID]byte]IDhcpRelaySession
 	sessionLock sync.RWMutex
+	OuterVlan   uint16
+	InnerVlan   uint16
 }
 
 // DhcpNetworks hosts different DHCP networks that in turn hold the DHCP
@@ -270,7 +270,6 @@
 
 // GetVlansFromPacket to get vlans from the packet
 func GetVlansFromPacket(pkt gopacket.Packet) (innerVlan of.VlanType, outerVlan of.VlanType) {
-
 	vlans := GetVlans(pkt)
 	if len(vlans) == 1 {
 		outerVlan = vlans[0]
@@ -375,7 +374,6 @@
 
 // getDhcpv6ClientDUID to get Dhcpv6 client DUID
 func getDhcpv6ClientDUID(dhcpv6 *layers.DHCPv6) ([]byte, *layers.DHCPv6DUID) {
-
 	for _, option := range dhcpv6.Options {
 		logger.Debugw(ctx, "DHCPv6 Options", log.Fields{"option": option.Code})
 		if option.Code == layers.DHCPv6OptClientID {
@@ -475,7 +473,7 @@
 	return dhcp.YourClientIP, int64(leaseTime)
 }
 
-//GetIPv4LeaseTime get ip lease time
+// GetIPv4LeaseTime get ip lease time
 func GetIPv4LeaseTime(opt layers.DHCPOption) uint32 {
 	return uint32(opt.Data[0])<<24 | uint32(opt.Data[1])<<16 | uint32(opt.Data[2])<<8 | uint32(opt.Data[3])
 }
@@ -502,7 +500,6 @@
 	if dhcp6.MsgType == layers.DHCPv6MsgTypeReply {
 		for _, o := range dhcp6.Options {
 			if o.Code == layers.DHCPv6OptIANA {
-
 				iana := &layers.DHCPv6IANA{}
 				err := iana.DecodeFromBytes(o.Data)
 				if err == nil {
@@ -526,7 +523,6 @@
 	if dhcp6.MsgType == layers.DHCPv6MsgTypeReply {
 		for _, o := range dhcp6.Options {
 			if o.Code == layers.DHCPv6OptIAPD {
-
 				iapd := &layers.DHCPv6IAPD{}
 				if err := iapd.DecodeFromBytes(o.Data); err == nil {
 					ipv6Addr = iapd.PD.Prefix
@@ -550,7 +546,6 @@
 // common map. The key for retrieval includes the VLAN tags in the
 // the packet and the MAC address of the client.
 func (va *VoltApplication) ProcessDsDhcpv4Packet(cntx context.Context, device string, port string, pkt gopacket.Packet) {
-
 	// Retrieve the layers to build the outgoing packet. It is not
 	// possible to add/remove layers to the existing packet and thus
 	// the lyayers are extracted to build the outgoing packet
@@ -605,7 +600,6 @@
 					go vpv.SetMacAddr(cntx, dhcp4.ClientHWAddr)
 				}
 				vpv.DhcpResultInd(cntx, dhcp4)
-
 			}
 			raiseDHCPv4Indication(msgType, vpv, dhcp4.ClientHWAddr, ipAddr, dsPbit, device, leaseTime)
 		}
@@ -687,7 +681,6 @@
 // raiseDHCPv4Indication process DHCPv4 packet and raise indication
 func raiseDHCPv4Indication(msgType layers.DHCPMsgType, vpv *VoltPortVnet, smac net.HardwareAddr,
 	ip net.IP, pktPbit uint8, device string, leaseTime int64) {
-
 	logger.Debugw(ctx, "Processing Dhcpv4 packet", log.Fields{"ethsrcMac": smac.String(),
 		"MacLearningInVPV": vpv.MacLearning, "MacConfigured": vpv.MacAddr, "dhcpType": msgType,
 		"vlanPriority": pktPbit, "VPVLearntMac": vpv.LearntMacAddr})
@@ -731,7 +724,6 @@
 // raiseDHCPv6Indication process DHCPv6 packet and raise indication
 func raiseDHCPv6Indication(msgType layers.DHCPv6MsgType, vpv *VoltPortVnet,
 	smac net.HardwareAddr, ip net.IP, pktPbit uint8, device string, leaseTime uint32) {
-
 	logger.Debugw(ctx, "Processing DHCPv6 packet", log.Fields{"dhcpType": msgType,
 		"vlanPriority": pktPbit, "dhcpClientMac": smac.String(),
 		"MacLearningInVPV": vpv.MacLearning, "MacConfigured": vpv.MacAddr,
@@ -933,7 +925,7 @@
 // We determine the packet direction and process it based on the direction
 func (va *VoltApplication) ProcessUDP4Packet(cntx context.Context, device string, port string, pkt gopacket.Packet) {
 	// Currently DHCP is the only application supported by the application
-	// We check for DHCP before proceeding futher. In future, this could be
+	// We check for DHCP before proceeding further. In future, this could be
 	// based on registration and the callbacks
 	dhcpl := pkt.Layer(layers.LayerTypeDHCPv4)
 	if dhcpl == nil {
@@ -950,7 +942,6 @@
 		// This is a downstream packet
 		va.ProcessDsDhcpv4Packet(cntx, device, port, pkt)
 	}
-
 }
 
 // ProcessUDP6Packet : CallBack function registered with application to handle DHCPv6 packetIn
@@ -1018,6 +1009,7 @@
 	return dhcp6
 }
 
+// nolint: gocyclo
 // ProcessUsDhcpv6Packet to rpocess upstream DHCPv6 packet
 func (va *VoltApplication) ProcessUsDhcpv6Packet(cntx context.Context, device string, port string, pkt gopacket.Packet) {
 	// We received the packet on an access port and the service for the packet can be
@@ -1144,7 +1136,6 @@
 			qdot1q := &layers.Dot1Q{Priority: priority, VLANIdentifier: vlan, DropEligible: dropEligible, Type: nxtLayer}
 			qVlanLayers = append(qVlanLayers, qdot1q)
 		}
-
 	}
 	switch vpv.VlanControl {
 	case ONUCVlanOLTSVlan,
@@ -1240,7 +1231,6 @@
 	ipv6Addr, leaseTime := GetIpv6Addr(dhcp6)
 
 	for _, vpv := range vpvList {
-
 		dsPbit = vpv.GetRemarkedPriority(priority)
 		// Raise DHCPv6 Reply indication
 		if vpv.DhcpRelay {
@@ -1303,7 +1293,6 @@
 				qdot1q := &layers.Dot1Q{Priority: priority, VLANIdentifier: vlan, DropEligible: dropEligible, Type: nxtLayer}
 				qVlanLayers = append(qVlanLayers, qdot1q)
 			}
-
 		}
 		switch vpv.VlanControl {
 		case ONUCVlanOLTSVlan:
@@ -1347,12 +1336,12 @@
 type DhcpAllocation struct {
 	SubscriberID        string           `json:"subscriberId"`
 	ConnectPoint        string           `json:"connectPoint"`
+	AllocationTimeStamp time.Time        `json:"allocationTimestamp"`
 	MacAddress          net.HardwareAddr `json:"macAddress"`
+	CircuitID           []byte           `json:"circuitId"`
+	IPAllocated         net.IP           `json:"ipAllocated"`
 	State               int              `json:"state"`
 	VlanID              int              `json:"vlanId"`
-	CircuitID           []byte           `json:"circuitId"`
-	IpAllocated         net.IP           `json:"ipAllocated"`
-	AllocationTimeStamp time.Time        `json:"allocationTimestamp"`
 }
 
 // GetAllocations returns DhcpAllocation info for all devices or for a device ID
@@ -1381,7 +1370,7 @@
 						State:               int(vpv.RelayState),
 						VlanID:              int(vpv.SVlan),
 						CircuitID:           vpv.CircuitID,
-						IpAllocated:         vpv.Ipv4Addr,
+						IPAllocated:         vpv.Ipv4Addr,
 						AllocationTimeStamp: vpv.DhcpExpiryTime,
 					}
 					logger.Debugw(ctx, "DHCP Allocation found", log.Fields{"DhcpAlloc": allocation})
@@ -1395,9 +1384,9 @@
 }
 
 type MacLearnerInfo struct {
-	DeviceId   string `json:"deviceId"`
+	DeviceID   string `json:"deviceId"`
 	PortNumber string `json:"portNumber"`
-	VlanId     string `json:"vlanId"`
+	VlanID     string `json:"vlanId"`
 	MacAddress string `json:"macAddress"`
 }
 
@@ -1411,9 +1400,9 @@
 			vpv, ok := session.(*VoltPortVnet)
 			if ok {
 				macLearn := MacLearnerInfo{
-					DeviceId:   vpv.Device,
+					DeviceID:   vpv.Device,
 					PortNumber: vpv.Port,
-					VlanId:     vpv.SVlan.String(),
+					VlanID:     vpv.SVlan.String(),
 					MacAddress: vpv.MacAddr.String(),
 				}
 				logger.Debugw(ctx, "MacLerner found", log.Fields{"MacLearn": macLearn})
@@ -1425,7 +1414,7 @@
 	return macLearner, nil
 }
 
-func (va *VoltApplication) GetMacLearnerInfo(cntx context.Context, deviceId, portNumber, vlanId string) (MacLearnerInfo, error) {
+func (va *VoltApplication) GetMacLearnerInfo(cntx context.Context, deviceID, portNumber, vlanID string) (MacLearnerInfo, error) {
 	logger.Info(ctx, "GetMecLearnerInfo")
 	macLearn := MacLearnerInfo{}
 	for _, drv := range dhcpNws.Networks {
@@ -1434,19 +1423,19 @@
 		for _, session := range drv.sessions {
 			vpv, ok := session.(*VoltPortVnet)
 			if ok {
-				if deviceId == vpv.Device && portNumber == vpv.Port && vlanId == vpv.SVlan.String() {
+				if deviceID == vpv.Device && portNumber == vpv.Port && vlanID == vpv.SVlan.String() {
 					macLearn = MacLearnerInfo{
-						DeviceId:   vpv.Device,
+						DeviceID:   vpv.Device,
 						PortNumber: vpv.Port,
-						VlanId:     vpv.SVlan.String(),
+						VlanID:     vpv.SVlan.String(),
 						MacAddress: vpv.MacAddr.String(),
 					}
 					logger.Infow(ctx, "MacLerner found", log.Fields{"MacLearn": macLearn})
-				} else if deviceId == vpv.Device && portNumber == vpv.Port && vlanId == "" {
+				} else if deviceID == vpv.Device && portNumber == vpv.Port && vlanID == "" {
 					macLearn = MacLearnerInfo{
-						DeviceId:   vpv.Device,
+						DeviceID:   vpv.Device,
 						PortNumber: vpv.Port,
-						VlanId:     vpv.SVlan.String(),
+						VlanID:     vpv.SVlan.String(),
 						MacAddress: vpv.MacAddr.String(),
 					}
 					logger.Infow(ctx, "MacLerner found", log.Fields{"MacLearn": macLearn})
@@ -1473,7 +1462,6 @@
 				return true
 			}
 			for _, vpv := range vnets.([]*VoltPortVnet) {
-
 				if vpv.MacLearning == MacLearningNone {
 					IgnoredPorts[vpv.Device] = append(IgnoredPorts[vpv.Device], vpv.Port)
 				}
diff --git a/internal/pkg/application/dhcpserverhandler.go b/internal/pkg/application/dhcpserverhandler.go
index 947dd34..44cdb8e 100644
--- a/internal/pkg/application/dhcpserverhandler.go
+++ b/internal/pkg/application/dhcpserverhandler.go
@@ -40,7 +40,7 @@
 
 // StartDhcpServerHandler starts go routine periodically(every second) to verify DHCP server reachability.
 func StartDhcpServerHandler() {
-	// Intialize global dhcp map and ticker as one second
+	// Initialize global dhcp map and ticker as one second
 	dhcpServerInfo = make(map[dhcpServerTag]dhcpTransactionInfo)
 	ticker := time.NewTicker(1 * time.Second)
 
@@ -55,7 +55,6 @@
 				mux.Lock()
 				checkDhcpTimeout()
 				mux.Unlock()
-
 			}
 		}
 	}()
@@ -168,11 +167,11 @@
 
 // dhcpTransactionInfo contains DHCP request response transaction information.
 type dhcpTransactionInfo struct {
-	timer                 uint8
+	smac                  string
 	pendingRequestCount   uint32
 	receivedResponseCount uint32
 	previousRequestCount  uint32
-	smac                  string
+	timer                 uint8
 }
 
 func newDhcpTransactionInfo(timer uint8, smac string) dhcpTransactionInfo {
diff --git a/internal/pkg/application/flowevent.go b/internal/pkg/application/flowevent.go
index fe37b74..be52fbb 100644
--- a/internal/pkg/application/flowevent.go
+++ b/internal/pkg/application/flowevent.go
@@ -24,45 +24,45 @@
 	"voltha-go-controller/log"
 )
 
-//Generic Framework to enabling all flow based event trigger and handling.
-//The eventMapper can be updated for dynamic func caller for future events
+// Generic Framework to enabling all flow based event trigger and handling.
+// The eventMapper can be updated for dynamic func caller for future events
 
-//FlowEventType - Type of event enumeration
+// FlowEventType - Type of event enumeration
 type FlowEventType string
 
-//FlowEventHandler - Func prototype for flow event handling funcs
+// FlowEventHandler - Func prototype for flow event handling funcs
 type FlowEventHandler func(context.Context, *FlowEvent, intf.FlowStatus)
 
 var eventMapper map[FlowEventType]FlowEventHandler
 
 const (
-	//EventTypeUsIgmpFlowAdded - Event type for IGMP US flow add
+	// EventTypeUsIgmpFlowAdded - Event type for IGMP US flow add
 	EventTypeUsIgmpFlowAdded FlowEventType = "USIgmpFlowAdded"
-	//EventTypeServiceFlowAdded - Event type for Service flow add
+	// EventTypeServiceFlowAdded - Event type for Service flow add
 	EventTypeServiceFlowAdded FlowEventType = "ServiceFlowAdded"
-	//EventTypeControlFlowAdded - Event type for Control flow add
+	// EventTypeControlFlowAdded - Event type for Control flow add
 	EventTypeControlFlowAdded FlowEventType = "ControlFlowAdded"
 
-	//EventTypeDeviceFlowRemoved - Event type for Device flow del
+	// EventTypeDeviceFlowRemoved - Event type for Device flow del
 	EventTypeDeviceFlowRemoved FlowEventType = "DeviceFlowRemoved"
-	//EventTypeMcastFlowRemoved - Event type for Mcast flow del
+	// EventTypeMcastFlowRemoved - Event type for Mcast flow del
 	EventTypeMcastFlowRemoved FlowEventType = "McastFlowRemoved"
 
-	//EventTypeServiceFlowRemoved - Event type for Service flow del
+	// EventTypeServiceFlowRemoved - Event type for Service flow del
 	EventTypeServiceFlowRemoved FlowEventType = "ServiceFlowRemoved"
-	//EventTypeControlFlowRemoved - Event type for Control flow del
+	// EventTypeControlFlowRemoved - Event type for Control flow del
 	EventTypeControlFlowRemoved FlowEventType = "ControlFlowRemoved"
 )
 
-//FlowEvent - Event info for Flow event processing
+// FlowEvent - Event info for Flow event processing
 type FlowEvent struct {
-	eType     FlowEventType
+	eventData interface{}
 	device    string
 	cookie    string
-	eventData interface{}
+	eType     FlowEventType
 }
 
-//InitEventFuncMapper - Initialization of flow event mapper
+// InitEventFuncMapper - Initialization of flow event mapper
 func InitEventFuncMapper() {
 	eventMapper = map[FlowEventType]FlowEventHandler{
 		EventTypeUsIgmpFlowAdded:    ProcessUsIgmpFlowAddEvent,
@@ -75,7 +75,7 @@
 	}
 }
 
-//ExecuteFlowEvent - Process flow based event triggers
+// ExecuteFlowEvent - Process flow based event triggers
 func ExecuteFlowEvent(cntx context.Context, vd *VoltDevice, cookie string, flowStatus intf.FlowStatus) bool {
 	var event interface{}
 
@@ -98,9 +98,8 @@
 	return true
 }
 
-//ProcessUsIgmpFlowAddEvent - Process Us Igmp Flow event trigger
+// ProcessUsIgmpFlowAddEvent - Process Us Igmp Flow event trigger
 func ProcessUsIgmpFlowAddEvent(cntx context.Context, event *FlowEvent, flowStatus intf.FlowStatus) {
-
 	logger.Infow(ctx, "Processing Post Flow Add Event for US Igmp", log.Fields{"Cookie": event.cookie, "event": event})
 	vpv := event.eventData.(*VoltPortVnet)
 	if isFlowStatusSuccess(flowStatus.Status, true) {
@@ -110,9 +109,8 @@
 	}
 }
 
-//ProcessServiceFlowAddEvent - Process Service Flow event trigger
+// ProcessServiceFlowAddEvent - Process Service Flow event trigger
 func ProcessServiceFlowAddEvent(cntx context.Context, event *FlowEvent, flowStatus intf.FlowStatus) {
-
 	logger.Infow(ctx, "Processing Post Flow Add Event for Service", log.Fields{"Cookie": event.cookie, "event": event})
 	vs := event.eventData.(*VoltService)
 	if isFlowStatusSuccess(flowStatus.Status, true) {
@@ -122,9 +120,8 @@
 	}
 }
 
-//ProcessControlFlowAddEvent - Process Control Flow event trigger
+// ProcessControlFlowAddEvent - Process Control Flow event trigger
 func ProcessControlFlowAddEvent(cntx context.Context, event *FlowEvent, flowStatus intf.FlowStatus) {
-
 	logger.Infow(ctx, "Processing Post Flow Add Event for VPV", log.Fields{"Cookie": event.cookie, "event": event})
 	vpv := event.eventData.(*VoltPortVnet)
 	if !isFlowStatusSuccess(flowStatus.Status, true) {
@@ -132,9 +129,8 @@
 	}
 }
 
-//ProcessServiceFlowDelEvent - Process Service Flow event trigger
+// ProcessServiceFlowDelEvent - Process Service Flow event trigger
 func ProcessServiceFlowDelEvent(cntx context.Context, event *FlowEvent, flowStatus intf.FlowStatus) {
-
 	logger.Infow(ctx, "Processing Post Flow Remove Event for Service", log.Fields{"Cookie": event.cookie, "event": event})
 	vs := event.eventData.(*VoltService)
 	if isFlowStatusSuccess(flowStatus.Status, false) {
@@ -144,9 +140,8 @@
 	}
 }
 
-//ProcessControlFlowDelEvent - Process Control Flow event trigger
+// ProcessControlFlowDelEvent - Process Control Flow event trigger
 func ProcessControlFlowDelEvent(cntx context.Context, event *FlowEvent, flowStatus intf.FlowStatus) {
-
 	logger.Infow(ctx, "Processing Post Flow Remove Event for VPV", log.Fields{"Cookie": event.cookie, "event": event})
 	vpv := event.eventData.(*VoltPortVnet)
 	if isFlowStatusSuccess(flowStatus.Status, false) {
@@ -156,9 +151,8 @@
 	}
 }
 
-//ProcessMcastFlowDelEvent - Process Control Flow event trigger
+// ProcessMcastFlowDelEvent - Process Control Flow event trigger
 func ProcessMcastFlowDelEvent(cntx context.Context, event *FlowEvent, flowStatus intf.FlowStatus) {
-
 	logger.Infow(ctx, "Processing Post Flow Remove Event for Mcast/Igmp", log.Fields{"Cookie": event.cookie, "event": event})
 	mvp := event.eventData.(*MvlanProfile)
 	if isFlowStatusSuccess(flowStatus.Status, false) {
@@ -168,9 +162,8 @@
 	}
 }
 
-//ProcessDeviceFlowDelEvent - Process Control Flow event trigger
+// ProcessDeviceFlowDelEvent - Process Control Flow event trigger
 func ProcessDeviceFlowDelEvent(cntx context.Context, event *FlowEvent, flowStatus intf.FlowStatus) {
-
 	logger.Infow(ctx, "Processing Post Flow Remove Event for VNET", log.Fields{"Cookie": event.cookie, "event": event})
 	vnet := event.eventData.(*VoltVnet)
 	if isFlowStatusSuccess(flowStatus.Status, false) {
@@ -180,7 +173,7 @@
 	}
 }
 
-//TODO: Update the func or flowStatus struct once all flow status are based on NB error code
+// TODO: Update the func or flowStatus struct once all flow status are based on NB error code
 func isFlowStatusSuccess(status uint32, flowAdd bool) bool {
 	result := false
 	errorCode := infraerrorcode.ErrorCode(status)
diff --git a/internal/pkg/application/igmp.go b/internal/pkg/application/igmp.go
index 91afdf8..a531619 100644
--- a/internal/pkg/application/igmp.go
+++ b/internal/pkg/application/igmp.go
@@ -86,11 +86,11 @@
 	OltSerialNum   string
 	MvlanProfileID string
 	IgmpProfileID  string
-	IgmpProxyIP    net.IP
-	OperState      OperInProgress
 	Version        string
 	// This map will help in updating the igds whenever there is a igmp profile id update
 	IgmpGroupDevices sync.Map `json:"-"` // Key is group id
+	IgmpProxyIP      net.IP
+	OperState        OperInProgress
 }
 
 var (
@@ -144,7 +144,6 @@
 				}
 			}
 		}
-
 	}
 	return "", errors.New("MAC Address not found,Setting default")
 }
@@ -420,9 +419,8 @@
 	return false
 }
 
-//AddToPendingPool - adds Igmp Device obj to pending pool
+// AddToPendingPool - adds Igmp Device obj to pending pool
 func AddToPendingPool(cntx context.Context, device string, groupKey string) bool {
-
 	logger.Infow(ctx, "Add Device to IgmpGroup Pending Pool", log.Fields{"Device": device, "GroupKey": groupKey})
 	if grp, ok := GetApplication().IgmpGroups.Load(groupKey); ok {
 		ig := grp.(*IgmpGroup)
@@ -450,7 +448,6 @@
 
 // SendQueryExpiredEventGroupSpecific to send group specific query expired event.
 func SendQueryExpiredEventGroupSpecific(portKey string, igd *IgmpGroupDevice, igc *IgmpGroupChannel) {
-
 	logger.Info(ctx, "Processing-SendQueryExpiredEventGroupSpecific-Event")
 	va := GetApplication()
 	mvpName := va.GetMvlanProfileByTag(igd.Mvlan).Name
@@ -476,7 +473,6 @@
 
 // GetMcastServiceForSubAlarm to get mcast service name for subscriber alarm.
 func GetMcastServiceForSubAlarm(uniPort *VoltPort, mvp *MvlanProfile) string {
-
 	var serviceName string
 	mvpName := mvp.Name
 
@@ -501,12 +497,10 @@
 	}
 
 	return serviceName
-
 }
 
 // RestoreIgmpGroupsFromDb to restore igmp groups from database
 func (va *VoltApplication) RestoreIgmpGroupsFromDb(cntx context.Context) {
-
 	groups, _ := db.GetIgmpGroups(cntx)
 	for _, group := range groups {
 		b, ok := group.Value.([]byte)
@@ -546,7 +540,6 @@
 // for the IGMP group and grp obj is obtained from the available pending pool of groups.
 // If not, new group obj will be created based on available group IDs
 func (va *VoltApplication) AddIgmpGroup(cntx context.Context, mvpName string, gip net.IP, device string) *IgmpGroup {
-
 	var ig *IgmpGroup
 	if mvp, grpName := va.GetMvlanProfileForMcIP(mvpName, gip); mvp != nil {
 		if ig = va.GetGroupFromPendingPool(mvp.Mvlan, device); ig != nil {
@@ -580,7 +573,6 @@
 // we have to take a relook at this implementation. The key will include
 // both MVLAN and the group IP.
 func (va *VoltApplication) GetIgmpGroup(mvlan of.VlanType, gip net.IP) *IgmpGroup {
-
 	profile, _ := va.MvlanProfilesByTag.Load(mvlan)
 	if profile == nil {
 		logger.Errorw(ctx, "Mvlan Profile not found for incoming packet. Dropping Request", log.Fields{"Mvlan": mvlan, "GroupAddr": gip.String()})
@@ -608,7 +600,6 @@
 // DelIgmpGroup : When the last subscriber leaves the IGMP group across all the devices
 // the IGMP group is removed.
 func (va *VoltApplication) DelIgmpGroup(cntx context.Context, ig *IgmpGroup) {
-
 	profile, found := GetApplication().MvlanProfilesByTag.Load(ig.Mvlan)
 	if found {
 		mvp := profile.(*MvlanProfile)
@@ -632,13 +623,11 @@
 			}
 			ig.IgmpGroupLock.Unlock()
 		}
-
 	}
 }
 
 // GetPonPortID Gets the PON port ID from uniPortID
 func (va *VoltApplication) GetPonPortID(device, uniPortID string) uint32 {
-
 	isNNI := strings.Contains(uniPortID, "nni")
 	if isNNI || uniPortID == StaticPort {
 		logger.Debugw(ctx, "Cannot get pon port from UNI port", log.Fields{"port": uniPortID})
@@ -685,7 +674,6 @@
 // AggActiveChannelsCountForPonPort Aggregates the active channel count for given pon port.
 // It will iterate over all the groups and store the sum of active channels in VoltDevice.
 func (va *VoltApplication) AggActiveChannelsCountForPonPort(device string, ponPortID uint32, port *PonPortCfg) {
-
 	var activeChannelCount uint32
 
 	collectActiveChannelCount := func(key interface{}, value interface{}) bool {
@@ -744,7 +732,6 @@
 // channel per pon threshold. If Exceeds, return true else return false.
 func (va *VoltApplication) IsMaxChannelsCountExceeded(device, uniPortID string,
 	ponPortID uint32, ig *IgmpGroup, channelIP net.IP, mvp *MvlanProfile) bool {
-
 	// New receiver check is required to identify the IgmpReportMsg received
 	// in response to the IGMP Query sent from VGC.
 	if newReceiver := ig.IsNewReceiver(device, uniPortID, channelIP); !newReceiver {
@@ -821,7 +808,6 @@
 	logger.Debugw(ctx, "Received IGMPv2 Type", log.Fields{"Type": igmpv2.Type})
 
 	if igmpv2.Type == layers.IGMPMembershipReportV2 || igmpv2.Type == layers.IGMPMembershipReportV1 {
-
 		logger.Infow(ctx, "IGMP Join received: v2", log.Fields{"Addr": igmpv2.GroupAddress, "Port": port})
 
 		// This is a report coming from the PON. We must be able to first find the
@@ -897,7 +883,6 @@
 		// This is a IGMP leave coming from one of the receivers. We essentially remove the
 		// the receiver.
 		logger.Infow(ctx, "IGMP Leave received: v2", log.Fields{"Addr": igmpv2.GroupAddress, "Port": port})
-
 		vpv, _ = va.GetVnetFromPkt(device, port, pkt)
 		if vpv == nil {
 			logger.Errorw(ctx, "Couldn't find VNET associated with port", log.Fields{"Port": port})
@@ -993,8 +978,7 @@
 		defer mvp.mvpLock.RUnlock()
 		mvlan := mvp.Mvlan
 
-		for _, group := range igmpv3.GroupRecords {
-
+		for i, group := range igmpv3.GroupRecords {
 			isJoin := isIgmpJoin(group.Type, group.SourceAddresses)
 			// The subscriber is validated and now process the IGMP report
 			ig := va.GetIgmpGroup(mvlan, group.MulticastAddress)
@@ -1019,13 +1003,13 @@
 						ig.IgmpGroupLock.Unlock()
 						return
 					}
-					ig.AddReceiver(cntx, device, port, group.MulticastAddress, &group, IgmpVersion3,
+					ig.AddReceiver(cntx, device, port, group.MulticastAddress, &igmpv3.GroupRecords[i], IgmpVersion3,
 						dot1Q.VLANIdentifier, dot1Q.Priority, ponPortID)
 					ig.IgmpGroupLock.Unlock()
 				} else {
 					// Create the IGMP group and then add the receiver to the group
 					logger.Infow(ctx, "IGMP Join received for new group", log.Fields{"Addr": group.MulticastAddress, "Port": port})
-					if ig := va.AddIgmpGroup(cntx, vpv.MvlanProfileName, group.MulticastAddress, device); ig != nil {
+					if ig = va.AddIgmpGroup(cntx, vpv.MvlanProfileName, group.MulticastAddress, device); ig != nil {
 						ig.IgmpGroupLock.Lock()
 						// Check for port state to avoid race condition where PortDown event
 						// acquired lock before packet processing
@@ -1037,7 +1021,7 @@
 							ig.IgmpGroupLock.Unlock()
 							return
 						}
-						ig.AddReceiver(cntx, device, port, group.MulticastAddress, &group, IgmpVersion3,
+						ig.AddReceiver(cntx, device, port, group.MulticastAddress, &igmpv3.GroupRecords[i], IgmpVersion3,
 							dot1Q.VLANIdentifier, dot1Q.Priority, ponPortID)
 						ig.IgmpGroupLock.Unlock()
 					} else {
@@ -1047,7 +1031,7 @@
 			} else if ig != nil {
 				logger.Infow(ctx, "IGMP Leave received for existing group", log.Fields{"Addr": group.MulticastAddress, "Port": port})
 				ig.IgmpGroupLock.Lock()
-				ig.DelReceiver(cntx, device, port, group.MulticastAddress, &group, ponPortID)
+				ig.DelReceiver(cntx, device, port, group.MulticastAddress, &igmpv3.GroupRecords[i], ponPortID)
 				ig.IgmpGroupLock.Unlock()
 				if ig.NumDevicesActive() == 0 {
 					va.DelIgmpGroup(cntx, ig)
@@ -1135,7 +1119,6 @@
 }
 
 func isIncl(recordType layers.IGMPv3GroupRecordType) bool {
-
 	if (layers.IGMPToIn == recordType) || (layers.IGMPIsIn == recordType) || (layers.IGMPAllow == recordType) {
 		return true
 	}
@@ -1223,9 +1206,8 @@
 	return nil
 }
 
-//UpdateMvlanProfile - only channel groups be updated
+// UpdateMvlanProfile - only channel groups be updated
 func (va *VoltApplication) UpdateMvlanProfile(cntx context.Context, name string, vlan of.VlanType, groups map[string][]string, activeChannelCount int, proxy map[string]common.MulticastGroupProxy) error {
-
 	mvpIntf, ok := va.MvlanProfilesByName.Load(name)
 	if !ok {
 		logger.Error(ctx, "Update Mvlan Failed: Profile does not exist")
@@ -1398,7 +1380,7 @@
 	var mvp *MvlanProfile
 	if mvpIntf, ok := va.MvlanProfilesByName.Load(MvlanProfileID); ok {
 		mvp = mvpIntf.(*MvlanProfile)
-		//Delete from mvp list
+		// Delete from mvp list
 		mvp.removeIgmpMcastFlows(cntx, OltSerialNum)
 		delete(mvp.DevicesList, OltSerialNum)
 		if err := mvp.WriteToDb(cntx); err != nil {
@@ -1409,7 +1391,6 @@
 
 // DelMcastConfig for addition of a MVLAN profile
 func (va *VoltApplication) DelMcastConfig(cntx context.Context, MvlanProfileID string, IgmpProfileID string, IgmpProxyIP string, OltSerialNum string) {
-
 	va.delOltFromMvlan(cntx, MvlanProfileID, OltSerialNum)
 	va.deleteMcastConfig(OltSerialNum, MvlanProfileID)
 	_ = db.DelMcastConfig(cntx, McastConfigKey(OltSerialNum, MvlanProfileID))
@@ -1422,7 +1403,6 @@
 
 // DelAllMcastConfig for deletion of all mcast config
 func (va *VoltApplication) DelAllMcastConfig(cntx context.Context, OltSerialNum string) error {
-
 	deleteIndividualMcastConfig := func(key interface{}, value interface{}) bool {
 		mcastCfg := value.(*McastConfig)
 		if mcastCfg.OltSerialNum == OltSerialNum {
@@ -1436,7 +1416,6 @@
 
 // UpdateMcastConfig for addition of a MVLAN profile
 func (va *VoltApplication) UpdateMcastConfig(cntx context.Context, MvlanProfileID string, IgmpProfileID string, IgmpProxyIP string, OltSerialNum string) error {
-
 	mcastCfg := va.GetMcastConfig(OltSerialNum, MvlanProfileID)
 	if mcastCfg == nil {
 		logger.Warnw(ctx, "Mcast Config not found. Unable to update", log.Fields{"Mvlan Profile ID": MvlanProfileID, "OltSerialNum": OltSerialNum})
@@ -1600,7 +1579,7 @@
 	// va.IgmpTick()
 }
 
-//AddIgmpProfile for addition of IGMP Profile
+// AddIgmpProfile for addition of IGMP Profile
 func (va *VoltApplication) AddIgmpProfile(cntx context.Context, igmpProfileConfig *common.IGMPConfig) error {
 	var igmpProfile *IgmpProfile
 
@@ -1724,7 +1703,7 @@
 	return nil
 }
 
-//UpdateIgmpProfile for addition of IGMP Profile
+// UpdateIgmpProfile for addition of IGMP Profile
 func (va *VoltApplication) UpdateIgmpProfile(cntx context.Context, igmpProfileConfig *common.IGMPConfig) error {
 	igmpProfile := va.checkIgmpProfileMap(igmpProfileConfig.ProfileID)
 	if igmpProfile == nil {
@@ -1738,7 +1717,7 @@
 
 	keepAliveInterval := uint32(igmpProfileConfig.KeepAliveInterval)
 
-	//KeepAliveInterval should have a min of 10 seconds
+	// KeepAliveInterval should have a min of 10 seconds
 	if keepAliveInterval < MinKeepAliveInterval {
 		keepAliveInterval = MinKeepAliveInterval
 		logger.Infow(ctx, "Auto adjust keepAliveInterval - Value < 10", log.Fields{"Received": igmpProfileConfig.KeepAliveInterval, "Configured": keepAliveInterval})
@@ -1845,7 +1824,6 @@
 
 // sendGeneralQuery to send general query
 func sendGeneralQuery(device string, port string, cVlan of.VlanType, pbit uint8, proxyCfg *IgmpProfile, proxyIP *net.IP) {
-
 	if queryPkt, err := Igmpv2QueryPacket(AllSystemsMulticastGroupIP, cVlan, *proxyIP, pbit, proxyCfg.MaxResp); err == nil {
 		if err := cntlr.GetController().PacketOutReq(device, port, port, queryPkt, false); err != nil {
 			logger.Warnw(ctx, "General Igmpv2 Query Failed to send", log.Fields{"Device": device, "Port": port, "Packet": queryPkt, "Pbit": pbit})
diff --git a/internal/pkg/application/igmpgroup.go b/internal/pkg/application/igmpgroup.go
index a7107cd..2dab424 100644
--- a/internal/pkg/application/igmpgroup.go
+++ b/internal/pkg/application/igmpgroup.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
 
@@ -34,19 +34,19 @@
 // connected via multiple devices (OLTs). The IGMP group is stored on the
 // VOLT application.
 type IgmpGroup struct {
-	GroupID               uint32
-	Mvlan                 of.VlanType
-	PonVlan               of.VlanType
-	GroupName             string
-	GroupAddr             net.IP
 	Devices               map[string]*IgmpGroupDevice `json:"-"`
 	PendingGroupForDevice map[string]time.Time        //map [deviceId, timestamp]  (ExpiryTime  = leave time + 15mins)
 	Version               string
+	GroupName             string
+	GroupAddr             net.IP
+	PendingPoolLock       sync.RWMutex
+	IgmpGroupLock         sync.RWMutex
+	GroupID               uint32
+	Mvlan                 of.VlanType
+	PonVlan               of.VlanType
 	IsPonVlanPresent      bool
 	IsChannelBasedGroup   bool
-	PendingPoolLock       sync.RWMutex
 	IsGroupStatic         bool
-	IgmpGroupLock         sync.RWMutex
 }
 
 // NewIgmpGroup is constructor for an IGMP group
@@ -78,7 +78,6 @@
 
 // IgmpGroupReInit to re-initialize igmp group members
 func (ig *IgmpGroup) IgmpGroupReInit(cntx context.Context, name string, gip net.IP) {
-
 	logger.Infow(ctx, "Reinitialize Igmp Group", log.Fields{"GroupID": ig.GroupID, "OldName": ig.GroupName, "Name": name, "OldAddr": ig.GroupAddr.String(), "GroupAddr": gip.String()})
 
 	ig.GroupName = name
@@ -112,9 +111,8 @@
 	}
 }
 
-//HandleGroupMigration - handles migration of group members between static & dynamic
+// HandleGroupMigration - handles migration of group members between static & dynamic
 func (ig *IgmpGroup) HandleGroupMigration(cntx context.Context, deviceID string, groupAddr net.IP) {
-
 	var group *layers.IGMPv3GroupRecord
 	app := GetApplication()
 	if deviceID == "" {
@@ -191,11 +189,10 @@
 	}
 	igd.DelAllChannels(cntx)
 
-	//Clear all internal maps so that the groups can be reused
+	// Clear all internal maps so that the groups can be reused
 	igd.PortChannelMap.Range(func(key, value interface{}) bool {
-
-		//Update the counters only if not already updated
-		//(i.e) 1. In case of channel remove during Mvlan Update
+		// Update the counters only if not already updated
+		// (i.e) 1. In case of channel remove during Mvlan Update
 		if countersToBeUpdated {
 			port := key.(string)
 			channelList := value.([]net.IP)
@@ -225,7 +222,6 @@
 // there is not response for IGMP query from the receiver
 func (ig *IgmpGroup) AddReceiver(cntx context.Context, device string, port string, groupIP net.IP,
 	group *layers.IGMPv3GroupRecord, ver uint8, cvlan uint16, pbit uint8, ponPort uint32) {
-
 	logger.Debugw(ctx, "Adding Receiver", log.Fields{"Port": port})
 	if igd, ok := ig.getIgmpGroupDevice(cntx, device); !ok {
 		igd = ig.AddIgmpGroupDevice(cntx, device, ig.GroupID, ver)
@@ -272,7 +268,6 @@
 	logger.Infow(ctx, "Port Channel List", log.Fields{"Port": port, "IPsList": ipsList})
 	igd.PortChannelMap.Range(printPortChannel)
 
-
 	for _, groupAddr := range ipsList {
 		logger.Debugw(ctx, "Port Channels", log.Fields{"Port": port, "IPsList": ipsList, "GroupAddr": groupAddr, "Len": len(ipsList)})
 		igd.DelReceiver(cntx, groupAddr, port, nil, ponPortID)
@@ -298,7 +293,6 @@
 
 // GetAllIgmpChannelForDevice - Returns all channels with active members associated to the Igmp Group for the given device
 func (ig *IgmpGroup) GetAllIgmpChannelForDevice(deviceID string) map[string]string {
-
 	if deviceID == "" {
 		return ig.GetAllIgmpChannel()
 	}
@@ -417,7 +411,7 @@
 		if igdChangeCnt > 0 {
 			if err := igd.WriteToDb(cntx); err != nil {
 				logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device,
-							"GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
+					"GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
 			}
 		}
 	}
@@ -434,7 +428,6 @@
 			if igd.NumReceivers() == 0 {
 				ig.DelIgmpGroupDevice(cntx, igd)
 			}
-
 		} else {
 			logger.Info(ctx, "Skipping Expiry since Device is unavailable")
 		}
@@ -456,7 +449,7 @@
 	defer mvp.mvpLock.RUnlock()
 	group := mvp.Groups[ig.GroupName]
 
-	//Case where mvlan update in-progress
+	// Case where mvlan update in-progress
 	if group == nil || len(group.McIPs) == 0 {
 		return 0
 	}
@@ -498,7 +491,6 @@
 
 // RestoreDevices : IGMP group write to DB
 func (ig *IgmpGroup) RestoreDevices(cntx context.Context) {
-
 	ig.migrateIgmpDevices(cntx)
 	devices, _ := db.GetIgmpDevices(cntx, ig.Mvlan, ig.GroupName, ig.GroupAddr)
 	for _, device := range devices {
@@ -529,7 +521,7 @@
 				igd.QueryExpiryTime = time.Now().Add(time.Duration(igd.proxyCfg.KeepAliveInterval) * time.Second)
 				if err := igd.WriteToDb(cntx); err != nil {
 					logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device,
-								"GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
+						"GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
 				}
 			}
 
@@ -560,92 +552,89 @@
 
 // WriteToDb is utility to write Igmp Group Info to database
 func (ig *IgmpGroup) WriteToDb(cntx context.Context) error {
-        ig.Version = database.PresentVersionMap[database.IgmpGroupPath]
-        b, err := json.Marshal(ig)
-        if err != nil {
-                return err
-        }
-        if err1 := db.PutIgmpGroup(cntx, ig.getKey(), string(b)); err1 != nil {
-                return err1
-        }
-        return nil
+	ig.Version = database.PresentVersionMap[database.IgmpGroupPath]
+	b, err := json.Marshal(ig)
+	if err != nil {
+		return err
+	}
+	if err1 := db.PutIgmpGroup(cntx, ig.getKey(), string(b)); err1 != nil {
+		return err1
+	}
+	return nil
 }
 
 // UpdateIgmpGroup : When the pending group is allocated to new
 func (ig *IgmpGroup) UpdateIgmpGroup(cntx context.Context, oldKey, newKey string) {
+	// If the group is allocated to same McastGroup, no need to update the
+	// IgmpGroups map
+	if oldKey == newKey {
+		return
+	}
+	logger.Infow(ctx, "Updating Igmp Group with new MVP Group Info", log.Fields{"OldKey": oldKey, "NewKey": newKey, "GroupID": ig.GroupID})
 
-        //If the group is allocated to same McastGroup, no need to update the
-        //IgmpGroups map
-        if oldKey == newKey {
-                return
-        }
-        logger.Infow(ctx, "Updating Igmp Group with new MVP Group Info", log.Fields{"OldKey": oldKey, "NewKey": newKey, "GroupID": ig.GroupID})
+	GetApplication().IgmpGroups.Delete(oldKey)
+	_ = db.DelIgmpGroup(cntx, oldKey)
 
-        GetApplication().IgmpGroups.Delete(oldKey)
-        _ = db.DelIgmpGroup(cntx, oldKey)
-
-        GetApplication().IgmpGroups.Store(newKey, ig)
-        if err := ig.WriteToDb(cntx); err != nil {
-                logger.Errorw(ctx, "Igmp group Write to DB failed", log.Fields{"groupName": ig.GroupName})
-        }
+	GetApplication().IgmpGroups.Store(newKey, ig)
+	if err := ig.WriteToDb(cntx); err != nil {
+		logger.Errorw(ctx, "Igmp group Write to DB failed", log.Fields{"groupName": ig.GroupName})
+	}
 }
 
 func (ig *IgmpGroup) removeExpiredGroupFromDevice(cntx context.Context) {
-        ig.PendingPoolLock.Lock()
-        defer ig.PendingPoolLock.Unlock()
+	ig.PendingPoolLock.Lock()
+	defer ig.PendingPoolLock.Unlock()
 
-        for device, timer := range ig.PendingGroupForDevice {
+	for device, timer := range ig.PendingGroupForDevice {
+		// To ensure no race-condition between the expiry time and the new Join,
+		// ensure the group exists in pending pool before deletion
+		groupExistsInPendingPool := true
 
-                // To ensure no race-condition between the expiry time and the new Join,
-                // ensure the group exists in pending pool before deletion
-                groupExistsInPendingPool := true
+		if !time.Now().After(timer) {
+			continue
+		}
 
-                if !time.Now().After(timer) {
-                        continue
-                }
+		// Check if the IgmpGroup obj has no active member across any device
+		// If Yes, then this group is part of global pending pool (IgmpPendingPool), hence if expired,
+		// Remove only the IgmpGroup obj referenced to this device from global pool also.
+		if ig.NumDevicesActive() == 0 {
+			groupExistsInPendingPool = GetApplication().RemoveGroupFromPendingPool(device, ig)
+		}
 
-                // Check if the IgmpGroup obj has no active member across any device
-                // If Yes, then this group is part of global pending pool (IgmpPendingPool), hence if expired,
-                // Remove only the IgmpGroup obj referenced to this device from global pool also.
-                if ig.NumDevicesActive() == 0 {
-                        groupExistsInPendingPool = GetApplication().RemoveGroupFromPendingPool(device, ig)
-                }
-
-                // Remove the group entry from device and remove the IgmpDev Obj
-                // from IgmpGrp Pending pool
-                if groupExistsInPendingPool {
-                        ig.DeleteIgmpGroupDevice(cntx, device)
-                }
-        }
+		// Remove the group entry from device and remove the IgmpDev Obj
+		// from IgmpGrp Pending pool
+		if groupExistsInPendingPool {
+			ig.DeleteIgmpGroupDevice(cntx, device)
+		}
+	}
 }
 
-//DeleteIgmpGroupDevice - removes the IgmpGroupDevice obj from IgmpGroup and database
+// DeleteIgmpGroupDevice - removes the IgmpGroupDevice obj from IgmpGroup and database
 func (ig *IgmpGroup) DeleteIgmpGroupDevice(cntx context.Context, device string) {
+	logger.Infow(ctx, "Deleting IgmpGroupDevice from IG Pending Pool", log.Fields{"Device": device, "GroupID": ig.GroupID, "GroupName": ig.GroupName, "GroupAddr": ig.GroupAddr.String(), "PendingDevices": len(ig.Devices)})
 
-        logger.Infow(ctx, "Deleting IgmpGroupDevice from IG Pending Pool", log.Fields{"Device": device, "GroupID": ig.GroupID, "GroupName": ig.GroupName, "GroupAddr": ig.GroupAddr.String(), "PendingDevices": len(ig.Devices)})
+	igd := ig.Devices[device]
+	igd.DelMcGroup(true)
+	delete(ig.Devices, device)
+	delete(ig.PendingGroupForDevice, device)
+	_ = db.DelIgmpDevice(cntx, igd.Mvlan, igd.GroupName, igd.GroupAddr, igd.Device)
 
-        igd := ig.Devices[device]
-        igd.DelMcGroup(true)
-        delete(ig.Devices, device)
-        delete(ig.PendingGroupForDevice, device)
-        _ = db.DelIgmpDevice(cntx, igd.Mvlan, igd.GroupName, igd.GroupAddr, igd.Device)
-
-        //If the group is not associated to any other device, then the entire Igmp Group obj itself can be removed
-        if ig.NumDevicesAll() == 0 {
-                logger.Infow(ctx, "Deleting IgmpGroup as all pending groups has expired", log.Fields{"Device": device, "GroupID": ig.GroupID, "GroupName": ig.GroupName, "GroupAddr": ig.GroupAddr.String(), "PendingDevices": len(ig.Devices)})
-                GetApplication().DelIgmpGroup(cntx, ig)
-                return
-        }
-        if err := ig.WriteToDb(cntx); err != nil {
-                logger.Errorw(ctx, "Igmp group Write to DB failed", log.Fields{"groupName": ig.GroupName})
-        }
+	// If the group is not associated to any other device, then the entire Igmp Group obj itself can be removed
+	if ig.NumDevicesAll() == 0 {
+		logger.Infow(ctx, "Deleting IgmpGroup as all pending groups has expired", log.Fields{"Device": device, "GroupID": ig.GroupID, "GroupName": ig.GroupName, "GroupAddr": ig.GroupAddr.String(), "PendingDevices": len(ig.Devices)})
+		GetApplication().DelIgmpGroup(cntx, ig)
+		return
+	}
+	if err := ig.WriteToDb(cntx); err != nil {
+		logger.Errorw(ctx, "Igmp group Write to DB failed", log.Fields{"groupName": ig.GroupName})
+	}
 }
 
 // DelIgmpGroup deletes all devices for the provided igmp group
 func (ig *IgmpGroup) DelIgmpGroup(cntx context.Context) {
-        logger.Infow(ctx, "Deleting All Device for Group", log.Fields{"Group": ig.GroupName})
-        for _, igd := range ig.Devices {
-                ig.DelIgmpGroupDevice(cntx, igd)
-        }
-        GetApplication().DelIgmpGroup(cntx, ig)
+	logger.Infow(ctx, "Deleting All Device for Group", log.Fields{"Group": ig.GroupName})
+	for _, igd := range ig.Devices {
+		ig.DelIgmpGroupDevice(cntx, igd)
+	}
+	GetApplication().DelIgmpGroup(cntx, ig)
 }
diff --git a/internal/pkg/application/igmpgroupchannel.go b/internal/pkg/application/igmpgroupchannel.go
index d17e209..d8a2644 100644
--- a/internal/pkg/application/igmpgroupchannel.go
+++ b/internal/pkg/application/igmpgroupchannel.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
 
@@ -23,714 +23,704 @@
 	"github.com/google/gopacket/layers"
 
 	cntlr "voltha-go-controller/internal/pkg/controller"
-	"voltha-go-controller/internal/pkg/types"
 	"voltha-go-controller/internal/pkg/of"
+	common "voltha-go-controller/internal/pkg/types"
 	"voltha-go-controller/log"
 )
 
 // IgmpGroupChannel structure
 type IgmpGroupChannel struct {
-        Device       string
-        GroupID      uint32
-        GroupName    string
-        GroupAddr    net.IP
-        Mvlan        of.VlanType
-        Exclude      int
-        ExcludeList  []net.IP
-        IncludeList  []net.IP
-        Version      uint8
-        ServVersion  *uint8                    `json:"-"`
-        CurReceivers map[string]*IgmpGroupPort `json:"-"`
-        NewReceivers map[string]*IgmpGroupPort `json:"-"`
-        proxyCfg     **IgmpProfile
-        IgmpProxyIP  **net.IP                  `json:"-"`
+	CurReceivers map[string]*IgmpGroupPort `json:"-"`
+	NewReceivers map[string]*IgmpGroupPort `json:"-"`
+	proxyCfg     **IgmpProfile
+	IgmpProxyIP  **net.IP `json:"-"`
+	ServVersion  *uint8
+	Device       string
+	GroupName    string
+	GroupAddr    net.IP
+	ExcludeList  []net.IP
+	IncludeList  []net.IP `json:"-"`
+	Exclude      int
+	GroupID      uint32
+	Mvlan        of.VlanType
+	Version      uint8
 }
 
 // NewIgmpGroupChannel is constructor for a channel. The default IGMP version is set to 3
 // as the protocol defines the way to manage backward compatibility
-// The implementation handles simultaneous presense of lower versioned
+// The implementation handles simultaneous presence of lower versioned
 // receivers
 func NewIgmpGroupChannel(igd *IgmpGroupDevice, groupAddr net.IP, version uint8) *IgmpGroupChannel {
-        var igc IgmpGroupChannel
-        igc.Device = igd.Device
-        igc.GroupID = igd.GroupID
-        igc.GroupName = igd.GroupName
-        igc.GroupAddr = groupAddr
-        igc.Mvlan = igd.Mvlan
-        igc.Version = version
-        igc.CurReceivers = make(map[string]*IgmpGroupPort)
-        igc.NewReceivers = make(map[string]*IgmpGroupPort)
-        igc.proxyCfg = &igd.proxyCfg
-        igc.IgmpProxyIP = &igd.IgmpProxyIP
-        igc.ServVersion = igd.ServVersion
-        return &igc
+	var igc IgmpGroupChannel
+	igc.Device = igd.Device
+	igc.GroupID = igd.GroupID
+	igc.GroupName = igd.GroupName
+	igc.GroupAddr = groupAddr
+	igc.Mvlan = igd.Mvlan
+	igc.Version = version
+	igc.CurReceivers = make(map[string]*IgmpGroupPort)
+	igc.NewReceivers = make(map[string]*IgmpGroupPort)
+	igc.proxyCfg = &igd.proxyCfg
+	igc.IgmpProxyIP = &igd.IgmpProxyIP
+	igc.ServVersion = igd.ServVersion
+	return &igc
 }
 
 // NewIgmpGroupChannelFromBytes create the IGMP group channel from a byte slice
 func NewIgmpGroupChannelFromBytes(b []byte) (*IgmpGroupChannel, error) {
-        var igc IgmpGroupChannel
-        if err := json.Unmarshal(b, &igc); err != nil {
-                return nil, err
-        }
-        igc.CurReceivers = make(map[string]*IgmpGroupPort)
-        igc.NewReceivers = make(map[string]*IgmpGroupPort)
-        return &igc, nil
+	var igc IgmpGroupChannel
+	if err := json.Unmarshal(b, &igc); err != nil {
+		return nil, err
+	}
+	igc.CurReceivers = make(map[string]*IgmpGroupPort)
+	igc.NewReceivers = make(map[string]*IgmpGroupPort)
+	return &igc, nil
 }
 
 // RestorePorts to restore ports
 func (igc *IgmpGroupChannel) RestorePorts(cntx context.Context) {
-
-        igc.migrateIgmpPorts(cntx)
-        ports, _ := db.GetIgmpRcvrs(cntx, igc.Mvlan, igc.GroupAddr, igc.Device)
-        for _, port := range ports {
-                b, ok := port.Value.([]byte)
-                if !ok {
-                        logger.Warn(ctx, "The value type is not []byte")
-                        continue
-                }
-                if igp, err := NewIgmpGroupPortFromBytes(b); err == nil {
-                        igc.NewReceivers[igp.Port] = igp
-                        logger.Infow(ctx, "Group Port Restored", log.Fields{"IGP": igp})
-                } else {
-                        logger.Warn(ctx, "Failed to decode port from DB")
-                }
-        }
-        if err := igc.WriteToDb(cntx); err != nil {
-                logger.Errorw(ctx, "Igmp group channel Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
-        }
+	igc.migrateIgmpPorts(cntx)
+	ports, _ := db.GetIgmpRcvrs(cntx, igc.Mvlan, igc.GroupAddr, igc.Device)
+	for _, port := range ports {
+		b, ok := port.Value.([]byte)
+		if !ok {
+			logger.Warn(ctx, "The value type is not []byte")
+			continue
+		}
+		if igp, err := NewIgmpGroupPortFromBytes(b); err == nil {
+			igc.NewReceivers[igp.Port] = igp
+			logger.Infow(ctx, "Group Port Restored", log.Fields{"IGP": igp})
+		} else {
+			logger.Warn(ctx, "Failed to decode port from DB")
+		}
+	}
+	if err := igc.WriteToDb(cntx); err != nil {
+		logger.Errorw(ctx, "Igmp group channel Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
+	}
 }
 
 // WriteToDb is utility to write IGMPGroupChannel Info to database
 func (igc *IgmpGroupChannel) WriteToDb(cntx context.Context) error {
-        b, err := json.Marshal(igc)
-        if err != nil {
-                return err
-        }
-        if err1 := db.PutIgmpChannel(cntx, igc.Mvlan, igc.GroupName, igc.Device, igc.GroupAddr, string(b)); err1 != nil {
-                return err1
-        }
-        logger.Info(ctx, "IGC Updated")
-        return nil
+	b, err := json.Marshal(igc)
+	if err != nil {
+		return err
+	}
+	if err1 := db.PutIgmpChannel(cntx, igc.Mvlan, igc.GroupName, igc.Device, igc.GroupAddr, string(b)); err1 != nil {
+		return err1
+	}
+	logger.Info(ctx, "IGC Updated")
+	return nil
 }
 
-
 // InclSourceIsIn checks if a source is in include list
 func (igc *IgmpGroupChannel) InclSourceIsIn(src net.IP) bool {
-        return IsIPPresent(src, igc.IncludeList)
+	return IsIPPresent(src, igc.IncludeList)
 }
 
 // ExclSourceIsIn checks if a source is in exclude list
 func (igc *IgmpGroupChannel) ExclSourceIsIn(src net.IP) bool {
-        return IsIPPresent(src, igc.ExcludeList)
+	return IsIPPresent(src, igc.ExcludeList)
 }
 
 // AddInclSource adds a source is in include list
 func (igc *IgmpGroupChannel) AddInclSource(src net.IP) {
-        logger.Debugw(ctx, "Adding Include Source for Channel", log.Fields{"Channel": igc.GroupAddr.String(), "Device": igc.Device, "Src": src})
-        igc.IncludeList = append(igc.IncludeList, src)
+	logger.Debugw(ctx, "Adding Include Source for Channel", log.Fields{"Channel": igc.GroupAddr.String(), "Device": igc.Device, "Src": src})
+	igc.IncludeList = append(igc.IncludeList, src)
 }
 
 // AddExclSource adds a source is in exclude list
 func (igc *IgmpGroupChannel) AddExclSource(src net.IP) {
-        logger.Debugw(ctx, "Adding Exclude Source for Channel", log.Fields{"Channel": igc.GroupAddr.String(), "Device": igc.Device, "Src": src})
-        igc.ExcludeList = append(igc.ExcludeList, src)
+	logger.Debugw(ctx, "Adding Exclude Source for Channel", log.Fields{"Channel": igc.GroupAddr.String(), "Device": igc.Device, "Src": src})
+	igc.ExcludeList = append(igc.ExcludeList, src)
 }
 
 // UpdateExclSource update excl source list for the given channel
 func (igc *IgmpGroupChannel) UpdateExclSource(srcList []net.IP) bool {
+	logger.Debugw(ctx, "Updating Exclude Source for Channel", log.Fields{"Channel": igc.GroupAddr.String(), "Device": igc.Device, "Current List": igc.ExcludeList, "Incoming List": srcList})
+	if !igc.IsExclListChanged(srcList) {
+		return false
+	}
 
-        logger.Debugw(ctx, "Updating Exclude Source for Channel", log.Fields{"Channel": igc.GroupAddr.String(), "Device": igc.Device, "Current List": igc.ExcludeList, "Incoming List": srcList})
-        if !igc.IsExclListChanged(srcList) {
-                return false
-        }
+	if igc.NumReceivers() == 1 {
+		igc.ExcludeList = srcList
+	} else {
+		igc.ExcludeList = igc.computeExclList(srcList)
+	}
 
-        if igc.NumReceivers() == 1 {
-                igc.ExcludeList = srcList
-        } else {
-                igc.ExcludeList = igc.computeExclList(srcList)
-        }
-
-        logger.Debugw(ctx, "Updated Exclude Source for Channel", log.Fields{"Channel": igc.GroupAddr.String(), "Device": igc.Device, "Updated Excl List": igc.ExcludeList})
-        return true
+	logger.Debugw(ctx, "Updated Exclude Source for Channel", log.Fields{"Channel": igc.GroupAddr.String(), "Device": igc.Device, "Updated Excl List": igc.ExcludeList})
+	return true
 }
 
-// computeExclList computes intersection of pervious & current src list
+// computeExclList computes intersection of previous & current src list
 func (igc *IgmpGroupChannel) computeExclList(srcList []net.IP) []net.IP {
-
-        updatedSrcList := []net.IP{}
-        for _, src := range srcList {
-                for _, excl := range igc.ExcludeList {
-                        if src.Equal(excl) {
-                                updatedSrcList = append(updatedSrcList, src)
-                        }
-                }
-        }
-        return updatedSrcList
+	updatedSrcList := []net.IP{}
+	for _, src := range srcList {
+		for _, excl := range igc.ExcludeList {
+			if src.Equal(excl) {
+				updatedSrcList = append(updatedSrcList, src)
+			}
+		}
+	}
+	return updatedSrcList
 }
 
 // IsExclListChanged checks if excl list has been updated
 func (igc *IgmpGroupChannel) IsExclListChanged(srcList []net.IP) bool {
+	srcPresent := false
+	if len(igc.ExcludeList) != len(srcList) {
+		return true
+	}
 
-        srcPresent := false
-        if len(igc.ExcludeList) != len(srcList) {
-                return true
-        }
-
-        for _, src := range srcList {
-                for _, excl := range igc.ExcludeList {
-                        srcPresent = false
-                        if src.Equal(excl) {
-                                srcPresent = true
-                                break
-                        }
-                }
-                if !srcPresent {
-                        return true
-                }
-        }
-        return false
+	for _, src := range srcList {
+		for _, excl := range igc.ExcludeList {
+			srcPresent = false
+			if src.Equal(excl) {
+				srcPresent = true
+				break
+			}
+		}
+		if !srcPresent {
+			return true
+		}
+	}
+	return false
 }
 
 // DelInclSource deletes a source is in include list
 func (igc *IgmpGroupChannel) DelInclSource(src net.IP) {
-        mvp := GetApplication().GetMvlanProfileByTag(igc.Mvlan)
-        /* If the SSM proxy is configured, then we can del the src ip from igc as whatever is in proxy that is final list */
-        if _, ok := mvp.Proxy[igc.GroupName]; !ok {
-                logger.Debugw(ctx, "Deleting Include Source for Channel", log.Fields{"Channel": igc.GroupAddr.String(), "Device": igc.Device, "Src": src})
-                for _, igp := range igc.CurReceivers {
-                        if igp.InclSourceIsIn(src) {
-                                logger.Infow(ctx, "Skipping deletion: Source Present for another Receiver", log.Fields{"Receiver": igp.Port})
-                                return
-                        }
-                }
-                for _, igp := range igc.NewReceivers {
-                        if igp.InclSourceIsIn(src) {
-                                logger.Infow(ctx, "Skipping deletion: Source Present for another Receiver", log.Fields{"Receiver": igp.Port})
-                                return
-                        }
-                }
-        } else {
-                logger.Debug(ctx, "Proxy configured, not Deleting Include Source for Channel")
-        }
-        for i, addr := range igc.IncludeList {
-                if addr.Equal(src) {
-                        igc.IncludeList = append(igc.IncludeList[:i], igc.IncludeList[i+1:]...)
-                        return
-                }
-        }
+	mvp := GetApplication().GetMvlanProfileByTag(igc.Mvlan)
+	/* If the SSM proxy is configured, then we can del the src ip from igc as whatever is in proxy that is final list */
+	if _, ok := mvp.Proxy[igc.GroupName]; !ok {
+		logger.Debugw(ctx, "Deleting Include Source for Channel", log.Fields{"Channel": igc.GroupAddr.String(), "Device": igc.Device, "Src": src})
+		for _, igp := range igc.CurReceivers {
+			if igp.InclSourceIsIn(src) {
+				logger.Infow(ctx, "Skipping deletion: Source Present for another Receiver", log.Fields{"Receiver": igp.Port})
+				return
+			}
+		}
+		for _, igp := range igc.NewReceivers {
+			if igp.InclSourceIsIn(src) {
+				logger.Infow(ctx, "Skipping deletion: Source Present for another Receiver", log.Fields{"Receiver": igp.Port})
+				return
+			}
+		}
+	} else {
+		logger.Debug(ctx, "Proxy configured, not Deleting Include Source for Channel")
+	}
+	for i, addr := range igc.IncludeList {
+		if addr.Equal(src) {
+			igc.IncludeList = append(igc.IncludeList[:i], igc.IncludeList[i+1:]...)
+			return
+		}
+	}
 }
 
 // DelExclSource deletes a source is in exclude list
 func (igc *IgmpGroupChannel) DelExclSource(src net.IP) {
-        logger.Debugw(ctx, "Deleting Exclude Source for Channel", log.Fields{"Channel": igc.GroupAddr.String(), "Device": igc.Device, "Src": src})
+	logger.Debugw(ctx, "Deleting Exclude Source for Channel", log.Fields{"Channel": igc.GroupAddr.String(), "Device": igc.Device, "Src": src})
 
-        for _, igp := range igc.CurReceivers {
-                if igp.ExclSourceIsIn(src) {
-                        logger.Infow(ctx, "Skipping deletion: Source Present for another Receiver", log.Fields{"Receiver": igp.Port})
-                        return
-                }
-        }
-        for _, igp := range igc.NewReceivers {
-                if igp.ExclSourceIsIn(src) {
-                        logger.Infow(ctx, "Skipping deletion: Source Present for another Receiver", log.Fields{"Receiver": igp.Port})
-                        return
-                }
-        }
-        for i, addr := range igc.ExcludeList {
-                if addr.Equal(src) {
-                        igc.ExcludeList = append(igc.ExcludeList[:i], igc.ExcludeList[i+1:]...)
-                        return
-                }
-        }
+	for _, igp := range igc.CurReceivers {
+		if igp.ExclSourceIsIn(src) {
+			logger.Infow(ctx, "Skipping deletion: Source Present for another Receiver", log.Fields{"Receiver": igp.Port})
+			return
+		}
+	}
+	for _, igp := range igc.NewReceivers {
+		if igp.ExclSourceIsIn(src) {
+			logger.Infow(ctx, "Skipping deletion: Source Present for another Receiver", log.Fields{"Receiver": igp.Port})
+			return
+		}
+	}
+	for i, addr := range igc.ExcludeList {
+		if addr.Equal(src) {
+			igc.ExcludeList = append(igc.ExcludeList[:i], igc.ExcludeList[i+1:]...)
+			return
+		}
+	}
 }
 
 // ProcessSources process the received list of either included sources or the excluded sources
 // The return value indicate sif the group is modified and needs to be informed
 // to the upstream multicast servers
 func (igc *IgmpGroupChannel) ProcessSources(cntx context.Context, port string, ip []net.IP, incl bool) (bool, bool) {
-        groupChanged := false
-        groupExclUpdated := false
-        receiverSrcListEmpty := false
-        // If the version type is 2, there isn't anything to process here
-        if igc.Version == IgmpVersion2 && *igc.ServVersion == IgmpVersion2 {
-                return false, false
-        }
+	groupChanged := false
+	groupExclUpdated := false
+	receiverSrcListEmpty := false
+	// If the version type is 2, there isn't anything to process here
+	if igc.Version == IgmpVersion2 && *igc.ServVersion == IgmpVersion2 {
+		return false, false
+	}
 
-        igp := igc.GetReceiver(port)
-        if igp == nil {
-                logger.Warnw(ctx, "Receiver not found", log.Fields{"Port": port})
-                return false, false
-        }
-        mvp := GetApplication().GetMvlanProfileByTag(igc.Mvlan)
-        if incl {
-                for _, src := range ip {
+	igp := igc.GetReceiver(port)
+	if igp == nil {
+		logger.Warnw(ctx, "Receiver not found", log.Fields{"Port": port})
+		return false, false
+	}
+	mvp := GetApplication().GetMvlanProfileByTag(igc.Mvlan)
+	if incl {
+		for _, src := range ip {
+			if igp.ExclSourceIsIn(src) {
+				igp.DelExclSource(src)
+				if igc.ExclSourceIsIn(src) {
+					igc.DelExclSource(src)
+					groupChanged = true
+				}
+			}
 
-                        if igp.ExclSourceIsIn(src) {
-                                igp.DelExclSource(src)
-                                if igc.ExclSourceIsIn(src) {
-                                        igc.DelExclSource(src)
-                                        groupChanged = true
-                                }
-                        }
+			// If the source is not in the list of include sources for the port
+			// add it. If so, check also if it is in list of include sources
+			// at the device level.
+			if !igp.InclSourceIsIn(src) {
+				igp.AddInclSource(src)
+				if !igc.InclSourceIsIn(src) {
+					igc.AddInclSource(src)
+					groupChanged = true
+				}
+			}
+		}
+		/* If any of the existing ip in the source list is removed we need to remove from the list in igp and igc */
+		if _, ok := mvp.Proxy[igc.GroupName]; ok {
+			/* If we get leave message from any subscriber, we do not have to delete the entries in the src list
+			   Only if there is any modification in the src list by proxy config update only then we need to update */
+			if len(ip) != 0 && len(ip) != len(igc.IncludeList) {
+				for i := len(igc.IncludeList) - 1; i >= 0; i-- {
+					src := igc.IncludeList[i]
+					if !IsIPPresent(src, ip) {
+						igp.DelInclSource(src)
+						igc.DelInclSource(src)
+						groupChanged = true
+					}
+				}
+			}
+		}
+	} else {
+		for _, src := range ip {
+			if igp.InclSourceIsIn(src) {
+				igp.DelInclSource(src)
+				if igc.InclSourceIsIn(src) {
+					igc.DelInclSource(src)
+					groupChanged = true
+				}
+				if len(igp.IncludeList) == 0 {
+					receiverSrcListEmpty = true
+				}
+			}
 
-                        // If the source is not in the list of include sources for the port
-                        // add it. If so, check also if it is in list of include sources
-                        // at the device level.
-                        if !igp.InclSourceIsIn(src) {
-                                igp.AddInclSource(src)
-                                if !igc.InclSourceIsIn(src) {
-                                        igc.AddInclSource(src)
-                                        groupChanged = true
-                                }
-                        }
-                }
-                /* If any of the existing ip in the source list is removed we need to remove from the list in igp and igc */
-                if _, ok := mvp.Proxy[igc.GroupName]; ok {
-                        /* If we get leave message from any subscriber, we do not have to delete the entries in the src list
-                           Only if ther is any modification in the src list by proxy config update only then we need to update */
-                        if len(ip) != 0 && len(ip) != len(igc.IncludeList) {
-                                for i := len(igc.IncludeList) - 1; i >= 0; i-- {
-                                        src := igc.IncludeList[i]
-                                        if !IsIPPresent(src, ip) {
-                                                igp.DelInclSource(src)
-                                                igc.DelInclSource(src)
-                                                groupChanged = true
-                                        }
-                                }
-                        }
-                }
-        } else {
-                for _, src := range ip {
-
-                        if igp.InclSourceIsIn(src) {
-                                igp.DelInclSource(src)
-                                if igc.InclSourceIsIn(src) {
-                                        igc.DelInclSource(src)
-                                        groupChanged = true
-                                }
-                                if len(igp.IncludeList) == 0 {
-                                        receiverSrcListEmpty = true
-                                }
-                        }
-
-                        // If the source is not in the list of exclude sources for the port
-                        // add it. If so, check also if it is in list of include sources
-                        // at the device level.
-                        if !igp.ExclSourceIsIn(src) {
-                                igp.AddExclSource(src)
-                                /* If there is any update in the src list of proxy we need to update the igc */
-                                if _, ok := mvp.Proxy[igc.GroupName]; ok {
-                                        if !igc.ExclSourceIsIn(src) {
-                                                igc.AddExclSource(src)
-                                                groupChanged = true
-                                        }
-                                }
-                        }
-                }
-                /* If any of the existing ip in the source list is removed we need to remove from the list in igp and igc */
-                if _, ok := mvp.Proxy[igc.GroupName]; ok {
-                        if len(ip) != len(igc.ExcludeList) {
-                                for i := len(igc.ExcludeList) - 1; i >= 0; i-- {
-                                        src := igc.ExcludeList[i]
-                                        if !IsIPPresent(src, ip) {
-                                                igp.DelExclSource(src)
-                                                igc.DelExclSource(src)
-                                                groupChanged = true
-                                        }
-                                }
-                        }
-                }
-                groupExclUpdated = igc.UpdateExclSource(ip)
-        }
-        if err := igp.WriteToDb(cntx, igc.Mvlan, igc.GroupAddr, igc.Device); err != nil {
-                logger.Errorw(ctx, "Igmp group port Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
-        }
-        return (groupChanged || groupExclUpdated), receiverSrcListEmpty
+			// If the source is not in the list of exclude sources for the port
+			// add it. If so, check also if it is in list of include sources
+			// at the device level.
+			if !igp.ExclSourceIsIn(src) {
+				igp.AddExclSource(src)
+				/* If there is any update in the src list of proxy we need to update the igc */
+				if _, ok := mvp.Proxy[igc.GroupName]; ok {
+					if !igc.ExclSourceIsIn(src) {
+						igc.AddExclSource(src)
+						groupChanged = true
+					}
+				}
+			}
+		}
+		/* If any of the existing ip in the source list is removed we need to remove from the list in igp and igc */
+		if _, ok := mvp.Proxy[igc.GroupName]; ok {
+			if len(ip) != len(igc.ExcludeList) {
+				for i := len(igc.ExcludeList) - 1; i >= 0; i-- {
+					src := igc.ExcludeList[i]
+					if !IsIPPresent(src, ip) {
+						igp.DelExclSource(src)
+						igc.DelExclSource(src)
+						groupChanged = true
+					}
+				}
+			}
+		}
+		groupExclUpdated = igc.UpdateExclSource(ip)
+	}
+	if err := igp.WriteToDb(cntx, igc.Mvlan, igc.GroupAddr, igc.Device); err != nil {
+		logger.Errorw(ctx, "Igmp group port Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
+	}
+	return (groupChanged || groupExclUpdated), receiverSrcListEmpty
 }
 
 // GetReceiver to get receiver info
 func (igc *IgmpGroupChannel) GetReceiver(port string) *IgmpGroupPort {
-        igp := igc.NewReceivers[port]
-        if igp == nil {
-                igp = igc.CurReceivers[port]
-        }
-        return igp
+	igp := igc.NewReceivers[port]
+	if igp == nil {
+		igp = igc.CurReceivers[port]
+	}
+	return igp
 }
 
 // AddReceiver add the receiver to the device and perform other actions such as adding the group
 // to the physical device, add members, add flows to point the MC packets to the
 // group. Also, send a IGMP report upstream if there is a change in the group
 func (igc *IgmpGroupChannel) AddReceiver(cntx context.Context, port string, group *layers.IGMPv3GroupRecord, cvlan uint16, pbit uint8) bool {
+	var igp *IgmpGroupPort
+	var groupModified = false
+	var isNewReceiver = false
 
-        var igp *IgmpGroupPort
-        var groupModified = false
-        var isNewReceiver = false
+	var ip []net.IP
+	incl := false
+	mvp := GetApplication().GetMvlanProfileByTag(igc.Mvlan)
+	if _, ok := mvp.Proxy[igc.GroupName]; ok {
+		if mvp.Proxy[igc.GroupName].Mode == common.Include {
+			incl = true
+		}
+		ip = mvp.Proxy[igc.GroupName].SourceList
+	} else if group != nil {
+		incl = isIncl(group.Type)
+		ip = group.SourceAddresses
+	}
+	logger.Debugw(ctx, "Attempting to add receiver", log.Fields{"Version": igc.Version, "Port": port, "Incl": incl, "srcIp": ip})
 
-        var ip []net.IP
-        incl := false
-        mvp := GetApplication().GetMvlanProfileByTag(igc.Mvlan)
-        if _, ok := mvp.Proxy[igc.GroupName]; ok {
-                if mvp.Proxy[igc.GroupName].Mode == common.Include {
-                        incl = true
-                }
-                ip = mvp.Proxy[igc.GroupName].SourceList
-        } else if group != nil {
-                incl = isIncl(group.Type)
-                ip = group.SourceAddresses
-        }
-        logger.Debugw(ctx, "Attempting to add receiver", log.Fields{"Version": igc.Version, "Port": port, "Incl": incl, "srcIp": ip})
+	//logger.Infow(ctx, "Receivers", log.Fields{"New": igc.NewReceivers, "Current": igc.CurReceivers})
+	logger.Debugw(ctx, "Receiver Group", log.Fields{"Igd GId": igc.GroupID})
+	logger.Debugw(ctx, "Receiver Channel", log.Fields{"Igd addr": igc.GroupAddr})
+	logger.Debugw(ctx, "Receiver Mvlan", log.Fields{"Igd mvlan": igc.Mvlan})
+	logger.Debugw(ctx, "Receiver Sources", log.Fields{"Igd addr": ip})
 
-        //logger.Infow(ctx, "Receivers", log.Fields{"New": igc.NewReceivers, "Current": igc.CurReceivers})
-        logger.Debugw(ctx, "Receiver Group", log.Fields{"Igd GId": igc.GroupID})
-        logger.Debugw(ctx, "Receiver Channel", log.Fields{"Igd addr": igc.GroupAddr})
-        logger.Debugw(ctx, "Receiver Mvlan", log.Fields{"Igd mvlan": igc.Mvlan})
-        logger.Debugw(ctx, "Receiver Sources", log.Fields{"Igd addr": ip})
+	ponPortID := GetApplication().GetPonPortID(igc.Device, port)
 
-        ponPortID := GetApplication().GetPonPortID(igc.Device, port)
+	// Process the IGMP receiver. If it is already in, we should only process the changes
+	// to source list.
+	var newRcvExists bool
+	igp, newRcvExists = igc.NewReceivers[port]
+	if !newRcvExists {
+		// Add the receiver to the list of receivers and make the necessary group modification
+		// if this is the first time the receiver is added
+		var curRcvExists bool
+		if igp, curRcvExists = igc.CurReceivers[port]; curRcvExists {
+			logger.Debugw(ctx, "Existing IGMP receiver", log.Fields{"Group": igc.GroupAddr.String(), "Port": port})
+			delete(igc.CurReceivers, port)
+			igp.QueryTimeoutCount = 0
+			igc.NewReceivers[port] = igp
+		} else {
+			// New receiver who wasn't part of earlier list
+			// Need to send out IGMP group modification for this port
+			igp = NewIgmpGroupPort(port, cvlan, pbit, igc.Version, incl, uint32(ponPortID))
+			igc.NewReceivers[port] = igp
+			isNewReceiver = true
+			logger.Debugw(ctx, "New IGMP receiver", log.Fields{"Group": igc.GroupAddr.String(), "Port": port})
+			if len(igc.NewReceivers) == 1 && len(igc.CurReceivers) == 0 {
+				groupModified = true
+				igc.AddMcFlow(cntx)
+				logger.Debugw(ctx, "Added New Flow", log.Fields{"Group": igc.GroupAddr.String(), "Port": port})
+			}
+			if !incl {
+				igc.Exclude++
+			}
+		}
+	}
 
-        // Process the IGMP receiver. If it is already in, we should only process the changes
-        // to source list.
-        var newRcvExists bool
-        igp, newRcvExists = igc.NewReceivers[port]
-        if !newRcvExists {
-                // Add the receiver to the list of receivers and make the necessary group modification
-                // if this is the first time the receiver is added
-                var curRcvExists bool
-                if igp, curRcvExists = igc.CurReceivers[port]; curRcvExists {
-                        logger.Debugw(ctx, "Existing IGMP receiver", log.Fields{"Group": igc.GroupAddr.String(), "Port": port})
-                        delete(igc.CurReceivers, port)
-                        igp.QueryTimeoutCount = 0
-                        igc.NewReceivers[port] = igp
-                } else {
-                        // New receiver who wasn't part of earlier list
-                        // Need to send out IGMP group modification for this port
-                        igp = NewIgmpGroupPort(port, cvlan, pbit, igc.Version, incl, uint32(ponPortID))
-                        igc.NewReceivers[port] = igp
-                        isNewReceiver = true
-                        logger.Debugw(ctx, "New IGMP receiver", log.Fields{"Group": igc.GroupAddr.String(), "Port": port})
-                        if len(igc.NewReceivers) == 1 && len(igc.CurReceivers) == 0 {
-                                groupModified = true
-                                igc.AddMcFlow(cntx)
-                                logger.Debugw(ctx, "Added New Flow", log.Fields{"Group": igc.GroupAddr.String(), "Port": port})
-                        }
-                        if !incl {
-                                igc.Exclude++
-                        }
-                }
-        }
+	// Process the include/exclude list which may end up modifying the group
+	if change, _ := igc.ProcessSources(cntx, port, ip, incl); change {
+		groupModified = true
+	}
+	igc.ProcessMode(port, incl)
 
-        // Process the include/exclude list which may end up modifying the group
-        if change, _ := igc.ProcessSources(cntx, port, ip, incl); change {
-                groupModified = true
-        }
-        igc.ProcessMode(port, incl)
+	// If the group is modified as this is the first receiver or due to include/exclude list modification
+	// send a report to the upstream multicast servers
+	if groupModified {
+		logger.Debug(ctx, "Group Modified and IGMP report sent to the upstream server")
+		igc.SendReport(false)
+	} else if newRcvExists {
+		return false
+	}
 
-        // If the group is modified as this is the first receiver or due to include/exclude list modification
-        // send a report to the upstream multicast servers
-        if groupModified {
-                logger.Debug(ctx, "Group Modified and IGMP report sent to the upstream server")
-                igc.SendReport(false)
-        } else if newRcvExists {
-                return false
-        }
+	logger.Debugw(ctx, "Channel Receiver Added", log.Fields{"Group Channel": igc.GroupAddr, "Group Port": igp})
 
-        logger.Debugw(ctx, "Channel Receiver Added", log.Fields{"Group Channel": igc.GroupAddr, "Group Port": igp})
-
-        if err := igc.WriteToDb(cntx); err != nil {
-                logger.Errorw(ctx, "Igmp group channel Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
-        }
-        if err := igp.WriteToDb(cntx, igc.Mvlan, igc.GroupAddr, igc.Device); err != nil {
-                logger.Errorw(ctx, "Igmp group port Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
-        }
-        return isNewReceiver
+	if err := igc.WriteToDb(cntx); err != nil {
+		logger.Errorw(ctx, "Igmp group channel Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
+	}
+	if err := igp.WriteToDb(cntx, igc.Mvlan, igc.GroupAddr, igc.Device); err != nil {
+		logger.Errorw(ctx, "Igmp group port Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
+	}
+	return isNewReceiver
 }
 
 // DelReceiver is called when Query expiry happened for a receiver. This removes the receiver from the
 // the group
 func (igc *IgmpGroupChannel) DelReceiver(cntx context.Context, port string, incl bool, srcList []net.IP) bool {
-        // The receiver may exist either in NewReceiver list or
-        // the CurReceivers list. Find and remove it from either
-        // of the lists.
-        logger.Debugw(ctx, "Deleting Receiver from Channel", log.Fields{"Port": port, "SrcList": srcList, "Incl": incl})
-        logger.Debugw(ctx, "New Receivers", log.Fields{"New": igc.NewReceivers})
-        logger.Debugw(ctx, "Current Receivers", log.Fields{"Current": igc.CurReceivers})
+	// The receiver may exist either in NewReceiver list or
+	// the CurReceivers list. Find and remove it from either
+	// of the lists.
+	logger.Debugw(ctx, "Deleting Receiver from Channel", log.Fields{"Port": port, "SrcList": srcList, "Incl": incl})
+	logger.Debugw(ctx, "New Receivers", log.Fields{"New": igc.NewReceivers})
+	logger.Debugw(ctx, "Current Receivers", log.Fields{"Current": igc.CurReceivers})
 
-        receiversUpdated := false
-        groupModified, receiverSrcListEmpty := igc.ProcessSources(cntx, port, srcList, incl)
+	receiversUpdated := false
+	groupModified, receiverSrcListEmpty := igc.ProcessSources(cntx, port, srcList, incl)
 
-        if len(srcList) == 0 || len(igc.IncludeList) == 0 || receiverSrcListEmpty {
-                if igp, ok := igc.NewReceivers[port]; ok {
-                        logger.Debug(ctx, "Deleting from NewReceivers")
-                        delete(igc.NewReceivers, port)
-                        receiversUpdated = true
-                        if igp.Exclude {
-                                igc.Exclude--
-                        }
-                } else {
-                        if igp, ok1 := igc.CurReceivers[port]; ok1 {
-                                logger.Debug(ctx, "Deleting from CurReceivers")
-                                delete(igc.CurReceivers, port)
-                                receiversUpdated = true
-                                if igp.Exclude {
-                                        igc.Exclude--
-                                }
-                        } else {
-                                logger.Debug(ctx, "Receiver doesnot exist. Dropping Igmp leave")
-                                return false
-                        }
-                }
-                _ = db.DelIgmpRcvr(cntx, igc.Mvlan, igc.GroupAddr, igc.Device, port)
-        }
+	if len(srcList) == 0 || len(igc.IncludeList) == 0 || receiverSrcListEmpty {
+		if igp, ok := igc.NewReceivers[port]; ok {
+			logger.Debug(ctx, "Deleting from NewReceivers")
+			delete(igc.NewReceivers, port)
+			receiversUpdated = true
+			if igp.Exclude {
+				igc.Exclude--
+			}
+		} else {
+			if igp, ok1 := igc.CurReceivers[port]; ok1 {
+				logger.Debug(ctx, "Deleting from CurReceivers")
+				delete(igc.CurReceivers, port)
+				receiversUpdated = true
+				if igp.Exclude {
+					igc.Exclude--
+				}
+			} else {
+				logger.Debug(ctx, "Receiver doesnot exist. Dropping Igmp leave")
+				return false
+			}
+		}
+		_ = db.DelIgmpRcvr(cntx, igc.Mvlan, igc.GroupAddr, igc.Device, port)
+	}
 
-        if igc.NumReceivers() == 0 {
-                igc.DelMcFlow(cntx)
-                mvp := GetApplication().GetMvlanProfileByTag(igc.Mvlan)
-                /* If proxy is configured and NumReceivers is 0, then we can reset the igc src list so that we send leave */
-                if _, ok := mvp.Proxy[igc.GroupName]; ok {
-                        igc.IncludeList = []net.IP{}
-                }
-                igc.SendLeaveToServer()
-                logger.Debugw(ctx, "Deleted the receiver Flow", log.Fields{"Num Receivers": igc.NumReceivers()})
-                return true
-        }
-        if groupModified {
-                igc.SendReport(false)
-                logger.Infow(ctx, "Updated SourceList for Channel", log.Fields{"Current": igc.CurReceivers, "New": igc.NewReceivers})
-        }
-        if err := igc.WriteToDb(cntx); err != nil {
-                logger.Errorw(ctx, "Igmp group channel Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
-        }
-        logger.Infow(ctx, "Updated Receiver info for Channel", log.Fields{"Current": igc.CurReceivers, "New": igc.NewReceivers})
+	if igc.NumReceivers() == 0 {
+		igc.DelMcFlow(cntx)
+		mvp := GetApplication().GetMvlanProfileByTag(igc.Mvlan)
+		/* If proxy is configured and NumReceivers is 0, then we can reset the igc src list so that we send leave */
+		if _, ok := mvp.Proxy[igc.GroupName]; ok {
+			igc.IncludeList = []net.IP{}
+		}
+		igc.SendLeaveToServer()
+		logger.Debugw(ctx, "Deleted the receiver Flow", log.Fields{"Num Receivers": igc.NumReceivers()})
+		return true
+	}
+	if groupModified {
+		igc.SendReport(false)
+		logger.Infow(ctx, "Updated SourceList for Channel", log.Fields{"Current": igc.CurReceivers, "New": igc.NewReceivers})
+	}
+	if err := igc.WriteToDb(cntx); err != nil {
+		logger.Errorw(ctx, "Igmp group channel Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
+	}
+	logger.Infow(ctx, "Updated Receiver info for Channel", log.Fields{"Current": igc.CurReceivers, "New": igc.NewReceivers})
 
-        return receiversUpdated
+	return receiversUpdated
 }
 
 // DelAllReceivers deletes all receiver for the provided igmp device
 func (igc *IgmpGroupChannel) DelAllReceivers(cntx context.Context) {
-        logger.Infow(ctx, "Deleting All Receiver for Channel", log.Fields{"Device": igc.Device, "Channel": igc.GroupAddr.String()})
-        _ = db.DelAllIgmpRcvr(cntx, igc.Mvlan, igc.GroupAddr, igc.Device)
-        igc.Exclude = 0
-        igc.DelMcFlow(cntx)
-        igc.SendLeaveToServer()
-        logger.Infow(ctx, "MC Flow deleted and Leave sent", log.Fields{"Channel": igc.GroupAddr.String(), "Device": igc.Device})
+	logger.Infow(ctx, "Deleting All Receiver for Channel", log.Fields{"Device": igc.Device, "Channel": igc.GroupAddr.String()})
+	_ = db.DelAllIgmpRcvr(cntx, igc.Mvlan, igc.GroupAddr, igc.Device)
+	igc.Exclude = 0
+	igc.DelMcFlow(cntx)
+	igc.SendLeaveToServer()
+	logger.Infow(ctx, "MC Flow deleted and Leave sent", log.Fields{"Channel": igc.GroupAddr.String(), "Device": igc.Device})
 }
 
 // Igmpv2ReportPacket build an IGMPv2 Report for the upstream servers
 func (igc *IgmpGroupChannel) Igmpv2ReportPacket() ([]byte, error) {
-        logger.Debugw(ctx, "Buidling IGMP version 2 Report", log.Fields{"Device": igc.Device})
-        return IgmpReportv2Packet(igc.GroupAddr, igc.Mvlan, (*igc.proxyCfg).IgmpCos, **igc.IgmpProxyIP)
+	logger.Debugw(ctx, "Building IGMP version 2 Report", log.Fields{"Device": igc.Device})
+	return IgmpReportv2Packet(igc.GroupAddr, igc.Mvlan, (*igc.proxyCfg).IgmpCos, **igc.IgmpProxyIP)
 }
 
 // Igmpv3ReportPacket build an IGMPv3 Report for the upstream servers
 func (igc *IgmpGroupChannel) Igmpv3ReportPacket() ([]byte, error) {
-        logger.Debugw(ctx, "Buidling IGMP version 3 Report", log.Fields{"Device": igc.Device, "Exclude": igc.Exclude})
-        if igc.Exclude > 0 {
-                return Igmpv3ReportPacket(igc.GroupAddr, igc.Mvlan, (*igc.proxyCfg).IgmpCos, **igc.IgmpProxyIP, false, igc.ExcludeList)
-        }
-        return Igmpv3ReportPacket(igc.GroupAddr, igc.Mvlan, (*igc.proxyCfg).IgmpCos, **igc.IgmpProxyIP, true, igc.IncludeList)
+	logger.Debugw(ctx, "Building IGMP version 3 Report", log.Fields{"Device": igc.Device, "Exclude": igc.Exclude})
+	if igc.Exclude > 0 {
+		return Igmpv3ReportPacket(igc.GroupAddr, igc.Mvlan, (*igc.proxyCfg).IgmpCos, **igc.IgmpProxyIP, false, igc.ExcludeList)
+	}
+	return Igmpv3ReportPacket(igc.GroupAddr, igc.Mvlan, (*igc.proxyCfg).IgmpCos, **igc.IgmpProxyIP, true, igc.IncludeList)
 }
 
 // SendReport send a consolidated report to the server
 func (igc *IgmpGroupChannel) SendReport(isQuery bool) {
-        var report []byte
-        var err error
-        logger.Debugw(ctx, "Checking Version", log.Fields{"IGC Version": igc.Version, "Proxy Version": (*igc.proxyCfg).IgmpVerToServer,
-                "Result": (getVersion((*igc.proxyCfg).IgmpVerToServer) == IgmpVersion2)})
+	var report []byte
+	var err error
+	logger.Debugw(ctx, "Checking Version", log.Fields{"IGC Version": igc.Version, "Proxy Version": (*igc.proxyCfg).IgmpVerToServer,
+		"Result": (getVersion((*igc.proxyCfg).IgmpVerToServer) == IgmpVersion2)})
 
-        /**
-                                       +------------------------------------------------------------------------+
-                                       |         IGMP version(towards BNG) Configured at VGC                    |
-                                       +-------------------------------+----------------------------------------+
-                                       |                  v2           |                 v3                     |
-        +===================+==========+===============================+========================================+
-        | Received From RG  | V2 Join  | Process and Send as V2 to BNG | Process, Convert to v3 and Send to BNG |
-        |                   |          |                               | Process, Send as v2, if the BNG is v2  |
-        +===================+----------+-------------------------------+----------------------------------------+
-                            | V3 Join  | Process and Send as V2 to BNG | Process, Send v3 to BNG                |
-                            |          |                               | Process, Convert, Send as v2, if the   |
-                            |          |                               | BNG is v2                              |
-        +===================+==========+===============================+========================================+
-        | Received From BNG | V2 Query | V2 response to BNG            | V2 response to BNG                     |
-        +===================+----------+-------------------------------+----------------------------------------+
-                            | V3 Query | Discard                       | V3 response to BNG                     |
-                            +==========+===============================+========================================+
-        */
-        // igc.Version:         igmp version received from RG.
-        // igc.ServVersion: igmp version received from BNG or IgmpVerToServer present in proxy igmp conf.
+	/**
+	                                 +------------------------------------------------------------------------+
+	                                 |         IGMP version(towards BNG) Configured at VGC                    |
+	                                 +-------------------------------+----------------------------------------+
+	                                 |                  v2           |                 v3                     |
+	  +===================+==========+===============================+========================================+
+	  | Received From RG  | V2 Join  | Process and Send as V2 to BNG | Process, Convert to v3 and Send to BNG |
+	  |                   |          |                               | Process, Send as v2, if the BNG is v2  |
+	  +===================+----------+-------------------------------+----------------------------------------+
+	                      | V3 Join  | Process and Send as V2 to BNG | Process, Send v3 to BNG                |
+	                      |          |                               | Process, Convert, Send as v2, if the   |
+	                      |          |                               | BNG is v2                              |
+	  +===================+==========+===============================+========================================+
+	  | Received From BNG | V2 Query | V2 response to BNG            | V2 response to BNG                     |
+	  +===================+----------+-------------------------------+----------------------------------------+
+	                      | V3 Query | Discard                       | V3 response to BNG                     |
+	                      +==========+===============================+========================================+
+	*/
+	// igc.Version:         igmp version received from RG.
+	// igc.ServVersion: igmp version received from BNG or IgmpVerToServer present in proxy igmp conf.
 
-        if isQuery && *igc.ServVersion == IgmpVersion3 && getVersion((*igc.proxyCfg).IgmpVerToServer) == IgmpVersion2 {
-                // This is the last scenario where we must discard the query processing.
-                logger.Debug(ctx, "Dropping query packet since the server verion is v3 but igmp proxy version is v2")
-                return
-        }
+	if isQuery && *igc.ServVersion == IgmpVersion3 && getVersion((*igc.proxyCfg).IgmpVerToServer) == IgmpVersion2 {
+		// This is the last scenario where we must discard the query processing.
+		logger.Debug(ctx, "Dropping query packet since the server verion is v3 but igmp proxy version is v2")
+		return
+	}
 
-        if *igc.ServVersion == IgmpVersion2 || getVersion((*igc.proxyCfg).IgmpVerToServer) == IgmpVersion2 {
-                report, err = igc.Igmpv2ReportPacket()
-        } else {
-                report, err = igc.Igmpv3ReportPacket()
-        }
-        if err != nil {
-                logger.Warnw(ctx, "Error Preparing Report", log.Fields{"Device": igc.Device, "Ver": igc.Version, "Reason": err.Error()})
-                return
-        }
-        nni, err := GetApplication().GetNniPort(igc.Device)
-        if err == nil {
-                _ = cntlr.GetController().PacketOutReq(igc.Device, nni, nni, report, false)
-        } else {
-                logger.Warnw(ctx, "Didn't find NNI port", log.Fields{"Device": igc.Device})
-        }
+	if *igc.ServVersion == IgmpVersion2 || getVersion((*igc.proxyCfg).IgmpVerToServer) == IgmpVersion2 {
+		report, err = igc.Igmpv2ReportPacket()
+	} else {
+		report, err = igc.Igmpv3ReportPacket()
+	}
+	if err != nil {
+		logger.Warnw(ctx, "Error Preparing Report", log.Fields{"Device": igc.Device, "Ver": igc.Version, "Reason": err.Error()})
+		return
+	}
+	nni, err := GetApplication().GetNniPort(igc.Device)
+	if err == nil {
+		_ = cntlr.GetController().PacketOutReq(igc.Device, nni, nni, report, false)
+	} else {
+		logger.Warnw(ctx, "Didn't find NNI port", log.Fields{"Device": igc.Device})
+	}
 }
 
 // AddMcFlow adds flow to the device when the first receiver joins
 func (igc *IgmpGroupChannel) AddMcFlow(cntx context.Context) {
-        flow, err := igc.BuildMcFlow()
-        if err != nil {
-                logger.Warnw(ctx, "MC Flow Build Failed", log.Fields{"Reason": err.Error()})
-                return
-        }
-        port, _ := GetApplication().GetNniPort(igc.Device)
-        _ = cntlr.GetController().AddFlows(cntx, port, igc.Device, flow)
+	flow, err := igc.BuildMcFlow()
+	if err != nil {
+		logger.Warnw(ctx, "MC Flow Build Failed", log.Fields{"Reason": err.Error()})
+		return
+	}
+	port, _ := GetApplication().GetNniPort(igc.Device)
+	_ = cntlr.GetController().AddFlows(cntx, port, igc.Device, flow)
 }
 
 // DelMcFlow deletes flow from the device when the last receiver leaves
 func (igc *IgmpGroupChannel) DelMcFlow(cntx context.Context) {
-        flow, err := igc.BuildMcFlow()
-        if err != nil {
-                logger.Warnw(ctx, "MC Flow Build Failed", log.Fields{"Reason": err.Error()})
-                return
-        }
-        flow.ForceAction = true
-        device := GetApplication().GetDevice(igc.Device)
+	flow, err := igc.BuildMcFlow()
+	if err != nil {
+		logger.Warnw(ctx, "MC Flow Build Failed", log.Fields{"Reason": err.Error()})
+		return
+	}
+	flow.ForceAction = true
+	device := GetApplication().GetDevice(igc.Device)
 
-        if mvpIntf, _ := GetApplication().MvlanProfilesByTag.Load(igc.Mvlan); mvpIntf != nil {
-                mvp := mvpIntf.(*MvlanProfile)
-                err := mvp.DelFlows(cntx, device, flow)
-                if err != nil {
-                        logger.Warnw(ctx, "Delering IGMP Flow for device failed ", log.Fields{"Device": device, "err": err})
-                }
-        }
+	if mvpIntf, _ := GetApplication().MvlanProfilesByTag.Load(igc.Mvlan); mvpIntf != nil {
+		mvp := mvpIntf.(*MvlanProfile)
+		err := mvp.DelFlows(cntx, device, flow)
+		if err != nil {
+			logger.Warnw(ctx, "Delering IGMP Flow for device failed ", log.Fields{"Device": device, "err": err})
+		}
+	}
 }
 
 // BuildMcFlow builds the flow using which it is added/deleted
 func (igc *IgmpGroupChannel) BuildMcFlow() (*of.VoltFlow, error) {
-        flow := &of.VoltFlow{}
-        flow.SubFlows = make(map[uint64]*of.VoltSubFlow)
-        //va := GetApplication()
-        logger.Infow(ctx, "Building Mcast flow", log.Fields{"Mcast Group": igc.GroupAddr.String(), "Mvlan": igc.Mvlan.String()})
-        uintGroupAddr := ipv4ToUint(igc.GroupAddr)
-        subFlow := of.NewVoltSubFlow()
-        subFlow.SetMatchVlan(igc.Mvlan)
-        subFlow.SetIpv4Match()
-        subFlow.SetMatchDstIpv4(igc.GroupAddr)
-        mvp := GetApplication().GetMvlanProfileByTag(igc.Mvlan)
-        //nni, err := va.GetNniPort(igc.Device)
-        //if err != nil {
-        //      return nil, err
-        //}
-        //inport, err := va.GetPortID(nni)
-        //if err != nil {
-        //      return nil, err
-        //}
-        //subFlow.SetInPort(inport)
-        subFlow.SetOutGroup(igc.GroupID)
-        cookiePort := uintGroupAddr
-        subFlow.Cookie = uint64(cookiePort)<<32 | uint64(igc.Mvlan)
-        subFlow.Priority = of.McFlowPriority
-        metadata := uint64(mvp.PonVlan)
-        subFlow.SetTableMetadata(metadata)
+	flow := &of.VoltFlow{}
+	flow.SubFlows = make(map[uint64]*of.VoltSubFlow)
+	//va := GetApplication()
+	logger.Infow(ctx, "Building Mcast flow", log.Fields{"Mcast Group": igc.GroupAddr.String(), "Mvlan": igc.Mvlan.String()})
+	uintGroupAddr := ipv4ToUint(igc.GroupAddr)
+	subFlow := of.NewVoltSubFlow()
+	subFlow.SetMatchVlan(igc.Mvlan)
+	subFlow.SetIpv4Match()
+	subFlow.SetMatchDstIpv4(igc.GroupAddr)
+	mvp := GetApplication().GetMvlanProfileByTag(igc.Mvlan)
+	//nni, err := va.GetNniPort(igc.Device)
+	//if err != nil {
+	//      return nil, err
+	//}
+	//inport, err := va.GetPortID(nni)
+	//if err != nil {
+	//      return nil, err
+	//}
+	//subFlow.SetInPort(inport)
+	subFlow.SetOutGroup(igc.GroupID)
+	cookiePort := uintGroupAddr
+	subFlow.Cookie = uint64(cookiePort)<<32 | uint64(igc.Mvlan)
+	subFlow.Priority = of.McFlowPriority
+	metadata := uint64(mvp.PonVlan)
+	subFlow.SetTableMetadata(metadata)
 
-        flow.SubFlows[subFlow.Cookie] = subFlow
-        logger.Infow(ctx, "Built Mcast flow", log.Fields{"cookie": subFlow.Cookie, "subflow": subFlow})
-        return flow, nil
+	flow.SubFlows[subFlow.Cookie] = subFlow
+	logger.Infow(ctx, "Built Mcast flow", log.Fields{"cookie": subFlow.Cookie, "subflow": subFlow})
+	return flow, nil
 }
 
 // IgmpLeaveToServer sends IGMP leave to server. Called when the last receiver leaves the group
 func (igc *IgmpGroupChannel) IgmpLeaveToServer() {
-        if leave, err := IgmpLeavePacket(igc.GroupAddr, igc.Mvlan, (*igc.proxyCfg).IgmpCos, **igc.IgmpProxyIP); err == nil {
-                nni, err1 := GetApplication().GetNniPort(igc.Device)
-                if err1 == nil {
-                        _ = cntlr.GetController().PacketOutReq(igc.Device, nni, nni, leave, false)
-                }
-        }
+	if leave, err := IgmpLeavePacket(igc.GroupAddr, igc.Mvlan, (*igc.proxyCfg).IgmpCos, **igc.IgmpProxyIP); err == nil {
+		nni, err1 := GetApplication().GetNniPort(igc.Device)
+		if err1 == nil {
+			_ = cntlr.GetController().PacketOutReq(igc.Device, nni, nni, leave, false)
+		}
+	}
 }
 
 // SendLeaveToServer delete the group when the last receiver leaves the group
 func (igc *IgmpGroupChannel) SendLeaveToServer() {
-        /**
-                                       +-------------------------------------------------------------------------+
-                                       |         IGMP version(towards BNG) Configured at VGC                     |
-                                       +-------------------------------+-----------------------------------------+
-                                       |                  v2           |                 v3                      |
-        +===================+==========+===============================+=========================================+
-        | Received From RG  | V2 Leave | Process and Send as V2 to BNG | Process, Convert to V3 and Send to BNG/ |
-        |                   |          |                               | Process, Send as V2, if the BNG is V2   |
-        +===================+----------+-------------------------------+-----------------------------------------+
-                            | V3 Leave | Process and Send as V2 to BNG | Process, Send V3 to BNG                 |
-                            |          |                               | Process, Convert, Send as V2, if the    |
-                            |          |                               | BNG is v2                               |
-                            +==========+===============================+=========================================+
-        */
-        // igc.Version:         igmp version received from RG.
-        // igc.ServVersion: igmp version received from BNG or IgmpVerToServer present in proxy igmp conf.
+	/**
+	                                 +-------------------------------------------------------------------------+
+	                                 |         IGMP version(towards BNG) Configured at VGC                     |
+	                                 +-------------------------------+-----------------------------------------+
+	                                 |                  v2           |                 v3                      |
+	  +===================+==========+===============================+=========================================+
+	  | Received From RG  | V2 Leave | Process and Send as V2 to BNG | Process, Convert to V3 and Send to BNG/ |
+	  |                   |          |                               | Process, Send as V2, if the BNG is V2   |
+	  +===================+----------+-------------------------------+-----------------------------------------+
+	                      | V3 Leave | Process and Send as V2 to BNG | Process, Send V3 to BNG                 |
+	                      |          |                               | Process, Convert, Send as V2, if the    |
+	                      |          |                               | BNG is v2                               |
+	                      +==========+===============================+=========================================+
+	*/
+	// igc.Version:         igmp version received from RG.
+	// igc.ServVersion: igmp version received from BNG or IgmpVerToServer present in proxy igmp conf.
 
-        logger.Debugw(ctx, "Sending IGMP leave upstream", log.Fields{"Device": igc.Device})
-        if *igc.ServVersion == IgmpVersion2 || getVersion((*igc.proxyCfg).IgmpVerToServer) == IgmpVersion2 {
-                igc.IgmpLeaveToServer()
-        } else {
-                igc.SendReport(false)
-        }
+	logger.Debugw(ctx, "Sending IGMP leave upstream", log.Fields{"Device": igc.Device})
+	if *igc.ServVersion == IgmpVersion2 || getVersion((*igc.proxyCfg).IgmpVerToServer) == IgmpVersion2 {
+		igc.IgmpLeaveToServer()
+	} else {
+		igc.SendReport(false)
+	}
 }
 
 // NumReceivers returns total number of receivers left on the group
 func (igc *IgmpGroupChannel) NumReceivers() uint32 {
-        return uint32(len(igc.CurReceivers) + len(igc.NewReceivers))
+	return uint32(len(igc.CurReceivers) + len(igc.NewReceivers))
 }
 
 // SendQuery sends query to the receivers for counting purpose
 func (igc *IgmpGroupChannel) SendQuery() {
-        //var b []byte
-        //var err error
-        for portKey, port := range igc.NewReceivers {
-                igc.CurReceivers[portKey] = port
-        }
+	//var b []byte
+	//var err error
+	for portKey, port := range igc.NewReceivers {
+		igc.CurReceivers[portKey] = port
+	}
 
-        igc.NewReceivers = make(map[string]*IgmpGroupPort)
+	igc.NewReceivers = make(map[string]*IgmpGroupPort)
 
-        logger.Debugw(ctx, "Sending Query to receivers", log.Fields{"Receivers": igc.CurReceivers})
-        for port, groupPort := range igc.CurReceivers {
-                if port == StaticPort {
-                        continue
-                }
-                if queryPkt, err := igc.buildQuery(igc.GroupAddr, of.VlanType(groupPort.CVlan), groupPort.Pbit); err == nil {
-                        _ = cntlr.GetController().PacketOutReq(igc.Device, port, port, queryPkt, false)
-                        logger.Debugw(ctx, "Query Sent", log.Fields{"Device": igc.Device, "Port": port, "Packet": queryPkt})
-                } else {
-                        logger.Warnw(ctx, "Query Creation Failed", log.Fields{"Reason": err.Error()})
-                }
-        }
-
+	logger.Debugw(ctx, "Sending Query to receivers", log.Fields{"Receivers": igc.CurReceivers})
+	for port, groupPort := range igc.CurReceivers {
+		if port == StaticPort {
+			continue
+		}
+		if queryPkt, err := igc.buildQuery(igc.GroupAddr, of.VlanType(groupPort.CVlan), groupPort.Pbit); err == nil {
+			_ = cntlr.GetController().PacketOutReq(igc.Device, port, port, queryPkt, false)
+			logger.Debugw(ctx, "Query Sent", log.Fields{"Device": igc.Device, "Port": port, "Packet": queryPkt})
+		} else {
+			logger.Warnw(ctx, "Query Creation Failed", log.Fields{"Reason": err.Error()})
+		}
+	}
 }
 
 // buildQuery to build query packet
 func (igc *IgmpGroupChannel) buildQuery(groupAddr net.IP, cVlan of.VlanType, pbit uint8) ([]byte, error) {
-        if igc.Version == IgmpVersion2 {
-                return Igmpv2QueryPacket(igc.GroupAddr, cVlan, **igc.IgmpProxyIP, pbit, (*igc.proxyCfg).MaxResp)
-        }
-        return Igmpv3QueryPacket(igc.GroupAddr, cVlan, **igc.IgmpProxyIP, pbit, (*igc.proxyCfg).MaxResp)
+	if igc.Version == IgmpVersion2 {
+		return Igmpv2QueryPacket(igc.GroupAddr, cVlan, **igc.IgmpProxyIP, pbit, (*igc.proxyCfg).MaxResp)
+	}
+	return Igmpv3QueryPacket(igc.GroupAddr, cVlan, **igc.IgmpProxyIP, pbit, (*igc.proxyCfg).MaxResp)
 }
 
 // ProcessMode process the received mode and updated the igp
 func (igc *IgmpGroupChannel) ProcessMode(port string, incl bool) {
-        /* Update the mode in igp if the mode has changed */
-        igp := igc.GetReceiver(port)
-        if igp.Exclude && incl {
-                igp.Exclude = !incl
-                if igc.Exclude > 0 {
-                        igc.Exclude--
-                }
-        } else if !incl && !igp.Exclude {
-                igp.Exclude = !incl
-                igc.Exclude++
-        }
+	/* Update the mode in igp if the mode has changed */
+	igp := igc.GetReceiver(port)
+	if igp.Exclude && incl {
+		igp.Exclude = !incl
+		if igc.Exclude > 0 {
+			igc.Exclude--
+		}
+	} else if !incl && !igp.Exclude {
+		igp.Exclude = !incl
+		igc.Exclude++
+	}
 }
-
diff --git a/internal/pkg/application/igmpgroupdevice.go b/internal/pkg/application/igmpgroupdevice.go
index 0d59747..1a12bc4 100644
--- a/internal/pkg/application/igmpgroupdevice.go
+++ b/internal/pkg/application/igmpgroupdevice.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
 
@@ -36,492 +36,475 @@
 // report when the first listener joins and is responsible for
 // sending responses to upstream queries
 type IgmpGroupDevice struct {
-        Device            string
-        SerialNo          string
-        GroupID           uint32
-        GroupName         string
-        GroupAddr         net.IP
-        RecvVersion       uint8
-        ServVersion       *uint8
-        RecvVersionExpiry time.Time
-        ServVersionExpiry time.Time
-        Mvlan             of.VlanType
-        PonVlan           of.VlanType
-        IsPonVlanPresent  bool
-        GroupInstalled    bool
-        GroupChannels     sync.Map            `json:"-"` // [ipAddr]*IgmpGroupChannel
-        PortChannelMap    sync.Map            `json:"-"` // [portName][]net.IP
-        PonPortChannelMap *util.ConcurrentMap `json:"-"` // [ponPortId]*PonPortChannels
-        proxyCfg          *IgmpProfile                   // IgmpSrcIp from IgmpProfile is not used, it is kept for backward compatibility
-        IgmpProxyIP       *net.IP             `json:"-"`
-        NextQueryTime     time.Time
-        QueryExpiryTime   time.Time
+	PonPortChannelMap *util.ConcurrentMap `json:"-"` // [ponPortId]*PonPortChannels
+	proxyCfg          *IgmpProfile        // IgmpSrcIp from IgmpProfile is not used, it is kept for backward compatibility
+	IgmpProxyIP       *net.IP             `json:"-"`
+	ServVersion       *uint8
+	Device            string
+	SerialNo          string
+	GroupName         string
+	GroupChannels     sync.Map `json:"-"` // [ipAddr]*IgmpGroupChannel
+	PortChannelMap    sync.Map `json:"-"` // [portName][]net.IP
+	NextQueryTime     time.Time
+	QueryExpiryTime   time.Time
+	RecvVersionExpiry time.Time
+	ServVersionExpiry time.Time
+	GroupAddr         net.IP
+	GroupID           uint32
+	Mvlan             of.VlanType
+	PonVlan           of.VlanType
+	RecvVersion       uint8
+	IsPonVlanPresent  bool
+	GroupInstalled    bool
 }
 
 // NewIgmpGroupDevice is constructor for a device. The default IGMP version is set to 3
 // as the protocol defines the way to manage backward compatibility
-// The implementation handles simultaneous presense of lower versioned
+// The implementation handles simultaneous presence of lower versioned
 // receivers
 func NewIgmpGroupDevice(name string, ig *IgmpGroup, id uint32, version uint8) *IgmpGroupDevice {
-        var igd IgmpGroupDevice
-        igd.Device = name
-        igd.GroupID = id
-        igd.GroupName = ig.GroupName
-        igd.GroupAddr = ig.GroupAddr
-        igd.Mvlan = ig.Mvlan
-        igd.PonVlan = ig.PonVlan
-        igd.IsPonVlanPresent = ig.IsPonVlanPresent
-        igd.GroupInstalled = false
-        igd.RecvVersion = version
-        igd.RecvVersionExpiry = time.Now()
-        igd.ServVersionExpiry = time.Now()
-        igd.PonPortChannelMap = util.NewConcurrentMap()
+	var igd IgmpGroupDevice
+	igd.Device = name
+	igd.GroupID = id
+	igd.GroupName = ig.GroupName
+	igd.GroupAddr = ig.GroupAddr
+	igd.Mvlan = ig.Mvlan
+	igd.PonVlan = ig.PonVlan
+	igd.IsPonVlanPresent = ig.IsPonVlanPresent
+	igd.GroupInstalled = false
+	igd.RecvVersion = version
+	igd.RecvVersionExpiry = time.Now()
+	igd.ServVersionExpiry = time.Now()
+	igd.PonPortChannelMap = util.NewConcurrentMap()
 
-        va := GetApplication()
-        if vd := va.GetDevice(igd.Device); vd != nil {
-                igd.SerialNo = vd.SerialNum
-        } else {
-                logger.Errorw(ctx, "Volt Device not found.  log.Fields", log.Fields{"igd.Device": igd.Device})
-                return nil
-        }
-        mvp := GetApplication().GetMvlanProfileByTag(igd.Mvlan)
-        igd.ServVersion = mvp.IgmpServVersion[igd.SerialNo]
+	va := GetApplication()
+	if vd := va.GetDevice(igd.Device); vd != nil {
+		igd.SerialNo = vd.SerialNum
+	} else {
+		logger.Errorw(ctx, "Volt Device not found.  log.Fields", log.Fields{"igd.Device": igd.Device})
+		return nil
+	}
+	mvp := GetApplication().GetMvlanProfileByTag(igd.Mvlan)
+	igd.ServVersion = mvp.IgmpServVersion[igd.SerialNo]
 
-        var mcastCfg *McastConfig
-        igd.proxyCfg, igd.IgmpProxyIP, mcastCfg = getIgmpProxyCfgAndIP(ig.Mvlan, igd.SerialNo)
+	var mcastCfg *McastConfig
+	igd.proxyCfg, igd.IgmpProxyIP, mcastCfg = getIgmpProxyCfgAndIP(ig.Mvlan, igd.SerialNo)
 
-        // mvlan profile id + olt serial number---igmp group id
-        //igmpgroup id
-        igd.NextQueryTime = time.Now().Add(time.Duration(igd.proxyCfg.KeepAliveInterval) * time.Second)
-        igd.QueryExpiryTime = time.Now().Add(time.Duration(igd.proxyCfg.KeepAliveInterval) * time.Second)
+	// mvlan profile id + olt serial number---igmp group id
+	//igmpgroup id
+	igd.NextQueryTime = time.Now().Add(time.Duration(igd.proxyCfg.KeepAliveInterval) * time.Second)
+	igd.QueryExpiryTime = time.Now().Add(time.Duration(igd.proxyCfg.KeepAliveInterval) * time.Second)
 
-        if mcastCfg != nil {
-                mcastCfg.IgmpGroupDevices.Store(id, &igd)
-                logger.Debugw(ctx, "Igd added to mcast config", log.Fields{"mvlan": mcastCfg.MvlanProfileID, "groupId": id})
-        }
-        return &igd
+	if mcastCfg != nil {
+		mcastCfg.IgmpGroupDevices.Store(id, &igd)
+		logger.Debugw(ctx, "Igd added to mcast config", log.Fields{"mvlan": mcastCfg.MvlanProfileID, "groupId": id})
+	}
+	return &igd
 }
 
 // IgmpGroupDeviceReInit is re-initializer for a device. The default IGMP version is set to 3
 // as the protocol defines the way to manage backward compatibility
 func (igd *IgmpGroupDevice) IgmpGroupDeviceReInit(cntx context.Context, ig *IgmpGroup) {
+	logger.Infow(ctx, "Reinitialize Igmp Group Device", log.Fields{"Device": igd.Device, "GroupID": ig.GroupID, "OldName": igd.GroupName, "Name": ig.GroupName, "OldAddr": igd.GroupAddr.String(), "GroupAddr": ig.GroupAddr.String()})
 
-        logger.Infow(ctx, "Reinitialize Igmp Group Device", log.Fields{"Device": igd.Device, "GroupID": ig.GroupID, "OldName": igd.GroupName, "Name": ig.GroupName, "OldAddr": igd.GroupAddr.String(), "GroupAddr": ig.GroupAddr.String()})
+	if (igd.GroupName != ig.GroupName) || !igd.GroupAddr.Equal(ig.GroupAddr) {
+		_ = db.DelIgmpDevice(cntx, igd.Mvlan, igd.GroupName, igd.GroupAddr, igd.Device)
+		igd.GroupName = ig.GroupName
+		igd.GroupAddr = ig.GroupAddr
+	}
+	igd.RecvVersionExpiry = time.Now()
+	igd.ServVersionExpiry = time.Now()
+	igd.PonPortChannelMap = util.NewConcurrentMap()
 
-        if (igd.GroupName != ig.GroupName) || !igd.GroupAddr.Equal(ig.GroupAddr) {
-                _ = db.DelIgmpDevice(cntx, igd.Mvlan, igd.GroupName, igd.GroupAddr, igd.Device)
-                igd.GroupName = ig.GroupName
-                igd.GroupAddr = ig.GroupAddr
-        }
-        igd.RecvVersionExpiry = time.Now()
-        igd.ServVersionExpiry = time.Now()
-        igd.PonPortChannelMap = util.NewConcurrentMap()
+	var mcastCfg *McastConfig
+	igd.proxyCfg, igd.IgmpProxyIP, mcastCfg = getIgmpProxyCfgAndIP(ig.Mvlan, igd.SerialNo)
 
-        var mcastCfg *McastConfig
-        igd.proxyCfg, igd.IgmpProxyIP, mcastCfg = getIgmpProxyCfgAndIP(ig.Mvlan, igd.SerialNo)
+	igd.NextQueryTime = time.Now().Add(time.Duration(igd.proxyCfg.KeepAliveInterval) * time.Second)
+	igd.QueryExpiryTime = time.Now().Add(time.Duration(igd.proxyCfg.KeepAliveInterval) * time.Second)
 
-        igd.NextQueryTime = time.Now().Add(time.Duration(igd.proxyCfg.KeepAliveInterval) * time.Second)
-        igd.QueryExpiryTime = time.Now().Add(time.Duration(igd.proxyCfg.KeepAliveInterval) * time.Second)
-
-        if mcastCfg != nil {
-                mcastCfg.IgmpGroupDevices.Store(ig.GroupID, igd)
-                logger.Debugw(ctx, "Igd added to mcast config", log.Fields{"mvlan": mcastCfg.MvlanProfileID, "groupId": ig.GroupID})
-        }
-        if err := igd.WriteToDb(cntx); err != nil {
-                logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device, "GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
-        }
+	if mcastCfg != nil {
+		mcastCfg.IgmpGroupDevices.Store(ig.GroupID, igd)
+		logger.Debugw(ctx, "Igd added to mcast config", log.Fields{"mvlan": mcastCfg.MvlanProfileID, "groupId": ig.GroupID})
+	}
+	if err := igd.WriteToDb(cntx); err != nil {
+		logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device, "GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
+	}
 }
 
 func getIgmpProxyCfgAndIP(mvlan of.VlanType, serialNo string) (*IgmpProfile, *net.IP, *McastConfig) {
-        va := GetApplication()
-        mVLANProfileID := va.GetMvlanProfileByTag(mvlan).Name
-        var mcastCfg *McastConfig
-        if mcastCfg = va.GetMcastConfig(serialNo, mVLANProfileID); mcastCfg == nil || (mcastCfg != nil && mcastCfg.IgmpProfileID == "") {
-                logger.Debugw(ctx, "Default IGMP config to be used", log.Fields{"mVLANProfileID": mVLANProfileID, "OltSerialNo": serialNo})
-                igmpProf := va.getIgmpProfileMap(DefaultIgmpProfID)
-                return igmpProf, &igmpProf.IgmpSourceIP, mcastCfg
-        }
-        return va.getIgmpProfileMap(mcastCfg.IgmpProfileID), &mcastCfg.IgmpProxyIP, mcastCfg
+	va := GetApplication()
+	mVLANProfileID := va.GetMvlanProfileByTag(mvlan).Name
+	var mcastCfg *McastConfig
+	if mcastCfg = va.GetMcastConfig(serialNo, mVLANProfileID); mcastCfg == nil || (mcastCfg != nil && mcastCfg.IgmpProfileID == "") {
+		logger.Debugw(ctx, "Default IGMP config to be used", log.Fields{"mVLANProfileID": mVLANProfileID, "OltSerialNo": serialNo})
+		igmpProf := va.getIgmpProfileMap(DefaultIgmpProfID)
+		return igmpProf, &igmpProf.IgmpSourceIP, mcastCfg
+	}
+	return va.getIgmpProfileMap(mcastCfg.IgmpProfileID), &mcastCfg.IgmpProxyIP, mcastCfg
 }
 
 // updateGroupName to update the group name
 func (igd *IgmpGroupDevice) updateGroupName(cntx context.Context, newGroupName string) {
-
-        oldName := igd.GroupName
-        igd.GroupName = newGroupName
-        updateGroupName := func(key, value interface{}) bool {
-                igc := value.(*IgmpGroupChannel)
-                igc.GroupName = newGroupName
-                if err := igc.WriteToDb(cntx); err != nil {
-                        logger.Errorw(ctx, "Igmp group channel Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
-                }
-                _ = db.DelIgmpChannel(cntx, igc.Mvlan, oldName, igc.Device, igc.GroupAddr)
-                return true
-        }
-        igd.GroupChannels.Range(updateGroupName)
-        if err := igd.WriteToDb(cntx); err != nil {
-                logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device, "GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
-        }
-        _ = db.DelIgmpDevice(cntx, igd.Mvlan, oldName, igd.GroupAddr, igd.Device)
+	oldName := igd.GroupName
+	igd.GroupName = newGroupName
+	updateGroupName := func(key, value interface{}) bool {
+		igc := value.(*IgmpGroupChannel)
+		igc.GroupName = newGroupName
+		if err := igc.WriteToDb(cntx); err != nil {
+			logger.Errorw(ctx, "Igmp group channel Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
+		}
+		_ = db.DelIgmpChannel(cntx, igc.Mvlan, oldName, igc.Device, igc.GroupAddr)
+		return true
+	}
+	igd.GroupChannels.Range(updateGroupName)
+	if err := igd.WriteToDb(cntx); err != nil {
+		logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device, "GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
+	}
+	_ = db.DelIgmpDevice(cntx, igd.Mvlan, oldName, igd.GroupAddr, igd.Device)
 }
 
 // NewIgmpGroupDeviceFromBytes is to create the IGMP group port from a byte slice
 func NewIgmpGroupDeviceFromBytes(b []byte) (*IgmpGroupDevice, error) {
-        var igd IgmpGroupDevice
-        if err := json.Unmarshal(b, &igd); err != nil {
-                return nil, err
-        }
-        return &igd, nil
+	var igd IgmpGroupDevice
+	if err := json.Unmarshal(b, &igd); err != nil {
+		return nil, err
+	}
+	return &igd, nil
 }
 
 // GetKey to get group name as key
 func (igd *IgmpGroupDevice) GetKey() string {
-
-        if !net.ParseIP("0.0.0.0").Equal(igd.GroupAddr) {
-                return igd.GroupName + "_" + igd.GroupAddr.String()
-        }
-        return igd.GroupName
-
+	if !net.ParseIP("0.0.0.0").Equal(igd.GroupAddr) {
+		return igd.GroupName + "_" + igd.GroupAddr.String()
+	}
+	return igd.GroupName
 }
 
 // RestoreChannel to restore channel
 func (igd *IgmpGroupDevice) RestoreChannel(cntx context.Context, igmpGroupChannel []byte) {
+	if igc, err := NewIgmpGroupChannelFromBytes(igmpGroupChannel); err == nil {
+		igc.ServVersion = igd.ServVersion
+		igc.IgmpProxyIP = &igd.IgmpProxyIP
+		igc.proxyCfg = &igd.proxyCfg
+		igd.GroupChannels.Store(igc.GroupAddr.String(), igc)
+		igc.RestorePorts(cntx)
 
-        if igc, err := NewIgmpGroupChannelFromBytes(igmpGroupChannel); err == nil {
-                igc.ServVersion = igd.ServVersion
-                igc.IgmpProxyIP = &igd.IgmpProxyIP
-                igc.proxyCfg = &igd.proxyCfg
-                igd.GroupChannels.Store(igc.GroupAddr.String(), igc)
-                igc.RestorePorts(cntx)
+		for port, igp := range igc.NewReceivers {
+			ipsList := []net.IP{}
+			ipsIntf, _ := igd.PortChannelMap.Load(port)
+			if ipsIntf != nil {
+				ipsList = ipsIntf.([]net.IP)
+			}
 
-                for port, igp := range igc.NewReceivers {
-                        ipsList := []net.IP{}
-                        ipsIntf, _ := igd.PortChannelMap.Load(port)
-                        if ipsIntf != nil {
-                                ipsList = ipsIntf.([]net.IP)
-                        }
-
-                        ipsList = append(ipsList, igc.GroupAddr)
-                        igd.PortChannelMap.Store(port, ipsList)
-                        logger.Infow(ctx, "Group Channels Restored", log.Fields{"IGC": igc})
-                        igd.AddChannelToChannelsPerPon(port, igc.GroupAddr, igp.PonPortID)
-                }
-        } else {
-                logger.Warnw(ctx, "Failed to decode port from DB", log.Fields{"err": err})
-        }
-        logger.Info(ctx, "Group Device & Channels Restored")
-        igd.PortChannelMap.Range(printPortChannel)
-        igd.GroupChannels.Range(printChannel)
-
+			ipsList = append(ipsList, igc.GroupAddr)
+			igd.PortChannelMap.Store(port, ipsList)
+			logger.Infow(ctx, "Group Channels Restored", log.Fields{"IGC": igc})
+			igd.AddChannelToChannelsPerPon(port, igc.GroupAddr, igp.PonPortID)
+		}
+	} else {
+		logger.Warnw(ctx, "Failed to decode port from DB", log.Fields{"err": err})
+	}
+	logger.Info(ctx, "Group Device & Channels Restored")
+	igd.PortChannelMap.Range(printPortChannel)
+	igd.GroupChannels.Range(printChannel)
 }
 
 // RestoreChannels to restore channels
 func (igd *IgmpGroupDevice) RestoreChannels(cntx context.Context) {
-
-        igd.migrateIgmpChannels(cntx)
-        channels, _ := db.GetIgmpChannels(cntx, igd.Mvlan, igd.GroupName, igd.Device)
-        for _, channel := range channels {
-
-                b, ok := channel.Value.([]byte)
-                if !ok {
-                        logger.Warn(ctx, "The value type is not []byte")
-                        continue
-                }
-                igd.RestoreChannel(cntx, b)
-        }
-
+	igd.migrateIgmpChannels(cntx)
+	channels, _ := db.GetIgmpChannels(cntx, igd.Mvlan, igd.GroupName, igd.Device)
+	for _, channel := range channels {
+		b, ok := channel.Value.([]byte)
+		if !ok {
+			logger.Warn(ctx, "The value type is not []byte")
+			continue
+		}
+		igd.RestoreChannel(cntx, b)
+	}
 }
 
-
 // WriteToDb is utility to write IGMP Group Device Info to the database
 func (igd *IgmpGroupDevice) WriteToDb(cntx context.Context) error {
-        b, err := json.Marshal(igd)
-        if err != nil {
-                return err
-        }
-        if err1 := db.PutIgmpDevice(cntx, igd.Mvlan, igd.GroupName, igd.GroupAddr, igd.Device, string(b)); err1 != nil {
-                return err1
-        }
-        logger.Info(ctx, "IGD Updated")
-        return nil
+	b, err := json.Marshal(igd)
+	if err != nil {
+		return err
+	}
+	if err1 := db.PutIgmpDevice(cntx, igd.Mvlan, igd.GroupName, igd.GroupAddr, igd.Device, string(b)); err1 != nil {
+		return err1
+	}
+	logger.Info(ctx, "IGD Updated")
+	return nil
 }
 
 // Tick processes timing tick used to run timers within the device
 func (igd *IgmpGroupDevice) Tick() uint8 {
-        /* Not using RecvVersionExpiry as it is not used anywhere
-        if time.Now().After(igd.RecvVersionExpiry) {
-                igd.RecvVersion = IgmpVersion3
-                return true
-        }
-        */
-        return 0
+	/* Not using RecvVersionExpiry as it is not used anywhere
+	   if time.Now().After(igd.RecvVersionExpiry) {
+	           igd.RecvVersion = IgmpVersion3
+	           return true
+	   }
+	*/
+	return 0
 }
 
 // GetSubscriberCountForChannelAndPonPort Gets the active subscriber count
 // for the given channel for one particular PON port
 func (igd *IgmpGroupDevice) GetSubscriberCountForChannelAndPonPort(ponPortID uint32, channelIP net.IP) uint64 {
-        if portMapIntf, ok := igd.PonPortChannelMap.Get(ponPortID); ok {
-                portChannelMap := portMapIntf.(*PonPortChannels)
+	if portMapIntf, ok := igd.PonPortChannelMap.Get(ponPortID); ok {
+		portChannelMap := portMapIntf.(*PonPortChannels)
 
-                if channel, present := portChannelMap.ChannelList.Get(channelIP.String()); present {
-                        return channel.(*UniPortList).UNIList.Length()
-                }
-        } else {
-                logger.Warnw(ctx, "PON port not found in PortChannelMap", log.Fields{"PON": ponPortID, "channel": channelIP})
-        }
-        return 0
+		if channel, present := portChannelMap.ChannelList.Get(channelIP.String()); present {
+			return channel.(*UniPortList).UNIList.Length()
+		}
+	} else {
+		logger.Warnw(ctx, "PON port not found in PortChannelMap", log.Fields{"PON": ponPortID, "channel": channelIP})
+	}
+	return 0
 }
 
 // AddChannelToChannelsPerPon Adds the new channel into the per Pon channel list
 func (igd *IgmpGroupDevice) AddChannelToChannelsPerPon(uniPort string, channelIP net.IP, ponPortID uint32) bool {
-        logger.Debugw(ctx, "Adding channel to ActiveChannelsPerPon list", log.Fields{"PonPort": ponPortID, "channelIP": channelIP})
+	logger.Debugw(ctx, "Adding channel to ActiveChannelsPerPon list", log.Fields{"PonPort": ponPortID, "channelIP": channelIP})
 
-        isNewChannel := bool(false)
-        isNewReceiver := false
-        if port, ok := igd.PonPortChannelMap.Get(ponPortID); !ok {
-                // PON port not exists in igd. adding it.
-                isNewReceiver = true
-                ponPortChannels := NewPonPortChannels()
-                isNewChannel = ponPortChannels.AddChannelToMap(uniPort, channelIP.String())
-                igd.PonPortChannelMap.Set(ponPortID, ponPortChannels)
-        } else {
-                // PON port exists in igd. Appending the channel list
-                // in the PON port.
-                isNewChannel = port.(*PonPortChannels).AddChannelToMap(uniPort, channelIP.String())
-                igd.PonPortChannelMap.Set(ponPortID, port)
-                count := port.(*PonPortChannels).GetActiveChannelCount()
+	isNewChannel := bool(false)
+	isNewReceiver := false
+	if port, ok := igd.PonPortChannelMap.Get(ponPortID); !ok {
+		// PON port not exists in igd. adding it.
+		isNewReceiver = true
+		ponPortChannels := NewPonPortChannels()
+		isNewChannel = ponPortChannels.AddChannelToMap(uniPort, channelIP.String())
+		igd.PonPortChannelMap.Set(ponPortID, ponPortChannels)
+	} else {
+		// PON port exists in igd. Appending the channel list
+		// in the PON port.
+		isNewChannel = port.(*PonPortChannels).AddChannelToMap(uniPort, channelIP.String())
+		igd.PonPortChannelMap.Set(ponPortID, port)
+		count := port.(*PonPortChannels).GetActiveChannelCount()
 
-                logger.Debugw(ctx, "activeChannelCount", log.Fields{"count": count})
-        }
-        GetApplication().UpdateActiveChannelCountForPonPort(igd.Device, uniPort, ponPortID, true, isNewChannel, igd)
-        return isNewReceiver
+		logger.Debugw(ctx, "activeChannelCount", log.Fields{"count": count})
+	}
+	GetApplication().UpdateActiveChannelCountForPonPort(igd.Device, uniPort, ponPortID, true, isNewChannel, igd)
+	return isNewReceiver
 }
 
 // RemoveChannelFromChannelsPerPon removes the channel from the per pon channel list.
 func (igd *IgmpGroupDevice) RemoveChannelFromChannelsPerPon(uniPort string, channelIP net.IP, ponPortID uint32) bool {
-        logger.Debugw(ctx, "Removing channel from ActiveChannelsPerPon list", log.Fields{"PonPort": ponPortID, "channelIP": channelIP})
-        var deleted bool
-        ponRemoved := false
+	logger.Debugw(ctx, "Removing channel from ActiveChannelsPerPon list", log.Fields{"PonPort": ponPortID, "channelIP": channelIP})
+	var deleted bool
+	ponRemoved := false
 
-        if port, ok := igd.PonPortChannelMap.Get(ponPortID); ok {
-                channelPortMap := port.(*PonPortChannels)
-                deleted = channelPortMap.RemoveChannelFromMap(uniPort, channelIP.String())
-                if deleted && channelPortMap.ChannelList.Length() == 0 {
-                        igd.PonPortChannelMap.Remove(ponPortID)
-                        ponRemoved = true
-                }
-                GetApplication().UpdateActiveChannelCountForPonPort(igd.Device, uniPort, ponPortID, false, deleted, igd)
-        } else {
-                logger.Warnw(ctx, "PON port doesn't exists in the igd", log.Fields{"PonPortID": ponPortID})
-        }
-        return ponRemoved
+	if port, ok := igd.PonPortChannelMap.Get(ponPortID); ok {
+		channelPortMap := port.(*PonPortChannels)
+		deleted = channelPortMap.RemoveChannelFromMap(uniPort, channelIP.String())
+		if deleted && channelPortMap.ChannelList.Length() == 0 {
+			igd.PonPortChannelMap.Remove(ponPortID)
+			ponRemoved = true
+		}
+		GetApplication().UpdateActiveChannelCountForPonPort(igd.Device, uniPort, ponPortID, false, deleted, igd)
+	} else {
+		logger.Warnw(ctx, "PON port doesn't exists in the igd", log.Fields{"PonPortID": ponPortID})
+	}
+	return ponRemoved
 }
 
 // printChannel to print channel info
 func printChannel(key interface{}, value interface{}) bool {
-        logger.Infow(ctx, "ChannelMap", log.Fields{"Channel": key.(string), "Igc": value.(*IgmpGroupChannel)})
-        return true
+	logger.Infow(ctx, "ChannelMap", log.Fields{"Channel": key.(string), "Igc": value.(*IgmpGroupChannel)})
+	return true
 }
 
 // printPortChannel to print port channel
 func printPortChannel(key interface{}, value interface{}) bool {
-        logger.Infow(ctx, "PortChannelMap", log.Fields{"Port": key.(string), "List": value.([]net.IP)})
-        return true
+	logger.Infow(ctx, "PortChannelMap", log.Fields{"Port": key.(string), "List": value.([]net.IP)})
+	return true
 }
 
-
 // AddReceiver add the receiver to the device and perform other actions such as adding the group
 // to the physical device, add members, add flows to point the MC packets to the
 // group. Also, send a IGMP report upstream if there is a change in the group
 func (igd *IgmpGroupDevice) AddReceiver(cntx context.Context, port string, groupAddr net.IP,
-        group *layers.IGMPv3GroupRecord, version uint8, cvlan uint16, pbit uint8, ponPortID uint32) {
+	group *layers.IGMPv3GroupRecord, version uint8, cvlan uint16, pbit uint8, ponPortID uint32) {
+	var igc *IgmpGroupChannel
+	logger.Debugw(ctx, "Processing receiver for device", log.Fields{"Channel": groupAddr, "Port": port, "Device": igd.Device})
 
-        var igc *IgmpGroupChannel
-        logger.Debugw(ctx, "Processing receiver for device", log.Fields{"Channel": groupAddr, "Port": port, "Device": igd.Device})
+	igcIntf, ok := igd.GroupChannels.Load(groupAddr.String())
+	if !ok {
+		igc = NewIgmpGroupChannel(igd, groupAddr, version)
+		igd.GroupChannels.Store(groupAddr.String(), igc)
+	} else {
+		igc = igcIntf.(*IgmpGroupChannel)
+	}
 
-        igcIntf, ok := igd.GroupChannels.Load(groupAddr.String())
-        if !ok {
-                igc = NewIgmpGroupChannel(igd, groupAddr, version)
-                igd.GroupChannels.Store(groupAddr.String(), igc)
-        } else {
-                igc = igcIntf.(*IgmpGroupChannel)
-        }
+	if !igd.GroupInstalled {
+		igd.AddNewReceiver(cntx, port, groupAddr, group, cvlan, pbit, ponPortID)
+		return
+	}
 
-        if !igd.GroupInstalled {
-                igd.AddNewReceiver(cntx, port, groupAddr, group, cvlan, pbit, ponPortID)
-                return
-        }
+	isNewReceiver := igc.AddReceiver(cntx, port, group, cvlan, pbit)
+	if isNewReceiver {
+		ipsList := []net.IP{}
+		ipsIntf, _ := igd.PortChannelMap.Load(port)
+		if ipsIntf != nil {
+			ipsList = ipsIntf.([]net.IP)
+		}
+		ipsList = append(ipsList, groupAddr)
+		igd.PortChannelMap.Store(port, ipsList)
+		logger.Debugw(ctx, "Port Channel Updated", log.Fields{"Port": port, "AddedChannelList": ipsList, "Addr": groupAddr})
 
-        isNewReceiver := igc.AddReceiver(cntx, port, group, cvlan, pbit)
-        if isNewReceiver {
-                ipsList := []net.IP{}
-                ipsIntf, _ := igd.PortChannelMap.Load(port)
-                if ipsIntf != nil {
-                        ipsList = ipsIntf.([]net.IP)
-                }
-                ipsList = append(ipsList, groupAddr)
-                igd.PortChannelMap.Store(port, ipsList)
-                logger.Debugw(ctx, "Port Channel Updated", log.Fields{"Port": port, "AddedChannelList": ipsList, "Addr": groupAddr})
-
-                isNewPonReceiver := igd.AddChannelToChannelsPerPon(port, groupAddr, ponPortID)
-                //Modify group only if this is the first time the port is subscribing for the group
-                if isNewPonReceiver {
-                        igd.ModMcGroup()
-                }
-        }
-        if err := igd.WriteToDb(cntx); err != nil {
-                logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device, "GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
-        }
+		isNewPonReceiver := igd.AddChannelToChannelsPerPon(port, groupAddr, ponPortID)
+		//Modify group only if this is the first time the port is subscribing for the group
+		if isNewPonReceiver {
+			igd.ModMcGroup()
+		}
+	}
+	if err := igd.WriteToDb(cntx); err != nil {
+		logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device, "GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
+	}
 }
 
 // AddNewReceiver to add new receiver
 func (igd *IgmpGroupDevice) AddNewReceiver(cntx context.Context, port string, groupAddr net.IP, group *layers.IGMPv3GroupRecord, cvlan uint16, pbit uint8, ponPortID uint32) {
+	logger.Debugw(ctx, "Adding New Device Receiver", log.Fields{"Channel": groupAddr, "Port": port, "Device": igd.Device})
+	igcIntf, _ := igd.GroupChannels.Load(groupAddr.String())
+	if igcIntf == nil {
+		logger.Warnw(ctx, "No Group Channel present for given channel", log.Fields{"Channel": groupAddr, "Port": port, "Device": igd.Device})
+		return
+	}
 
-        logger.Debugw(ctx, "Adding New Device Receiver", log.Fields{"Channel": groupAddr, "Port": port, "Device": igd.Device})
-        igcIntf, _ := igd.GroupChannels.Load(groupAddr.String())
-        if igcIntf == nil {
-                logger.Warnw(ctx, "No Group Channel present for given channel", log.Fields{"Channel": groupAddr, "Port": port, "Device": igd.Device})
-                return
-        }
+	igc := igcIntf.(*IgmpGroupChannel)
+	ipsList := []net.IP{}
+	ipsIntf, _ := igd.PortChannelMap.Load(port)
+	if ipsIntf != nil {
+		ipsList = ipsIntf.([]net.IP)
+	}
+	ipsList = append(ipsList, groupAddr)
+	igd.PortChannelMap.Store(port, ipsList)
+	igd.AddChannelToChannelsPerPon(port, groupAddr, ponPortID)
+	logger.Debugw(ctx, "Port Channel Updated", log.Fields{"Port": port, "NewChannelList": ipsList, "Addr": groupAddr})
 
-        igc := igcIntf.(*IgmpGroupChannel)
-        ipsList := []net.IP{}
-        ipsIntf, _ := igd.PortChannelMap.Load(port)
-        if ipsIntf != nil {
-                ipsList = ipsIntf.([]net.IP)
-        }
-        ipsList = append(ipsList, groupAddr)
-        igd.PortChannelMap.Store(port, ipsList)
-        igd.AddChannelToChannelsPerPon(port, groupAddr, ponPortID)
-        logger.Debugw(ctx, "Port Channel Updated", log.Fields{"Port": port, "NewChannelList": ipsList, "Addr": groupAddr})
-
-        igd.AddMcGroup()
-        igc.AddReceiver(cntx, port, group, cvlan, pbit)
-        if err := igd.WriteToDb(cntx); err != nil {
-                logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device, "GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
-        }
+	igd.AddMcGroup()
+	igc.AddReceiver(cntx, port, group, cvlan, pbit)
+	if err := igd.WriteToDb(cntx); err != nil {
+		logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device, "GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
+	}
 }
 
-
 // NumReceivers to get number of receivers
 func (igd *IgmpGroupDevice) NumReceivers() int {
-        var numReceivers int
-        len := func(key interface{}, value interface{}) bool {
-                numReceivers++
-                return true
-        }
-        igd.PortChannelMap.Range(len)
-        return numReceivers
+	var numReceivers int
+	len := func(key interface{}, value interface{}) bool {
+		numReceivers++
+		return true
+	}
+	igd.PortChannelMap.Range(len)
+	return numReceivers
 }
 
 // DelReceiver is called when Query expiry happened for a receiver. This removes the receiver from the
 // the group
 func (igd *IgmpGroupDevice) DelReceiver(cntx context.Context, groupAddr net.IP, port string, group *layers.IGMPv3GroupRecord, ponPortID uint32) {
+	logger.Debugw(ctx, "Deleting Receiver for Device", log.Fields{"port": port, "GroupIP": groupAddr.String()})
+	var igc *IgmpGroupChannel
+	var igcIntf interface{}
+	var ok bool
+	var srcList []net.IP
+	incl := false
+	mvp := GetApplication().GetMvlanProfileByTag(igd.Mvlan)
 
-        logger.Debugw(ctx, "Deleting Receiver for Device", log.Fields{"port": port, "GroupIP": groupAddr.String()})
-        var igc *IgmpGroupChannel
-        var igcIntf interface{}
-        var ok bool
-        var srcList []net.IP
-        incl := false
-        mvp := GetApplication().GetMvlanProfileByTag(igd.Mvlan)
+	if _, ok = mvp.Proxy[igd.GroupName]; ok {
+		incl = true
+	} else if group != nil {
+		srcList = group.SourceAddresses
+		incl = isIncl(group.Type)
+	}
 
-        if _, ok := mvp.Proxy[igd.GroupName]; ok {
-                incl = true
-        } else if group != nil {
-                srcList = group.SourceAddresses
-                incl = isIncl(group.Type)
-        }
+	if igcIntf, ok = igd.GroupChannels.Load(groupAddr.String()); !ok {
+		logger.Warnw(ctx, "Igmp Channel for group IP doesnt exist", log.Fields{"GroupAddr": groupAddr.String()})
+		return
+	}
+	igc = igcIntf.(*IgmpGroupChannel)
+	if ok := igc.DelReceiver(cntx, port, incl, srcList); !ok {
+		return
+	}
 
-        if igcIntf, ok = igd.GroupChannels.Load(groupAddr.String()); !ok {
-                logger.Warnw(ctx, "Igmp Channel for group IP doesnt exist", log.Fields{"GroupAddr": groupAddr.String()})
-                return
-        }
-        igc = igcIntf.(*IgmpGroupChannel)
-        if ok := igc.DelReceiver(cntx, port, incl, srcList); !ok {
-                return
-        }
+	if igc.NumReceivers() == 0 {
+		igd.DelIgmpGroupChannel(cntx, igc)
+	}
+	igd.DelPortFromChannel(port, groupAddr)
+	isGroupModified := igd.RemoveChannelFromChannelsPerPon(port, groupAddr, ponPortID)
 
-        if igc.NumReceivers() == 0 {
-                igd.DelIgmpGroupChannel(cntx, igc)
-        }
-        igd.DelPortFromChannel(port, groupAddr)
-        isGroupModified := igd.RemoveChannelFromChannelsPerPon(port, groupAddr, ponPortID)
-
-        //Remove port from receiver if port has no subscription to any of the group channels
-        if isGroupModified {
-                igd.ModMcGroup()
-        }
-        if err := igd.WriteToDb(cntx); err != nil {
-                logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device, "GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
-        }
+	//Remove port from receiver if port has no subscription to any of the group channels
+	if isGroupModified {
+		igd.ModMcGroup()
+	}
+	if err := igd.WriteToDb(cntx); err != nil {
+		logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device, "GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
+	}
 }
 
 // DelChannelReceiver is called when Query expiry happened for a receiver. This removes the receiver from the
 // the group
 func (igd *IgmpGroupDevice) DelChannelReceiver(cntx context.Context, groupAddr net.IP) map[string]*IgmpGroupPort {
+	portsRemoved := make(map[string]*IgmpGroupPort)
+	groupModified := false
+	// ifEmpty := true
+	igcIntf, _ := igd.GroupChannels.Load(groupAddr.String())
 
-        portsRemoved := make(map[string]*IgmpGroupPort)
-        groupModified := false
-        // ifEmpty := true
-        igcIntf, _ := igd.GroupChannels.Load(groupAddr.String())
+	if igcIntf == nil {
+		return portsRemoved
+	}
+	igc := igcIntf.(*IgmpGroupChannel)
 
-        if igcIntf == nil {
-                return portsRemoved
-        }
-        igc := igcIntf.(*IgmpGroupChannel)
+	for port, igp := range igc.NewReceivers {
+		_ = db.DelIgmpRcvr(cntx, igc.Mvlan, igc.GroupAddr, igc.Device, port) //TODO: Y not here
+		igd.DelPortFromChannel(port, igc.GroupAddr)
+		ponPortID := GetApplication().GetPonPortID(igd.Device, port)
+		groupModified = igd.RemoveChannelFromChannelsPerPon(port, igc.GroupAddr, ponPortID)
+		delete(igc.NewReceivers, port)
+		portsRemoved[port] = igp
+	}
+	for port, igp := range igc.CurReceivers {
+		_ = db.DelIgmpRcvr(cntx, igc.Mvlan, igc.GroupAddr, igc.Device, port)
+		igd.DelPortFromChannel(port, igc.GroupAddr)
+		ponPortID := GetApplication().GetPonPortID(igd.Device, port)
+		groupModified = igd.RemoveChannelFromChannelsPerPon(port, igc.GroupAddr, ponPortID)
+		delete(igc.CurReceivers, port)
+		portsRemoved[port] = igp
+	}
 
-        for port, igp := range igc.NewReceivers {
-                _ = db.DelIgmpRcvr(cntx, igc.Mvlan, igc.GroupAddr, igc.Device, port) //TODO: Y not here
-                igd.DelPortFromChannel(port, igc.GroupAddr)
-                ponPortID := GetApplication().GetPonPortID(igd.Device, port)
-                groupModified = igd.RemoveChannelFromChannelsPerPon(port, igc.GroupAddr, ponPortID)
-                delete(igc.NewReceivers, port)
-                portsRemoved[port] = igp
-        }
-        for port, igp := range igc.CurReceivers {
-                _ = db.DelIgmpRcvr(cntx, igc.Mvlan, igc.GroupAddr, igc.Device, port)
-                igd.DelPortFromChannel(port, igc.GroupAddr)
-                ponPortID := GetApplication().GetPonPortID(igd.Device, port)
-                groupModified = igd.RemoveChannelFromChannelsPerPon(port, igc.GroupAddr, ponPortID)
-                delete(igc.CurReceivers, port)
-                portsRemoved[port] = igp
-        }
+	igc.DelMcFlow(cntx)
+	igd.DelIgmpGroupChannel(cntx, igc)
+	igc.Exclude = 0
+	igc.SendLeaveToServer()
 
-        igc.DelMcFlow(cntx)
-        igd.DelIgmpGroupChannel(cntx, igc)
-        igc.Exclude = 0
-        igc.SendLeaveToServer()
-
-        if groupModified {
-                igd.ModMcGroup()
-        }
-        if err := igd.WriteToDb(cntx); err != nil {
-                logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device, "GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
-        }
-        logger.Debugw(ctx, "Deleted the receiver Flow", log.Fields{"Num Receivers": igc.NumReceivers()})
-        return portsRemoved
+	if groupModified {
+		igd.ModMcGroup()
+	}
+	if err := igd.WriteToDb(cntx); err != nil {
+		logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device, "GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
+	}
+	logger.Debugw(ctx, "Deleted the receiver Flow", log.Fields{"Num Receivers": igc.NumReceivers()})
+	return portsRemoved
 }
 
 // DelIgmpGroupChannel to delete igmp group channel
 func (igd *IgmpGroupDevice) DelIgmpGroupChannel(cntx context.Context, igc *IgmpGroupChannel) {
-
-        if igc.NumReceivers() != 0 {
-                igc.DelAllReceivers(cntx)
-        }
-        _ = db.DelIgmpChannel(cntx, igc.Mvlan, igc.GroupName, igc.Device, igc.GroupAddr)
-        igd.GroupChannels.Delete(igc.GroupAddr.String())
-        logger.Infow(ctx, "Deleted the Channel from Device", log.Fields{"Channel": igc.GroupAddr.String()})
-        isLenZero := true
-        checkIfEmpty := func(key interface{}, value interface{}) bool {
-                isLenZero = false
-                return false
-        }
-        igd.GroupChannels.Range(checkIfEmpty)
-        if isLenZero {
-                logger.Infow(ctx, "No more active channels. Deleting MC Group", log.Fields{"Device": igd.Device, "Group": igd.GroupName})
-                igd.DelMcGroup(false)
-        }
+	if igc.NumReceivers() != 0 {
+		igc.DelAllReceivers(cntx)
+	}
+	_ = db.DelIgmpChannel(cntx, igc.Mvlan, igc.GroupName, igc.Device, igc.GroupAddr)
+	igd.GroupChannels.Delete(igc.GroupAddr.String())
+	logger.Infow(ctx, "Deleted the Channel from Device", log.Fields{"Channel": igc.GroupAddr.String()})
+	isLenZero := true
+	checkIfEmpty := func(key interface{}, value interface{}) bool {
+		isLenZero = false
+		return false
+	}
+	igd.GroupChannels.Range(checkIfEmpty)
+	if isLenZero {
+		logger.Infow(ctx, "No more active channels. Deleting MC Group", log.Fields{"Device": igd.Device, "Group": igd.GroupName})
+		igd.DelMcGroup(false)
+	}
 }
 
 // func (igd *IgmpGroupDevice) DelIgmpChannel(igc *IgmpGroupChannel) {
@@ -532,185 +515,182 @@
 
 // DelPortFromChannel to delete port from channel
 func (igd *IgmpGroupDevice) DelPortFromChannel(port string, groupAddr net.IP) bool {
-        ipsList := []net.IP{}
-        ipsListIntf, _ := igd.PortChannelMap.Load(port)
-        if ipsListIntf != nil {
-                ipsList = ipsListIntf.([]net.IP)
-        }
-        for i, addr := range ipsList {
-                if addr.Equal(groupAddr) {
-                        ipsList = append(ipsList[:i], ipsList[i+1:]...)
-                        //Remove port from receiver if port has no subscription to any of the group channels
-                        if len(ipsList) == 0 {
-                                igd.PortChannelMap.Delete(port)
-                        } else {
-                                //Update the map with modified ips list
-                                igd.PortChannelMap.Store(port, ipsList)
-                        }
-                        logger.Debugw(ctx, "Port Channel Updated", log.Fields{"Port": port, "DelChannelList": ipsList, "Addr": groupAddr.String()})
-                        return true
-                }
-        }
-        return false
+	ipsList := []net.IP{}
+	ipsListIntf, _ := igd.PortChannelMap.Load(port)
+	if ipsListIntf != nil {
+		ipsList = ipsListIntf.([]net.IP)
+	}
+	for i, addr := range ipsList {
+		if addr.Equal(groupAddr) {
+			ipsList = append(ipsList[:i], ipsList[i+1:]...)
+			//Remove port from receiver if port has no subscription to any of the group channels
+			if len(ipsList) == 0 {
+				igd.PortChannelMap.Delete(port)
+			} else {
+				//Update the map with modified ips list
+				igd.PortChannelMap.Store(port, ipsList)
+			}
+			logger.Debugw(ctx, "Port Channel Updated", log.Fields{"Port": port, "DelChannelList": ipsList, "Addr": groupAddr.String()})
+			return true
+		}
+	}
+	return false
 }
 
 // DelAllChannels deletes all receiver for the provided igmp device
 func (igd *IgmpGroupDevice) DelAllChannels(cntx context.Context) {
-        logger.Infow(ctx, "Deleting All Channel for Device", log.Fields{"Device": igd.Device, "Group": igd.GroupName})
-        delGroupChannels := func(key interface{}, value interface{}) bool {
-                igc := value.(*IgmpGroupChannel)
-                igd.DelIgmpGroupChannel(cntx, igc)
-                return true
-        }
-        igd.GroupChannels.Range(delGroupChannels)
+	logger.Infow(ctx, "Deleting All Channel for Device", log.Fields{"Device": igd.Device, "Group": igd.GroupName})
+	delGroupChannels := func(key interface{}, value interface{}) bool {
+		igc := value.(*IgmpGroupChannel)
+		igd.DelIgmpGroupChannel(cntx, igc)
+		return true
+	}
+	igd.GroupChannels.Range(delGroupChannels)
 }
 
 // ProcessQuery process query received from the upstream IGMP server
 func (igd *IgmpGroupDevice) ProcessQuery(cntx context.Context, groupAddr net.IP, ver uint8) {
-        logger.Debugw(ctx, "Received Query From Server", log.Fields{"Version": ver})
-        if ver != *igd.ServVersion {
-                igd.ServVersionExpiry = time.Now().Add(time.Duration(2*igd.proxyCfg.KeepAliveInterval) * time.Second)
-                *igd.ServVersion = ver
-                mvp := GetApplication().GetMvlanProfileByTag(igd.Mvlan)
-                if err := mvp.WriteToDb(cntx); err != nil {
-                        logger.Errorw(ctx, "Mvlan profile write to DB failed", log.Fields{"ProfileName": mvp.Name})
-                }
-        }
-        if igc, ok := igd.GroupChannels.Load(groupAddr.String()); ok {
-                igc.(*IgmpGroupChannel).SendReport(true)
-                return
-        }
-        logger.Infow(ctx, "No Members for Channel. Dropping Igmp Query", log.Fields{"Group": igd.GroupName, "Channel": groupAddr.String()})
+	logger.Debugw(ctx, "Received Query From Server", log.Fields{"Version": ver})
+	if ver != *igd.ServVersion {
+		igd.ServVersionExpiry = time.Now().Add(time.Duration(2*igd.proxyCfg.KeepAliveInterval) * time.Second)
+		*igd.ServVersion = ver
+		mvp := GetApplication().GetMvlanProfileByTag(igd.Mvlan)
+		if err := mvp.WriteToDb(cntx); err != nil {
+			logger.Errorw(ctx, "Mvlan profile write to DB failed", log.Fields{"ProfileName": mvp.Name})
+		}
+	}
+	if igc, ok := igd.GroupChannels.Load(groupAddr.String()); ok {
+		igc.(*IgmpGroupChannel).SendReport(true)
+		return
+	}
+	logger.Infow(ctx, "No Members for Channel. Dropping Igmp Query", log.Fields{"Group": igd.GroupName, "Channel": groupAddr.String()})
 }
 
 // AddMcGroup add the new group on the device when a receiver joins the group
 func (igd *IgmpGroupDevice) AddMcGroup() {
-        if !igd.GroupInstalled {
-                group := &of.Group{}
-                group.Command = of.GroupCommandAdd
-                group.GroupID = igd.GroupID
-                group.Device = igd.Device
-                group.SetVlan = igd.PonVlan
-                group.IsPonVlanPresent = igd.IsPonVlanPresent
+	if !igd.GroupInstalled {
+		group := &of.Group{}
+		group.Command = of.GroupCommandAdd
+		group.GroupID = igd.GroupID
+		group.Device = igd.Device
+		group.SetVlan = igd.PonVlan
+		group.IsPonVlanPresent = igd.IsPonVlanPresent
 
-                addbuckets := func(key interface{}, value interface{}) bool {
-                        port := key.(string)
-                        var portID uint32
-                        if d := GetApplication().GetDevice(group.Device); d != nil {
-                                GetApplication().portLock.Lock()
-                                p := d.GetPort(port)
-                                GetApplication().portLock.Unlock()
-                                portID = p.ID
-                        }
-                        //ponPortID := key.(uint32)
-                        if portID != 0xFF {
-                                group.Buckets = append(group.Buckets, portID)
-                        }
-                        return true
-                }
-                igd.PortChannelMap.Range(addbuckets)
+		addbuckets := func(key interface{}, value interface{}) bool {
+			port := key.(string)
+			var portID uint32
+			if d := GetApplication().GetDevice(group.Device); d != nil {
+				GetApplication().portLock.Lock()
+				p := d.GetPort(port)
+				GetApplication().portLock.Unlock()
+				portID = p.ID
+			}
+			//ponPortID := key.(uint32)
+			if portID != 0xFF {
+				group.Buckets = append(group.Buckets, portID)
+			}
+			return true
+		}
+		igd.PortChannelMap.Range(addbuckets)
 
-                port, _ := GetApplication().GetNniPort(igd.Device)
-                _ = cntlr.GetController().GroupUpdate(port, igd.Device, group)
-                igd.GroupInstalled = true
-        }
+		port, _ := GetApplication().GetNniPort(igd.Device)
+		_ = cntlr.GetController().GroupUpdate(port, igd.Device, group)
+		igd.GroupInstalled = true
+	}
 }
 
 // ModMcGroup updates the group on the device when either a receiver leaves
 // or joins the group
 func (igd *IgmpGroupDevice) ModMcGroup() {
-        if igd.GroupInstalled {
-                group := &of.Group{}
-                group.Command = of.GroupCommandMod
-                group.GroupID = igd.GroupID
-                group.Device = igd.Device
-                group.SetVlan = igd.PonVlan
-                group.IsPonVlanPresent = igd.IsPonVlanPresent
+	if igd.GroupInstalled {
+		group := &of.Group{}
+		group.Command = of.GroupCommandMod
+		group.GroupID = igd.GroupID
+		group.Device = igd.Device
+		group.SetVlan = igd.PonVlan
+		group.IsPonVlanPresent = igd.IsPonVlanPresent
 
-                addbuckets := func(key interface{}, value interface{}) bool {
-                       port := key.(string)
-                       var portID uint32
-                       if d := GetApplication().GetDevice(group.Device); d != nil {
-                               GetApplication().portLock.Lock()
-                               p := d.GetPort(port)
-                               GetApplication().portLock.Unlock()
-                               portID = p.ID
-                       }
-                       //ponPortID := key.(uint32)
-                       if portID != 0xFF {
-                               group.Buckets = append(group.Buckets, portID)
-                        }
-                        return true
-                }
-                igd.PortChannelMap.Range(addbuckets)
+		addbuckets := func(key interface{}, value interface{}) bool {
+			port := key.(string)
+			var portID uint32
+			if d := GetApplication().GetDevice(group.Device); d != nil {
+				GetApplication().portLock.Lock()
+				p := d.GetPort(port)
+				GetApplication().portLock.Unlock()
+				portID = p.ID
+			}
+			//ponPortID := key.(uint32)
+			if portID != 0xFF {
+				group.Buckets = append(group.Buckets, portID)
+			}
+			return true
+		}
+		igd.PortChannelMap.Range(addbuckets)
 
-                port, _ := GetApplication().GetNniPort(igd.Device)
-                _ = cntlr.GetController().GroupUpdate(port, igd.Device, group)
-        } else {
-                logger.Warnw(ctx, "Update Group Failed. Group not yet created", log.Fields{"Igd": igd.Device})
-        }
+		port, _ := GetApplication().GetNniPort(igd.Device)
+		_ = cntlr.GetController().GroupUpdate(port, igd.Device, group)
+	} else {
+		logger.Warnw(ctx, "Update Group Failed. Group not yet created", log.Fields{"Igd": igd.Device})
+	}
 }
 
 // DelMcGroup : The group is deleted when the last receiver leaves the group
 func (igd *IgmpGroupDevice) DelMcGroup(forceDelete bool) {
+	logger.Infow(ctx, "Delete Mc Group Request", log.Fields{"Device": igd.Device, "GroupID": igd.GroupID, "ForceFlag": forceDelete, "GroupInstalled": igd.GroupInstalled})
+	/*
+	   if !forceDelete && !checkIfForceGroupRemove(igd.Device) {
+	           if success := AddToPendingPool(igd.Device, igd.getKey()); success {
+	                   return
+	           }
+	   }*/
+	if igd.GroupInstalled {
+		logger.Debugw(ctx, "Deleting Group", log.Fields{"Device": igd.Device, "Id": igd.GroupID})
+		group := &of.Group{}
+		group.Command = of.GroupCommandDel
+		group.GroupID = igd.GroupID
+		group.Device = igd.Device
+		group.ForceAction = true
 
-        logger.Infow(ctx, "Delete Mc Group Request", log.Fields{"Device": igd.Device, "GroupID": igd.GroupID, "ForceFlag": forceDelete, "GroupInstalled": igd.GroupInstalled})
-        /*
-        if !forceDelete && !checkIfForceGroupRemove(igd.Device) {
-                if success := AddToPendingPool(igd.Device, igd.getKey()); success {
-                        return
-                }
-        }*/
-        if igd.GroupInstalled {
-                logger.Debugw(ctx, "Deleting Group", log.Fields{"Device": igd.Device, "Id": igd.GroupID})
-                group := &of.Group{}
-                group.Command = of.GroupCommandDel
-                group.GroupID = igd.GroupID
-                group.Device = igd.Device
-                group.ForceAction = true
-
-                port, _ := GetApplication().GetNniPort(igd.Device)
-                _ = cntlr.GetController().GroupUpdate(port, igd.Device, group)
-                igd.GroupInstalled = false
-        }
+		port, _ := GetApplication().GetNniPort(igd.Device)
+		_ = cntlr.GetController().GroupUpdate(port, igd.Device, group)
+		igd.GroupInstalled = false
+	}
 }
 
 // QueryExpiry processes query expiry. Upon expiry, take stock of the situation
 // add either retain/release the group based on number of receivers left
 func (igd *IgmpGroupDevice) QueryExpiry(cntx context.Context) {
-        logger.Debugw(ctx, "Query Expiry", log.Fields{"Device": igd.Device})
+	logger.Debugw(ctx, "Query Expiry", log.Fields{"Device": igd.Device})
 
+	// Delete the IGMP flow added for this port if port state is down or query count exceeded
+	handleQueryExp := func(key interface{}, value interface{}) bool {
+		igc := value.(*IgmpGroupChannel)
+		for portKey, port := range igc.CurReceivers {
+			if portKey == StaticPort {
+				continue
+			}
 
-        // Delete the IGMP flow added for this port if port state is down or query count exceeded
-        handleQueryExp := func(key interface{}, value interface{}) bool {
-                igc := value.(*IgmpGroupChannel)
-                for portKey, port := range igc.CurReceivers {
+			logger.Warnw(ctx, "Expired Receiver Port", log.Fields{"PortKey": portKey, "IGP": port, "GroupAddr": igc.GroupAddr,
+				"Count": port.QueryTimeoutCount})
+			state, err := cntlr.GetController().GetPortState(igc.Device, portKey)
+			logger.Debugw(ctx, "Expired Member Port State", log.Fields{"state": state})
+			ponPortID := GetApplication().GetPonPortID(igd.Device, portKey)
+			if err == nil && state == cntlr.PortStateDown {
+				igd.DelReceiver(cntx, igc.GroupAddr, portKey, nil, ponPortID)
+			}
 
-                        if portKey == StaticPort {
-                                continue
-                        }
-
-                        logger.Warnw(ctx, "Expired Receiver Port", log.Fields{"PortKey": portKey, "IGP": port, "GroupAddr": igc.GroupAddr,
-                                "Count": port.QueryTimeoutCount})
-                        state, err := cntlr.GetController().GetPortState(igc.Device, portKey)
-                        logger.Debugw(ctx, "Expired Member Port State", log.Fields{"state": state})
-                        ponPortID := GetApplication().GetPonPortID(igd.Device, portKey)
-                        if err == nil && state == cntlr.PortStateDown {
-                                igd.DelReceiver(cntx, igc.GroupAddr, portKey, nil, ponPortID)
-                        }
-
-                        port.QueryTimeoutCount++
-                        logger.Debugw(ctx, "Expired Port TimeoutCount", log.Fields{"count": port.QueryTimeoutCount})
-                        if port.QueryTimeoutCount >= (*igc.proxyCfg).KeepAliveCount {
-                                logger.Errorw(ctx, "Expiry Timeout count exceeded. Trigger delete receiver", log.Fields{"PortKey": portKey,
-                                        "GroupAddr": igc.GroupAddr, "Count": port.QueryTimeoutCount})
-                                igd.DelReceiver(cntx, igc.GroupAddr, portKey, nil, ponPortID)
-                                SendQueryExpiredEventGroupSpecific(portKey, igd, igc)
-                        } else {
-                                _ = port.WriteToDb(cntx, igc.Mvlan, igc.GroupAddr, igc.Device)
-                        }
-                }
-                return true
-        }
-        igd.GroupChannels.Range(handleQueryExp)
+			port.QueryTimeoutCount++
+			logger.Debugw(ctx, "Expired Port TimeoutCount", log.Fields{"count": port.QueryTimeoutCount})
+			if port.QueryTimeoutCount >= (*igc.proxyCfg).KeepAliveCount {
+				logger.Errorw(ctx, "Expiry Timeout count exceeded. Trigger delete receiver", log.Fields{"PortKey": portKey,
+					"GroupAddr": igc.GroupAddr, "Count": port.QueryTimeoutCount})
+				igd.DelReceiver(cntx, igc.GroupAddr, portKey, nil, ponPortID)
+				SendQueryExpiredEventGroupSpecific(portKey, igd, igc)
+			} else {
+				_ = port.WriteToDb(cntx, igc.Mvlan, igc.GroupAddr, igc.Device)
+			}
+		}
+		return true
+	}
+	igd.GroupChannels.Range(handleQueryExp)
 }
diff --git a/internal/pkg/application/igmpponportchannel.go b/internal/pkg/application/igmpponportchannel.go
index 6c31ad4..4f858e8 100644
--- a/internal/pkg/application/igmpponportchannel.go
+++ b/internal/pkg/application/igmpponportchannel.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
 
@@ -23,76 +23,74 @@
 // UniPortList : UNI Port list per channle has stores the UNI port list for this
 // channel.
 type UniPortList struct {
-        UNIList *util.ConcurrentMap // [UNIPort] UNIPort
+	UNIList *util.ConcurrentMap // [UNIPort] UNIPort
 }
 
 // NewUniPortsList is Constructor for UniPortList structure
 func NewUniPortsList() *UniPortList {
-        var uniPortsList UniPortList
+	var uniPortsList UniPortList
 
-        uniPortsList.UNIList = util.NewConcurrentMap()
-        return &uniPortsList
+	uniPortsList.UNIList = util.NewConcurrentMap()
+	return &uniPortsList
 }
 
 // GetUniPortCount returns the number of UNI ports subscribed to
 // current channel.
 func (uniPortsList *UniPortList) GetUniPortCount() uint64 {
-        return uniPortsList.UNIList.Length()
+	return uniPortsList.UNIList.Length()
 }
 
 // PonPortChannels : PON port channel map keeps the active channel list and its
 // count for this group.
 type PonPortChannels struct {
-        ChannelList *util.ConcurrentMap // [channelIP]*UniPortList
+	ChannelList *util.ConcurrentMap // [channelIP]*UniPortList
 }
 
 // NewPonPortChannels is constructor for PonPortChannel.
 func NewPonPortChannels() *PonPortChannels {
-        var ponPortChannel PonPortChannels
+	var ponPortChannel PonPortChannels
 
-        ponPortChannel.ChannelList = util.NewConcurrentMap()
-        return &ponPortChannel
+	ponPortChannel.ChannelList = util.NewConcurrentMap()
+	return &ponPortChannel
 }
 
 // GetActiveChannelCount returns the number of active channel count
 // for this pon port in the current group.
 func (ponPortChannels *PonPortChannels) GetActiveChannelCount() uint32 {
-        return uint32(ponPortChannels.ChannelList.Length())
+	return uint32(ponPortChannels.ChannelList.Length())
 }
 
 // AddChannelToMap Adds new channel to the pon port map
 func (ponPortChannels *PonPortChannels) AddChannelToMap(uniPort, channel string) bool {
-
-        isNewChannel := bool(false)
-        uniList, ok := ponPortChannels.ChannelList.Get(channel)
-        if !ok {
-                // Channel doesn't exists. Adding new channel.
-                uniList = NewUniPortsList()
-                isNewChannel = true
-        }
-        uniList.(*UniPortList).UNIList.Set(uniPort, uniPort)
-        ponPortChannels.ChannelList.Set(channel, uniList)
-        return isNewChannel
+	isNewChannel := bool(false)
+	uniList, ok := ponPortChannels.ChannelList.Get(channel)
+	if !ok {
+		// Channel doesn't exists. Adding new channel.
+		uniList = NewUniPortsList()
+		isNewChannel = true
+	}
+	uniList.(*UniPortList).UNIList.Set(uniPort, uniPort)
+	ponPortChannels.ChannelList.Set(channel, uniList)
+	return isNewChannel
 }
 
 // RemoveChannelFromMap Removed channel from the pon port map
 func (ponPortChannels *PonPortChannels) RemoveChannelFromMap(uniPort, channel string) bool {
-
-        isDeleted := bool(false)
-        uniList, ok := ponPortChannels.ChannelList.Get(channel)
-        if ok {
-                uniList.(*UniPortList).UNIList.Remove(uniPort)
-                if uniList.(*UniPortList).UNIList.Length() == 0 {
-                        // Last port from the channel is removed.
-                        // Removing channel from PON port map.
-                        ponPortChannels.ChannelList.Remove(channel)
-                        isDeleted = true
-                } else {
-                        ponPortChannels.ChannelList.Set(channel, uniList)
-                }
-        } else {
-                logger.Warnw(ctx, "Channel doesn't exists in the active channels list", log.Fields{"Channel": channel})
-                return isDeleted
-        }
-        return isDeleted
+	isDeleted := bool(false)
+	uniList, ok := ponPortChannels.ChannelList.Get(channel)
+	if ok {
+		uniList.(*UniPortList).UNIList.Remove(uniPort)
+		if uniList.(*UniPortList).UNIList.Length() == 0 {
+			// Last port from the channel is removed.
+			// Removing channel from PON port map.
+			ponPortChannels.ChannelList.Remove(channel)
+			isDeleted = true
+		} else {
+			ponPortChannels.ChannelList.Set(channel, uniList)
+		}
+	} else {
+		logger.Warnw(ctx, "Channel doesn't exists in the active channels list", log.Fields{"Channel": channel})
+		return isDeleted
+	}
+	return isDeleted
 }
diff --git a/internal/pkg/application/igmpport.go b/internal/pkg/application/igmpport.go
index b22b901..171fca0 100644
--- a/internal/pkg/application/igmpport.go
+++ b/internal/pkg/application/igmpport.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,7 +21,7 @@
 	"net"
 
 	"voltha-go-controller/internal/pkg/of"
-        "voltha-go-controller/log"
+	"voltha-go-controller/log"
 )
 
 // IgmpGroupPort : IGMP port implements a port which is associated with an IGMP
@@ -32,92 +32,92 @@
 // lists. If we receive a include list we should purge the other
 // list which is TODO
 type IgmpGroupPort struct {
-        Port              string
-        CVlan             uint16
-        Pbit              uint8
-        Version           uint8
-        Exclude           bool
-        ExcludeList       []net.IP
-        IncludeList       []net.IP
-        QueryTimeoutCount uint32
-        PonPortID         uint32
+	Port              string
+	ExcludeList       []net.IP
+	IncludeList       []net.IP
+	QueryTimeoutCount uint32
+	PonPortID         uint32
+	CVlan             uint16
+	Pbit              uint8
+	Version           uint8
+	Exclude           bool
 }
 
 // NewIgmpGroupPort is constructor for a port
 func NewIgmpGroupPort(port string, cvlan uint16, pbit uint8, version uint8, incl bool, ponPortID uint32) *IgmpGroupPort {
-        var igp IgmpGroupPort
-        igp.Port = port
-        igp.CVlan = cvlan
-        igp.Pbit = pbit
-        igp.Version = version
-        igp.Exclude = !incl
-        igp.QueryTimeoutCount = 0
-        igp.PonPortID = ponPortID
-        return &igp
+	var igp IgmpGroupPort
+	igp.Port = port
+	igp.CVlan = cvlan
+	igp.Pbit = pbit
+	igp.Version = version
+	igp.Exclude = !incl
+	igp.QueryTimeoutCount = 0
+	igp.PonPortID = ponPortID
+	return &igp
 }
 
 // InclSourceIsIn checks if a source is in include list
 func (igp *IgmpGroupPort) InclSourceIsIn(src net.IP) bool {
-        return IsIPPresent(src, igp.IncludeList)
+	return IsIPPresent(src, igp.IncludeList)
 }
 
 // ExclSourceIsIn checks if a source is in exclude list
 func (igp *IgmpGroupPort) ExclSourceIsIn(src net.IP) bool {
-        return IsIPPresent(src, igp.ExcludeList)
+	return IsIPPresent(src, igp.ExcludeList)
 }
 
 // AddInclSource adds a source is in include list
 func (igp *IgmpGroupPort) AddInclSource(src net.IP) {
-        logger.Debugw(ctx, "Adding Include Source", log.Fields{"Port": igp.Port, "Src": src})
-        igp.IncludeList = append(igp.IncludeList, src)
+	logger.Debugw(ctx, "Adding Include Source", log.Fields{"Port": igp.Port, "Src": src})
+	igp.IncludeList = append(igp.IncludeList, src)
 }
 
 // AddExclSource adds a source is in exclude list
 func (igp *IgmpGroupPort) AddExclSource(src net.IP) {
-        logger.Debugw(ctx, "Adding Exclude Source", log.Fields{"Port": igp.Port, "Src": src})
-        igp.ExcludeList = append(igp.ExcludeList, src)
+	logger.Debugw(ctx, "Adding Exclude Source", log.Fields{"Port": igp.Port, "Src": src})
+	igp.ExcludeList = append(igp.ExcludeList, src)
 }
 
 // DelInclSource deletes a source is in include list
 func (igp *IgmpGroupPort) DelInclSource(src net.IP) {
-        logger.Debugw(ctx, "Deleting Include Source", log.Fields{"Port": igp.Port, "Src": src})
-        for i, addr := range igp.IncludeList {
-                if addr.Equal(src) {
-                        igp.IncludeList = append(igp.IncludeList[:i], igp.IncludeList[i+1:]...)
-                        return
-                }
-        }
+	logger.Debugw(ctx, "Deleting Include Source", log.Fields{"Port": igp.Port, "Src": src})
+	for i, addr := range igp.IncludeList {
+		if addr.Equal(src) {
+			igp.IncludeList = append(igp.IncludeList[:i], igp.IncludeList[i+1:]...)
+			return
+		}
+	}
 }
 
 // DelExclSource deletes a source is in exclude list
 func (igp *IgmpGroupPort) DelExclSource(src net.IP) {
-        logger.Debugw(ctx, "Deleting Exclude Source", log.Fields{"Port": igp.Port, "Src": src})
-        for i, addr := range igp.ExcludeList {
-                if addr.Equal(src) {
-                        igp.ExcludeList = append(igp.ExcludeList[:i], igp.ExcludeList[i+1:]...)
-                        return
-                }
-        }
+	logger.Debugw(ctx, "Deleting Exclude Source", log.Fields{"Port": igp.Port, "Src": src})
+	for i, addr := range igp.ExcludeList {
+		if addr.Equal(src) {
+			igp.ExcludeList = append(igp.ExcludeList[:i], igp.ExcludeList[i+1:]...)
+			return
+		}
+	}
 }
 
 // WriteToDb is utility to write IGMP Group Port Info to database
 func (igp *IgmpGroupPort) WriteToDb(cntx context.Context, mvlan of.VlanType, gip net.IP, device string) error {
-        b, err := json.Marshal(igp)
-        if err != nil {
-                return err
-        }
-        if err1 := db.PutIgmpRcvr(cntx, mvlan, gip, device, igp.Port, string(b)); err1 != nil {
-                return err1
-        }
-        return nil
+	b, err := json.Marshal(igp)
+	if err != nil {
+		return err
+	}
+	if err1 := db.PutIgmpRcvr(cntx, mvlan, gip, device, igp.Port, string(b)); err1 != nil {
+		return err1
+	}
+	return nil
 }
 
 // NewIgmpGroupPortFromBytes create the IGMP group port from a byte slice
 func NewIgmpGroupPortFromBytes(b []byte) (*IgmpGroupPort, error) {
-        var igp IgmpGroupPort
-        if err := json.Unmarshal(b, &igp); err != nil {
-                logger.Warnw(ctx, "Decode of port failed", log.Fields{"str": string(b)})
-                return nil, err
-        }
-        return &igp, nil
+	var igp IgmpGroupPort
+	if err := json.Unmarshal(b, &igp); err != nil {
+		logger.Warnw(ctx, "Decode of port failed", log.Fields{"str": string(b)})
+		return nil, err
+	}
+	return &igp, nil
 }
diff --git a/internal/pkg/application/igmpprofiles.go b/internal/pkg/application/igmpprofiles.go
index b855eb8..a1d999c 100644
--- a/internal/pkg/application/igmpprofiles.go
+++ b/internal/pkg/application/igmpprofiles.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
 
@@ -24,10 +24,10 @@
 	"strings"
 	"sync"
 
-	cntlr "voltha-go-controller/internal/pkg/controller"
-	"voltha-go-controller/internal/pkg/types"
 	"voltha-go-controller/database"
+	cntlr "voltha-go-controller/internal/pkg/controller"
 	"voltha-go-controller/internal/pkg/of"
+	common "voltha-go-controller/internal/pkg/types"
 	"voltha-go-controller/internal/pkg/util"
 	"voltha-go-controller/log"
 )
@@ -45,30 +45,30 @@
 
 // MCGroupProxy identifies source specific multicast(SSM) config.
 type MCGroupProxy struct {
-        // Mode represents source list include/exclude
-        Mode common.MulticastSrcListMode
-        // SourceList represents list of multicast server IP addresses.
-        SourceList []net.IP
+	// Mode represents source list include/exclude
+	Mode common.MulticastSrcListMode
+	// SourceList represents list of multicast server IP addresses.
+	SourceList []net.IP
 }
 
 // MvlanGroup identifies MC group info
 type MvlanGroup struct {
-        Name     string
-        Wildcard bool
-        McIPs    []string
-        IsStatic bool
+	Name     string
+	McIPs    []string
+	Wildcard bool
+	IsStatic bool
 }
 
 // OperInProgress type
 type OperInProgress uint8
 
 const (
-        // UpdateInProgress constant
-        UpdateInProgress OperInProgress = 2
-        // NoOp constant
-        NoOp OperInProgress = 1
-        // Nil constant
-        Nil OperInProgress = 0
+	// UpdateInProgress constant
+	UpdateInProgress OperInProgress = 2
+	// NoOp constant
+	NoOp OperInProgress = 1
+	// Nil constant
+	Nil OperInProgress = 0
 )
 
 // MvlanProfile : A set of groups of MC IPs for a MVLAN profile. It is assumed that
@@ -76,1155 +76,1134 @@
 // MVLAN profiles. The first match is used up on search to lcoate the
 // MVLAN profile for an MC IP
 type MvlanProfile struct {
-        Name                string
-        Mvlan               of.VlanType
-        PonVlan             of.VlanType
-        Groups              map[string]*MvlanGroup
-        Proxy               map[string]*MCGroupProxy
-        Version             string
-        IsPonVlanPresent    bool
-        IsChannelBasedGroup bool
-        DevicesList         map[string]OperInProgress //device serial number //here
-        oldGroups           map[string]*MvlanGroup
-        oldProxy            map[string]*MCGroupProxy
-        MaxActiveChannels   uint32
-        PendingDeleteFlow   map[string]map[string]bool
-        DeleteInProgress    bool
-        IgmpServVersion     map[string]*uint8
-        mvpLock             sync.RWMutex
-        mvpFlowLock         sync.RWMutex
+	Groups              map[string]*MvlanGroup
+	Proxy               map[string]*MCGroupProxy
+	oldGroups           map[string]*MvlanGroup
+	oldProxy            map[string]*MCGroupProxy
+	IgmpServVersion     map[string]*uint8
+	PendingDeleteFlow   map[string]map[string]bool
+	DevicesList         map[string]OperInProgress //device serial number //here
+	Version             string
+	Name                string
+	mvpLock             sync.RWMutex
+	mvpFlowLock         sync.RWMutex
+	MaxActiveChannels   uint32
+	Mvlan               of.VlanType
+	PonVlan             of.VlanType
+	IsPonVlanPresent    bool
+	IsChannelBasedGroup bool
+	DeleteInProgress    bool
 }
 
 // NewMvlanProfile is constructor for MVLAN profile.
 func NewMvlanProfile(name string, mvlan of.VlanType, ponVlan of.VlanType, isChannelBasedGroup bool, OLTSerialNums []string, actChannelPerPon uint32) *MvlanProfile {
-        var mvp MvlanProfile
-        mvp.Name = name
-        mvp.Mvlan = mvlan
-        mvp.PonVlan = ponVlan
-        mvp.mvpLock = sync.RWMutex{}
-        mvp.Groups = make(map[string]*MvlanGroup)
-        mvp.Proxy = make(map[string]*MCGroupProxy)
-        mvp.DevicesList = make(map[string]OperInProgress)
-        mvp.PendingDeleteFlow = make(map[string]map[string]bool)
-        mvp.IsChannelBasedGroup = isChannelBasedGroup
-        mvp.MaxActiveChannels = actChannelPerPon
-        mvp.DeleteInProgress = false
-        mvp.IgmpServVersion = make(map[string]*uint8)
+	var mvp MvlanProfile
+	mvp.Name = name
+	mvp.Mvlan = mvlan
+	mvp.PonVlan = ponVlan
+	mvp.mvpLock = sync.RWMutex{}
+	mvp.Groups = make(map[string]*MvlanGroup)
+	mvp.Proxy = make(map[string]*MCGroupProxy)
+	mvp.DevicesList = make(map[string]OperInProgress)
+	mvp.PendingDeleteFlow = make(map[string]map[string]bool)
+	mvp.IsChannelBasedGroup = isChannelBasedGroup
+	mvp.MaxActiveChannels = actChannelPerPon
+	mvp.DeleteInProgress = false
+	mvp.IgmpServVersion = make(map[string]*uint8)
 
-        if (ponVlan != of.VlanNone) && (ponVlan != 0) {
-                mvp.IsPonVlanPresent = true
-        }
-        return &mvp
+	if (ponVlan != of.VlanNone) && (ponVlan != 0) {
+		mvp.IsPonVlanPresent = true
+	}
+	return &mvp
 }
 
 // AddMvlanProxy for addition of groups to an MVLAN profile
 func (mvp *MvlanProfile) AddMvlanProxy(name string, proxyInfo common.MulticastGroupProxy) {
-        proxy := &MCGroupProxy{}
-        proxy.Mode = proxyInfo.Mode
-        proxy.SourceList = util.GetExpIPList(proxyInfo.SourceList)
+	proxy := &MCGroupProxy{}
+	proxy.Mode = proxyInfo.Mode
+	proxy.SourceList = util.GetExpIPList(proxyInfo.SourceList)
 
-        if _, ok := mvp.Proxy[name]; !ok {
-                logger.Debugw(ctx, "Added MVLAN Proxy", log.Fields{"Name": name, "Proxy": proxy})
-        } else {
-                logger.Debugw(ctx, "Updated MVLAN Proxy", log.Fields{"Name": name, "Proxy": proxy})
-        }
-        if proxyInfo.IsStatic == common.IsStaticYes {
-                mvp.Groups[name].IsStatic = true
-        }
-        mvp.Proxy[name] = proxy
+	if _, ok := mvp.Proxy[name]; !ok {
+		logger.Debugw(ctx, "Added MVLAN Proxy", log.Fields{"Name": name, "Proxy": proxy})
+	} else {
+		logger.Debugw(ctx, "Updated MVLAN Proxy", log.Fields{"Name": name, "Proxy": proxy})
+	}
+	if proxyInfo.IsStatic == common.IsStaticYes {
+		mvp.Groups[name].IsStatic = true
+	}
+	mvp.Proxy[name] = proxy
 }
 
 // AddMvlanGroup for addition of groups to an MVLAN profile
 func (mvp *MvlanProfile) AddMvlanGroup(name string, ips []string) {
-        mvg := &MvlanGroup{}
-        mvg.Name = name
-        mvg.Wildcard = len(ips) == 0
-        mvg.McIPs = ips
-        mvg.IsStatic = false
-        if _, ok := mvp.Groups[name]; !ok {
-                logger.Debugw(ctx, "Added MVLAN Group", log.Fields{"VLAN": mvp.Mvlan, "Name": name, "mvg": mvg, "IPs": mvg.McIPs})
-        } else {
-                logger.Debugw(ctx, "Updated MVLAN Group", log.Fields{"VLAN": mvp.Mvlan, "Name": name})
-        }
-        mvp.Groups[name] = mvg
+	mvg := &MvlanGroup{}
+	mvg.Name = name
+	mvg.Wildcard = len(ips) == 0
+	mvg.McIPs = ips
+	mvg.IsStatic = false
+	if _, ok := mvp.Groups[name]; !ok {
+		logger.Debugw(ctx, "Added MVLAN Group", log.Fields{"VLAN": mvp.Mvlan, "Name": name, "mvg": mvg, "IPs": mvg.McIPs})
+	} else {
+		logger.Debugw(ctx, "Updated MVLAN Group", log.Fields{"VLAN": mvp.Mvlan, "Name": name})
+	}
+	mvp.Groups[name] = mvg
 }
 
 // GetUsMatchVlan provides mvlan for US Match parameter
 func (mvp *MvlanProfile) GetUsMatchVlan() of.VlanType {
-        if mvp.IsPonVlanPresent {
-                return mvp.PonVlan
-        }
-        return mvp.Mvlan
+	if mvp.IsPonVlanPresent {
+		return mvp.PonVlan
+	}
+	return mvp.Mvlan
 }
 
 // WriteToDb is utility to write Mvlan Profile Info to database
 func (mvp *MvlanProfile) WriteToDb(cntx context.Context) error {
+	if mvp.DeleteInProgress {
+		logger.Warnw(ctx, "Skipping Redis Update for MvlanProfile, MvlanProfile delete in progress", log.Fields{"Mvlan": mvp.Mvlan})
+		return nil
+	}
 
-        if mvp.DeleteInProgress {
-                logger.Warnw(ctx, "Skipping Redis Update for MvlanProfile, MvlanProfile delete in progress", log.Fields{"Mvlan": mvp.Mvlan})
-                return nil
-        }
-
-        mvp.Version = database.PresentVersionMap[database.MvlanPath]
-        b, err := json.Marshal(mvp)
-        if err != nil {
-                return err
-        }
-        if err1 := db.PutMvlan(cntx, uint16(mvp.Mvlan), string(b)); err1 != nil {
-                return err1
-        }
-        return nil
+	mvp.Version = database.PresentVersionMap[database.MvlanPath]
+	b, err := json.Marshal(mvp)
+	if err != nil {
+		return err
+	}
+	if err1 := db.PutMvlan(cntx, uint16(mvp.Mvlan), string(b)); err1 != nil {
+		return err1
+	}
+	return nil
 }
 
-//isChannelStatic - Returns true if the given channel is part of static group in the Mvlan Profile
+// isChannelStatic - Returns true if the given channel is part of static group in the Mvlan Profile
 func (mvp *MvlanProfile) isChannelStatic(channel net.IP) bool {
-        for _, mvg := range mvp.Groups {
-                if mvg.IsStatic {
-                        if isChannelStatic := doesIPMatch(channel, mvg.McIPs); isChannelStatic {
-                                return true
-                        }
-                }
-        }
-        return false
+	for _, mvg := range mvp.Groups {
+		if mvg.IsStatic {
+			if isChannelStatic := doesIPMatch(channel, mvg.McIPs); isChannelStatic {
+				return true
+			}
+		}
+	}
+	return false
 }
 
-//containsStaticChannels - Returns if any static channels is part of the Mvlan Profile
+// containsStaticChannels - Returns if any static channels is part of the Mvlan Profile
 func (mvp *MvlanProfile) containsStaticChannels() bool {
-        for _, mvg := range mvp.Groups {
-                if mvg.IsStatic && len(mvg.McIPs) != 0 {
-                        return true
-                }
-        }
-        return false
+	for _, mvg := range mvp.Groups {
+		if mvg.IsStatic && len(mvg.McIPs) != 0 {
+			return true
+		}
+	}
+	return false
 }
 
-//getAllStaticChannels - Returns all static channels in the Mvlan Profile
+// getAllStaticChannels - Returns all static channels in the Mvlan Profile
 func (mvp *MvlanProfile) getAllStaticChannels() ([]net.IP, bool) {
-        channelList := []net.IP{}
-        containsStatic := false
-        for _, mvg := range mvp.Groups {
-                if mvg.IsStatic {
-                        staticChannels, _ := mvg.getAllChannels()
-                        channelList = append(channelList, staticChannels...)
-                }
-        }
-        if len(channelList) > 0 {
-                containsStatic = true
-        }
-        return channelList, containsStatic
+	channelList := []net.IP{}
+	containsStatic := false
+	for _, mvg := range mvp.Groups {
+		if mvg.IsStatic {
+			staticChannels, _ := mvg.getAllChannels()
+			channelList = append(channelList, staticChannels...)
+		}
+	}
+	if len(channelList) > 0 {
+		containsStatic = true
+	}
+	return channelList, containsStatic
 }
 
-//getAllOldGroupStaticChannels - Returns all static channels in the Mvlan Profile
+// getAllOldGroupStaticChannels - Returns all static channels in the Mvlan Profile
 func (mvp *MvlanProfile) getAllOldGroupStaticChannels() ([]net.IP, bool) {
-        channelList := []net.IP{}
-        containsStatic := false
-        for _, mvg := range mvp.oldGroups {
-                if mvg.IsStatic {
-                        staticChannels, _ := mvg.getAllChannels()
-                        channelList = append(channelList, staticChannels...)
-                }
-        }
-        if len(channelList) > 0 {
-                containsStatic = true
-        }
-        return channelList, containsStatic
+	channelList := []net.IP{}
+	containsStatic := false
+	for _, mvg := range mvp.oldGroups {
+		if mvg.IsStatic {
+			staticChannels, _ := mvg.getAllChannels()
+			channelList = append(channelList, staticChannels...)
+		}
+	}
+	if len(channelList) > 0 {
+		containsStatic = true
+	}
+	return channelList, containsStatic
 }
 
-//getAllChannels - Returns all channels in the Mvlan Profile
+// getAllChannels - Returns all channels in the Mvlan Profile
 func (mvg *MvlanGroup) getAllChannels() ([]net.IP, bool) {
-        channelList := []net.IP{}
+	channelList := []net.IP{}
 
-        if mvg == nil || len(mvg.McIPs) == 0 {
-                return []net.IP{}, false
-        }
+	if mvg == nil || len(mvg.McIPs) == 0 {
+		return []net.IP{}, false
+	}
 
-        grpChannelOrRange := mvg.McIPs
-        for _, channelOrRange := range grpChannelOrRange {
-                if strings.Contains(channelOrRange, "-") {
-                        var splits = strings.Split(channelOrRange, "-")
-                        ipStart := util.IP2LongConv(net.ParseIP(splits[0]))
-                        ipEnd := util.IP2LongConv(net.ParseIP(splits[1]))
+	grpChannelOrRange := mvg.McIPs
+	for _, channelOrRange := range grpChannelOrRange {
+		if strings.Contains(channelOrRange, "-") {
+			var splits = strings.Split(channelOrRange, "-")
+			ipStart := util.IP2LongConv(net.ParseIP(splits[0]))
+			ipEnd := util.IP2LongConv(net.ParseIP(splits[1]))
 
-                        for i := ipStart; i <= ipEnd; i++ {
-                                channelList = append(channelList, util.Long2ipConv(i))
-                        }
-                } else {
-                        channelList = append(channelList, net.ParseIP(channelOrRange))
-                }
-        }
-        return channelList, true
+			for i := ipStart; i <= ipEnd; i++ {
+				channelList = append(channelList, util.Long2ipConv(i))
+			}
+		} else {
+			channelList = append(channelList, net.ParseIP(channelOrRange))
+		}
+	}
+	return channelList, true
 }
 
-//SetUpdateStatus - Sets profile update status for devices
+// SetUpdateStatus - Sets profile update status for devices
 func (mvp *MvlanProfile) SetUpdateStatus(serialNum string, status OperInProgress) {
-        if serialNum != "" {
-                mvp.DevicesList[serialNum] = status
-                return
-        }
+	if serialNum != "" {
+		mvp.DevicesList[serialNum] = status
+		return
+	}
 
-        for srNo := range mvp.DevicesList {
-                mvp.DevicesList[srNo] = status
-        }
+	for srNo := range mvp.DevicesList {
+		mvp.DevicesList[srNo] = status
+	}
 }
 
-//isUpdateInProgress - checking is update is in progress for the mvlan profile
+// isUpdateInProgress - checking is update is in progress for the mvlan profile
 func (mvp *MvlanProfile) isUpdateInProgress() bool {
-
-        for srNo := range mvp.DevicesList {
-                if mvp.DevicesList[srNo] == UpdateInProgress {
-                        return true
-                }
-        }
-        return false
+	for srNo := range mvp.DevicesList {
+		if mvp.DevicesList[srNo] == UpdateInProgress {
+			return true
+		}
+	}
+	return false
 }
 
-//IsUpdateInProgressForDevice - Checks is Mvlan Profile update is is progress for the given device
+// IsUpdateInProgressForDevice - Checks is Mvlan Profile update is is progress for the given device
 func (mvp *MvlanProfile) IsUpdateInProgressForDevice(device string) bool {
-        if vd := GetApplication().GetDevice(device); vd != nil {
-                if mvp.DevicesList[vd.SerialNum] == UpdateInProgress {
-                        return true
-                }
-        }
-        return false
+	if vd := GetApplication().GetDevice(device); vd != nil {
+		if mvp.DevicesList[vd.SerialNum] == UpdateInProgress {
+			return true
+		}
+	}
+	return false
 }
 
 // DelFromDb to delere mvlan from database
 func (mvp *MvlanProfile) DelFromDb(cntx context.Context) {
-        _ = db.DelMvlan(cntx, uint16(mvp.Mvlan))
+	_ = db.DelMvlan(cntx, uint16(mvp.Mvlan))
 }
 
-//DelFlows - Triggers flow deletion after registering for flow indication event
+// DelFlows - Triggers flow deletion after registering for flow indication event
 func (mvp *MvlanProfile) DelFlows(cntx context.Context, device *VoltDevice, flow *of.VoltFlow) error {
-        mvp.mvpFlowLock.Lock()
-        defer mvp.mvpFlowLock.Unlock()
+	mvp.mvpFlowLock.Lock()
+	defer mvp.mvpFlowLock.Unlock()
 
-        var flowMap map[string]bool
-        var ok bool
+	var flowMap map[string]bool
+	var ok bool
 
-        for cookie := range flow.SubFlows {
-                cookie := strconv.FormatUint(cookie, 10)
-                fe := &FlowEvent{
-                        eType:     EventTypeMcastFlowRemoved,
-                        device:    device.Name,
-                        cookie:    cookie,
-                        eventData: mvp,
-                }
-                device.RegisterFlowDelEvent(cookie, fe)
+	for cookie := range flow.SubFlows {
+		cookie := strconv.FormatUint(cookie, 10)
+		fe := &FlowEvent{
+			eType:     EventTypeMcastFlowRemoved,
+			device:    device.Name,
+			cookie:    cookie,
+			eventData: mvp,
+		}
+		device.RegisterFlowDelEvent(cookie, fe)
 
-                if flowMap, ok = mvp.PendingDeleteFlow[device.Name]; !ok {
-                        flowMap = make(map[string]bool)
-                }
-                flowMap[cookie] = true
-                mvp.PendingDeleteFlow[device.Name] = flowMap
-        }
-        if err := mvp.WriteToDb(cntx); err != nil {
-                logger.Errorw(ctx, "Mvlan profile write to DB failed", log.Fields{"ProfileName": mvp.Name})
-        }
-        return cntlr.GetController().DelFlows(cntx, device.NniPort, device.Name, flow)
+		if flowMap, ok = mvp.PendingDeleteFlow[device.Name]; !ok {
+			flowMap = make(map[string]bool)
+		}
+		flowMap[cookie] = true
+		mvp.PendingDeleteFlow[device.Name] = flowMap
+	}
+	if err := mvp.WriteToDb(cntx); err != nil {
+		logger.Errorw(ctx, "Mvlan profile write to DB failed", log.Fields{"ProfileName": mvp.Name})
+	}
+	return cntlr.GetController().DelFlows(cntx, device.NniPort, device.Name, flow)
 }
 
-//FlowRemoveSuccess - Process flow success indication
+// FlowRemoveSuccess - Process flow success indication
 func (mvp *MvlanProfile) FlowRemoveSuccess(cntx context.Context, cookie string, device string) {
-        mvp.mvpFlowLock.Lock()
-        defer mvp.mvpFlowLock.Unlock()
+	mvp.mvpFlowLock.Lock()
+	defer mvp.mvpFlowLock.Unlock()
 
-        logger.Infow(ctx, "Mvlan Flow Remove Success Notification", log.Fields{"MvlanProfile": mvp.Name, "Cookie": cookie, "Device": device})
+	logger.Infow(ctx, "Mvlan Flow Remove Success Notification", log.Fields{"MvlanProfile": mvp.Name, "Cookie": cookie, "Device": device})
 
-        if _, ok := mvp.PendingDeleteFlow[device]; ok {
-                delete(mvp.PendingDeleteFlow[device], cookie)
-        }
+	if _, ok := mvp.PendingDeleteFlow[device]; ok {
+		delete(mvp.PendingDeleteFlow[device], cookie)
+	}
 
-        if err := mvp.WriteToDb(cntx); err != nil {
-                logger.Errorw(ctx, "Mvlan profile write to DB failed", log.Fields{"ProfileName": mvp.Name})
-        }
+	if err := mvp.WriteToDb(cntx); err != nil {
+		logger.Errorw(ctx, "Mvlan profile write to DB failed", log.Fields{"ProfileName": mvp.Name})
+	}
 }
 
-//FlowRemoveFailure - Process flow failure indication
+// FlowRemoveFailure - Process flow failure indication
 func (mvp *MvlanProfile) FlowRemoveFailure(cookie string, device string, errorCode uint32, errReason string) {
+	mvp.mvpFlowLock.Lock()
+	defer mvp.mvpFlowLock.Unlock()
 
-        mvp.mvpFlowLock.Lock()
-        defer mvp.mvpFlowLock.Unlock()
-
-        if flowMap, ok := mvp.PendingDeleteFlow[device]; ok {
-                if _, ok := flowMap[cookie]; ok {
-                        logger.Errorw(ctx, "Mvlan Flow Remove Failure Notification", log.Fields{"MvlanProfile": mvp.Name, "Cookie": cookie, "ErrorCode": errorCode, "ErrorReason": errReason, "Device": device})
-                        return
-                }
-        }
-        logger.Errorw(ctx, "Mvlan Flow Del Failure Notification for Unknown cookie", log.Fields{"MvlanProfile": mvp.Name, "Cookie": cookie, "ErrorCode": errorCode, "ErrorReason": errReason})
-
+	if flowMap, ok := mvp.PendingDeleteFlow[device]; ok {
+		if _, ok := flowMap[cookie]; ok {
+			logger.Errorw(ctx, "Mvlan Flow Remove Failure Notification", log.Fields{"MvlanProfile": mvp.Name, "Cookie": cookie, "ErrorCode": errorCode, "ErrorReason": errReason, "Device": device})
+			return
+		}
+	}
+	logger.Errorw(ctx, "Mvlan Flow Del Failure Notification for Unknown cookie", log.Fields{"MvlanProfile": mvp.Name, "Cookie": cookie, "ErrorCode": errorCode, "ErrorReason": errReason})
 }
 
 // IsStaticGroup to check if group is static
 func (mvp *MvlanProfile) IsStaticGroup(groupName string) bool {
-        return mvp.Groups[groupName].IsStatic
+	return mvp.Groups[groupName].IsStatic
 }
 
 // generateGroupKey to generate group key
 func (mvp *MvlanProfile) generateGroupKey(name string, ipAddr string) string {
-        if mvp.IsChannelBasedGroup {
-                return mvp.Mvlan.String() + "_" + ipAddr
-        }
-        return mvp.Mvlan.String() + "_" + name
+	if mvp.IsChannelBasedGroup {
+		return mvp.Mvlan.String() + "_" + ipAddr
+	}
+	return mvp.Mvlan.String() + "_" + name
 }
 
 // GetStaticGroupName to get static igmp group
 func (mvp *MvlanProfile) GetStaticGroupName(gip net.IP) string {
-        for _, mvg := range mvp.Groups {
-                if mvg.IsStatic {
-                        if doesIPMatch(gip, mvg.McIPs) {
-                                return mvg.Name
-                        }
-                }
-        }
-        return ""
+	for _, mvg := range mvp.Groups {
+		if mvg.IsStatic {
+			if doesIPMatch(gip, mvg.McIPs) {
+				return mvg.Name
+			}
+		}
+	}
+	return ""
 }
 
 // GetStaticIgmpGroup to get static igmp group
 func (mvp *MvlanProfile) GetStaticIgmpGroup(gip net.IP) *IgmpGroup {
-
-        staticGroupName := mvp.GetStaticGroupName(gip)
-        grpKey := mvp.generateGroupKey(staticGroupName, gip.String())
-        logger.Debugw(ctx, "Get Static IGMP Group", log.Fields{"Group": grpKey})
-        ig, ok := GetApplication().IgmpGroups.Load(grpKey)
-        if ok {
-                logger.Debugw(ctx, "Get Static IGMP Group Success", log.Fields{"Group": grpKey})
-                return ig.(*IgmpGroup)
-        }
-        return nil
+	staticGroupName := mvp.GetStaticGroupName(gip)
+	grpKey := mvp.generateGroupKey(staticGroupName, gip.String())
+	logger.Debugw(ctx, "Get Static IGMP Group", log.Fields{"Group": grpKey})
+	ig, ok := GetApplication().IgmpGroups.Load(grpKey)
+	if ok {
+		logger.Debugw(ctx, "Get Static IGMP Group Success", log.Fields{"Group": grpKey})
+		return ig.(*IgmpGroup)
+	}
+	return nil
 }
 
-//pushIgmpMcastFlows - Adds all IGMP related flows (generic DS flow & static group flows)
+// pushIgmpMcastFlows - Adds all IGMP related flows (generic DS flow & static group flows)
 func (mvp *MvlanProfile) pushIgmpMcastFlows(cntx context.Context, OLTSerialNum string) {
+	mvp.mvpLock.RLock()
+	defer mvp.mvpLock.RUnlock()
 
-        mvp.mvpLock.RLock()
-        defer mvp.mvpLock.RUnlock()
+	if mvp.DevicesList[OLTSerialNum] == Nil {
+		logger.Infow(ctx, "Mvlan Profile not configure for device", log.Fields{"Device": OLTSerialNum, "Mvlan": mvp.Mvlan})
+		return
+	}
 
-        if mvp.DevicesList[OLTSerialNum] == Nil {
-                logger.Infow(ctx, "Mvlan Profile not configure for device", log.Fields{"Device": OLTSerialNum, "Mvlan": mvp.Mvlan})
-                return
-        }
+	d, _ := GetApplication().GetDeviceBySerialNo(OLTSerialNum)
+	if d == nil {
+		logger.Warnw(ctx, "Skipping Igmp & Mcast Flow processing: Device Not Found", log.Fields{"Device_SrNo": OLTSerialNum, "Mvlan": mvp.Mvlan})
+		return
+	}
 
-        d, _ := GetApplication().GetDeviceBySerialNo(OLTSerialNum)
-        if d == nil {
-                logger.Warnw(ctx, "Skipping Igmp & Mcast Flow processing: Device Not Found", log.Fields{"Device_SrNo": OLTSerialNum, "Mvlan": mvp.Mvlan})
-                return
-        }
+	p := d.GetPort(d.NniPort)
 
-        p := d.GetPort(d.NniPort)
+	if p != nil && p.State == PortStateUp {
+		logger.Infow(ctx, "NNI Port Status is: UP & Vlan Enabled", log.Fields{"Device": d, "port": p})
 
-        if p != nil && p.State == PortStateUp {
-                logger.Infow(ctx, "NNI Port Status is: UP & Vlan Enabled", log.Fields{"Device": d, "port": p})
+		//Push Igmp DS Control Flows
+		err := mvp.ApplyIgmpDSFlowForMvp(cntx, d.Name)
+		if err != nil {
+			logger.Errorw(ctx, "DS IGMP Flow Add Failed for device",
+				log.Fields{"Reason": err.Error(), "device": d.Name})
+		}
 
-                //Push Igmp DS Control Flows
-                err := mvp.ApplyIgmpDSFlowForMvp(cntx, d.Name)
-                if err != nil {
-                        logger.Errorw(ctx, "DS IGMP Flow Add Failed for device",
-                                log.Fields{"Reason": err.Error(), "device": d.Name})
-                }
-
-                //Trigger Join for static channels
-                if channelList, containsStatic := mvp.getAllStaticChannels(); containsStatic {
-                        mvp.ProcessStaticGroup(cntx, d.Name, channelList, true)
-                } else {
-                        logger.Infow(ctx, "No Static Channels Present", log.Fields{"mvp": mvp.Name, "Mvlan": mvp.Mvlan})
-                }
-        }
+		//Trigger Join for static channels
+		if channelList, containsStatic := mvp.getAllStaticChannels(); containsStatic {
+			mvp.ProcessStaticGroup(cntx, d.Name, channelList, true)
+		} else {
+			logger.Infow(ctx, "No Static Channels Present", log.Fields{"mvp": mvp.Name, "Mvlan": mvp.Mvlan})
+		}
+	}
 }
-//removeIgmpMcastFlows - Removes all IGMP related flows (generic DS flow & static group flows)
+
+// removeIgmpMcastFlows - Removes all IGMP related flows (generic DS flow & static group flows)
 func (mvp *MvlanProfile) removeIgmpMcastFlows(cntx context.Context, oltSerialNum string) {
+	mvp.mvpLock.RLock()
+	defer mvp.mvpLock.RUnlock()
 
-        mvp.mvpLock.RLock()
-        defer mvp.mvpLock.RUnlock()
+	if d, _ := GetApplication().GetDeviceBySerialNo(oltSerialNum); d != nil {
+		p := d.GetPort(d.NniPort)
+		if p != nil {
+			logger.Infow(ctx, "NNI Port Status is: UP", log.Fields{"Device": d, "port": p})
 
-        if d, _ := GetApplication().GetDeviceBySerialNo(oltSerialNum); d != nil {
-                p := d.GetPort(d.NniPort)
-                if p != nil {
-                        logger.Infow(ctx, "NNI Port Status is: UP", log.Fields{"Device": d, "port": p})
+			// ***Do not change the order***
+			// When Vlan is disabled, the process end is determined by the DS Igmp flag in device
 
-                        // ***Do not change the order***
-                        // When Vlan is disabled, the process end is determined by the DS Igmp flag in device
+			//Trigger Leave for static channels
+			if channelList, containsStatic := mvp.getAllStaticChannels(); containsStatic {
+				mvp.ProcessStaticGroup(cntx, d.Name, channelList, false)
+			} else {
+				logger.Infow(ctx, "No Static Channels Present", log.Fields{"mvp": mvp.Name, "Mvlan": mvp.Mvlan})
+			}
 
-                        //Trigger Leave for static channels
-                        if channelList, containsStatic := mvp.getAllStaticChannels(); containsStatic {
-                                mvp.ProcessStaticGroup(cntx, d.Name, channelList, false)
-                        } else {
-                                logger.Infow(ctx, "No Static Channels Present", log.Fields{"mvp": mvp.Name, "Mvlan": mvp.Mvlan})
-                        }
+			//Remove all dynamic members for the Mvlan Profile
+			GetApplication().IgmpGroups.Range(func(key, value interface{}) bool {
+				ig := value.(*IgmpGroup)
+				if ig.Mvlan == mvp.Mvlan {
+					igd := ig.Devices[d.Name]
+					ig.DelIgmpGroupDevice(cntx, igd)
+					if ig.NumDevicesActive() == 0 {
+						GetApplication().DelIgmpGroup(cntx, ig)
+					}
+				}
+				return true
+			})
 
-                        //Remove all dynamic members for the Mvlan Profile
-                        GetApplication().IgmpGroups.Range(func(key, value interface{}) bool {
-                                ig := value.(*IgmpGroup)
-                                if ig.Mvlan == mvp.Mvlan {
-                                        igd := ig.Devices[d.Name]
-                                        ig.DelIgmpGroupDevice(cntx, igd)
-                                        if ig.NumDevicesActive() == 0 {
-                                                GetApplication().DelIgmpGroup(cntx, ig)
-                                        }
-                                }
-                                return true
-                        })
-
-                        //Remove DS Igmp trap flow
-                        err := mvp.RemoveIgmpDSFlowForMvp(cntx, d.Name)
-                        if err != nil {
-                                logger.Errorw(ctx, "DS IGMP Flow Del Failed", log.Fields{"Reason": err.Error(), "device": d.Name})
-                        }
-                }
-        }
+			//Remove DS Igmp trap flow
+			err := mvp.RemoveIgmpDSFlowForMvp(cntx, d.Name)
+			if err != nil {
+				logger.Errorw(ctx, "DS IGMP Flow Del Failed", log.Fields{"Reason": err.Error(), "device": d.Name})
+			}
+		}
+	}
 }
 
 // ApplyIgmpDSFlowForMvp to apply Igmp DS flow for mvlan.
 func (mvp *MvlanProfile) ApplyIgmpDSFlowForMvp(cntx context.Context, device string) error {
-        va := GetApplication()
-        dIntf, ok := va.DevicesDisc.Load(device)
-        if !ok {
-                return errors.New("Device Doesn't Exist")
-        }
-        d := dIntf.(*VoltDevice)
-        mvlan := mvp.Mvlan
+	va := GetApplication()
+	dIntf, ok := va.DevicesDisc.Load(device)
+	if !ok {
+		return errors.New("Device Doesn't Exist")
+	}
+	d := dIntf.(*VoltDevice)
+	mvlan := mvp.Mvlan
 
-        flowAlreadyApplied, ok := d.IgmpDsFlowAppliedForMvlan[uint16(mvlan)]
-        if !ok || !flowAlreadyApplied {
-                flows, err := mvp.BuildIgmpDSFlows(device)
-                if err == nil {
-                        err = cntlr.GetController().AddFlows(cntx, d.NniPort, device, flows)
-                        if err != nil {
-                                logger.Warnw(ctx, "Configuring IGMP Flow for device failed ", log.Fields{"Device": device, "err": err})
-                                return err
-                        }
-                        d.IgmpDsFlowAppliedForMvlan[uint16(mvlan)] = true
-                        logger.Infow(ctx, "Updating voltDevice that IGMP DS flow as \"added\" for ",
-                                log.Fields{"device": d.SerialNum, "mvlan": mvlan})
-                } else {
-                        logger.Errorw(ctx, "DS IGMP Flow Add Failed", log.Fields{"Reason": err.Error(), "Mvlan": mvlan})
-                }
-        }
+	flowAlreadyApplied, ok := d.IgmpDsFlowAppliedForMvlan[uint16(mvlan)]
+	if !ok || !flowAlreadyApplied {
+		flows, err := mvp.BuildIgmpDSFlows(device)
+		if err == nil {
+			err = cntlr.GetController().AddFlows(cntx, d.NniPort, device, flows)
+			if err != nil {
+				logger.Warnw(ctx, "Configuring IGMP Flow for device failed ", log.Fields{"Device": device, "err": err})
+				return err
+			}
+			d.IgmpDsFlowAppliedForMvlan[uint16(mvlan)] = true
+			logger.Infow(ctx, "Updating voltDevice that IGMP DS flow as \"added\" for ",
+				log.Fields{"device": d.SerialNum, "mvlan": mvlan})
+		} else {
+			logger.Errorw(ctx, "DS IGMP Flow Add Failed", log.Fields{"Reason": err.Error(), "Mvlan": mvlan})
+		}
+	}
 
-        return nil
+	return nil
 }
 
 // RemoveIgmpDSFlowForMvp to remove Igmp DS flow for mvlan.
 func (mvp *MvlanProfile) RemoveIgmpDSFlowForMvp(cntx context.Context, device string) error {
+	va := GetApplication()
+	mvlan := mvp.Mvlan
 
-        va := GetApplication()
-        mvlan := mvp.Mvlan
+	dIntf, ok := va.DevicesDisc.Load(device)
+	if !ok {
+		return errors.New("Device Doesn't Exist")
+	}
+	d := dIntf.(*VoltDevice)
+	/* No need of strict check during DS IGMP deletion
+	   flowAlreadyApplied, ok := d.IgmpDsFlowAppliedForMvlan[uint16(mvlan)]
+	   if ok && flowAlreadyApplied
+	*/
+	flows, err := mvp.BuildIgmpDSFlows(device)
+	if err == nil {
+		flows.ForceAction = true
 
-        dIntf, ok := va.DevicesDisc.Load(device)
-        if !ok {
-                return errors.New("Device Doesn't Exist")
-        }
-        d := dIntf.(*VoltDevice)
-        /* No need of strict check during DS IGMP deletion
-        flowAlreadyApplied, ok := d.IgmpDsFlowAppliedForMvlan[uint16(mvlan)]
-        if ok && flowAlreadyApplied
-        */
-        flows, err := mvp.BuildIgmpDSFlows(device)
-        if err == nil {
-                flows.ForceAction = true
+		err = mvp.DelFlows(cntx, d, flows)
+		if err != nil {
+			logger.Warnw(ctx, "De-Configuring IGMP Flow for device failed ", log.Fields{"Device": device, "err": err})
+			return err
+		}
+		d.IgmpDsFlowAppliedForMvlan[uint16(mvlan)] = false
+		logger.Infow(ctx, "Updating voltDevice that IGMP DS flow as \"removed\" for ",
+			log.Fields{"device": d.SerialNum, "mvlan": mvlan})
+	} else {
+		logger.Errorw(ctx, "DS IGMP Flow Del Failed", log.Fields{"Reason": err.Error()})
+	}
 
-                err = mvp.DelFlows(cntx, d, flows)
-                if err != nil {
-                        logger.Warnw(ctx, "De-Configuring IGMP Flow for device failed ", log.Fields{"Device": device, "err": err})
-                        return err
-                }
-                d.IgmpDsFlowAppliedForMvlan[uint16(mvlan)] = false
-                logger.Infow(ctx, "Updating voltDevice that IGMP DS flow as \"removed\" for ",
-                        log.Fields{"device": d.SerialNum, "mvlan": mvlan})
-        } else {
-                logger.Errorw(ctx, "DS IGMP Flow Del Failed", log.Fields{"Reason": err.Error()})
-        }
-
-        return nil
+	return nil
 }
 
 // BuildIgmpDSFlows to build Igmp DS flows for NNI port
 func (mvp *MvlanProfile) BuildIgmpDSFlows(device string) (*of.VoltFlow, error) {
-        dIntf, ok := GetApplication().DevicesDisc.Load(device)
-        if !ok {
-                return nil, errors.New("Device Doesn't Exist")
-        }
-        d := dIntf.(*VoltDevice)
+	dIntf, ok := GetApplication().DevicesDisc.Load(device)
+	if !ok {
+		return nil, errors.New("Device Doesn't Exist")
+	}
+	d := dIntf.(*VoltDevice)
 
-        logger.Infow(ctx, "Building DS IGMP Flow for NNI port", log.Fields{"vs": d.NniPort, "Mvlan": mvp.Mvlan})
-        flow := &of.VoltFlow{}
-        flow.SubFlows = make(map[uint64]*of.VoltSubFlow)
-        subFlow := of.NewVoltSubFlow()
-        subFlow.SetTableID(0)
-        subFlow.SetMatchVlan(mvp.Mvlan)
+	logger.Infow(ctx, "Building DS IGMP Flow for NNI port", log.Fields{"vs": d.NniPort, "Mvlan": mvp.Mvlan})
+	flow := &of.VoltFlow{}
+	flow.SubFlows = make(map[uint64]*of.VoltSubFlow)
+	subFlow := of.NewVoltSubFlow()
+	subFlow.SetTableID(0)
+	subFlow.SetMatchVlan(mvp.Mvlan)
 
-        nniPort, err := GetApplication().GetNniPort(device)
-        if err != nil {
-                return nil, err
-        }
-        nniPortID, err1 := GetApplication().GetPortID(nniPort)
-        if err1 != nil {
-                return nil, errors.New("Unknown NNI outport")
-        }
-        subFlow.SetInPort(nniPortID)
-        subFlow.SetIgmpMatch()
-        subFlow.SetReportToController()
-        subFlow.Cookie = uint64(nniPortID)<<32 | uint64(mvp.Mvlan)
-        subFlow.Priority = of.IgmpFlowPriority
+	nniPort, err := GetApplication().GetNniPort(device)
+	if err != nil {
+		return nil, err
+	}
+	nniPortID, err1 := GetApplication().GetPortID(nniPort)
+	if err1 != nil {
+		return nil, errors.New("Unknown NNI outport")
+	}
+	subFlow.SetInPort(nniPortID)
+	subFlow.SetIgmpMatch()
+	subFlow.SetReportToController()
+	subFlow.Cookie = uint64(nniPortID)<<32 | uint64(mvp.Mvlan)
+	subFlow.Priority = of.IgmpFlowPriority
 
-        flow.SubFlows[subFlow.Cookie] = subFlow
-        logger.Infow(ctx, "Built DS IGMP flow", log.Fields{"cookie": subFlow.Cookie, "subflow": subFlow})
-        return flow, nil
+	flow.SubFlows[subFlow.Cookie] = subFlow
+	logger.Infow(ctx, "Built DS IGMP flow", log.Fields{"cookie": subFlow.Cookie, "subflow": subFlow})
+	return flow, nil
 }
 
-//updateStaticGroups - Generates static joins & leaves for newly added and removed static channels respectively
+// updateStaticGroups - Generates static joins & leaves for newly added and removed static channels respectively
 func (mvp *MvlanProfile) updateStaticGroups(cntx context.Context, deviceID string, added []net.IP, removed []net.IP) {
+	// Update static group configs for all associated devices
+	updateGroups := func(key interface{}, value interface{}) bool {
+		d := value.(*VoltDevice)
 
-        //Update static group configs for all associated devices
-        updateGroups := func(key interface{}, value interface{}) bool {
-                d := value.(*VoltDevice)
+		if mvp.DevicesList[d.SerialNum] == Nil {
+			logger.Infow(ctx, "Mvlan Profile not configure for device", log.Fields{"Device": d, "Profile Device List": mvp.DevicesList})
+			return true
+		}
+		// TODO if mvp.IsChannelBasedGroup {
+		mvp.ProcessStaticGroup(cntx, d.Name, added, true)
+		mvp.ProcessStaticGroup(cntx, d.Name, removed, false)
+		//}
+		return true
+	}
 
-                if mvp.DevicesList[d.SerialNum] == Nil {
-                        logger.Infow(ctx, "Mvlan Profile not configure for device", log.Fields{"Device": d, "Profile Device List": mvp.DevicesList})
-                        return true
-                }
-                //TODO if mvp.IsChannelBasedGroup {
-                mvp.ProcessStaticGroup(cntx, d.Name, added, true)
-                mvp.ProcessStaticGroup(cntx, d.Name, removed, false)
-                //}
-                return true
-        }
-
-        if deviceID != "" {
-                vd := GetApplication().GetDevice(deviceID)
-                updateGroups(deviceID, vd)
-        } else {
-                GetApplication().DevicesDisc.Range(updateGroups)
-        }
+	if deviceID != "" {
+		vd := GetApplication().GetDevice(deviceID)
+		updateGroups(deviceID, vd)
+	} else {
+		GetApplication().DevicesDisc.Range(updateGroups)
+	}
 }
 
-//updateDynamicGroups - Generates joins with updated sources for existing channels
+// updateDynamicGroups - Generates joins with updated sources for existing channels
 func (mvp *MvlanProfile) updateDynamicGroups(cntx context.Context, deviceID string, added []net.IP, removed []net.IP) {
+	//mvlan := mvp.Mvlan
+	va := GetApplication()
 
-        //mvlan := mvp.Mvlan
-        va := GetApplication()
+	updateGroups := func(key interface{}, value interface{}) bool {
+		d := value.(*VoltDevice)
 
-        updateGroups := func(key interface{}, value interface{}) bool {
-                d := value.(*VoltDevice)
+		if mvp.DevicesList[d.SerialNum] == Nil {
+			logger.Infow(ctx, "Mvlan Profile not configure for device", log.Fields{"Device": d, "Profile Device List": mvp.DevicesList})
+			return true
+		}
+		for _, groupAddr := range added {
+			_, gName := va.GetMvlanProfileForMcIP(mvp.Name, groupAddr)
+			grpKey := mvp.generateGroupKey(gName, groupAddr.String())
+			logger.Debugw(ctx, "IGMP Group", log.Fields{"Group": grpKey, "groupAddr": groupAddr})
+			if igIntf, ok := va.IgmpGroups.Load(grpKey); ok {
+				ig := igIntf.(*IgmpGroup)
+				if igd, ok := ig.getIgmpGroupDevice(cntx, d.Name); ok {
+					if igcIntf, ok := igd.GroupChannels.Load(groupAddr.String()); ok {
+						igc := igcIntf.(*IgmpGroupChannel)
+						incl := false
+						var ip []net.IP
+						var groupModified = false
+						if _, ok := mvp.Proxy[igc.GroupName]; ok {
+							if mvp.Proxy[igc.GroupName].Mode == common.Include {
+								incl = true
+							}
+							ip = mvp.Proxy[igc.GroupName].SourceList
+						}
+						for port, igp := range igc.NewReceivers {
+							// Process the include/exclude list which may end up modifying the group
+							if change, _ := igc.ProcessSources(cntx, port, ip, incl); change {
+								groupModified = true
+							}
+							igc.ProcessMode(port, incl)
 
-                if mvp.DevicesList[d.SerialNum] == Nil {
-                        logger.Infow(ctx, "Mvlan Profile not configure for device", log.Fields{"Device": d, "Profile Device List": mvp.DevicesList})
-                        return true
-                }
-                for _, groupAddr := range added {
+							if err := igp.WriteToDb(cntx, igc.Mvlan, igc.GroupAddr, igc.Device); err != nil {
+								logger.Errorw(ctx, "Igmp group port Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
+							}
+						}
+						// If the group is modified as this is the first receiver or due to include/exclude list modification
+						// send a report to the upstream multicast servers
+						if groupModified {
+							logger.Debug(ctx, "Group Modified and IGMP report sent to the upstream server")
+							igc.SendReport(false)
+						}
+						if err := igc.WriteToDb(cntx); err != nil {
+							logger.Errorw(ctx, "Igmp group channel Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
+						}
+					}
+				}
+			}
+		}
 
-                        _, gName := va.GetMvlanProfileForMcIP(mvp.Name, groupAddr)
-                        grpKey := mvp.generateGroupKey(gName, groupAddr.String())
-                        logger.Debugw(ctx, "IGMP Group", log.Fields{"Group": grpKey, "groupAddr": groupAddr})
-                        if igIntf, ok := va.IgmpGroups.Load(grpKey); ok {
-                                ig := igIntf.(*IgmpGroup)
-                                if igd, ok := ig.getIgmpGroupDevice(cntx, d.Name); ok {
-                                        if igcIntf, ok := igd.GroupChannels.Load(groupAddr.String()); ok {
-                                                igc := igcIntf.(*IgmpGroupChannel)
-                                                incl := false
-                                                var ip []net.IP
-                                                var groupModified = false
-                                                if _, ok := mvp.Proxy[igc.GroupName]; ok {
-                                                        if mvp.Proxy[igc.GroupName].Mode == common.Include {
-                                                                incl = true
-                                                        }
-                                                        ip = mvp.Proxy[igc.GroupName].SourceList
-                                                }
-                                                for port, igp := range igc.NewReceivers {
-                                                        // Process the include/exclude list which may end up modifying the group
-                                                        if change, _ := igc.ProcessSources(cntx, port, ip, incl); change {
-                                                                groupModified = true
-                                                        }
-                                                        igc.ProcessMode(port, incl)
+		return true
+	}
 
-                                                        if err := igp.WriteToDb(cntx, igc.Mvlan, igc.GroupAddr, igc.Device); err != nil {
-                                                                logger.Errorw(ctx, "Igmp group port Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
-                                                        }
-                                                }
-                                                // If the group is modified as this is the first receiver or due to include/exclude list modification
-                                                // send a report to the upstream multicast servers
-                                                if groupModified {
-                                                        logger.Debug(ctx, "Group Modified and IGMP report sent to the upstream server")
-                                                        igc.SendReport(false)
-                                                }
-                                                if err := igc.WriteToDb(cntx); err != nil {
-                                                        logger.Errorw(ctx, "Igmp group channel Write to DB failed", log.Fields{"mvlan": igc.Mvlan, "GroupAddr": igc.GroupAddr})
-                                                }
-                                        }
-                                }
-                        }
-                }
-
-                return true
-        }
-
-        if deviceID != "" {
-                vd := GetApplication().GetDevice(deviceID)
-                updateGroups(deviceID, vd)
-        } else {
-                GetApplication().DevicesDisc.Range(updateGroups)
-        }
+	if deviceID != "" {
+		vd := GetApplication().GetDevice(deviceID)
+		updateGroups(deviceID, vd)
+	} else {
+		GetApplication().DevicesDisc.Range(updateGroups)
+	}
 }
 
-//GroupsUpdated - Handles removing of Igmp Groups, flows & group table entries for
-//channels removed as part of update
+// GroupsUpdated - Handles removing of Igmp Groups, flows & group table entries for
+// channels removed as part of update
 func (mvp *MvlanProfile) GroupsUpdated(cntx context.Context, deviceID string) {
+	deleteChannelIfRemoved := func(key interface{}, value interface{}) bool {
+		ig := value.(*IgmpGroup)
 
-        deleteChannelIfRemoved := func(key interface{}, value interface{}) bool {
-                ig := value.(*IgmpGroup)
+		if ig.Mvlan != mvp.Mvlan {
+			return true
+		}
+		grpName := ig.GroupName
+		logger.Infow(ctx, "###Update Cycle", log.Fields{"IG": ig.GroupName, "Addr": ig.GroupAddr})
+		// Check if group exists and remove the entire group object otherwise
+		if currentChannels := mvp.Groups[grpName]; currentChannels != nil {
+			if mvp.IsChannelBasedGroup {
+				channelPresent := doesIPMatch(ig.GroupAddr, currentChannels.McIPs)
+				if channelPresent || mvp.isChannelStatic(ig.GroupAddr) {
+					return true
+				}
+			} else {
+				allExistingChannels := ig.GetAllIgmpChannelForDevice(deviceID)
+				for channel := range allExistingChannels {
+					channelIP := net.ParseIP(channel)
+					channelPresent := mvp.IsChannelPresent(channelIP, currentChannels.McIPs, mvp.IsStaticGroup(ig.GroupName))
+					if channelPresent {
+						staticChannel := mvp.isChannelStatic(channelIP)
+						logger.Infow(ctx, "###Channel Comparison", log.Fields{"staticChannel": staticChannel, "Group": mvp.IsStaticGroup(ig.GroupName), "Channel": channel})
+						// Logic:
+						// If channel is Static & existing Group is also static - No migration required
+						// If channel is not Static & existing Group is also not static - No migration required
 
-                if ig.Mvlan != mvp.Mvlan {
-                        return true
-                }
-                grpName := ig.GroupName
-                logger.Infow(ctx, "###Update Cycle", log.Fields{"IG": ig.GroupName, "Addr": ig.GroupAddr})
-                //Check if group exists and remove the entire group object otherwise
-                if currentChannels := mvp.Groups[grpName]; currentChannels != nil {
+						// If channel is Static and existing Group is not static - Migrate (from dynamic to static)
+						// (Channel already part of dynamic, added to static)
 
-                        if mvp.IsChannelBasedGroup {
-                                channelPresent := doesIPMatch(ig.GroupAddr, currentChannels.McIPs)
-                                if channelPresent || mvp.isChannelStatic(ig.GroupAddr) {
-                                        return true
-                                }
-                        } else {
-                                allExistingChannels := ig.GetAllIgmpChannelForDevice(deviceID)
-                                for channel := range allExistingChannels {
-                                        channelIP := net.ParseIP(channel)
-                                        channelPresent := mvp.IsChannelPresent(channelIP, currentChannels.McIPs, mvp.IsStaticGroup(ig.GroupName))
-                                        if channelPresent {
-                                                staticChannel := mvp.isChannelStatic(channelIP)
-                                                logger.Infow(ctx, "###Channel Comparision", log.Fields{"staticChannel": staticChannel, "Group": mvp.IsStaticGroup(ig.GroupName), "Channel": channel})
-                                                // Logic:
-                                                // If channel is Static & existing Group is also static - No migration required
-                                                // If channel is not Static & existing Group is also not static - No migration required
-
-                                                // If channel is Static and existing Group is not static - Migrate (from dynamic to static)
-                                                //    (Channel already part of dynamic, added to static)
-
-                                                // If channel is not Static but existing Group is static - Migrate (from static to dynamic)
-                                                //    (Channel removed from satic but part of dynamic)
-                                                if (staticChannel != mvp.IsStaticGroup(ig.GroupName)) || (ig.IsGroupStatic != mvp.IsStaticGroup(ig.GroupName)) { // Equivalent of XOR
-                                                        ig.HandleGroupMigration(cntx, deviceID, channelIP)
-                                                } else {
-                                                        if (ig.IsGroupStatic) && mvp.IsStaticGroup(ig.GroupName) {
-                                                                if ig.GroupName != mvp.GetStaticGroupName(channelIP) {
-                                                                        ig.HandleGroupMigration(cntx, deviceID, channelIP)
-                                                                }
-                                                        }
-                                                        continue
-                                                }
-                                        } else {
-                                                logger.Debugw(ctx, "Channel Removed", log.Fields{"Channel": channel, "Group": grpName})
-                                                ig.DelIgmpChannel(cntx, deviceID, net.ParseIP(channel))
-                                                if ig.NumDevicesActive() == 0 {
-                                                        GetApplication().DelIgmpGroup(cntx, ig)
-                                                }
-                                        }
-                                }
-                                ig.IsGroupStatic = mvp.IsStaticGroup(ig.GroupName)
-                                if err := ig.WriteToDb(cntx); err != nil {
-                                        logger.Errorw(ctx, "Igmp group Write to DB failed", log.Fields{"groupName": ig.GroupName})
-                                }
-                                return true
-                        }
-                }
-                logger.Debugw(ctx, "Group Removed", log.Fields{"Channel": ig.GroupAddr, "Group": grpName, "ChannelBasedGroup": ig.IsChannelBasedGroup})
-                ig.DelIgmpGroup(cntx)
-                logger.Debugw(ctx, "Removed Igmp Group", log.Fields{"Channel": ig.GroupAddr, "Group": grpName})
-                return true
-        }
-        GetApplication().IgmpGroups.Range(deleteChannelIfRemoved)
+						// If channel is not Static but existing Group is static - Migrate (from static to dynamic)
+						// (Channel removed from satic but part of dynamic)
+						if (staticChannel != mvp.IsStaticGroup(ig.GroupName)) || (ig.IsGroupStatic != mvp.IsStaticGroup(ig.GroupName)) { // Equivalent of XOR
+							ig.HandleGroupMigration(cntx, deviceID, channelIP)
+						} else {
+							if (ig.IsGroupStatic) && mvp.IsStaticGroup(ig.GroupName) {
+								if ig.GroupName != mvp.GetStaticGroupName(channelIP) {
+									ig.HandleGroupMigration(cntx, deviceID, channelIP)
+								}
+							}
+							continue
+						}
+					} else {
+						logger.Debugw(ctx, "Channel Removed", log.Fields{"Channel": channel, "Group": grpName})
+						ig.DelIgmpChannel(cntx, deviceID, net.ParseIP(channel))
+						if ig.NumDevicesActive() == 0 {
+							GetApplication().DelIgmpGroup(cntx, ig)
+						}
+					}
+				}
+				ig.IsGroupStatic = mvp.IsStaticGroup(ig.GroupName)
+				if err := ig.WriteToDb(cntx); err != nil {
+					logger.Errorw(ctx, "Igmp group Write to DB failed", log.Fields{"groupName": ig.GroupName})
+				}
+				return true
+			}
+		}
+		logger.Debugw(ctx, "Group Removed", log.Fields{"Channel": ig.GroupAddr, "Group": grpName, "ChannelBasedGroup": ig.IsChannelBasedGroup})
+		ig.DelIgmpGroup(cntx)
+		logger.Debugw(ctx, "Removed Igmp Group", log.Fields{"Channel": ig.GroupAddr, "Group": grpName})
+		return true
+	}
+	GetApplication().IgmpGroups.Range(deleteChannelIfRemoved)
 }
 
 // IsChannelPresent to check if channel is present
 func (mvp *MvlanProfile) IsChannelPresent(channelIP net.IP, groupChannelList []string, IsStaticGroup bool) bool {
-        // Only in case of static group, migration need to be supported.
-        // Dynamic to dynamic group migration not supported currently
-        if doesIPMatch(channelIP, groupChannelList) || mvp.isChannelStatic(channelIP) {
-                return true
-        } else if IsStaticGroup {
-                return (mvp.GetMvlanGroup(channelIP) != "")
-        }
+	// Only in case of static group, migration need to be supported.
+	// Dynamic to dynamic group migration not supported currently
+	if doesIPMatch(channelIP, groupChannelList) || mvp.isChannelStatic(channelIP) {
+		return true
+	} else if IsStaticGroup {
+		return (mvp.GetMvlanGroup(channelIP) != "")
+	}
 
-        return false
+	return false
 }
 
-
 // GetMvlanGroup to get mvlan group
 func (mvp *MvlanProfile) GetMvlanGroup(ip net.IP) string {
-        //Check for Static Group First
-        if mvp.containsStaticChannels() {
-                grpName := mvp.GetStaticGroupName(ip)
-                if grpName != "" {
-                        return grpName
-                }
-        }
+	// Check for Static Group First
+	if mvp.containsStaticChannels() {
+		grpName := mvp.GetStaticGroupName(ip)
+		if grpName != "" {
+			return grpName
+		}
+	}
 
-        for _, mvg := range mvp.Groups {
-                if mvg.Wildcard {
-                        return mvg.Name
-                }
-                if doesIPMatch(ip, mvg.McIPs) {
-                        return mvg.Name
-                }
-        }
-        return ""
+	for _, mvg := range mvp.Groups {
+		if mvg.Wildcard {
+			return mvg.Name
+		}
+		if doesIPMatch(ip, mvg.McIPs) {
+			return mvg.Name
+		}
+	}
+	return ""
 }
 
 // ProcessStaticGroup - Process Static Join/Leave Req for static channels
 func (mvp *MvlanProfile) ProcessStaticGroup(cntx context.Context, device string, groupAddresses []net.IP, isJoin bool) {
+	logger.Debugw(ctx, "Received Static Group Request", log.Fields{"Device": device, "Join": isJoin, "Group Address List": groupAddresses})
 
-        logger.Debugw(ctx, "Received Static Group Request", log.Fields{"Device": device, "Join": isJoin, "Group Address List": groupAddresses})
+	mvlan := mvp.Mvlan
+	va := GetApplication()
 
-        mvlan := mvp.Mvlan
-        va := GetApplication()
+	// TODO - Handle bulk add of groupAddr
+	for _, groupAddr := range groupAddresses {
+		ig := mvp.GetStaticIgmpGroup(groupAddr)
+		if isJoin {
+			vd := va.GetDevice(device)
+			igmpProf, _, _ := getIgmpProxyCfgAndIP(mvlan, vd.SerialNum)
+			ver := igmpProf.IgmpVerToServer
 
-        //TODO - Handle bulk add of groupAddr
-        for _, groupAddr := range groupAddresses {
+			if ig == nil {
+				// First time group Creation: Create the IGMP group and then add the receiver to the group
+				logger.Infow(ctx, "Static IGMP Add received for new group", log.Fields{"Addr": groupAddr, "Port": StaticPort})
+				if ig = GetApplication().AddIgmpGroup(cntx, mvp.Name, groupAddr, device); ig != nil {
+					ig.IgmpGroupLock.Lock()
+					ig.AddReceiver(cntx, device, StaticPort, groupAddr, nil, getVersion(ver),
+						0, 0, 0xFF)
+					ig.IgmpGroupLock.Unlock()
+				} else {
+					logger.Warnw(ctx, "Static IGMP Group Creation Failed", log.Fields{"Addr": groupAddr})
+				}
+			} else {
+				// Converting existing dynamic group to static group
+				if !mvp.IsStaticGroup(ig.GroupName) {
+					ig.updateGroupName(cntx, ig.GroupName)
+				}
+				// Update case: If the IGMP group is already created. just add the receiver
+				logger.Infow(ctx, "Static IGMP Add received for existing group", log.Fields{"Addr": groupAddr, "Port": StaticPort})
+				ig.IgmpGroupLock.Lock()
+				ig.AddReceiver(cntx, device, StaticPort, groupAddr, nil, getVersion(ver),
+					0, 0, 0xFF)
+				ig.IgmpGroupLock.Unlock()
+			}
+		} else if ig != nil {
+			logger.Infow(ctx, "Static IGMP Del received for existing group", log.Fields{"Addr": groupAddr, "Port": StaticPort})
 
-                ig := mvp.GetStaticIgmpGroup(groupAddr)
-                if isJoin {
-                        vd := va.GetDevice(device)
-                        igmpProf, _, _ := getIgmpProxyCfgAndIP(mvlan, vd.SerialNum)
-                        ver := igmpProf.IgmpVerToServer
-
-                        if ig == nil {
-                                // First time group Creation: Create the IGMP group and then add the receiver to the group
-                                logger.Infow(ctx, "Static IGMP Add received for new group", log.Fields{"Addr": groupAddr, "Port": StaticPort})
-                                if ig := GetApplication().AddIgmpGroup(cntx, mvp.Name, groupAddr, device); ig != nil {
-                                        ig.IgmpGroupLock.Lock()
-                                        ig.AddReceiver(cntx, device, StaticPort, groupAddr, nil, getVersion(ver),
-                                                0, 0, 0xFF)
-                                        ig.IgmpGroupLock.Unlock()
-                                } else {
-                                        logger.Warnw(ctx, "Static IGMP Group Creation Failed", log.Fields{"Addr": groupAddr})
-                                }
-                        } else {
-                                //Converting existing dynamic group to static group
-                                if !mvp.IsStaticGroup(ig.GroupName) {
-                                        ig.updateGroupName(cntx, ig.GroupName)
-                                }
-                                // Update case: If the IGMP group is already created. just add the receiver
-                                logger.Infow(ctx, "Static IGMP Add received for existing group", log.Fields{"Addr": groupAddr, "Port": StaticPort})
-                                ig.IgmpGroupLock.Lock()
-                                ig.AddReceiver(cntx, device, StaticPort, groupAddr, nil, getVersion(ver),
-                                        0, 0, 0xFF)
-                                ig.IgmpGroupLock.Unlock()
-                        }
-                } else if ig != nil {
-                        logger.Infow(ctx, "Static IGMP Del received for existing group", log.Fields{"Addr": groupAddr, "Port": StaticPort})
-
-                        if ig.IsChannelBasedGroup {
-                                grpName := mvp.GetMvlanGroup(ig.GroupAddr)
-                                if grpName != "" {
-                                        ig.IgmpGroupLock.Lock()
-                                        ig.DelReceiver(cntx, device, StaticPort, groupAddr, nil, 0xFF)
-                                        ig.IgmpGroupLock.Unlock()
-                                        ig.updateGroupName(cntx, grpName)
-                                } else {
-                                        ig.DelIgmpGroup(cntx)
-                                }
-                        } else {
-                                ig.IgmpGroupLock.Lock()
-                                ig.DelReceiver(cntx, device, StaticPort, groupAddr, nil, 0xFF)
-                                ig.IgmpGroupLock.Unlock()
-                        }
-                        if ig.NumDevicesActive() == 0 {
-                                GetApplication().DelIgmpGroup(cntx, ig)
-                        }
-                } else {
-                        logger.Warnw(ctx, "Static IGMP Del received for unknown group", log.Fields{"Addr": groupAddr})
-                }
-        }
+			if ig.IsChannelBasedGroup {
+				grpName := mvp.GetMvlanGroup(ig.GroupAddr)
+				if grpName != "" {
+					ig.IgmpGroupLock.Lock()
+					ig.DelReceiver(cntx, device, StaticPort, groupAddr, nil, 0xFF)
+					ig.IgmpGroupLock.Unlock()
+					ig.updateGroupName(cntx, grpName)
+				} else {
+					ig.DelIgmpGroup(cntx)
+				}
+			} else {
+				ig.IgmpGroupLock.Lock()
+				ig.DelReceiver(cntx, device, StaticPort, groupAddr, nil, 0xFF)
+				ig.IgmpGroupLock.Unlock()
+			}
+			if ig.NumDevicesActive() == 0 {
+				GetApplication().DelIgmpGroup(cntx, ig)
+			}
+		} else {
+			logger.Warnw(ctx, "Static IGMP Del received for unknown group", log.Fields{"Addr": groupAddr})
+		}
+	}
 }
 
-//getStaticChannelDiff - return the static channel newly added and removed from existing static group
+// getStaticChannelDiff - return the static channel newly added and removed from existing static group
 func (mvp *MvlanProfile) getStaticChannelDiff() (newlyAdded []net.IP, removed []net.IP, common []net.IP) {
-
-        var commonChannels []net.IP
-        newChannelList, _ := mvp.getAllStaticChannels()
-        existingChannelList, _ := mvp.getAllOldGroupStaticChannels()
-        if len(existingChannelList) == 0 {
-                return newChannelList, []net.IP{}, []net.IP{}
-        }
-        for _, newChannel := range append([]net.IP{}, newChannelList...) {
-                for _, existChannel := range append([]net.IP{}, existingChannelList...) {
-
-                        //Remove common channels between existing and new list
-                        // The remaining in the below slices give the results
-                        // Remaining in newChannelList: Newly added
-                        // Remaining in existingChannelList: Removed channels
-                        if existChannel.Equal(newChannel) {
-                                existingChannelList = removeIPFromList(existingChannelList, existChannel)
-                                newChannelList = removeIPFromList(newChannelList, newChannel)
-                                commonChannels = append(commonChannels, newChannel)
-                                logger.Infow(ctx, "#############Channel: "+existChannel.String()+" New: "+newChannel.String(), log.Fields{"Added": newChannelList, "Removed": existingChannelList})
-                                break
-                        }
-                }
-        }
-        return newChannelList, existingChannelList, commonChannels
+	var commonChannels []net.IP
+	newChannelList, _ := mvp.getAllStaticChannels()
+	existingChannelList, _ := mvp.getAllOldGroupStaticChannels()
+	if len(existingChannelList) == 0 {
+		return newChannelList, []net.IP{}, []net.IP{}
+	}
+	for _, newChannel := range append([]net.IP{}, newChannelList...) {
+		for _, existChannel := range append([]net.IP{}, existingChannelList...) {
+			// Remove common channels between existing and new list
+			// The remaining in the below slices give the results
+			// Remaining in newChannelList: Newly added
+			// Remaining in existingChannelList: Removed channels
+			if existChannel.Equal(newChannel) {
+				existingChannelList = removeIPFromList(existingChannelList, existChannel)
+				newChannelList = removeIPFromList(newChannelList, newChannel)
+				commonChannels = append(commonChannels, newChannel)
+				logger.Infow(ctx, "#############Channel: "+existChannel.String()+" New: "+newChannel.String(), log.Fields{"Added": newChannelList, "Removed": existingChannelList})
+				break
+			}
+		}
+	}
+	return newChannelList, existingChannelList, commonChannels
 }
 
-//getGroupChannelDiff - return the channel newly added and removed from existing group
+// getGroupChannelDiff - return the channel newly added and removed from existing group
 func (mvp *MvlanProfile) getGroupChannelDiff(newGroup *MvlanGroup, oldGroup *MvlanGroup) (newlyAdded []net.IP, removed []net.IP, common []net.IP) {
-
-        var commonChannels []net.IP
-        newChannelList, _ := newGroup.getAllChannels()
-        existingChannelList, _ := oldGroup.getAllChannels()
-        if len(existingChannelList) == 0 {
-                return newChannelList, []net.IP{}, []net.IP{}
-        }
-        for _, newChannel := range append([]net.IP{}, newChannelList...) {
-                for _, existChannel := range append([]net.IP{}, existingChannelList...) {
-
-                        //Remove common channels between existing and new list
-                        // The remaining in the below slices give the results
-                        // Remaining in newChannelList: Newly added
-                        // Remaining in existingChannelList: Removed channels
-                        if existChannel.Equal(newChannel) {
-                                existingChannelList = removeIPFromList(existingChannelList, existChannel)
-                                newChannelList = removeIPFromList(newChannelList, newChannel)
-                                commonChannels = append(commonChannels, newChannel)
-                                logger.Infow(ctx, "#############Channel: "+existChannel.String()+" New: "+newChannel.String(), log.Fields{"Added": newChannelList, "Removed": existingChannelList})
-                                break
-                        }
-                }
-        }
-        return newChannelList, existingChannelList, commonChannels
+	var commonChannels []net.IP
+	newChannelList, _ := newGroup.getAllChannels()
+	existingChannelList, _ := oldGroup.getAllChannels()
+	if len(existingChannelList) == 0 {
+		return newChannelList, []net.IP{}, []net.IP{}
+	}
+	for _, newChannel := range append([]net.IP{}, newChannelList...) {
+		for _, existChannel := range append([]net.IP{}, existingChannelList...) {
+			// Remove common channels between existing and new list
+			// The remaining in the below slices give the results
+			// Remaining in newChannelList: Newly added
+			// Remaining in existingChannelList: Removed channels
+			if existChannel.Equal(newChannel) {
+				existingChannelList = removeIPFromList(existingChannelList, existChannel)
+				newChannelList = removeIPFromList(newChannelList, newChannel)
+				commonChannels = append(commonChannels, newChannel)
+				logger.Infow(ctx, "#############Channel: "+existChannel.String()+" New: "+newChannel.String(), log.Fields{"Added": newChannelList, "Removed": existingChannelList})
+				break
+			}
+		}
+	}
+	return newChannelList, existingChannelList, commonChannels
 }
 
 // UpdateProfile - Updates the group & member info w.r.t the mvlan profile for the given device
 func (mvp *MvlanProfile) UpdateProfile(cntx context.Context, deviceID string) {
-        logger.Infow(ctx, "Update Mvlan Profile task triggered", log.Fields{"Mvlan": mvp.Mvlan})
-        var removedStaticChannels []net.IP
-        addedStaticChannels := []net.IP{}
-        /* Taking mvpLock to protect the mvp groups and proxy */
-        mvp.mvpLock.RLock()
-        defer mvp.mvpLock.RUnlock()
+	logger.Infow(ctx, "Update Mvlan Profile task triggered", log.Fields{"Mvlan": mvp.Mvlan})
+	var removedStaticChannels []net.IP
+	addedStaticChannels := []net.IP{}
+	/* Taking mvpLock to protect the mvp groups and proxy */
+	mvp.mvpLock.RLock()
+	defer mvp.mvpLock.RUnlock()
 
-        serialNo := ""
-        if deviceID != "" {
-                if vd := GetApplication().GetDevice(deviceID); vd != nil {
-                        serialNo = vd.SerialNum
-                        if mvp.DevicesList[serialNo] != UpdateInProgress {
-                                logger.Warnw(ctx, "Exiting Update Task since device not present in MvlanProfile", log.Fields{"Device": deviceID, "SerialNum": vd.SerialNum, "MvlanProfile": mvp})
-                                return
-                        }
-                } else {
-                        logger.Errorw(ctx, "Volt Device not found. Stopping Update Mvlan Profile processing for device", log.Fields{"SerialNo": deviceID, "MvlanProfile": mvp})
-                        return
-                }
-        }
+	serialNo := ""
+	if deviceID != "" {
+		if vd := GetApplication().GetDevice(deviceID); vd != nil {
+			serialNo = vd.SerialNum
+			if mvp.DevicesList[serialNo] != UpdateInProgress {
+				logger.Warnw(ctx, "Exiting Update Task since device not present in MvlanProfile", log.Fields{"Device": deviceID, "SerialNum": vd.SerialNum, "MvlanProfile": mvp})
+				return
+			}
+		} else {
+			logger.Errorw(ctx, "Volt Device not found. Stopping Update Mvlan Profile processing for device", log.Fields{"SerialNo": deviceID, "MvlanProfile": mvp})
+			return
+		}
+	}
 
-        //Update the groups based on static channels added & removed
-        if mvp.containsStaticChannels() {
-                addedStaticChannels, removedStaticChannels, _ = mvp.getStaticChannelDiff()
-                logger.Debugw(ctx, "Update Task - Static Group Changes", log.Fields{"Added": addedStaticChannels, "Removed": removedStaticChannels})
+	// Update the groups based on static channels added & removed
+	if mvp.containsStaticChannels() {
+		addedStaticChannels, removedStaticChannels, _ = mvp.getStaticChannelDiff()
+		logger.Debugw(ctx, "Update Task - Static Group Changes", log.Fields{"Added": addedStaticChannels, "Removed": removedStaticChannels})
 
-                if len(addedStaticChannels) > 0 || len(removedStaticChannels) > 0 {
-                        mvp.updateStaticGroups(cntx, deviceID, []net.IP{}, removedStaticChannels)
-                }
-        }
-        mvp.GroupsUpdated(cntx, deviceID)
-        if len(addedStaticChannels) > 0 {
-                mvp.updateStaticGroups(cntx, deviceID, addedStaticChannels, []net.IP{})
-        }
+		if len(addedStaticChannels) > 0 || len(removedStaticChannels) > 0 {
+			mvp.updateStaticGroups(cntx, deviceID, []net.IP{}, removedStaticChannels)
+		}
+	}
+	mvp.GroupsUpdated(cntx, deviceID)
+	if len(addedStaticChannels) > 0 {
+		mvp.updateStaticGroups(cntx, deviceID, addedStaticChannels, []net.IP{})
+	}
 
-        /* Need to handle if SSM params are modified for groups */
-        for key := range mvp.Groups {
-                _, _, commonChannels := mvp.getGroupChannelDiff(mvp.Groups[key], mvp.oldGroups[key])
-                if mvp.checkStaticGrpSSMProxyDiff(mvp.oldProxy[key], mvp.Proxy[key]) {
-                        if mvp.Groups[key].IsStatic {
-                                /* Static group proxy modified, need to trigger membership report with new mode/src-list for existing channels */
-                                mvp.updateStaticGroups(cntx, deviceID, commonChannels, []net.IP{})
-                        } else {
-                                /* Dynamic group proxy modified, need to trigger membership report with new mode/src-list for existing channels */
-                                mvp.updateDynamicGroups(cntx, deviceID, commonChannels, []net.IP{})
-                        }
-                }
-        }
+	/* Need to handle if SSM params are modified for groups */
+	for key := range mvp.Groups {
+		_, _, commonChannels := mvp.getGroupChannelDiff(mvp.Groups[key], mvp.oldGroups[key])
+		if mvp.checkStaticGrpSSMProxyDiff(mvp.oldProxy[key], mvp.Proxy[key]) {
+			if mvp.Groups[key].IsStatic {
+				/* Static group proxy modified, need to trigger membership report with new mode/src-list for existing channels */
+				mvp.updateStaticGroups(cntx, deviceID, commonChannels, []net.IP{})
+			} else {
+				/* Dynamic group proxy modified, need to trigger membership report with new mode/src-list for existing channels */
+				mvp.updateDynamicGroups(cntx, deviceID, commonChannels, []net.IP{})
+			}
+		}
+	}
 
-        mvp.SetUpdateStatus(serialNo, NoOp)
+	mvp.SetUpdateStatus(serialNo, NoOp)
 
-        if deviceID == "" || !mvp.isUpdateInProgress() {
-                mvp.oldGroups = nil
-        }
-        if err := mvp.WriteToDb(cntx); err != nil {
-                logger.Errorw(ctx, "Mvlan profile write to DB failed", log.Fields{"ProfileName": mvp.Name})
-        }
-        logger.Debugw(ctx, "Updated MVLAN Profile", log.Fields{"VLAN": mvp.Mvlan, "Name": mvp.Name, "Grp IPs": mvp.Groups})
+	if deviceID == "" || !mvp.isUpdateInProgress() {
+		mvp.oldGroups = nil
+	}
+	if err := mvp.WriteToDb(cntx); err != nil {
+		logger.Errorw(ctx, "Mvlan profile write to DB failed", log.Fields{"ProfileName": mvp.Name})
+	}
+	logger.Debugw(ctx, "Updated MVLAN Profile", log.Fields{"VLAN": mvp.Mvlan, "Name": mvp.Name, "Grp IPs": mvp.Groups})
 }
 
-//checkStaticGrpSSMProxyDiff- return true if the proxy of oldGroup is modified in newGroup
+// checkStaticGrpSSMProxyDiff- return true if the proxy of oldGroup is modified in newGroup
 func (mvp *MvlanProfile) checkStaticGrpSSMProxyDiff(oldProxy *MCGroupProxy, newProxy *MCGroupProxy) bool {
+	if oldProxy == nil && newProxy == nil {
+		return false
+	}
+	if (oldProxy == nil && newProxy != nil) ||
+		(oldProxy != nil && newProxy == nil) {
+		return true
+	}
 
-        if oldProxy == nil && newProxy == nil {
-                return false
-        }
-        if (oldProxy == nil && newProxy != nil) ||
-                (oldProxy != nil && newProxy == nil) {
-                return true
-        }
+	if oldProxy.Mode != newProxy.Mode {
+		return true
+	}
 
-        if oldProxy.Mode != newProxy.Mode {
-                return true
-        }
+	oldSrcLst := oldProxy.SourceList
+	newSrcLst := newProxy.SourceList
+	oLen := len(oldSrcLst)
+	nLen := len(newSrcLst)
+	if oLen != nLen {
+		return true
+	}
 
-        oldSrcLst := oldProxy.SourceList
-        newSrcLst := newProxy.SourceList
-        oLen := len(oldSrcLst)
-        nLen := len(newSrcLst)
-        if oLen != nLen {
-                return true
-        }
+	visited := make([]bool, nLen)
 
-        visited := make([]bool, nLen)
+	/* check if any new IPs added in the src list, return true if present */
+	for i := 0; i < nLen; i++ {
+		found := false
+		element := newSrcLst[i]
+		for j := 0; j < oLen; j++ {
+			if visited[j] {
+				continue
+			}
+			if element.Equal(oldSrcLst[j]) {
+				visited[j] = true
+				found = true
+				break
+			}
+		}
+		if !found {
+			return true
+		}
+	}
 
-        /* check if any new IPs added in the src list, return true if present */
-        for i := 0; i < nLen; i++ {
-                found := false
-                element := newSrcLst[i]
-                for j := 0; j < oLen; j++ {
-                        if visited[j] {
-                                continue
-                        }
-                        if element.Equal(oldSrcLst[j]) {
-                                visited[j] = true
-                                found = true
-                                break
-                        }
-                }
-                if !found {
-                        return true
-                }
-        }
-
-        visited = make([]bool, nLen)
-        /* check if any IPs removed from existing  src list, return true if removed */
-        for i := 0; i < oLen; i++ {
-                found := false
-                element := oldSrcLst[i]
-                for j := 0; j < nLen; j++ {
-                        if visited[j] {
-                                continue
-                        }
-                        if element.Equal(newSrcLst[j]) {
-                                visited[j] = true
-                                found = true
-                                break
-                        }
-                }
-                if !found {
-                        return true
-                }
-        }
-        return false
+	visited = make([]bool, nLen)
+	/* check if any IPs removed from existing  src list, return true if removed */
+	for i := 0; i < oLen; i++ {
+		found := false
+		element := oldSrcLst[i]
+		for j := 0; j < nLen; j++ {
+			if visited[j] {
+				continue
+			}
+			if element.Equal(newSrcLst[j]) {
+				visited[j] = true
+				found = true
+				break
+			}
+		}
+		if !found {
+			return true
+		}
+	}
+	return false
 }
 
-
-//UpdateActiveChannelSubscriberAlarm - Updates the Active Channel Subscriber Alarm
+// UpdateActiveChannelSubscriberAlarm - Updates the Active Channel Subscriber Alarm
 func (mvp *MvlanProfile) UpdateActiveChannelSubscriberAlarm() {
-        va := GetApplication()
-        logger.Debugw(ctx, "Update of Active Channel Subscriber Alarm", log.Fields{"Mvlan": mvp.Mvlan})
-        for srNo := range mvp.DevicesList {
-                d, _ := va.GetDeviceBySerialNo(srNo)
-                if d == nil {
-                        logger.Warnw(ctx, "Device info not found", log.Fields{"Device_SrNo": srNo, "Mvlan": mvp.Mvlan})
-                        return
-                }
-                d.Ports.Range(func(key, value interface{}) bool {
-                        //port := key.(string)
-                        vp := value.(*VoltPort)
-                        if vp.Type != VoltPortTypeAccess {
-                                return true
-                        }
-                        if mvp.MaxActiveChannels > vp.ActiveChannels && vp.ChannelPerSubAlarmRaised {
-                                serviceName := GetMcastServiceForSubAlarm(vp, mvp)
-                                logger.Debugw(ctx, "Clearing-SendActiveChannelPerSubscriberAlarm-due-to-update", log.Fields{"ActiveChannels": vp.ActiveChannels, "ServiceName": serviceName})
-                                vp.ChannelPerSubAlarmRaised = false
-                        } else if mvp.MaxActiveChannels < vp.ActiveChannels && !vp.ChannelPerSubAlarmRaised {
-                                /* When the max active channel count is reduced via update, we raise an alarm.
-                                   But the previous excess channels still exist until a leave or expiry */
-                                serviceName := GetMcastServiceForSubAlarm(vp, mvp)
-                                logger.Debugw(ctx, "Raising-SendActiveChannelPerSubscriberAlarm-due-to-update", log.Fields{"ActiveChannels": vp.ActiveChannels, "ServiceName": serviceName})
-                                vp.ChannelPerSubAlarmRaised = true
-                        }
-                        return true
-                })
-        }
+	va := GetApplication()
+	logger.Debugw(ctx, "Update of Active Channel Subscriber Alarm", log.Fields{"Mvlan": mvp.Mvlan})
+	for srNo := range mvp.DevicesList {
+		d, _ := va.GetDeviceBySerialNo(srNo)
+		if d == nil {
+			logger.Warnw(ctx, "Device info not found", log.Fields{"Device_SrNo": srNo, "Mvlan": mvp.Mvlan})
+			return
+		}
+		d.Ports.Range(func(key, value interface{}) bool {
+			//port := key.(string)
+			vp := value.(*VoltPort)
+			if vp.Type != VoltPortTypeAccess {
+				return true
+			}
+			if mvp.MaxActiveChannels > vp.ActiveChannels && vp.ChannelPerSubAlarmRaised {
+				serviceName := GetMcastServiceForSubAlarm(vp, mvp)
+				logger.Debugw(ctx, "Clearing-SendActiveChannelPerSubscriberAlarm-due-to-update", log.Fields{"ActiveChannels": vp.ActiveChannels, "ServiceName": serviceName})
+				vp.ChannelPerSubAlarmRaised = false
+			} else if mvp.MaxActiveChannels < vp.ActiveChannels && !vp.ChannelPerSubAlarmRaised {
+				/* When the max active channel count is reduced via update, we raise an alarm.
+				   But the previous excess channels still exist until a leave or expiry */
+				serviceName := GetMcastServiceForSubAlarm(vp, mvp)
+				logger.Debugw(ctx, "Raising-SendActiveChannelPerSubscriberAlarm-due-to-update", log.Fields{"ActiveChannels": vp.ActiveChannels, "ServiceName": serviceName})
+				vp.ChannelPerSubAlarmRaised = true
+			}
+			return true
+		})
+	}
 }
 
-//TriggerAssociatedFlowDelete - Re-trigger delete for pending delete flows
+// TriggerAssociatedFlowDelete - Re-trigger delete for pending delete flows
 func (mvp *MvlanProfile) TriggerAssociatedFlowDelete(cntx context.Context, device string) bool {
-        mvp.mvpFlowLock.Lock()
+	mvp.mvpFlowLock.Lock()
 
-        cookieList := []uint64{}
-        flowMap := mvp.PendingDeleteFlow[device]
+	cookieList := []uint64{}
+	flowMap := mvp.PendingDeleteFlow[device]
 
-        for cookie := range flowMap {
-                cookieList = append(cookieList, convertToUInt64(cookie))
-        }
-        mvp.mvpFlowLock.Unlock()
+	for cookie := range flowMap {
+		cookieList = append(cookieList, convertToUInt64(cookie))
+	}
+	mvp.mvpFlowLock.Unlock()
 
-        if len(cookieList) == 0 {
-                return false
-        }
+	if len(cookieList) == 0 {
+		return false
+	}
 
-        for _, cookie := range cookieList {
-                if vd := GetApplication().GetDevice(device); vd != nil {
-                        flow := &of.VoltFlow{}
-                        flow.SubFlows = make(map[uint64]*of.VoltSubFlow)
-                        subFlow := of.NewVoltSubFlow()
-                        subFlow.Cookie = cookie
-                        flow.SubFlows[cookie] = subFlow
-                        logger.Infow(ctx, "Retriggering Vnet Delete Flow", log.Fields{"Device": device, "Mvlan": mvp.Mvlan.String(), "Cookie": cookie})
-                        err := mvp.DelFlows(cntx, vd, flow)
-                        if err != nil {
-                                logger.Warnw(ctx, "De-Configuring IGMP Flow for device failed ", log.Fields{"Device": device, "err": err})
-                        }
-                }
-        }
-        return true
+	for _, cookie := range cookieList {
+		if vd := GetApplication().GetDevice(device); vd != nil {
+			flow := &of.VoltFlow{}
+			flow.SubFlows = make(map[uint64]*of.VoltSubFlow)
+			subFlow := of.NewVoltSubFlow()
+			subFlow.Cookie = cookie
+			flow.SubFlows[cookie] = subFlow
+			logger.Infow(ctx, "Retriggering Vnet Delete Flow", log.Fields{"Device": device, "Mvlan": mvp.Mvlan.String(), "Cookie": cookie})
+			err := mvp.DelFlows(cntx, vd, flow)
+			if err != nil {
+				logger.Warnw(ctx, "De-Configuring IGMP Flow for device failed ", log.Fields{"Device": device, "err": err})
+			}
+		}
+	}
+	return true
 }
 
-// JsonMarshal wrapper function for json Marshal MvlanProfile
-func (mvp *MvlanProfile) JsonMarshal() ([]byte, error) {
-        return json.Marshal(MvlanProfile{
-                Name:                mvp.Name,
-                Mvlan:               mvp.Mvlan,
-                PonVlan:             mvp.PonVlan,
-                Groups:              mvp.Groups,
-                Proxy:               mvp.Proxy,
-                Version:             mvp.Version,
-                IsPonVlanPresent:    mvp.IsPonVlanPresent,
-                IsChannelBasedGroup: mvp.IsChannelBasedGroup,
-                DevicesList:         mvp.DevicesList,
-                MaxActiveChannels:   mvp.MaxActiveChannels,
-                PendingDeleteFlow:   mvp.PendingDeleteFlow,
-                DeleteInProgress:    mvp.DeleteInProgress,
-                IgmpServVersion:     mvp.IgmpServVersion,
-        })
+// JSONMarshal wrapper function for json Marshal MvlanProfile
+func (mvp *MvlanProfile) JSONMarshal() ([]byte, error) {
+	return json.Marshal(MvlanProfile{
+		Name:                mvp.Name,
+		Mvlan:               mvp.Mvlan,
+		PonVlan:             mvp.PonVlan,
+		Groups:              mvp.Groups,
+		Proxy:               mvp.Proxy,
+		Version:             mvp.Version,
+		IsPonVlanPresent:    mvp.IsPonVlanPresent,
+		IsChannelBasedGroup: mvp.IsChannelBasedGroup,
+		DevicesList:         mvp.DevicesList,
+		MaxActiveChannels:   mvp.MaxActiveChannels,
+		PendingDeleteFlow:   mvp.PendingDeleteFlow,
+		DeleteInProgress:    mvp.DeleteInProgress,
+		IgmpServVersion:     mvp.IgmpServVersion,
+	})
 }
 
 // removeIPFromList to remove ip from the list
 func removeIPFromList(s []net.IP, value net.IP) []net.IP {
-        i := 0
-        for i = 0; i < len(s); i++ {
-                if s[i].Equal(value) {
-                        break
-                }
-        }
-        if i != len(s) {
-                //It means value is found in the slice
-                return append(s[0:i], s[i+1:]...)
-        }
-        return s
+	i := 0
+	for i = 0; i < len(s); i++ {
+		if s[i].Equal(value) {
+			break
+		}
+	}
+	if i != len(s) {
+		//It means value is found in the slice
+		return append(s[0:i], s[i+1:]...)
+	}
+	return s
 }
 
 // doesIPMatch to check if ip match with any ip from the list
 func doesIPMatch(ip net.IP, ipsOrRange []string) bool {
-        for _, ipOrRange := range ipsOrRange {
-                if strings.Contains(ipOrRange, "-") {
-                        var splits = strings.Split(ipOrRange, "-")
-                        ipStart := util.IP2LongConv(net.ParseIP(splits[0]))
-                        ipEnd := util.IP2LongConv(net.ParseIP(splits[1]))
-                        if ipEnd < ipStart {
-                                return false
-                        }
-                        ipInt := util.IP2LongConv(ip)
-                        if ipInt >= ipStart && ipInt <= ipEnd {
-                                return true
-                        }
-                } else if ip.Equal(net.ParseIP(ipOrRange)) {
-                        return true
-                }
-        }
-        return false
+	for _, ipOrRange := range ipsOrRange {
+		if strings.Contains(ipOrRange, "-") {
+			var splits = strings.Split(ipOrRange, "-")
+			ipStart := util.IP2LongConv(net.ParseIP(splits[0]))
+			ipEnd := util.IP2LongConv(net.ParseIP(splits[1]))
+			if ipEnd < ipStart {
+				return false
+			}
+			ipInt := util.IP2LongConv(ip)
+			if ipInt >= ipStart && ipInt <= ipEnd {
+				return true
+			}
+		} else if ip.Equal(net.ParseIP(ipOrRange)) {
+			return true
+		}
+	}
+	return false
 }
 
 // IgmpProfile structure
 type IgmpProfile struct {
-        ProfileID          string
-        UnsolicitedTimeOut uint32 //In seconds
-        MaxResp            uint32
-        KeepAliveInterval  uint32
-        KeepAliveCount     uint32
-        LastQueryInterval  uint32
-        LastQueryCount     uint32
-        FastLeave          bool
-        PeriodicQuery      bool
-        IgmpCos            uint8
-        WithRAUpLink       bool
-        WithRADownLink     bool
-        IgmpVerToServer    string
-        IgmpSourceIP       net.IP
-        Version            string
+	ProfileID          string
+	IgmpVerToServer    string
+	Version            string
+	IgmpSourceIP       net.IP
+	UnsolicitedTimeOut uint32 //In seconds
+	MaxResp            uint32
+	KeepAliveInterval  uint32
+	KeepAliveCount     uint32
+	LastQueryInterval  uint32
+	LastQueryCount     uint32
+	IgmpCos            uint8
+	FastLeave          bool
+	PeriodicQuery      bool
+	WithRAUpLink       bool
+	WithRADownLink     bool
 }
 
 func newIgmpProfile(igmpProfileConfig *common.IGMPConfig) *IgmpProfile {
-        var igmpProfile IgmpProfile
-        igmpProfile.ProfileID = igmpProfileConfig.ProfileID
-        igmpProfile.UnsolicitedTimeOut = uint32(igmpProfileConfig.UnsolicitedTimeOut)
-        igmpProfile.MaxResp = uint32(igmpProfileConfig.MaxResp)
+	var igmpProfile IgmpProfile
+	igmpProfile.ProfileID = igmpProfileConfig.ProfileID
+	igmpProfile.UnsolicitedTimeOut = uint32(igmpProfileConfig.UnsolicitedTimeOut)
+	igmpProfile.MaxResp = uint32(igmpProfileConfig.MaxResp)
 
-        keepAliveInterval := uint32(igmpProfileConfig.KeepAliveInterval)
+	keepAliveInterval := uint32(igmpProfileConfig.KeepAliveInterval)
 
-        //KeepAliveInterval should have a min of 10 seconds
-        if keepAliveInterval < MinKeepAliveInterval {
-                keepAliveInterval = MinKeepAliveInterval
-                logger.Infow(ctx, "Auto adjust keepAliveInterval - Value < 10", log.Fields{"Received": igmpProfileConfig.KeepAliveInterval, "Configured": keepAliveInterval})
-        }
-        igmpProfile.KeepAliveInterval = keepAliveInterval
+	//KeepAliveInterval should have a min of 10 seconds
+	if keepAliveInterval < MinKeepAliveInterval {
+		keepAliveInterval = MinKeepAliveInterval
+		logger.Infow(ctx, "Auto adjust keepAliveInterval - Value < 10", log.Fields{"Received": igmpProfileConfig.KeepAliveInterval, "Configured": keepAliveInterval})
+	}
+	igmpProfile.KeepAliveInterval = keepAliveInterval
 
-        igmpProfile.KeepAliveCount = uint32(igmpProfileConfig.KeepAliveCount)
-        igmpProfile.LastQueryInterval = uint32(igmpProfileConfig.LastQueryInterval)
-        igmpProfile.LastQueryCount = uint32(igmpProfileConfig.LastQueryCount)
-        igmpProfile.FastLeave = *igmpProfileConfig.FastLeave
-        igmpProfile.PeriodicQuery = *igmpProfileConfig.PeriodicQuery
-        igmpProfile.IgmpCos = uint8(igmpProfileConfig.IgmpCos)
-        igmpProfile.WithRAUpLink = *igmpProfileConfig.WithRAUpLink
-        igmpProfile.WithRADownLink = *igmpProfileConfig.WithRADownLink
+	igmpProfile.KeepAliveCount = uint32(igmpProfileConfig.KeepAliveCount)
+	igmpProfile.LastQueryInterval = uint32(igmpProfileConfig.LastQueryInterval)
+	igmpProfile.LastQueryCount = uint32(igmpProfileConfig.LastQueryCount)
+	igmpProfile.FastLeave = *igmpProfileConfig.FastLeave
+	igmpProfile.PeriodicQuery = *igmpProfileConfig.PeriodicQuery
+	igmpProfile.IgmpCos = uint8(igmpProfileConfig.IgmpCos)
+	igmpProfile.WithRAUpLink = *igmpProfileConfig.WithRAUpLink
+	igmpProfile.WithRADownLink = *igmpProfileConfig.WithRADownLink
 
-        if igmpProfileConfig.IgmpVerToServer == "2" || igmpProfileConfig.IgmpVerToServer == "v2" {
-                igmpProfile.IgmpVerToServer = "2"
-        } else {
-                igmpProfile.IgmpVerToServer = "3"
-        }
-        igmpProfile.IgmpSourceIP = net.ParseIP(igmpProfileConfig.IgmpSourceIP)
+	if igmpProfileConfig.IgmpVerToServer == "2" || igmpProfileConfig.IgmpVerToServer == "v2" {
+		igmpProfile.IgmpVerToServer = "2"
+	} else {
+		igmpProfile.IgmpVerToServer = "3"
+	}
+	igmpProfile.IgmpSourceIP = net.ParseIP(igmpProfileConfig.IgmpSourceIP)
 
-        return &igmpProfile
+	return &igmpProfile
 }
 
 // newDefaultIgmpProfile Igmp profiles with default values
 func newDefaultIgmpProfile() *IgmpProfile {
-        return &IgmpProfile{
-                ProfileID:          DefaultIgmpProfID,
-                UnsolicitedTimeOut: 60,
-                MaxResp:            10, // seconds
-                KeepAliveInterval:  60, // seconds
-                KeepAliveCount:     3,  // TODO - May not be needed
-                LastQueryInterval:  0,  // TODO - May not be needed
-                LastQueryCount:     0,  // TODO - May not be needed
-                FastLeave:          true,
-                PeriodicQuery:      false, // TODO - May not be needed
-                IgmpCos:            7,     //p-bit value included in the IGMP packet
-                WithRAUpLink:       false, // TODO - May not be needed
-                WithRADownLink:     false, // TODO - May not be needed
-                IgmpVerToServer:    "3",
-                IgmpSourceIP:       net.ParseIP("172.27.0.1"), // This will be replaced by configuration
-        }
+	return &IgmpProfile{
+		ProfileID:          DefaultIgmpProfID,
+		UnsolicitedTimeOut: 60,
+		MaxResp:            10, // seconds
+		KeepAliveInterval:  60, // seconds
+		KeepAliveCount:     3,  // TODO - May not be needed
+		LastQueryInterval:  0,  // TODO - May not be needed
+		LastQueryCount:     0,  // TODO - May not be needed
+		FastLeave:          true,
+		PeriodicQuery:      false, // TODO - May not be needed
+		IgmpCos:            7,     //p-bit value included in the IGMP packet
+		WithRAUpLink:       false, // TODO - May not be needed
+		WithRADownLink:     false, // TODO - May not be needed
+		IgmpVerToServer:    "3",
+		IgmpSourceIP:       net.ParseIP("172.27.0.1"), // This will be replaced by configuration
+	}
 }
 
 // WriteToDb is utility to write Igmp Config Info to database
 func (igmpProfile *IgmpProfile) WriteToDb(cntx context.Context) error {
-        igmpProfile.Version = database.PresentVersionMap[database.IgmpProfPath]
-        b, err := json.Marshal(igmpProfile)
-        if err != nil {
-                return err
-        }
-        if err1 := db.PutIgmpProfile(cntx, igmpProfile.ProfileID, string(b)); err1 != nil {
-                return err1
-        }
-        return nil
+	igmpProfile.Version = database.PresentVersionMap[database.IgmpProfPath]
+	b, err := json.Marshal(igmpProfile)
+	if err != nil {
+		return err
+	}
+	if err1 := db.PutIgmpProfile(cntx, igmpProfile.ProfileID, string(b)); err1 != nil {
+		return err1
+	}
+	return nil
 }
diff --git a/internal/pkg/application/igmptasks.go b/internal/pkg/application/igmptasks.go
index 268453c..c56d374 100644
--- a/internal/pkg/application/igmptasks.go
+++ b/internal/pkg/application/igmptasks.go
@@ -40,8 +40,8 @@
 // TickTask structure
 type TickTask struct {
 	ctx    context.Context
-	taskID uint8
 	ts     string
+	taskID uint8
 }
 
 // NewTickTask is constructor for TickTask
@@ -84,11 +84,11 @@
 // IgmpPacketTask structure
 type IgmpPacketTask struct {
 	ctx    context.Context
-	taskID uint8
+	Pkt    gopacket.Packet
 	Device string
 	Port   string
-	Pkt    gopacket.Packet
 	ts     string
+	taskID uint8
 }
 
 // NewIgmpPacketTask is the constructor for IgmpPacketTask
@@ -131,10 +131,10 @@
 // UpdateMvlanTask structure
 type UpdateMvlanTask struct {
 	ctx      context.Context
-	taskID   uint8
-	DeviceID string
 	mvp      *MvlanProfile
+	DeviceID string
 	ts       string
+	taskID   uint8
 }
 
 // NewUpdateMvlanTask is the constructor for UpdateMvlanTask
diff --git a/internal/pkg/application/major_upgrade.go b/internal/pkg/application/major_upgrade.go
index b423b58..2cd488c 100644
--- a/internal/pkg/application/major_upgrade.go
+++ b/internal/pkg/application/major_upgrade.go
@@ -19,8 +19,8 @@
 	"context"
 	"encoding/json"
 	"errors"
-	"voltha-go-controller/internal/pkg/types"
 	"sync"
+	common "voltha-go-controller/internal/pkg/types"
 
 	"github.com/google/gopacket/layers"
 
@@ -29,28 +29,28 @@
 )
 
 const (
-	//MigrationComplete Represents the Migration Complete
+	// MigrationComplete Represents the Migration Complete
 	MigrationComplete = "Completed"
-	//MigrationInProgress Represents the Migration Inprogress
+	// MigrationInProgress Represents the Migration Inprogress
 	MigrationInProgress = "InProgress"
-	//MigrationFailed  Represents the Migration Failed
+	// MigrationFailed  Represents the Migration Failed
 	MigrationFailed = "Failed"
 	// StatusNone for no operations
 	StatusNone = "NONE"
-	//ModuleToBeDeleted - module where old version is deleted
+	// ModuleToBeDeleted - module where old version is deleted
 	ModuleToBeDeleted = "ModuleToBeDeleted"
 )
 
-//DataMigration represents the Verison and Status info for Major Version Upgrade.
+// DataMigration represents the Version and Status info for Major Version Upgrade.
 type DataMigration struct {
+	ModuleVer map[string]string // eg. "service": "v1"
 	Version   string
 	Status    string
-	ModuleVer map[string]string // eg. "service": "v1"
 }
 
 type paramsMigrationFunc func(context.Context, []byte) string
 
-//map to store conversion functions
+// map to store conversion functions
 var migrationMap = map[string]paramsMigrationFunc{
 	database.ServicePath:        MigrateServices,
 	database.DevicePath:         MigrateDevices,
@@ -124,12 +124,12 @@
 	var NoDataInDB bool
 	err := GetMigrationInfo(ctx, Migrate)
 	logger.Debugw(ctx, "Migration data", log.Fields{"DataMigration": Migrate})
-	// No DB entry represents N verison Bring Up for the First time
+	// No DB entry represents N version Bring Up for the First time
 	if err != nil {
 		NoDataInDB = true
 		logger.Error(ctx, "Failed to read the Migration Data from DB ")
 	}
-	// Covers N verison bringup and Reboot Senarios
+	// Covers N version bringup and Reboot Scenarios
 	if NoDataInDB {
 		logger.Info(ctx, "Data Migration Not Required")
 		Migrate.Version = database.PresentVersion
@@ -138,9 +138,9 @@
 		if err := Migrate.WriteToDb(ctx); err != nil {
 			logger.Errorw(ctx, "DB Write failed for Migration Path", log.Fields{"error": err})
 		}
-		//MigrateProbestatus has to be Updated to Complete when No Migration is Required
+		// MigrateProbestatus has to be Updated to Complete when No Migration is Required
 		logger.Debugw(ctx, "Migration Probe Status", log.Fields{"Migration Probe": Migrate.Status})
-		//probe.UpdateDBMigrationStatus(ctx, true)
+		// probe.UpdateDBMigrationStatus(ctx, true)
 		return false
 		// Migration required when vgc moves to Higher Versions
 	} else if Migrate.ModuleVer == nil {
@@ -185,7 +185,7 @@
 	Migrate := new(DataMigration)
 	var migrationWG sync.WaitGroup
 
-	//Keeping it outside to avoid race condition where the
+	// Keeping it outside to avoid race condition where the
 	// wait check is reached before the go toutine for data migraiton is triggered
 	migrationWG.Add(1)
 
@@ -195,7 +195,7 @@
 		if err != nil {
 			logger.Errorw(ctx, "Failed to Migrate the Data", log.Fields{"error": err})
 			Migrate.Status = MigrationFailed
-			if err := Migrate.WriteToDb(ctx); err != nil {
+			if err = Migrate.WriteToDb(ctx); err != nil {
 				logger.Errorw(ctx, "DB Write failed to Migration Path", log.Fields{"error": err})
 			}
 		}
@@ -213,7 +213,7 @@
 	// Failure Senario can be Exceptions, incase of panic Update the status as failed
 	defer func() {
 		if err := recover(); err != nil {
-			logger.Errorw(ctx, "Migration failure due to Exception happend", log.Fields{"reason": err})
+			logger.Errorw(ctx, "Migration failure due to Exception happened", log.Fields{"reason": err})
 			Migrate.Status = MigrationFailed
 			if err := Migrate.WriteToDb(ctx); err != nil {
 				logger.Errorw(ctx, "DB Write failed for Migration Path", log.Fields{"error": err})
@@ -234,7 +234,6 @@
 
 // MigrateDBData to migrate database data
 func MigrateDBData(cntx context.Context) error {
-
 	var err error
 	for module, currentVersion := range database.PresentVersionMap {
 		if currentVersion == database.DBVersionMap[module] {
@@ -265,20 +264,19 @@
 	return nil
 }
 
-//FetchAndMigrateDeviceDBData fetchs the data from database and migrte the same to latest versions and store ot back ot database
+// FetchAndMigrateDeviceDBData fetchs the data from database and migrte the same to latest versions and store ot back ot database
 func FetchAndMigrateDeviceDBData(module string) error {
 	logger.Error(ctx, "Data Migration not implemented for Device DB Data")
 	return nil
 }
 
-//FetchAndMigrateDBData fetchs the data from database and migrte the same to latest versions and store ot back ot database
+// FetchAndMigrateDBData fetchs the data from database and migrte the same to latest versions and store ot back ot database
 func FetchAndMigrateDBData(cntx context.Context, module string) error {
-
 	previousPath := database.GetModuleKeypath(module, database.PreviousVersionMap[module])
 	dbPathKeysValueMap, err := db.List(cntx, previousPath)
 	if err != nil {
 		logger.Errorw(ctx, "failed to Fetch the Keys from Redis", log.Fields{"error": err})
-		//No return required, Data might not be present in DB
+		// No return required, Data might not be present in DB
 		return nil
 	}
 	if len(dbPathKeysValueMap) == 0 {
@@ -289,7 +287,7 @@
 	// Fetch each Path from previous version and store to present version after data migration changes
 	for hash, value := range dbPathKeysValueMap {
 		logger.Debugw(ctx, "DB path", log.Fields{"hash": hash})
-		//convert the value to a specific type based on the dbPath
+		// convert the value to a specific type based on the dbPath
 		b, ok := value.Value.([]byte)
 		if !ok {
 			logger.Error(ctx, "The value type is not []byte")
@@ -314,7 +312,7 @@
 	return nil
 }
 
-//MigrateServices modifyies the old data as per current version requirement and updates the database
+// MigrateServices modifyies the old data as per current version requirement and updates the database
 func MigrateServices(cntx context.Context, data []byte) string {
 	var vs VoltService
 	var updatedData, updatedData1 []byte
@@ -339,15 +337,14 @@
 
 	if vsmap["MacLearning"] == true {
 		vs.MacLearning = Learn
-
 	}
 
-	//Migration
+	// Migration
 	vs.PendingFlows = make(map[string]bool)
 	vs.AssociatedFlows = make(map[string]bool)
 	vs.DeleteInProgress = false
 	vs.PonPort = 0xFF
-	if updatedData, err = vs.JsonMarshal(); err != nil {
+	if updatedData, err = vs.JSONMarshal(); err != nil {
 		logger.Warnw(ctx, "Marshal of Service failed", log.Fields{"Error": err.Error()})
 		return ""
 	}
@@ -355,45 +352,44 @@
 	return string(updatedData)
 }
 
-//MigrateDevices modifyies the old data as per current version requirement and updates the database
+// MigrateDevices modifyies the old data as per current version requirement and updates the database
 func MigrateDevices(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for Devices")
 	return ""
 }
 
-//MigrateDevicePorts modifyies the old data as per current version requirement and updates the database
+// MigrateDevicePorts modifyies the old data as per current version requirement and updates the database
 func MigrateDevicePorts(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for Ports")
 	return ""
 }
 
-//MigrateDeviceFlows modifyies the old data as per current version requirement and updates the database
+// MigrateDeviceFlows modifyies the old data as per current version requirement and updates the database
 func MigrateDeviceFlows(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for Flows")
 	return ""
 }
 
-//MigrateDeviceGroups modifyies the old data as per current version requirement and updates the database
+// MigrateDeviceGroups modifyies the old data as per current version requirement and updates the database
 func MigrateDeviceGroups(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for Groups")
 	return ""
 }
 
-//MigrateDeviceMeters modifyies the old data as per current version requirement and updates the database
+// MigrateDeviceMeters modifyies the old data as per current version requirement and updates the database
 func MigrateDeviceMeters(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for Meters")
 	return ""
 }
 
-//MigrateDeviceFlowHash modifyies the old data as per current version requirement and updates the database
+// MigrateDeviceFlowHash modifyies the old data as per current version requirement and updates the database
 func MigrateDeviceFlowHash(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for FlowHash")
 	return ""
 }
 
-//MigrateVnets modifyies the old data as per current version requirement and updates the database
+// MigrateVnets modifyies the old data as per current version requirement and updates the database
 func MigrateVnets(cntx context.Context, data []byte) string {
-
 	var vnet VoltVnet
 	var updatedData []byte
 
@@ -414,7 +410,7 @@
 	}
 	vnet.PendingDeleteFlow = make(map[string]map[string]bool)
 	vnet.DeleteInProgress = false
-	if updatedData, err = vnet.JsonMarshal(); err != nil {
+	if updatedData, err = vnet.JSONMarshal(); err != nil {
 		logger.Warnw(ctx, "Marshal of Vnet failed", log.Fields{"Error": err.Error()})
 		return ""
 	}
@@ -422,7 +418,7 @@
 	return string(updatedData)
 }
 
-//MigrateVpvs modifyies the old data as per current version requirement and updates the database
+// MigrateVpvs modifyies the old data as per current version requirement and updates the database
 func MigrateVpvs(cntx context.Context, data []byte) string {
 	var vpv VoltPortVnet
 	var updatedData, updatedData1 []byte
@@ -443,12 +439,10 @@
 
 	if err2 := json.Unmarshal(updatedData1, &vpv); err != nil {
 		logger.Warnw(ctx, "Unmarshal-failed", log.Fields{"err": err2})
-
 	}
 
 	if vpvmap["MacLearning"] == true {
 		vpv.MacLearning = Learn
-
 	}
 	if vpvmap["UsFlowsApplied"] == true {
 		usFlowsApplied = true
@@ -461,7 +455,7 @@
 	if usFlowsApplied && dsFlowsApplied {
 		vpv.FlowsApplied = true
 	}
-	//Migration
+	// Migration
 	if vpv.SVlanTpid == 0 {
 		vpv.SVlanTpid = layers.EthernetTypeDot1Q
 	}
@@ -469,16 +463,16 @@
 	vpv.PendingDeleteFlow = make(map[string]bool)
 	vpv.PonPort = 0xFF
 
-	if updatedData, err = vpv.JsonMarshal(); err != nil {
+	if updatedData, err = vpv.JSONMarshal(); err != nil {
 		logger.Warnw(ctx, "Marshal of VPV failed", log.Fields{"Error": err.Error()})
 		return ""
 	}
 	logger.Infow(ctx, "VPV Migrated", log.Fields{"Device": vpv.Device, "port": vpv.Port, "SVlan": vpv.SVlan,
-			"CVlan": vpv.CVlan, "UniVlan": vpv.UniVlan, "PresentVersion": database.PresentVersionMap[database.VpvPath]})
+		"CVlan": vpv.CVlan, "UniVlan": vpv.UniVlan, "PresentVersion": database.PresentVersionMap[database.VpvPath]})
 	return string(updatedData)
 }
 
-//MigrateMvlans modifyies the old data as per current version requirement and updates the database
+// MigrateMvlans modifyies the old data as per current version requirement and updates the database
 func MigrateMvlans(cntx context.Context, data []byte) string {
 	var mvp MvlanProfile
 	var updatedData []byte
@@ -495,7 +489,7 @@
 		mvp.IgmpServVersion[srNo] = &servVersion
 	}
 
-	if updatedData, err = mvp.JsonMarshal(); err != nil {
+	if updatedData, err = mvp.JSONMarshal(); err != nil {
 		logger.Warnw(ctx, "Marshal of Mvlan Profile failed", log.Fields{"Error": err.Error()})
 		return ""
 	}
@@ -503,13 +497,13 @@
 	return string(updatedData)
 }
 
-//MigrateMeters modifyies the old data as per current version requirement and updates the database
+// MigrateMeters modifyies the old data as per current version requirement and updates the database
 func MigrateMeters(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for Meters")
 	return ""
 }
 
-//MigrateIgmpConfs modifyies the old data as per current version requirement and updates the database
+// MigrateIgmpConfs modifyies the old data as per current version requirement and updates the database
 func MigrateIgmpConfs(cntx context.Context, data []byte) string {
 	var igmpProfile IgmpProfile
 
@@ -526,85 +520,85 @@
 	return ModuleToBeDeleted
 }
 
-//MigrateIgmpGroups modifyies the old data as per current version requirement and updates the database
+// MigrateIgmpGroups modifyies the old data as per current version requirement and updates the database
 func MigrateIgmpGroups(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for IGMP Groups")
 	return ""
 }
 
-//MigrateIgmpDevices modifyies the old data as per current version requirement and updates the database
+// MigrateIgmpDevices modifyies the old data as per current version requirement and updates the database
 func MigrateIgmpDevices(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for IGMP Device")
 	return ""
 }
 
-//MigrateIgmpChannels modifyies the old data as per current version requirement and updates the database
+// MigrateIgmpChannels modifyies the old data as per current version requirement and updates the database
 func MigrateIgmpChannels(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for IGMP Channels")
 	return ""
 }
 
-//MigrateIgmpPorts modifyies the old data as per current version requirement and updates the database
+// MigrateIgmpPorts modifyies the old data as per current version requirement and updates the database
 func MigrateIgmpPorts(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for IGMP Ports")
 	return ""
 }
 
-//MigrateIgmpProfs modifyies the old data as per current version requirement and updates the database
+// MigrateIgmpProfs modifyies the old data as per current version requirement and updates the database
 func MigrateIgmpProfs(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for IGMP Profs")
 	return ""
 }
 
-//MigrateMcastConfs modifyies the old data as per current version requirement and updates the database
+// MigrateMcastConfs modifyies the old data as per current version requirement and updates the database
 func MigrateMcastConfs(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for Mcast Confs")
 	return ""
 }
 
-//MigrateLogLevels modifyies the old data as per current version requirement and updates the database
+// MigrateLogLevels modifyies the old data as per current version requirement and updates the database
 func MigrateLogLevels(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for Log Levels")
 	return ""
 }
 
-//MigrateHealth modifyies the old data as per current version requirement and updates the database
+// MigrateHealth modifyies the old data as per current version requirement and updates the database
 func MigrateHealth(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for Health")
 	return ""
 }
 
-//MigratePonCounters modifyies the old data as per current version requirement and updates the database
+// MigratePonCounters modifyies the old data as per current version requirement and updates the database
 func MigratePonCounters(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for Pon Counters")
 	return ""
 }
 
-//MigrateChannelCounters modifyies the old data as per current version requirement and updates the database
+// MigrateChannelCounters modifyies the old data as per current version requirement and updates the database
 func MigrateChannelCounters(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for Channel Counters")
 	return ""
 }
 
-//MigrateServiceCounters modifyies the old data as per current version requirement and updates the database
+// MigrateServiceCounters modifyies the old data as per current version requirement and updates the database
 func MigrateServiceCounters(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for Service Counters")
 	return ""
 }
 
-//MigrateNbDevices modifyies the old data as per current version requirement and updates the database
+// MigrateNbDevices modifyies the old data as per current version requirement and updates the database
 func MigrateNbDevices(cntx context.Context, data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for NB Devices")
 	return ""
 }
 
-//MigrateFlowHash modifyies the old data as per current version requirement and updates the database
+// MigrateFlowHash modifyies the old data as per current version requirement and updates the database
 func MigrateFlowHash(data []byte) string {
 	logger.Error(ctx, "Data Migration not implemented for FLow Hash")
 	return ""
 }
 
-//DeleteDbPathKeys Deleted the paths from DB
+// DeleteDbPathKeys Deleted the paths from DB
 func DeleteDbPathKeys(cntx context.Context, keyPath string) error {
 	logger.Debugw(ctx, "Deleting paths for version", log.Fields{"Path": keyPath})
 
diff --git a/internal/pkg/application/meters.go b/internal/pkg/application/meters.go
index 276fe99..2592be5 100644
--- a/internal/pkg/application/meters.go
+++ b/internal/pkg/application/meters.go
@@ -16,13 +16,13 @@
 package application
 
 import (
+	"context"
 	"encoding/json"
 	"errors"
-	"context"
 	"sync"
 
-	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"
 )
@@ -72,13 +72,13 @@
 // The ID is generated by the VOLT application
 type VoltMeter struct {
 	Name               string
+	Version            string
 	ID                 uint32
 	Fir                uint32
 	Air                uint32
 	Eir                uint32
 	BurstSize          uint32
 	AssociatedServices uint32
-	Version            string
 	Cir                uint32
 	Cbs                uint32
 	Pir                uint32
@@ -162,7 +162,7 @@
 		vm.Air = 0
 	}
 
-	//Set Pir & Pbs
+	// Set Pir & Pbs
 	var pir uint32
 	var pbs uint32
 	if vm.Pir != 0 {
@@ -186,7 +186,7 @@
 	logger.Infow(ctx, "Meter Config", log.Fields{"Cir": vm.Cir, "Air": vm.Air, "Pir": vm.Pir, "Gir": vm.Gir, "Eir": vm.Eir})
 	logger.Infow(ctx, "Meter Burst Config", log.Fields{"Cbs": vm.Cbs, "Pbs": vm.Pbs})
 	logger.Infow(ctx, "Meter Burst Oper", log.Fields{"Pir": pir, "Pbs": pbs})
-	//Set Air
+	// Set Air
 	// Air is used in place of Gir only if Gir is
 	// not present and Air is not 0
 	if vm.Air != 0 {
@@ -243,7 +243,6 @@
 
 // AddMeterProf to add the meter profile name as key
 func (va *VoltApplication) AddMeterProf(cntx context.Context, cfg VoltMeter) {
-
 	mm := &va.MeterMgr
 	if _, ok := mm.GetMeterByName(cfg.Name); ok {
 		logger.Warnw(ctx, "Meter profile exists", log.Fields{"Name": cfg.Name})
@@ -251,8 +250,8 @@
 	}
 
 	mm.LastMeterID++
-	//FIX-ME: Hardcoded the meter-id temp till meter delete is introduced
-	//Restriction: Only one meter profile should be used across all services
+	// FIX-ME: Hardcoded the meter-id temp till meter delete is introduced
+	// Restriction: Only one meter profile should be used across all services
 	//	id := uint32(1) //mm.LastMeterId
 	id := mm.LastMeterID
 	cfg.ID = id
@@ -295,7 +294,6 @@
 
 // DeleteFromDevice to delete meter from the device
 func (vm *VoltMeter) DeleteFromDevice(port string, device string) {
-
 	meter := of.NewMeter(vm.ID)
 
 	logger.Debugw(ctx, "Delete meter from device", log.Fields{"Id": vm.ID, "meter": *meter})
@@ -317,7 +315,7 @@
 			log.Fields{"MeterProfile": name, "serviceCount": cfg.AssociatedServices})
 		return errors.New("Service reference is not 0")
 	}
-	//TODO : delete from all devices
+	// TODO : delete from all devices
 	delmeterFromDevice := func(key interface{}, value interface{}) bool {
 		device := key.(string)
 		port, _ := GetApplication().GetNniPort(device)
@@ -326,7 +324,7 @@
 	}
 	va.DevicesDisc.Range(delmeterFromDevice)
 	cfg.DelFromDb(cntx)
-	//Delete meter from device will be invoked by caller separately
+	// Delete meter from device will be invoked by caller separately
 	mm.DelMeter(cfg)
 	return nil
 }
diff --git a/internal/pkg/application/minor_upgrade.go b/internal/pkg/application/minor_upgrade.go
index a0bba15..4d6b3d6 100644
--- a/internal/pkg/application/minor_upgrade.go
+++ b/internal/pkg/application/minor_upgrade.go
@@ -16,21 +16,22 @@
 package application
 
 import (
-	"errors"
 	"context"
+	"errors"
 	"net"
-	"voltha-go-controller/internal/pkg/types"
 
 	"strings"
 
-	"github.com/google/gopacket/layers"
 	"voltha-go-controller/database"
+	common "voltha-go-controller/internal/pkg/types"
 	"voltha-go-controller/log"
+
+	"github.com/google/gopacket/layers"
 )
 
 type paramsUpdationFunc func(cntx context.Context, hash string, value interface{}) error
 
-//map to store conversion functions
+// map to store conversion functions
 var updationMap = map[string]paramsUpdationFunc{
 	database.VnetPath:       updateVnets,
 	database.VpvPath:        updateVpvs,
@@ -53,43 +54,42 @@
 	return nil
 }
 
-//This function modifyies the old data as per current version requirement and also
-//returns the new path on which the modified data has to be written
+// This function modifyies the old data as per current version requirement and also
+// returns the new path on which the modified data has to be written
 func updateServices(cntx context.Context, hash string, value interface{}) error {
 	param := value.(*VoltService)
 	param.VnetID = VnetKey(param.SVlan, param.CVlan, param.UniVlan)
 	return nil
 }
 
-//This function modifyies the old data as per current version requirement and also
-//returns the new path on which the modified data has to be written
+// This function modifyies the old data as per current version requirement and also
+// returns the new path on which the modified data has to be written
 func updateVnets(cntx context.Context, hash string, value interface{}) error {
 	param := value.(*VoltVnet)
 	newKey := VnetKey(param.SVlan, param.CVlan, param.UniVlan)
 	if newKey != hash {
-		//Delete the older key
+		// Delete the older key
 		_ = db.DelVnet(cntx, hash)
 	} else {
-		//Update SVlan Tag Protocol id param with default valud if not present
+		// Update SVlan Tag Protocol id param with default valud if not present
 		if param.SVlanTpid == 0 {
 			param.SVlanTpid = layers.EthernetTypeDot1Q
 		}
 	}
 	param.Name = newKey
 	if param.DevicesList == nil || len(param.DevicesList) == 0 {
-		param.DevicesList = append(param.DevicesList, "") //Empty OLT serial number as of now since submgr won't have proper serial num
+		param.DevicesList = append(param.DevicesList, "") // Empty OLT serial number as of now since submgr won't have proper serial num
 	}
 	return nil
 }
 
-//This function modifyies the old data as per current version requirement and also
-//returns the new path on which the modified data has to be written
+// This function modifyies the old data as per current version requirement and also
+// returns the new path on which the modified data has to be written
 func updateVpvs(cntx context.Context, hash string, value interface{}) error {
-
 	//var param VoltPortVnet
 	param := value.(*VoltPortVnet)
 
-	//Update SVlan Tag Protocol id param with default valud if not present
+	// Update SVlan Tag Protocol id param with default valud if not present
 	if param.SVlanTpid == 0 {
 		param.SVlanTpid = layers.EthernetTypeDot1Q
 	}
@@ -99,9 +99,9 @@
 		return nil
 	}
 
-	//Add the vpv under new path
+	// Add the vpv under new path
 	param.WriteToDb(cntx)
-	//delete the older path
+	// delete the older path
 	fullPath := database.BasePath + database.VpvPath + hash
 	if err := db.Del(cntx, fullPath); err != nil {
 		logger.Errorw(ctx, "Vpv Delete from DB failed", log.Fields{"Error": err, "key": fullPath})
@@ -112,11 +112,10 @@
 func updateMvlans(cntx context.Context, hash string, value interface{}) error {
 	param := value.(*MvlanProfile)
 	if param.DevicesList == nil || len(param.DevicesList) == 0 {
-		param.DevicesList = make(map[string]OperInProgress) //Empty OLT serial number as of now since submgr won't have proper serial num
+		param.DevicesList = make(map[string]OperInProgress) // Empty OLT serial number as of now since submgr won't have proper serial num
 		if err := param.WriteToDb(cntx); err != nil {
 			logger.Errorw(ctx, "Mvlan profile write to DB failed", log.Fields{"ProfileName": param.Name})
 		}
-
 	}
 	if _, ok := param.Groups[common.StaticGroup]; ok {
 		param.Groups[common.StaticGroup].IsStatic = true
@@ -124,10 +123,9 @@
 	return nil
 }
 
-//This function modifyies the old Igmp Group data as per current version requirement and also
-//returns the new path on which the modified data has to be written
+// This function modifyies the old Igmp Group data as per current version requirement and also
+// returns the new path on which the modified data has to be written
 func updateIgmpGroups(cntx context.Context, hash string, value interface{}) error {
-
 	ig := value.(*IgmpGroup)
 	logger.Infow(ctx, "Group Data Migration", log.Fields{"ig": ig, "GroupAddr": ig.GroupAddr, "hash": hash})
 	if ig.GroupAddr == nil {
@@ -140,8 +138,8 @@
 	return nil
 }
 
-//This function modifyies the old Igmp  Device data as per current version requirement and also
-//returns the new path on which the modified data has to be written
+// This function modifyies the old Igmp  Device data as per current version requirement and also
+// returns the new path on which the modified data has to be written
 func updateIgmpDevices(cntx context.Context, hash string, value interface{}) error {
 	igd := value.(*IgmpGroupDevice)
 	logger.Infow(ctx, "Group Device Migration", log.Fields{"igd": igd, "GroupAddr": igd.GroupAddr, "hash": hash})
@@ -150,14 +148,14 @@
 	}
 	if err := igd.WriteToDb(cntx); err != nil {
 		logger.Errorw(ctx, "Igmp group device Write to DB failed", log.Fields{"Device": igd.Device,
-					"GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
+			"GroupName": igd.GroupName, "GroupAddr": igd.GroupAddr.String()})
 	}
 
 	return nil
 }
 
-//This function modifyies the old Igmp  Profile data as per current version requirement and also
-//returns the new path on which the modified data has to be written
+// This function modifyies the old Igmp  Profile data as per current version requirement and also
+// returns the new path on which the modified data has to be written
 func updateIgmpProfiles(cntx context.Context, hash string, value interface{}) error {
 	igmpProfile := value.(*IgmpProfile)
 	logger.Infow(ctx, "IGMP Profile Migration", log.Fields{"igmpProfile": igmpProfile, "hash": hash})
@@ -165,7 +163,6 @@
 }
 
 func (ig *IgmpGroup) migrateIgmpDevices(cntx context.Context) {
-
 	devices, _ := db.GetPrevIgmpDevices(cntx, ig.Mvlan, ig.GroupName)
 	logger.Infow(ctx, "Migratable Devices", log.Fields{"Devices": devices})
 	for _, device := range devices {
@@ -192,11 +189,9 @@
 }
 
 func (igd *IgmpGroupDevice) migrateIgmpChannels(cntx context.Context) {
-
 	channels, _ := db.GetPrevIgmpChannels(cntx, igd.GroupName, igd.Device)
 	logger.Infow(ctx, "Migratable Channels", log.Fields{"Channels": channels})
 	for _, channel := range channels {
-
 		b, ok := channel.Value.([]byte)
 		if !ok {
 			logger.Warn(ctx, "The value type is not []byte")
@@ -220,11 +215,9 @@
 }
 
 func (igc *IgmpGroupChannel) migrateIgmpPorts(cntx context.Context) {
-
 	ports, _ := db.GetPrevIgmpRcvrs(cntx, igc.GroupAddr, igc.Device)
 	logger.Infow(ctx, "Migratable Ports", log.Fields{"Ports": ports})
 	for _, port := range ports {
-
 		b, ok := port.Value.([]byte)
 		if !ok {
 			logger.Warn(ctx, "The value type is not []byte")
diff --git a/internal/pkg/application/pppoeia.go b/internal/pkg/application/pppoeia.go
index 2d50033..8b62760 100644
--- a/internal/pkg/application/pppoeia.go
+++ b/internal/pkg/application/pppoeia.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
 
@@ -87,9 +87,9 @@
 // to the network. It supports two VLANs as its identify. If a single VLAN or
 // no VLAN is to be used, those two should be passed as 4096 (VlanNone)
 type PppoeIaRelayVnet struct {
+	sessions  *util.ConcurrentMap //map[[6]byte]IPppoeIaSession
 	OuterVlan uint16
 	InnerVlan uint16
-	sessions  *util.ConcurrentMap //map[[6]byte]IPppoeIaSession
 }
 
 // PppoeIaNetworks : PppoeIa Networks hosts different PppoeIa networks that in turn hold the PppoeIa
@@ -154,7 +154,6 @@
 
 // delPppoeIaSessions to delete pppoeia sessions
 func delPppoeIaSessions(addr net.HardwareAddr, outervlan of.VlanType, innervlan of.VlanType) {
-
 	var key [6]byte
 	if addr == nil || !NonZeroMacAddress(addr) {
 		logger.Warnw(ctx, "Invalid MAC address", log.Fields{"Addr": addr})
@@ -184,7 +183,6 @@
 
 // GetVnetForNni to get vnet for nni port
 func GetVnetForNni(addr net.HardwareAddr, cvlan of.VlanType, svlan of.VlanType, pbit uint8) (*VoltPortVnet, error) {
-
 	var err error
 	var session IPppoeIaSession
 	logger.Infow(ctx, "Mac Obtained MAC: ", log.Fields{"Addr": addr})
@@ -217,7 +215,6 @@
 // into the packet. This happens as the request is relayed to the
 // PppoeIa servers on the NNI
 func AddIaOption(svc *VoltService, pppoe *layers.PPPoE) {
-
 	//NOTE : both cID and rID should not be empty if this function is called
 	var data []byte
 	cID := svc.GetCircuitID()
@@ -281,7 +278,6 @@
 // common map. The key for retrieval includes the VLAN tags in the
 // the packet and the MAC address of the client.
 func (va *VoltApplication) ProcessDsPppoeIaPacket(cntx context.Context, device string, port string, pkt gopacket.Packet) {
-
 	// Retrieve the layers to build the outgoing packet. It is not
 	// possible to add/remove layers to the existing packet and thus
 	// the lyayers are extracted to build the outgoing packet
@@ -433,7 +429,7 @@
 	}
 
 	if vpv.PppoeIa {
-		//Maintain the session MAC as learnt MAC, since MAC is required for deletion of PPPoE session
+		// Maintain the session MAC as learnt MAC, since MAC is required for deletion of PPPoE session
 		if msgType == layers.PPPoECodePADI || msgType == layers.PPPoECodePADR {
 			if !util.MacAddrsMatch(vpv.MacAddr, eth.SrcMAC) {
 				expectedPort := va.GetMacInPortMap(eth.SrcMAC)
@@ -517,7 +513,6 @@
 	if err := cntlr.GetController().PacketOutReq(device, outport, port, buff.Bytes(), false); err != nil {
 		logger.Warnw(ctx, "PacketOutReq Failed", log.Fields{"Device": device, "Error": err})
 	}
-
 }
 
 // ProcessPPPoEIaPacket to process Pppoeia packet
@@ -572,12 +567,12 @@
 
 // PppoeIaPacketTask : Task to add or delete flows of a service
 type PppoeIaPacketTask struct {
-	taskID    uint8
 	ctx       context.Context
 	pkt       gopacket.Packet
 	device    string
 	port      string
 	timestamp string
+	taskID    uint8
 }
 
 // NewPppoeIaPacketTask constructor for PppoeIaPacketTask
diff --git a/internal/pkg/application/service.go b/internal/pkg/application/service.go
index e129b48..e6e81c3 100644
--- a/internal/pkg/application/service.go
+++ b/internal/pkg/application/service.go
@@ -51,106 +51,102 @@
 // UniVlan -	The VLAN of the packets entering the UNI of ONU
 // CVlan -	The VLAN to transalate to/from on the PON link
 // SVlan -	The outer VLAN to be used on the NNI of OLT.
-//       -	In general, 4096 is used as NO VLAN for all the above
-// SVlanTpid - SVlan Tag Protocl Identifier
+// -	In general, 4096 is used as NO VLAN for all the above
+// SVlanTpid - SVlan Tag Protocol Identifier
 // Pbits -      Each bit of uint8 represents one p-bit. MSB is pbit 7
 // DhcpRelay -	Whether it is turned on/off
 // CircuitId -	The circuit id to be used with DHCP relay. Unused otherwise
 // RemoveId - 	Same as above
 // Port -	The access port for the service. Each service has a single access
-//		port. The converse is not always true
+// port. The converse is not always true
 // MacLearning - If MAC learning is turned on, the MAC address learned from the
-//		the service activation is used in programming flows
+// the service activation is used in programming flows
 // MacAddress -	The MAC hardware address learnt on the UNI interface
 // MacAddresses - Not yet implemented. To be used to learn more MAC addresses
 type VoltServiceCfg struct {
-	Name                       string
-	UniVlan                    of.VlanType
-	CVlan                      of.VlanType
-	SVlan                      of.VlanType
-	SVlanTpid                  layers.EthernetType
-	MacAddr                    net.HardwareAddr
 	Pbits                      []of.PbitType
-	UsPonCTagPriority          of.PbitType
-	UsPonSTagPriority          of.PbitType
-	DsPonCTagPriority          of.PbitType
-	DsPonSTagPriority          of.PbitType
-	DsRemarkPbitsMap           map[int]int // Ex: Remark case {0:0,1:0} and No-remark case {1:1}
-	TechProfileID              uint16
+	Name                       string
 	CircuitID                  string
-	RemoteID                   []byte
 	Port                       string
-	PonPort                    uint32
-	MacLearning                MacLearningType
-	IsOption82Disabled         bool
-	IgmpEnabled                bool
-	McastService               bool
-	ONTEtherTypeClassification int
-	VlanControl                VlanControl
 	UsMeterProfile             string
 	DsMeterProfile             string
 	AggDsMeterProfile          string
 	VnetID                     string
 	MvlanProfileName           string
 	RemoteIDType               string
-	SchedID                    int
-	AllowTransparent           bool
-	EnableMulticastKPI         bool
 	DataRateAttr               string
+	ServiceType                string
+	DsRemarkPbitsMap           map[int]int // Ex: Remark case {0:0,1:0} and No-remark case {1:1}
+	RemoteID                   []byte
+	MacAddr                    net.HardwareAddr
+	ONTEtherTypeClassification int
+	SchedID                    int
+	Trigger                    ServiceTrigger
+	MacLearning                MacLearningType
+	PonPort                    uint32
 	MinDataRateUs              uint32
 	MinDataRateDs              uint32
 	MaxDataRateUs              uint32
 	MaxDataRateDs              uint32
+	TechProfileID              uint16
+	SVlanTpid                  layers.EthernetType
+	UniVlan                    of.VlanType
+	CVlan                      of.VlanType
+	SVlan                      of.VlanType
+	UsPonCTagPriority          of.PbitType
+	UsPonSTagPriority          of.PbitType
+	DsPonSTagPriority          of.PbitType
+	DsPonCTagPriority          of.PbitType
+	VlanControl                VlanControl
+	IsOption82Disabled         bool
+	IgmpEnabled                bool
+	McastService               bool
+	AllowTransparent           bool
+	EnableMulticastKPI         bool
 	IsActivated                bool
-	Trigger                    ServiceTrigger
-	ServiceType                string
 }
 
 // VoltServiceOper structure
 type VoltServiceOper struct {
+	Metadata        interface{}
+	PendingFlows    map[string]bool
+	AssociatedFlows map[string]bool
+	BwAvailInfo     string
 	//MacLearning  bool
 	//MacAddr      net.HardwareAddr
-	Device   string
-	Ipv4Addr net.IP
-	Ipv6Addr net.IP
-
-	UsMeterID    uint32
-	DsMeterID    uint32
-	AggDsMeterID uint32
-
-	//Multiservice-Fix
+	Device           string
+	Ipv4Addr         net.IP
+	Ipv6Addr         net.IP
+	ServiceLock      sync.RWMutex `json:"-"`
+	UsMeterID        uint32
+	DsMeterID        uint32
+	AggDsMeterID     uint32
+	UpdateInProgress bool
+	DeleteInProgress bool
+	ForceDelete      bool
+	// Multiservice-Fix
 	UsHSIAFlowsApplied bool
 	DsHSIAFlowsApplied bool
 	UsDhcpFlowsApplied bool
 	DsDhcpFlowsApplied bool
 	IgmpFlowsApplied   bool
 	Icmpv6FlowsApplied bool
-
-	ServiceLock      sync.RWMutex `json:"-"`
-	PendingFlows     map[string]bool
-	AssociatedFlows  map[string]bool
-	DeleteInProgress bool
-	ForceDelete      bool
-	BwAvailInfo      string
-
-	UpdateInProgress bool
-	Metadata         interface{}
 }
 
 // VoltService structure
 type VoltService struct {
-	VoltServiceCfg
 	VoltServiceOper
 	Version string
+	VoltServiceCfg
 }
 
-//ServiceTrigger - Service activation trigger
+// ServiceTrigger - Service activation trigger
 type ServiceTrigger int
 
 const (
-	//NBActivate - Service added due to NB Action
+	// NBActivate - Service added due to NB Action
 	NBActivate ServiceTrigger = 0
-	//ServiceVlanUpdate - Service added due to Svlan Update
+	// ServiceVlanUpdate - Service added due to Svlan Update
 	ServiceVlanUpdate ServiceTrigger = 1
 )
 
@@ -160,7 +156,7 @@
 	VnetMutex        sync.Mutex `json:"-"`
 }
 
-//MigrateServiceMetadata - migrate services request metadata
+// MigrateServiceMetadata - migrate services request metadata
 type MigrateServiceMetadata struct {
 	NewVnetID string
 	RequestID string
@@ -188,7 +184,6 @@
 
 // WriteToDb commit a service to the DB if service delete is not in-progress
 func (vs *VoltService) WriteToDb(cntx context.Context) {
-
 	vs.ServiceLock.RLock()
 	defer vs.ServiceLock.RUnlock()
 
@@ -199,7 +194,7 @@
 	vs.ForceWriteToDb(cntx)
 }
 
-//ForceWriteToDb force commit a service to the DB
+// ForceWriteToDb force commit a service to the DB
 func (vs *VoltService) ForceWriteToDb(cntx context.Context) {
 	b, err := json.Marshal(vs)
 
@@ -220,8 +215,8 @@
 // DelFromDb delete a service from DB
 func (vs *VoltService) DelFromDb(cntx context.Context) {
 	logger.Debugw(ctx, "Deleting Service from DB", log.Fields{"Name": vs.Name})
-	//TODO - Need to understand and delete the second call
-	//Calling twice has worked though don't know why
+	// TODO - Need to understand and delete the second call
+	// Calling twice has worked though don't know why
 	_ = db.DelService(cntx, vs.Name)
 	_ = db.DelService(cntx, vs.Name)
 }
@@ -277,7 +272,7 @@
 	}
 }
 
-//DelHsiaFlows - Deletes US & DS HSIA Flows for the service
+// DelHsiaFlows - Deletes US & DS HSIA Flows for the service
 func (vs *VoltService) DelHsiaFlows(cntx context.Context) {
 	if err := vs.DelUsHsiaFlows(cntx); err != nil {
 		statusCode, statusMessage := infraerrorCodes.GetErrorInfo(err)
@@ -311,7 +306,6 @@
 
 // AddUsHsiaFlows - Add US HSIA Flows for the service
 func (vs *VoltService) AddUsHsiaFlows(cntx context.Context) error {
-
 	if vs.DeleteInProgress || vs.UpdateInProgress {
 		logger.Errorw(ctx, "Ignoring US HSIA Flow Push, Service deleteion In-Progress", log.Fields{"Device": vs.Device, "Service": vs.Name})
 		return nil
@@ -331,14 +325,14 @@
 
 		vs.Device = device.Name
 		/* In case of DPU_MGMT_TRAFFIC the meters will be configured before US flow creation*/
-		if vs.ServiceType != DPU_MGMT_TRAFFIC {
+		if vs.ServiceType != DpuMgmtTraffic {
 			va.AddMeterToDevice(vs.Port, device.Name, vs.UsMeterID, 0)
 			va.AddMeterToDevice(vs.Port, device.Name, vs.DsMeterID, vs.AggDsMeterID)
 		}
 		logger.Infow(ctx, "Adding HSIA flows", log.Fields{"Name": vs.Name})
 		pBits := vs.Pbits
 
-		//If no pbits configured for service, hence add PbitNone for flows
+		// If no pbits configured for service, hence add PbitNone for flows
 		if len(vs.Pbits) == 0 {
 			pBits = append(pBits, PbitMatchNone)
 		}
@@ -441,7 +435,6 @@
 
 // DelUsHsiaFlows - Deletes US HSIA Flows for the service
 func (vs *VoltService) DelUsHsiaFlows(cntx context.Context) error {
-
 	logger.Infow(ctx, "Removing US HSIA Services", log.Fields{"Services": vs.Name})
 	if vs.UsHSIAFlowsApplied || vgcRebooted {
 		device, err := GetApplication().GetDeviceFromPort(vs.Port)
@@ -453,7 +446,7 @@
 		logger.Infow(ctx, "Removing HSIA flows", log.Fields{"Name": vs.Name})
 		pBits := vs.Pbits
 
-		//If no pbits configured for service, hence add PbitNone for flows
+		// If no pbits configured for service, hence add PbitNone for flows
 		if len(vs.Pbits) == 0 {
 			pBits = append(pBits, PbitMatchNone)
 		}
@@ -479,7 +472,6 @@
 
 // DelDsHsiaFlows - Deletes DS HSIA Flows for the service
 func (vs *VoltService) DelDsHsiaFlows(cntx context.Context) error {
-
 	logger.Infow(ctx, "Removing DS HSIA Services", log.Fields{"Services": vs.Name})
 	if vs.DsHSIAFlowsApplied || vgcRebooted {
 		device, err := GetApplication().GetDeviceFromPort(vs.Port)
@@ -490,7 +482,7 @@
 
 		logger.Infow(ctx, "Removing HSIA flows", log.Fields{"Name": vs.Name})
 		var matchPbit int
-		//If no pbits configured for service, hence add PbitNone for flows
+		// If no pbits configured for service, hence add PbitNone for flows
 		if len(vs.DsRemarkPbitsMap) == 0 {
 			dsflows, err := vs.BuildDsHsiaFlows(of.PbitType(PbitMatchNone))
 			if err != nil {
@@ -531,7 +523,7 @@
 		}
 		vs.DsHSIAFlowsApplied = false
 	}
-	logger.Infow(ctx, "Deleted HSIA DS flows from DB successfuly", log.Fields{"ServiceName": vs.Name})
+	logger.Infow(ctx, "Deleted HSIA DS flows from DB successfully", log.Fields{"ServiceName": vs.Name})
 	// Post HSIA configuration success indication on message bus
 	vs.WriteToDb(cntx)
 	return nil
@@ -563,7 +555,7 @@
 	remarkPbit, remarkExists := vs.DsRemarkPbitsMap[int(pbits)]
 
 	generateDSCookie := func(vlan of.VlanType, valToShift uint64) uint64 {
-		//| 12-bit cvlan/UniVlan | 4 bits action pbit | <32-bits uniport>| 16-bits HSIA mask OR flow mask OR pbit |
+		// | 12-bit cvlan/UniVlan | 4 bits action pbit | <32-bits uniport>| 16-bits HSIA mask OR flow mask OR pbit |
 		cookie := uint64(vlan)<<52 + uint64(actnPbit)<<48 + uint64(outport)<<16 | of.HsiaFlowMask
 		cookie = cookie | of.DsFlowMask
 		cookie = cookie + (valToShift << 4) + uint64(pbits)
@@ -652,7 +644,7 @@
 			"subflow": subflow1})
 	}
 
-	//Add Table-1 flow that deals with inner VLAN at the ONU
+	// Add Table-1 flow that deals with inner VLAN at the ONU
 	{
 		subflow2 := of.NewVoltSubFlow()
 		subflow2.SetTableID(1)
@@ -736,10 +728,10 @@
 		subflow1.SetGoToTable(1)
 		subflow1.SetInPort(inport)
 
-		if vs.ServiceType == DPU_MGMT_TRAFFIC {
+		if vs.ServiceType == DpuMgmtTraffic {
 			subflow1.SetMatchPbit(vs.UsPonCTagPriority)
 			subflow1.SetPcp(vs.UsPonSTagPriority)
-		} else if vs.ServiceType == DPU_ANCP_TRAFFIC {
+		} else if vs.ServiceType == DpuAncpTraffic {
 			subflow1.SetPcp(vs.UsPonSTagPriority)
 		}
 		if err := vs.setUSMatchActionVlanT0(subflow1); err != nil {
@@ -773,7 +765,7 @@
 		logger.Infow(ctx, "Building upstream HSIA flow for T0", log.Fields{"cookie": subflow1.Cookie, "subflow": subflow1})
 	}
 
-	//Add Table-1 flow that deals with the outer vlan in pOLT
+	// Add Table-1 flow that deals with the outer vlan in pOLT
 	{
 		subflow2 := of.NewVoltSubFlow()
 		subflow2.SetTableID(1)
@@ -782,7 +774,7 @@
 		if err := vs.setUSMatchActionVlanT1(subflow2); err != nil {
 			return nil, err
 		}
-		if vs.ServiceType == DPU_MGMT_TRAFFIC {
+		if vs.ServiceType == DpuMgmtTraffic {
 			subflow2.SetMatchSrcMac(vs.MacAddr)
 		}
 		subflow2.SetInPort(inport)
@@ -817,7 +809,7 @@
 }
 
 func (vs *VoltService) generateUSCookie(vlan of.VlanType, valToShift uint64, inport uint32, pbits of.PbitType) uint64 {
-	//| 12-bit cvlan/UniVlan | 4 bits empty | <32-bits uniport>| 16-bits HSIA mask OR flow mask OR pbit |
+	// | 12-bit cvlan/UniVlan | 4 bits empty | <32-bits uniport>| 16-bits HSIA mask OR flow mask OR pbit |
 	cookie := uint64(vlan)<<52 + uint64(inport)<<16 | of.HsiaFlowMask
 	cookie = cookie | of.UsFlowMask
 	cookie = cookie + (valToShift << 4) + uint64(pbits)
@@ -990,7 +982,7 @@
 	var mmUs, mmDs *VoltMeter
 	var err error
 
-	//Take the  Device lock only in case of NB add request.
+	// Take the  Device lock only in case of NB add request.
 	// Allow internal adds since internal add happen only under
 	// 1. Restore Service from DB
 	// 2. Service Migration
@@ -1016,8 +1008,7 @@
 		vs.BwAvailInfo = oper.BwAvailInfo
 		vs.Device = oper.Device
 	} else {
-
-		//Sorting Pbit from highest
+		// Sorting Pbit from highest
 		sort.Slice(vs.Pbits, func(i, j int) bool {
 			return vs.Pbits[i] > vs.Pbits[j]
 		})
@@ -1080,12 +1071,11 @@
 	vs.WriteToDb(cntx)
 
 	if nil == oper {
-
 		if !vs.UsHSIAFlowsApplied {
 			vs.triggerServiceInProgressInd()
 		}
 
-		//Update meter profiles service count if service is being added from northbound
+		// Update meter profiles service count if service is being added from northbound
 		mmDs.AssociatedServices++
 		va.UpdateMeterProf(cntx, *mmDs)
 		if mmUs != nil {
@@ -1094,14 +1084,14 @@
 		}
 		//mmAg.AssociatedServices++
 		//va.UpdateMeterProf(*mmAg)
-		logger.Debugw(ctx, "northbound-service-add-sucessful", log.Fields{"ServiceName": vs.Name})
+		logger.Debugw(ctx, "northbound-service-add-successful", log.Fields{"ServiceName": vs.Name})
 	}
 
 	logger.Warnw(ctx, "Added Service to DB", log.Fields{"Name": vs.Name, "Port": (vs.Port), "ML": vs.MacLearning})
 	return nil
 }
 
-//DelServiceWithPrefix - Deletes service with the provided prefix.
+// DelServiceWithPrefix - Deletes service with the provided prefix.
 // Added for DT/TT usecase with sadis replica interface
 func (va *VoltApplication) DelServiceWithPrefix(cntx context.Context, prefix string) {
 	va.ServiceByName.Range(func(key, value interface{}) bool {
@@ -1124,7 +1114,6 @@
 
 // DelService delete a service form the application
 func (va *VoltApplication) DelService(cntx context.Context, name string, forceDelete bool, newSvc *VoltServiceCfg, serviceMigration bool) {
-
 	AppMutex.ServiceDataMutex.Lock()
 	defer AppMutex.ServiceDataMutex.Unlock()
 
@@ -1143,7 +1132,7 @@
 		return
 	}
 
-	//Set this to avoid race-condition during flow result processing
+	// Set this to avoid race-condition during flow result processing
 	vs.DeleteInProgress = true
 	vs.ForceDelete = forceDelete
 	vs.ForceWriteToDb(cntx)
@@ -1183,30 +1172,30 @@
 
 	if aggMeter, ok := va.MeterMgr.GetMeterByID(vs.AggDsMeterID); ok {
 		if nil == newSvc || (nil != newSvc && aggMeter.Name != newSvc.AggDsMeterProfile) {
-                       if aggMeter.AssociatedServices > 0 {
-                               aggMeter.AssociatedServices--
-                               logger.Infow(ctx, "Agg Meter assocaited services updated\n", log.Fields{"MeterID": aggMeter})
-                               va.UpdateMeterProf(cntx, *aggMeter)
-                       }
+			if aggMeter.AssociatedServices > 0 {
+				aggMeter.AssociatedServices--
+				logger.Infow(ctx, "Agg Meter associated services updated\n", log.Fields{"MeterID": aggMeter})
+				va.UpdateMeterProf(cntx, *aggMeter)
+			}
 		}
 	}
 	if dsMeter, ok := va.MeterMgr.GetMeterByID(vs.DsMeterID); ok {
-	       if nil == newSvc || (nil != newSvc && dsMeter.Name != newSvc.DsMeterProfile) {
-                       if dsMeter.AssociatedServices > 0 {
-                               dsMeter.AssociatedServices--
-                               logger.Infow(ctx, "DS Meter assocaited services updated\n", log.Fields{"MeterID": dsMeter})
-                               va.UpdateMeterProf(cntx, *dsMeter)
-                       }
+		if nil == newSvc || (nil != newSvc && dsMeter.Name != newSvc.DsMeterProfile) {
+			if dsMeter.AssociatedServices > 0 {
+				dsMeter.AssociatedServices--
+				logger.Infow(ctx, "DS Meter associated services updated\n", log.Fields{"MeterID": dsMeter})
+				va.UpdateMeterProf(cntx, *dsMeter)
+			}
 		}
 	}
 	if vs.AggDsMeterID != vs.UsMeterID {
 		if usMeter, ok := va.MeterMgr.GetMeterByID(vs.UsMeterID); ok {
-                       if nil == newSvc || (nil != newSvc && usMeter.Name != newSvc.UsMeterProfile) {
-                               if usMeter.AssociatedServices > 0 {
-                                       usMeter.AssociatedServices--
-                                       logger.Infow(ctx, "US Meter assocaited services updated\n", log.Fields{"MeterID": usMeter})
-                                       va.UpdateMeterProf(cntx, *usMeter)
-                               }
+			if nil == newSvc || (nil != newSvc && usMeter.Name != newSvc.UsMeterProfile) {
+				if usMeter.AssociatedServices > 0 {
+					usMeter.AssociatedServices--
+					logger.Infow(ctx, "US Meter associated services updated\n", log.Fields{"MeterID": usMeter})
+					va.UpdateMeterProf(cntx, *usMeter)
+				}
 			}
 		}
 	}
@@ -1215,17 +1204,16 @@
 		vs.CheckAndDeleteService(cntx)
 	}
 
-	//Delete the per service counter too
+	// Delete the per service counter too
 	va.ServiceCounters.Delete(name)
 	if vs.IgmpEnabled && vs.EnableMulticastKPI {
 		_ = db.DelAllServiceChannelCounter(cntx, name)
 	}
 }
 
-//AddFlows - Adds the flow to the service
+// AddFlows - Adds the flow to the service
 // Triggers flow addition after registering for flow indication event
 func (vs *VoltService) AddFlows(cntx context.Context, device *VoltDevice, flow *of.VoltFlow) error {
-
 	// Using locks instead of concurrent map for PendingFlows to avoid
 	// race condition during flow response indication processing
 	vs.ServiceLock.Lock()
@@ -1245,7 +1233,7 @@
 	return cntlr.GetController().AddFlows(cntx, vs.Port, device.Name, flow)
 }
 
-//FlowInstallSuccess - Called when corresponding service flow installation is success
+// FlowInstallSuccess - Called when corresponding service flow installation is success
 // If no more pending flows, HSIA indication wil be triggered
 func (vs *VoltService) FlowInstallSuccess(cntx context.Context, cookie string, bwAvailInfo of.BwAvailDetails) {
 	if vs.DeleteInProgress {
@@ -1273,7 +1261,6 @@
 	vs.WriteToDb(cntx)
 
 	if len(vs.PendingFlows) == 0 && vs.DsHSIAFlowsApplied {
-
 		device, err := GetApplication().GetDeviceFromPort(vs.Port)
 		if err != nil {
 			logger.Errorw(ctx, "Error Getting Device. Dropping HSIA Success indication to NB", log.Fields{"Reason": err.Error(), "Service": vs.Name, "Port": vs.Port})
@@ -1293,7 +1280,7 @@
 	logger.Infow(ctx, "Processed Service Flow Add Success Indication", log.Fields{"Cookie": cookie, "Service": vs.Name, "DsFlowsApplied": vs.DsHSIAFlowsApplied})
 }
 
-//FlowInstallFailure - Called when corresponding service flow installation is failed
+// FlowInstallFailure - Called when corresponding service flow installation is failed
 // Trigger service failure indication to NB
 func (vs *VoltService) FlowInstallFailure(cookie string, errorCode uint32, errReason string) {
 	vs.ServiceLock.RLock()
@@ -1308,10 +1295,9 @@
 	vs.triggerServiceFailureInd(errorCode, errReason)
 }
 
-//DelFlows - Deletes the flow from the service
+// DelFlows - Deletes the flow from the service
 // Triggers flow deletion after registering for flow indication event
 func (vs *VoltService) DelFlows(cntx context.Context, device *VoltDevice, flow *of.VoltFlow) error {
-
 	if !vs.ForceDelete {
 		// Using locks instead of concurrent map for AssociatedFlows to avoid
 		// race condition during flow response indication processing
@@ -1331,7 +1317,7 @@
 	return cntlr.GetController().DelFlows(cntx, vs.Port, device.Name, flow)
 }
 
-//CheckAndDeleteService - remove service from DB is there are no pending flows to be removed
+// CheckAndDeleteService - remove service from DB is there are no pending flows to be removed
 func (vs *VoltService) CheckAndDeleteService(cntx context.Context) {
 	if vs.DeleteInProgress && len(vs.AssociatedFlows) == 0 && !vs.DsHSIAFlowsApplied {
 		vs.DelFromDb(cntx)
@@ -1340,10 +1326,9 @@
 	}
 }
 
-//FlowRemoveSuccess - Called when corresponding service flow removal is success
+// FlowRemoveSuccess - Called when corresponding service flow removal is success
 // If no more associated flows, DelHSIA indication wil be triggered
 func (vs *VoltService) FlowRemoveSuccess(cntx context.Context, cookie string) {
-
 	// if vs.DeleteInProgress {
 	// 	logger.Warnw(ctx, "Skipping Flow Remove Success Notification. Service deletion in-progress", log.Fields{"Cookie": cookie, "Service": vs.Name})
 	// 	return
@@ -1364,7 +1349,6 @@
 	vs.WriteToDb(cntx)
 
 	if len(vs.AssociatedFlows) == 0 && !vs.DsHSIAFlowsApplied {
-
 		device := GetApplication().GetDevice(vs.Device)
 		if device == nil {
 			logger.Errorw(ctx, "Error Getting Device. Dropping DEL_HSIA Success indication to NB", log.Fields{"Service": vs.Name, "Port": vs.Port})
@@ -1376,7 +1360,7 @@
 
 		if vs.UpdateInProgress {
 			vs.updateVnetProfile(cntx, vs.Device)
-			//Not sending DEL_HSIA Indication since it wil be generated internally by SubMgr
+			// Not sending DEL_HSIA Indication since it wil be generated internally by SubMgr
 			return
 		}
 		logger.Infow(ctx, "All Flows removed for Service. Triggering Service De-activation Success indication to NB", log.Fields{"Service": vs.Name, "DeleteFlag": vs.DeleteInProgress})
@@ -1387,7 +1371,7 @@
 	logger.Infow(ctx, "Processed Service Flow Remove Success Indication", log.Fields{"Cookie": cookie, "Service": vs.Name, "Associated Flows": vs.AssociatedFlows, "DsFlowsApplied": vs.DsHSIAFlowsApplied})
 }
 
-//FlowRemoveFailure - Called when corresponding service flow installation is failed
+// FlowRemoveFailure - Called when corresponding service flow installation is failed
 // Trigger service failure indication to NB
 func (vs *VoltService) FlowRemoveFailure(cntx context.Context, cookie string, errorCode uint32, errReason string) {
 	vs.ServiceLock.RLock()
@@ -1476,7 +1460,6 @@
 
 // GetServiceNameFromCookie to get service name from cookie
 func (va *VoltApplication) GetServiceNameFromCookie(cookie uint64, portName string, pbit uint8, device string, tableMetadata uint64) *VoltService {
-
 	var vlan uint64
 	vlanControl := (tableMetadata >> 32) & 0xF
 
@@ -1484,7 +1467,7 @@
 		// Fetching UniVlan for vlanControl OLTCVLANOLTSVLAN
 		vlan = (tableMetadata >> 16) & 0xFFFF
 	} else {
-		//Fetching CVlan for other vlanControl
+		// Fetching CVlan for other vlanControl
 		vlan = cookie >> 52
 	}
 	logger.Infow(ctx, "Configured Params", log.Fields{"VlanControl": vlanControl, "vlan": vlan})
@@ -1499,19 +1482,19 @@
 	return service
 }
 
-//MigrateServicesReqStatus - update vnet request status
+// MigrateServicesReqStatus - update vnet request status
 type MigrateServicesReqStatus string
 
 const (
-	//MigrateSrvsReqInit constant
+	// MigrateSrvsReqInit constant
 	MigrateSrvsReqInit MigrateServicesReqStatus = "Init"
-	//MigrateSrvsReqDeactTriggered constant
+	// MigrateSrvsReqDeactTriggered constant
 	MigrateSrvsReqDeactTriggered MigrateServicesReqStatus = "Profiles Deactivated"
-	//MigrateSrvsReqCompleted constant
+	// MigrateSrvsReqCompleted constant
 	MigrateSrvsReqCompleted MigrateServicesReqStatus = "Update Complete"
 )
 
-//MigrateServicesRequest - update vnet request params
+// MigrateServicesRequest - update vnet request params
 type MigrateServicesRequest struct {
 	ID                  string
 	OldVnetID           string
@@ -1523,7 +1506,6 @@
 }
 
 func newMigrateServicesRequest(id string, oldVnetID string, newVnetID string, serviceMap map[string]bool, deviceID string) *MigrateServicesRequest {
-
 	var msr MigrateServicesRequest
 	msr.OldVnetID = oldVnetID
 	msr.NewVnetID = newVnetID
@@ -1534,7 +1516,7 @@
 	return &msr
 }
 
-//GetMsrKey - generates migrate service request key
+// GetMsrKey - generates migrate service request key
 func (msr *MigrateServicesRequest) GetMsrKey() string {
 	return msr.OldVnetID + "-" + msr.ID
 }
@@ -1547,7 +1529,7 @@
 // 	return (len(edr.AssociatedProfiles) == 0)
 // }
 
-//WriteToDB - writes the udpate vnet request details ot DB
+// WriteToDB - writes the udpate vnet request details ot DB
 func (msr *MigrateServicesRequest) WriteToDB(cntx context.Context) {
 	logger.Debugw(ctx, "Adding Migrate Service Request to DB", log.Fields{"OldVnet": msr.OldVnetID, "NewVnet": msr.NewVnetID, "Device": msr.DeviceID, "RequestID": msr.ID, "ServiceCount": len(msr.ServicesList)})
 	if b, err := json.Marshal(msr); err == nil {
@@ -1558,9 +1540,8 @@
 	}
 }
 
-//MigrateServices - updated vnet profile for services
+// MigrateServices - updated vnet profile for services
 func (va *VoltApplication) MigrateServices(cntx context.Context, serialNum string, reqID string, oldVnetID, newVnetID string, serviceList []string) error {
-
 	logger.Warnw(ctx, "Migrate Serviec Request Received", log.Fields{"SerialNum": serialNum, "RequestID": reqID, "OldVnet": oldVnetID, "NewVnet": newVnetID, "ServiceList": serviceList})
 	if _, ok := va.VnetsByName.Load(oldVnetID); !ok {
 		return errors.New("Old Vnet Id not found")
@@ -1588,12 +1569,11 @@
 	return nil
 }
 
-//ProcessMigrateServicesProfRequest - collects all associated profiles
+// ProcessMigrateServicesProfRequest - collects all associated profiles
 func (msr *MigrateServicesRequest) ProcessMigrateServicesProfRequest(cntx context.Context) {
 	va := GetApplication()
 	for srv, processed := range msr.ServicesList {
-
-		//Indicates new service is already created and only deletion of old one is pending
+		// Indicates new service is already created and only deletion of old one is pending
 		if processed {
 			va.DelService(cntx, srv, true, nil, true)
 			msr.serviceMigrated(cntx, srv)
@@ -1622,7 +1602,7 @@
 			vs.Metadata = metadata
 			vs.ServiceLock.Unlock()
 
-			//vpv flows will be removed when last service is removed from it and
+			// vpv flows will be removed when last service is removed from it and
 			// new vpv flows will be installed when new service is added
 			if vs.UsHSIAFlowsApplied {
 				vpv.DelTrapFlows(cntx)
@@ -1637,9 +1617,8 @@
 	}
 }
 
-//AddMigratingServices - store msr info to device obj
+// AddMigratingServices - store msr info to device obj
 func (d *VoltDevice) AddMigratingServices(msr *MigrateServicesRequest) {
-
 	var msrMap *util.ConcurrentMap
 	if msrMapIntf, ok := d.MigratingServices.Get(msr.OldVnetID); !ok {
 		msrMap = util.NewConcurrentMap()
@@ -1652,10 +1631,9 @@
 
 	d.MigratingServices.Set(msr.OldVnetID, msrMap)
 	logger.Infow(ctx, "1: DeviceMsr", log.Fields{"Device": d.Name, "Vnet": msr.OldVnetID, "Len": d.MigratingServices.Length()})
-
 }
 
-//getMigrateServicesRequest - fetches msr info from device
+// getMigrateServicesRequest - fetches msr info from device
 func (va *VoltApplication) getMigrateServicesRequest(deviceID string, oldVnetID string, requestID string) *MigrateServicesRequest {
 	if vd := va.GetDevice(deviceID); vd != nil {
 		logger.Infow(ctx, "2: DeviceMsr", log.Fields{"Device": deviceID, "Vnet": oldVnetID, "Len": vd.MigratingServices.Length()})
@@ -1665,14 +1643,13 @@
 			if msrObj, ok := msrList.Get(requestID); ok {
 				return msrObj.(*MigrateServicesRequest)
 			}
-
 		}
 	}
 	logger.Errorw(ctx, "Device Not Found", log.Fields{"Device": deviceID})
 	return nil
 }
 
-//updateMigrateServicesRequest - Updates the device with updated msr
+// updateMigrateServicesRequest - Updates the device with updated msr
 func (va *VoltApplication) updateMigrateServicesRequest(deviceID string, oldVnetID string, requestID string, msr *MigrateServicesRequest) {
 	if vd := va.GetDevice(deviceID); vd != nil {
 		if msrList, ok := vd.MigratingServices.Get(oldVnetID); ok {
@@ -1683,10 +1660,9 @@
 	}
 }
 
-//updateVnetProfile - Called on flow process completion
-// Removes old service and creates new VPV & service with udpated vnet profile
+// updateVnetProfile - Called on flow process completion
+// Removes old service and creates new VPV & service with updated vnet profile
 func (vs *VoltService) updateVnetProfile(cntx context.Context, deviceID string) {
-
 	logger.Infow(ctx, "Update Vnet Profile Triggering", log.Fields{"Service": vs.Name, "US": vs.UsHSIAFlowsApplied, "DS": vs.DsHSIAFlowsApplied})
 
 	nvs := VoltService{}
@@ -1717,8 +1693,6 @@
 
 	metadata := vs.Metadata.(*MigrateServiceMetadata)
 	oldVnetID := vs.VnetID
-	nvs.VnetID = metadata.NewVnetID
-	id := metadata.RequestID
 	oldSrvName := vs.Name
 
 	if metadata == nil || metadata.NewVnetID == "" {
@@ -1726,7 +1700,10 @@
 		return
 	}
 
-	//First add the new service and then only delete the old service
+	nvs.VnetID = metadata.NewVnetID
+	id := metadata.RequestID
+
+	// First add the new service and then only delete the old service
 	// Since if post del service in case of pod crash or reboot, the service data will be lost
 	va := GetApplication()
 	msr := va.getMigrateServicesRequest(deviceID, oldVnetID, id)
@@ -1741,7 +1718,7 @@
 	svcName = svcName + strconv.FormatUint(uint64(vs.CVlan), 10) + "-"
 	nvs.Name = svcName + strconv.FormatUint(uint64(vs.TechProfileID), 10)
 
-	//TODO:Nav Pass a copy, not the pointer
+	// TODO:Nav Pass a copy, not the pointer
 	logger.Infow(ctx, "Add New Service Triggering", log.Fields{"Service": nvs.Name, "US": nvs.UsHSIAFlowsApplied, "DS": nvs.DsHSIAFlowsApplied, "DelFlag": nvs.DeleteInProgress})
 	if err := va.AddService(cntx, nvs.VoltServiceCfg, &nvs.VoltServiceOper); err != nil {
 		logger.Warnw(ctx, "Add New Service Failed", log.Fields{"Service": nvs.Name, "Error": err})
@@ -1758,10 +1735,9 @@
 	msr.serviceMigrated(cntx, oldSrvName)
 }
 
-//serviceMigrated - called on successful service updation
+// serviceMigrated - called on successful service updation
 // Removes the service entry from servicelist and deletes the request on process completion
 func (msr *MigrateServicesRequest) serviceMigrated(cntx context.Context, serviceName string) {
-
 	msr.MigrateServicesLock.Lock()
 	defer msr.MigrateServicesLock.Unlock()
 
@@ -1772,17 +1748,16 @@
 		return
 	}
 	msr.WriteToDB(cntx)
-	//TODO:Nav - Need for any Response to SubMgr?
+	// TODO:Nav - Need for any Response to SubMgr?
 }
 
-//TriggerPendingMigrateServicesReq - trigger pending service request
+// TriggerPendingMigrateServicesReq - trigger pending service request
 func (va *VoltApplication) TriggerPendingMigrateServicesReq(cntx context.Context, device string) {
 	va.FetchAndProcessAllMigrateServicesReq(cntx, device, storeAndProcessMigrateSrvRequest)
 }
 
-//FetchAndProcessAllMigrateServicesReq - fetch all pending migrate services req from DB and process based on provided func
+// FetchAndProcessAllMigrateServicesReq - fetch all pending migrate services req from DB and process based on provided func
 func (va *VoltApplication) FetchAndProcessAllMigrateServicesReq(cntx context.Context, device string, msrAction func(context.Context, *MigrateServicesRequest)) {
-
 	msrList, _ := db.GetAllMigrateServicesReq(cntx, device)
 	for _, msr := range msrList {
 		b, ok := msr.Value.([]byte)
@@ -1793,7 +1768,6 @@
 		msr := va.createMigrateServicesFromString(b)
 		msrAction(cntx, msr)
 		logger.Warnw(ctx, "Triggering Pending Migrate Services Req", log.Fields{"OldVnet": msr.OldVnetID, "NewVnet": msr.NewVnetID, "Device": device, "PendingProfiles": len(msr.ServicesList)})
-
 	}
 }
 
@@ -1802,21 +1776,20 @@
 	var msr MigrateServicesRequest
 	if err := json.Unmarshal(b, &msr); err == nil {
 		logger.Debugw(ctx, "Adding Migrate Services Request From Db", log.Fields{"Vlan": msr.OldVnetID})
-
 	} else {
 		logger.Warn(ctx, "Unmarshal failed")
 	}
 	return &msr
 }
 
-//storeAndProcessMigrateSrvRequest - stores the msr info in device obj and triggers req
+// storeAndProcessMigrateSrvRequest - stores the msr info in device obj and triggers req
 func storeAndProcessMigrateSrvRequest(cntx context.Context, msr *MigrateServicesRequest) {
 	d := GetApplication().GetDevice(msr.DeviceID)
 	d.AddMigratingServices(msr)
 	msr.ProcessMigrateServicesProfRequest(cntx)
 }
 
-//forceUpdateAllServices - force udpate services with new vnet profile
+// forceUpdateAllServices - force udpate services with new vnet profile
 func forceUpdateAllServices(cntx context.Context, msr *MigrateServicesRequest) {
 	for srv := range msr.ServicesList {
 		if vsIntf, ok := GetApplication().ServiceByName.Load(srv); ok {
@@ -1826,7 +1799,8 @@
 	_ = db.DelMigrateServicesReq(cntx, msr.DeviceID, msr.GetMsrKey())
 }
 
-//DeepEqualServicecfg - checks if the given service cfgs are same
+// nolint: gocyclo
+// DeepEqualServicecfg - checks if the given service cfgs are same
 func (va *VoltApplication) DeepEqualServicecfg(evs *VoltServiceCfg, nvs *VoltServiceCfg) bool {
 	if nvs.Name != evs.Name {
 		return false
@@ -1925,11 +1899,10 @@
 	return true
 }
 
-//TriggerAssociatedFlowDelete - re-trigger service flow delete for pending delete flows
+// TriggerAssociatedFlowDelete - re-trigger service flow delete for pending delete flows
 func (vs *VoltService) TriggerAssociatedFlowDelete(cntx context.Context) bool {
-
-	//Clear the Flows flag if already set
-	//This case happens only in case of some race condition
+	// Clear the Flows flag if already set
+	// This case happens only in case of some race condition
 	if vs.UsHSIAFlowsApplied {
 		if err := vs.DelUsHsiaFlows(cntx); err != nil {
 			logger.Errorw(ctx, "DelUsHsiaFlows Failed", log.Fields{"Device": vs.Device, "Service": vs.Name, "Error": err})
@@ -1953,7 +1926,7 @@
 		return false
 	}
 
-	//Trigger Flow Delete
+	// Trigger Flow Delete
 	for _, cookie := range cookieList {
 		if vd := GetApplication().GetDevice(vs.Device); vd != nil {
 			flow := &of.VoltFlow{}
@@ -1970,12 +1943,12 @@
 	return true
 }
 
-//triggerServiceInProgressInd - Indication is generated when Service is not provisioned after add serviec req from NB
+// triggerServiceInProgressInd - Indication is generated when Service is not provisioned after add serviec req from NB
 func (vs *VoltService) triggerServiceInProgressInd() {
 }
 
-// JsonMarshal wrapper function for json Marshal VoltService
-func (vs *VoltService) JsonMarshal() ([]byte, error) {
+// JSONMarshal wrapper function for json Marshal VoltService
+func (vs *VoltService) JSONMarshal() ([]byte, error) {
 	return json.Marshal(VoltService{
 		VoltServiceCfg: vs.VoltServiceCfg,
 		VoltServiceOper: VoltServiceOper{
@@ -2081,7 +2054,7 @@
 		// If svlan if provided, then the tags and tpID of service has to be matching
 		logger.Infow(ctx, "Service Deactivate Request ", log.Fields{"Device": deviceID, "Port": portNo})
 		if sVlan != of.VlanNone && (sVlan != vs.SVlan || cVlan != vs.CVlan || tpID != vs.TechProfileID) {
-			logger.Infow(ctx, "condition not matched", log.Fields{"Device": deviceID, "Port": portNo, "sVlan": sVlan, "cVlan":cVlan, "tpID": tpID})
+			logger.Infow(ctx, "condition not matched", log.Fields{"Device": deviceID, "Port": portNo, "sVlan": sVlan, "cVlan": cVlan, "tpID": tpID})
 			return true
 		}
 		if portNo == vs.Port && vs.IsActivated {
@@ -2096,7 +2069,7 @@
 				return true
 			}
 			p := device.GetPort(vs.Port)
-			if p != nil && (p.State == PortStateUp || !va.OltFlowServiceConfig.RemoveFlowsOnDisable){
+			if p != nil && (p.State == PortStateUp || !va.OltFlowServiceConfig.RemoveFlowsOnDisable) {
 				if vpv := va.GetVnetByPort(vs.Port, vs.SVlan, vs.CVlan, vs.UniVlan); vpv != nil {
 					// Port down call internally deletes all the flows
 					vpv.PortDownInd(cntx, deviceID, portNo, true)
@@ -2113,15 +2086,15 @@
 	return nil
 }
 
-/* GetServicePbit to get first set bit in the pbit map
-   returns -1 : If configured to match on all pbits
-   returns 8  : If no pbits are configured
-   returns first pbit if specific pbit is configured */
+// GetServicePbit to get first set bit in the pbit map
+// returns -1 : If configured to match on all pbits
+// returns 8  : If no pbits are configured
+// returns first pbit if specific pbit is configured
 func (vs *VoltService) GetServicePbit() int {
 	if vs.IsPbitExist(of.PbitMatchAll) {
 		return -1
 	}
-	for pbit:= 0; pbit < int(of.PbitMatchNone); pbit++ {
+	for pbit := 0; pbit < int(of.PbitMatchNone); pbit++ {
 		if vs.IsPbitExist(of.PbitType(pbit)) {
 			return pbit
 		}
diff --git a/internal/pkg/application/timer.go b/internal/pkg/application/timer.go
index aa156a8..167f8ae 100644
--- a/internal/pkg/application/timer.go
+++ b/internal/pkg/application/timer.go
@@ -20,7 +20,7 @@
 	"time"
 )
 
-//TimerType - type of timer used
+// TimerType - type of timer used
 type TimerType string
 
 const (
@@ -57,7 +57,7 @@
 			case pendingPoolTimer:
 				va.removeExpiredGroups(cntx)
 			}
-		case <- timerChannels[timerType]:
+		case <-timerChannels[timerType]:
 			return
 		}
 	}
diff --git a/internal/pkg/application/util.go b/internal/pkg/application/util.go
index 866e12b..f157bf9 100644
--- a/internal/pkg/application/util.go
+++ b/internal/pkg/application/util.go
@@ -23,17 +23,17 @@
 )
 
 const (
-	//EtherType8100 - EtherType dot1q
+	// EtherType8100 - EtherType dot1q
 	EtherType8100 uint8 = 0
-	//EtherType88a8 - EtherType dot1ad
+	// EtherType88a8 - EtherType dot1ad
 	EtherType88a8 uint8 = 1
-	//EtherType9100 - EtherType dot1ad doubleTag
+	// EtherType9100 - EtherType dot1ad doubleTag
 	EtherType9100 uint8 = 2
-	//EtherType9200 - EtherType dot1q doubleTag
+	// EtherType9200 - EtherType dot1q doubleTag
 	EtherType9200 uint8 = 3
 )
 
-//GetMetadataForL2Protocol - returns metadata value for provide ethertype
+// GetMetadataForL2Protocol - returns metadata value for provide ethertype
 func GetMetadataForL2Protocol(etherType layers.EthernetType) (uint8, error) {
 	switch etherType {
 	case layers.EthernetTypeDot1Q:
@@ -50,11 +50,9 @@
 }
 
 func convertToUInt64(data string) uint64 {
-
 	value, err := strconv.ParseUint(data, 10, 64)
 	if err != nil {
 		return 0
 	}
 	return value
-
 }
diff --git a/internal/pkg/application/vnets.go b/internal/pkg/application/vnets.go
index 548879f..1817b5d 100644
--- a/internal/pkg/application/vnets.go
+++ b/internal/pkg/application/vnets.go
@@ -48,13 +48,13 @@
 	Radisys string = "Radisys"
 
 	// DPU_MGMT_TRAFFIC serviceType, vnetType constant
-	DPU_MGMT_TRAFFIC string = "DPU_MGMT_TRAFFIC"
+	DpuMgmtTraffic string = "DPU_MGMT_TRAFFIC"
 
 	// DPU_ANCP_TRAFFIC serviceType, vnetType constant
-	DPU_ANCP_TRAFFIC string = "DPU_ANCP_TRAFFIC"
+	DpuAncpTraffic string = "DPU_ANCP_TRAFFIC"
 
 	// FTTB_SUBSCRIBER_TRAFFIC serviceType, vnetType constant
-	FTTB_SUBSCRIBER_TRAFFIC string = "FTTB_SUBSCRIBER_TRAFFIC"
+	FttbSubscriberTraffic string = "FTTB_SUBSCRIBER_TRAFFIC"
 )
 
 var (
@@ -101,47 +101,47 @@
 
 // VnetConfig structure
 type VnetConfig struct {
+	CtrlPktPbitRemark          map[of.PbitType]of.PbitType
 	Name                       string
-	SVlan                      of.VlanType
-	CVlan                      of.VlanType
-	UniVlan                    of.VlanType
-	SVlanTpid                  layers.EthernetType
-	DhcpRelay                  bool
-	ArpLearning                bool
-	MacLearning                MacLearningType
-	PppoeIa                    bool
-	ONTEtherTypeClassification int
-	VlanControl                VlanControl
+	VnetType                   string
 	Encapsulation              string
+	DevicesList                []string //List of serial number of devices on which this vnet is applied
 	UsDhcpPbit                 []of.PbitType
 	DsDhcpPbit                 []of.PbitType
 	UsIGMPPbit                 []of.PbitType
 	DsIGMPPbit                 []of.PbitType
-	DevicesList                []string //List of serial number of devices on which this vnet is applied
-	AllowTransparent           bool
-	CtrlPktPbitRemark          map[of.PbitType]of.PbitType
+	ONTEtherTypeClassification int
+	MacLearning                MacLearningType
 	UsPonCTagPriority          of.PbitType
 	UsPonSTagPriority          of.PbitType
 	DsPonCTagPriority          of.PbitType
 	DsPonSTagPriority          of.PbitType
-	VnetType                   string
+	SVlan                      of.VlanType
+	CVlan                      of.VlanType
+	UniVlan                    of.VlanType
+	SVlanTpid                  layers.EthernetType
+	VlanControl                VlanControl
+	DhcpRelay                  bool
+	ArpLearning                bool
+	AllowTransparent           bool
+	PppoeIa                    bool
 }
 
 // VnetOper structure
 type VnetOper struct {
 	PendingDeleteFlow     map[string]map[string]bool
-	DeleteInProgress      bool
-	PendingDeviceToDelete string
-	VnetLock              sync.RWMutex    `json:"-"`
-	VnetPortLock          sync.RWMutex    `json:"-"`
 	AssociatedPorts       map[string]bool `json:"-"`
+	PendingDeviceToDelete string
+	VnetLock              sync.RWMutex `json:"-"`
+	VnetPortLock          sync.RWMutex `json:"-"`
+	DeleteInProgress      bool
 }
 
 // VoltVnet sructure
 type VoltVnet struct {
+	Version string
 	VnetConfig
 	VnetOper
-	Version string
 }
 
 const (
@@ -168,7 +168,7 @@
 	return &vv
 }
 
-//associatePortToVnet - associate a port to Vnet
+// associatePortToVnet - associate a port to Vnet
 func (vv *VoltVnet) associatePortToVnet(port string) {
 	vv.VnetPortLock.Lock()
 	if vv.AssociatedPorts == nil {
@@ -178,7 +178,7 @@
 	vv.VnetPortLock.Unlock()
 }
 
-//disassociatePortFromVnet - disassociate a port from Vnet and return true if the association map is empty
+// disassociatePortFromVnet - disassociate a port from Vnet and return true if the association map is empty
 func (vv *VoltVnet) disassociatePortFromVnet(cntx context.Context, device string, port string) {
 	vv.VnetPortLock.Lock()
 	delete(vv.AssociatedPorts, port)
@@ -210,7 +210,6 @@
 
 // WriteToDb commit the VNET to the database
 func (vv *VoltVnet) WriteToDb(cntx context.Context) {
-
 	if vv.DeleteInProgress {
 		logger.Warnw(ctx, "Skipping Redis Update for Vnet, Vnet delete in progress", log.Fields{"Vnet": vv.Name})
 		return
@@ -218,7 +217,7 @@
 	vv.ForceWriteToDb(cntx)
 }
 
-//ForceWriteToDb force commit a vnet to the DB
+// ForceWriteToDb force commit a vnet to the DB
 func (vv *VoltVnet) ForceWriteToDb(cntx context.Context) {
 	vv.VnetPortLock.RLock()
 	defer vv.VnetPortLock.RUnlock()
@@ -264,7 +263,6 @@
 
 // storeVnetConfig to store vnet config
 func (va *VoltApplication) storeVnetConfig(cfg VnetConfig, vv *VoltVnet) {
-
 	var vnetMap *util.ConcurrentMap
 
 	va.VnetsByTag.Store(VnetKey(cfg.SVlan, cfg.CVlan, cfg.UniVlan), vv)
@@ -293,7 +291,6 @@
 
 // AddVnet to add a VNET to the list of VNETs configured.
 func (va *VoltApplication) AddVnet(cntx context.Context, cfg VnetConfig, oper *VnetOper) error {
-
 	AppMutex.VnetMutex.Lock()
 	var vv *VoltVnet
 	devicesToHandle := []string{}
@@ -344,7 +341,7 @@
 	AppMutex.VnetMutex.Lock()
 	if vnetIntf, ok := va.VnetsByName.Load(name); ok {
 		vnet := vnetIntf.(*VoltVnet)
-		//Delete from mvp list
+		// Delete from mvp list
 		vnet.DevicesList = util.RemoveFromSlice(vnet.DevicesList, deviceSerialNum)
 
 		va.DeleteDevFlowForVlanFromDevice(cntx, vnet, deviceSerialNum)
@@ -362,11 +359,11 @@
 			}
 			vnet.VnetPortLock.RUnlock()
 		} else {
-			//Update the devicelist in db
+			// Update the devicelist in db
 			vnet.WriteToDb(cntx)
 		}
 	}
-	//TODO: if no vnets are present on device remove icmpv6 group from device
+	// TODO: if no vnets are present on device remove icmpv6 group from device
 	AppMutex.VnetMutex.Unlock()
 	return nil
 }
@@ -407,61 +404,61 @@
 
 // VoltPortVnet structure
 type VoltPortVnet struct {
+	PendingDeleteFlow          map[string]bool
+	servicesCount              *atomic.Uint64
+	services                   sync.Map
 	Device                     string
 	Port                       string
-	PonPort                    uint32
 	VnetName                   string
-	SVlan                      of.VlanType
-	CVlan                      of.VlanType
-	UniVlan                    of.VlanType
-	SVlanTpid                  layers.EthernetType
-	DhcpRelay                  bool
-	ArpRelay                   bool
-	PppoeIa                    bool
-	MacLearning                MacLearningType
-	DhcpStatus                 DhcpStatus
+	VnetType                   string
+	MvlanProfileName           string
+	Version                    string
 	DhcpExpiryTime             time.Time
 	Dhcp6ExpiryTime            time.Time
-	FlowsApplied               bool
-	services                   sync.Map
-	servicesCount              *atomic.Uint64
 	Ipv4Addr                   net.IP
 	Ipv6Addr                   net.IP
 	MacAddr                    net.HardwareAddr
 	LearntMacAddr              net.HardwareAddr
-	CircuitID                  []byte //Will not be used
-	RemoteID                   []byte //Will not be used
-	IsOption82Disabled         bool   //Will not be used
-	RelayState                 DhcpRelayState
-	PPPoeState                 PppoeIaState
-	RelayStatev6               Dhcpv6RelayState
-	IgmpEnabled                bool
-	IgmpFlowsApplied           bool
-	McastService               bool
+	CircuitID                  []byte       //Will not be used
+	RemoteID                   []byte       //Will not be used
+	VpvLock                    sync.Mutex   `json:"-"`
+	PendingFlowLock            sync.RWMutex `json:"-"`
+	SchedID                    int
 	ONTEtherTypeClassification int
-	VlanControl                VlanControl
-	MvlanProfileName           string
-	Version                    string
+	MacLearning                MacLearningType
+	PonPort                    uint32
+	McastUsMeterID             uint32
 	McastTechProfileID         uint16
 	McastPbit                  of.PbitType
-	McastUsMeterID             uint32
-	AllowTransparent           bool
-	VpvLock                    sync.Mutex `json:"-"`
-	SchedID                    int
-	DHCPv6DUID                 [MaxLenDhcpv6DUID]byte
-	PendingFlowLock            sync.RWMutex `json:"-"`
-	PendingDeleteFlow          map[string]bool
-	DeleteInProgress           bool
-	Blocked                    bool
+	SVlanTpid                  layers.EthernetType
 	DhcpPbit                   of.PbitType
 	UsPonCTagPriority          of.PbitType
 	UsPonSTagPriority          of.PbitType
 	DsPonCTagPriority          of.PbitType
 	DsPonSTagPriority          of.PbitType
-	VnetType                   string
+	SVlan                      of.VlanType
+	CVlan                      of.VlanType
+	UniVlan                    of.VlanType
+	VlanControl                VlanControl
+	RelayState                 DhcpRelayState
+	DhcpStatus                 DhcpStatus
+	PPPoeState                 PppoeIaState
+	RelayStatev6               Dhcpv6RelayState
+	DHCPv6DUID                 [MaxLenDhcpv6DUID]byte
+	DhcpRelay                  bool
+	ArpRelay                   bool
+	PppoeIa                    bool
+	DeleteInProgress           bool
+	Blocked                    bool
+	AllowTransparent           bool
+	IgmpEnabled                bool
+	IgmpFlowsApplied           bool
+	McastService               bool
+	FlowsApplied               bool
+	IsOption82Disabled         bool //Will not be used
 }
 
-//VlanControl vlan control type
+// VlanControl vlan control type
 type VlanControl uint8
 
 const (
@@ -524,10 +521,9 @@
 }
 
 func (vpv *VoltPortVnet) setDevice(device string) {
-
 	if vpv.Device != device && vpv.Device != "" {
 		GetApplication().DisassociateVpvsFromDevice(device, vpv)
-		//TEMP:
+		// TEMP:
 		vpv.printAssociatedVPVs(false)
 	}
 
@@ -535,11 +531,11 @@
 
 	vpv.Device = device
 	GetApplication().AssociateVpvsToDevice(device, vpv)
-	//TEMP:
+	// TEMP:
 	vpv.printAssociatedVPVs(true)
 }
 
-//TODO - Nav - Temp
+// TODO - Nav - Temp
 func (vpv *VoltPortVnet) printAssociatedVPVs(add bool) {
 	logger.Infow(ctx, "Start----Printing all associated VPV", log.Fields{"Device": vpv.Device, "Add": add})
 	if vMap := GetApplication().GetAssociatedVpvsForDevice(vpv.Device, vpv.SVlan); vMap != nil {
@@ -550,7 +546,6 @@
 		})
 	}
 	logger.Infow(ctx, "End----Printing all associated VPV", log.Fields{"Device": vpv.Device, "Add": add})
-
 }
 
 // GetCircuitID : The interface to be satisfied by the VoltPortVnet to be a DHCP relay
@@ -724,7 +719,6 @@
 
 // PushFlowsForPortVnet - triggers flow construction and push for provided VPV
 func (vpv *VoltPortVnet) PushFlowsForPortVnet(cntx context.Context, d *VoltDevice) {
-
 	vp := d.GetPort(vpv.Port)
 
 	//Ignore if UNI port is not found or not UP
@@ -753,7 +747,6 @@
 // changed. Thus, a reboot of ONT forces the new configuration to get
 // applied.
 func (vpv *VoltPortVnet) PortUpInd(cntx context.Context, device *VoltDevice, port string) {
-
 	if vpv.DeleteInProgress {
 		logger.Errorw(ctx, "Ignoring VPV Port UP Ind, VPV deleteion In-Progress", log.Fields{"Device": device, "Port": port, "Vnet": vpv.VnetName})
 		return
@@ -788,17 +781,17 @@
 		// DS HSIA flows are installed after learning the MAC.
 		logger.Infow(ctx, "Port Up - Trap Flows", log.Fields{"Device": device.Name, "Port": port})
 		// no HSIA flows for multicast service and DPU_MGMT Service
-		if !vpv.McastService && vpv.VnetType != DPU_MGMT_TRAFFIC {
+		if !vpv.McastService && vpv.VnetType != DpuMgmtTraffic {
 			vpv.RangeOnServices(cntx, AddUsHsiaFlows)
 		}
-		if vpv.VnetType == DPU_MGMT_TRAFFIC {
+		if vpv.VnetType == DpuMgmtTraffic {
 			vpv.RangeOnServices(cntx, AddMeterToDevice)
 		}
 		vpv.AddTrapFlows(cntx)
 		if vpv.MacLearning == MacLearningNone || NonZeroMacAddress(vpv.MacAddr) {
 			logger.Infow(ctx, "Port Up - DS Flows", log.Fields{"Device": device.Name, "Port": port})
 			/*In case of DPU_MGMT_TRAFFIC, need to install both US and DS traffic */
-			if vpv.VnetType == DPU_MGMT_TRAFFIC {
+			if vpv.VnetType == DpuMgmtTraffic {
 				vpv.RangeOnServices(cntx, AddUsHsiaFlows)
 			}
 			// US & DS DHCP, US HSIA flows are already installed
@@ -808,7 +801,6 @@
 				vpv.RangeOnServices(cntx, AddDsHsiaFlows)
 			}
 		}
-
 	} else {
 		// DHCP relay is not configured. This implies that the service must use
 		// 1:1 and does not require MAC learning. In a completely uncommon but
@@ -846,7 +838,6 @@
 // The same indication is also passed to the services enqueued for them
 // to take appropriate actions
 func (vpv *VoltPortVnet) PortDownInd(cntx context.Context, device string, port string, nbRequest bool) {
-
 	if !nbRequest && !GetApplication().OltFlowServiceConfig.RemoveFlowsOnDisable {
 		logger.Info(ctx, "VPV Port DOWN Ind, Not deleting flows since RemoveOnDisable is disabled")
 		return
@@ -865,7 +856,6 @@
 // packets received from the network. Currently, DHCP packets are
 // only packets we learn the MAC address from
 func (vpv *VoltPortVnet) SetMacAddr(cntx context.Context, addr net.HardwareAddr) {
-
 	//Store Learnt MAC address and return if MACLearning is not enabled
 	vpv.LearntMacAddr = addr
 	if vpv.MacLearning == MacLearningNone || !NonZeroMacAddress(addr) ||
@@ -918,7 +908,7 @@
 	// Ds Hsia flows has to be pushed
 	if vpv.FlowsApplied {
 		// In case of DPU_MGMT_TRAFFIC install both US and DS Flows
-		if vpv.VnetType == DPU_MGMT_TRAFFIC {
+		if vpv.VnetType == DpuMgmtTraffic {
 			vpv.RangeOnServices(cntx, AddUsHsiaFlows)
 		}
 		// no HSIA flows for multicast service
@@ -950,7 +940,6 @@
 
 // MatchesPriority : If the VNET matches priority of the incoming packet with any service, return true. Else, return false
 func (vpv *VoltPortVnet) MatchesPriority(priority uint8) *VoltService {
-
 	var service *VoltService
 	pbitFound := false
 	matchpbitsFunc := func(key, value interface{}) bool {
@@ -973,7 +962,6 @@
 
 // GetRemarkedPriority : If the VNET matches priority of the incoming packet with any service, return true. Else, return false
 func (vpv *VoltPortVnet) GetRemarkedPriority(priority uint8) uint8 {
-
 	dsPbit := uint8(0)
 	matchpbitsFunc := func(key, value interface{}) bool {
 		svc := value.(*VoltService)
@@ -999,7 +987,6 @@
 // AddSvc adds a service on the VNET on a port. The addition is
 // triggered when NB requests for service addition
 func (vpv *VoltPortVnet) AddSvc(cntx context.Context, svc *VoltService) {
-
 	//vpv.services = append(vpv.services, svc)
 	vpv.AddService(cntx, svc)
 	logger.Debugw(ctx, "Added Service to VPV", log.Fields{"Num of SVCs": vpv.servicesCount.Load(), "SVC": svc})
@@ -1022,7 +1009,7 @@
 		}
 	}
 
-	//TODO: Temp Change - Need to address MAC Learning flow issues completely
+	// TODO: Temp Change - Need to address MAC Learning flow issues completely
 	if (svc.MacLearning == Learn || svc.MacLearning == ReLearn) && NonZeroMacAddress(vpv.MacAddr) {
 		svc.MacAddr = vpv.MacAddr
 	} else if vpv.servicesCount.Load() == 1 {
@@ -1032,12 +1019,12 @@
 	vpv.MacLearning = svc.MacLearning
 	vpv.PonPort = svc.PonPort
 	logger.Debugw(ctx, "Added MAC to VPV", log.Fields{"MacLearning": vpv.MacLearning, "VPV": vpv})
-	//Reconfigure Vlans based on Vlan Control type
+	// Reconfigure Vlans based on Vlan Control type
 	svc.VlanControl = vpv.VlanControl
 	if svc.McastService {
 		vpv.McastService = true
 		vpv.McastTechProfileID = svc.TechProfileID
-		//Assumption: Only one Pbit for mcast service
+		// Assumption: Only one Pbit for mcast service
 		vpv.McastPbit = svc.Pbits[0]
 		vpv.McastUsMeterID = svc.UsMeterID
 		vpv.SchedID = svc.SchedID
@@ -1046,8 +1033,8 @@
 	svc.AllowTransparent = vpv.AllowTransparent
 	svc.SVlanTpid = vpv.SVlanTpid
 
-	//Ensure configuring the mvlan profile only once
-	//One subscriber cannot have multiple mvlan profiles. Only the first configuration is valid
+	// Ensure configuring the mvlan profile only once
+	// One subscriber cannot have multiple mvlan profiles. Only the first configuration is valid
 	if svc.MvlanProfileName != "" {
 		if vpv.MvlanProfileName == "" {
 			vpv.MvlanProfileName = svc.MvlanProfileName
@@ -1059,8 +1046,8 @@
 	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 := errorCodes.GetErrorInfo(err)
-		//TODO-COMM: 		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
+		// statusCode, statusMessage := errorCodes.GetErrorInfo(err)
+		// TODO-COMM: 		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
 		return
 	}
 	if !svc.IsActivated {
@@ -1068,16 +1055,16 @@
 		return
 	}
 
-	//If NNI port is not mached to nb nni port
+	// If NNI port is not mached to nb nni port
 	devConfig := GetApplication().GetDeviceConfig(voltDevice.SerialNum)
 
 	if devConfig.UplinkPort != voltDevice.NniPort {
 		logger.Errorw(ctx, "NNI port mismatch", log.Fields{"NB NNI Port": devConfig.UplinkPort, "SB 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
+	// Push Service Flows if DHCP relay is not configured
+	// or already DHCP flows are configured for the VPV
+	// to which the serivce is associated
 	if vpv.FlowsApplied {
 		if NonZeroMacAddress(vpv.MacAddr) || svc.MacLearning == MacLearningNone {
 			svc.AddHsiaFlows(cntx)
@@ -1088,7 +1075,7 @@
 		}
 	}
 
-	//Assumption: Igmp will be enabled only for one service and SubMgr ensure the same
+	// Assumption: Igmp will be enabled only for one service and SubMgr ensure the same
 	// When already the port is UP and provisioned a service without igmp, then trap flows for subsequent
 	// service with Igmp Enabled needs to be installed
 	if svc.IgmpEnabled && vpv.FlowsApplied {
@@ -1099,7 +1086,7 @@
 		}
 
 		if vpv.McastService {
-			//For McastService, send Service Activated indication once IGMP US flow is pushed
+			// For McastService, send Service Activated indication once IGMP US flow is pushed
 			vpv.RangeOnServices(cntx, PostAccessConfigSuccessInd)
 		}
 	}
@@ -1212,9 +1199,8 @@
 	return true
 }
 
-//AddTrapFlows - Adds US & DS Trap flows
+// AddTrapFlows - Adds US & DS Trap flows
 func (vpv *VoltPortVnet) AddTrapFlows(cntx context.Context) {
-
 	if !vpv.FlowsApplied || vgcRebooted {
 		if vpv.DhcpRelay {
 			if err := vpv.AddUsDhcpFlows(cntx); err != nil {
@@ -1234,7 +1220,6 @@
 				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 := errorCodes.GetErrorInfo(err)
@@ -1250,9 +1235,8 @@
 	}
 }
 
-//DelTrapFlows - Removes all US & DS DHCP, IGMP trap flows.
+// DelTrapFlows - Removes all US & DS DHCP, IGMP trap flows.
 func (vpv *VoltPortVnet) DelTrapFlows(cntx context.Context) {
-
 	// Delete HSIA & DHCP flows before deleting IGMP flows
 	if vpv.FlowsApplied || vgcRebooted {
 		if vpv.DhcpRelay {
@@ -1300,7 +1284,7 @@
 	}
 }
 
-//ClearServiceCounters - Removes all igmp counters for a service
+// ClearServiceCounters - Removes all igmp counters for a service
 func (vpv *VoltPortVnet) ClearServiceCounters(cntx context.Context) {
 	//send flows deleted indication to submgr
 	vpv.RangeOnServices(cntx, ClearServiceCounters)
@@ -1325,23 +1309,21 @@
 	if err == nil {
 		logger.Debugw(ctx, "Adding US DHCP flows", log.Fields{"Device": device})
 		if err1 := vpv.PushFlows(cntx, vd, flows); err1 != nil {
-			//push ind here ABHI
+			// push ind here ABHI
 			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
+		// push ind here ABHI
 		statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
-
 	}
 	return nil
 }
 
 // AddDsDhcpFlows function pushes the DHCP flows to the VOLTHA via the controller
 func (vpv *VoltPortVnet) AddDsDhcpFlows(cntx context.Context) error {
-
 	var vd *VoltDevice
 	device := vpv.Device
 
@@ -1362,17 +1344,15 @@
 	flows, err := vpv.BuildDsDhcpFlows()
 	if err == nil {
 		if err1 := vpv.PushFlows(cntx, vd, flows); err1 != nil {
-			//push ind here and procced
+			// push ind here and procced
 			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
+		// send ind here and proceed
 		statusCode, statusMessage := errorCodes.GetErrorInfo(err)
 		vpv.FlowInstallFailure("VGC processing failure", statusCode, statusMessage)
-
 	}
 	if GetApplication().GetVendorID() != Radisys {
 		vd.GlobalDhcpFlowAdded = true
@@ -1463,7 +1443,6 @@
 
 // AddUsArpFlows pushes the ARP flows to the VOLTHA via the controller
 func (vpv *VoltPortVnet) AddUsArpFlows(cntx context.Context) error {
-
 	var vd *VoltDevice
 	device := vpv.Device
 	if vd = GetApplication().GetDevice(device); vd != nil {
@@ -1553,7 +1532,6 @@
 
 	flows, err := vpv.BuildDsPppoeFlows()
 	if err == nil {
-
 		if err1 := vpv.PushFlows(cntx, vd, flows); err1 != nil {
 			return err1
 		}
@@ -1600,7 +1578,6 @@
 
 // AddIgmpFlows function pushes the IGMP flows to the VOLTHA via the controller
 func (vpv *VoltPortVnet) AddIgmpFlows(cntx context.Context) error {
-
 	if !vpv.IgmpFlowsApplied || vgcRebooted {
 		if vpv.MvlanProfileName == "" {
 			logger.Info(ctx, "Mvlan Profile not configured. Ignoring Igmp trap flow")
@@ -1644,7 +1621,6 @@
 // Write the status of the VPV to the DB once the delete is scheduled
 // for dispatch
 func (vpv *VoltPortVnet) DelIgmpFlows(cntx context.Context) error {
-
 	if vpv.IgmpFlowsApplied || vgcRebooted {
 		device, err := GetApplication().GetDeviceFromPort(vpv.Port)
 		if err != nil {
@@ -1678,7 +1654,7 @@
 	subFlow := of.NewVoltSubFlow()
 	subFlow.SetTableID(0)
 
-	if vpv.VnetType == DPU_MGMT_TRAFFIC {
+	if vpv.VnetType == DpuMgmtTraffic {
 		subFlow.SetMatchVlan(vpv.CVlan)
 		subFlow.SetMatchPbit(vpv.UsPonCTagPriority)
 		subFlow.SetPcp(vpv.UsPonSTagPriority)
@@ -1706,7 +1682,7 @@
 	vpv.services.Range(func(key, value interface{}) bool {
 		vs := value.(*VoltService)
 		var writemetadata uint64
-		if vpv.VnetType == DPU_MGMT_TRAFFIC {
+		if vpv.VnetType == DpuMgmtTraffic {
 			writemetadata = uint64(vs.SVlan)<<48 + uint64(vs.TechProfileID)<<32
 		} else {
 			writemetadata = uint64(vs.TechProfileID) << 32
@@ -1722,7 +1698,7 @@
 	if vpv.AllowTransparent {
 		allowTransparent = 1
 	}
-	if vpv.VnetType != DPU_MGMT_TRAFFIC {
+	if vpv.VnetType != DpuMgmtTraffic {
 		metadata := uint64(allowTransparent)<<56 | uint64(vpv.ONTEtherTypeClassification)<<36 | uint64(vpv.VlanControl)<<32 | uint64(vpv.UniVlan)<<16 | uint64(vpv.CVlan)
 		subFlow.SetTableMetadata(metadata)
 	}
@@ -1737,14 +1713,13 @@
 
 // BuildDsDhcpFlows to build the downstream dhcp flows
 func (vpv *VoltPortVnet) BuildDsDhcpFlows() (*of.VoltFlow, error) {
-
 	logger.Infow(ctx, "Building DS DHCP flow", log.Fields{"Port": vpv.Port, "ML": vpv.MacLearning, "Mac": vpv.MacAddr})
 	flow := &of.VoltFlow{}
 	flow.SubFlows = make(map[uint64]*of.VoltSubFlow)
 	subFlow := of.NewVoltSubFlow()
 	subFlow.SetTableID(0)
 	// match on vlan only for fttb case
-	if vpv.VnetType == DPU_MGMT_TRAFFIC {
+	if vpv.VnetType == DpuMgmtTraffic {
 		subFlow.SetMatchVlan(vpv.SVlan)
 	}
 	subFlow.SetUdpv4Match()
@@ -1769,13 +1744,13 @@
 	if vpv.AllowTransparent {
 		allowTransparent = 1
 	}
-	if vpv.VnetType != DPU_MGMT_TRAFFIC {
+	if vpv.VnetType != DpuMgmtTraffic {
 		metadata := uint64(allowTransparent)<<56 | uint64(vpv.ONTEtherTypeClassification)<<36 | uint64(vpv.VlanControl)<<32 | uint64(vpv.UniVlan)<<16 | uint64(vpv.CVlan)
 		subFlow.SetTableMetadata(metadata)
 		subFlow.Priority = of.DhcpFlowPriority
 	}
 	subFlow.SetReportToController()
-	//| 12-bit cvlan | 4 bits empty | <32-bits uniport>| 16-bits dhcp mask or flow mask |
+	// | 12-bit cvlan | 4 bits empty | <32-bits uniport>| 16-bits dhcp mask or flow mask |
 	subFlow.Cookie = uint64(vpv.CVlan)<<52 | uint64(uniport)<<16 | of.DhcpArpFlowMask | of.DsFlowMask
 
 	flow.SubFlows[subFlow.Cookie] = subFlow
@@ -1815,7 +1790,7 @@
 	// PortName and PortID to be used for validation of port before flow pushing
 	flow.PortID = uniport
 	flow.PortName = vpv.Port
-	//subFlow.SetMeterId(vpv.UsDhcpMeterId)
+	// subFlow.SetMeterId(vpv.UsDhcpMeterId)
 	// metadata := uint64(uniport)
 	// subFlow.SetWriteMetadata(metadata)
 	allowTransparent := 0
@@ -1825,7 +1800,7 @@
 	metadata := uint64(allowTransparent)<<56 | uint64(vpv.ONTEtherTypeClassification)<<36 | uint64(vpv.VlanControl)<<32 | uint64(vpv.UniVlan)<<16 | uint64(vpv.CVlan)
 	subFlow.SetTableMetadata(metadata)
 	subFlow.SetReportToController()
-	//| 12-bit cvlan | 4 bits empty | <32-bits uniport>| 16-bits dhcp mask or flow mask |
+	// | 12-bit cvlan | 4 bits empty | <32-bits uniport>| 16-bits dhcp mask or flow mask |
 	subFlow.Cookie = uint64(vpv.CVlan)<<52 | uint64(uniport)<<16 | of.Dhcpv6FlowMask | of.UsFlowMask
 	subFlow.Priority = of.DhcpFlowPriority
 
@@ -1870,7 +1845,7 @@
 	metadata := uint64(allowTransparent)<<56 | uint64(vpv.ONTEtherTypeClassification)<<36 | uint64(vpv.VlanControl)<<32 | uint64(vpv.UniVlan)<<16 | uint64(vpv.CVlan)
 	subFlow.SetTableMetadata(metadata)
 	subFlow.SetReportToController()
-	//| 12-bit cvlan | 4 bits empty | <32-bits uniport>| 16-bits dhcp mask or flow mask |
+	// | 12-bit cvlan | 4 bits empty | <32-bits uniport>| 16-bits dhcp mask or flow mask |
 	subFlow.Cookie = uint64(vpv.CVlan)<<52 | uint64(uniport)<<16 | of.Dhcpv6FlowMask | of.DsFlowMask
 	subFlow.Priority = of.DhcpFlowPriority
 
@@ -1949,7 +1924,6 @@
 
 // BuildUsPppoeFlows to build upstream pppoe flows
 func (vpv *VoltPortVnet) BuildUsPppoeFlows() (*of.VoltFlow, error) {
-
 	flow := &of.VoltFlow{}
 	flow.SubFlows = make(map[uint64]*of.VoltSubFlow)
 	logger.Infow(ctx, "Building US PPPoE flow", log.Fields{"Port": vpv.Port})
@@ -1984,7 +1958,7 @@
 	metadata = uint64(allowTransparent)<<56 | uint64(vpv.ONTEtherTypeClassification)<<36 | uint64(vpv.VlanControl)<<32 | uint64(vpv.UniVlan)<<16 | uint64(vpv.CVlan)
 	subFlow.SetTableMetadata(metadata)
 
-	//| 12-bit cvlan | 4 bits empty | <32-bits uniport>| 16-bits pppoe mask or flow mask |
+	// | 12-bit cvlan | 4 bits empty | <32-bits uniport>| 16-bits pppoe mask or flow mask |
 	subFlow.Cookie = uint64(vpv.CVlan)<<52 | uint64(uniport)<<16 | of.PppoeFlowMask | of.UsFlowMask
 	subFlow.Priority = of.PppoeFlowPriority
 
@@ -1995,7 +1969,6 @@
 
 // BuildDsPppoeFlows to build downstream pppoe flows
 func (vpv *VoltPortVnet) BuildDsPppoeFlows() (*of.VoltFlow, error) {
-
 	logger.Infow(ctx, "Building DS PPPoE flow", log.Fields{"Port": vpv.Port, "ML": vpv.MacLearning, "Mac": vpv.MacAddr})
 	flow := &of.VoltFlow{}
 	flow.SubFlows = make(map[uint64]*of.VoltSubFlow)
@@ -2031,7 +2004,7 @@
 	metadata = uint64(allowTransparent)<<56 | uint64(vpv.ONTEtherTypeClassification)<<36 | uint64(vpv.VlanControl)<<32 | uint64(vpv.UniVlan)<<16 | uint64(vpv.CVlan)
 	subFlow.SetTableMetadata(metadata)
 	subFlow.SetReportToController()
-	//| 12-bit cvlan | 4 bits empty | <32-bits uniport>| 16-bits dhcp mask or flow mask |
+	// | 12-bit cvlan | 4 bits empty | <32-bits uniport>| 16-bits dhcp mask or flow mask |
 	subFlow.Cookie = uint64(vpv.CVlan)<<52 | uint64(uniport)<<16 | of.PppoeFlowMask | of.DsFlowMask
 	subFlow.Priority = of.PppoeFlowPriority
 
@@ -2085,7 +2058,7 @@
 		subFlow.SetMatchSrcMac(vpv.MacAddr)
 	}
 	logger.Infow(ctx, "Mvlan", log.Fields{"mvlan": mvlan})
-	//metadata := uint64(mvlan)
+	// metadata := uint64(mvlan)
 
 	if vpv.McastService {
 		metadata := uint64(vpv.McastUsMeterID)
@@ -2112,7 +2085,7 @@
 	subFlow.SetTableMetadata(metadata)
 	subFlow.SetIgmpMatch()
 	subFlow.SetReportToController()
-	//| 16 bits empty | <32-bits uniport>| 16-bits igmp mask or flow mask |
+	// | 16 bits empty | <32-bits uniport>| 16-bits igmp mask or flow mask |
 	subFlow.Cookie = uint64(uniport)<<16 | of.IgmpFlowMask | of.UsFlowMask
 	subFlow.Priority = of.IgmpFlowPriority
 
@@ -2130,7 +2103,7 @@
 	vpv.ForceWriteToDb(cntx)
 }
 
-//ForceWriteToDb force commit a VPV to the DB
+// ForceWriteToDb force commit a VPV to the DB
 func (vpv *VoltPortVnet) ForceWriteToDb(cntx context.Context) {
 	vpv.PendingFlowLock.RLock()
 	defer vpv.PendingFlowLock.RUnlock()
@@ -2264,7 +2237,6 @@
 		vpv.setDevice(d.Name)
 		p := d.GetPort(port)
 		if p != nil {
-
 			if vs.PonPort != 0xFF && vs.PonPort != p.PonPort {
 				logger.Errorw(ctx, "UNI port discovered on wrong PON Port. Dropping Flow Push for VPV", log.Fields{"Device": d.Name, "Port": port, "DetectedPon": p.PonPort, "ExpectedPon": vs.PonPort, "Vnet": vpv.VnetName})
 			} else {
@@ -2281,17 +2253,16 @@
 
 // DelVnetFromPort for deleting vnet from port
 func (va *VoltApplication) DelVnetFromPort(cntx context.Context, port string, vpv *VoltPortVnet) {
-
-	//Delete DHCP Session
+	// Delete DHCP Session
 	delDhcpSessions(vpv.LearntMacAddr, vpv.SVlan, vpv.CVlan, vpv.DHCPv6DUID)
 
-	//Delete PPPoE session
+	// Delete PPPoE session
 	delPppoeIaSessions(vpv.LearntMacAddr, vpv.SVlan, vpv.CVlan)
 
-	//Delete Mac from MacPortMap
+	// Delete Mac from MacPortMap
 	va.DeleteMacInPortMap(vpv.MacAddr)
 
-	//Delete VPV
+	// Delete VPV
 	vpvsIntf, ok := va.VnetsByPort.Load(port)
 	if !ok {
 		return
@@ -2349,7 +2320,6 @@
 			va.VnetsToDelete[vnet.Name] = true
 			logger.Warnw(ctx, "Vnet (restored) to be deleted", log.Fields{"Vnet": vnet.Name})
 		}
-
 	}
 }
 
@@ -2371,7 +2341,7 @@
 		return nil
 	}
 
-	//To return the matched service
+	// To return the matched service
 	var service *VoltService
 
 	// This is an access port and the port should have all the associated
@@ -2512,7 +2482,7 @@
 				return true
 			}
 
-			//Pushing ICMPv6 Flow
+			// Pushing ICMPv6 Flow
 			flow := BuildICMPv6Flow(portID, vnet)
 			err = cntlr.GetController().AddFlows(cntx, device.NniPort, device.Name, flow)
 			if err != nil {
@@ -2610,7 +2580,7 @@
 				logger.Warnw(ctx, "Skipping ICMPv6 Flow Deletion - Port Down", log.Fields{"Device": device})
 				return true
 			}
-			//Pushing ICMPv6 Flow
+			// Pushing ICMPv6 Flow
 			flow := BuildICMPv6Flow(portID, vnet)
 			flow.ForceAction = true
 			err := vnet.RemoveFlows(cntx, device, flow)
@@ -2620,7 +2590,7 @@
 			}
 			logger.Infow(ctx, "ICMPv6 Flow Delete Added to Queue", log.Fields{"flow": flow})
 
-			//Pushing ARP Flow
+			// Pushing ARP Flow
 			flow = BuildDSArpFlow(portID, vnet)
 			flow.ForceAction = true
 			err = vnet.RemoveFlows(cntx, device, flow)
@@ -2770,7 +2740,7 @@
 	return flow
 }
 
-//BuildDSArpFlow Builds DS flow for ARP
+// BuildDSArpFlow Builds DS flow for ARP
 func BuildDSArpFlow(inport uint32, vnet *VoltVnet) *of.VoltFlow {
 	logger.Infow(ctx, "Building ARP MC Flow", log.Fields{"SVlan": vnet.SVlan, "CVlan": vnet.CVlan})
 
@@ -2806,7 +2776,6 @@
 
 // setPbitRemarking to set Pbit remarking
 func (vv *VoltVnet) setPbitRemarking() uint32 {
-
 	// 	                              Remarkable
 	// 	         Remarked Pbit          Pbit
 	// |-----------------------------| |------|
@@ -2828,7 +2797,6 @@
 
 // ProcessIcmpv6McGroup to add icmpv6 multicast group
 func ProcessIcmpv6McGroup(device string, delete bool) error {
-
 	logger.Info(ctx, "Creating ICMPv6 MC Group")
 	va := GetApplication()
 	vd := va.GetDevice(device)
@@ -2859,9 +2827,8 @@
 	return err
 }
 
-//isVlanMatching - checks is vlans matches with vpv based on vlan control
+// isVlanMatching - checks is vlans matches with vpv based on vlan control
 func (vpv *VoltPortVnet) isVlanMatching(cvlan of.VlanType, svlan of.VlanType) bool {
-
 	switch vpv.VlanControl {
 	case ONUCVlanOLTSVlan,
 		OLTCVlanOLTSVlan:
@@ -2880,9 +2847,8 @@
 	return false
 }
 
-//PushFlows - Triggers flow addition after registering for flow indication event
+// PushFlows - Triggers flow addition after registering for flow indication event
 func (vpv *VoltPortVnet) PushFlows(cntx context.Context, device *VoltDevice, flow *of.VoltFlow) error {
-
 	for cookie := range flow.SubFlows {
 		cookie := strconv.FormatUint(cookie, 10)
 		fe := &FlowEvent{
@@ -2895,9 +2861,8 @@
 	return cntlr.GetController().AddFlows(cntx, vpv.Port, device.Name, flow)
 }
 
-//FlowInstallFailure - Process flow failure indication and triggers HSIA failure for all associated services
+// FlowInstallFailure - Process flow failure indication and triggers HSIA failure for all associated services
 func (vpv *VoltPortVnet) FlowInstallFailure(cookie string, errorCode uint32, errReason string) {
-
 	sendFlowFailureInd := func(key, value interface{}) bool {
 		//svc := value.(*VoltService)
 		//TODO-COMM: svc.triggerServiceFailureInd(errorCode, errReason)
@@ -2907,9 +2872,8 @@
 	vpv.services.Range(sendFlowFailureInd)
 }
 
-//RemoveFlows - Triggers flow deletion after registering for flow indication event
+// RemoveFlows - Triggers flow deletion after registering for flow indication event
 func (vpv *VoltPortVnet) RemoveFlows(cntx context.Context, device *VoltDevice, flow *of.VoltFlow) error {
-
 	vpv.PendingFlowLock.Lock()
 	defer vpv.PendingFlowLock.Unlock()
 
@@ -2927,7 +2891,7 @@
 	return cntlr.GetController().DelFlows(cntx, vpv.Port, device.Name, flow)
 }
 
-//CheckAndDeleteVpv - remove VPV from DB is there are no pending flows to be removed
+// CheckAndDeleteVpv - remove VPV from DB is there are no pending flows to be removed
 func (vpv *VoltPortVnet) CheckAndDeleteVpv(cntx context.Context) {
 	vpv.PendingFlowLock.RLock()
 	defer vpv.PendingFlowLock.RUnlock()
@@ -2941,7 +2905,7 @@
 	}
 }
 
-//FlowRemoveSuccess - Process flow success indication
+// FlowRemoveSuccess - Process flow success indication
 func (vpv *VoltPortVnet) FlowRemoveSuccess(cntx context.Context, cookie string, device string) {
 	vpv.PendingFlowLock.Lock()
 	logger.Infow(ctx, "VPV Flow Remove Success Notification", log.Fields{"Port": vpv.Port, "Cookie": cookie, "Device": device})
@@ -2952,7 +2916,7 @@
 	vpv.WriteToDb(cntx)
 }
 
-//FlowRemoveFailure - Process flow failure indication and triggers Del HSIA failure for all associated services
+// FlowRemoveFailure - Process flow failure indication and triggers Del HSIA failure for all associated services
 func (vpv *VoltPortVnet) FlowRemoveFailure(cntx context.Context, cookie string, device string, errorCode uint32, errReason string) {
 	vpv.PendingFlowLock.Lock()
 
@@ -2976,9 +2940,8 @@
 	}
 }
 
-//RemoveFlows - Triggers flow deletion after registering for flow indication event
+// RemoveFlows - Triggers flow deletion after registering for flow indication event
 func (vv *VoltVnet) RemoveFlows(cntx context.Context, device *VoltDevice, flow *of.VoltFlow) error {
-
 	vv.VnetLock.Lock()
 	defer vv.VnetLock.Unlock()
 
@@ -3004,7 +2967,7 @@
 	return cntlr.GetController().DelFlows(cntx, device.NniPort, device.Name, flow)
 }
 
-//CheckAndDeleteVnet - remove Vnet from DB is there are no pending flows to be removed
+// CheckAndDeleteVnet - remove Vnet from DB is there are no pending flows to be removed
 func (vv *VoltVnet) CheckAndDeleteVnet(cntx context.Context, device string) {
 	if !vv.DeleteInProgress {
 		return
@@ -3021,7 +2984,7 @@
 	vv.VnetPortLock.RUnlock()
 }
 
-//FlowRemoveSuccess - Process flow success indication
+// FlowRemoveSuccess - Process flow success indication
 func (vv *VoltVnet) FlowRemoveSuccess(cntx context.Context, cookie string, device string) {
 	vv.VnetLock.Lock()
 	defer vv.VnetLock.Unlock()
@@ -3042,9 +3005,8 @@
 	vv.WriteToDb(cntx)
 }
 
-//FlowRemoveFailure - Process flow failure indication
+// FlowRemoveFailure - Process flow failure indication
 func (vv *VoltVnet) FlowRemoveFailure(cntx context.Context, cookie string, device string, errorCode uint32, errReason string) {
-
 	vv.VnetLock.Lock()
 	defer vv.VnetLock.Unlock()
 
@@ -3062,11 +3024,10 @@
 	logger.Errorw(ctx, "Device Flow Remove Failure Notification for Unknown cookie", log.Fields{"Vnet": vv.Name, "Cookie": cookie, "ErrorCode": errorCode, "ErrorReason": errReason})
 }
 
-//IgmpFlowInstallFailure - Process flow failure indication and triggers HSIA failure for Igmp enabled services
+// IgmpFlowInstallFailure - Process flow failure indication and triggers HSIA failure for Igmp enabled services
 func (vpv *VoltPortVnet) IgmpFlowInstallFailure(cookie string, errorCode uint32, errReason string) {
-
-	//Note: Current implementation supports only for single service with Igmp Enabled for a subscriber
-	//When multiple Igmp-suported service enabled, comment "return false"
+	// Note: Current implementation supports only for single service with Igmp Enabled for a subscriber
+	// When multiple Igmp-suported service enabled, comment "return false"
 
 	sendFlowFailureInd := func(key, value interface{}) bool {
 		svc := value.(*VoltService)
@@ -3082,7 +3043,6 @@
 
 // GetMatchingMcastService to get matching multicast service
 func (va *VoltApplication) GetMatchingMcastService(port string, device string, cvlan of.VlanType) *VoltService {
-
 	var service *VoltService
 	dIntf, ok := va.DevicesDisc.Load(device)
 	if !ok {
@@ -3128,7 +3088,7 @@
 	return service
 }
 
-//TriggerAssociatedFlowDelete - Re-trigger delete for pending delete flows
+// TriggerAssociatedFlowDelete - Re-trigger delete for pending delete flows
 func (vv *VoltVnet) TriggerAssociatedFlowDelete(cntx context.Context, device string) bool {
 	vv.VnetLock.Lock()
 	cookieList := []uint64{}
@@ -3159,8 +3119,8 @@
 	return true
 }
 
-// JsonMarshal wrapper function for json Marshal VoltVnet
-func (vv *VoltVnet) JsonMarshal() ([]byte, error) {
+// JSONMarshal wrapper function for json Marshal VoltVnet
+func (vv *VoltVnet) JSONMarshal() ([]byte, error) {
 	return json.Marshal(VoltVnet{
 		VnetConfig: vv.VnetConfig,
 		Version:    vv.Version,
@@ -3172,8 +3132,8 @@
 	})
 }
 
-// JsonMarshal wrapper function for json Marshal VoltPortVnet
-func (vpv *VoltPortVnet) JsonMarshal() ([]byte, error) {
+// JSONMarshal wrapper function for json Marshal VoltPortVnet
+func (vpv *VoltPortVnet) JSONMarshal() ([]byte, error) {
 	return json.Marshal(VoltPortVnet{
 		Device:                     vpv.Device,
 		Port:                       vpv.Port,
diff --git a/internal/pkg/controller/addflows.go b/internal/pkg/controller/addflows.go
index a4bf35c..b303947 100644
--- a/internal/pkg/controller/addflows.go
+++ b/internal/pkg/controller/addflows.go
@@ -11,32 +11,32 @@
 * 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 controller
 
 import (
 	"context"
+	"time"
 	infraerror "voltha-go-controller/internal/pkg/errorcodes"
 	infraerrorcode "voltha-go-controller/internal/pkg/errorcodes/service"
-	"time"
 
 	"voltha-go-controller/internal/pkg/of"
 	"voltha-go-controller/log"
 )
 
 const (
-	//MaxRetryCount - Maximum retry attempts on failure
+	// MaxRetryCount - Maximum retry attempts on failure
 	MaxRetryCount int = 1
 )
 
 // AddFlowsTask structure
 type AddFlowsTask struct {
-	taskID    uint8
 	ctx       context.Context
 	flow      *of.VoltFlow
 	device    *Device
 	timestamp string
+	taskID    uint8
 }
 
 // NewAddFlowsTask is constructor for AddFlowsTask
@@ -84,7 +84,7 @@
 		logger.Infow(ctx, "Flow Mod Request", log.Fields{"Cookie": flow.Cookie, "Oper": aft.flow.Command, "Port": aft.flow.PortID})
 		if aft.flow.Command == of.CommandAdd {
 			flow.State = of.FlowAddPending
-			if err := aft.device.AddFlow(ctx, flow); err != nil {
+			if err = aft.device.AddFlow(ctx, flow); err != nil {
 				logger.Warnw(ctx, "Add Flow Error", log.Fields{"Cookie": flow.Cookie, "Reason": err.Error()})
 
 				// If flow already exists in cache, check for flow state
@@ -161,7 +161,6 @@
 				break
 			}
 			aft.device.triggerFlowNotification(ctx, flow.FlowMod.Cookie, aft.flow.Command, of.BwAvailDetails{}, nil)
-
 		} else {
 			logger.Errorw(ctx, "Update Flow Table Failed: Voltha Client Unavailable", log.Fields{"Flow": flow})
 		}
@@ -178,7 +177,6 @@
 
 	if oper == of.CommandAdd && volthaErrorCode == infraerrorcode.ErrAlreadyExists {
 		return true
-
 	} else if oper == of.CommandDel && volthaErrorCode == infraerrorcode.ErrNotExists {
 		return true
 	}
diff --git a/internal/pkg/controller/auditdevice.go b/internal/pkg/controller/auditdevice.go
index 2ba8772..b322737 100644
--- a/internal/pkg/controller/auditdevice.go
+++ b/internal/pkg/controller/auditdevice.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 controller
 
@@ -21,6 +21,7 @@
 
 	"voltha-go-controller/internal/pkg/tasks"
 	"voltha-go-controller/log"
+
 	"github.com/opencord/voltha-protos/v5/go/common"
 	ofp "github.com/opencord/voltha-protos/v5/go/openflow_13"
 )
@@ -42,12 +43,12 @@
 
 // AuditDevice structure
 type AuditDevice struct {
-	taskID    uint8
 	ctx       context.Context
 	device    *Device
-	stop      bool
 	timestamp string
 	event     AuditEventType
+	taskID    uint8
+	stop      bool
 }
 
 // NewAuditDevice is constructor for AuditDevice
@@ -88,7 +89,7 @@
 	ad.ctx = ctx
 
 	if ad.stop {
-		logger.Errorw(ctx, "Audit Device Task Cancelled", log.Fields{"Context": ad.ctx, "Task": ad.taskID})
+		logger.Errorw(ctx, "Audit Device Task Canceled", log.Fields{"Context": ad.ctx, "Task": ad.taskID})
 		return tasks.ErrTaskCancelError
 	}
 
@@ -133,7 +134,6 @@
 			excessPorts = append(excessPorts, id)
 		}
 		logger.Debugw(ctx, "Processed Port State Ind", log.Fields{"Port No": vgcPort.ID, "Port Name": vgcPort.Name})
-
 	}
 
 	// 1st process the NNI port before all other ports so that the device state can be updated.
@@ -155,7 +155,7 @@
 	GetController().ResetAuditFlags(ad.device)
 
 	if ad.stop {
-		logger.Errorw(ctx, "Audit Device Task Cancelled", log.Fields{"Context": ad.ctx, "Task": ad.taskID})
+		logger.Errorw(ctx, "Audit Device Task Canceled", log.Fields{"Context": ad.ctx, "Task": ad.taskID})
 		return tasks.ErrTaskCancelError
 	}
 	ad.AddMissingPorts(ctx, missingPorts)
@@ -181,7 +181,6 @@
 			ad.device.ProcessPortState(cntx, mp.PortNo, mp.State)
 		}
 		logger.Debugw(ctx, "Processed Port Add Ind", log.Fields{"Port No": mp.PortNo, "Port Name": mp.Name})
-
 	}
 
 	// 1st process the NNI port before all other ports so that the flow provisioning for UNIs can be enabled
diff --git a/internal/pkg/controller/audittables.go b/internal/pkg/controller/audittables.go
index 334ce41..26b250e 100644
--- a/internal/pkg/controller/audittables.go
+++ b/internal/pkg/controller/audittables.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 controller
 
@@ -25,6 +25,7 @@
 	"voltha-go-controller/internal/pkg/tasks"
 	"voltha-go-controller/internal/pkg/util"
 	"voltha-go-controller/log"
+
 	"github.com/opencord/voltha-protos/v5/go/common"
 	ofp "github.com/opencord/voltha-protos/v5/go/openflow_13"
 	"github.com/opencord/voltha-protos/v5/go/voltha"
@@ -38,11 +39,11 @@
 
 // AuditTablesTask structure
 type AuditTablesTask struct {
-	taskID    uint8
 	ctx       context.Context
 	device    *Device
-	stop      bool
 	timestamp string
+	taskID    uint8
+	stop      bool
 }
 
 // NewAuditTablesTask is constructor for AuditTablesTask
@@ -114,7 +115,6 @@
 	att.DelExcessGroups(rcvdGroups)
 	logger.Warnw(ctx, "Audit Table Task Completed", log.Fields{"Context": ctx, "taskId": taskID, "Device": att.device.ID})
 	return errInfo
-
 }
 
 // AuditMeters : Audit the meters which includes fetching the existing meters at the
@@ -122,7 +122,6 @@
 // ones held at VOLTHA. The delta must be cleaned up to keep both the
 // components in sync
 func (att *AuditTablesTask) AuditMeters() error {
-
 	if att.stop {
 		return tasks.ErrTaskCancelError
 	}
@@ -150,7 +149,6 @@
 	// Verify all meters that are in the controller but not in the device
 	missingMeters := []*of.Meter{}
 	for _, meter := range att.device.meters {
-
 		if att.stop {
 			break
 		}
@@ -218,7 +216,6 @@
 // ones held at VOLTHA. The delta must be cleaned up to keep both the
 // components in sync
 func (att *AuditTablesTask) AuditFlows(cntx context.Context) error {
-
 	if att.stop {
 		return tasks.ErrTaskCancelError
 	}
@@ -256,7 +253,6 @@
 	att.device.flowLock.Lock()
 	// Verify all flows that are in the controller but not in the device
 	for _, flow := range att.device.flows {
-
 		if att.stop {
 			break
 		}
@@ -336,7 +332,6 @@
 
 	// Let's cycle through the flows to delete the excess flows
 	for _, flow := range flows {
-
 		if _, present := att.device.GetFlow(flow.Cookie); present {
 			logger.Warnw(ctx, "Flow Present in DB. Ignoring Delete Excess Flow", log.Fields{"Device": att.device.ID, "Cookie": flow.Cookie})
 			continue
@@ -377,7 +372,6 @@
 // ones held at VOLTHA. The delta must be cleaned up to keep both the
 // components in sync
 func (att *AuditTablesTask) AuditGroups() (map[uint32]*ofp.OfpGroupDesc, error) {
-
 	// Build the map for easy and faster processing
 	rcvdGroups = make(map[uint32]*ofp.OfpGroupDesc)
 
@@ -431,7 +425,6 @@
 
 // compareGroupEntries to compare the group entries
 func (att *AuditTablesTask) compareGroupEntries(key, value interface{}) bool {
-
 	if att.stop {
 		return false
 	}
@@ -454,12 +447,11 @@
 }
 
 func compareGroupMembers(refGroup *of.Group, rcvdGroup *ofp.OfpGroupDesc) {
-
 	portList := []uint32{}
 	refPortList := []uint32{}
 
-	//Collect port list from response Group Mod structure
-	//If PON is configured even for one group, then only PON shall be considered for compared for all groups
+	// Collect port list from response Group Mod structure
+	// If PON is configured even for one group, then only PON shall be considered for compared for all groups
 	for _, bucket := range rcvdGroup.Buckets {
 		for _, actionBucket := range bucket.Actions {
 			if actionBucket.Type == ofp.OfpActionType_OFPAT_OUTPUT {
@@ -471,18 +463,18 @@
 
 	refPortList = append(refPortList, refGroup.Buckets...)
 
-	//Is port list differs, trigger group update
+	// Is port list differs, trigger group update
 	if !util.IsSliceSame(refPortList, portList) {
 		groupsToMod = append(groupsToMod, refGroup)
 	}
 }
 
-//AddMissingGroups - addmissing groups to Voltha
+// AddMissingGroups - addmissing groups to Voltha
 func (att *AuditTablesTask) AddMissingGroups(groupList []*of.Group) {
 	att.PushGroups(groupList, of.GroupCommandAdd)
 }
 
-//UpdateMismatchGroups - updates mismatched groups to Voltha
+// UpdateMismatchGroups - updates mismatched groups to Voltha
 func (att *AuditTablesTask) UpdateMismatchGroups(groupList []*of.Group) {
 	att.PushGroups(groupList, of.GroupCommandMod)
 }
@@ -522,7 +514,7 @@
 		group.Device = att.device.ID
 		group.GroupID = groupDesc.GroupId
 
-		//Group Members should be deleted before triggered group delete
+		// Group Members should be deleted before triggered group delete
 		group.Command = of.GroupCommandMod
 		groupUpdate := of.CreateGroupTableUpdate(group)
 		if _, err := vc.UpdateLogicalDeviceFlowGroupTable(att.ctx, groupUpdate); err != nil {
@@ -538,119 +530,115 @@
 }
 
 func (att *AuditTablesTask) AuditPorts() error {
+	if att.stop {
+		return tasks.ErrTaskCancelError
+	}
 
-        if att.stop {
-                return tasks.ErrTaskCancelError
-        }
+	var vc voltha.VolthaServiceClient
+	if vc = att.device.VolthaClient(); vc == nil {
+		logger.Error(ctx, "Flow Audit Failed: Voltha Client Unavailable")
+		return nil
+	}
+	ofpps, err := vc.ListLogicalDevicePorts(att.ctx, &common.ID{Id: att.device.ID})
+	if err != nil {
+		return err
+	}
 
-        var vc voltha.VolthaServiceClient
-        if vc = att.device.VolthaClient(); vc == nil {
-                logger.Error(ctx, "Flow Audit Failed: Voltha Client Unavailable")
-                return nil
-        }
-        ofpps, err := vc.ListLogicalDevicePorts(att.ctx, &common.ID{Id: att.device.ID})
-        if err != nil {
-                return err
-        }
+	// Compute the difference between the ports received and ports at VGC
+	// First build a map of all the received ports under missing ports. We
+	// will eliminate the ports that are in the device from the missing ports
+	// so that the elements remaining are missing ports. The ones that are
+	// not in missing ports are added to excess ports which should be deleted
+	// from the VGC.
+	missingPorts := make(map[uint32]*ofp.OfpPort)
+	for _, ofpp := range ofpps.Items {
+		missingPorts[ofpp.OfpPort.PortNo] = ofpp.OfpPort
+	}
 
-        // Compute the difference between the ports received and ports at VGC
-        // First build a map of all the received ports under missing ports. We
-        // will eliminate the ports that are in the device from the missing ports
-        // so that the elements remaining are missing ports. The ones that are
-        // not in missing ports are added to excess ports which should be deleted
-        // from the VGC.
-        missingPorts := make(map[uint32]*ofp.OfpPort)
-        for _, ofpp := range ofpps.Items {
-                missingPorts[ofpp.OfpPort.PortNo] = ofpp.OfpPort
-        }
+	var excessPorts []uint32
+	processPortState := func(id uint32, vgcPort *DevicePort) {
+		logger.Debugw(ctx, "Process Port State Ind", log.Fields{"Port No": vgcPort.ID, "Port Name": vgcPort.Name})
 
-        var excessPorts []uint32
-        processPortState := func(id uint32, vgcPort *DevicePort) {
-                logger.Debugw(ctx, "Process Port State Ind", log.Fields{"Port No": vgcPort.ID, "Port Name": vgcPort.Name})
+		if ofpPort, ok := missingPorts[id]; ok {
+			if ((vgcPort.State == PortStateDown) && (ofpPort.State == uint32(ofp.OfpPortState_OFPPS_LIVE))) || ((vgcPort.State == PortStateUp) && (ofpPort.State != uint32(ofp.OfpPortState_OFPPS_LIVE))) {
+				// This port exists in the received list and the map at
+				// VGC. This is common so delete it
+				logger.Infow(ctx, "Port State Mismatch", log.Fields{"Port": vgcPort.ID, "OfpPort": ofpPort.PortNo, "ReceivedState": ofpPort.State, "CurrentState": vgcPort.State})
+				att.device.ProcessPortState(ctx, ofpPort.PortNo, ofpPort.State)
+			}
+			delete(missingPorts, id)
+		} else {
+			// This port is missing from the received list. This is an
+			// excess port at VGC. This must be added to excess ports
+			excessPorts = append(excessPorts, id)
+		}
+		logger.Debugw(ctx, "Processed Port State Ind", log.Fields{"Port No": vgcPort.ID, "Port Name": vgcPort.Name})
+	}
+	// 1st process the NNI port before all other ports so that the device state can be updated.
+	if vgcPort, ok := att.device.PortsByID[NNIPortID]; ok {
+		logger.Info(ctx, "Processing NNI port state")
+		processPortState(NNIPortID, vgcPort)
+	}
 
-                if ofpPort, ok := missingPorts[id]; ok {
-                        if ((vgcPort.State == PortStateDown) && (ofpPort.State == uint32(ofp.OfpPortState_OFPPS_LIVE))) || ((vgcPort.State == PortStateUp) && (ofpPort.State != uint32(ofp.OfpPortState_OFPPS_LIVE))) {
-                                // This port exists in the received list and the map at
-                                // VGC. This is common so delete it
-                                logger.Infow(ctx, "Port State Mismatch", log.Fields{"Port": vgcPort.ID, "OfpPort": ofpPort.PortNo, "ReceivedState": ofpPort.State, "CurrentState": vgcPort.State})
-                                att.device.ProcessPortState(ctx, ofpPort.PortNo, ofpPort.State)
-                        }
-                        delete(missingPorts, id)
-                } else {
-                        // This port is missing from the received list. This is an
-                        // excess port at VGC. This must be added to excess ports
-                        excessPorts = append(excessPorts, id)
-                }
-                logger.Debugw(ctx, "Processed Port State Ind", log.Fields{"Port No": vgcPort.ID, "Port Name": vgcPort.Name})
-
-        }
-        // 1st process the NNI port before all other ports so that the device state can be updated.
-        if vgcPort, ok := att.device.PortsByID[NNIPortID]; ok {
-                logger.Info(ctx, "Processing NNI port state")
-                processPortState(NNIPortID, vgcPort)
-        }
-
-        for id, vgcPort := range att.device.PortsByID {
-                if id == NNIPortID {
-                        //NNI port already processed
-                        continue
-                }
-                if att.stop {
-                        break
-                }
-                processPortState(id, vgcPort)
-        }
+	for id, vgcPort := range att.device.PortsByID {
+		if id == NNIPortID {
+			// NNI port already processed
+			continue
+		}
+		if att.stop {
+			break
+		}
+		processPortState(id, vgcPort)
+	}
 
 	if att.stop {
-                logger.Errorw(ctx, "Audit Device Task Cancelled", log.Fields{"Context": att.ctx, "Task": att.taskID})
-                return tasks.ErrTaskCancelError
-        }
-        att.AddMissingPorts(ctx, missingPorts)
-        att.DelExcessPorts(ctx, excessPorts)
+		logger.Errorw(ctx, "Audit Device Task Canceled", log.Fields{"Context": att.ctx, "Task": att.taskID})
+		return tasks.ErrTaskCancelError
+	}
+	att.AddMissingPorts(ctx, missingPorts)
+	att.DelExcessPorts(ctx, excessPorts)
 	return nil
 }
 
 // AddMissingPorts to add the missing ports
 func (att *AuditTablesTask) AddMissingPorts(cntx context.Context, mps map[uint32]*ofp.OfpPort) {
-        logger.Debugw(ctx, "Device Audit - Add Missing Ports", log.Fields{"NumPorts": len(mps)})
+	logger.Debugw(ctx, "Device Audit - Add Missing Ports", log.Fields{"NumPorts": len(mps)})
 
-        addMissingPort := func(mp *ofp.OfpPort) {
-                logger.Debugw(ctx, "Process Port Add Ind", log.Fields{"Port No": mp.PortNo, "Port Name": mp.Name})
+	addMissingPort := func(mp *ofp.OfpPort) {
+		logger.Debugw(ctx, "Process Port Add Ind", log.Fields{"Port No": mp.PortNo, "Port Name": mp.Name})
 
-                // Error is ignored as it only drops duplicate ports
-                logger.Infow(ctx, "Calling AddPort", log.Fields{"No": mp.PortNo, "Name": mp.Name})
-                if err := att.device.AddPort(cntx, mp); err != nil {
-                        logger.Warnw(ctx, "AddPort Failed", log.Fields{"No": mp.PortNo, "Name": mp.Name, "Reason": err})
-                }
-                if mp.State == uint32(ofp.OfpPortState_OFPPS_LIVE) {
-                        att.device.ProcessPortState(cntx, mp.PortNo, mp.State)
-                }
-                logger.Debugw(ctx, "Processed Port Add Ind", log.Fields{"Port No": mp.PortNo, "Port Name": mp.Name})
+		// Error is ignored as it only drops duplicate ports
+		logger.Infow(ctx, "Calling AddPort", log.Fields{"No": mp.PortNo, "Name": mp.Name})
+		if err := att.device.AddPort(cntx, mp); err != nil {
+			logger.Warnw(ctx, "AddPort Failed", log.Fields{"No": mp.PortNo, "Name": mp.Name, "Reason": err})
+		}
+		if mp.State == uint32(ofp.OfpPortState_OFPPS_LIVE) {
+			att.device.ProcessPortState(cntx, mp.PortNo, mp.State)
+		}
+		logger.Debugw(ctx, "Processed Port Add Ind", log.Fields{"Port No": mp.PortNo, "Port Name": mp.Name})
+	}
 
-        }
+	// 1st process the NNI port before all other ports so that the flow provisioning for UNIs can be enabled
+	if mp, ok := mps[NNIPortID]; ok {
+		logger.Info(ctx, "Adding Missing NNI port")
+		addMissingPort(mp)
+	}
 
-        // 1st process the NNI port before all other ports so that the flow provisioning for UNIs can be enabled
-        if mp, ok := mps[NNIPortID]; ok {
-                logger.Info(ctx, "Adding Missing NNI port")
-                addMissingPort(mp)
-        }
-
-        for portNo, mp := range mps {
-                if portNo != NNIPortID {
-                        addMissingPort(mp)
-                }
-        }
+	for portNo, mp := range mps {
+		if portNo != NNIPortID {
+			addMissingPort(mp)
+		}
+	}
 }
 
 // DelExcessPorts to delete the excess ports
 func (att *AuditTablesTask) DelExcessPorts(cntx context.Context, eps []uint32) {
-        logger.Debugw(ctx, "Device Audit - Delete Excess Ports", log.Fields{"NumPorts": len(eps)})
-        for _, id := range eps {
-                // Now delete the port from the device @ VGC
-                logger.Infow(ctx, "Device Audit - Deleting Port", log.Fields{"PortId": id})
-                if err := att.device.DelPort(cntx, id); err != nil {
-                        logger.Warnw(ctx, "DelPort Failed", log.Fields{"PortId": id, "Reason": err})
-                }
-        }
+	logger.Debugw(ctx, "Device Audit - Delete Excess Ports", log.Fields{"NumPorts": len(eps)})
+	for _, id := range eps {
+		// Now delete the port from the device @ VGC
+		logger.Infow(ctx, "Device Audit - Deleting Port", log.Fields{"PortId": id})
+		if err := att.device.DelPort(cntx, id); err != nil {
+			logger.Warnw(ctx, "DelPort Failed", log.Fields{"PortId": id, "Reason": err})
+		}
+	}
 }
-
diff --git a/internal/pkg/controller/changeevent.go b/internal/pkg/controller/changeevent.go
index 9a14d1a..77e7e68 100644
--- a/internal/pkg/controller/changeevent.go
+++ b/internal/pkg/controller/changeevent.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 controller
 
@@ -21,16 +21,17 @@
 	"time"
 
 	"voltha-go-controller/log"
+
 	ofp "github.com/opencord/voltha-protos/v5/go/openflow_13"
 )
 
 // ChangeEventTask structure
 type ChangeEventTask struct {
-	taskID    uint8
 	ctx       context.Context
 	event     *ofp.ChangeEvent
 	device    *Device
 	timestamp string
+	taskID    uint8
 }
 
 // NewChangeEventTask is constructor for ChangeEventTask
diff --git a/internal/pkg/controller/controller.go b/internal/pkg/controller/controller.go
index 1e76e9e..ffead2b 100644
--- a/internal/pkg/controller/controller.go
+++ b/internal/pkg/controller/controller.go
@@ -50,17 +50,17 @@
 
 // VoltController structure
 type VoltController struct {
-	rebootLock              sync.Mutex
-	rebootInProgressDevices map[string]string
-	devices                 map[string]*Device
-	deviceLock              sync.RWMutex
-	vagent                  map[string]*vpagent.VPAgent
 	ctx                     context.Context
 	app                     intf.App
-	RebootFlow              bool
 	BlockedDeviceList       *util.ConcurrentMap
 	deviceTaskQueue         *util.ConcurrentMap
+	vagent                  map[string]*vpagent.VPAgent
+	devices                 map[string]*Device
+	rebootInProgressDevices map[string]string
+	deviceLock              sync.RWMutex
+	rebootLock              sync.Mutex
 	deviceTableSyncDuration time.Duration
+	RebootFlow              bool
 }
 
 var vcontroller *VoltController
@@ -81,20 +81,19 @@
 	return &controller
 }
 
-//SetDeviceTableSyncDuration - sets interval between device table sync up activity
-//  duration - in minutes
+// SetDeviceTableSyncDuration - sets interval between device table sync up activity
+// duration - in minutes
 func (v *VoltController) SetDeviceTableSyncDuration(duration int) {
 	v.deviceTableSyncDuration = time.Duration(duration) * time.Second
 }
 
-//GetDeviceTableSyncDuration - returns configured device table sync duration
+// GetDeviceTableSyncDuration - returns configured device table sync duration
 func (v *VoltController) GetDeviceTableSyncDuration() time.Duration {
 	return v.deviceTableSyncDuration
 }
 
 // AddDevice to add device
 func (v *VoltController) AddDevice(cntx context.Context, config *intf.VPClientCfg) intf.IVPClient {
-
 	d := NewDevice(cntx, config.DeviceID, config.SerialNum, config.VolthaClient, config.SouthBoundID, config.MfrDesc, config.HwDesc, config.SwDesc)
 	v.devices[config.DeviceID] = d
 	v.app.AddDevice(cntx, d.ID, d.SerialNum, config.SouthBoundID)
@@ -123,7 +122,7 @@
 	logger.Warnw(ctx, "Deleted device", log.Fields{"Device": id})
 }
 
-//AddControllerTask - add task to controller queue
+// AddControllerTask - add task to controller queue
 func (v *VoltController) AddControllerTask(device string, task tasks.Task) {
 	var taskQueueIntf interface{}
 	var taskQueue *tasks.Tasks
@@ -138,8 +137,8 @@
 	logger.Warnw(ctx, "Task Added to Controller Task List", log.Fields{"Len": taskQueue.NumPendingTasks(), "Total": taskQueue.TotalTasks()})
 }
 
-//AddNewDevice - called when new device is discovered. This will be
-//processed as part of controller queue
+// AddNewDevice - called when new device is discovered. This will be
+// processed as part of controller queue
 func (v *VoltController) AddNewDevice(config *intf.VPClientCfg) {
 	adt := NewAddDeviceTask(config)
 	v.AddControllerTask(config.DeviceID, adt)
@@ -210,12 +209,12 @@
 	v.app.DeviceDisableInd(cntx, dID)
 }
 
-//TriggerPendingProfileDeleteReq - trigger pending profile delete requests
+// TriggerPendingProfileDeleteReq - trigger pending profile delete requests
 func (v *VoltController) TriggerPendingProfileDeleteReq(cntx context.Context, device string) {
 	v.app.TriggerPendingProfileDeleteReq(cntx, device)
 }
 
-//TriggerPendingMigrateServicesReq - trigger pending services migration requests
+// TriggerPendingMigrateServicesReq - trigger pending services migration requests
 func (v *VoltController) TriggerPendingMigrateServicesReq(cntx context.Context, device string) {
 	v.app.TriggerPendingMigrateServicesReq(cntx, device)
 }
@@ -232,7 +231,7 @@
 	device.auditInProgress = false
 }
 
-//ProcessFlowModResultIndication - send flow mod result notification
+// ProcessFlowModResultIndication - send flow mod result notification
 func (v *VoltController) ProcessFlowModResultIndication(cntx context.Context, flowStatus intf.FlowStatus) {
 	v.app.ProcessFlowModResultIndication(cntx, flowStatus)
 }
@@ -275,7 +274,7 @@
 		return errorCodes.ErrPortNotFound
 	}
 	if d.ctx == nil {
-		//FIXME: Application should know the context before it could submit task. Handle at application level
+		// FIXME: Application should know the context before it could submit task. Handle at application level
 		logger.Errorw(ctx, "Context is missing. AddFlow Operation Not added to Task", log.Fields{"Device": device})
 		return errorCodes.ErrInvalidParamInRequest
 	}
@@ -326,7 +325,7 @@
 		return errorCodes.ErrPortNotFound
 	}
 	if d.ctx == nil {
-		//FIXME: Application should know the context before it could submit task. Handle at application level
+		// FIXME: Application should know the context before it could submit task. Handle at application level
 		logger.Errorw(ctx, "Context is missing. DelFlow Operation Not added to Task", log.Fields{"Device": device})
 		return errorCodes.ErrInvalidParamInRequest
 	}
@@ -376,7 +375,7 @@
 	}
 
 	if d.ctx == nil {
-		//FIXME: Application should know the context before it could submit task. Handle at application level
+		// FIXME: Application should know the context before it could submit task. Handle at application level
 		logger.Errorw(ctx, "Context is missing. GroupMod Operation Not added to task", log.Fields{"Device": device})
 		return errorCodes.ErrInvalidParamInRequest
 	}
@@ -507,7 +506,6 @@
 		return []tasks.Task{}
 	}
 	return d.GetTaskList()
-
 }
 
 // AddBlockedDevices to add devices to blocked devices list
@@ -617,7 +615,6 @@
 }
 
 func (v *VoltController) GetGroups(cntx context.Context, id uint32) (*of.Group, error) {
-
 	logger.Info(ctx, "Entering into GetGroupList method")
 	var groups *of.Group
 	for _, device := range v.devices {
diff --git a/internal/pkg/controller/controllertasks.go b/internal/pkg/controller/controllertasks.go
index 586999c..ddffac2 100644
--- a/internal/pkg/controller/controllertasks.go
+++ b/internal/pkg/controller/controllertasks.go
@@ -27,10 +27,10 @@
 
 // AddDeviceTask structure
 type AddDeviceTask struct {
-	taskID    uint8
 	ctx       context.Context
 	config    *intf.VPClientCfg
 	timestamp string
+	taskID    uint8
 }
 
 // NewAddDeviceTask is the constructor for AddDeviceTask
diff --git a/internal/pkg/controller/device.go b/internal/pkg/controller/device.go
index a3527c8..3ac5600 100644
--- a/internal/pkg/controller/device.go
+++ b/internal/pkg/controller/device.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 controller
 
@@ -20,20 +20,22 @@
 	"encoding/json"
 	"errors"
 	"fmt"
-	infraerror "voltha-go-controller/internal/pkg/errorcodes"
 	"strconv"
 	"strings"
 	"sync"
 	"time"
+	infraerror "voltha-go-controller/internal/pkg/errorcodes"
 
 	"voltha-go-controller/database"
 	"voltha-go-controller/internal/pkg/holder"
 	"voltha-go-controller/internal/pkg/intf"
 	"voltha-go-controller/internal/pkg/of"
+
 	//"voltha-go-controller/internal/pkg/vpagent"
 	"voltha-go-controller/internal/pkg/tasks"
 	"voltha-go-controller/internal/pkg/util"
 	"voltha-go-controller/log"
+
 	ofp "github.com/opencord/voltha-protos/v5/go/openflow_13"
 	"github.com/opencord/voltha-protos/v5/go/voltha"
 )
@@ -54,14 +56,14 @@
 
 // DevicePort structure
 type DevicePort struct {
+	Name    string
+	State   PortState
+	Version string
+	HwAddr  string
 	tasks.Tasks
-	Name      string
-	ID        uint32
-	State     PortState
-	Version   string
-	HwAddr    string
 	CurrSpeed uint32
 	MaxSpeed  uint32
+	ID        uint32
 }
 
 // NewDevicePort is the constructor for DevicePort
@@ -115,32 +117,32 @@
 
 // Device structure
 type Device struct {
+	ctx              context.Context
+	cancel           context.CancelFunc
+	vclientHolder    *holder.VolthaServiceClientHolder
+	packetOutChannel chan *ofp.PacketOut
+	PortsByName      map[string]*DevicePort
+	flows            map[uint64]*of.VoltSubFlow
+	PortsByID        map[uint32]*DevicePort
+	meters           map[uint32]*of.Meter
+	flowQueue        map[uint32]*UniIDFlowQueue // key is hash ID generated and value is UniIDFlowQueue.
+	SouthBoundID     string
+	MfrDesc          string
+	HwDesc           string
+	SwDesc           string
+	ID               string
+	SerialNum        string
+	State            DeviceState
+	TimeStamp        time.Time
+	groups           sync.Map //map[uint32]*of.Group -> [GroupId : Group]
 	tasks.Tasks
-	ID                    string
-	SerialNum             string
-	State                 DeviceState
-	PortsByID             map[uint32]*DevicePort
-	PortsByName           map[string]*DevicePort
 	portLock              sync.RWMutex
-	vclientHolder         *holder.VolthaServiceClientHolder
-	ctx                   context.Context
-	cancel                context.CancelFunc
-	packetOutChannel      chan *ofp.PacketOut
-	flows                 map[uint64]*of.VoltSubFlow
 	flowLock              sync.RWMutex
-	meters                map[uint32]*of.Meter
 	meterLock             sync.RWMutex
-	groups                sync.Map //map[uint32]*of.Group -> [GroupId : Group]
-	auditInProgress       bool
 	flowQueueLock         sync.RWMutex
 	flowHash              uint32
-	flowQueue             map[uint32]*UniIDFlowQueue // key is hash ID generated and value is UniIDFlowQueue.
+	auditInProgress       bool
 	deviceAuditInProgress bool
-	SouthBoundID          string
-	MfrDesc               string
-	HwDesc                string
-	SwDesc                string
-	TimeStamp             time.Time
 }
 
 // NewDevice is the constructor for Device
@@ -155,7 +157,7 @@
 	device.flows = make(map[uint64]*of.VoltSubFlow)
 	device.meters = make(map[uint32]*of.Meter)
 	device.flowQueue = make(map[uint32]*UniIDFlowQueue)
-	//Get the flowhash from db and update the flowhash variable in the device.
+	// Get the flowhash from db and update the flowhash variable in the device.
 	device.SouthBoundID = southBoundID
 	device.MfrDesc = mfr
 	device.HwDesc = hwDesc
@@ -195,7 +197,7 @@
 }
 
 // GetAllFlows - Get the flow from device obj
-func (d *Device) GetAllFlows() ([]*of.VoltSubFlow) {
+func (d *Device) GetAllFlows() []*of.VoltSubFlow {
 	d.flowLock.RLock()
 	defer d.flowLock.RUnlock()
 	var flows []*of.VoltSubFlow
@@ -207,7 +209,7 @@
 }
 
 // GetAllPendingFlows - Get the flow from device obj
-func (d *Device) GetAllPendingFlows() ([]*of.VoltSubFlow) {
+func (d *Device) GetAllPendingFlows() []*of.VoltSubFlow {
 	d.flowLock.RLock()
 	defer d.flowLock.RUnlock()
 	var flows []*of.VoltSubFlow
@@ -322,7 +324,6 @@
 
 // UpdateGroupEntry - Adds/Updates the group to the device and also to the database
 func (d *Device) UpdateGroupEntry(cntx context.Context, group *of.Group) {
-
 	logger.Infow(ctx, "Update Group to device", log.Fields{"ID": group.GroupID})
 	d.groups.Store(group.GroupID, group)
 	d.AddGroupToDb(cntx, group)
@@ -340,7 +341,6 @@
 
 // DelGroupEntry - Deletes the group from the device and the database
 func (d *Device) DelGroupEntry(cntx context.Context, group *of.Group) {
-
 	if _, ok := d.groups.Load(group.GroupID); ok {
 		d.groups.Delete(group.GroupID)
 		d.DelGroupFromDb(cntx, group.GroupID)
@@ -352,7 +352,7 @@
 	_ = db.DelGroup(cntx, d.ID, groupID)
 }
 
-//RestoreGroupsFromDb - restores all groups from DB
+// RestoreGroupsFromDb - restores all groups from DB
 func (d *Device) RestoreGroupsFromDb(cntx context.Context) {
 	logger.Info(ctx, "Restoring Groups")
 	groups, _ := db.GetGroups(cntx, d.ID)
@@ -366,7 +366,7 @@
 	}
 }
 
-//CreateGroupFromString - Forms group struct from json string
+// CreateGroupFromString - Forms group struct from json string
 func (d *Device) CreateGroupFromString(b []byte) {
 	var group of.Group
 	if err := json.Unmarshal(b, &group); err == nil {
@@ -395,15 +395,15 @@
 
 // UpdateMeter to update meter
 func (d *Device) UpdateMeter(cntx context.Context, meter *of.Meter) error {
-       d.meterLock.Lock()
-       defer d.meterLock.Unlock()
-       if _, ok := d.meters[meter.ID]; ok {
-               d.meters[meter.ID] = meter
-               d.AddMeterToDb(cntx, meter)
-       } else {
-               return errors.New("Meter not found for updation")
-       }
-       return nil
+	d.meterLock.Lock()
+	defer d.meterLock.Unlock()
+	if _, ok := d.meters[meter.ID]; ok {
+		d.meters[meter.ID] = meter
+		d.AddMeterToDb(cntx, meter)
+	} else {
+		return errors.New("Meter not found for updation")
+	}
+	return nil
 }
 
 // GetMeter to get meter
@@ -501,7 +501,6 @@
 // DelPort to delete the port as requested by the device/VOLTHA
 // Inform the application if the port is successfully deleted
 func (d *Device) DelPort(cntx context.Context, id uint32) error {
-
 	p := d.GetPortByID(id)
 	if p == nil {
 		return errors.New("Unknown Port")
@@ -594,7 +593,6 @@
 		return p.ID, nil
 	}
 	return 0, errors.New("Unknown Port ID")
-
 }
 
 // WritePortToDb to add the port to the database
@@ -681,13 +679,12 @@
 }
 
 func (d *Device) synchronizeDeviceTables() {
-
 	tick := time.NewTicker(GetController().GetDeviceTableSyncDuration())
 loop:
 	for {
 		select {
 		case <-d.ctx.Done():
-			logger.Warnw(d.ctx, "Context Done. Cancelling Periodic Audit", log.Fields{"Context": ctx, "Device": d.ID, "DeviceSerialNum": d.SerialNum})
+			logger.Warnw(d.ctx, "Context Done. Canceling Periodic Audit", log.Fields{"Context": ctx, "Device": d.ID, "DeviceSerialNum": d.SerialNum})
 			break loop
 		case <-tick.C:
 			t1 := NewAuditTablesTask(d)
@@ -748,7 +745,7 @@
 	GetController().DeviceDisableInd(cntx, d.ID)
 }
 
-//ReSetAllPortStates - Set all logical device port status to DOWN
+// ReSetAllPortStates - Set all logical device port status to DOWN
 func (d *Device) ReSetAllPortStates(cntx context.Context) {
 	logger.Warnw(ctx, "Resetting all Ports State to DOWN", log.Fields{"Device": d.ID, "State": d.State})
 
@@ -765,7 +762,7 @@
 	}
 }
 
-//ReSetAllPortStatesInDb - Set all logical device port status to DOWN in DB and skip indication to application
+// ReSetAllPortStatesInDb - Set all logical device port status to DOWN in DB and skip indication to application
 func (d *Device) ReSetAllPortStatesInDb(cntx context.Context) {
 	logger.Warnw(ctx, "Resetting all Ports State to DOWN In DB", log.Fields{"Device": d.ID, "State": d.State})
 
@@ -990,7 +987,7 @@
 
 func (d *Device) getAndAddFlowQueueForUniID(id uint32) *UniIDFlowQueue {
 	d.flowQueueLock.RLock()
-	//If flowhash is 0 that means flowhash throttling is disabled, return nil
+	// If flowhash is 0 that means flowhash throttling is disabled, return nil
 	if d.flowHash == 0 {
 		d.flowQueueLock.RUnlock()
 		return nil
@@ -1007,7 +1004,6 @@
 }
 
 func (d *Device) addFlowQueueForUniID(id uint32) *UniIDFlowQueue {
-
 	d.flowQueueLock.Lock()
 	defer d.flowQueueLock.Unlock()
 	flowHashID := id % uint32(d.flowHash)
@@ -1037,9 +1033,8 @@
 	}
 }
 
-//isSBOperAllowed - determins if the SB operation is allowed based on device state & force flag
+// isSBOperAllowed - determines if the SB operation is allowed based on device state & force flag
 func (d *Device) isSBOperAllowed(forceAction bool) bool {
-
 	if d.State == DeviceStateUP {
 		return true
 	}
@@ -1057,7 +1052,6 @@
 }
 
 func (d *Device) triggerFlowResultNotification(cntx context.Context, cookie uint64, flow *of.VoltSubFlow, oper of.Command, bwDetails of.BwAvailDetails, err error) {
-
 	statusCode, statusMsg := infraerror.GetErrorInfo(err)
 	success := isFlowOperSuccess(statusCode, oper)
 
@@ -1069,7 +1063,7 @@
 		}
 	}
 
-	//Update flow results
+	// Update flow results
 	// Add - Update Success or Failure status with reason
 	// Del - Delete entry from DB on success else update error reason
 	if oper == of.CommandAdd {
diff --git a/internal/pkg/controller/modgroup.go b/internal/pkg/controller/modgroup.go
index 065c161..9fdb478 100644
--- a/internal/pkg/controller/modgroup.go
+++ b/internal/pkg/controller/modgroup.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 controller
 
@@ -24,19 +24,20 @@
 
 	"voltha-go-controller/internal/pkg/of"
 	"voltha-go-controller/log"
+
 	"google.golang.org/grpc/codes"
 )
 
-//ModGroupTask - Group Modification Task
+// ModGroupTask - Group Modification Task
 type ModGroupTask struct {
-	taskID    uint8
 	ctx       context.Context
 	group     *of.Group
 	device    *Device
 	timestamp string
+	taskID    uint8
 }
 
-//NewModGroupTask - Initializes new group task
+// NewModGroupTask - Initializes new group task
 func NewModGroupTask(ctx context.Context, group *of.Group, device *Device) *ModGroupTask {
 	var grp ModGroupTask
 	grp.device = device
@@ -47,12 +48,12 @@
 	return &grp
 }
 
-//Name - Name of task
+// Name - Name of task
 func (grp *ModGroupTask) Name() string {
 	return "Group Mod Task"
 }
 
-//TaskID - Task id
+// TaskID - Task id
 func (grp *ModGroupTask) TaskID() uint8 {
 	return grp.taskID
 }
@@ -62,11 +63,11 @@
 	return grp.timestamp
 }
 
-//Stop - task stop
+// Stop - task stop
 func (grp *ModGroupTask) Stop() {
 }
 
-//Start - task start
+// Start - task start
 func (grp *ModGroupTask) Start(ctx context.Context, taskID uint8) error {
 	var err error
 	grp.taskID = taskID
@@ -74,11 +75,9 @@
 	i := 0
 
 	processGroupModResult := func(err error) bool {
-
 		statusCode, statusMsg := infraerror.GetErrorInfo(err)
 
 		if infraerrorcode.ErrorCode(statusCode) != infraerrorcode.ErrOk {
-
 			if grp.group.Command == of.GroupCommandAdd && (codes.Code(statusCode) == codes.AlreadyExists) {
 				logger.Warnw(ctx, "Update Group Table Failed - Ignoring since Group Already exists",
 					log.Fields{"groupId": grp.group.GroupID, "groupOp": grp.group.Command, "Status": statusCode, "errorReason": statusMsg})
@@ -90,7 +89,6 @@
 		}
 		logger.Infow(ctx, "Group Mod Result", log.Fields{"groupID": grp.group.GroupID, "Error Code": statusCode})
 		return true
-
 	}
 
 	if grp.group.Command != of.GroupCommandDel {
@@ -107,10 +105,9 @@
 
 	groupUpdate := of.CreateGroupTableUpdate(grp.group)
 	if vc := grp.device.VolthaClient(); vc != nil {
-
-		//Retry on group mod failure
-		//Retry attempts = 3
-		//Delay between retry = 100ms. Total Possible Delay = 200ms
+		// Retry on group mod failure
+		// Retry attempts = 3
+		// Delay between retry = 100ms. Total Possible Delay = 200ms
 		for {
 			logger.Infow(ctx, "Group Mod Triggered", log.Fields{"GroupId": grp.group.GroupID, "Attempt": i})
 			_, err = vc.UpdateLogicalDeviceFlowGroupTable(grp.ctx, groupUpdate)
@@ -124,7 +121,6 @@
 			}
 			logger.Errorw(ctx, "Update Group Table Failed on all 3 attempts. Dropping request", log.Fields{"GroupId": grp.group.GroupID, "Bucket": grp.group.Buckets})
 			break
-
 		}
 		return err
 	}
diff --git a/internal/pkg/controller/modmeter.go b/internal/pkg/controller/modmeter.go
index acbef44..6b677a9 100644
--- a/internal/pkg/controller/modmeter.go
+++ b/internal/pkg/controller/modmeter.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 controller
 
@@ -25,12 +25,12 @@
 
 // ModMeterTask structure
 type ModMeterTask struct {
-	taskID    uint8
 	ctx       context.Context
-	command   of.MeterCommand
 	meter     *of.Meter
 	device    *Device
 	timestamp string
+	command   of.MeterCommand
+	taskID    uint8
 }
 
 // NewModMeterTask is the constructor for ModMeterTask
@@ -69,7 +69,7 @@
 	mmt.taskID = taskID
 	mmt.ctx = ctx
 
-	//Temp commenting Sync response handling
+	// Temp commenting Sync response handling
 	//triggerMeterNotification := func(err error) {
 
 	// 	statusCode, statusMsg := infraerror.GetErrorInfo(err)
@@ -112,12 +112,11 @@
 	}
 
 	if vc := mmt.device.VolthaClient(); vc != nil {
-
 		if _, err = vc.UpdateLogicalDeviceMeterTable(mmt.ctx, meterMod); err != nil {
 			logger.Errorw(ctx, "Update Meter Table Failed", log.Fields{"Reason": err.Error()})
 		} else {
 			mmt.meter.State = of.MeterOperSuccess
-			if err := mmt.device.UpdateMeter(ctx, mmt.meter); err != nil {
+			if err = mmt.device.UpdateMeter(ctx, mmt.meter); err != nil {
 				// Meter does not exist, update failed
 				logger.Error(ctx, "Update meter to DB failed")
 			}
diff --git a/internal/pkg/controller/pendingprofiles.go b/internal/pkg/controller/pendingprofiles.go
index 97bb238..c972e9f 100644
--- a/internal/pkg/controller/pendingprofiles.go
+++ b/internal/pkg/controller/pendingprofiles.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 controller
 
@@ -24,10 +24,10 @@
 
 // PendingProfilesTask structure
 type PendingProfilesTask struct {
-	taskID uint8
 	ctx    context.Context
 	device *Device
 	ts     string
+	taskID uint8
 }
 
 // NewPendingProfilesTask is constructor for PendingProfilesTask
diff --git a/internal/pkg/controller/utils.go b/internal/pkg/controller/utils.go
index c07ac59..179730e 100644
--- a/internal/pkg/controller/utils.go
+++ b/internal/pkg/controller/utils.go
@@ -51,13 +51,9 @@
 		loxiOutputAction := action.(*ofp.ActionOutput)
 		var output openflow_13.OfpActionOutput
 		output.Port = uint32(loxiOutputAction.GetPort())
-		/*
 			var maxLen uint16
 			maxLen = loxiOutputAction.GetMaxLen()
 			output.MaxLen = uint32(maxLen)
-
-		*/
-/*
 		output.MaxLen = 0
 		outputAction.Output = &output
 		ofpAction.Action = &outputAction
diff --git a/internal/pkg/errorcodes/errorcodes.go b/internal/pkg/errorcodes/errorcodes.go
index 4bb0490..68aa55c 100644
--- a/internal/pkg/errorcodes/errorcodes.go
+++ b/internal/pkg/errorcodes/errorcodes.go
@@ -18,6 +18,7 @@
 
 import (
 	"net/http"
+
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
 )
@@ -26,8 +27,8 @@
 type NBErrorCode int
 
 const (
-        // VolthaErrorMessageFormat represents the format in which the Voltha accepts the errors.
-        VolthaErrorMessageFormat = "code = %d, desc = %s"
+	// VolthaErrorMessageFormat represents the format in which the Voltha accepts the errors.
+	VolthaErrorMessageFormat = "code = %d, desc = %s"
 )
 
 // List of error messages returned to Voltha.
@@ -87,247 +88,246 @@
 }
 
 const (
-        //Success is returned when there is no error - 0
-        Success NBErrorCode = iota
-        //InvalidURL is returned when the URL specified for the request is invalid - 1
-        InvalidURL
-        //MissingArgument is returned when the mandatory/conditionally mandatory argument is missing - 2
-        MissingArgument
-        //RequestTimeout is returned when the request timed out. - 3
-        RequestTimeout
-        //ResourceAlreadyExists is returned when the resource already exists and create for the same is not allowed - 4
-        ResourceAlreadyExists
-        //ResourceInImproperState is returned when the resource is in improper state to process the request. - 5
-        ResourceInImproperState
-        //DeviceUnreachable is returned when the device is not reachable - 6
-        DeviceUnreachable
-        //OperationAlreadyInProgress is returned when the requested operation is already in progress - 7
-        OperationAlreadyInProgress
-        //InvalidConfig is returned when the configuration provided is invalid - 8
-        InvalidConfig
-        //ResourceNotFound is returned when the resource is not found - 9
-        ResourceNotFound
-        //MethodNotAllowed is returned when the requested method is not allowed - 10
-        MethodNotAllowed
-        //ResourceInUse is returned when the resource is in use, the delete of the resource is not allowed when in use - 11
-        ResourceInUse
-        //JobIDNotFound is returned when the Job ID not found - 12
-        JobIDNotFound
-        //JobIDAlreadyInUse is returned when the Job ID already in use - 13
-        JobIDAlreadyInUse
-        //PeerUnreachable is returned when the peer is unreachable -14
-        PeerUnreachable
-        //InvalidPatchOperation is returned when the parameter(s) mentioned in the patch operation are invalid - 15
-        InvalidPatchOperation
-        //OLTUnreachable is returned when the OLT is not reachable - 16
-        OLTUnreachable
-        //PrerequisiteNotMet is returned when the required prerequisite is not met to execute the requested procedure - 17
-        PrerequisiteNotMet
-        //MessageEncodeFailed is returned when Message encoding failed - 18
-        MessageEncodeFailed
-        //MessageDecodeFailed is returned when Message decoding failed - 19
-        MessageDecodeFailed
-        //ONTInternalError is returned when Internal error is reported by the ONT - 20
-        ONTInternalError
-        //OLTInternalError is returned when Internal error is reported by the OLT - 21
-        OLTInternalError
-        //VolthaInternalError is returned when Internal error occurred at Voltha - 22
-        VolthaInternalError
-        //ConfigMismatch is returned when the configuration does not match - 23
-        ConfigMismatch
-        //DBOperationFailed is returned when the database operation failed for the key - 24
-        DBOperationFailed
-        //ResourceLimitExceeded is returned when the resource limit exceeded the allowed limit - 25
-        ResourceLimitExceeded
-        //UndefinedEnv is returned when the required environment variable is not defined - 26
-        UndefinedEnv
-        //InvalidArgument is returned when the argument provided is invalid - 27
-        InvalidArgument
-        //InvalidPayload is returned when the configuration payload is invalid - 28
-        InvalidPayload
-        //DuplicateKey is returned when the duplicate entry for the key - 29
-        DuplicateKey
-        //DuplicateValue is returned when the duplicate entry for the value - 30
-        DuplicateValue
-        //UnsupportedOperation is returned when the request operation is not supported - 31
-        UnsupportedOperation
-        //UserUnauthorized is returned when the user is unauthorized to perform the requested operation - 32
-        UserUnauthorized
-        //LiveKPISubscriptionExists is returned when the live KPI subscription exists already for the requested resource - 33
-        LiveKPISubscriptionExists
-        //UnsuccessfulOperation is returned when the requested operation is unsuccessful - 34
-        UnsuccessfulOperation
-        //ResourceInDisabledStateAlready is returned when the resource is in disabled state already - 35
-        ResourceInDisabledStateAlready
-        //ResourceInEnabledStateAlready is returned when the resource is in enabled state already - 36
-        ResourceInEnabledStateAlready
-        //ResourceNotDiscoveredYet is returned when the resource is not discovered yet - 37
-        ResourceNotDiscoveredYet
-        //HighDiskUtilization is returned when the disk utilization is high, consider the disk cleanup. - 38
-        HighDiskUtilization
-        //KafkaError is returned when there is a kafka error - 39
-        KafkaError
-        //ResourceBusy is returned when the component/resource is busy. - 40
-        ResourceBusy
-        // UnsupportedParameter is returned when un supported field is provided in request. -41
-        UnsupportedParameter
-        //JobIDAlreadyExists is returned when the Job ID is already there in DB. -42
-        JobIDAlreadyExists
-        //LiveKPISubscriptionNotFound is returned when the live KPI subscription not found for the requested resource. -42
-        LiveKPISubscriptionNotFound
-        // HostUnreachable is returned when failed to establish the SFTP connection. -44
-        HostUnreachable
-        // DHCPServerUnreachable is returned when dhcp server is unreachable. -45
-        DHCPServerUnreachable
-        // SessionExpired is returned when user session is expired/timeout - 46
-        SessionExpired
-        // AccessDenied is returned when user operation is forbidden - 47
-        AccessDenied
-        // PasswordUpdateRequired is returned when password for the user is about to expire - 48
-        PasswordUpdateRequired
-        // InvalidMessageHeader is returned when token in security request is invalid/nil - 49
-        InvalidMessageHeader
-        // UserAccountBlocked is returned when user account gets blocked after multiple invalid attempts - 50
-        UserAccountBlocked
-        // UserAccountExpired is returned when user account gets expired - 51
-        UserAccountExpired
-        // UserAccountDormant is returned when user account gets dormant - 52
-        UserAccountDormant
-        // InvalidCredentials is returned when credentials are invalid in login request - 53
-        InvalidCredentials
-        // ConcurrentAccessFromMultipleIPs when multiple sessions gets established from same ip - 54
-        ConcurrentAccessFromMultipleIPs
-        // KPIThresholdCrossed when KPI threshold is crossed - 55
-        KPIThresholdCrossed
-        // ONTUnreachable is returned when the ONT is not reachable - 56
-        ONTUnreachable
-        // ResourceUnreachable is returned when the resource is not reachable -57
-        ResourceUnreachable
-        // ONTProcessingError is returned when onu returns processing error for omci message - 58
-        ONTProcessingError
-        // ONTResourceBusy is returned when onu returns device busy error for omci message - 59
-        ONTResourceBusy
-        // ONTMEInstanceExists is returned when onu returns OMCI ME instance exists error for omci message - 60
-        ONTMEInstanceExists
-        // ONTUnknownMEInstance is returned when onu returns OMCI ME Unknown Instance error for omci message - 61
-        ONTUnknownMEInstance
-        // JoinUnsuccessful is returned when an IGMP Join request is unsuccessful - 62
-        JoinUnsuccessful
-        // QueryExpired is returned when there is no response to IGMP Queries from the controller - 63
-        QueryExpired
-        // AvailableBwValidationErr is returned when requested bandwidth is not available on the pon port - 64
-        AvailableBwValidationErr
+	//Success is returned when there is no error - 0
+	Success NBErrorCode = iota
+	//InvalidURL is returned when the URL specified for the request is invalid - 1
+	InvalidURL
+	//MissingArgument is returned when the mandatory/conditionally mandatory argument is missing - 2
+	MissingArgument
+	//RequestTimeout is returned when the request timed out. - 3
+	RequestTimeout
+	//ResourceAlreadyExists is returned when the resource already exists and create for the same is not allowed - 4
+	ResourceAlreadyExists
+	//ResourceInImproperState is returned when the resource is in improper state to process the request. - 5
+	ResourceInImproperState
+	//DeviceUnreachable is returned when the device is not reachable - 6
+	DeviceUnreachable
+	//OperationAlreadyInProgress is returned when the requested operation is already in progress - 7
+	OperationAlreadyInProgress
+	//InvalidConfig is returned when the configuration provided is invalid - 8
+	InvalidConfig
+	//ResourceNotFound is returned when the resource is not found - 9
+	ResourceNotFound
+	//MethodNotAllowed is returned when the requested method is not allowed - 10
+	MethodNotAllowed
+	//ResourceInUse is returned when the resource is in use, the delete of the resource is not allowed when in use - 11
+	ResourceInUse
+	//JobIDNotFound is returned when the Job ID not found - 12
+	JobIDNotFound
+	//JobIDAlreadyInUse is returned when the Job ID already in use - 13
+	JobIDAlreadyInUse
+	//PeerUnreachable is returned when the peer is unreachable -14
+	PeerUnreachable
+	//InvalidPatchOperation is returned when the parameter(s) mentioned in the patch operation are invalid - 15
+	InvalidPatchOperation
+	//OLTUnreachable is returned when the OLT is not reachable - 16
+	OLTUnreachable
+	//PrerequisiteNotMet is returned when the required prerequisite is not met to execute the requested procedure - 17
+	PrerequisiteNotMet
+	//MessageEncodeFailed is returned when Message encoding failed - 18
+	MessageEncodeFailed
+	//MessageDecodeFailed is returned when Message decoding failed - 19
+	MessageDecodeFailed
+	//ONTInternalError is returned when Internal error is reported by the ONT - 20
+	ONTInternalError
+	//OLTInternalError is returned when Internal error is reported by the OLT - 21
+	OLTInternalError
+	//VolthaInternalError is returned when Internal error occurred at Voltha - 22
+	VolthaInternalError
+	//ConfigMismatch is returned when the configuration does not match - 23
+	ConfigMismatch
+	//DBOperationFailed is returned when the database operation failed for the key - 24
+	DBOperationFailed
+	//ResourceLimitExceeded is returned when the resource limit exceeded the allowed limit - 25
+	ResourceLimitExceeded
+	//UndefinedEnv is returned when the required environment variable is not defined - 26
+	UndefinedEnv
+	//InvalidArgument is returned when the argument provided is invalid - 27
+	InvalidArgument
+	//InvalidPayload is returned when the configuration payload is invalid - 28
+	InvalidPayload
+	//DuplicateKey is returned when the duplicate entry for the key - 29
+	DuplicateKey
+	//DuplicateValue is returned when the duplicate entry for the value - 30
+	DuplicateValue
+	//UnsupportedOperation is returned when the request operation is not supported - 31
+	UnsupportedOperation
+	//UserUnauthorized is returned when the user is unauthorized to perform the requested operation - 32
+	UserUnauthorized
+	//LiveKPISubscriptionExists is returned when the live KPI subscription exists already for the requested resource - 33
+	LiveKPISubscriptionExists
+	//UnsuccessfulOperation is returned when the requested operation is unsuccessful - 34
+	UnsuccessfulOperation
+	//ResourceInDisabledStateAlready is returned when the resource is in disabled state already - 35
+	ResourceInDisabledStateAlready
+	//ResourceInEnabledStateAlready is returned when the resource is in enabled state already - 36
+	ResourceInEnabledStateAlready
+	//ResourceNotDiscoveredYet is returned when the resource is not discovered yet - 37
+	ResourceNotDiscoveredYet
+	//HighDiskUtilization is returned when the disk utilization is high, consider the disk cleanup. - 38
+	HighDiskUtilization
+	//KafkaError is returned when there is a kafka error - 39
+	KafkaError
+	//ResourceBusy is returned when the component/resource is busy. - 40
+	ResourceBusy
+	// UnsupportedParameter is returned when un supported field is provided in request. -41
+	UnsupportedParameter
+	//JobIDAlreadyExists is returned when the Job ID is already there in DB. -42
+	JobIDAlreadyExists
+	//LiveKPISubscriptionNotFound is returned when the live KPI subscription not found for the requested resource. -42
+	LiveKPISubscriptionNotFound
+	// HostUnreachable is returned when failed to establish the SFTP connection. -44
+	HostUnreachable
+	// DHCPServerUnreachable is returned when dhcp server is unreachable. -45
+	DHCPServerUnreachable
+	// SessionExpired is returned when user session is expired/timeout - 46
+	SessionExpired
+	// AccessDenied is returned when user operation is forbidden - 47
+	AccessDenied
+	// PasswordUpdateRequired is returned when password for the user is about to expire - 48
+	PasswordUpdateRequired
+	// InvalidMessageHeader is returned when token in security request is invalid/nil - 49
+	InvalidMessageHeader
+	// UserAccountBlocked is returned when user account gets blocked after multiple invalid attempts - 50
+	UserAccountBlocked
+	// UserAccountExpired is returned when user account gets expired - 51
+	UserAccountExpired
+	// UserAccountDormant is returned when user account gets dormant - 52
+	UserAccountDormant
+	// InvalidCredentials is returned when credentials are invalid in login request - 53
+	InvalidCredentials
+	// ConcurrentAccessFromMultipleIPs when multiple sessions gets established from same ip - 54
+	ConcurrentAccessFromMultipleIPs
+	// KPIThresholdCrossed when KPI threshold is crossed - 55
+	KPIThresholdCrossed
+	// ONTUnreachable is returned when the ONT is not reachable - 56
+	ONTUnreachable
+	// ResourceUnreachable is returned when the resource is not reachable -57
+	ResourceUnreachable
+	// ONTProcessingError is returned when onu returns processing error for omci message - 58
+	ONTProcessingError
+	// ONTResourceBusy is returned when onu returns device busy error for omci message - 59
+	ONTResourceBusy
+	// ONTMEInstanceExists is returned when onu returns OMCI ME instance exists error for omci message - 60
+	ONTMEInstanceExists
+	// ONTUnknownMEInstance is returned when onu returns OMCI ME Unknown Instance error for omci message - 61
+	ONTUnknownMEInstance
+	// JoinUnsuccessful is returned when an IGMP Join request is unsuccessful - 62
+	JoinUnsuccessful
+	// QueryExpired is returned when there is no response to IGMP Queries from the controller - 63
+	QueryExpired
+	// AvailableBwValidationErr is returned when requested bandwidth is not available on the pon port - 64
+	AvailableBwValidationErr
 )
 
-//NBErrorCodeMap converts error code to error description string
+// NBErrorCodeMap converts error code to error description string
 var NBErrorCodeMap = map[NBErrorCode]string{
-        Success:                         "Success",
-        InvalidURL:                      "INVALID_URL",
-        RequestTimeout:                  "REQUEST_TIMEOUT",
-        MissingArgument:                 "MISSING_ARGUMENT",
-        ResourceAlreadyExists:           "RESOURCE_ALREADY_EXISTS",
-        ResourceInImproperState:         "RESOURCE_IN_IMPROPER_STATE",
-        DeviceUnreachable:               "DEVICE_UNREACHABLE",
-        OperationAlreadyInProgress:      "OPERATION_ALREADY_IN_PROGRESS",
-        InvalidConfig:                   "INVALID_CONFIG",
-        ResourceNotFound:                "RESOURCE_NOT_FOUND",
-        MethodNotAllowed:                "METHOD_NOT_ALLOWED",
-        ResourceInUse:                   "RESOURCE_IN_USE",
-        JobIDNotFound:                   "JOB_ID_NOT_FOUND",
-        JobIDAlreadyInUse:               "JOB_ID_ALREADY_IN_USE",
-        PeerUnreachable:                 "PEER_UNREACHABLE",
-        InvalidPatchOperation:           "INVALID_PATCH_OPERATION",
-        OLTUnreachable:                  "OLT_UNREACHABLE",
-        PrerequisiteNotMet:              "PREREQUISITE_NOT_MET",
-        MessageEncodeFailed:             "MESSAGE_ENCODE_FAILED",
-        MessageDecodeFailed:             "MESSAGE_DECODE_FAILED",
-        ONTInternalError:                "ONT_INTERNAL_ERROR",
-        OLTInternalError:                "OLT_INTERNAL_ERROR",
-        VolthaInternalError:               "Voltha_INTERNAL_ERROR",
-        ConfigMismatch:                  "CONFIG_MISMATCH",
-        DBOperationFailed:               "DB_OPERATION_FAILED",
-        ResourceLimitExceeded:           "RESOURCE_LIMIT_EXCEEDED",
-        UndefinedEnv:                    "UNDEFINED_ENV",
-        InvalidArgument:                 "INVALID_ARGUMENT",
-        InvalidPayload:                  "INVALID_PAYLOAD",
-        DuplicateKey:                    "DUPLICATE_KEY",
-        DuplicateValue:                  "DUPLICATE_VALUE",
-        UnsupportedOperation:            "UNSUPPORTED_OPERATION",
-        UserUnauthorized:                "USER_UNAUTHORIZED",
-        LiveKPISubscriptionExists:       "LIVE_KPI_SUBSCRIPTION_EXISTS",
-        UnsuccessfulOperation:           "UNSUCCESSFUL_OPERATION",
-        ResourceInDisabledStateAlready:  "RESOURCE_IN_DISABLED_STATE_ALREADY",
-        ResourceInEnabledStateAlready:   "RESOURCE_IN_ENABLED_STATE_ALREADY",
-        ResourceNotDiscoveredYet:        "RESOURCE_NOT_DISCOVERED_YET",
-        HighDiskUtilization:             "HIGH_DISK_UTILIZATION",
-        KafkaError:                      "KAFKA_ERROR",
-        LiveKPISubscriptionNotFound:     "LIVE_KPI_SUBSCRIPTION_NOT_FOUND",
-        ResourceBusy:                    "RESOURCE_BUSY",
-        UnsupportedParameter:            "UNSUPPORTED_PARAMETER",
-        JobIDAlreadyExists:              "JOB_ID_ALREADY_EXISTS",
-        HostUnreachable:                 "HOST_UNREACHABLE",
-        DHCPServerUnreachable:           "DHCP_SERVER_UNREACHABLE",
-        InvalidMessageHeader:            "INVALID_MESSAGE_HEADER",
-        SessionExpired:                  "SESSION_EXPIRED",
-        AccessDenied:                    "ACCESS_DENIED",
-        PasswordUpdateRequired:          "PASSWORD_UPDATE_REQUIRED",
-        InvalidCredentials:              "INVALID_CREDENTIALS",
-        UserAccountBlocked:              "USER_ACCOUNT_BLOCKED",
-        UserAccountExpired:              "USER_ACCOUNT_EXPIRED",
-        ConcurrentAccessFromMultipleIPs: "CONCURRENT_ACCESS_FROM_MULTIPLE_IPS",
-        KPIThresholdCrossed:             "KPI_THRESHOLD_CROSSED",
-        ONTUnreachable:                  "ONT_UNREACHABLE",
-        ONTProcessingError:              "ONT_PROCESSING_ERROR",
-        ONTResourceBusy:                 "ONT_RESOURCE_BUSY",
-        ONTMEInstanceExists:             "ONT_ME_INSTANCE_ALREADY_EXISTS",
-        ONTUnknownMEInstance:            "ONT_UNKNOWN_ME_INSTANCE",
-        JoinUnsuccessful:                "JOIN_UNSUCCESSFUL",
-        QueryExpired:                    "QUERY_EXPIRED",
+	Success:                         "Success",
+	InvalidURL:                      "INVALID_URL",
+	RequestTimeout:                  "REQUEST_TIMEOUT",
+	MissingArgument:                 "MISSING_ARGUMENT",
+	ResourceAlreadyExists:           "RESOURCE_ALREADY_EXISTS",
+	ResourceInImproperState:         "RESOURCE_IN_IMPROPER_STATE",
+	DeviceUnreachable:               "DEVICE_UNREACHABLE",
+	OperationAlreadyInProgress:      "OPERATION_ALREADY_IN_PROGRESS",
+	InvalidConfig:                   "INVALID_CONFIG",
+	ResourceNotFound:                "RESOURCE_NOT_FOUND",
+	MethodNotAllowed:                "METHOD_NOT_ALLOWED",
+	ResourceInUse:                   "RESOURCE_IN_USE",
+	JobIDNotFound:                   "JOB_ID_NOT_FOUND",
+	JobIDAlreadyInUse:               "JOB_ID_ALREADY_IN_USE",
+	PeerUnreachable:                 "PEER_UNREACHABLE",
+	InvalidPatchOperation:           "INVALID_PATCH_OPERATION",
+	OLTUnreachable:                  "OLT_UNREACHABLE",
+	PrerequisiteNotMet:              "PREREQUISITE_NOT_MET",
+	MessageEncodeFailed:             "MESSAGE_ENCODE_FAILED",
+	MessageDecodeFailed:             "MESSAGE_DECODE_FAILED",
+	ONTInternalError:                "ONT_INTERNAL_ERROR",
+	OLTInternalError:                "OLT_INTERNAL_ERROR",
+	VolthaInternalError:             "Voltha_INTERNAL_ERROR",
+	ConfigMismatch:                  "CONFIG_MISMATCH",
+	DBOperationFailed:               "DB_OPERATION_FAILED",
+	ResourceLimitExceeded:           "RESOURCE_LIMIT_EXCEEDED",
+	UndefinedEnv:                    "UNDEFINED_ENV",
+	InvalidArgument:                 "INVALID_ARGUMENT",
+	InvalidPayload:                  "INVALID_PAYLOAD",
+	DuplicateKey:                    "DUPLICATE_KEY",
+	DuplicateValue:                  "DUPLICATE_VALUE",
+	UnsupportedOperation:            "UNSUPPORTED_OPERATION",
+	UserUnauthorized:                "USER_UNAUTHORIZED",
+	LiveKPISubscriptionExists:       "LIVE_KPI_SUBSCRIPTION_EXISTS",
+	UnsuccessfulOperation:           "UNSUCCESSFUL_OPERATION",
+	ResourceInDisabledStateAlready:  "RESOURCE_IN_DISABLED_STATE_ALREADY",
+	ResourceInEnabledStateAlready:   "RESOURCE_IN_ENABLED_STATE_ALREADY",
+	ResourceNotDiscoveredYet:        "RESOURCE_NOT_DISCOVERED_YET",
+	HighDiskUtilization:             "HIGH_DISK_UTILIZATION",
+	KafkaError:                      "KAFKA_ERROR",
+	LiveKPISubscriptionNotFound:     "LIVE_KPI_SUBSCRIPTION_NOT_FOUND",
+	ResourceBusy:                    "RESOURCE_BUSY",
+	UnsupportedParameter:            "UNSUPPORTED_PARAMETER",
+	JobIDAlreadyExists:              "JOB_ID_ALREADY_EXISTS",
+	HostUnreachable:                 "HOST_UNREACHABLE",
+	DHCPServerUnreachable:           "DHCP_SERVER_UNREACHABLE",
+	InvalidMessageHeader:            "INVALID_MESSAGE_HEADER",
+	SessionExpired:                  "SESSION_EXPIRED",
+	AccessDenied:                    "ACCESS_DENIED",
+	PasswordUpdateRequired:          "PASSWORD_UPDATE_REQUIRED",
+	InvalidCredentials:              "INVALID_CREDENTIALS",
+	UserAccountBlocked:              "USER_ACCOUNT_BLOCKED",
+	UserAccountExpired:              "USER_ACCOUNT_EXPIRED",
+	ConcurrentAccessFromMultipleIPs: "CONCURRENT_ACCESS_FROM_MULTIPLE_IPS",
+	KPIThresholdCrossed:             "KPI_THRESHOLD_CROSSED",
+	ONTUnreachable:                  "ONT_UNREACHABLE",
+	ONTProcessingError:              "ONT_PROCESSING_ERROR",
+	ONTResourceBusy:                 "ONT_RESOURCE_BUSY",
+	ONTMEInstanceExists:             "ONT_ME_INSTANCE_ALREADY_EXISTS",
+	ONTUnknownMEInstance:            "ONT_UNKNOWN_ME_INSTANCE",
+	JoinUnsuccessful:                "JOIN_UNSUCCESSFUL",
+	QueryExpired:                    "QUERY_EXPIRED",
 }
 
 // GrpcToVolthaErrorCodeMap contains mapping of grpc error code coming from OpenOLT-Agent to Voltha error codes.
 var GrpcToVolthaErrorCodeMap = map[codes.Code]NBErrorCode{
-        codes.OK:                 Success,
-        codes.Canceled:           UnsuccessfulOperation,
-        codes.Unknown:            OLTInternalError,
-        codes.InvalidArgument:    InvalidArgument,
-        codes.DeadlineExceeded:   RequestTimeout,
-        codes.NotFound:           ResourceNotFound,
-        codes.AlreadyExists:      ResourceAlreadyExists,
-        codes.PermissionDenied:   UserUnauthorized,
-        codes.ResourceExhausted:  ResourceLimitExceeded,
-        codes.FailedPrecondition: PrerequisiteNotMet,
-        codes.Aborted:            UnsuccessfulOperation,
-        codes.OutOfRange:         InvalidArgument,
-        codes.Unimplemented:      UnsupportedOperation,
-        codes.Internal:           OLTInternalError,
-        codes.Unavailable:        ResourceBusy,
-        codes.DataLoss:           OLTInternalError,
-        codes.Unauthenticated:    UserUnauthorized,
+	codes.OK:                 Success,
+	codes.Canceled:           UnsuccessfulOperation,
+	codes.Unknown:            OLTInternalError,
+	codes.InvalidArgument:    InvalidArgument,
+	codes.DeadlineExceeded:   RequestTimeout,
+	codes.NotFound:           ResourceNotFound,
+	codes.AlreadyExists:      ResourceAlreadyExists,
+	codes.PermissionDenied:   UserUnauthorized,
+	codes.ResourceExhausted:  ResourceLimitExceeded,
+	codes.FailedPrecondition: PrerequisiteNotMet,
+	codes.Aborted:            UnsuccessfulOperation,
+	codes.OutOfRange:         InvalidArgument,
+	codes.Unimplemented:      UnsupportedOperation,
+	codes.Internal:           OLTInternalError,
+	codes.Unavailable:        ResourceBusy,
+	codes.DataLoss:           OLTInternalError,
+	codes.Unauthenticated:    UserUnauthorized,
 }
 
 // HTTPStatusCodeToVolthaErrorCodeMap contains mapping of http status code coming from VGC to Voltha error codes.
 var HTTPStatusCodeToVolthaErrorCodeMap = map[int]NBErrorCode{
-        http.StatusOK:                  Success,
-        http.StatusCreated:             Success,
-        http.StatusAccepted:            Success,
-        http.StatusBadRequest:          InvalidPayload,
-        http.StatusConflict:            ResourceInImproperState,
-        http.StatusInternalServerError: VolthaInternalError,
+	http.StatusOK:                  Success,
+	http.StatusCreated:             Success,
+	http.StatusAccepted:            Success,
+	http.StatusBadRequest:          InvalidPayload,
+	http.StatusConflict:            ResourceInImproperState,
+	http.StatusInternalServerError: VolthaInternalError,
 }
 
 // GetErrorInfo - parses the error details from err structure response from voltha
 // Return statusCode (uint32) - Error code [0 - Success]
-//        status Msg (string) - Error Msg
+// status Msg (string) - Error Msg
 func GetErrorInfo(err error) (uint32, string) {
-        var statusCode uint32
-        var statusMsg string
-        if status, _ := status.FromError(err); status != nil {
-                statusCode = uint32(status.Code())
-                statusMsg = status.Message()
-        } else {
-                statusCode = 0
-        }
-        return statusCode, statusMsg
+	var statusCode uint32
+	var statusMsg string
+	if status, _ := status.FromError(err); status != nil {
+		statusCode = uint32(status.Code())
+		statusMsg = status.Message()
+	} else {
+		statusCode = 0
+	}
+	return statusCode, statusMsg
 }
-
diff --git a/internal/pkg/errorcodes/service/errors.go b/internal/pkg/errorcodes/service/errors.go
index a25278d..e3d7e93 100644
--- a/internal/pkg/errorcodes/service/errors.go
+++ b/internal/pkg/errorcodes/service/errors.go
@@ -28,47 +28,47 @@
 // ErrorCode is Enum of error type
 type ErrorCode int
 
-//ErrorAction is Enum for error action
+// ErrorAction is Enum for error action
 type ErrorAction int
 
 const (
-	//ErrOk is returned when request is successful
+	// ErrOk is returned when request is successful
 	ErrOk ErrorCode = 0
-	//ErrInProgress is returned when operation is in progress
+	// ErrInProgress is returned when operation is in progress
 	ErrInProgress ErrorCode = iota + errorCodeStartRange
-	//ErrInvalidParm is returned when parameter is wrong
+	// ErrInvalidParm is returned when parameter is wrong
 	ErrInvalidParm
-	//ErrResourceUnavailable is returned when no free resources are available
+	// ErrResourceUnavailable is returned when no free resources are available
 	ErrResourceUnavailable
-	//ErrAlreadyExists is returned when entry already exists
+	// ErrAlreadyExists is returned when entry already exists
 	ErrAlreadyExists
-	//ErrNotExists is returned when entry does not exists
+	// ErrNotExists is returned when entry does not exists
 	ErrNotExists
-	//ErrInvalidOperation is returned when invalid operation is performed
+	// ErrInvalidOperation is returned when invalid operation is performed
 	ErrInvalidOperation
-	//ErrDeviceNotConnected is returned when there is no connection with the target system
+	// ErrDeviceNotConnected is returned when there is no connection with the target system
 	ErrDeviceNotConnected
-	//ErrTimeout is returned when operation times out
+	// ErrTimeout is returned when operation times out
 	ErrTimeout
-	//ErrResourceBusy is returned when resource is busy
+	// ErrResourceBusy is returned when resource is busy
 	ErrResourceBusy
-	//ErrInternal is returned when Errors happened internally
+	// ErrInternal is returned when Errors happened internally
 	ErrInternal
-	//ErrIo is returned when there is I/O error
+	// ErrIo is returned when there is I/O error
 	ErrIo
-	//ErrMandatoryParmIsMissing is returned when mandatory parameter is missing
+	// ErrMandatoryParmIsMissing is returned when mandatory parameter is missing
 	ErrMandatoryParmIsMissing
-	//ErrBadState is returned when object is in bad state
+	// ErrBadState is returned when object is in bad state
 	ErrBadState
-	//ErrOnuInternal is returned when ONT internal failure occurs
+	// ErrOnuInternal is returned when ONT internal failure occurs
 	ErrOnuInternal
-	//ErrElanNotCreated is returned when ELAN is not created
+	// ErrElanNotCreated is returned when ELAN is not created
 	ErrElanNotCreated
-	//ErrOltInternal is returned when OLT internal failure occurs
+	// ErrOltInternal is returned when OLT internal failure occurs
 	ErrOltInternal
 )
 
-//ErrorCodeMap converts error code to error description string
+// ErrorCodeMap converts error code to error description string
 var ErrorCodeMap = map[ErrorCode]string{
 	ErrOk:                     "Success",
 	ErrInProgress:             "Operation is in progress",
@@ -90,17 +90,17 @@
 }
 
 const (
-	//Retry is returned if subservice reactivation is required
+	// Retry is returned if subservice reactivation is required
 	Retry ErrorAction = iota
-	//Quiet is returned if no action has to be taken
+	// Quiet is returned if no action has to be taken
 	Quiet
-	//Deactivate is returned if subservice has to be deactivated
+	// Deactivate is returned if subservice has to be deactivated
 	Deactivate
-	//Invalid is returned when invalid error is received from vgc
+	// Invalid is returned when invalid error is received from vgc
 	Invalid
 )
 
-//RetryErrorCodeMap consists of errors that requires service activation retry
+// RetryErrorCodeMap consists of errors that requires service activation retry
 var RetryErrorCodeMap = map[ErrorCode]ErrorAction{
 	ErrOk:                     Quiet,
 	ErrInProgress:             Deactivate,
diff --git a/internal/pkg/holder/doc.go b/internal/pkg/holder/doc.go
index 0564693..b5f6f3c 100644
--- a/internal/pkg/holder/doc.go
+++ b/internal/pkg/holder/doc.go
@@ -15,7 +15,7 @@
  */
 
 // The implementation of the open flow agent (vpagent) uses a GRPC connection
-// to VOLTHA accross several implementaton packages including the vpagent and
+// to VOLTHA across several implementaton packages including the vpagent and
 // openflow packages. This GRPC connection is shared through packages and type
 // instances via injection.
 //
@@ -26,7 +26,7 @@
 //
 // To help simply the re-injection or value change scenario a holder for the
 // GRPC connection is established so that the reference to the holder can
-// stay [sic] consistant over the lifetime of the vpagent while the underlying
+// stay [sic] consistent over the lifetime of the vpagent while the underlying
 // GRPC connection can change without walking the entire runtime structure.
 
 package holder
diff --git a/internal/pkg/holder/holder.go b/internal/pkg/holder/holder.go
index 95c1483..4cf1838 100644
--- a/internal/pkg/holder/holder.go
+++ b/internal/pkg/holder/holder.go
@@ -26,8 +26,8 @@
 // point for a mutable value that represents a GRPC service interface to
 // VOLTHA
 type VolthaServiceClientHolder struct {
-	mutex           sync.RWMutex
 	volthaSvcClient voltha.VolthaServiceClient
+	mutex           sync.RWMutex
 }
 
 // VolthaServiceClientReference structure
diff --git a/internal/pkg/intf/appif.go b/internal/pkg/intf/appif.go
index 8ad364e..afc8e4e 100644
--- a/internal/pkg/intf/appif.go
+++ b/internal/pkg/intf/appif.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 intf
 
diff --git a/internal/pkg/intf/flowerror.go b/internal/pkg/intf/flowerror.go
index 04ca588..5760a4d 100644
--- a/internal/pkg/intf/flowerror.go
+++ b/internal/pkg/intf/flowerror.go
@@ -23,9 +23,9 @@
 type FlowStatus struct {
 	Device         string
 	Cookie         string
-	FlowModType    of.Command
-	Flow           *of.VoltSubFlow
-	Status         uint32
 	Reason         string
+	Flow           *of.VoltSubFlow
 	AdditionalData of.BwAvailDetails
+	Status         uint32
+	FlowModType    of.Command
 }
diff --git a/internal/pkg/intf/taskif.go b/internal/pkg/intf/taskif.go
index 5427d4f..7f79fce 100644
--- a/internal/pkg/intf/taskif.go
+++ b/internal/pkg/intf/taskif.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 intf
 
@@ -20,9 +20,11 @@
 	"voltha-go-controller/internal/pkg/tasks"
 )
 
-/*Tasks interface is responsible for creating the tasks
+/*
+Tasks interface is responsible for creating the tasks
 and executing them as well. For now, it is assumed that
-one task run at a time though interface doesn't force it.*/
+one task run at a time though interface doesn't force it.
+*/
 type Tasks interface {
 	AddTask(tasks.Task)
 	Initialize(cxt context.Context)
diff --git a/internal/pkg/intf/vpagent.go b/internal/pkg/intf/vpagent.go
index 3dfbcb2..e4b6bce 100644
--- a/internal/pkg/intf/vpagent.go
+++ b/internal/pkg/intf/vpagent.go
@@ -26,15 +26,15 @@
 
 // VPClientCfg structure
 type VPClientCfg struct {
+	VolthaClient     *holder.VolthaServiceClientHolder
+	PacketOutChannel chan *ofp.PacketOut
+	TimeStamp        time.Time
 	DeviceID         string
 	SerialNum        string
 	SouthBoundID     string
 	MfrDesc          string
 	HwDesc           string
 	SwDesc           string
-	TimeStamp        time.Time
-	VolthaClient     *holder.VolthaServiceClientHolder
-	PacketOutChannel chan *ofp.PacketOut
 }
 
 // DiscoveryType type
diff --git a/internal/pkg/of/flows.go b/internal/pkg/of/flows.go
index ff44754..aa43cfc 100644
--- a/internal/pkg/of/flows.go
+++ b/internal/pkg/of/flows.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 of
 
@@ -22,8 +22,9 @@
 
 	"github.com/google/gopacket/layers"
 
-	"github.com/opencord/voltha-lib-go/v7/pkg/flows"
 	"voltha-go-controller/log"
+
+	"github.com/opencord/voltha-lib-go/v7/pkg/flows"
 	ofp "github.com/opencord/voltha-protos/v5/go/openflow_13"
 	//"github.com/opencord/voltha-protos/v5/go/voltha"
 )
@@ -175,25 +176,25 @@
 
 // Match structure
 type Match struct {
-	InPort        uint32
-	MatchVlan     VlanType
-	SrcMacMatch   bool
 	SrcMacAddr    net.HardwareAddr
 	SrcMacMask    net.HardwareAddr
-	DstMacMatch   bool
 	DstMacAddr    net.HardwareAddr
 	DstMacMask    net.HardwareAddr
-	MatchPbits    bool
+	SrcIpv4Addr   net.IP
+	DstIpv4Addr   net.IP
+	TableMetadata uint64
+	InPort        uint32
+	MatchVlan     VlanType
 	Pbits         PbitType
 	L3Protocol    EtherType
-	SrcIpv4Match  bool
-	SrcIpv4Addr   net.IP
-	DstIpv4Match  bool
-	DstIpv4Addr   net.IP
-	L4Protocol    IPProtocol
 	SrcPort       uint16
 	DstPort       uint16
-	TableMetadata uint64
+	L4Protocol    IPProtocol
+	DstIpv4Match  bool
+	SrcIpv4Match  bool
+	SrcMacMatch   bool
+	DstMacMatch   bool
+	MatchPbits    bool
 }
 
 // Reset to be used when a Match is created. It sets the values to
@@ -327,16 +328,16 @@
 
 // Action structure
 type Action struct {
-	Output      OutputType
 	PushVlan    []VlanType
-	EtherType   layers.EthernetType
-	SetVlan     VlanType
+	Metadata    uint64
 	RemoveVlan  int
 	OutPort     uint32
 	GoToTableID uint32
-	Metadata    uint64
 	MeterID     uint32
+	EtherType   layers.EthernetType
+	SetVlan     VlanType
 	Pcp         PbitType
+	Output      OutputType
 }
 
 const (
@@ -417,16 +418,16 @@
 
 // VoltSubFlow structure
 type VoltSubFlow struct {
-	Cookie     uint64
-	CookieMask uint64
-	// OldCookie is used in vgc upgrade when there is cookie generation logic change.
-	OldCookie   uint64
-	TableID     uint32
-	Priority    uint32
-	State       uint8
 	ErrorReason string
 	Match
 	Action
+	Cookie     uint64
+	CookieMask uint64
+	// OldCookie is used in vgc upgrade when there is cookie generation logic change.
+	OldCookie uint64
+	TableID   uint32
+	Priority  uint32
+	State     uint8
 }
 
 // NewVoltSubFlow is constructor for VoltSubFlow
@@ -454,13 +455,13 @@
 
 // VoltFlow : Definition of a flow
 type VoltFlow struct {
+	SubFlows map[uint64]*VoltSubFlow
+	// PortName and PortID to be used for validation of port before flow pushing
+	PortName      string
+	PortID        uint32
 	Command       Command
-	SubFlows      map[uint64]*VoltSubFlow
 	ForceAction   bool
 	MigrateCookie bool
-	// PortName and PortID to be used for validation of port before flow pushing
-	PortName string
-	PortID   uint32
 }
 
 const (
diff --git a/internal/pkg/of/group.go b/internal/pkg/of/group.go
index 14d73a7..cfa9b67 100644
--- a/internal/pkg/of/group.go
+++ b/internal/pkg/of/group.go
@@ -22,7 +22,7 @@
 	//	"github.com/opencord/voltha-protos/v5/go/voltha"
 )
 
-// The commands on groups avialable. Add is not expected to be used.
+// The commands on groups available. Add is not expected to be used.
 // The mod is used for both create and update. The delete is used to
 // delete the group
 
@@ -54,13 +54,13 @@
 // Group structure
 type Group struct {
 	Device           string
-	Command          GroupCommand `json:"-"`
-	GroupID          uint32
-	Buckets          []uint32
-	SetVlan          VlanType
-	IsPonVlanPresent bool
-	State            uint8
 	ErrorReason      string
+	Buckets          []uint32
+	GroupID          uint32
+	SetVlan          VlanType
+	Command          GroupCommand `json:"-"`
+	State            uint8
+	IsPonVlanPresent bool
 	ForceAction      bool
 }
 
diff --git a/internal/pkg/of/meter.go b/internal/pkg/of/meter.go
index 625b1a7..25bf601 100644
--- a/internal/pkg/of/meter.go
+++ b/internal/pkg/of/meter.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 of
 
@@ -49,10 +49,10 @@
 
 // Meter structure
 type Meter struct {
-	ID          uint32
-	Bands       []Band
-	State       uint8
 	ErrorReason string
+	Bands       []Band
+	ID          uint32
+	State       uint8
 }
 
 // NewMeter is constructor for Meter
diff --git a/internal/pkg/tasks/task_intf.go b/internal/pkg/tasks/task_intf.go
index bd9b256..1329562 100644
--- a/internal/pkg/tasks/task_intf.go
+++ b/internal/pkg/tasks/task_intf.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 tasks
 
diff --git a/internal/pkg/tasks/tasks.go b/internal/pkg/tasks/tasks.go
index 34c4c2e..cfe35f0 100644
--- a/internal/pkg/tasks/tasks.go
+++ b/internal/pkg/tasks/tasks.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 tasks
 
@@ -28,9 +28,9 @@
 
 var (
 	// ErrCxtCancelError error
-	ErrCxtCancelError = errors.New("Context Cancelled")
+	ErrCxtCancelError = errors.New("Context Canceled")
 	// ErrTaskCancelError error
-	ErrTaskCancelError = errors.New("Task Cancelled")
+	ErrTaskCancelError = errors.New("Task Canceled")
 
 	ctx = context.TODO()
 )
@@ -42,9 +42,9 @@
 // TaskSet structure
 type TaskSet struct {
 	name      string
-	taskID    uint8
 	timestamp string
 	queued    []Task
+	taskID    uint8
 }
 
 // NewTaskSet is constructor for TaskSet
@@ -130,13 +130,13 @@
 
 // Tasks structure
 type Tasks struct {
+	ctx         context.Context
 	queued      []Task
-	taskID      uint8
-	stop        bool
+	lock        sync.RWMutex
 	totalTasks  uint16
 	failedTasks uint16
-	lock        sync.RWMutex
-	ctx         context.Context
+	taskID      uint8
+	stop        bool
 }
 
 // NewTasks is constructor for Tasks
@@ -154,7 +154,6 @@
 // Initialize is used to initialize the embedded tasks structure within
 // each ONU.
 func (ts *Tasks) Initialize(ctx context.Context) {
-
 	//Send signal to stop any task which are being executed
 	ts.StopAll()
 	ts.taskID = 0xff
@@ -164,7 +163,6 @@
 // CheckAndInitialize is used to initialize the embedded tasks structure within
 // NNI and resets taskID only when there are no pending tasks
 func (ts *Tasks) CheckAndInitialize(ctx context.Context) {
-
 	ts.lock.Lock()
 	logger.Infow(ctx, "Queued Tasks", log.Fields{"Count": len(ts.queued)})
 	if len(ts.queued) == 0 {
@@ -189,7 +187,7 @@
 }
 
 // AddTask adds a task and executes it if there is no task
-// pending execution. The execution happens on a seperate thread.
+// pending execution. The execution happens on a separate thread.
 // The tasks are maintained per ONU. This structure is instantiated
 // one per ONU
 func (ts *Tasks) AddTask(task Task) {
@@ -259,7 +257,7 @@
 }
 
 // CurrentTask returns the task that is currently running. This can be
-// used for verifying upon unforseen failures for debugging from
+// used for verifying upon unforeseen failures for debugging from
 // with the code
 func (ts *Tasks) CurrentTask() Task {
 	return ts.queued[0]
@@ -278,7 +276,7 @@
 
 		err := task.Start(ts.ctx, taskID)
 		if err == ErrTaskCancelError {
-			logger.Warnw(ctx, "Previous task cancelled. Exiting current task queue execution thread", log.Fields{"TaskCount": len(ts.queued)})
+			logger.Warnw(ctx, "Previous task canceled. Exiting current task queue execution thread", log.Fields{"TaskCount": len(ts.queued)})
 			return
 		}
 		_, pending := ts.popTask()
diff --git a/internal/pkg/types/common.go b/internal/pkg/types/common.go
index 8dbeb0b..d50980d 100755
--- a/internal/pkg/types/common.go
+++ b/internal/pkg/types/common.go
@@ -13,19 +13,20 @@
 * limitations under the License.
  */
 
-// Package common provides constants.
 package common
+
 import (
 	"errors"
 )
 
-//AdminState represents Status of an VLAN:ENABLE/DISABLE
+// AdminState represents Status of an VLAN:ENABLE/DISABLE
 type AdminState string
 
 var (
 	// ErrEntryNotFound is the error when the key doesn't exist in the KVStore
 	ErrEntryNotFound = errors.New("Entry not found")
 )
+
 // DeviceState refers to the state of device
 type DeviceState string
 
@@ -38,18 +39,18 @@
 // Status represents the status of the request sent to the device manager.
 type Status string
 
-//LogLevel  represents the type of the OLT's LOG
+// LogLevel  represents the type of the OLT's LOG
 type LogLevel int
 
 const (
-        // CRITICAL represents log level type of the OLT.
-        CRITICAL LogLevel = iota
-        // ERROR represents log level type of the OLT.
-        ERROR
-        // WARNING represents log level type of the OLT.
-        WARNING
-        // INFO represents log level type of the OLT.
-        INFO
-        // DEBUG represents log level type of the OLT.
-        DEBUG
+	// CRITICAL represents log level type of the OLT.
+	CRITICAL LogLevel = iota
+	// ERROR represents log level type of the OLT.
+	ERROR
+	// WARNING represents log level type of the OLT.
+	WARNING
+	// INFO represents log level type of the OLT.
+	INFO
+	// DEBUG represents log level type of the OLT.
+	DEBUG
 )
diff --git a/internal/pkg/types/multicast.go b/internal/pkg/types/multicast.go
index 6b6aac8..e270554 100755
--- a/internal/pkg/types/multicast.go
+++ b/internal/pkg/types/multicast.go
@@ -17,10 +17,22 @@
 
 // IGMPConfig identifies the IGMP Configuration parameters.
 type IGMPConfig struct {
+	FastLeave *bool `json:"FastLeave"`
+	// PeriodicQuery represents IGMP period query interval.
+	PeriodicQuery *bool `json:"PeriodicQuery"`
+	// WithRAUpLink represents IGMP RA uplink.
+	WithRAUpLink *bool `json:"withRAUpLink"`
+	// WithRADownLink represents IGMP RA downlink.
+	WithRADownLink *bool `json:"withRADownLink"`
 	// ProfileID represents IGMP profile ID
 	ProfileID string `json:"ProfileID"`
 	// ProfileName represents IGMP profile Name
 	ProfileName string `json:"ProfileName"`
+	// IgmpVerToServer represents IGMP version.
+	IgmpVerToServer string `json:"igmpVerToServer"`
+	// IgmpSourceIP represents IGMP src ip.
+	IgmpSourceIP string `json:"igmpSourceIp"`
+	// FastLeave represents IGMP fast leave enabled or not.
 	// UnsolicitedTimeOut represents unsolicited timeout.
 	UnsolicitedTimeOut int `json:"UnsolicitedTimeOut"`
 	// MaxResp represents IGMP max response time.
@@ -33,23 +45,11 @@
 	LastQueryInterval int `json:"LastQueryInterval"`
 	// LastQueryCount represents IGMP last query count.
 	LastQueryCount int `json:"LastQueryCount"`
-	// FastLeave represents IGMP fast leave enabled or not.
-	FastLeave *bool `json:"FastLeave"`
-	// PeriodicQuery represents IGMP period query interval.
-	PeriodicQuery *bool `json:"PeriodicQuery"`
 	// IgmpCos represents IGMP COS value(0-7).
 	IgmpCos int `json:"IgmpCos"`
-	// WithRAUpLink represents IGMP RA uplink.
-	WithRAUpLink *bool `json:"withRAUpLink"`
-	// WithRADownLink represents IGMP RA downlink.
-	WithRADownLink *bool `json:"withRADownLink"`
-	// IgmpVerToServer represents IGMP version.
-	IgmpVerToServer string `json:"igmpVerToServer"`
-	// IgmpSourceIP represents IGMP src ip.
-	IgmpSourceIP string `json:"igmpSourceIp"`
 }
 
-//MulticastSrcListMode represents mode of source list
+// MulticastSrcListMode represents mode of source list
 type MulticastSrcListMode string
 
 const (
@@ -69,31 +69,31 @@
 type MulticastGroupProxy struct {
 	// Mode represents source list include/exclude
 	Mode MulticastSrcListMode `json:"Mode"`
-	// SourceList represents list of multicast server IP addresses.
-	SourceList []string `json:"SourceList"`
 	// IsStatic flag indicating if the group is a "static" group
 	IsStatic string `json:"IsStatic,omitempty"`
+	// SourceList represents list of multicast server IP addresses.
+	SourceList []string `json:"SourceList"`
 }
 
 // MVLANProfile identifies the MVLAN profile.
 type MVLANProfile struct {
-	// VLANID represents the Multicast VLAN ID.
-	VLANID int `json:"VLANID"`
-	// ProfileID represents Multicast profile ID
-	ProfileID string `json:"ProfileID"`
-	// ProfileName represents Multicast profile Name
-	ProfileName string `json:"ProfileName"`
-	// PonVLAN represents the vlan, where mcast traffic will be translated at OLT
-	PonVLAN int `json:"PonVLAN"`
 	// Groups represents the MVLAN group information. Key will be group name and value as array of multicast channel IPs.
 	Groups map[string][]string `json:"Groups"`
 	// Proxy represents multicast group proxy info. Key will be group name and value as proxy info
 	Proxy map[string]MulticastGroupProxy `json:"Proxy"`
-	//IsChannelBasedGroup represents if the group is channel based
-	IsChannelBasedGroup bool `json:"IsChannelBasedGroup"`
+	// ProfileID represents Multicast profile ID
+	ProfileID string `json:"ProfileID"`
+	// ProfileName represents Multicast profile Name
+	ProfileName string `json:"ProfileName"`
 	// ActiveIgmpChannelsPerSubscriber represents maximum igmp channels per subscriber can use
 	// Default : 3
 	ActiveIgmpChannelsPerSubscriber int `json:"ActiveIgmpChannelsPerSubscriber"`
+	// VLANID represents the Multicast VLAN ID.
+	VLANID int `json:"VLANID"`
+	// PonVLAN represents the vlan, where mcast traffic will be translated at OLT
+	PonVLAN int `json:"PonVLAN"`
+	//IsChannelBasedGroup represents if the group is channel based
+	IsChannelBasedGroup bool `json:"IsChannelBasedGroup"`
 }
 
 // McastConfig the structure for multicast config
diff --git a/internal/pkg/util/concurrentmap.go b/internal/pkg/util/concurrentmap.go
index f16bb29..380e3aa 100644
--- a/internal/pkg/util/concurrentmap.go
+++ b/internal/pkg/util/concurrentmap.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 util
 
@@ -23,8 +23,8 @@
 
 // ConcurrentMap implements a wrapper on top of SyncMap so that the count is also maintained
 type ConcurrentMap struct {
-	syncMap sync.Map
 	count   *atomic.Uint64
+	syncMap sync.Map
 	MapLock sync.RWMutex
 }
 
@@ -36,7 +36,7 @@
 }
 
 // Get - Gets return the value store in the sync map
-//If value is present, the result will be true else false
+// If value is present, the result will be true else false
 func (cm *ConcurrentMap) Get(key interface{}) (value interface{}, result bool) {
 	return cm.syncMap.Load(key)
 }
@@ -55,7 +55,6 @@
 
 // Remove - Removes the key-value pair from the sync map
 func (cm *ConcurrentMap) Remove(key interface{}) bool {
-
 	if _, ok := cm.syncMap.Load(key); ok {
 		cm.syncMap.Delete(key)
 		cm.count.Dec()
diff --git a/internal/pkg/util/utils.go b/internal/pkg/util/utils.go
index 313a8ff..6157413 100644
--- a/internal/pkg/util/utils.go
+++ b/internal/pkg/util/utils.go
@@ -39,9 +39,8 @@
 	return s
 }
 
-//IsSliceSame - check and return true if the two slices are identical
+// IsSliceSame - check and return true if the two slices are identical
 func IsSliceSame(ref, rcvd []uint32) bool {
-
 	var found bool
 	if len(ref) != len(rcvd) {
 		return false
@@ -63,9 +62,8 @@
 	return true
 }
 
-//IsPbitSliceSame - check and return true if the two slices are identical
+// IsPbitSliceSame - check and return true if the two slices are identical
 func IsPbitSliceSame(ref, rcvd []of.PbitType) bool {
-
 	var found bool
 	if len(ref) != len(rcvd) {
 		return false
diff --git a/internal/pkg/vpagent/connection.go b/internal/pkg/vpagent/connection.go
index 9e93ae2..e90eab1 100644
--- a/internal/pkg/vpagent/connection.go
+++ b/internal/pkg/vpagent/connection.go
@@ -20,14 +20,15 @@
 	"errors"
 	"time"
 
-	"github.com/golang/protobuf/ptypes/empty"
 	"voltha-go-controller/log"
+
+	"github.com/golang/protobuf/ptypes/empty"
 	"github.com/opencord/voltha-lib-go/v7/pkg/probe"
 	"github.com/opencord/voltha-protos/v5/go/voltha"
 	"google.golang.org/grpc"
 )
 
-//GrpcMaxSize Max size of grpc message
+// GrpcMaxSize Max size of grpc message
 const GrpcMaxSize int = 17455678
 
 func (vpa *VPAgent) establishConnectionToVoltha(ctx context.Context, p *probe.Probe) error {
@@ -82,7 +83,7 @@
 
 // CloseConnectionToVoltha closes the grpc connection to VOLTHA
 func (vpa *VPAgent) CloseConnectionToVoltha() {
-	//Close the grpc connection to voltha
+	// Close the grpc connection to voltha
 	logger.Debug(ctx, "Closing voltha grpc connection")
 	vpa.volthaConnection.Close()
 }
diff --git a/internal/pkg/vpagent/packetIn.go b/internal/pkg/vpagent/packetIn.go
index 33a63b4..a0209f2 100644
--- a/internal/pkg/vpagent/packetIn.go
+++ b/internal/pkg/vpagent/packetIn.go
@@ -19,8 +19,9 @@
 	"context"
 	"io"
 
-	"github.com/golang/protobuf/ptypes/empty"
 	"voltha-go-controller/log"
+
+	"github.com/golang/protobuf/ptypes/empty"
 	"google.golang.org/grpc"
 )
 
diff --git a/internal/pkg/vpagent/packetOut.go b/internal/pkg/vpagent/packetOut.go
index ac9fa8b..d5787dd 100644
--- a/internal/pkg/vpagent/packetOut.go
+++ b/internal/pkg/vpagent/packetOut.go
@@ -19,6 +19,7 @@
 	"context"
 
 	"voltha-go-controller/log"
+
 	"google.golang.org/grpc"
 )
 
diff --git a/internal/pkg/vpagent/refresh.go b/internal/pkg/vpagent/refresh.go
index 71e33ad..2a8f2bc 100644
--- a/internal/pkg/vpagent/refresh.go
+++ b/internal/pkg/vpagent/refresh.go
@@ -21,8 +21,9 @@
 
 	"voltha-go-controller/internal/pkg/intf"
 
-	"github.com/golang/protobuf/ptypes/empty"
 	"voltha-go-controller/log"
+
+	"github.com/golang/protobuf/ptypes/empty"
 	"github.com/opencord/voltha-protos/v5/go/voltha"
 )
 
@@ -127,13 +128,12 @@
 			VolthaClient:     vpa.volthaClient,
 			PacketOutChannel: vpa.packetOutChannel,
 		})
-
 	}
 	logger.Debugw(ctx, "Finished with addClient", log.Fields{"deviceID": device.Id})
 	return vpc
 }
 
-//AddClientToClientMap - called by controller once device obj is created
+// AddClientToClientMap - called by controller once device obj is created
 func (vpa *VPAgent) AddClientToClientMap(deviceID string, vpc intf.IVPClient) {
 	vpa.mapLock.Lock()
 	defer vpa.mapLock.Unlock()
diff --git a/internal/pkg/vpagent/volthaprotoagent.go b/internal/pkg/vpagent/volthaprotoagent.go
index 6a3dcd4..3d962ef 100644
--- a/internal/pkg/vpagent/volthaprotoagent.go
+++ b/internal/pkg/vpagent/volthaprotoagent.go
@@ -25,6 +25,7 @@
 	"voltha-go-controller/internal/pkg/intf"
 
 	"voltha-go-controller/log"
+
 	"github.com/opencord/voltha-lib-go/v7/pkg/probe"
 	ofp "github.com/opencord/voltha-protos/v5/go/openflow_13"
 	"github.com/opencord/voltha-protos/v5/go/voltha"
@@ -63,21 +64,19 @@
 
 // VPAgent structure
 type VPAgent struct {
+	VPClientAgent             intf.IVPClientAgent
+	clientMap                 map[string]intf.IVPClient
+	packetInChannel           chan *ofp.PacketIn
+	packetOutChannel          chan *ofp.PacketOut
+	changeEventChannel        chan *ofp.ChangeEvent
+	volthaClient              *holder.VolthaServiceClientHolder
+	volthaConnection          *grpc.ClientConn
+	events                    chan vpaEvent
 	VolthaAPIEndPoint         string
+	mapLock                   sync.Mutex
 	DeviceListRefreshInterval time.Duration
-	ConnectionMaxRetries      int
 	ConnectionRetryDelay      time.Duration
-
-	volthaConnection *grpc.ClientConn
-	volthaClient     *holder.VolthaServiceClientHolder
-	mapLock          sync.Mutex
-	clientMap        map[string]intf.IVPClient
-	events           chan vpaEvent
-
-	packetInChannel    chan *ofp.PacketIn
-	packetOutChannel   chan *ofp.PacketOut
-	changeEventChannel chan *ofp.ChangeEvent
-	VPClientAgent      intf.IVPClientAgent
+	ConnectionMaxRetries      int
 }
 
 // NewVPAgent is constructor for VPAgent
@@ -122,7 +121,7 @@
 	return &vpa, nil
 }
 
-//GetVPAgent - returns vpAgent object
+// GetVPAgent - returns vpAgent object
 func GetVPAgent() *VPAgent {
 	return vpAgent
 }
@@ -132,9 +131,8 @@
 	return vpa.volthaClient.Get()
 }
 
-// Run - make the inital connection to voltha and kicks off io streams
+// Run - make the initial connection to voltha and kicks off io streams
 func (vpa *VPAgent) Run(ctx context.Context) {
-
 	logger.Debugw(ctx, "Starting GRPC - VOLTHA client",
 		log.Fields{
 			"voltha-endpoint": vpa.VolthaAPIEndPoint})