diff --git a/internal/pkg/core/device_handler.go b/internal/pkg/core/device_handler.go
index f6c3fa5..ca4e481 100755
--- a/internal/pkg/core/device_handler.go
+++ b/internal/pkg/core/device_handler.go
@@ -79,47 +79,40 @@
 
 // DeviceHandler will interact with the OLT device.
 type DeviceHandler struct {
-	cm                      *config.ConfigManager
-	device                  *voltha.Device
-	cfg                     *conf.AdapterFlags
-	coreClient              *vgrpc.Client
-	childAdapterClients     map[string]*vgrpc.Client
-	lockChildAdapterClients sync.RWMutex
-	EventProxy              eventif.EventProxy
-	openOLT                 *OpenOLT
-	exitChannel             chan struct{}
-	lockDevice              sync.RWMutex
-	Client                  oop.OpenoltClient
-	transitionMap           *TransitionMap
-	clientCon               *grpc.ClientConn
-	flowMgr                 []*OpenOltFlowMgr
-	groupMgr                *OpenOltGroupMgr
-	eventMgr                *OpenOltEventMgr
-	resourceMgr             []*rsrcMgr.OpenOltResourceMgr
-	kvStore                 *db.Backend // backend kv store connection handle
+	EventProxy          eventif.EventProxy
+	Client              oop.OpenoltClient
+	cm                  *config.ConfigManager
+	device              *voltha.Device
+	cfg                 *conf.AdapterFlags
+	coreClient          *vgrpc.Client
+	childAdapterClients map[string]*vgrpc.Client
+	openOLT             *OpenOLT
+	exitChannel         chan struct{}
+	transitionMap       *TransitionMap
+	clientCon           *grpc.ClientConn
+	groupMgr            *OpenOltGroupMgr
+	eventMgr            *OpenOltEventMgr
+	kvStore             *db.Backend // backend kv store connection handle
 
 	deviceInfo *oop.DeviceInfo
 
+	portStats                  *OpenOltStatisticsMgr
+	metrics                    *pmmetrics.PmMetrics
+	stopCollector              chan bool
+	stopHeartbeatCheck         chan bool
+	stopIndications            chan bool
+	perPonOnuIndicationChannel map[uint32]onuIndicationChannels
+
 	// discOnus (map[onuSn]bool) contains a list of ONUs that have been discovered, indexed by ONU SerialNumber.
 	// if the value is true that means the OnuDiscovery indication
 	// is currently being processed and thus we can ignore concurrent requests
 	// if it's false it means the processing has completed and we shouldn't be receiving a new indication
 	// if we do it means something went wrong and we need to retry
-	discOnus                      sync.Map
-	onus                          sync.Map
-	portStats                     *OpenOltStatisticsMgr
-	metrics                       *pmmetrics.PmMetrics
-	stopCollector                 chan bool
-	isCollectorActive             bool
-	stopHeartbeatCheck            chan bool
-	isHeartbeatCheckActive        bool
-	activePorts                   sync.Map
-	stopIndications               chan bool
-	isReadIndicationRoutineActive bool
-
-	totalPonPorts                  uint32
-	perPonOnuIndicationChannel     map[uint32]onuIndicationChannels
-	perPonOnuIndicationChannelLock sync.Mutex
+	discOnus    sync.Map
+	onus        sync.Map
+	activePorts sync.Map
+	flowMgr     []*OpenOltFlowMgr
+	resourceMgr []*rsrcMgr.OpenOltResourceMgr
 
 	// Slice of channels. Each channel in slice, index by (mcast-group-id modulo MaxNumOfGroupHandlerChannels)
 	// A go routine per index, waits on a unique channel for incoming mcast flow or group (add/modify/remove).
@@ -127,11 +120,20 @@
 	stopMcastHandlerRoutine   []chan bool
 	mcastHandlerRoutineActive []bool
 
+	lockChildAdapterClients        sync.RWMutex
+	lockDevice                     sync.RWMutex
+	perPonOnuIndicationChannelLock sync.Mutex
+
+	totalPonPorts                 uint32
+	heartbeatSignature            uint32
+	isCollectorActive             bool
+	isHeartbeatCheckActive        bool
+	isReadIndicationRoutineActive bool
+
 	adapterPreviouslyConnected bool
 	agentPreviouslyConnected   bool
 
 	isDeviceDeletionInProgress bool
-	heartbeatSignature         uint32
 	prevOperStatus             common.OperStatus_Types
 }
 
@@ -140,12 +142,12 @@
 	deviceID        string
 	deviceType      string
 	serialNumber    string
+	proxyDeviceID   string
+	adapterEndpoint string
 	onuID           uint32
 	intfID          uint32
-	proxyDeviceID   string
 	losRaised       bool
 	rdiRaised       bool
-	adapterEndpoint string
 }
 
 type onuIndicationMsg struct {
@@ -164,10 +166,10 @@
 // and process them serially. The mcast flow/group are assigned these routines based on formula (group-id modulo MaxNumOfGroupHandlerChannels)
 type McastFlowOrGroupControlBlock struct {
 	ctx               context.Context   // Flow/group handler context
-	flowOrGroupAction string            // one of McastFlowOrGroupAdd, McastFlowOrGroupModify or McastFlowOrGroupDelete
 	flow              *of.OfpFlowStats  // Flow message (can be nil or valid flow)
 	group             *of.OfpGroupEntry // Group message (can be nil or valid group)
 	errChan           *chan error       // channel to report the mcast Flow/group handling error
+	flowOrGroupAction string            // one of McastFlowOrGroupAdd, McastFlowOrGroupModify or McastFlowOrGroupDelete
 }
 
 var pmNames = []string{
@@ -235,7 +237,7 @@
 		dh.mcastHandlerRoutineActive[i] = true
 		go dh.mcastFlowOrGroupChannelHandlerRoutine(i, dh.incomingMcastFlowOrGroup[i], dh.stopMcastHandlerRoutine[i])
 	}
-	//TODO initialize the support classes.
+	// TODO initialize the support classes.
 	return &dh
 }
 
@@ -378,7 +380,6 @@
 
 // GetportLabel returns the label for the NNI and the PON port based on port number and port type
 func GetportLabel(portNum uint32, portType voltha.Port_PortType) (string, error) {
-
 	switch portType {
 	case voltha.Port_ETHERNET_NNI:
 		return fmt.Sprintf("nni-%d", portNum), nil
@@ -391,8 +392,8 @@
 
 func makeOfpPort(macAddress string, speedMbps uint32) *of.OfpPort {
 	if speedMbps == 0 {
-		//In case it was not set in the indication
-		//and no other value was provided
+		// In case it was not set in the indication
+		// and no other value was provided
 		speedMbps = defaultPortSpeedMbps
 	}
 
@@ -423,8 +424,8 @@
 		Curr:       capacity,
 		Advertised: capacity,
 		Peer:       capacity,
-		CurrSpeed:  speedMbps * 1000, //kbps
-		MaxSpeed:   speedMbps * 1000, //kbps
+		CurrSpeed:  speedMbps * 1000, // kbps
+		MaxSpeed:   speedMbps * 1000, // kbps
 	}
 
 	return port
@@ -434,7 +435,7 @@
 	var operStatus common.OperStatus_Types
 	if state == "up" {
 		operStatus = voltha.OperStatus_ACTIVE
-		//populating the intfStatus map
+		// populating the intfStatus map
 		dh.activePorts.Store(intfID, true)
 	} else {
 		operStatus = voltha.OperStatus_DISCOVERED
@@ -656,7 +657,7 @@
 	return nil
 }
 
-// nolint: gocyclo
+// nolint: gocyclo,govet
 func (dh *DeviceHandler) handleIndication(ctx context.Context, indication *oop.Indication) {
 	raisedTs := time.Now().Unix()
 	switch indication.Data.(type) {
@@ -708,7 +709,7 @@
 
 		onuDiscInd := indication.GetOnuDiscInd()
 		logger.Infow(ctx, "received-onu-discovery-indication", log.Fields{"OnuDiscInd": onuDiscInd, "device-id": dh.device.Id})
-		//put message  to channel and return immediately
+		// put message  to channel and return immediately
 		dh.putOnuIndicationToChannel(ctx, indication, onuDiscInd.GetIntfId())
 	case *oop.Indication_OnuInd:
 		span, ctx := log.CreateChildSpan(ctx, "onu-indication", log.Fields{"device-id": dh.device.Id})
@@ -716,7 +717,7 @@
 
 		onuInd := indication.GetOnuInd()
 		logger.Infow(ctx, "received-onu-indication", log.Fields{"OnuInd": onuInd, "device-id": dh.device.Id})
-		//put message  to channel and return immediately
+		// put message  to channel and return immediately
 		dh.putOnuIndicationToChannel(ctx, indication, onuInd.GetIntfId())
 	case *oop.Indication_OmciInd:
 		span, ctx := log.CreateChildSpan(ctx, "omci-indication", log.Fields{"device-id": dh.device.Id})
@@ -808,8 +809,8 @@
 	}
 	return alarmInd
 }
-func generatePonLosAlarmIndication(intfID uint32, losStatus string) *oop.AlarmIndication {
 
+func generatePonLosAlarmIndication(intfID uint32, losStatus string) *oop.AlarmIndication {
 	ponlosAlarmInd := &oop.LosIndication{
 		IntfId: intfID,
 		Status: losStatus,
@@ -821,6 +822,7 @@
 	}
 	return alarmInd
 }
+
 func (dh *DeviceHandler) updateIntfOperStateAndRaiseIndication(ctx context.Context, operState string, intfID uint32) {
 	go func() {
 		if err := dh.addPort(ctx, intfID, voltha.Port_PON_OLT, operState, defaultPortSpeedMbps); err != nil {
@@ -833,16 +835,12 @@
 }
 
 func (dh *DeviceHandler) reconcileOnus(ctx context.Context) error {
-
 	onuDevicesFromCore, err := dh.getChildDevicesFromCore(ctx, dh.device.Id)
 	if err != nil {
-
 		logger.Error(ctx, "unable to fetch child device", log.Fields{"eeror": err})
-
 		return err
 	}
 	for _, onuDeviceFromCore := range onuDevicesFromCore.Items {
-
 		onuOperStatusFromCore := onuDeviceFromCore.OperStatus
 		onuConnectStatusFromCore := onuDeviceFromCore.ConnectStatus
 		intfID := plt.PortNoToIntfID(onuDeviceFromCore.ParentPortNo, voltha.Port_PON_OLT)
@@ -851,7 +849,6 @@
 		onuDeviceFromOlt, err := dh.getOnuInfo(ctx, intfID, &onuID)
 		if err != nil {
 			logger.Error(ctx, "unable to get onu object from olt agent", log.Fields{"eeror": err})
-
 		} else {
 			onuOperStatusFromOlt := onuDeviceFromOlt.GetState()
 			onuLosFromOlt := onuDeviceFromOlt.GetLosi()
@@ -861,18 +858,15 @@
 				dh.putOnuIndicationToChannel(ctx, OnuIndication, intfID)
 
 			case onuLosFromOlt.String() == "ON" && onuConnectStatusFromCore.String() == "REACHABLE":
-				OnuIndication := generateOnuIndication(intfID, onuID, "down", "down") //check bal cli login notepad
+				OnuIndication := generateOnuIndication(intfID, onuID, "down", "down") // check bal cli login notepad
 				alarmInd := generateOnuAlarmIndication(intfID, onuID, "on")
 				raisedTs := time.Now().Unix()
 				go dh.eventMgr.ProcessEvents(ctx, alarmInd, dh.device.Id, raisedTs)
 
 				dh.putOnuIndicationToChannel(ctx, OnuIndication, intfID)
 			}
-
 		}
-
 	}
-
 	return nil
 }
 
@@ -883,9 +877,7 @@
 	})
 	if err != nil {
 		logger.Error(ctx, "unable to fetch ports from core", log.Fields{"eeror": err})
-
 		return err
-
 	}
 	for _, portFromCore := range portsFromCore.Items {
 		portNum := portFromCore.GetPortNo()
@@ -907,7 +899,6 @@
 				ponLosindication := generatePonLosAlarmIndication(intfID, "on")
 				raisedTs := time.Now().Unix()
 				go dh.eventMgr.ProcessEvents(ctx, ponLosindication, dh.device.Id, raisedTs)
-
 			}
 			switch {
 			case portStateFromOlt.String() == "ACTIVE_WORKING" && portOperStatusFromCore.String() != "ACTIVE":
@@ -934,13 +925,9 @@
 					"portOperStatusFromCore": portOperStatusFromCore.String(),
 					"device-id":              dh.device.Id,
 					"port":                   portNum})
-
 			}
-
 		}
-
 	}
-
 	return nil
 }
 
@@ -978,17 +965,15 @@
 			dh.stopIndications <- true
 		}
 		dh.lockDevice.RUnlock()
-		if err := dh.cleanupDeviceResources(ctx); err != nil {
+		if err = dh.cleanupDeviceResources(ctx); err != nil {
 			logger.Error(ctx, "unable to clean up device resources", log.Fields{"error": err})
 			return fmt.Errorf("cleanup device resources failed: %w", err)
 		}
-		if err := dh.initializeDeviceHandlerModules(ctx); err != nil {
+		if err = dh.initializeDeviceHandlerModules(ctx); err != nil {
 			return olterrors.NewErrAdapter("device-handler-initialization-failed", log.Fields{"device-id": dh.device.Id}, err).LogAt(log.ErrorLevel)
 		}
 		go startHeartbeatCheck(ctx, dh)
-
 		//dh.lockDevice.RUnlock()
-
 	} else if device.OperStatus == voltha.OperStatus_RECONCILING {
 		// Log the device's operational status if it's RECONCILING
 		logger.Info(ctx, "Device is being reconciled", log.Fields{
@@ -1036,7 +1021,7 @@
 		return olterrors.NewErrAdapter("device-state-update-failed", log.Fields{"device-id": dh.device.Id}, err)
 	}
 
-	//Clear olt communication failure event
+	// Clear olt communication failure event
 	dh.device.ConnectStatus = voltha.ConnectStatus_REACHABLE
 	dh.device.OperStatus = voltha.OperStatus_ACTIVE
 	raisedTs := time.Now().Unix()
@@ -1057,7 +1042,7 @@
 
 	cloned := proto.Clone(device).(*voltha.Device)
 
-	//Update the device oper state and connection status
+	// Update the device oper state and connection status
 	cloned.OperStatus = voltha.OperStatus_UNKNOWN
 	dh.lockDevice.Lock()
 	dh.device = cloned
@@ -1071,7 +1056,7 @@
 		return olterrors.NewErrAdapter("state-update-failed", log.Fields{"device-id": device.Id}, err)
 	}
 
-	//get the child device for the parent device
+	// get the child device for the parent device
 	onuDevices, err := dh.getChildDevicesFromCore(ctx, dh.device.Id)
 	if err != nil {
 		return olterrors.NewErrAdapter("child-device-fetch-failed", log.Fields{"device-id": dh.device.Id}, err)
@@ -1097,7 +1082,7 @@
 				"onu-indicator": onuInd,
 				"device-type":   onuDevice.Type,
 				"device-id":     onuDevice.Id}, err).LogAt(log.ErrorLevel)
-			//Do not return here and continue to process other ONUs
+			// Do not return here and continue to process other ONUs
 		} else {
 			logger.Debugw(ctx, "sending inter adapter down ind to onu success", log.Fields{"olt-device-id": device.Id, "onu-device-id": onuDevice.Id})
 		}
@@ -1280,7 +1265,7 @@
 	for i = 0; i < dh.totalPonPorts+1; i++ {
 		// Instantiate flow manager
 		if dh.flowMgr[i] = NewFlowManager(ctx, dh, dh.resourceMgr[i], dh.groupMgr, i); dh.flowMgr[i] == nil {
-			//Continue to check the rest of the ports
+			// Continue to check the rest of the ports
 			logger.Errorw(ctx, "error-initializing-flow-manager-for-intf", log.Fields{"intfID": i, "device-id": dh.device.Id})
 		} else {
 			dh.resourceMgr[i].TechprofileRef = dh.flowMgr[i].techprofile
@@ -1294,12 +1279,12 @@
 	dh.portStats = NewOpenOltStatsMgr(ctx, dh)
 
 	return nil
-
 }
 
 func (dh *DeviceHandler) populateDeviceInfo(ctx context.Context) (*oop.DeviceInfo, error) {
 	var err error
 	var deviceInfo *oop.DeviceInfo
+	var genmac string
 
 	deviceInfo, err = dh.Client.GetDeviceInfo(log.WithSpanFromContext(context.Background(), ctx), new(oop.Empty))
 
@@ -1321,7 +1306,7 @@
 	if deviceInfo.DeviceId == "" {
 		logger.Warnw(ctx, "no-device-id-provided-using-host", log.Fields{"hostport": dh.device.GetHostAndPort()})
 		host := strings.Split(dh.device.GetHostAndPort(), ":")[0]
-		genmac, err := generateMacFromHost(ctx, host)
+		genmac, err = generateMacFromHost(ctx, host)
 		if err != nil {
 			return nil, olterrors.NewErrAdapter("failed-to-generate-mac-host", log.Fields{"host": host}, err)
 		}
@@ -1442,7 +1427,6 @@
 		return nil, olterrors.NewErrNotFound("no-flow-manager-found", log.Fields{"intf-id": ifID, "parent-device-id": request.ParentDeviceId, "child-device-id": request.DeviceId}, nil).Log()
 	}
 	return dh.flowMgr[ifID].getTechProfileDownloadMessage(ctx, request.TpInstancePath, request.OnuId, request.DeviceId)
-
 }
 
 func (dh *DeviceHandler) omciIndication(ctx context.Context, omciInd *oop.OmciIndication) error {
@@ -1461,7 +1445,6 @@
 	onuKey := dh.formOnuKey(omciInd.IntfId, omciInd.OnuId)
 
 	if onuInCache, ok := dh.onus.Load(onuKey); !ok {
-
 		logger.Debugw(ctx, "omci-indication-for-a-device-not-in-cache.", log.Fields{"intf-id": omciInd.IntfId, "onu-id": omciInd.OnuId, "device-id": dh.device.Id})
 		ponPort := plt.IntfIDToPortNo(omciInd.GetIntfId(), voltha.Port_PON_OLT)
 
@@ -1479,10 +1462,10 @@
 		deviceID = onuDevice.Id
 		proxyDeviceID = onuDevice.ProxyAddress.DeviceId
 		childAdapterEndpoint = onuDevice.AdapterEndpoint
-		//if not exist in cache, then add to cache.
+		// if not exist in cache, then add to cache.
 		dh.onus.Store(onuKey, NewOnuDevice(deviceID, deviceType, onuDevice.SerialNumber, omciInd.OnuId, omciInd.IntfId, proxyDeviceID, false, onuDevice.AdapterEndpoint))
 	} else {
-		//found in cache
+		// found in cache
 		logger.Debugw(ctx, "omci-indication-for-a-device-in-cache.", log.Fields{"intf-id": omciInd.IntfId, "onu-id": omciInd.OnuId, "device-id": dh.device.Id})
 		deviceType = onuInCache.(*OnuDevice).deviceType
 		deviceID = onuInCache.(*OnuDevice).deviceID
@@ -1572,7 +1555,6 @@
 	onuSecOmciMsgList := omciMsgs.GetMessages()
 
 	for _, onuSecOmciMsg := range onuSecOmciMsgList {
-
 		var omciMessage *oop.OmciMsg
 		hexPkt := make([]byte, hex.EncodedLen(len(onuSecOmciMsg)))
 		hex.Encode(hexPkt, onuSecOmciMsg)
@@ -1683,7 +1665,6 @@
 		st, _ := status.FromError(err)
 		if st.Code() == codes.AlreadyExists {
 			logger.Debugw(ctx, "onu-activation-in-progress", log.Fields{"SerialNumber": serialNumber, "onu-id": onuID, "device-id": dh.device.Id})
-
 		} else {
 			return olterrors.NewErrAdapter("onu-activate-failed", log.Fields{"onu": Onu, "device-id": dh.device.Id}, err)
 		}
@@ -1704,7 +1685,7 @@
 		}
 		return true
 	})
-	//Got the onu device from cache return
+	// Got the onu device from cache return
 	if InCacheOnuDev != nil {
 		logger.Debugw(ctx, "Got child device from cache", log.Fields{"onudev": InCacheOnuDev.serialNumber})
 		return InCacheOnuDev
@@ -1714,7 +1695,7 @@
 		SerialNumber: sn,
 		ParentPortNo: parentPortNo,
 	})
-	//No device found in core return nil
+	// No device found in core return nil
 	if onuDevice == nil {
 		return nil
 	}
@@ -1733,7 +1714,7 @@
 	parentPortNo := plt.IntfIDToPortNo(onuDiscInd.GetIntfId(), voltha.Port_PON_OLT)
 	tpInstExists := false
 
-	//CheckOnuDevExistenceAtOnuDiscovery if true , a check will be made for the existence of the onu device. If the onu device
+	// CheckOnuDevExistenceAtOnuDiscovery if true , a check will be made for the existence of the onu device. If the onu device
 	// still exists , the onu discovery will be ignored, else a check for active techprofiles for ONU is checked.
 	if !dh.openOLT.CheckOnuDevExistenceAtOnuDiscovery {
 		onuDev := dh.getChildDevice(ctx, sn, parentPortNo)
@@ -1771,7 +1752,6 @@
 	logger.Infow(ctx, "No device present in core , continuing with discovery", log.Fields{"sn": sn})
 
 	return false, nil
-
 }
 
 // processDiscONULOSClear clears the LOS Alarm if it's needed
@@ -1834,7 +1814,7 @@
 		return error
 	}
 	if tpInstExists {
-		//ignore the discovery if tpinstance is present.
+		// ignore the discovery if tpinstance is present.
 		logger.Debugw(ctx, "ignoring-onu-indication-as-tp-already-exists", log.Fields{"sn": sn})
 		return nil
 	}
@@ -1842,7 +1822,6 @@
 
 	// if the ONU existed, handle the LOS Alarm
 	if existing {
-
 		if inProcess.(bool) {
 			// if we're currently processing the ONU on a different thread, do nothing
 			logger.Warnw(ctx, "onu-sn-is-being-processed", log.Fields{"sn": sn})
@@ -1887,7 +1866,6 @@
 		// we need to create a new ChildDevice
 		ponintfid := onuDiscInd.GetIntfId()
 		onuID, error = dh.resourceMgr[ponintfid].GetONUID(ctx)
-
 		logger.Infow(ctx, "creating-new-onu-got-onu-id", log.Fields{"sn": sn, "onuId": onuID})
 
 		if error != nil {
@@ -1917,7 +1895,7 @@
 				"serial-number": sn}, error)
 			return error
 		}
-		if error := dh.eventMgr.OnuDiscoveryIndication(ctx, onuDiscInd, dh.device.Id, onuDevice.Id, onuID, sn, time.Now().Unix()); error != nil {
+		if error = dh.eventMgr.OnuDiscoveryIndication(ctx, onuDiscInd, dh.device.Id, onuDevice.Id, onuID, sn, time.Now().Unix()); error != nil {
 			logger.Error(ctx, "discovery-indication-failed", log.Fields{"err": error})
 			error = olterrors.NewErrAdapter("discovery-indication-failed", log.Fields{
 				"onu-id":        onuID,
@@ -1937,14 +1915,13 @@
 	error = dh.setupChildInterAdapterClient(subCtx, onuDevice.AdapterEndpoint)
 	cancel()
 	if error != nil {
-
 		error = olterrors.NewErrCommunication("no-connection-to-child-adapter", log.Fields{"device-id": onuDevice.Id}, error)
 		return error
 	}
 
 	// we can now use the existing ONU Id
 	onuID = onuDevice.ProxyAddress.OnuId
-	//Insert the ONU into cache to use in OnuIndication.
+	// Insert the ONU into cache to use in OnuIndication.
 	//TODO: Do we need to remove this from the cache on ONU change, or wait for overwritten on next discovery.
 	logger.Debugw(ctx, "onu-discovery-indication-key-create",
 		log.Fields{"onu-id": onuID,
@@ -1964,7 +1941,6 @@
 		OperStatus:     common.OperStatus_DISCOVERED,
 		ConnStatus:     common.ConnectStatus_REACHABLE,
 	}); error != nil {
-
 		error = olterrors.NewErrAdapter("failed-to-update-device-state", log.Fields{
 			"device-id":     onuDevice.Id,
 			"serial-number": sn}, error)
@@ -1973,7 +1949,6 @@
 
 	logger.Infow(ctx, "onu-discovered-reachable", log.Fields{"device-id": onuDevice.Id, "sn": sn})
 	if error = dh.activateONU(ctx, onuDiscInd.IntfId, int64(onuID), onuDiscInd.SerialNumber, sn); error != nil {
-
 		error = olterrors.NewErrAdapter("onu-activation-failed", log.Fields{
 			"device-id":     onuDevice.Id,
 			"serial-number": sn}, error)
@@ -1983,7 +1958,6 @@
 }
 
 func (dh *DeviceHandler) onuIndication(ctx context.Context, onuInd *oop.OnuIndication) error {
-
 	ponPort := plt.IntfIDToPortNo(onuInd.GetIntfId(), voltha.Port_PON_OLT)
 	var onuDevice *voltha.Device
 	var err error
@@ -1994,17 +1968,15 @@
 			"device-id": dh.device.Id})
 	onuKey := dh.formOnuKey(onuInd.GetIntfId(), onuInd.OnuId)
 	serialNumber := dh.stringifySerialNumber(onuInd.SerialNumber)
-
 	errFields := log.Fields{"device-id": dh.device.Id}
 
 	if onuInCache, ok := dh.onus.Load(onuKey); ok {
-
-		//If ONU id is discovered before then use GetDevice to get onuDevice because it is cheaper.
+		// If ONU id is discovered before then use GetDevice to get onuDevice because it is cheaper.
 		foundInCache = true
 		errFields["onu-id"] = onuInCache.(*OnuDevice).deviceID
 		onuDevice, err = dh.getDeviceFromCore(ctx, onuInCache.(*OnuDevice).deviceID)
 	} else {
-		//If ONU not found in adapter cache then we have to use GetChildDevice to get onuDevice
+		// If ONU not found in adapter cache then we have to use GetChildDevice to get onuDevice
 		if serialNumber != "" {
 			errFields["serial-number"] = serialNumber
 		} else {
@@ -2037,9 +2009,7 @@
 	}
 	if !foundInCache {
 		onuKey := dh.formOnuKey(onuInd.GetIntfId(), onuInd.GetOnuId())
-
 		dh.onus.Store(onuKey, NewOnuDevice(onuDevice.Id, onuDevice.Type, onuDevice.SerialNumber, onuInd.GetOnuId(), onuInd.GetIntfId(), onuDevice.ProxyAddress.DeviceId, false, onuDevice.AdapterEndpoint))
-
 	}
 	if onuInd.OperState == "down" && onuInd.FailReason != oop.OnuIndication_ONU_ACTIVATION_FAIL_REASON_NONE {
 		if err := dh.eventMgr.onuActivationIndication(ctx, onuActivationFailEvent, onuInd, dh.device.Id, time.Now().Unix()); err != nil {
@@ -2192,7 +2162,6 @@
 		metrics := dh.metrics.GetSubscriberMetrics()
 		for _, m := range pmConfigs.Metrics {
 			metrics[m.Name].Enabled = m.Enabled
-
 		}
 	}
 }
@@ -2209,7 +2178,7 @@
 
 	if flows != nil {
 		for _, flow := range flows.ToRemove.Items {
-			intfID := dh.getIntfIDFromFlow(ctx, flow)
+			intfID := dh.getIntfIDFromFlow(flow)
 
 			logger.Debugw(ctx, "removing-flow",
 				log.Fields{"device-id": device.Id,
@@ -2226,7 +2195,7 @@
 			}
 			if err != nil {
 				if werr, ok := err.(olterrors.WrappedError); ok && status.Code(werr.Unwrap()) == codes.NotFound {
-					//The flow we want to remove is not there, there is no need to throw an error
+					// The flow we want to remove is not there, there is no need to throw an error
 					logger.Warnw(ctx, "flow-to-remove-not-found",
 						log.Fields{
 							"ponIf":        intfID,
@@ -2240,7 +2209,7 @@
 		}
 
 		for _, flow := range flows.ToAdd.Items {
-			intfID := dh.getIntfIDFromFlow(ctx, flow)
+			intfID := dh.getIntfIDFromFlow(flow)
 			logger.Debugw(ctx, "adding-flow",
 				log.Fields{"device-id": device.Id,
 					"ponIf":     intfID,
@@ -2305,7 +2274,6 @@
 
 // UpdateFlowsIncrementally updates the device flow
 func (dh *DeviceHandler) UpdateFlowsIncrementally(ctx context.Context, device *voltha.Device, flows *of.FlowChanges, groups *of.FlowGroupChanges, flowMetadata *of.FlowMetadata) error {
-
 	var errorsList []error
 
 	if dh.getDeviceDeletionInProgressFlag() {
@@ -2350,7 +2318,7 @@
 	dh.onus = sync.Map{}
 
 	dh.lockDevice.RLock()
-	//stopping the stats collector
+	// stopping the stats collector
 	if dh.isCollectorActive {
 		dh.stopCollector <- true
 	}
@@ -2358,7 +2326,7 @@
 
 	go dh.notifyChildDevices(ctx, "unreachable")
 	cloned := proto.Clone(device).(*voltha.Device)
-	//Update device Admin state
+	// Update device Admin state
 	dh.device = cloned
 
 	// Update the all pon ports state on that device to disable and NNI remains active as NNI remains active in openolt agent.
@@ -2378,7 +2346,7 @@
 	onuInd := oop.OnuIndication{}
 	onuInd.OperState = state
 
-	//get the child device for the parent device
+	// get the child device for the parent device
 	onuDevices, err := dh.getChildDevicesFromCore(ctx, dh.device.Id)
 	if err != nil {
 		logger.Errorw(ctx, "failed-to-get-child-devices-information", log.Fields{"device-id": dh.device.Id, "err": err})
@@ -2393,10 +2361,8 @@
 				logger.Errorw(ctx, "failed-to-send-inter-adapter-message", log.Fields{"OnuInd": onuInd,
 					"From Adapter": dh.openOLT.config.AdapterEndpoint, "DeviceType": onuDevice.Type, "device-id": onuDevice.Id})
 			}
-
 		}
 	}
-
 }
 
 // ReenableDevice re-enables the olt device after disable
@@ -2413,9 +2379,7 @@
 		}
 	} else {
 		return olterrors.NewErrAdapter("olt-reenable-failed", log.Fields{"device-id": dh.device.Id}, errors.New("nil device client"))
-
 	}
-
 	logger.Debug(ctx, "olt-reenabled")
 
 	// Update the all ports state on that device to enable
@@ -2429,10 +2393,10 @@
 		}
 	}
 	if retError == nil {
-		//Update the device oper status as ACTIVE
+		// Update the device oper status as ACTIVE
 		device.OperStatus = voltha.OperStatus_ACTIVE
 	} else {
-		//Update the device oper status as FAILED
+		// Update the device oper status as FAILED
 		device.OperStatus = voltha.OperStatus_FAILED
 	}
 	dh.device = device
@@ -2510,7 +2474,6 @@
 	*/
 
 	dh.setDeviceDeletionInProgressFlag(true)
-
 	dh.StopAllFlowRoutines(ctx)
 
 	dh.lockDevice.RLock()
@@ -2536,13 +2499,13 @@
 	}
 
 	dh.removeOnuIndicationChannels(ctx)
-	//Reset the state
+	// Reset the state
 	if dh.Client != nil {
-		if _, err := dh.Client.Reboot(ctx, new(oop.Empty)); err != nil {
+		if _, err = dh.Client.Reboot(ctx, new(oop.Empty)); err != nil {
 			go func() {
 				failureReason := fmt.Sprintf("Failed to reboot during device delete request with error: %s", err.Error())
-				if err = dh.eventMgr.oltRebootFailedEvent(ctx, dh.device.Id, failureReason, time.Now().Unix()); err != nil {
-					logger.Errorw(ctx, "on-olt-reboot-failed", log.Fields{"device-id": dh.device.Id, "err": err})
+				if err1 := dh.eventMgr.oltRebootFailedEvent(ctx, dh.device.Id, failureReason, time.Now().Unix()); err1 != nil {
+					logger.Errorw(ctx, "on-olt-reboot-failed", log.Fields{"device-id": dh.device.Id, "err": err1})
 				}
 			}()
 			logger.Errorw(ctx, "olt-reboot-failed", log.Fields{"device-id": dh.device.Id, "err": err})
@@ -2641,7 +2604,6 @@
 		}
 	} else {
 		return olterrors.NewErrAdapter("olt-reboot-failed", log.Fields{"device-id": dh.device.Id}, errors.New("nil device client"))
-
 	}
 
 	logger.Debugw(ctx, "rebooted-device-successfully", log.Fields{"device-id": device.Id})
@@ -2832,7 +2794,6 @@
 }
 
 func startHeartbeatCheck(ctx context.Context, dh *DeviceHandler) {
-
 	defer func() {
 		dh.lockDevice.Lock()
 		dh.isHeartbeatCheckActive = false
@@ -2887,14 +2848,12 @@
 						}()
 					}
 					dh.lockDevice.RUnlock()
-
 				} else {
 					logger.Warn(ctx, "Heartbeat signature changed, OLT is rebooted. Cleaningup resources.")
 					dh.updateHeartbeatSignature(ctx, heartBeat.HeartbeatSignature)
 					dh.heartbeatSignature = heartBeat.HeartbeatSignature
 					go dh.updateStateRebooted(ctx)
 				}
-
 			}
 			cancel()
 		case <-dh.stopHeartbeatCheck:
@@ -2937,7 +2896,7 @@
 			}
 		*/
 
-		//raise olt communication failure event
+		// raise olt communication failure event
 		raisedTs := time.Now().Unix()
 		cloned := proto.Clone(device).(*voltha.Device)
 		cloned.ConnectStatus = voltha.ConnectStatus_UNREACHABLE
@@ -2963,7 +2922,6 @@
 		}
 		dh.lockDevice.RUnlock()
 		dh.transitionMap.Handle(ctx, DeviceInit)
-
 	}
 }
 
@@ -2979,7 +2937,7 @@
 		// Immediately return, otherwise accessing a null 'device' struct would cause panic
 		return
 	}
-	//Starting the cleanup process
+	// Starting the cleanup process
 	dh.setDeviceDeletionInProgressFlag(true)
 
 	logger.Warnw(ctx, "update-state-rebooted", log.Fields{"device-id": dh.device.Id, "connect-status": device.ConnectStatus,
@@ -3031,10 +2989,9 @@
 
 	dh.StopAllFlowRoutines(ctx)
 
-	//reset adapter reconcile flag
+	// reset adapter reconcile flag
 	dh.adapterPreviouslyConnected = false
 	for {
-
 		childDevices, err := dh.getChildDevicesFromCore(ctx, dh.device.Id)
 		if err != nil || childDevices == nil {
 			logger.Errorw(ctx, "Failed to get child devices from core", log.Fields{"deviceID": dh.device.Id})
@@ -3047,13 +3004,11 @@
 			logger.Warn(ctx, "Not all child devices are cleared, continuing to wait")
 			time.Sleep(5 * time.Second)
 		}
-
 	}
-	//Cleanup completed , reset the flag
+	// Cleanup completed , reset the flag
 	dh.setDeviceDeletionInProgressFlag(false)
 	logger.Infow(ctx, "cleanup complete after reboot , moving to init", log.Fields{"deviceID": device.Id})
 	dh.transitionMap.Handle(ctx, DeviceInit)
-
 }
 
 // EnablePort to enable Pon interface
@@ -3186,7 +3141,7 @@
 	}
 
 	onu := &oop.Onu{IntfId: intfID, OnuId: onuID, SerialNumber: sn}
-	//clear PON resources associated with ONU
+	// clear PON resources associated with ONU
 	onuGem, err := dh.resourceMgr[intfID].GetOnuGemInfo(ctx, onuID)
 	if err != nil || onuGem == nil || onuGem.OnuID != onuID {
 		logger.Warnw(ctx, "failed-to-get-onu-info-for-pon-port", log.Fields{
@@ -3202,8 +3157,8 @@
 		for _, gem := range onuGem.GemPorts {
 			if flowIDs, err := dh.resourceMgr[intfID].GetFlowIDsForGem(ctx, gem); err == nil {
 				for _, flowID := range flowIDs {
-					//multiple gem port can have the same flow id
-					//it is better to send only one flowRemove request to the agent
+					// multiple gem port can have the same flow id
+					// it is better to send only one flowRemove request to the agent
 					var alreadyRemoved bool
 					for _, removedFlowID := range removedFlows {
 						if removedFlowID == flowID {
@@ -3232,10 +3187,9 @@
 				"onu-device": onu,
 				"onu-gem":    onuGem,
 				"err":        err})
-			//Not returning error on cleanup.
+			// Not returning error on cleanup.
 		}
 		logger.Debugw(ctx, "removed-onu-gem-info", log.Fields{"intf": intfID, "onu-device": onu, "onugem": onuGem})
-
 	}
 	dh.resourceMgr[intfID].FreeonuID(ctx, []uint32{onuID})
 	dh.onus.Delete(onuKey)
@@ -3364,7 +3318,7 @@
 	return resp, nil
 }
 
-func (dh *DeviceHandler) getIntfIDFromFlow(ctx context.Context, flow *of.OfpFlowStats) uint32 {
+func (dh *DeviceHandler) getIntfIDFromFlow(flow *of.OfpFlowStats) uint32 {
 	// Default to NNI
 	var intfID = dh.totalPonPorts
 	inPort, outPort := getPorts(flow)
@@ -3374,15 +3328,15 @@
 	return intfID
 }
 
-func (dh *DeviceHandler) getOnuIndicationChannel(ctx context.Context, intfID uint32) chan onuIndicationMsg {
+func (dh *DeviceHandler) getOnuIndicationChannel(intfID uint32) chan onuIndicationMsg {
 	dh.perPonOnuIndicationChannelLock.Lock()
 	if ch, ok := dh.perPonOnuIndicationChannel[intfID]; ok {
 		dh.perPonOnuIndicationChannelLock.Unlock()
 		return ch.indicationChannel
 	}
 	channels := onuIndicationChannels{
-		//We create a buffered channel here to avoid calling function to be  blocked
-		//in case of multiple indications from the ONUs,
+		// We create a buffered channel here to avoid calling function to be  blocked
+		// in case of multiple indications from the ONUs,
 		//especially in the case where indications are buffered in  OLT.
 		indicationChannel: make(chan onuIndicationMsg, 500),
 		stopChannel:       make(chan struct{}),
@@ -3391,7 +3345,6 @@
 	dh.perPonOnuIndicationChannelLock.Unlock()
 	go dh.onuIndicationsRoutine(&channels)
 	return channels.indicationChannel
-
 }
 
 func (dh *DeviceHandler) removeOnuIndicationChannels(ctx context.Context) {
@@ -3411,7 +3364,7 @@
 	}
 	logger.Debugw(ctx, "put-onu-indication-to-channel", log.Fields{"indication": indication, "intfID": intfID})
 	// Send the onuIndication on the ONU channel
-	dh.getOnuIndicationChannel(ctx, intfID) <- ind
+	dh.getOnuIndicationChannel(intfID) <- ind
 }
 
 func (dh *DeviceHandler) onuIndicationsRoutine(onuChannels *onuIndicationChannels) {
@@ -3582,8 +3535,8 @@
 	logger.Debug(ctx, "stopped all mcast handler routines")
 }
 
+// nolint: unparam
 func (dh *DeviceHandler) getOltPortCounters(ctx context.Context, oltPortInfo *extension.GetOltPortCounters) *extension.SingleGetValueResponse {
-
 	singleValResp := extension.SingleGetValueResponse{
 		Response: &extension.GetValueResponse{
 			Response: &extension.GetValueResponse_PortCoutners{
@@ -3592,8 +3545,7 @@
 		},
 	}
 
-	errResp := func(status extension.GetValueResponse_Status,
-		reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
+	errResp := func(status extension.GetValueResponse_Status, reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
 		return &extension.SingleGetValueResponse{
 			Response: &extension.GetValueResponse{
 				Status:    status,
@@ -3604,14 +3556,14 @@
 
 	if oltPortInfo.PortType != extension.GetOltPortCounters_Port_ETHERNET_NNI &&
 		oltPortInfo.PortType != extension.GetOltPortCounters_Port_PON_OLT {
-		//send error response
+		// send error response
 		logger.Debugw(ctx, "getOltPortCounters invalid portType", log.Fields{"oltPortInfo": oltPortInfo.PortType})
 		return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_PORT_TYPE)
 	}
 	statIndChn := make(chan bool, 1)
 	dh.portStats.RegisterForStatIndication(ctx, portStatsType, statIndChn, oltPortInfo.PortNo, oltPortInfo.PortType)
 	defer dh.portStats.DeRegisterFromStatIndication(ctx, portStatsType, statIndChn)
-	//request openOlt agent to send the the port statistics indication
+	// request openOlt agent to send the the port statistics indication
 
 	go func() {
 		_, err := dh.Client.CollectStatistics(ctx, new(oop.Empty))
@@ -3621,7 +3573,7 @@
 	}()
 	select {
 	case <-statIndChn:
-		//indication received for ports stats
+		// indication received for ports stats
 		logger.Debugw(ctx, "getOltPortCounters recvd statIndChn", log.Fields{"oltPortInfo": oltPortInfo})
 	case <-time.After(oltPortInfoTimeout * time.Second):
 		logger.Debugw(ctx, "getOltPortCounters timeout happened", log.Fields{"oltPortInfo": oltPortInfo})
@@ -3631,24 +3583,23 @@
 		return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_TIMEOUT)
 	}
 	if oltPortInfo.PortType == extension.GetOltPortCounters_Port_ETHERNET_NNI {
-		//get nni stats
+		// get nni stats
 		intfID := plt.PortNoToIntfID(oltPortInfo.PortNo, voltha.Port_ETHERNET_NNI)
 		logger.Debugw(ctx, "getOltPortCounters intfID  ", log.Fields{"intfID": intfID})
 		cmnni := dh.portStats.collectNNIMetrics(intfID)
 		if cmnni == nil {
-			//TODO define the error reason
+			// TODO define the error reason
 			return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INTERNAL_ERROR)
 		}
 		dh.portStats.updateGetOltPortCountersResponse(ctx, &singleValResp, cmnni)
 		return &singleValResp
-
 	} else if oltPortInfo.PortType == extension.GetOltPortCounters_Port_PON_OLT {
 		// get pon stats
 		intfID := plt.PortNoToIntfID(oltPortInfo.PortNo, voltha.Port_PON_OLT)
 		if val, ok := dh.activePorts.Load(intfID); ok && val == true {
 			cmpon := dh.portStats.collectPONMetrics(intfID)
 			if cmpon == nil {
-				//TODO define the error reason
+				// TODO define the error reason
 				return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INTERNAL_ERROR)
 			}
 			dh.portStats.updateGetOltPortCountersResponse(ctx, &singleValResp, cmpon)
@@ -3658,8 +3609,8 @@
 	return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INTERNAL_ERROR)
 }
 
+//nolint:unparam
 func (dh *DeviceHandler) getOltOffloadStats(ctx context.Context, oltPortInfo *extension.GetOffloadedAppsStatisticsRequest) *extension.SingleGetValueResponse {
-
 	singleValResp := extension.SingleGetValueResponse{
 		Response: &extension.GetValueResponse{
 			Status: extension.GetValueResponse_OK,
@@ -3672,8 +3623,8 @@
 	return &singleValResp
 }
 
+//nolint:unparam
 func (dh *DeviceHandler) setOltOffload(ctx context.Context, congig *extension.AppOffloadConfig) *extension.SingleSetValueResponse {
-
 	singleValResp := extension.SingleSetValueResponse{
 		Response: &extension.SetValueResponse{
 			Status: extension.SetValueResponse_OK,
@@ -3683,8 +3634,8 @@
 	return &singleValResp
 }
 
+//nolint:unparam
 func (dh *DeviceHandler) setOnuOffload(ctx context.Context, config *extension.AppOffloadOnuConfig) *extension.SingleSetValueResponse {
-
 	singleValResp := extension.SingleSetValueResponse{
 		Response: &extension.SetValueResponse{
 			Status: extension.SetValueResponse_OK,
@@ -3695,7 +3646,6 @@
 }
 
 func (dh *DeviceHandler) getOnuPonCounters(ctx context.Context, onuPonInfo *extension.GetOnuCountersRequest) *extension.SingleGetValueResponse {
-
 	singleValResp := extension.SingleGetValueResponse{
 		Response: &extension.GetValueResponse{
 			Response: &extension.GetValueResponse_OnuPonCounters{
@@ -3704,8 +3654,7 @@
 		},
 	}
 
-	errResp := func(status extension.GetValueResponse_Status,
-		reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
+	errResp := func(status extension.GetValueResponse_Status, reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
 		return &extension.SingleGetValueResponse{
 			Response: &extension.GetValueResponse{
 				Status:    status,
@@ -3728,33 +3677,27 @@
 	}
 	dh.portStats.updateGetOnuPonCountersResponse(ctx, &singleValResp, cmnni)
 	return &singleValResp
-
 }
 
 func (dh *DeviceHandler) getOnuInfo(ctx context.Context, intfID uint32, onuID *uint32) (*oop.OnuInfo, error) {
-
 	Onu := oop.Onu{IntfId: intfID, OnuId: *onuID}
 	OnuInfo, err := dh.Client.GetOnuInfo(ctx, &Onu)
 	if err != nil {
 		return nil, err
 	}
 	return OnuInfo, nil
-
 }
 
 func (dh *DeviceHandler) getIntfInfo(ctx context.Context, intfID uint32) (*oop.PonIntfInfo, error) {
-
 	Intf := oop.Interface{IntfId: intfID}
 	IntfInfo, err := dh.Client.GetPonInterfaceInfo(ctx, &Intf)
 	if err != nil {
 		return nil, err
 	}
 	return IntfInfo, nil
-
 }
 
 func (dh *DeviceHandler) getRxPower(ctx context.Context, rxPowerRequest *extension.GetRxPowerRequest) *extension.SingleGetValueResponse {
-
 	Onu := oop.Onu{IntfId: rxPowerRequest.IntfId, OnuId: rxPowerRequest.OnuId}
 	rxPower, err := dh.Client.GetPonRxPower(ctx, &Onu)
 	if err != nil {
@@ -3778,9 +3721,7 @@
 }
 
 func (dh *DeviceHandler) getPONRxPower(ctx context.Context, OltRxPowerRequest *extension.GetOltRxPowerRequest) *extension.SingleGetValueResponse {
-
-	errResp := func(status extension.GetValueResponse_Status,
-		reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
+	errResp := func(status extension.GetValueResponse_Status, reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
 		return &extension.SingleGetValueResponse{
 			Response: &extension.GetValueResponse{
 				Status:    status,
@@ -3816,17 +3757,13 @@
 	}
 
 	if serialNumber != "" {
-
 		onuDev := dh.getChildDevice(ctx, serialNumber, (uint32)(portNumber))
 		if onuDev != nil {
-
 			Onu := oop.Onu{IntfId: uint32(portNumber), OnuId: onuDev.onuID}
 			rxPower, err := dh.Client.GetPonRxPower(ctx, &Onu)
 			if err != nil {
-
 				logger.Errorw(ctx, "error-while-getting-rx-power", log.Fields{"Onu": Onu, "err": err})
 				return generateSingleGetValueErrorResponse(err)
-
 			}
 
 			rxPowerValue := extension.RxPower{}
@@ -3836,24 +3773,18 @@
 			rxPowerValue.FailReason = rxPower.GetFailReason().String()
 
 			resp.Response.GetOltRxPower().RxPower = append(resp.Response.GetOltRxPower().RxPower, &rxPowerValue)
-
 		} else {
-
 			logger.Errorw(ctx, "getPONRxPower invalid Device", log.Fields{"portLabel": portLabel, "serialNumber": serialNumber})
 			return errResp(extension.GetValueResponse_ERROR, extension.GetValueResponse_INVALID_DEVICE)
 		}
-
 	} else {
-
 		dh.onus.Range(func(Onukey interface{}, onuInCache interface{}) bool {
 			if onuInCache.(*OnuDevice).intfID == (uint32)(portNumber) {
-
 				Onu := oop.Onu{IntfId: (uint32)(portNumber), OnuId: onuInCache.(*OnuDevice).onuID}
 				rxPower, err := dh.Client.GetPonRxPower(ctx, &Onu)
 				if err != nil {
 					logger.Errorw(ctx, "error-while-getting-rx-power, however considering to proceed further with other ONUs on PON", log.Fields{"Onu": Onu, "err": err})
 				} else {
-
 					rxPowerValue := extension.RxPower{}
 					rxPowerValue.OnuSn = onuInCache.(*OnuDevice).serialNumber
 					rxPowerValue.Status = rxPower.GetStatus()
@@ -3862,7 +3793,6 @@
 
 					resp.Response.GetOltRxPower().RxPower = append(resp.Response.GetOltRxPower().RxPower, &rxPowerValue)
 				}
-
 			}
 			logger.Infow(ctx, "getPONRxPower response ", log.Fields{"Response": resp})
 			return true
@@ -3872,9 +3802,9 @@
 	return &resp
 }
 
+// nolint: unparam
 func generateSingleGetValueErrorResponse(err error) *extension.SingleGetValueResponse {
-	errResp := func(status extension.GetValueResponse_Status,
-		reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
+	errResp := func(status extension.GetValueResponse_Status, reason extension.GetValueResponse_ErrorReason) *extension.SingleGetValueResponse {
 		return &extension.SingleGetValueResponse{
 			Response: &extension.GetValueResponse{
 				Status:    status,
@@ -4161,7 +4091,6 @@
 }
 
 func (dh *DeviceHandler) getChildAdapterServiceClient(endpoint string) (onu_inter_adapter_service.OnuInterAdapterServiceClient, error) {
-
 	// First check from cache
 	dh.lockChildAdapterClients.RLock()
 	if cgClient, ok := dh.childAdapterClients[endpoint]; ok {
diff --git a/internal/pkg/core/device_handler_test.go b/internal/pkg/core/device_handler_test.go
index 2616e4f..834c560 100644
--- a/internal/pkg/core/device_handler_test.go
+++ b/internal/pkg/core/device_handler_test.go
@@ -304,7 +304,7 @@
 	}{
 		{"generateMacFromHost-1", args{host: "localhost"}, "00:00:7f:00:00:01", false},
 		{"generateMacFromHost-2", args{host: "10.10.10.10"}, "00:00:0a:0a:0a:0a", false},
-		//{"generateMacFromHost-3", args{host: "google.com"}, "00:00:d8:3a:c8:8e", false},
+		// {"generateMacFromHost-3", args{host: "google.com"}, "00:00:d8:3a:c8:8e", false},
 		{"generateMacFromHost-4", args{host: "testing3"}, "", true},
 	}
 	for _, tt := range tests {
@@ -461,7 +461,6 @@
 				t.Errorf("GetportLabel() => want=(%v, %v) got=(%v, %v)",
 					tt.want, tt.errType, got, reflect.TypeOf(err))
 			}
-
 		})
 	}
 }
@@ -721,9 +720,7 @@
 			case "sendProxiedMessage-6":
 				err := tt.devicehandler.ProxyOmciRequests(ctx, tt.args.omciMsg)
 				assert.Contains(t, err.Error(), "no deviceID")
-
 			}
-
 		})
 	}
 }
@@ -822,7 +819,6 @@
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-
 			if err := tt.devicehandler.RebootDevice(context.Background(), tt.args.device); (err != nil) != tt.wantErr {
 				t.Errorf("DeviceHandler.RebootDevice() error = %v, wantErr %v", err, tt.wantErr)
 			}
@@ -958,7 +954,7 @@
 		t.Run(tt.name, func(t *testing.T) {
 			_ = tt.devicehandler.addPort(context.Background(), tt.args.intfID, tt.args.portType, tt.args.state, tt.args.speedMbps)
 
-			//Check if the correct state is stored
+			// Check if the correct state is stored
 			storedState, ok := tt.devicehandler.activePorts.Load(tt.args.intfID)
 			expectedState := tt.args.state == "up"
 
@@ -968,7 +964,7 @@
 				t.Errorf("Expected stored port state: %v, found: %v in test %v", expectedState, storedState, tt.name)
 			}
 
-			//Check if the reported speed values are correct
+			// Check if the reported speed values are correct
 			ofpPort := makeOfpPort(tt.devicehandler.device.MacAddress, tt.args.speedMbps)
 
 			if ofpPort.Curr != tt.expectedCapacity ||
@@ -1016,7 +1012,6 @@
 }
 
 func TestDeviceHandler_handleOltIndication(t *testing.T) {
-
 	type args struct {
 		oltIndication *oop.OltIndication
 	}
@@ -1056,9 +1051,9 @@
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			//dh.doStateInit()
+			// dh.doStateInit()
 			//	context.
-			//dh.AdoptDevice(tt.args.device)
+			// dh.AdoptDevice(tt.args.device)
 			ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
 			defer cancel()
 			if err := tt.devicehandler.postInit(ctx); err != nil {
@@ -1105,7 +1100,6 @@
 
 	dh1.start(context.Background())
 	dh1.Stop(context.Background())
-
 }
 
 func TestDeviceHandler_PacketOut(t *testing.T) {
@@ -1128,7 +1122,7 @@
 		wantErr       bool
 	}{
 		// TODO: Add test cases.
-		//{"test1", args{egressPortNo: 0, packet: &ofp.OfpPacketOut{}}, true},
+		// {"test1", args{egressPortNo: 0, packet: &ofp.OfpPacketOut{}}, true},
 		{"PacketOut-1", dh1, args{egressPortNo: 0, packet: pktout}, false},
 		{"PacketOut-2", dh2, args{egressPortNo: 1, packet: pktout}, false},
 		{"PacketOut-3", dh2, args{egressPortNo: 4112, packet: pktout}, false},
@@ -1170,7 +1164,7 @@
 			if err := tt.devicehandler.doStateUp(ctx); (err != nil) != tt.wantErr {
 				t.Logf("DeviceHandler.doStateUp() error = %v, wantErr %v", err, tt.wantErr)
 			}
-			tt.devicehandler.stopCollector <- true //stop the stat collector invoked from doStateUp
+			tt.devicehandler.stopCollector <- true // stop the stat collector invoked from doStateUp
 		})
 	}
 }
@@ -1230,7 +1224,6 @@
 }
 
 func TestDeviceHandler_onuDiscIndication(t *testing.T) {
-
 	dh1 := newMockDeviceHandler()
 	dh1.discOnus = sync.Map{}
 	dh1.discOnus.Store("onu1", true)
@@ -1289,13 +1282,11 @@
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-
 			_, err := tt.devicehandler.populateDeviceInfo(context.Background())
 			if (err != nil) != tt.wantErr {
 				t.Errorf("DeviceHandler.populateDeviceInfo() error = %v, wantErr %v", err, tt.wantErr)
 				return
 			}
-
 		})
 	}
 }
@@ -1486,7 +1477,7 @@
 			fu.TunnelId(256),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257)),
 			fu.Output(2147483645),
 			fu.PushVlan(0x8100),
diff --git a/internal/pkg/core/olt_state_transitions.go b/internal/pkg/core/olt_state_transitions.go
index 613e4e4..b012a64 100644
--- a/internal/pkg/core/olt_state_transitions.go
+++ b/internal/pkg/core/olt_state_transitions.go
@@ -63,9 +63,9 @@
 // Transition to store state machine
 type Transition struct {
 	previousState []DeviceState
-	currentState  DeviceState
 	before        []TransitionHandler
 	after         []TransitionHandler
+	currentState  DeviceState
 }
 
 // TransitionMap to store all the states and current device state
@@ -146,7 +146,6 @@
 // Handle moves the state machine to next state based on the trigger and invokes the before and
 // after handlers if the transition is a valid transition
 func (tMap *TransitionMap) Handle(ctx context.Context, trigger Trigger) {
-
 	// Check whether the transtion is valid from current state
 	if !tMap.isValidTransition(trigger) {
 		logger.Errorw(ctx, "invalid-transition-triggered",
diff --git a/internal/pkg/core/olt_state_transitions_test.go b/internal/pkg/core/olt_state_transitions_test.go
index df4e8c6..4cb4218 100644
--- a/internal/pkg/core/olt_state_transitions_test.go
+++ b/internal/pkg/core/olt_state_transitions_test.go
@@ -18,10 +18,11 @@
 
 import (
 	"context"
-	"github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
 	"reflect"
 	"testing"
 	"time"
+
+	"github.com/opencord/voltha-openolt-adapter/internal/pkg/olterrors"
 )
 
 /*
diff --git a/internal/pkg/core/openolt.go b/internal/pkg/core/openolt.go
index 88e3efe..44ac313 100644
--- a/internal/pkg/core/openolt.go
+++ b/internal/pkg/core/openolt.go
@@ -44,22 +44,22 @@
 
 // OpenOLT structure holds the OLT information
 type OpenOLT struct {
+	eventProxy                         eventif.EventProxy
 	configManager                      *conf.ConfigManager
 	deviceHandlers                     map[string]*DeviceHandler
 	coreClient                         *vgrpc.Client
-	eventProxy                         eventif.EventProxy
 	config                             *config.AdapterFlags
-	numOnus                            int
+	exitChannel                        chan struct{}
 	KVStoreAddress                     string
 	KVStoreType                        string
-	exitChannel                        chan struct{}
+	numOnus                            int
 	HeartbeatCheckInterval             time.Duration
 	HeartbeatFailReportInterval        time.Duration
 	GrpcTimeoutInterval                time.Duration
+	rpcTimeout                         time.Duration
 	lockDeviceHandlersMap              sync.RWMutex
 	enableONUStats                     bool
 	enableGemStats                     bool
-	rpcTimeout                         time.Duration
 	CheckOnuDevExistenceAtOnuDiscovery bool
 }
 
@@ -264,7 +264,6 @@
 		return &empty.Empty{}, nil
 	}
 	return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": device.Id}, nil)
-
 }
 
 // DeleteDevice deletes a device
@@ -333,7 +332,6 @@
 		return &empty.Empty{}, nil
 	}
 	return nil, olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": packet.DeviceId}, nil)
-
 }
 
 // EnablePort to Enable PON/NNI interface
@@ -507,7 +505,6 @@
 		return handler.GetTechProfileDownloadMessage(ctx, request)
 	}
 	return nil, olterrors.NewErrNotFound("no-device-handler", log.Fields{"parent-device-id": request.ParentDeviceId, "child-device-id": request.DeviceId}, nil).Log()
-
 }
 
 // GetHealthStatus is used by a OltAdapterService client to detect a connection
diff --git a/internal/pkg/core/openolt_eventmgr.go b/internal/pkg/core/openolt_eventmgr.go
index f17814e..a8bc359 100644
--- a/internal/pkg/core/openolt_eventmgr.go
+++ b/internal/pkg/core/openolt_eventmgr.go
@@ -342,6 +342,7 @@
 	logger.Debugw(ctx, "olt-los-event-sent-to-kafka", log.Fields{"intf-id": ponIntdID})
 	return nil
 }
+
 func (em *OpenOltEventMgr) oltRebootFailedEvent(ctx context.Context, deviceID string, reason string, raisedTs int64) error {
 	de := voltha.DeviceEvent{
 		Context:         map[string]string{ContextOltFailureReason: "olt-reboot-failed"},
@@ -350,10 +351,10 @@
 	if err := em.eventProxy.SendDeviceEvent(ctx, &de, voltha.EventCategory_COMMUNICATION, voltha.EventSubCategory_OLT,
 		raisedTs); err != nil {
 		return olterrors.NewErrCommunication("send-olt-reboot-failed-event", log.Fields{
-			"device-id": deviceID, "raised-ts": raisedTs}, err)
+			"device-id": deviceID, "raised-ts": raisedTs, "reason": reason}, err)
 	}
 	logger.Debugw(ctx, "olt-reboot-failed-event-sent-to-kafka", log.Fields{
-		"device-id": deviceID, "raised-ts": raisedTs})
+		"device-id": deviceID, "raised-ts": raisedTs, "reason": reason})
 	return nil
 }
 
diff --git a/internal/pkg/core/openolt_flowmgr.go b/internal/pkg/core/openolt_flowmgr.go
index 6ad68ea..7389cb7 100644
--- a/internal/pkg/core/openolt_flowmgr.go
+++ b/internal/pkg/core/openolt_flowmgr.go
@@ -47,109 +47,109 @@
 )
 
 const (
-	//IPProtoDhcp flow category
+	// IPProtoDhcp flow category
 	IPProtoDhcp = 17
 
-	//IgmpProto proto value
+	// IgmpProto proto value
 	IgmpProto = 2
 
-	//EapEthType eapethtype value
+	// EapEthType eapethtype value
 	EapEthType = 0x888e
-	//LldpEthType lldp ethtype value
+	// LldpEthType lldp ethtype value
 	LldpEthType = 0x88cc
-	//IPv4EthType IPv4 ethernet type value
+	// IPv4EthType IPv4 ethernet type value
 	IPv4EthType = 0x800
-	//PPPoEDEthType PPPoE discovery ethernet type value
+	// PPPoEDEthType PPPoE discovery ethernet type value
 	PPPoEDEthType = 0x8863
 
-	//ReservedVlan Transparent Vlan (Masked Vlan, VLAN_ANY in ONOS Flows)
+	// ReservedVlan Transparent Vlan (Masked Vlan, VLAN_ANY in ONOS Flows)
 	ReservedVlan = 4096
 
-	//DefaultMgmtVlan default vlan value
+	// DefaultMgmtVlan default vlan value
 	DefaultMgmtVlan = 4091
 
 	// Openolt Flow
 
-	//Upstream constant
+	// Upstream constant
 	Upstream = "upstream"
-	//Downstream constant
+	// Downstream constant
 	Downstream = "downstream"
-	//Multicast constant
+	// Multicast constant
 	Multicast = "multicast"
-	//PacketTagType constant
+	// PacketTagType constant
 	PacketTagType = "pkt_tag_type"
-	//Untagged constant
+	// Untagged constant
 	Untagged = "untagged"
-	//SingleTag constant
+	// SingleTag constant
 	SingleTag = "single_tag"
-	//DoubleTag constant
+	// DoubleTag constant
 	DoubleTag = "double_tag"
 
 	// classifierInfo
 
-	//EthType constant
+	// EthType constant
 	EthType = "eth_type"
-	//EthDst constant
+	// EthDst constant
 	EthDst = "eth_dst"
-	//EthSrc constant
+	// EthSrc constant
 	EthSrc = "eth_src"
-	//TPID constant
+	// TPID constant
 	TPID = "tpid"
-	//IPProto constant
+	// IPProto constant
 	IPProto = "ip_proto"
-	//InPort constant
+	// InPort constant
 	InPort = "in_port"
-	//VlanVid constant
+	// VlanVid constant
 	VlanVid = "vlan_vid"
-	//VlanPcp constant
+	// VlanPcp constant
 	VlanPcp = "vlan_pcp"
 
-	//UDPDst constant
+	// UDPDst constant
 	UDPDst = "udp_dst"
-	//UDPSrc constant
+	// UDPSrc constant
 	UDPSrc = "udp_src"
-	//Ipv4Dst constant
+	// Ipv4Dst constant
 	Ipv4Dst = "ipv4_dst"
-	//Ipv4Src constant
+	// Ipv4Src constant
 	Ipv4Src = "ipv4_src"
-	//Metadata constant
+	// Metadata constant
 	Metadata = "metadata"
-	//TunnelID constant
+	// TunnelID constant
 	TunnelID = "tunnel_id"
-	//Output constant
+	// Output constant
 	Output = "output"
-	//GroupID constant
+	// GroupID constant
 	GroupID = "group_id"
 	// Actions
 
-	//PopVlan constant
+	// PopVlan constant
 	PopVlan = "pop_vlan"
-	//PushVlan constant
+	// PushVlan constant
 	PushVlan = "push_vlan"
-	//TrapToHost constant
+	// TrapToHost constant
 	TrapToHost = "trap_to_host"
-	//MaxMeterBand constant
+	// MaxMeterBand constant
 	MaxMeterBand = 2
-	//VlanPCPMask contant
+	// VlanPCPMask contant
 	VlanPCPMask = 0xFF
-	//VlanvIDMask constant
+	// VlanvIDMask constant
 	VlanvIDMask = 0xFFF
-	//IntfID constant
+	// IntfID constant
 	IntfID = "intfId"
-	//OnuID constant
+	// OnuID constant
 	OnuID = "onuId"
-	//UniID constant
+	// UniID constant
 	UniID = "uniId"
-	//PortNo constant
+	// PortNo constant
 	PortNo = "portNo"
-	//AllocID constant
+	// AllocID constant
 	AllocID = "allocId"
-	//GemID constant
+	// GemID constant
 	GemID = "gemId"
 
-	//NoneOnuID constant
+	// NoneOnuID constant
 	NoneOnuID = -1
-	//NoneUniID constant
+	// NoneUniID constant
 	NoneUniID = -1
 
 	// Max number of flows that can be queued per ONU
@@ -160,30 +160,30 @@
 )
 
 type schedQueue struct {
+	tpInst       interface{}
+	flowMetadata *ofp.FlowMetadata
 	direction    tp_pb.Direction
 	intfID       uint32
 	onuID        uint32
 	uniID        uint32
 	tpID         uint32
 	uniPort      uint32
-	tpInst       interface{}
 	meterID      uint32
-	flowMetadata *ofp.FlowMetadata
 }
 
 type flowContext struct {
+	classifier  map[string]interface{}
+	action      map[string]interface{}
+	logicalFlow *ofp.OfpFlowStats
+	pbitToGem   map[uint32]uint32
+	gemToAes    map[uint32]bool
 	intfID      uint32
 	onuID       uint32
 	uniID       uint32
 	portNo      uint32
-	classifier  map[string]interface{}
-	action      map[string]interface{}
-	logicalFlow *ofp.OfpFlowStats
 	allocID     uint32
 	gemPortID   uint32
 	tpID        uint32
-	pbitToGem   map[uint32]uint32
-	gemToAes    map[uint32]bool
 }
 
 // This control block is created per flow add/remove and pushed on the incomingFlows channel slice
@@ -192,28 +192,29 @@
 // flow and processes it serially
 type flowControlBlock struct {
 	ctx          context.Context   // Flow handler context
-	addFlow      bool              // if true flow to be added, else removed
 	flow         *ofp.OfpFlowStats // Flow message
 	flowMetadata *ofp.FlowMetadata // FlowMetadata that contains flow meter information. This can be nil for Flow remove
 	errChan      *chan error       // channel to report the Flow handling error
+	addFlow      bool              // if true flow to be added, else removed
 }
 
 // OpenOltFlowMgr creates the Structure of OpenOltFlowMgr obj
 type OpenOltFlowMgr struct {
-	ponPortIdx    uint32 // Pon Port this FlowManager is responsible for
 	techprofile   tp.TechProfileIf
 	deviceHandler *DeviceHandler
 	grpMgr        *OpenOltGroupMgr
 	resourceMgr   *rsrcMgr.OpenOltResourceMgr
 
-	packetInGemPort     map[rsrcMgr.PacketInInfoKey]uint32 //packet in gem port local cache
-	packetInGemPortLock sync.RWMutex
+	packetInGemPort map[rsrcMgr.PacketInInfoKey]uint32 // packet in gem port local cache
 
 	// Slice of channels. Each channel in slice, index by ONU ID, queues flows per ONU.
 	// A go routine per ONU, waits on the unique channel (indexed by ONU ID) for incoming flows (add/remove)
 	incomingFlows            []chan flowControlBlock
 	stopFlowHandlerRoutine   []chan bool
 	flowHandlerRoutineActive []bool
+	packetInGemPortLock      sync.RWMutex
+
+	ponPortIdx uint32 // Pon Port this FlowManager is responsible for
 }
 
 // CloseKVClient closes open KV clients
@@ -257,7 +258,7 @@
 		go flowMgr.perOnuFlowHandlerRoutine(i, flowMgr.incomingFlows[i], flowMgr.stopFlowHandlerRoutine[i])
 	}
 
-	//load interface to multicast queue map from kv store
+	// load interface to multicast queue map from kv store
 	flowMgr.grpMgr.LoadInterfaceToMulticastQueueMap(ctx)
 	logger.Info(ctx, "initialization-of-flow-manager-success")
 	return &flowMgr
@@ -354,7 +355,6 @@
 // CreateSchedulerQueues creates traffic schedulers on the device with the given scheduler configuration and traffic shaping info
 // nolint: gocyclo
 func (f *OpenOltFlowMgr) CreateSchedulerQueues(ctx context.Context, sq schedQueue) error {
-
 	logger.Debugw(ctx, "CreateSchedulerQueues",
 		log.Fields{"dir": sq.direction,
 			"intf-id":      sq.intfID,
@@ -516,7 +516,7 @@
 		UniId: sq.uniID, PortNo: sq.uniPort,
 		TrafficQueues: trafficQueues,
 		TechProfileId: TrafficSched[0].TechProfileId}
-	if _, err := f.deviceHandler.Client.CreateTrafficQueues(ctx, queues); err != nil {
+	if _, err = f.deviceHandler.Client.CreateTrafficQueues(ctx, queues); err != nil {
 		if len(queues.TrafficQueues) > 1 {
 			logger.Debug(ctx, "removing-queues-for-1tcont-multi-gem", log.Fields{"intfID": sq.intfID, "onuID": sq.onuID, "dir": sq.direction})
 			_, _ = f.deviceHandler.Client.RemoveTrafficQueues(ctx, queues)
@@ -583,9 +583,9 @@
 	if sq.direction == tp_pb.Direction_DOWNSTREAM {
 		multicastTrafficQueues := f.techprofile.GetMulticastTrafficQueues(ctx, sq.tpInst.(*tp_pb.TechProfileInstance))
 		if len(multicastTrafficQueues) > 0 {
-			if _, present := f.grpMgr.GetInterfaceToMcastQueueMap(sq.intfID); !present { //assumed that there is only one queue per PON for the multicast service
-				//the default queue with multicastQueuePerPonPort.Priority per a pon interface is used for multicast service
-				//just put it in interfaceToMcastQueueMap to use for building group members
+			if _, present := f.grpMgr.GetInterfaceToMcastQueueMap(sq.intfID); !present { // assumed that there is only one queue per PON for the multicast service
+				// the default queue with multicastQueuePerPonPort.Priority per a pon interface is used for multicast service
+				// just put it in interfaceToMcastQueueMap to use for building group members
 				logger.Debugw(ctx, "multicast-traffic-queues", log.Fields{"device-id": f.deviceHandler.device.Id})
 				multicastQueuePerPonPort := multicastTrafficQueues[0]
 				val := &QueueInfoBrief{
@@ -593,7 +593,7 @@
 					servicePriority: multicastQueuePerPonPort.Priority,
 				}
 				f.grpMgr.UpdateInterfaceToMcastQueueMap(sq.intfID, val)
-				//also store the queue info in kv store
+				// also store the queue info in kv store
 				if err := f.resourceMgr.AddMcastQueueForIntf(ctx, multicastQueuePerPonPort.GemportId, multicastQueuePerPonPort.Priority); err != nil {
 					logger.Errorw(ctx, "failed-to-add-mcast-queue", log.Fields{"err": err})
 					return err
@@ -694,7 +694,7 @@
 		// Delete the TCONT on the ONU.
 		uni := getUniPortPath(f.deviceHandler.device.Id, sq.intfID, int32(sq.onuID), int32(sq.uniID))
 		tpPath := f.getTPpath(ctx, uni, sq.tpID)
-		if err := f.sendDeleteTcontToChild(ctx, sq.intfID, sq.onuID, sq.uniID, allocID, tpPath); err != nil {
+		if err = f.sendDeleteTcontToChild(ctx, sq.intfID, sq.onuID, sq.uniID, allocID, tpPath); err != nil {
 			logger.Errorw(ctx, "error-processing-delete-tcont-towards-onu",
 				log.Fields{
 					"intf":      sq.intfID,
@@ -716,9 +716,7 @@
 // We ignore any errors encountered in the process. The errors most likely are encountered when
 // the schedulers and queues are already cleared for the given key.
 func (f *OpenOltFlowMgr) forceRemoveSchedulerQueues(ctx context.Context, sq schedQueue) {
-
 	var schedCfg *tp_pb.SchedulerConfig
-	var err error
 	logger.Infow(ctx, "removing-schedulers-and-queues-in-olt",
 		log.Fields{
 			"direction": sq.direction,
@@ -764,7 +762,6 @@
 				"tp-id":     sq.tpID,
 				"device-id": f.deviceHandler.device.Id,
 				"err":       err})
-
 		} else {
 			logger.Infow(ctx, "removed-traffic-queues-successfully", log.Fields{"device-id": f.deviceHandler.device.Id,
 				"direction": sq.direction,
@@ -777,7 +774,7 @@
 	}
 
 	// Remove traffic schedulers. Ignore any errors, just log them.
-	if _, err = f.deviceHandler.Client.RemoveTrafficSchedulers(ctx, &tp_pb.TrafficSchedulers{
+	if _, err := f.deviceHandler.Client.RemoveTrafficSchedulers(ctx, &tp_pb.TrafficSchedulers{
 		IntfId: sq.intfID, OnuId: sq.onuID,
 		UniId: sq.uniID, PortNo: sq.uniPort,
 		TrafficScheds: TrafficSched}); err != nil {
@@ -938,7 +935,6 @@
 }
 
 func (f *OpenOltFlowMgr) storeTcontsGEMPortsIntoKVStore(ctx context.Context, intfID uint32, onuID uint32, uniID uint32, allocID []uint32, gemPortIDs []uint32) {
-
 	logger.Debugw(ctx, "storing-allocated-tconts-and-gem-ports-into-KV-store",
 		log.Fields{
 			"intf-id":     intfID,
@@ -1039,7 +1035,6 @@
 }
 
 func (f *OpenOltFlowMgr) addSymmetricDataPathFlow(ctx context.Context, flowContext *flowContext, direction string) error {
-
 	intfID := flowContext.intfID
 	onuID := flowContext.onuID
 	uniID := flowContext.uniID
@@ -1134,7 +1129,6 @@
 }
 
 func (f *OpenOltFlowMgr) addDHCPTrapFlow(ctx context.Context, flowContext *flowContext) error {
-
 	intfID := flowContext.intfID
 	onuID := flowContext.onuID
 	uniID := flowContext.uniID
@@ -1233,7 +1227,6 @@
 
 // addUpstreamTrapFlow creates a trap-to-host flow
 func (f *OpenOltFlowMgr) addUpstreamTrapFlow(ctx context.Context, flowContext *flowContext) error {
-
 	intfID := flowContext.intfID
 	onuID := flowContext.onuID
 	uniID := flowContext.uniID
@@ -1363,7 +1356,7 @@
 			log.Fields{"intf-id": intfID, "onu-id": onuID, "flow-id": logicalFlow.Id})
 		return err
 	}
-	//Add Uplink EthType Flow
+	// Add Uplink EthType Flow
 	logger.Debugw(ctx, "creating-ul-ethType-flow",
 		log.Fields{
 			"ul_classifier": uplinkClassifier,
@@ -1454,7 +1447,7 @@
 		vid := uint32(metadata)
 		// Set the OVid or IVid classifier based on the whether OLT is using a transparent tag or not
 		// If OLT is using transparent tag mechanism, then it classifies whatever tag it sees to/from ONU which
-		//is OVid from the perspective of the OLT. When OLT also places or pops the outer tag, then classifierInfo[Metadata]
+		// is OVid from the perspective of the OLT. When OLT also places or pops the outer tag, then classifierInfo[Metadata]
 		// becomes the IVid.
 		if classifier.OVid != 0 && classifier.OVid != ReservedVlan { // This is case when classifier.OVid is not set
 			if vid != ReservedVlan {
@@ -1492,6 +1485,8 @@
 	return &classifier, nil
 }
 
+// nolint: unparam
+// TODO: Improvise the function & remove the unparam lint, currently it is always returning 'nil' as error.
 func makeOpenOltActionField(actionInfo map[string]interface{}, classifierInfo map[string]interface{}) (*openoltpb2.Action, error) {
 	var actionCmd openoltpb2.ActionCmd
 	var action openoltpb2.Action
@@ -1559,7 +1554,6 @@
 	uniPortName := getUniPortPath(f.deviceHandler.device.Id, intfID, int32(onuID), int32(uniID))
 
 	for _, tpID := range tpIDList {
-
 		// Force cleanup scheduler/queues -- start
 		uniPortNum := plt.MkUniPortNum(ctx, intfID, onuID, uniID)
 		uni := getUniPortPath(f.deviceHandler.device.Id, intfID, int32(onuID), int32(uniID))
@@ -1605,7 +1599,6 @@
 }
 
 func (f *OpenOltFlowMgr) addFlowToDevice(ctx context.Context, logicalFlow *ofp.OfpFlowStats, deviceFlow *openoltpb2.Flow) error {
-
 	var intfID uint32
 	/* For flows which trap out of the NNI, the AccessIntfId is invalid
 	   (set to -1). In such cases, we need to refer to the NetworkIntfId .
@@ -1668,11 +1661,10 @@
 					"err":        err,
 					"deviceFlow": deviceFlow,
 					"device-id":  f.deviceHandler.device.Id})
-			//Assume the flow is removed
+			// Assume the flow is removed
 			return nil
 		}
 		return olterrors.NewErrFlowOp("remove", deviceFlow.FlowId, log.Fields{"deviceFlow": deviceFlow}, err)
-
 	}
 	logger.Infow(ctx, "flow-removed-from-device-successfully", log.Fields{
 		"of-flow-id": ofFlowID,
@@ -1683,7 +1675,6 @@
 }
 
 func (f *OpenOltFlowMgr) addLLDPFlow(ctx context.Context, flow *ofp.OfpFlowStats, portNo uint32) error {
-
 	classifierInfo := make(map[string]interface{})
 	actionInfo := make(map[string]interface{})
 
@@ -1794,7 +1785,7 @@
 					"device-id": f.deviceHandler.device.Id}, err)
 		}
 		onuDev = NewOnuDevice(onuDevice.Id, onuDevice.Type, onuDevice.SerialNumber, onuDevice.ProxyAddress.OnuId, onuDevice.ProxyAddress.ChannelId, onuDevice.ProxyAddress.DeviceId, false, onuDevice.AdapterEndpoint)
-		//better to ad the device to cache here.
+		// better to ad the device to cache here.
 		f.deviceHandler.StoreOnuDevice(onuDev.(*OnuDevice))
 	} else {
 		logger.Debugw(ctx, "found-onu-in-cache",
@@ -1904,7 +1895,6 @@
 				"onu-id":        onuDev.deviceID,
 				"proxyDeviceID": onuDev.proxyDeviceID,
 				"device-id":     f.deviceHandler.device.Id}, err)
-
 	}
 	logger.Infow(ctx, "success-sending-del-tcont-to-onu-adapter",
 		log.Fields{
@@ -1918,7 +1908,6 @@
 // nolint: gocyclo
 func (f *OpenOltFlowMgr) clearResources(ctx context.Context, intfID uint32, onuID int32, uniID int32,
 	flowID uint64, portNum uint32, tpID uint32, sendDeleteGemRequest bool) error {
-
 	logger.Debugw(ctx, "clearing-resources", log.Fields{"intfID": intfID, "onuID": onuID, "uniID": uniID, "tpID": tpID})
 
 	uni := getUniPortPath(f.deviceHandler.device.Id, intfID, onuID, uniID)
@@ -2005,15 +1994,14 @@
 						"device-id":  f.deviceHandler.device.Id,
 						"gemport-id": gemPortID})
 			}
-
 		}
 		// Remove queues at OLT in upstream and downstream direction
-		schedQueue := schedQueue{direction: tp_pb.Direction_UPSTREAM, intfID: intfID, onuID: uint32(onuID), uniID: uint32(uniID), tpID: tpID, uniPort: portNum, tpInst: techprofileInst}
-		if err := f.RemoveQueues(ctx, schedQueue); err != nil {
+		schedQ := schedQueue{tpInst: techprofileInst, direction: tp_pb.Direction_UPSTREAM, intfID: intfID, onuID: uint32(onuID), uniID: uint32(uniID), tpID: tpID, uniPort: portNum}
+		if err := f.RemoveQueues(ctx, schedQ); err != nil {
 			logger.Warn(ctx, err)
 		}
-		schedQueue.direction = tp_pb.Direction_DOWNSTREAM
-		if err := f.RemoveQueues(ctx, schedQueue); err != nil {
+		schedQ.direction = tp_pb.Direction_DOWNSTREAM
+		if err := f.RemoveQueues(ctx, schedQ); err != nil {
 			logger.Warn(ctx, err)
 		}
 	}
@@ -2021,12 +2009,12 @@
 	switch techprofileInst := techprofileInst.(type) {
 	case *tp_pb.TechProfileInstance:
 		// Proceed to free allocid and cleanup schedulers (US/DS) if no other references are found for this TP across all the UNIs on the ONU
-		schedQueue := schedQueue{direction: tp_pb.Direction_UPSTREAM, intfID: intfID, onuID: uint32(onuID), uniID: uint32(uniID), tpID: tpID, uniPort: portNum, tpInst: techprofileInst}
-		allocExists := f.isAllocUsedByAnotherUNI(ctx, schedQueue)
+		schedQ := schedQueue{direction: tp_pb.Direction_UPSTREAM, intfID: intfID, onuID: uint32(onuID), uniID: uint32(uniID), tpID: tpID, uniPort: portNum, tpInst: techprofileInst}
+		allocExists := f.isAllocUsedByAnotherUNI(ctx, schedQ)
 		if !allocExists {
 			// all alloc object references removed, remove upstream scheduler
 			if KvStoreMeter, _ := f.resourceMgr.GetMeterInfoForOnu(ctx, "upstream", uint32(onuID), uint32(uniID), tpID); KvStoreMeter != nil {
-				if err := f.RemoveScheduler(ctx, schedQueue); err != nil {
+				if err := f.RemoveScheduler(ctx, schedQ); err != nil {
 					logger.Warn(ctx, err)
 				}
 			}
@@ -2035,7 +2023,7 @@
 		} else {
 			// just remove meter reference for the upstream direction for the current pon/onu/uni
 			// The upstream scheduler, alloc id and meter-reference for the last remaining pon/onu/uni will be removed when no other alloc references that TP
-			if err := f.removeMeterReference(ctx, "upstream", schedQueue); err != nil {
+			if err := f.removeMeterReference(ctx, "upstream", schedQ); err != nil {
 				return err
 			}
 			// setting 'freeFromResourcePool' to false in resourceMgr.FreeAllocID will only remove alloc-id data for the given pon/onu/uni
@@ -2044,9 +2032,9 @@
 		}
 
 		// Downstream scheduler removal is simple, just invoke RemoveScheduler without all the complex handling we do for the alloc object.
-		schedQueue.direction = tp_pb.Direction_DOWNSTREAM
+		schedQ.direction = tp_pb.Direction_DOWNSTREAM
 		if KvStoreMeter, _ := f.resourceMgr.GetMeterInfoForOnu(ctx, "downstream", uint32(onuID), uint32(uniID), tpID); KvStoreMeter != nil {
-			if err := f.RemoveScheduler(ctx, schedQueue); err != nil {
+			if err := f.RemoveScheduler(ctx, schedQ); err != nil {
 				logger.Warn(ctx, err)
 			}
 		}
@@ -2094,7 +2082,7 @@
 				f.resourceMgr.FreeGemPortID(ctx, uint32(onuID), uint32(uniID), gemPort.GemportId)
 			}
 		}
-		//Delete the tp instance and the techprofileid for onu at the end
+		// Delete the tp instance and the techprofileid for onu at the end
 		if err := f.DeleteTechProfileInstance(ctx, intfID, uint32(onuID), uint32(uniID), "", tpID); err != nil {
 			logger.Warn(ctx, err)
 		}
@@ -2191,7 +2179,6 @@
 
 // RemoveFlow removes the flow from the device
 func (f *OpenOltFlowMgr) RemoveFlow(ctx context.Context, flow *ofp.OfpFlowStats) error {
-
 	logger.Infow(ctx, "removing-flow", log.Fields{"flow": *flow})
 	var direction string
 	actionInfo := make(map[string]interface{})
@@ -2482,13 +2469,13 @@
 		return olterrors.NewErrFlowOp("add", flow.Id, log.Fields{"flow": multicastFlow}, err)
 	}
 	logger.Info(ctx, "multicast-flow-added-to-device-successfully")
-	//get cached group
+	// get cached group
 	if group, _, err := f.grpMgr.getFlowGroupFromKVStore(ctx, groupID, true); err == nil {
-		//calling groupAdd to set group members after multicast flow creation
+		// calling groupAdd to set group members after multicast flow creation
 		if err := f.grpMgr.ModifyGroup(ctx, group); err != nil {
 			return olterrors.NewErrGroupOp("modify", groupID, log.Fields{"group": group}, err)
 		}
-		//cached group can be removed now
+		// cached group can be removed now
 		if err := f.resourceMgr.RemoveFlowGroupFromKVStore(ctx, groupID, true); err != nil {
 			logger.Warnw(ctx, "failed-to-remove-flow-group", log.Fields{"group-id": groupID, "err": err})
 		}
@@ -2513,7 +2500,6 @@
 
 // sendTPDownloadMsgToChild send payload
 func (f *OpenOltFlowMgr) sendTPDownloadMsgToChild(ctx context.Context, intfID uint32, onuID uint32, uniID uint32, uni string, TpID uint32, tpInst tp_pb.TechProfileInstance) error {
-
 	onuDev, err := f.getOnuDevice(ctx, intfID, onuID)
 	if err != nil {
 		logger.Errorw(ctx, "couldnt-find-onu-child-device",
@@ -2601,7 +2587,7 @@
 
 		return gemPortID, nil
 	}
-	//If gem is not found in cache try to get it from kv store, if found in kv store, update the cache and return.
+	// If gem is not found in cache try to get it from kv store, if found in kv store, update the cache and return.
 	gemPortID, err = f.resourceMgr.GetGemPortFromOnuPktIn(ctx, pktInkey)
 	if err == nil {
 		if gemPortID != 0 {
@@ -2619,7 +2605,6 @@
 		log.Fields{
 			"pktinkey": pktInkey,
 			"gem":      gemPortID}, err)
-
 }
 
 func (f *OpenOltFlowMgr) addTrapFlowOnNNI(ctx context.Context, logicalFlow *ofp.OfpFlowStats, classifier map[string]interface{}, portNo uint32) error {
@@ -2872,8 +2857,7 @@
 		}
 	}
 
-	flowContext := &flowContext{intfID, onuID, uniID, portNo, classifierInfo, actionInfo,
-		flow, allocID, gemPortID, tpID, pbitToGem, gemToAes}
+	flowContext := &flowContext{classifierInfo, actionInfo, flow, pbitToGem, gemToAes, intfID, onuID, uniID, portNo, allocID, gemPortID, tpID}
 
 	if ipProto, ok := classifierInfo[IPProto]; ok {
 		if ipProto.(uint32) == IPProtoDhcp {
@@ -2884,14 +2868,13 @@
 				"onu-id":   onuID,
 				"uni-id":   uniID,
 			})
-			//Adding DHCP upstream flow
+			// Adding DHCP upstream flow
 			if err := f.addDHCPTrapFlow(ctx, flowContext); err != nil {
 				logger.Warn(ctx, err)
 				logger.Errorw(ctx, "reverting-scheduler-and-queue-for-onu", log.Fields{"intf-id": intfID, "onu-id": onuID, "uni-id": uniID, "flow-id": flow.Id, "tp-id": tpID})
 				_ = f.clearResources(ctx, intfID, int32(onuID), int32(uniID), flow.Id, portNo, tpID, false)
 				return err
 			}
-
 		} else if ipProto.(uint32) == IgmpProto {
 			logger.Infow(ctx, "adding-us-igmp-flow",
 				log.Fields{
@@ -2937,7 +2920,7 @@
 				"onu-id":   onuID,
 				"uni-id":   uniID,
 			})
-			//Adding PPPOED upstream flow
+			// Adding PPPOED upstream flow
 			if err := f.addUpstreamTrapFlow(ctx, flowContext); err != nil {
 				logger.Warn(ctx, err)
 				logger.Errorw(ctx, "reverting-scheduler-and-queue-for-onu", log.Fields{"intf-id": intfID, "onu-id": onuID, "uni-id": uniID, "flow-id": flow.Id, "tp-id": tpID})
@@ -2951,7 +2934,7 @@
 			"onu-id":  onuID,
 			"uni-id":  uniID,
 		})
-		//Adding HSIA upstream flow
+		// Adding HSIA upstream flow
 		if err := f.addUpstreamDataPathFlow(ctx, flowContext); err != nil {
 			logger.Warn(ctx, err)
 			logger.Errorw(ctx, "reverting-scheduler-and-queue-for-onu", log.Fields{"intf-id": intfID, "onu-id": onuID, "uni-id": uniID, "flow-id": flow.Id, "tp-id": tpID})
@@ -2964,7 +2947,7 @@
 			"onu-id":  onuID,
 			"uni-id":  uniID,
 		})
-		//Adding HSIA downstream flow
+		// Adding HSIA downstream flow
 		if err := f.addDownstreamDataPathFlow(ctx, flowContext); err != nil {
 			logger.Warn(ctx, err)
 			logger.Errorw(ctx, "reverting-scheduler-and-queue-for-onu", log.Fields{"intf-id": intfID, "onu-id": onuID, "uni-id": uniID, "flow-id": flow.Id, "tp-id": tpID})
@@ -3228,7 +3211,6 @@
 
 // getNniIntfID gets nni intf id from the flow classifier/action
 func getNniIntfID(ctx context.Context, classifier map[string]interface{}, action map[string]interface{}) (uint32, error) {
-
 	portType := plt.IntfIDToPortTypeName(classifier[InPort].(uint32))
 	if portType == voltha.Port_PON_OLT {
 		intfID, err := plt.IntfIDFromNniPortNum(ctx, action[Output].(uint32))
@@ -3309,7 +3291,7 @@
 			index = 14
 		}
 		priority := (packet[index] >> 5) & 0x7
-		//13 bits composes vlanId value
+		// 13 bits composes vlanId value
 		vlan := ((uint16(packet[index]) << 8) & 0x0fff) | uint16(packet[index+1])
 		return vlan, priority, nil
 	}
@@ -3375,7 +3357,6 @@
 
 // revertTechProfileInstance is called when CreateScheduler or CreateQueues request fails
 func (f *OpenOltFlowMgr) revertTechProfileInstance(ctx context.Context, sq schedQueue) {
-
 	intfID := sq.intfID
 	onuID := sq.onuID
 	uniID := sq.uniID
diff --git a/internal/pkg/core/openolt_flowmgr_test.go b/internal/pkg/core/openolt_flowmgr_test.go
index 7e27afb..ca64bdd 100644
--- a/internal/pkg/core/openolt_flowmgr_test.go
+++ b/internal/pkg/core/openolt_flowmgr_test.go
@@ -85,30 +85,30 @@
 		wantErr    bool
 	}{
 		// TODO: Add test cases.
-		{"CreateSchedulerQueues-1", schedQueue{tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, tprofile, 1, createFlowMetadata(tprofile, 1, Upstream)}, false},
-		{"CreateSchedulerQueues-2", schedQueue{tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, tprofile2, 1, createFlowMetadata(tprofile2, 1, Downstream)}, false},
-		{"CreateSchedulerQueues-13", schedQueue{tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, tprofile, 1, createFlowMetadata(tprofile, 2, Upstream)}, false},
-		{"CreateSchedulerQueues-14", schedQueue{tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, tprofile2, 1, createFlowMetadata(tprofile2, 2, Downstream)}, false},
-		{"CreateSchedulerQueues-15", schedQueue{tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, tprofile, 1, createFlowMetadata(tprofile, 3, Upstream)}, false},
-		{"CreateSchedulerQueues-16", schedQueue{tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, tprofile2, 1, createFlowMetadata(tprofile2, 3, Downstream)}, false},
-		{"CreateSchedulerQueues-17", schedQueue{tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, tprofile, 1, createFlowMetadata(tprofile, 4, Upstream)}, false},
-		{"CreateSchedulerQueues-18", schedQueue{tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, tprofile2, 1, createFlowMetadata(tprofile2, 4, Downstream)}, false},
-		{"CreateSchedulerQueues-19", schedQueue{tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, tprofile, 1, createFlowMetadata(tprofile, 5, Upstream)}, false},
-		{"CreateSchedulerQueues-20", schedQueue{tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, tprofile2, 1, createFlowMetadata(tprofile2, 5, Downstream)}, false},
+		{"CreateSchedulerQueues-1", schedQueue{tprofile, createFlowMetadata(tprofile, 1, Upstream), tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, 1}, false},
+		{"CreateSchedulerQueues-2", schedQueue{tprofile2, createFlowMetadata(tprofile2, 1, Downstream), tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, 1}, false},
+		{"CreateSchedulerQueues-13", schedQueue{tprofile, createFlowMetadata(tprofile, 2, Upstream), tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, 1}, false},
+		{"CreateSchedulerQueues-14", schedQueue{tprofile2, createFlowMetadata(tprofile2, 2, Downstream), tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, 1}, false},
+		{"CreateSchedulerQueues-15", schedQueue{tprofile, createFlowMetadata(tprofile, 3, Upstream), tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, 1}, false},
+		{"CreateSchedulerQueues-16", schedQueue{tprofile2, createFlowMetadata(tprofile2, 3, Downstream), tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, 1}, false},
+		{"CreateSchedulerQueues-17", schedQueue{tprofile, createFlowMetadata(tprofile, 4, Upstream), tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, 1}, false},
+		{"CreateSchedulerQueues-18", schedQueue{tprofile2, createFlowMetadata(tprofile2, 4, Downstream), tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, 1}, false},
+		{"CreateSchedulerQueues-19", schedQueue{tprofile, createFlowMetadata(tprofile, 5, Upstream), tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, 1}, false},
+		{"CreateSchedulerQueues-20", schedQueue{tprofile2, createFlowMetadata(tprofile2, 5, Downstream), tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, 1}, false},
 
-		//Negative testcases
-		{"CreateSchedulerQueues-1", schedQueue{tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, tprofile, 1, createFlowMetadata(tprofile, 0, Upstream)}, true},
-		{"CreateSchedulerQueues-2", schedQueue{tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, tprofile2, 1, createFlowMetadata(tprofile2, 0, Downstream)}, true},
-		{"CreateSchedulerQueues-3", schedQueue{tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, tprofile, 2, createFlowMetadata(tprofile, 2, Upstream)}, true},
-		{"CreateSchedulerQueues-4", schedQueue{tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, tprofile2, 2, createFlowMetadata(tprofile2, 2, Downstream)}, true},
-		{"CreateSchedulerQueues-5", schedQueue{tp_pb.Direction_UPSTREAM, 1, 2, 2, 64, 2, tprofile, 2, createFlowMetadata(tprofile, 3, Upstream)}, true},
-		{"CreateSchedulerQueues-6", schedQueue{tp_pb.Direction_DOWNSTREAM, 1, 2, 2, 65, 2, tprofile2, 2, createFlowMetadata(tprofile2, 3, Downstream)}, true},
-		{"CreateSchedulerQueues-7", schedQueue{tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, tprofile, 1, &ofp.FlowMetadata{}}, true},
-		{"CreateSchedulerQueues-8", schedQueue{tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, tprofile, 0, &ofp.FlowMetadata{}}, true},
-		{"CreateSchedulerQueues-9", schedQueue{tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, tprofile2, 1, &ofp.FlowMetadata{}}, true},
-		{"CreateSchedulerQueues-10", schedQueue{tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, tprofile, 2, &ofp.FlowMetadata{}}, true},
-		{"CreateSchedulerQueues-11", schedQueue{tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, tprofile2, 2, &ofp.FlowMetadata{}}, true},
-		{"CreateSchedulerQueues-12", schedQueue{tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, tprofile2, 2, nil}, true},
+		// Negative testcases
+		{"CreateSchedulerQueues-1", schedQueue{tprofile, createFlowMetadata(tprofile, 0, Upstream), tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, 1}, true},
+		{"CreateSchedulerQueues-2", schedQueue{tprofile2, createFlowMetadata(tprofile2, 0, Downstream), tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, 1}, true},
+		{"CreateSchedulerQueues-3", schedQueue{tprofile, createFlowMetadata(tprofile, 2, Upstream), tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, 2}, true},
+		{"CreateSchedulerQueues-4", schedQueue{tprofile2, createFlowMetadata(tprofile2, 2, Downstream), tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, 2}, true},
+		{"CreateSchedulerQueues-5", schedQueue{tprofile, createFlowMetadata(tprofile, 3, Upstream), tp_pb.Direction_UPSTREAM, 1, 2, 2, 64, 2, 2}, true},
+		{"CreateSchedulerQueues-6", schedQueue{tprofile2, createFlowMetadata(tprofile2, 3, Downstream), tp_pb.Direction_DOWNSTREAM, 1, 2, 2, 65, 2, 2}, true},
+		{"CreateSchedulerQueues-7", schedQueue{tprofile, &ofp.FlowMetadata{}, tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, 1}, true},
+		{"CreateSchedulerQueues-8", schedQueue{tprofile, &ofp.FlowMetadata{}, tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, 0}, true},
+		{"CreateSchedulerQueues-9", schedQueue{tprofile2, &ofp.FlowMetadata{}, tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, 1}, true},
+		{"CreateSchedulerQueues-10", schedQueue{tprofile, &ofp.FlowMetadata{}, tp_pb.Direction_UPSTREAM, 0, 1, 1, 64, 1, 2}, true},
+		{"CreateSchedulerQueues-11", schedQueue{tprofile2, &ofp.FlowMetadata{}, tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, 2}, true},
+		{"CreateSchedulerQueues-12", schedQueue{tprofile2, nil, tp_pb.Direction_DOWNSTREAM, 0, 1, 1, 65, 1, 2}, true},
 	}
 	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
 	defer cancel()
@@ -126,26 +126,26 @@
 	bands := make([]*ofp.OfpMeterBandHeader, 0)
 	switch tcontType {
 	case 1:
-		//tcont-type-1
+		// tcont-type-1
 		bands = append(bands, &ofp.OfpMeterBandHeader{Type: ofp.OfpMeterBandType_OFPMBT_DROP, Rate: 10000, BurstSize: 0, Data: &ofp.OfpMeterBandHeader_Drop{}})
 		bands = append(bands, &ofp.OfpMeterBandHeader{Type: ofp.OfpMeterBandType_OFPMBT_DROP, Rate: 10000, BurstSize: 0, Data: &ofp.OfpMeterBandHeader_Drop{}})
 		additionalBw = tp_pb.AdditionalBW_AdditionalBW_None
 	case 2:
-		//tcont-type-2
+		// tcont-type-2
 		bands = append(bands, &ofp.OfpMeterBandHeader{Type: ofp.OfpMeterBandType_OFPMBT_DROP, Rate: 60000, BurstSize: 10000, Data: &ofp.OfpMeterBandHeader_Drop{}})
 		bands = append(bands, &ofp.OfpMeterBandHeader{Type: ofp.OfpMeterBandType_OFPMBT_DROP, Rate: 50000, BurstSize: 10000, Data: &ofp.OfpMeterBandHeader_Drop{}})
 		additionalBw = tp_pb.AdditionalBW_AdditionalBW_None
 	case 3:
-		//tcont-type-3
+		// tcont-type-3
 		bands = append(bands, &ofp.OfpMeterBandHeader{Type: ofp.OfpMeterBandType_OFPMBT_DROP, Rate: 100000, BurstSize: 10000, Data: &ofp.OfpMeterBandHeader_Drop{}})
 		bands = append(bands, &ofp.OfpMeterBandHeader{Type: ofp.OfpMeterBandType_OFPMBT_DROP, Rate: 50000, BurstSize: 20000, Data: &ofp.OfpMeterBandHeader_Drop{}})
 		additionalBw = tp_pb.AdditionalBW_AdditionalBW_NA
 	case 4:
-		//tcont-type-4
+		// tcont-type-4
 		bands = append(bands, &ofp.OfpMeterBandHeader{Type: ofp.OfpMeterBandType_OFPMBT_DROP, Rate: 200000, BurstSize: 10000, Data: &ofp.OfpMeterBandHeader_Drop{}})
 		additionalBw = tp_pb.AdditionalBW_AdditionalBW_BestEffort
 	case 5:
-		//tcont-type-5
+		// tcont-type-5
 		bands = append(bands, &ofp.OfpMeterBandHeader{Type: ofp.OfpMeterBandType_OFPMBT_DROP, Rate: 50000, BurstSize: 10000, Data: &ofp.OfpMeterBandHeader_Drop{}})
 		bands = append(bands, &ofp.OfpMeterBandHeader{Type: ofp.OfpMeterBandType_OFPMBT_DROP, Rate: 100000, BurstSize: 10000, Data: &ofp.OfpMeterBandHeader_Drop{}})
 		bands = append(bands, &ofp.OfpMeterBandHeader{Type: ofp.OfpMeterBandType_OFPMBT_DROP, Rate: 10000, BurstSize: 0, Data: &ofp.OfpMeterBandHeader_Drop{}})
@@ -180,16 +180,16 @@
 	tprofile2.DsScheduler.Direction = tp_pb.Direction_DOWNSTREAM
 	tprofile2.DsScheduler.AdditionalBw = tp_pb.AdditionalBW_AdditionalBW_None
 	tprofile2.DsScheduler.QSchedPolicy = tp_pb.SchedulingPolicy_WRR
-	//defTprofile := &tp.DefaultTechProfile{}
+	// defTprofile := &tp.DefaultTechProfile{}
 	tests := []struct {
 		name       string
 		schedQueue schedQueue
 		wantErr    bool
 	}{
-		{"RemoveScheduler-1", schedQueue{tp_pb.Direction_UPSTREAM, 1, 1, 1, 64, 1, tprofile, 0, nil}, false},
-		{"RemoveScheduler-2", schedQueue{tp_pb.Direction_DOWNSTREAM, 1, 1, 1, 65, 1, tprofile2, 0, nil}, false},
-		{"RemoveScheduler-3", schedQueue{tp_pb.Direction_DOWNSTREAM, 1, 1, 1, 65, 1, tprofile2, 0, nil}, false},
-		{"RemoveScheduler-4", schedQueue{tp_pb.Direction_DOWNSTREAM, 1, 1, 1, 65, 1, tprofile2, 0, nil}, false},
+		{"RemoveScheduler-1", schedQueue{tprofile, nil, tp_pb.Direction_UPSTREAM, 1, 1, 1, 64, 1, 0}, false},
+		{"RemoveScheduler-2", schedQueue{tprofile2, nil, tp_pb.Direction_DOWNSTREAM, 1, 1, 1, 65, 1, 0}, false},
+		{"RemoveScheduler-3", schedQueue{tprofile2, nil, tp_pb.Direction_DOWNSTREAM, 1, 1, 1, 65, 1, 0}, false},
+		{"RemoveScheduler-4", schedQueue{tprofile2, nil, tp_pb.Direction_DOWNSTREAM, 1, 1, 1, 65, 1, 0}, false},
 	}
 	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
 	defer cancel()
@@ -200,7 +200,6 @@
 			}
 		})
 	}
-
 }
 
 func TestOpenOltFlowMgr_RemoveQueues(t *testing.T) {
@@ -245,16 +244,16 @@
 	tprofile2.DownstreamGemPortAttributeList = make([]*tp_pb.GemPortAttributes, 0)
 	tprofile2.DownstreamGemPortAttributeList = append(tprofile.DownstreamGemPortAttributeList, &tp_pb.GemPortAttributes{GemportId: 1, PbitMap: "0b11111111"})
 
-	//defTprofile := &tp.DefaultTechProfile{}
+	// defTprofile := &tp.DefaultTechProfile{}
 	tests := []struct {
 		name       string
 		schedQueue schedQueue
 		wantErr    bool
 	}{
-		{"RemoveQueues-1", schedQueue{tp_pb.Direction_UPSTREAM, 1, 1, 1, 64, 1, tprofile, 0, nil}, false},
-		{"RemoveQueues-2", schedQueue{tp_pb.Direction_DOWNSTREAM, 1, 1, 1, 65, 1, tprofile2, 0, nil}, false},
-		{"RemoveQueues-3", schedQueue{tp_pb.Direction_DOWNSTREAM, 1, 1, 1, 65, 1, tprofile2, 0, nil}, false},
-		{"RemoveQueues-4", schedQueue{tp_pb.Direction_DOWNSTREAM, 1, 1, 1, 65, 1, tprofile2, 0, nil}, false},
+		{"RemoveQueues-1", schedQueue{tprofile, nil, tp_pb.Direction_UPSTREAM, 1, 1, 1, 64, 1, 0}, false},
+		{"RemoveQueues-2", schedQueue{tprofile2, nil, tp_pb.Direction_DOWNSTREAM, 1, 1, 1, 65, 1, 0}, false},
+		{"RemoveQueues-3", schedQueue{tprofile2, nil, tp_pb.Direction_DOWNSTREAM, 1, 1, 1, 65, 1, 0}, false},
+		{"RemoveQueues-4", schedQueue{tprofile2, nil, tp_pb.Direction_DOWNSTREAM, 1, 1, 1, 65, 1, 0}, false},
 	}
 	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
 	defer cancel()
@@ -265,7 +264,6 @@
 			}
 		})
 	}
-
 }
 
 func TestOpenOltFlowMgr_createTcontGemports(t *testing.T) {
@@ -343,14 +341,14 @@
 		},
 	}
 	lldpofpstats, _ := fu.MkFlowStat(lldpFa)
-	//lldpofpstats.Cookie = lldpofpstats.Id
+	// lldpofpstats.Cookie = lldpofpstats.Id
 
 	dhcpFa := &fu.FlowArgs{
 		KV: fu.OfpFlowModArgs{"priority": 1000, "cookie": 48132224281636694},
 		MatchFields: []*ofp.OfpOxmOfbField{
 			fu.InPort(1),
 			fu.UdpSrc(67),
-			//fu.TunnelId(536870912),
+			// fu.TunnelId(536870912),
 			fu.IpProto(17),
 		},
 		Actions: []*ofp.OfpAction{
@@ -358,16 +356,16 @@
 		},
 	}
 	dhcpofpstats, _ := fu.MkFlowStat(dhcpFa)
-	//dhcpofpstats.Cookie = dhcpofpstats.Id
+	// dhcpofpstats.Cookie = dhcpofpstats.Id
 
-	//multicast flow
+	// multicast flow
 	multicastFa := &fu.FlowArgs{
 		MatchFields: []*ofp.OfpOxmOfbField{
 			fu.InPort(16777216),
-			fu.VlanVid(660),             //vlan
-			fu.Metadata_ofp(uint64(66)), //inner vlan
-			fu.EthType(0x800),           //ipv4
-			fu.Ipv4Dst(3809869825),      //227.22.0.1
+			fu.VlanVid(660),             // vlan
+			fu.Metadata_ofp(uint64(66)), // inner vlan
+			fu.EthType(0x800),           // ipv4
+			fu.Ipv4Dst(3809869825),      // 227.22.0.1
 		},
 		Actions: []*ofp.OfpAction{
 			fu.Group(1),
@@ -429,7 +427,7 @@
 			fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT)),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257)),
 			fu.Output(16777216),
 			fu.PushVlan(0x8100),
@@ -445,8 +443,8 @@
 			fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
-			//fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 101)),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 101)),
 			fu.PopVlan(),
 			fu.Output(536870912),
 		},
@@ -460,7 +458,7 @@
 			fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT)),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 101)),
 			fu.Output(65533),
 		},
@@ -510,7 +508,7 @@
 			fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT)),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257)),
 			fu.Output(65535),
 		},
@@ -534,7 +532,7 @@
 		MatchFields: []*ofp.OfpOxmOfbField{
 			fu.InPort(1),
 			fu.UdpSrc(67),
-			//fu.TunnelId(536870912),
+			// fu.TunnelId(536870912),
 			fu.IpProto(17),
 		},
 		Actions: []*ofp.OfpAction{
@@ -546,7 +544,7 @@
 		MatchFields: []*ofp.OfpOxmOfbField{
 			fu.InPort(1),
 			fu.UdpSrc(67),
-			//fu.TunnelId(536870912),
+			// fu.TunnelId(536870912),
 			fu.IpProto(2),
 		},
 		Actions: []*ofp.OfpAction{
@@ -580,7 +578,7 @@
 			fu.Ipv4Src(536870912),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257)),
 			fu.Output(65535),
 		},
@@ -600,20 +598,20 @@
 			fu.Ipv4Src(536870912),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257)),
 			fu.Output(65535),
 		},
 		KV: kw6,
 	}
-	//multicast flow
+	// multicast flow
 	fa11 := &fu.FlowArgs{
 		MatchFields: []*ofp.OfpOxmOfbField{
 			fu.InPort(16777216),
-			fu.VlanVid(660),             //vlan
-			fu.Metadata_ofp(uint64(66)), //inner vlan
-			fu.EthType(0x800),           //ipv4
-			fu.Ipv4Dst(3809869825),      //227.22.0.1
+			fu.VlanVid(660),             // vlan
+			fu.Metadata_ofp(uint64(66)), // inner vlan
+			fu.EthType(0x800),           // ipv4
+			fu.Ipv4Dst(3809869825),      // 227.22.0.1
 		},
 		Actions: []*ofp.OfpAction{
 			fu.Group(1),
@@ -654,13 +652,13 @@
 		{"AddFlow", args{flow: ofpstats3, flowMetadata: flowMetadata}},
 		{"AddFlow", args{flow: ofpstats4, flowMetadata: flowMetadata}},
 		{"AddFlow", args{flow: ofpstats5, flowMetadata: flowMetadata}},
-		//{"AddFlow", args{flow: ofpstats6, flowMetadata: flowMetadata}},
+		// {"AddFlow", args{flow: ofpstats6, flowMetadata: flowMetadata}},
 		{"AddFlow", args{flow: ofpstats7, flowMetadata: flowMetadata}},
 		{"AddFlow", args{flow: ofpstats8, flowMetadata: flowMetadata}},
-		//{"AddFlow", args{flow: ofpstats9, flowMetadata: flowMetadata}},
+		// {"AddFlow", args{flow: ofpstats9, flowMetadata: flowMetadata}},
 		{"AddFlow", args{flow: igmpstats, flowMetadata: flowMetadata}},
-		//{"AddFlow", args{flow: ofpstats10, flowMetadata: flowMetadata}},
-		//ofpstats10
+		// {"AddFlow", args{flow: ofpstats10, flowMetadata: flowMetadata}},
+		// ofpstats10
 		{"AddFlow", args{flow: ofpstats11, flowMetadata: flowMetadata}},
 		{"AddFlow", args{flow: pppoedstats, flowMetadata: flowMetadata}},
 	}
@@ -695,7 +693,6 @@
 	defer cancel()
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-
 			got, err := flowMgr[tt.args.packetIn.IntfId].GetLogicalPortFromPacketIn(ctx, tt.args.packetIn)
 			if (err != nil) != tt.wantErr {
 				t.Errorf("OpenOltFlowMgr.GetLogicalPortFromPacketIn() error = %v, wantErr %v", err, tt.wantErr)
@@ -712,21 +709,21 @@
 	// Create fresh flowMgr instance
 	flowMgr = newMockFlowmgr()
 
-	//untagged packet in hex string
+	// untagged packet in hex string
 	untaggedStr := "01005e000002000000000001080046c00020000040000102fa140a000001e00000029404000017000705e10000fa"
 	untagged, err := hex.DecodeString(untaggedStr)
 	if err != nil {
 		t.Error("Unable to parse hex string", err)
 		panic(err)
 	}
-	//single-tagged packet in hex string. vlanID.pbit: 1.1
+	// single-tagged packet in hex string. vlanID.pbit: 1.1
 	singleTaggedStr := "01005e0000010025ba48172481002001080046c0002000004000010257deab140023e0000001940400001164ee9b0000000000000000000000000000"
 	singleTagged, err := hex.DecodeString(singleTaggedStr)
 	if err != nil {
 		t.Error("Unable to parse hex string", err)
 		panic(err)
 	}
-	//double-tagged packet in hex string. vlanID.pbit: 210.0-0.0
+	// double-tagged packet in hex string. vlanID.pbit: 210.0-0.0
 	doubleTaggedStr := "01005e000016deadbeefba118100021081000000080046000028000000000102c5b87f000001e0000016940400002200f8030000000104000000e10000fa"
 	doubleTagged, err := hex.DecodeString(doubleTaggedStr)
 	if err != nil {
@@ -758,16 +755,15 @@
 	defer cancel()
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-
 			got, err := flowMgr[tt.args.intfID].GetPacketOutGemPortID(ctx, tt.args.intfID, tt.args.onuID, tt.args.portNum, tt.args.packet)
 			if tt.wantErr {
 				if err == nil {
-					//error expected but got value
+					// error expected but got value
 					t.Errorf("OpenOltFlowMgr.GetPacketOutGemPortID() = %v, wantErr %v", got, tt.wantErr)
 				}
 			} else {
 				if err != nil {
-					//error is not expected but got error
+					// error is not expected but got error
 					t.Errorf("OpenOltFlowMgr.GetPacketOutGemPortID() error = %v, wantErr %v", err, tt.wantErr)
 					return
 				}
@@ -823,7 +819,7 @@
 			fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT)),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257)),
 			fu.Output(16777216),
 			fu.PushVlan(0x8100),
@@ -841,7 +837,7 @@
 			fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257)),
 			fu.Output(16777216),
 			fu.PushVlan(0x8100),
@@ -854,11 +850,11 @@
 		MatchFields: []*ofp.OfpOxmOfbField{
 			fu.InPort(536870912),
 			fu.Metadata_ofp(1),
-			//fu.EthType(0x8100),
+			// fu.EthType(0x8100),
 			fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT)),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT))),
 			fu.Output(16777216),
 			fu.PushVlan(0x8100),
@@ -874,7 +870,7 @@
 			fu.VlanPcp(1),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT))),
 			fu.Output(536870912),
 			fu.PopVlan(),
@@ -1137,21 +1133,21 @@
 func TestOpenOltFlowMgr_TestMulticastFlowAndGroup(t *testing.T) {
 	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
 	defer cancel()
-	//create group
+	// create group
 	group := newGroup(2, []uint32{1})
 	err := flowMgr[0].grpMgr.AddGroup(ctx, group)
 	if err != nil {
 		t.Error("group-add failed", err)
 		return
 	}
-	//create multicast flow
+	// create multicast flow
 	multicastFlowArgs := &fu.FlowArgs{
 		MatchFields: []*ofp.OfpOxmOfbField{
 			fu.InPort(16777216),
-			fu.VlanVid(660),             //vlan
-			fu.Metadata_ofp(uint64(66)), //inner vlan
-			fu.EthType(0x800),           //ipv4
-			fu.Ipv4Dst(3809869825),      //227.22.0.1
+			fu.VlanVid(660),             // vlan
+			fu.Metadata_ofp(uint64(66)), // inner vlan
+			fu.EthType(0x800),           // ipv4
+			fu.Ipv4Dst(3809869825),      // 227.22.0.1
 		},
 		Actions: []*ofp.OfpAction{
 			fu.Group(1),
@@ -1165,21 +1161,21 @@
 		return
 	}
 
-	//add bucket to the group
+	// add bucket to the group
 	group = newGroup(2, []uint32{1, 2})
 	err = flowMgr[0].grpMgr.ModifyGroup(ctx, group)
 	if err != nil {
 		t.Error("modify-group failed", err)
 		return
 	}
-	//remove the multicast flow
+	// remove the multicast flow
 	err = flowMgr[0].RemoveFlow(ctx, ofpStats)
 	if err != nil {
 		t.Error("Multicast flow-remove failed", err)
 		return
 	}
 
-	//remove the group
+	// remove the group
 	err = flowMgr[0].grpMgr.DeleteGroup(ctx, group)
 	if err != nil {
 		t.Error("delete-group failed", err)
@@ -1260,7 +1256,7 @@
 			fu.TunnelId(256),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257)),
 			fu.Output(2147483645),
 			fu.PushVlan(0x8100),
@@ -1279,7 +1275,7 @@
 			fu.TunnelId(256),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257)),
 			fu.Output(2147483645),
 			fu.PushVlan(0x8100),
@@ -1292,12 +1288,12 @@
 		MatchFields: []*ofp.OfpOxmOfbField{
 			fu.InPort(536870912),
 			fu.Metadata_ofp(1),
-			//fu.EthType(0x8100),
+			// fu.EthType(0x8100),
 			fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT)),
 			fu.TunnelId(256),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT))),
 			fu.Output(16777216),
 			fu.PushVlan(0x8100),
@@ -1315,7 +1311,7 @@
 			fu.TunnelId(256),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT))),
 			fu.Output(536870912),
 			fu.PopVlan(),
@@ -1334,7 +1330,7 @@
 			fu.TunnelId(256),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 259)),
 			fu.Output(2147483645),
 			fu.PushVlan(0x8100),
@@ -1353,7 +1349,7 @@
 			fu.TunnelId(256),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257)),
 			fu.Output(2147483645),
 			fu.PushVlan(0x8100),
@@ -1372,7 +1368,7 @@
 			fu.TunnelId(256),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257)),
 			fu.Output(2147483645),
 			fu.PushVlan(0x8100),
@@ -1391,7 +1387,7 @@
 			fu.TunnelId(256),
 		},
 		Actions: []*ofp.OfpAction{
-			//fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
+			// fu.SetField(fu.Metadata_ofp(uint64(ofp.OfpInstructionType_OFPIT_WRITE_METADATA | 2))),
 			fu.SetField(fu.VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 257)),
 			fu.Output(2147483645),
 			fu.PushVlan(0x8100),
diff --git a/internal/pkg/core/openolt_groupmgr.go b/internal/pkg/core/openolt_groupmgr.go
index 670eeaf..6da8475 100644
--- a/internal/pkg/core/openolt_groupmgr.go
+++ b/internal/pkg/core/openolt_groupmgr.go
@@ -99,7 +99,7 @@
 		logger.Errorw(ctx, "delete-group-failed-on-dev", log.Fields{"groupToOlt": groupToOlt, "err": err})
 		return olterrors.NewErrAdapter("delete-group-operation-failed", log.Fields{"groupToOlt": groupToOlt}, err)
 	}
-	//remove group from the store
+	// remove group from the store
 	if err := g.resourceMgr.RemoveFlowGroupFromKVStore(ctx, group.Desc.GroupId, false); err != nil {
 		return olterrors.NewErrPersistence("delete", "flow-group", uint64(group.Desc.GroupId), log.Fields{"group": group}, err)
 	}
@@ -114,7 +114,7 @@
 		return olterrors.NewErrInvalidValue(log.Fields{"group": group}, nil)
 	}
 	newGroup := g.buildGroup(ctx, group.Desc.GroupId, group.Desc.Buckets)
-	//get existing members of the group
+	// get existing members of the group
 	val, groupExists, err := g.getFlowGroupFromKVStore(ctx, group.Desc.GroupId, false)
 	if err != nil {
 		return olterrors.NewErrNotFound("flow-group-in-kv-store", log.Fields{"groupId": group.Desc.GroupId}, err)
@@ -149,16 +149,16 @@
 	if len(membersToBeAdded) > 0 {
 		groupToOlt.Command = openoltpb2.Group_ADD_MEMBERS
 		groupToOlt.Members = membersToBeAdded
-		//execute addMembers
+		// execute addMembers
 		errAdd = g.callGroupAddRemove(ctx, &groupToOlt)
 	}
 	if len(membersToBeRemoved) > 0 {
 		groupToOlt.Command = openoltpb2.Group_REMOVE_MEMBERS
 		groupToOlt.Members = membersToBeRemoved
-		//execute removeMembers
+		// execute removeMembers
 		errRemoved = g.callGroupAddRemove(ctx, &groupToOlt)
 	}
-	//save the modified group
+	// save the modified group
 	if errAdd == nil && errRemoved == nil {
 		if err := g.resourceMgr.AddFlowGroupToKVStore(ctx, group, false); err != nil {
 			return olterrors.NewErrPersistence("add", "flow-group", uint64(group.Desc.GroupId), log.Fields{"group": group}, err)
@@ -252,7 +252,7 @@
 	var actionCmd openoltpb2.ActionCmd
 	var action openoltpb2.Action
 	action.Cmd = &actionCmd
-	//pop outer vlan
+	// pop outer vlan
 	action.Cmd.RemoveOuterTag = true
 	return &action
 }
@@ -261,7 +261,7 @@
 func (g *OpenOltGroupMgr) callGroupAddRemove(ctx context.Context, group *openoltpb2.Group) error {
 	if err := g.performGroupOperation(ctx, group); err != nil {
 		st, _ := status.FromError(err)
-		//ignore already exists error code
+		// ignore already exists error code
 		if st.Code() != codes.AlreadyExists {
 			return olterrors.NewErrGroupOp("groupAddRemove", group.GroupId, log.Fields{"status": st}, err)
 		}
@@ -346,7 +346,7 @@
 			GemPortId:     groupInfo.gemPortID,
 			Priority:      groupInfo.servicePriority,
 		}
-		//add member to the group
+		// add member to the group
 		return &member
 	}
 	logger.Warnf(ctx, "bucket-skipped-since-interface-2-gem-mapping-cannot-be-found", log.Fields{"ofBucket": ofBucket})
diff --git a/internal/pkg/core/openolt_test.go b/internal/pkg/core/openolt_test.go
index 4b592ec..b2bcfb4 100644
--- a/internal/pkg/core/openolt_test.go
+++ b/internal/pkg/core/openolt_test.go
@@ -230,7 +230,7 @@
 		{"delete_device-1", &fields{}, args{oo1, mockDevice()},
 			olterrors.NewErrNotFound("device-handler", log.Fields{"device-id": "olt"}, nil)},
 		{"delete_device-2", &fields{}, args{oo2, mockDevice()}, nil},
-		{"delete_device-3", &fields{}, args{oo3, mockDevice()}, nil},
+		{"delete_device-3", &fields{}, args{oo3, mockDevice()}, errors.New("reboot failed")},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -704,7 +704,6 @@
 			if _, err := oo.UpdatePmConfig(context.Background(), &ca.PmConfigsInfo{DeviceId: tt.args.device.Id, PmConfigs: tt.args.pmConfigs}); !reflect.DeepEqual(err, tt.wantErr) {
 				t.Errorf("Update_pm_config() error = %v, wantErr %v", err, tt.wantErr)
 			}
-
 		})
 	}
 }
diff --git a/internal/pkg/core/statsmanager.go b/internal/pkg/core/statsmanager.go
old mode 100755
new mode 100644
index c9e15eb..1f9d7f9
--- a/internal/pkg/core/statsmanager.go
+++ b/internal/pkg/core/statsmanager.go
@@ -35,62 +35,62 @@
 )
 
 const (
-	//NNIStats statType constant
+	// NNIStats statType constant
 	NNIStats = "NNIStats"
-	//PONStats statType constant
+	// PONStats statType constant
 	PONStats = "PONStats"
-	//ONUStats statType constant
+	// ONUStats statType constant
 	ONUStats = "ONUStats"
-	//GEMStats statType constant
+	// GEMStats statType constant
 	GEMStats = "GEMStats"
 
-	//RxBytes constant
+	// RxBytes constant
 	RxBytes = "RxBytes"
-	//RxPackets constant
+	// RxPackets constant
 	RxPackets = "RxPackets"
-	//TxBytes constant
+	// TxBytes constant
 	TxBytes = "TxBytes"
-	//TxPackets constant
+	// TxPackets constant
 	TxPackets = "TxPackets"
-	//FecCodewords constant
+	// FecCodewords constant
 	FecCodewords = "FecCodewords"
-	//BipUnits constant
+	// BipUnits constant
 	BipUnits = "BipUnits"
-	//BipErrors constant
+	// BipErrors constant
 	BipErrors = "BipErrors"
-	//RxPloamsNonIdle constant
+	// RxPloamsNonIdle constant
 	RxPloamsNonIdle = "RxPloamsNonIdle"
-	//RxPloamsError constant
+	// RxPloamsError constant
 	RxPloamsError = "RxPloamsError"
-	//RxOmci constant
+	// RxOmci constant
 	RxOmci = "RxOmci"
-	//RxOmciPacketsCrcError constant
+	// RxOmciPacketsCrcError constant
 	RxOmciPacketsCrcError = "RxOmciPacketsCrcError"
-	//PositiveDrift constant
+	// PositiveDrift constant
 	PositiveDrift = "PositiveDrift"
-	//NegativeDrift constant
+	// NegativeDrift constant
 	NegativeDrift = "NegativeDrift"
-	//DelimiterMissDetection constant
+	// DelimiterMissDetection constant
 	DelimiterMissDetection = "DelimiterMissDetection"
-	//FecCorrectedSymbols constant
+	// FecCorrectedSymbols constant
 	FecCorrectedSymbols = "FecCorrectedSymbols"
-	//FecCodewordsCorrected constant
+	// FecCodewordsCorrected constant
 	FecCodewordsCorrected = "FecCodewordsCorrected"
-	//fecCodewordsUncorrectable constant
+	// fecCodewordsUncorrectable constant
 	fecCodewordsUncorrectable = "fec_codewords_uncorrectable"
-	//FecCorrectedUnits constant
+	// FecCorrectedUnits constant
 	FecCorrectedUnits = "FecCorrectedUnits"
-	//XGEMKeyErrors constant
+	// XGEMKeyErrors constant
 	XGEMKeyErrors = "XGEMKeyErrors"
-	//XGEMLoss constant
+	// XGEMLoss constant
 	XGEMLoss = "XGEMLOSS"
-	//BerReported constant
+	// BerReported constant
 	BerReported = "BerReported"
-	//LcdgErrors constant
+	// LcdgErrors constant
 	LcdgErrors = "LcdgErrors"
-	//RdiErrors constant
+	// RdiErrors constant
 	RdiErrors = "RdiErrors"
-	//Timestamp constant
+	// Timestamp constant
 	Timestamp = "Timestamp"
 )
 
@@ -109,29 +109,12 @@
 
 // PonPort representation
 type PonPort struct {
-	/*
-	   This is a highly reduced version taken from the adtran pon_port.
-	   TODO: Extend for use in the openolt adapter set.
-	*/
-	/*    MAX_ONUS_SUPPORTED = 256
-	      DEFAULT_ENABLED = False
-	      MAX_DEPLOYMENT_RANGE = 25000  # Meters (OLT-PB maximum)
-
-	      _MCAST_ONU_ID = 253
-	      _MCAST_ALLOC_BASE = 0x500
-
-	      _SUPPORTED_ACTIVATION_METHODS = ['autodiscovery']  # , 'autoactivate']
-	      _SUPPORTED_AUTHENTICATION_METHODS = ['serial-number']
-	*/
-	PONID    uint32
-	DeviceID string
-	IntfID   uint32
-	PortNum  uint32
-	PortID   uint32
-	Label    string
 	ONUs     map[uint32]interface{}
 	ONUsByID map[uint32]interface{}
 
+	DeviceID string
+	Label    string
+
 	RxBytes        uint64
 	RxPackets      uint64
 	RxUcastPackets uint64
@@ -146,11 +129,28 @@
 	TxErrorPackets uint64
 	RxCrcErrors    uint64
 	BipErrors      uint64
+	/*
+	   This is a highly reduced version taken from the adtran pon_port.
+	   TODO: Extend for use in the openolt adapter set.
+	*/
+	/*    MAX_ONUS_SUPPORTED = 256
+	      DEFAULT_ENABLED = False
+	      MAX_DEPLOYMENT_RANGE = 25000  # Meters (OLT-PB maximum)
+
+	      _MCAST_ONU_ID = 253
+	      _MCAST_ALLOC_BASE = 0x500
+
+	      _SUPPORTED_ACTIVATION_METHODS = ['autodiscovery']  # , 'autoactivate']
+	      _SUPPORTED_AUTHENTICATION_METHODS = ['serial-number']
+	*/
+	PONID   uint32
+	IntfID  uint32
+	PortNum uint32
+	PortID  uint32
 }
 
 // NewPONPort returns a new instance of PonPort initialized with given PONID, DeviceID, IntfID and PortNum
 func NewPONPort(PONID uint32, DeviceID string, IntfID uint32, PortNum uint32) *PonPort {
-
 	var PON PonPort
 
 	PON.PONID = PONID
@@ -202,16 +202,7 @@
 
 // NniPort representation
 type NniPort struct {
-	/*
-	   Northbound network port, often Ethernet-based
-
-	   This is a highly reduced version taken from the adtran nni_port code set
-	   TODO:   add functions to allow for port specific values and operations
-	*/
-	PortNum     uint32
-	Name        string
-	LogicalPort uint32
-	IntfID      uint32
+	Name string
 
 	RxBytes        uint64
 	RxPackets      uint64
@@ -227,11 +218,19 @@
 	TxErrorPackets uint64
 	RxCrcErrors    uint64
 	BipErrors      uint64
+	/*
+	   Northbound network port, often Ethernet-based
+
+	   This is a highly reduced version taken from the adtran nni_port code set
+	   TODO:   add functions to allow for port specific values and operations
+	*/
+	PortNum     uint32
+	LogicalPort uint32
+	IntfID      uint32
 }
 
 // NewNniPort returns a new instance of NniPort initialized with the given PortNum and IntfID
 func NewNniPort(PortNum uint32, IntfID uint32) *NniPort {
-
 	var NNI NniPort
 
 	NNI.PortNum = PortNum
@@ -266,18 +265,17 @@
 
 // OpenOltStatisticsMgr structure
 type OpenOltStatisticsMgr struct {
-	Device         *DeviceHandler
-	NorthBoundPort map[uint32]*NniPort
-	SouthBoundPort map[uint32]*PonPort
+	Device          *DeviceHandler
+	NorthBoundPort  map[uint32]*NniPort
+	SouthBoundPort  map[uint32]*PonPort
+	statIndListners map[StatType]*list.List
 	// TODO  PMMetrics Metrics
-	//statIndListners is the list of requests to be notified when port and flow stats indication is received
+	// statIndListners is the list of requests to be notified when port and flow stats indication is received
 	statIndListnerMu sync.Mutex
-	statIndListners  map[StatType]*list.List
 }
 
 // NewOpenOltStatsMgr returns a new instance of the OpenOltStatisticsMgr
 func NewOpenOltStatsMgr(ctx context.Context, Dev *DeviceHandler) *OpenOltStatisticsMgr {
-
 	var StatMgr OpenOltStatisticsMgr
 
 	StatMgr.Device = Dev
@@ -347,8 +345,8 @@
 	   :return:
 	*/
 
-	//This builds a port object which is added to the
-	//appropriate northbound or southbound values
+	// This builds a port object which is added to the
+	// appropriate northbound or southbound values
 	if IntfType == "nni" {
 		IntfID := plt.IntfIDToPortNo(PortNum, voltha.Port_ETHERNET_NNI)
 		nniID := plt.PortNoToIntfID(IntfID, voltha.Port_ETHERNET_NNI)
@@ -375,7 +373,6 @@
 
 // collectNNIMetrics will collect the nni port metrics
 func (StatMgr *OpenOltStatisticsMgr) collectNNIMetrics(nniID uint32) map[string]float32 {
-
 	nnival := make(map[string]float32)
 	mutex.Lock()
 	cm := StatMgr.Device.portStats.NorthBoundPort[nniID]
@@ -416,7 +413,6 @@
 
 // collectPONMetrics will collect the pon port metrics
 func (StatMgr *OpenOltStatisticsMgr) collectPONMetrics(pID uint32) map[string]float32 {
-
 	ponval := make(map[string]float32)
 	mutex.Lock()
 	cm := StatMgr.Device.portStats.SouthBoundPort[pID]
@@ -520,7 +516,6 @@
 	if stats, err = StatMgr.Device.Client.GetOnuStatistics(context.Background(), onu); err == nil {
 		statValue := StatMgr.convertONUStats(stats)
 		return statValue
-
 	}
 	logger.Errorw(ctx, "error-while-getting-onu-stats-for-onu", log.Fields{"IntfID": intfID, "OnuID": onuID, "err": err})
 	return nil
@@ -620,8 +615,8 @@
 func (StatMgr *OpenOltStatisticsMgr) PortStatisticsIndication(ctx context.Context, PortStats *openolt.PortStatistics, NumPonPorts uint32) {
 	StatMgr.PortsStatisticsKpis(ctx, PortStats, NumPonPorts)
 	logger.Debugw(ctx, "received-port-stats-indication", log.Fields{"port-stats": PortStats})
-	//Indicate that PortStatisticsIndication is handled
-	//PortStats.IntfId is actually the port number
+	// Indicate that PortStatisticsIndication is handled
+	// PortStats.IntfId is actually the port number
 	StatMgr.processStatIndication(ctx, portStatsType, PortStats.IntfId)
 	// TODO send stats to core topic to the voltha kafka or a different kafka ?
 }
@@ -629,19 +624,18 @@
 // FlowStatisticsIndication to be implemented
 func FlowStatisticsIndication(ctx context.Context, self, FlowStats *openolt.FlowStatistics) {
 	logger.Debugw(ctx, "flow-stats-collected", log.Fields{"flow-stats": FlowStats})
-	//TODO send to kafka ?
+	// TODO send to kafka ?
 }
 
 // PortsStatisticsKpis map the port stats values into a dictionary, creates the kpiEvent and then publish to Kafka
 func (StatMgr *OpenOltStatisticsMgr) PortsStatisticsKpis(ctx context.Context, PortStats *openolt.PortStatistics, NumPonPorts uint32) {
-
 	/*map the port stats values into a dictionary
 	  Create a kpoEvent and publish to Kafka
 
 	  :param port_stats:
 	  :return:
 	*/
-	//var err error
+	// var err error
 	IntfID := PortStats.IntfId
 
 	if (plt.IntfIDToPortNo(1, voltha.Port_ETHERNET_NNI) < IntfID) &&
@@ -653,7 +647,6 @@
 		*/
 		return
 	} else if plt.IntfIDToPortNo(0, voltha.Port_ETHERNET_NNI) == IntfID {
-
 		var portNNIStat NniPort
 		portNNIStat.IntfID = IntfID
 		portNNIStat.PortNum = uint32(0)
@@ -673,7 +666,6 @@
 		logger.Debugw(ctx, "received-nni-stats", log.Fields{"nni-stats": StatMgr.NorthBoundPort})
 	}
 	for i := uint32(0); i < NumPonPorts; i++ {
-
 		if plt.IntfIDToPortNo(i, voltha.Port_PON_OLT) == IntfID {
 			var portPonStat PonPort
 			portPonStat.IntfID = IntfID
@@ -695,7 +687,6 @@
 			logger.Debugw(ctx, "received-pon-stats-for-port", log.Fields{"port-pon-stats": portPonStat})
 		}
 	}
-
 	/*
 	   Based upon the intf_id map to an nni port or a pon port
 	   the intf_id is the key to the north or south bound collections
@@ -705,7 +696,7 @@
 
 	   For prefixing the rule is currently to use the port number and not the intf_id
 	*/
-	//FIXME : Just use first NNI for now
+	// FIXME : Just use first NNI for now
 	/* TODO should the data be marshaled before sending it ?
 	   if IntfID == IntfIdToPortNo(0, voltha.Port_ETHERNET_NNI) {
 	       //NNI port (just the first one)
@@ -718,11 +709,9 @@
 	       logger.Error(ctx, "Error publishing statistics data")
 	   }
 	*/
-
 }
 
 func (StatMgr *OpenOltStatisticsMgr) updateGetOltPortCountersResponse(ctx context.Context, singleValResp *extension.SingleGetValueResponse, stats map[string]float32) {
-
 	metrics := singleValResp.GetResponse().GetPortCoutners()
 	metrics.TxBytes = uint64(stats["TxBytes"])
 	metrics.RxBytes = uint64(stats["RxBytes"])
@@ -753,7 +742,6 @@
 	StatMgr.statIndListnerMu.Lock()
 	StatMgr.statIndListners[t].PushBack(statInd)
 	StatMgr.statIndListnerMu.Unlock()
-
 }
 
 // DeRegisterFromStatIndication removes the previously registered channel ch for type t of statistics
@@ -791,16 +779,13 @@
 		// message sent
 		statInd.chn <- true
 		deRegList = append(deRegList, e)
-
 	}
 	for _, e := range deRegList {
 		StatMgr.statIndListners[t].Remove(e)
 	}
-
 }
 
 func (StatMgr *OpenOltStatisticsMgr) updateGetOnuPonCountersResponse(ctx context.Context, singleValResp *extension.SingleGetValueResponse, stats map[string]float32) {
-
 	metrics := singleValResp.GetResponse().GetOnuPonCounters()
 	metrics.IsIntfId = &extension.GetOnuCountersResponse_IntfId{
 		IntfId: uint32(stats[IntfID]),
diff --git a/internal/pkg/core/statsmanager_test.go b/internal/pkg/core/statsmanager_test.go
index 5e60af9..1cec548 100644
--- a/internal/pkg/core/statsmanager_test.go
+++ b/internal/pkg/core/statsmanager_test.go
@@ -56,7 +56,6 @@
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-
 			StatMgr.PortStatisticsIndication(context.Background(), tt.args.PortStats, 16)
 		})
 	}
