diff --git a/adaptercore/device_handler.go b/adaptercore/device_handler.go
index 5fddcf7..de23653 100644
--- a/adaptercore/device_handler.go
+++ b/adaptercore/device_handler.go
@@ -13,6 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+//Package adaptercore provides the utility for olt devices, flows and statistics
 package adaptercore
 
 import (
@@ -44,7 +46,7 @@
 
 //DeviceHandler will interact with the OLT device.
 type DeviceHandler struct {
-	deviceId      string
+	deviceID      string
 	deviceType    string
 	adminState    string
 	device        *voltha.Device
@@ -60,27 +62,28 @@
 	resourceMgr   *rsrcMgr.OpenOltResourceMgr
 	discOnus      map[string]bool
 	onus          map[string]*OnuDevice
-	nniIntfId     int
+	nniIntfID     int
 }
 
+//OnuDevice represents ONU related info
 type OnuDevice struct {
-	deviceId      string
+	deviceID      string
 	deviceType    string
 	serialNumber  string
-	onuId         uint32
-	intfId        uint32
-	proxyDeviceId string
+	onuID         uint32
+	intfID        uint32
+	proxyDeviceID string
 }
 
 //NewOnuDevice creates a new Onu Device
-func NewOnuDevice(devId string, deviceTp string, serialNum string, onuId uint32, intfId uint32, proxyDevId string) *OnuDevice {
+func NewOnuDevice(devID, deviceTp, serialNum string, onuID, intfID uint32, proxyDevID string) *OnuDevice {
 	var device OnuDevice
-	device.deviceId = devId
+	device.deviceID = devID
 	device.deviceType = deviceTp
 	device.serialNumber = serialNum
-	device.onuId = onuId
-	device.intfId = intfId
-	device.proxyDeviceId = proxyDevId
+	device.onuID = onuID
+	device.intfID = intfID
+	device.proxyDeviceID = proxyDevID
 	return &device
 }
 
@@ -90,7 +93,7 @@
 	dh.coreProxy = cp
 	dh.AdapterProxy = ap
 	cloned := (proto.Clone(device)).(*voltha.Device)
-	dh.deviceId = cloned.Id
+	dh.deviceID = cloned.Id
 	dh.deviceType = cloned.Type
 	dh.adminState = "up"
 	dh.device = cloned
@@ -99,10 +102,10 @@
 	dh.discOnus = make(map[string]bool)
 	dh.lockDevice = sync.RWMutex{}
 	dh.onus = make(map[string]*OnuDevice)
-	// The nniIntfId is initialized to -1 (invalid) and set to right value
+	// The nniIntfID is initialized to -1 (invalid) and set to right value
 	// when the first IntfOperInd with status as "up" is received for
 	// any one of the available NNI port on the OLT device.
-	dh.nniIntfId = -1
+	dh.nniIntfID = -1
 
 	//TODO initialize the support classes.
 	return &dh
@@ -140,6 +143,7 @@
 	return result
 }
 
+//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 {
 
 	if portType == voltha.Port_ETHERNET_NNI {
@@ -153,14 +157,14 @@
 	return ""
 }
 
-func (dh *DeviceHandler) addPort(intfId uint32, portType voltha.Port_PortType, state string) {
+func (dh *DeviceHandler) addPort(intfID uint32, portType voltha.Port_PortType, state string) {
 	var operStatus common.OperStatus_OperStatus
 	if state == "up" {
 		operStatus = voltha.OperStatus_ACTIVE
 	} else {
 		operStatus = voltha.OperStatus_DISCOVERED
 	}
-	portNum := IntfIdToPortNo(intfId, portType)
+	portNum := IntfIDToPortNo(intfID, portType)
 	label := GetportLabel(portNum, portType)
 	if len(label) == 0 {
 		log.Errorw("Invalid-port-label", log.Fields{"portNum": portNum, "portType": portType})
@@ -175,14 +179,14 @@
 	}
 	log.Debugw("Sending port update to core", log.Fields{"port": port})
 	// Synchronous call to update device - this method is run in its own go routine
-	if err := dh.coreProxy.PortCreated(nil, dh.device.Id, port); err != nil {
-		log.Errorw("error-creating-port", log.Fields{"deviceId": dh.device.Id, "portType": portType, "error": err})
-		return
+	if err := dh.coreProxy.PortCreated(context.TODO(), dh.device.Id, port); err != nil {
+		log.Errorw("error-creating-nni-port", log.Fields{"deviceID": dh.device.Id, "portType": portType, "error": err})
 	}
+
 	// Once we have successfully added the NNI port to the core, if the
-	// locally cached nniIntfId is set to invalid (-1), set it to the right value.
-	if portType == voltha.Port_ETHERNET_NNI && dh.nniIntfId == -1 {
-		dh.nniIntfId = int(intfId)
+	// locally cached nniIntfID is set to invalid (-1), set it to the right value.
+	if portType == voltha.Port_ETHERNET_NNI && dh.nniIntfID == -1 {
+		dh.nniIntfID = int(intfID)
 	}
 }
 
@@ -198,11 +202,11 @@
 		return
 	}
 	/* get device state */
-	device, err := dh.coreProxy.GetDevice(nil, dh.device.Id, dh.device.Id)
+	device, err := dh.coreProxy.GetDevice(context.TODO(), dh.device.Id, dh.device.Id)
 	if err != nil || device == nil {
 		/*TODO: needs to handle error scenarios */
 		log.Errorw("Failed to fetch device info", log.Fields{"err": err})
-
+		return
 	}
 	// When the device is in DISABLED and Adapter container restarts, we need to
 	// rebuild the locally maintained admin state.
@@ -236,66 +240,74 @@
 				continue
 			}
 		}
-		switch indication.Data.(type) {
-		case *oop.Indication_OltInd:
-			oltInd := indication.GetOltInd()
-			if oltInd.OperState == "up" {
-				dh.transitionMap.Handle(DeviceUpInd)
-			} else if oltInd.OperState == "down" {
-				dh.transitionMap.Handle(DeviceDownInd)
-			}
-		case *oop.Indication_IntfInd:
 
-			intfInd := indication.GetIntfInd()
-			go dh.addPort(intfInd.GetIntfId(), voltha.Port_PON_OLT, intfInd.GetOperState())
-			log.Infow("Received interface indication ", log.Fields{"InterfaceInd": intfInd})
-		case *oop.Indication_IntfOperInd:
-			intfOperInd := indication.GetIntfOperInd()
-			if intfOperInd.GetType() == "nni" {
-				go dh.addPort(intfOperInd.GetIntfId(), voltha.Port_ETHERNET_NNI, intfOperInd.GetOperState())
-			} else if intfOperInd.GetType() == "pon" {
-				// TODO: Check what needs to be handled here for When PON PORT down, ONU will be down
-				// Handle pon port update
-			}
-			log.Infow("Received interface oper indication ", log.Fields{"InterfaceOperInd": intfOperInd})
-		case *oop.Indication_OnuDiscInd:
-			onuDiscInd := indication.GetOnuDiscInd()
-			log.Infow("Received Onu discovery indication ", log.Fields{"OnuDiscInd": onuDiscInd})
-			//onuId,err := dh.resourceMgr.GetONUID(onuDiscInd.GetIntfId())
-			//onuId,err := dh.resourceMgr.GetONUID(onuDiscInd.GetIntfId())
-			// TODO Get onu ID from the resource manager
-			var onuId uint32 = 1
-			/*if err != nil{
-			    log.Errorw("onu-id-unavailable",log.Fields{"intfId":onuDiscInd.GetIntfId()})
-			    return
-			}*/
+		dh.handleIndication(indication)
 
-			sn := dh.stringifySerialNumber(onuDiscInd.SerialNumber)
-			go dh.onuDiscIndication(onuDiscInd, onuId, sn)
-		case *oop.Indication_OnuInd:
-			onuInd := indication.GetOnuInd()
-			log.Infow("Received Onu indication ", log.Fields{"OnuInd": onuInd})
-			go dh.onuIndication(onuInd)
-		case *oop.Indication_OmciInd:
-			omciInd := indication.GetOmciInd()
-			log.Infow("Received Omci indication ", log.Fields{"OmciInd": omciInd})
-			if err := dh.omciIndication(omciInd); err != nil {
-				log.Errorw("send-omci-indication-errr", log.Fields{"error": err, "omciInd": omciInd})
-			}
-		case *oop.Indication_PktInd:
-			pktInd := indication.GetPktInd()
-			log.Infow("Received pakcet indication ", log.Fields{"PktInd": pktInd})
-			go dh.handlePacketIndication(pktInd)
-		case *oop.Indication_PortStats:
-			portStats := indication.GetPortStats()
-			log.Infow("Received port stats indication", log.Fields{"PortStats": portStats})
-		case *oop.Indication_FlowStats:
-			flowStats := indication.GetFlowStats()
-			log.Infow("Received flow stats", log.Fields{"FlowStats": flowStats})
-		case *oop.Indication_AlarmInd:
-			alarmInd := indication.GetAlarmInd()
-			log.Infow("Received alarm indication ", log.Fields{"AlarmInd": alarmInd})
+	}
+}
+
+func (dh *DeviceHandler) handleOltIndication(oltIndication *oop.OltIndication) {
+	if oltIndication.OperState == "up" {
+		dh.transitionMap.Handle(DeviceUpInd)
+	} else if oltIndication.OperState == "down" {
+		dh.transitionMap.Handle(DeviceDownInd)
+	}
+}
+
+func (dh *DeviceHandler) handleIndication(indication *oop.Indication) {
+	switch indication.Data.(type) {
+	case *oop.Indication_OltInd:
+		dh.handleOltIndication(indication.GetOltInd())
+	case *oop.Indication_IntfInd:
+		intfInd := indication.GetIntfInd()
+		go dh.addPort(intfInd.GetIntfId(), voltha.Port_PON_OLT, intfInd.GetOperState())
+		log.Infow("Received interface indication ", log.Fields{"InterfaceInd": intfInd})
+	case *oop.Indication_IntfOperInd:
+		intfOperInd := indication.GetIntfOperInd()
+		if intfOperInd.GetType() == "nni" {
+			go dh.addPort(intfOperInd.GetIntfId(), voltha.Port_ETHERNET_NNI, intfOperInd.GetOperState())
+		} else if intfOperInd.GetType() == "pon" {
+			// TODO: Check what needs to be handled here for When PON PORT down, ONU will be down
+			// Handle pon port update
 		}
+		log.Infow("Received interface oper indication ", log.Fields{"InterfaceOperInd": intfOperInd})
+	case *oop.Indication_OnuDiscInd:
+		onuDiscInd := indication.GetOnuDiscInd()
+		log.Infow("Received Onu discovery indication ", log.Fields{"OnuDiscInd": onuDiscInd})
+		//onuID,err := dh.resourceMgr.GetONUID(onuDiscInd.GetIntfId())
+		//onuID,err := dh.resourceMgr.GetONUID(onuDiscInd.GetIntfId())
+		// TODO Get onu ID from the resource manager
+		var onuID uint32 = 1
+		/*if err != nil{
+		    log.Errorw("onu-id-unavailable",log.Fields{"intfID":onuDiscInd.GetIntfId()})
+		    return
+		}*/
+
+		sn := dh.stringifySerialNumber(onuDiscInd.SerialNumber)
+		go dh.onuDiscIndication(onuDiscInd, onuID, sn)
+	case *oop.Indication_OnuInd:
+		onuInd := indication.GetOnuInd()
+		log.Infow("Received Onu indication ", log.Fields{"OnuInd": onuInd})
+		go dh.onuIndication(onuInd)
+	case *oop.Indication_OmciInd:
+		omciInd := indication.GetOmciInd()
+		log.Infow("Received Omci indication ", log.Fields{"OmciInd": omciInd})
+		if err := dh.omciIndication(omciInd); err != nil {
+			log.Errorw("send-omci-indication-errr", log.Fields{"error": err, "omciInd": omciInd})
+		}
+	case *oop.Indication_PktInd:
+		pktInd := indication.GetPktInd()
+		log.Infow("Received pakcet indication ", log.Fields{"PktInd": pktInd})
+		go dh.handlePacketIndication(pktInd)
+	case *oop.Indication_PortStats:
+		portStats := indication.GetPortStats()
+		log.Infow("Received port stats indication", log.Fields{"PortStats": portStats})
+	case *oop.Indication_FlowStats:
+		flowStats := indication.GetFlowStats()
+		log.Infow("Received flow stats", log.Fields{"FlowStats": flowStats})
+	case *oop.Indication_AlarmInd:
+		alarmInd := indication.GetAlarmInd()
+		log.Infow("Received alarm indication ", log.Fields{"AlarmInd": alarmInd})
 	}
 }
 
@@ -304,7 +316,7 @@
 	// Synchronous call to update device state - this method is run in its own go routine
 	if err := dh.coreProxy.DeviceStateUpdate(context.Background(), dh.device.Id, voltha.ConnectStatus_REACHABLE,
 		voltha.OperStatus_ACTIVE); err != nil {
-		log.Errorw("Failed to update device with OLT UP indication", log.Fields{"deviceId": dh.device.Id, "error": err})
+		log.Errorw("Failed to update device with OLT UP indication", log.Fields{"deviceID": dh.device.Id, "error": err})
 		return err
 	}
 	return nil
@@ -314,17 +326,18 @@
 func (dh *DeviceHandler) doStateDown() error {
 	log.Debug("do-state-down-start")
 
-	device, err := dh.coreProxy.GetDevice(nil, dh.device.Id, dh.device.Id)
+	device, err := dh.coreProxy.GetDevice(context.TODO(), dh.device.Id, dh.device.Id)
 	if err != nil || device == nil {
 		/*TODO: needs to handle error scenarios */
 		log.Errorw("Failed to fetch device device", log.Fields{"err": err})
+		return errors.New("failed to fetch device device")
 	}
 
 	cloned := proto.Clone(device).(*voltha.Device)
 	// Update the all ports state on that device to disable
-	if err := dh.coreProxy.PortsStateUpdate(nil, cloned.Id, voltha.OperStatus_UNKNOWN); err != nil {
-		log.Errorw("updating-ports-failed", log.Fields{"deviceId": device.Id, "error": err})
-		return err
+	if er := dh.coreProxy.PortsStateUpdate(context.TODO(), cloned.Id, voltha.OperStatus_UNKNOWN); er != nil {
+		log.Errorw("updating-ports-failed", log.Fields{"deviceID": device.Id, "error": er})
+		return er
 	}
 
 	//Update the device oper state and connection status
@@ -332,15 +345,15 @@
 	cloned.ConnectStatus = common.ConnectStatus_UNREACHABLE
 	dh.device = cloned
 
-	if err := dh.coreProxy.DeviceStateUpdate(nil, cloned.Id, cloned.ConnectStatus, cloned.OperStatus); err != nil {
-		log.Errorw("error-updating-device-state", log.Fields{"deviceId": device.Id, "error": err})
-		return err
+	if er := dh.coreProxy.DeviceStateUpdate(context.TODO(), cloned.Id, cloned.ConnectStatus, cloned.OperStatus); er != nil {
+		log.Errorw("error-updating-device-state", log.Fields{"deviceID": device.Id, "error": er})
+		return er
 	}
 
 	//get the child device for the parent device
-	onuDevices, err := dh.coreProxy.GetChildDevices(nil, dh.device.Id)
+	onuDevices, err := dh.coreProxy.GetChildDevices(context.TODO(), dh.device.Id)
 	if err != nil {
-		log.Errorw("failed to get child devices information", log.Fields{"deviceId": dh.device.Id, "error": err})
+		log.Errorw("failed to get child devices information", log.Fields{"deviceID": dh.device.Id, "error": err})
 		return err
 	}
 	for _, onuDevice := range onuDevices.Items {
@@ -348,10 +361,15 @@
 		// Update onu state as down in onu adapter
 		onuInd := oop.OnuIndication{}
 		onuInd.OperState = "down"
-		dh.AdapterProxy.SendInterAdapterMessage(nil, &onuInd, ic.InterAdapterMessageType_ONU_IND_REQUEST, "openolt", onuDevice.Type, onuDevice.Id, onuDevice.ProxyAddress.DeviceId, "")
-
+		er := dh.AdapterProxy.SendInterAdapterMessage(context.TODO(), &onuInd, ic.InterAdapterMessageType_ONU_IND_REQUEST,
+			"openolt", onuDevice.Type, onuDevice.Id, onuDevice.ProxyAddress.DeviceId, "")
+		if er != nil {
+			log.Errorw("Failed to send inter-adapter-message", log.Fields{"OnuInd": onuInd,
+				"From Adapter": "openolt", "DevieType": onuDevice.Type, "DeviceID": onuDevice.Id})
+			return er
+		}
 	}
-	log.Debugw("do-state-down-end", log.Fields{"deviceId": device.Id})
+	log.Debugw("do-state-down-end", log.Fields{"deviceID": device.Id})
 	return nil
 }
 
@@ -360,7 +378,7 @@
 	var err error
 	dh.clientCon, err = grpc.Dial(dh.device.GetHostAndPort(), grpc.WithInsecure(), grpc.WithBlock())
 	if err != nil {
-		log.Errorw("Failed to dial device", log.Fields{"DeviceId": dh.deviceId, "HostAndPort": dh.device.GetHostAndPort(), "err": err})
+		log.Errorw("Failed to dial device", log.Fields{"DeviceId": dh.deviceID, "HostAndPort": dh.device.GetHostAndPort(), "err": err})
 		return err
 	}
 	return nil
@@ -380,7 +398,7 @@
 	// Case where OLT is disabled and then rebooted.
 	if dh.adminState == "down" {
 		log.Debugln("do-state-connected--device-admin-state-down")
-		device, err := dh.coreProxy.GetDevice(nil, dh.device.Id, dh.device.Id)
+		device, err := dh.coreProxy.GetDevice(context.TODO(), dh.device.Id, dh.device.Id)
 		if err != nil || device == nil {
 			/*TODO: needs to handle error scenarios */
 			log.Errorw("Failed to fetch device device", log.Fields{"err": err})
@@ -390,8 +408,8 @@
 		cloned.ConnectStatus = voltha.ConnectStatus_REACHABLE
 		cloned.OperStatus = voltha.OperStatus_UNKNOWN
 		dh.device = cloned
-		if err := dh.coreProxy.DeviceStateUpdate(nil, cloned.Id, cloned.ConnectStatus, cloned.OperStatus); err != nil {
-			log.Errorw("error-updating-device-state", log.Fields{"deviceId": dh.device.Id, "error": err})
+		if er := dh.coreProxy.DeviceStateUpdate(context.TODO(), cloned.Id, cloned.ConnectStatus, cloned.OperStatus); er != nil {
+			log.Errorw("error-updating-device-state", log.Fields{"deviceID": dh.device.Id, "error": er})
 		}
 
 		// Since the device was disabled before the OLT was rebooted, enfore the OLT to be Disabled after re-connection.
@@ -412,7 +430,7 @@
 	}
 	if deviceInfo == nil {
 		log.Errorw("Device info is nil", log.Fields{})
-		return errors.New("Failed to get device info from OLT")
+		return errors.New("failed to get device info from OLT")
 	}
 	log.Debugw("Fetched device info", log.Fields{"deviceInfo": deviceInfo})
 	dh.device.Root = true
@@ -425,33 +443,34 @@
 	dh.device.MacAddress = "0a:0b:0c:0d:0e:0f"
 
 	// Synchronous call to update device - this method is run in its own go routine
-	if err := dh.coreProxy.DeviceUpdate(nil, dh.device); err != nil {
-		log.Errorw("error-updating-device", log.Fields{"deviceId": dh.device.Id, "error": err})
+	if er := dh.coreProxy.DeviceUpdate(context.TODO(), dh.device); er != nil {
+		log.Errorw("error-updating-device", log.Fields{"deviceID": dh.device.Id, "error": er})
 	}
 
-	device, err := dh.coreProxy.GetDevice(nil, dh.device.Id, dh.device.Id)
+	device, err := dh.coreProxy.GetDevice(context.TODO(), dh.device.Id, dh.device.Id)
 	if err != nil || device == nil {
 		/*TODO: needs to handle error scenarios */
 		log.Errorw("Failed to fetch device device", log.Fields{"err": err})
+		return err
 	}
 	cloned := proto.Clone(device).(*voltha.Device)
 	// Update the all ports (if available) on that device to ACTIVE.
 	// The ports do not normally exist, unless the device is coming back from a reboot
-	if err := dh.coreProxy.PortsStateUpdate(nil, cloned.Id, voltha.OperStatus_ACTIVE); err != nil {
-		log.Errorw("updating-ports-failed", log.Fields{"deviceId": device.Id, "error": err})
+	if err := dh.coreProxy.PortsStateUpdate(context.TODO(), cloned.Id, voltha.OperStatus_ACTIVE); err != nil {
+		log.Errorw("updating-ports-failed", log.Fields{"deviceID": device.Id, "error": err})
 		return err
 	}
 
 	KVStoreHostPort := fmt.Sprintf("%s:%d", dh.openOLT.KVStoreHost, dh.openOLT.KVStorePort)
 	// Instantiate resource manager
-	if dh.resourceMgr = rsrcMgr.NewResourceMgr(dh.deviceId, KVStoreHostPort, dh.openOLT.KVStoreType, dh.deviceType, deviceInfo); dh.resourceMgr == nil {
+	if dh.resourceMgr = rsrcMgr.NewResourceMgr(dh.deviceID, KVStoreHostPort, dh.openOLT.KVStoreType, dh.deviceType, deviceInfo); dh.resourceMgr == nil {
 		log.Error("Error while instantiating resource manager")
-		return errors.New("Instantiating resource manager failed")
+		return errors.New("instantiating resource manager failed")
 	}
 	// Instantiate flow manager
 	if dh.flowMgr = NewFlowManager(dh, dh.resourceMgr); dh.flowMgr == nil {
 		log.Error("Error while instantiating flow manager")
-		return errors.New("Instantiating flow manager failed")
+		return errors.New("instantiating flow manager failed")
 	}
 	/* TODO: Instantiate Alarm , stats , BW managers */
 
@@ -460,14 +479,14 @@
 	return nil
 }
 
-// AdoptDevice adopts the OLT device
+//AdoptDevice adopts the OLT device
 func (dh *DeviceHandler) AdoptDevice(device *voltha.Device) {
 	dh.transitionMap = NewTransitionMap(dh)
-	log.Infow("AdoptDevice", log.Fields{"deviceId": device.Id, "Address": device.GetHostAndPort()})
+	log.Infow("Adopt_device", log.Fields{"deviceID": device.Id, "Address": device.GetHostAndPort()})
 	dh.transitionMap.Handle(DeviceInit)
 }
 
-// GetOfpDeviceInfo Get the Ofp device information
+//GetOfpDeviceInfo Gets the Ofp information of the given device
 func (dh *DeviceHandler) GetOfpDeviceInfo(device *voltha.Device) (*ic.SwitchCapability, error) {
 	return &ic.SwitchCapability{
 		Desc: &of.OfpDesc{
@@ -487,18 +506,18 @@
 	}, nil
 }
 
-// GetOfpPortInfo Get Ofp port information
+//GetOfpPortInfo Get Ofp port information
 func (dh *DeviceHandler) GetOfpPortInfo(device *voltha.Device, portNo int64) (*ic.PortCapability, error) {
-	cap := uint32(of.OfpPortFeatures_OFPPF_1GB_FD | of.OfpPortFeatures_OFPPF_FIBER)
+	capacity := uint32(of.OfpPortFeatures_OFPPF_1GB_FD | of.OfpPortFeatures_OFPPF_FIBER)
 	return &ic.PortCapability{
 		Port: &voltha.LogicalPort{
 			OfpPort: &of.OfpPort{
 				HwAddr:     macAddressToUint32Array(dh.device.MacAddress),
 				Config:     0,
 				State:      uint32(of.OfpPortState_OFPPS_LIVE),
-				Curr:       cap,
-				Advertised: cap,
-				Peer:       cap,
+				Curr:       capacity,
+				Advertised: capacity,
+				Peer:       capacity,
 				CurrSpeed:  uint32(of.OfpPortFeatures_OFPPF_1GB_FD),
 				MaxSpeed:   uint32(of.OfpPortFeatures_OFPPF_1GB_FD),
 			},
@@ -509,58 +528,60 @@
 }
 
 func (dh *DeviceHandler) omciIndication(omciInd *oop.OmciIndication) error {
-	log.Debugw("omci indication", log.Fields{"intfId": omciInd.IntfId, "onuId": omciInd.OnuId})
+	log.Debugw("omci indication", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId})
 	var deviceType string
-	var deviceId string
-	var proxyDeviceId string
+	var deviceID string
+	var proxyDeviceID string
 
 	onuKey := dh.formOnuKey(omciInd.IntfId, omciInd.OnuId)
 	if onuInCache, ok := dh.onus[onuKey]; !ok {
-		log.Debugw("omci indication for a device not in cache.", log.Fields{"intfId": omciInd.IntfId, "onuId": omciInd.OnuId})
-		ponPort := IntfIdToPortNo(omciInd.GetIntfId(), voltha.Port_PON_OLT)
+		log.Debugw("omci indication for a device not in cache.", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId})
+		ponPort := IntfIDToPortNo(omciInd.GetIntfId(), voltha.Port_PON_OLT)
 		kwargs := make(map[string]interface{})
 		kwargs["onu_id"] = omciInd.OnuId
 		kwargs["parent_port_no"] = ponPort
 
-		if onuDevice, err := dh.coreProxy.GetChildDevice(nil, dh.device.Id, kwargs); err != nil {
-			log.Errorw("onu not found", log.Fields{"intfId": omciInd.IntfId, "onuId": omciInd.OnuId})
+		onuDevice, err := dh.coreProxy.GetChildDevice(context.TODO(), dh.device.Id, kwargs)
+		if err != nil {
+			log.Errorw("onu not found", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId})
 			return err
-		} else {
-			deviceType = onuDevice.Type
-			deviceId = onuDevice.Id
-			proxyDeviceId = onuDevice.ProxyAddress.DeviceId
-			//if not exist in cache, then add to cache.
-			dh.onus[onuKey] = NewOnuDevice(deviceId, deviceType, onuDevice.SerialNumber, omciInd.OnuId, omciInd.IntfId, proxyDeviceId)
 		}
+		deviceType = onuDevice.Type
+		deviceID = onuDevice.Id
+		proxyDeviceID = onuDevice.ProxyAddress.DeviceId
+		//if not exist in cache, then add to cache.
+		dh.onus[onuKey] = NewOnuDevice(deviceID, deviceType, onuDevice.SerialNumber, omciInd.OnuId, omciInd.IntfId, proxyDeviceID)
 	} else {
 		//found in cache
-		log.Debugw("omci indication for a device in cache.", log.Fields{"intfId": omciInd.IntfId, "onuId": omciInd.OnuId})
+		log.Debugw("omci indication for a device in cache.", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId})
 		deviceType = onuInCache.deviceType
-		deviceId = onuInCache.deviceId
-		proxyDeviceId = onuInCache.proxyDeviceId
+		deviceID = onuInCache.deviceID
+		proxyDeviceID = onuInCache.proxyDeviceID
 	}
 
 	omciMsg := &ic.InterAdapterOmciMessage{Message: omciInd.Pkt}
 	if sendErr := dh.AdapterProxy.SendInterAdapterMessage(context.Background(), omciMsg,
 		ic.InterAdapterMessageType_OMCI_REQUEST, dh.deviceType, deviceType,
-		deviceId, proxyDeviceId, ""); sendErr != nil {
-		log.Errorw("send omci request error", log.Fields{"fromAdapter": dh.deviceType, "toAdapter": deviceType, "onuId": deviceId, "proxyDeviceId": proxyDeviceId})
+		deviceID, proxyDeviceID, ""); sendErr != nil {
+		log.Errorw("send omci request error", log.Fields{"fromAdapter": dh.deviceType, "toAdapter": deviceType, "onuID": deviceID, "proxyDeviceID": proxyDeviceID})
 		return sendErr
 	}
 	return nil
 }
 
-// Process_inter_adapter_message process inter adater message
-func (dh *DeviceHandler) Process_inter_adapter_message(msg *ic.InterAdapterMessage) error {
-	log.Debugw("Process_inter_adapter_message", log.Fields{"msgId": msg.Header.Id})
+//ProcessInterAdapterMessage sends the proxied messages to the target device
+// If the proxy address is not found in the unmarshalled message, it first fetches the onu device for which the message
+// is meant, and then send the unmarshalled omci message to this onu
+func (dh *DeviceHandler) ProcessInterAdapterMessage(msg *ic.InterAdapterMessage) error {
+	log.Debugw("Process_inter_adapter_message", log.Fields{"msgID": msg.Header.Id})
 	if msg.Header.Type == ic.InterAdapterMessageType_OMCI_REQUEST {
-		msgId := msg.Header.Id
+		msgID := msg.Header.Id
 		fromTopic := msg.Header.FromTopic
 		toTopic := msg.Header.ToTopic
-		toDeviceId := msg.Header.ToDeviceId
-		proxyDeviceId := msg.Header.ProxyDeviceId
+		toDeviceID := msg.Header.ToDeviceId
+		proxyDeviceID := msg.Header.ProxyDeviceId
 
-		log.Debugw("omci request message header", log.Fields{"msgId": msgId, "fromTopic": fromTopic, "toTopic": toTopic, "toDeviceId": toDeviceId, "proxyDeviceId": proxyDeviceId})
+		log.Debugw("omci request message header", log.Fields{"msgID": msgID, "fromTopic": fromTopic, "toTopic": toTopic, "toDeviceID": toDeviceID, "proxyDeviceID": proxyDeviceID})
 
 		msgBody := msg.GetBody()
 
@@ -571,15 +592,16 @@
 		}
 
 		if omciMsg.GetProxyAddress() == nil {
-			if onuDevice, err := dh.coreProxy.GetDevice(nil, dh.device.Id, toDeviceId); err != nil {
-				log.Errorw("onu not found", log.Fields{"onuDeviceId": toDeviceId, "error": err})
+			onuDevice, err := dh.coreProxy.GetDevice(context.TODO(), dh.device.Id, toDeviceID)
+			if err != nil {
+				log.Errorw("onu not found", log.Fields{"onuDeviceId": toDeviceID, "error": err})
 				return err
-			} else {
-				log.Debugw("device retrieved from core", log.Fields{"msgId": msgId, "fromTopic": fromTopic, "toTopic": toTopic, "toDeviceId": toDeviceId, "proxyDeviceId": proxyDeviceId})
-				dh.sendProxiedMessage(onuDevice, omciMsg)
 			}
+			log.Debugw("device retrieved from core", log.Fields{"msgID": msgID, "fromTopic": fromTopic, "toTopic": toTopic, "toDeviceID": toDeviceID, "proxyDeviceID": proxyDeviceID})
+			dh.sendProxiedMessage(onuDevice, omciMsg)
+
 		} else {
-			log.Debugw("Proxy Address found in omci message", log.Fields{"msgId": msgId, "fromTopic": fromTopic, "toTopic": toTopic, "toDeviceId": toDeviceId, "proxyDeviceId": proxyDeviceId})
+			log.Debugw("Proxy Address found in omci message", log.Fields{"msgID": msgID, "fromTopic": fromTopic, "toTopic": toTopic, "toDeviceID": toDeviceID, "proxyDeviceID": proxyDeviceID})
 			dh.sendProxiedMessage(nil, omciMsg)
 		}
 
@@ -590,35 +612,39 @@
 }
 
 func (dh *DeviceHandler) sendProxiedMessage(onuDevice *voltha.Device, omciMsg *ic.InterAdapterOmciMessage) {
-	var intfId uint32
-	var onuId uint32
-	var status common.ConnectStatus_ConnectStatus
+	var intfID uint32
+	var onuID uint32
+	var connectStatus common.ConnectStatus_ConnectStatus
 	if onuDevice != nil {
-		intfId = onuDevice.ProxyAddress.GetChannelId()
-		onuId = onuDevice.ProxyAddress.GetOnuId()
-		status = onuDevice.ConnectStatus
+		intfID = onuDevice.ProxyAddress.GetChannelId()
+		onuID = onuDevice.ProxyAddress.GetOnuId()
+		connectStatus = onuDevice.ConnectStatus
 	} else {
-		intfId = omciMsg.GetProxyAddress().GetChannelId()
-		onuId = omciMsg.GetProxyAddress().GetOnuId()
-		status = omciMsg.GetConnectStatus()
+		intfID = omciMsg.GetProxyAddress().GetChannelId()
+		onuID = omciMsg.GetProxyAddress().GetOnuId()
+		connectStatus = omciMsg.GetConnectStatus()
 	}
-	if status != voltha.ConnectStatus_REACHABLE {
-		log.Debugw("ONU is not reachable, cannot send OMCI", log.Fields{"intfId": intfId, "onuId": onuId})
+	if connectStatus != voltha.ConnectStatus_REACHABLE {
+		log.Debugw("ONU is not reachable, cannot send OMCI", log.Fields{"intfID": intfID, "onuID": onuID})
 		return
 	}
 
-	omciMessage := &oop.OmciMsg{IntfId: intfId, OnuId: onuId, Pkt: omciMsg.Message}
+	omciMessage := &oop.OmciMsg{IntfId: intfID, OnuId: onuID, Pkt: omciMsg.Message}
 
-	dh.Client.OmciMsgOut(context.Background(), omciMessage)
-	log.Debugw("omci-message-sent", log.Fields{"intfId": intfId, "onuId": onuId, "omciMsg": string(omciMsg.GetMessage())})
+	_, err := dh.Client.OmciMsgOut(context.Background(), omciMessage)
+	if err != nil {
+		log.Errorw("unable to send omci-msg-out", log.Fields{"IntfID": intfID, "OnuID": onuID, "Msg": omciMessage})
+		return
+	}
+	log.Debugw("omci-message-sent", log.Fields{"intfID": intfID, "onuID": onuID, "omciMsg": string(omciMsg.GetMessage())})
 }
 
-func (dh *DeviceHandler) activateONU(intfId uint32, onuId int64, serialNum *oop.SerialNumber, serialNumber string) {
-	log.Debugw("activate-onu", log.Fields{"intfId": intfId, "onuId": onuId, "serialNum": serialNum, "serialNumber": serialNumber})
-	dh.flowMgr.UpdateOnuInfo(intfId, uint32(onuId), serialNumber)
+func (dh *DeviceHandler) activateONU(intfID uint32, onuID int64, serialNum *oop.SerialNumber, serialNumber string) {
+	log.Debugw("activate-onu", log.Fields{"intfID": intfID, "onuID": onuID, "serialNum": serialNum, "serialNumber": serialNumber})
+	dh.flowMgr.UpdateOnuInfo(intfID, uint32(onuID), serialNumber)
 	// TODO: need resource manager
 	var pir uint32 = 1000000
-	Onu := oop.Onu{IntfId: intfId, OnuId: uint32(onuId), SerialNumber: serialNum, Pir: pir}
+	Onu := oop.Onu{IntfId: intfID, OnuId: uint32(onuID), SerialNumber: serialNum, Pir: pir}
 	if _, err := dh.Client.ActivateOnu(context.Background(), &Onu); err != nil {
 		st, _ := status.FromError(err)
 		if st.Code() == codes.AlreadyExists {
@@ -631,9 +657,9 @@
 	}
 }
 
-func (dh *DeviceHandler) onuDiscIndication(onuDiscInd *oop.OnuDiscIndication, onuId uint32, sn string) error {
-	channelId := onuDiscInd.GetIntfId()
-	parentPortNo := IntfIdToPortNo(onuDiscInd.GetIntfId(), voltha.Port_PON_OLT)
+func (dh *DeviceHandler) onuDiscIndication(onuDiscInd *oop.OnuDiscIndication, onuID uint32, sn string) error {
+	channelID := onuDiscInd.GetIntfId()
+	parentPortNo := IntfIDToPortNo(onuDiscInd.GetIntfId(), voltha.Port_PON_OLT)
 	if _, ok := dh.discOnus[sn]; ok {
 		log.Debugw("onu-sn-is-already-being-processed", log.Fields{"sn": sn})
 		return nil
@@ -651,41 +677,49 @@
 	if sn != "" {
 		kwargs["serial_number"] = sn
 	}
-	kwargs["onu_id"] = onuId
+	kwargs["onu_id"] = onuID
 	kwargs["parent_port_no"] = parentPortNo
-	onuDevice, err := dh.coreProxy.GetChildDevice(nil, dh.device.Id, kwargs)
-	if onuDevice == nil {
-		if err := dh.coreProxy.ChildDeviceDetected(nil, dh.device.Id, int(parentPortNo), "brcm_openomci_onu", int(channelId), string(onuDiscInd.SerialNumber.GetVendorId()), sn, int64(onuId)); err != nil {
-			log.Errorw("Create onu error", log.Fields{"parent_id": dh.device.Id, "ponPort": onuDiscInd.GetIntfId(), "onuId": onuId, "sn": sn, "error": err})
-			return err
+	onuDevice, err := dh.coreProxy.GetChildDevice(context.TODO(), dh.device.Id, kwargs)
+	if onuDevice == nil || err != nil {
+		if er := dh.coreProxy.ChildDeviceDetected(context.TODO(), dh.device.Id, int(parentPortNo),
+			"brcm_openomci_onu", int(channelID),
+			string(onuDiscInd.SerialNumber.GetVendorId()), sn, int64(onuID)); er != nil {
+			log.Errorw("Create onu error",
+				log.Fields{"parent_id": dh.device.Id, "ponPort": onuDiscInd.GetIntfId(),
+					"onuID": onuID, "sn": sn, "error": er})
+			return er
 		}
 	}
-	onuDevice, err = dh.coreProxy.GetChildDevice(nil, dh.device.Id, kwargs)
+	onuDevice, err = dh.coreProxy.GetChildDevice(context.TODO(), dh.device.Id, kwargs)
 	if err != nil {
 		log.Errorw("failed to get ONU device information", log.Fields{"err": err})
 		return err
 	}
-	dh.coreProxy.DeviceStateUpdate(nil, onuDevice.Id, common.ConnectStatus_REACHABLE, common.OperStatus_DISCOVERED)
-	log.Debugw("onu-discovered-reachable", log.Fields{"deviceId": onuDevice.Id})
+	er := dh.coreProxy.DeviceStateUpdate(context.TODO(), onuDevice.Id, common.ConnectStatus_REACHABLE, common.OperStatus_DISCOVERED)
+	if er != nil {
+		log.Errorw("Unable to update device state", log.Fields{"DeviceID": onuDevice.Id})
+		return er
+	}
+	log.Debugw("onu-discovered-reachable", log.Fields{"deviceID": onuDevice.Id})
 
 	for i := 0; i < 10; i++ {
-		if onuDevice, _ := dh.coreProxy.GetChildDevice(nil, dh.device.Id, kwargs); onuDevice != nil {
-			dh.activateONU(onuDiscInd.IntfId, int64(onuId), onuDiscInd.SerialNumber, sn)
+		onuDevice, _ := dh.coreProxy.GetChildDevice(context.TODO(), dh.device.Id, kwargs)
+		if onuDevice != nil {
+			dh.activateONU(onuDiscInd.IntfId, int64(onuID), onuDiscInd.SerialNumber, sn)
 			return nil
-		} else {
-			time.Sleep(1 * time.Second)
-			log.Debugln("Sleep 1 seconds to active onu, retry times ", i+1)
 		}
+		time.Sleep(1 * time.Second)
+		log.Debugln("Sleep 1 seconds to active onu, retry times ", i+1)
 	}
-	log.Errorw("Cannot query onu, dont activate it.", log.Fields{"parent_id": dh.device.Id, "ponPort": onuDiscInd.GetIntfId(), "onuId": onuId, "sn": sn})
-	return errors.New("Failed to activate onu")
+	log.Errorw("Cannot query onu, dont activate it.", log.Fields{"parent_id": dh.device.Id, "ponPort": onuDiscInd.GetIntfId(), "onuID": onuID, "sn": sn})
+	return errors.New("failed to activate onu")
 }
 
 func (dh *DeviceHandler) onuIndication(onuInd *oop.OnuIndication) {
 	serialNumber := dh.stringifySerialNumber(onuInd.SerialNumber)
 
 	kwargs := make(map[string]interface{})
-	ponPort := IntfIdToPortNo(onuInd.GetIntfId(), voltha.Port_PON_OLT)
+	ponPort := IntfIDToPortNo(onuInd.GetIntfId(), voltha.Port_PON_OLT)
 
 	if serialNumber != "" {
 		kwargs["serial_number"] = serialNumber
@@ -693,9 +727,9 @@
 		kwargs["onu_id"] = onuInd.OnuId
 		kwargs["parent_port_no"] = ponPort
 	}
-	if onuDevice, _ := dh.coreProxy.GetChildDevice(nil, dh.device.Id, kwargs); onuDevice != nil {
+	if onuDevice, _ := dh.coreProxy.GetChildDevice(context.TODO(), dh.device.Id, kwargs); onuDevice != nil {
 		if onuDevice.ParentPortNo != ponPort {
-			//log.Warnw("ONU-is-on-a-different-intf-id-now", log.Fields{"previousIntfId": intfIdFromPortNo(onuDevice.ParentPortNo), "currentIntfId": onuInd.GetIntfId()})
+			//log.Warnw("ONU-is-on-a-different-intf-id-now", log.Fields{"previousIntfId": intfIDFromPortNo(onuDevice.ParentPortNo), "currentIntfId": onuInd.GetIntfId()})
 			log.Warnw("ONU-is-on-a-different-intf-id-now", log.Fields{"previousIntfId": onuDevice.ParentPortNo, "currentIntfId": ponPort})
 		}
 
@@ -704,66 +738,98 @@
 		}
 		onuKey := dh.formOnuKey(onuInd.GetIntfId(), onuInd.GetOnuId())
 		dh.onus[onuKey] = NewOnuDevice(onuDevice.Id, onuDevice.Type, onuDevice.SerialNumber, onuInd.GetOnuId(), onuInd.GetIntfId(), onuDevice.ProxyAddress.DeviceId)
+		dh.updateOnuAdminState(onuInd)
+		dh.updateOnuStates(onuDevice, onuInd)
 
-		// adminState
-		if onuInd.AdminState == "down" {
-			if onuInd.OperState != "down" {
-				log.Errorw("ONU-admin-state-down-and-oper-status-not-down", log.Fields{"operState": onuInd.OperState})
-				// Forcing the oper state change code to execute
-				onuInd.OperState = "down"
-			}
-			// Port and logical port update is taken care of by oper state block
-		} else if onuInd.AdminState == "up" {
-			log.Debugln("received-onu-admin-state up")
-		} else {
-			log.Errorw("Invalid-or-not-implemented-admin-state", log.Fields{"received-admin-state": onuInd.AdminState})
-		}
-		log.Debugln("admin-state-dealt-with")
-
-		// operState
-		if onuInd.OperState == "down" {
-			if onuDevice.ConnectStatus != common.ConnectStatus_UNREACHABLE {
-				dh.coreProxy.DeviceStateUpdate(nil, onuDevice.Id, common.ConnectStatus_UNREACHABLE, onuDevice.OperStatus)
-				log.Debugln("onu-oper-state-is-down")
-			}
-			if onuDevice.OperStatus != common.OperStatus_DISCOVERED {
-				dh.coreProxy.DeviceStateUpdate(nil, onuDevice.Id, common.ConnectStatus_UNREACHABLE, common.OperStatus_DISCOVERED)
-			}
-			log.Debugw("inter-adapter-send-onu-ind", log.Fields{"onuIndication": onuInd})
-
-			// TODO NEW CORE do not hardcode adapter name. Handler needs Adapter reference
-			dh.AdapterProxy.SendInterAdapterMessage(nil, onuInd, ic.InterAdapterMessageType_ONU_IND_REQUEST, "openolt", onuDevice.Type, onuDevice.Id, onuDevice.ProxyAddress.DeviceId, "")
-		} else if onuInd.OperState == "up" {
-			if onuDevice.ConnectStatus != common.ConnectStatus_REACHABLE {
-				dh.coreProxy.DeviceStateUpdate(nil, onuDevice.Id, common.ConnectStatus_REACHABLE, onuDevice.OperStatus)
-
-			}
-			if onuDevice.OperStatus != common.OperStatus_DISCOVERED {
-				log.Warnw("ignore onu indication", log.Fields{"intfId": onuInd.IntfId, "onuId": onuInd.OnuId, "operStatus": onuDevice.OperStatus, "msgOperStatus": onuInd.OperState})
-				return
-			}
-			dh.AdapterProxy.SendInterAdapterMessage(nil, onuInd, ic.InterAdapterMessageType_ONU_IND_REQUEST, "openolt", onuDevice.Type, onuDevice.Id, onuDevice.ProxyAddress.DeviceId, "")
-		} else {
-			log.Warnw("Not-implemented-or-invalid-value-of-oper-state", log.Fields{"operState": onuInd.OperState})
-		}
 	} else {
-		log.Errorw("onu not found", log.Fields{"intfId": onuInd.IntfId, "onuId": onuInd.OnuId})
+		log.Errorw("onu not found", log.Fields{"intfID": onuInd.IntfId, "onuID": onuInd.OnuId})
 		return
 	}
 
 }
 
+func (dh *DeviceHandler) updateOnuStates(onuDevice *voltha.Device, onuInd *oop.OnuIndication) {
+	onuKey := dh.formOnuKey(onuInd.GetIntfId(), onuInd.GetOnuId())
+	dh.onus[onuKey] = NewOnuDevice(onuDevice.Id, onuDevice.Type, onuDevice.SerialNumber, onuInd.GetOnuId(), onuInd.GetIntfId(), onuDevice.ProxyAddress.DeviceId)
+	dh.updateOnuAdminState(onuInd)
+	// operState
+	if onuInd.OperState == "down" {
+		if onuDevice.ConnectStatus != common.ConnectStatus_UNREACHABLE {
+			err := dh.coreProxy.DeviceStateUpdate(context.TODO(), onuDevice.Id, common.ConnectStatus_UNREACHABLE,
+				onuDevice.OperStatus)
+			if err != nil {
+				log.Errorw("unable to update onu state", log.Fields{"DeviceID": onuDevice.Id})
+				return
+			}
+			log.Debugln("onu-oper-state-is-down")
+		}
+		if onuDevice.OperStatus != common.OperStatus_DISCOVERED {
+			err := dh.coreProxy.DeviceStateUpdate(context.TODO(), onuDevice.Id, common.ConnectStatus_UNREACHABLE,
+				common.OperStatus_DISCOVERED)
+			if err != nil {
+				log.Errorw("unable to update onu state", log.Fields{"DeviceID": onuDevice.Id})
+				return
+			}
+		}
+		log.Debugw("inter-adapter-send-onu-ind", log.Fields{"onuIndication": onuInd})
+
+		// TODO NEW CORE do not hardcode adapter name. Handler needs Adapter reference
+		err := dh.AdapterProxy.SendInterAdapterMessage(context.TODO(), onuInd, ic.InterAdapterMessageType_ONU_IND_REQUEST,
+			"openolt", onuDevice.Type, onuDevice.Id, onuDevice.ProxyAddress.DeviceId, "")
+		if err != nil {
+			log.Errorw("Failed to send inter-adapter-message", log.Fields{"OnuInd": onuInd,
+				"From Adapter": "openolt", "DevieType": onuDevice.Type, "DeviceID": onuDevice.Id})
+		}
+	} else if onuInd.OperState == "up" {
+		if onuDevice.ConnectStatus != common.ConnectStatus_REACHABLE {
+			err := dh.coreProxy.DeviceStateUpdate(context.TODO(), onuDevice.Id, common.ConnectStatus_REACHABLE, onuDevice.OperStatus)
+			if err != nil {
+				log.Errorw("unable to update onu state", log.Fields{"DeviceID": onuDevice.Id})
+				return
+			}
+		}
+		if onuDevice.OperStatus != common.OperStatus_DISCOVERED {
+			log.Warnw("ignore onu indication", log.Fields{"intfID": onuInd.IntfId, "onuID": onuInd.OnuId, "operStatus": onuDevice.OperStatus, "msgOperStatus": onuInd.OperState})
+			return
+		}
+		err := dh.AdapterProxy.SendInterAdapterMessage(context.TODO(), onuInd, ic.InterAdapterMessageType_ONU_IND_REQUEST,
+			"openolt", onuDevice.Type, onuDevice.Id, onuDevice.ProxyAddress.DeviceId, "")
+		if err != nil {
+			log.Errorw("Failed to send inter-adapter-message", log.Fields{"OnuInd": onuInd,
+				"From Adapter": "openolt", "DevieType": onuDevice.Type, "DeviceID": onuDevice.Id})
+			return
+		}
+	} else {
+		log.Warnw("Not-implemented-or-invalid-value-of-oper-state", log.Fields{"operState": onuInd.OperState})
+	}
+}
+
+func (dh *DeviceHandler) updateOnuAdminState(onuInd *oop.OnuIndication) {
+	if onuInd.AdminState == "down" {
+		if onuInd.OperState != "down" {
+			log.Errorw("ONU-admin-state-down-and-oper-status-not-down", log.Fields{"operState": onuInd.OperState})
+			// Forcing the oper state change code to execute
+			onuInd.OperState = "down"
+		}
+		// Port and logical port update is taken care of by oper state block
+	} else if onuInd.AdminState == "up" {
+		log.Debugln("received-onu-admin-state up")
+	} else {
+		log.Errorw("Invalid-or-not-implemented-admin-state", log.Fields{"received-admin-state": onuInd.AdminState})
+	}
+	log.Debugln("admin-state-dealt-with")
+}
+
 func (dh *DeviceHandler) stringifySerialNumber(serialNum *oop.SerialNumber) string {
 	if serialNum != nil {
 		return string(serialNum.VendorId) + dh.stringifyVendorSpecific(serialNum.VendorSpecific)
-	} else {
-		return ""
 	}
+	return ""
 }
 
 func (dh *DeviceHandler) stringifyVendorSpecific(vendorSpecific []byte) string {
 	tmp := fmt.Sprintf("%x", (uint32(vendorSpecific[0])>>4)&0x0f) +
-		fmt.Sprintf("%x", (uint32(vendorSpecific[0]&0x0f))) +
+		fmt.Sprintf("%x", uint32(vendorSpecific[0]&0x0f)) +
 		fmt.Sprintf("%x", (uint32(vendorSpecific[1])>>4)&0x0f) +
 		fmt.Sprintf("%x", (uint32(vendorSpecific[1]))&0x0f) +
 		fmt.Sprintf("%x", (uint32(vendorSpecific[2])>>4)&0x0f) +
@@ -773,35 +839,41 @@
 	return tmp
 }
 
-// flows
-func (dh *DeviceHandler) Update_flows_bulk() error {
-	return errors.New("UnImplemented")
+//UpdateFlowsBulk upates the bulk flow
+func (dh *DeviceHandler) UpdateFlowsBulk() error {
+	return errors.New("unimplemented")
 }
-func (dh *DeviceHandler) GetChildDevice(parentPort uint32, onuId uint32) *voltha.Device {
-	log.Debugw("GetChildDevice", log.Fields{"pon port": parentPort, "onuId": onuId})
+
+//GetChildDevice returns the child device for given parent port and onu id
+func (dh *DeviceHandler) GetChildDevice(parentPort, onuID uint32) *voltha.Device {
+	log.Debugw("GetChildDevice", log.Fields{"pon port": parentPort, "onuID": onuID})
 	kwargs := make(map[string]interface{})
-	kwargs["onu_id"] = onuId
+	kwargs["onu_id"] = onuID
 	kwargs["parent_port_no"] = parentPort
-	onuDevice, err := dh.coreProxy.GetChildDevice(nil, dh.device.Id, kwargs)
+	onuDevice, err := dh.coreProxy.GetChildDevice(context.TODO(), dh.device.Id, kwargs)
 	if err != nil {
-		log.Errorw("onu not found", log.Fields{"intfId": parentPort, "onuId": onuId})
+		log.Errorw("onu not found", log.Fields{"intfID": parentPort, "onuID": onuID})
 		return nil
 	}
 	log.Debugw("Successfully received child device from core", log.Fields{"child_device": *onuDevice})
 	return onuDevice
 }
 
+// SendPacketInToCore sends packet-in to core
+// For this, it calls SendPacketIn of the core-proxy which uses a device specific topic to send the request.
+// The adapter handling the device creates a device specific topic
 func (dh *DeviceHandler) SendPacketInToCore(logicalPort uint32, packetPayload []byte) {
 	log.Debugw("SendPacketInToCore", log.Fields{"port": logicalPort, "packetPayload": packetPayload})
-	if err := dh.coreProxy.SendPacketIn(nil, dh.device.Id, logicalPort, packetPayload); err != nil {
+	if err := dh.coreProxy.SendPacketIn(context.TODO(), dh.device.Id, logicalPort, packetPayload); err != nil {
 		log.Errorw("Error sending packetin to core", log.Fields{"error": err})
 		return
 	}
 	log.Debug("Sent packet-in to core successfully")
 }
 
+//UpdateFlowsIncrementally updates the device flow
 func (dh *DeviceHandler) UpdateFlowsIncrementally(device *voltha.Device, flows *of.FlowChanges, groups *of.FlowGroupChanges) error {
-	log.Debugw("In UpdateFlowsIncrementally", log.Fields{"deviceId": device.Id, "flows": flows, "groups": groups})
+	log.Debugw("In Update_flows_incrementally", log.Fields{"deviceID": device.Id, "flows": flows, "groups": groups})
 	if flows != nil {
 		for _, flow := range flows.ToAdd.Items {
 			log.Debug("Adding flow", log.Fields{"deviceId": device.Id, "flowToAdd": flow})
@@ -812,15 +884,20 @@
 			dh.flowMgr.RemoveFlow(flow)
 		}
 	}
-	if groups != nil {
+	if groups != nil && flows != nil {
 		for _, flow := range flows.ToRemove.Items {
-			log.Debug("Removing flow", log.Fields{"deviceId": device.Id, "flowToRemove": flow})
+			log.Debug("Removing flow", log.Fields{"deviceID": device.Id, "flowToRemove": flow})
 			//  dh.flowMgr.RemoveFlow(flow)
 		}
 	}
 	return nil
 }
 
+//DisableDevice disables the given device
+//It marks the following for the given device:
+//Device-Handler Admin-State : down
+//Device Port-State: UNKNOWN
+//Device Oper-State: UNKNOWN
 func (dh *DeviceHandler) DisableDevice(device *voltha.Device) error {
 	if _, err := dh.Client.DisableOlt(context.Background(), new(oop.Empty)); err != nil {
 		log.Errorw("Failed to disable olt ", log.Fields{"err": err})
@@ -833,8 +910,8 @@
 
 	cloned := proto.Clone(device).(*voltha.Device)
 	// Update the all ports state on that device to disable
-	if err := dh.coreProxy.PortsStateUpdate(nil, cloned.Id, voltha.OperStatus_UNKNOWN); err != nil {
-		log.Errorw("updating-ports-failed", log.Fields{"deviceId": device.Id, "error": err})
+	if err := dh.coreProxy.PortsStateUpdate(context.TODO(), cloned.Id, voltha.OperStatus_UNKNOWN); err != nil {
+		log.Errorw("updating-ports-failed", log.Fields{"deviceID": device.Id, "error": err})
 		return err
 	}
 
@@ -842,14 +919,19 @@
 	cloned.OperStatus = voltha.OperStatus_UNKNOWN
 	dh.device = cloned
 
-	if err := dh.coreProxy.DeviceStateUpdate(nil, cloned.Id, cloned.ConnectStatus, cloned.OperStatus); err != nil {
-		log.Errorw("error-updating-device-state", log.Fields{"deviceId": device.Id, "error": err})
+	if err := dh.coreProxy.DeviceStateUpdate(context.TODO(), cloned.Id, cloned.ConnectStatus, cloned.OperStatus); err != nil {
+		log.Errorw("error-updating-device-state", log.Fields{"deviceID": device.Id, "error": err})
 		return err
 	}
-	log.Debugw("DisableDevice-end", log.Fields{"deviceId": device.Id})
+	log.Debugw("Disable_device-end", log.Fields{"deviceID": device.Id})
 	return nil
 }
 
+//ReenableDevice re-enables the olt device after disable
+//It marks the following for the given device:
+//Device-Handler Admin-State : up
+//Device Port-State: ACTIVE
+//Device Oper-State: ACTIVE
 func (dh *DeviceHandler) ReenableDevice(device *voltha.Device) error {
 	if _, err := dh.Client.ReenableOlt(context.Background(), new(oop.Empty)); err != nil {
 		log.Errorw("Failed to reenable olt ", log.Fields{"err": err})
@@ -863,8 +945,8 @@
 
 	cloned := proto.Clone(device).(*voltha.Device)
 	// Update the all ports state on that device to enable
-	if err := dh.coreProxy.PortsStateUpdate(nil, cloned.Id, voltha.OperStatus_ACTIVE); err != nil {
-		log.Errorw("updating-ports-failed", log.Fields{"deviceId": device.Id, "error": err})
+	if err := dh.coreProxy.PortsStateUpdate(context.TODO(), cloned.Id, voltha.OperStatus_ACTIVE); err != nil {
+		log.Errorw("updating-ports-failed", log.Fields{"deviceID": device.Id, "error": err})
 		return err
 	}
 
@@ -872,22 +954,23 @@
 	cloned.OperStatus = voltha.OperStatus_ACTIVE
 	dh.device = cloned
 
-	if err := dh.coreProxy.DeviceStateUpdate(nil, cloned.Id, cloned.ConnectStatus, cloned.OperStatus); err != nil {
-		log.Errorw("error-updating-device-state", log.Fields{"deviceId": device.Id, "error": err})
+	if err := dh.coreProxy.DeviceStateUpdate(context.TODO(), cloned.Id, cloned.ConnectStatus, cloned.OperStatus); err != nil {
+		log.Errorw("error-updating-device-state", log.Fields{"deviceID": device.Id, "error": err})
 		return err
 	}
-	log.Debugw("ReEnableDevice-end", log.Fields{"deviceId": device.Id})
+	log.Debugw("ReEnableDevice-end", log.Fields{"deviceID": device.Id})
 
 	return nil
 }
 
+//RebootDevice reboots the given device
 func (dh *DeviceHandler) RebootDevice(device *voltha.Device) error {
 	if _, err := dh.Client.Reboot(context.Background(), new(oop.Empty)); err != nil {
 		log.Errorw("Failed to reboot olt ", log.Fields{"err": err})
 		return err
 	}
 
-	log.Debugw("rebooted-device-successfully", log.Fields{"deviceId": device.Id})
+	log.Debugw("rebooted-device-successfully", log.Fields{"deviceID": device.Id})
 
 	return nil
 }
@@ -900,15 +983,16 @@
 		return
 	}
 	log.Debugw("sending packet-in to core", log.Fields{"logicalPortNum": logicalPortNum, "packet": *packetIn})
-	if err := dh.coreProxy.SendPacketIn(nil, dh.device.Id, logicalPortNum, packetIn.Pkt); err != nil {
+	if err := dh.coreProxy.SendPacketIn(context.TODO(), dh.device.Id, logicalPortNum, packetIn.Pkt); err != nil {
 		log.Errorw("Error sending packet-in to core", log.Fields{"error": err})
 		return
 	}
 	log.Debug("Success sending packet-in to core!")
 }
 
-func (dh *DeviceHandler) PacketOut(egress_port_no int, packet *of.OfpPacketOut) error {
-	log.Debugw("PacketOut", log.Fields{"deviceId": dh.deviceId, "egress_port_no": egress_port_no, "pkt-length": len(packet.Data)})
+// PacketOut sends packet-out from VOLTHA to OLT on the egress port provided
+func (dh *DeviceHandler) PacketOut(egressPortNo int, packet *of.OfpPacketOut) error {
+	log.Debugw("PacketOut", log.Fields{"deviceID": dh.deviceID, "egress_port_no": egressPortNo, "pkt-length": len(packet.Data)})
 	var etherFrame ethernet.Frame
 	err := (&etherFrame).UnmarshalBinary(packet.Data)
 	if err != nil {
@@ -916,7 +1000,7 @@
 		return err
 	}
 	log.Debugw("Ethernet Frame", log.Fields{"Frame": etherFrame})
-	egressPortType := IntfIdToPortTypeName(uint32(egress_port_no))
+	egressPortType := IntfIDToPortTypeName(uint32(egressPortNo))
 	if egressPortType == voltha.Port_ETHERNET_UNI {
 		if etherFrame.VLAN != nil { // If double tag, remove the outer tag
 			nextEthType := (uint16(packet.Data[16]) << 8) | uint16(packet.Data[17])
@@ -934,35 +1018,34 @@
 				log.Debug("Double tagged packet , removed outer vlan", log.Fields{"New frame": etherFrame})
 			}
 		}
-		intfId := IntfIdFromUniPortNum(uint32(egress_port_no))
-		onuId := OnuIdFromPortNum(uint32(egress_port_no))
-		uniId := UniIdFromPortNum(uint32(egress_port_no))
-		/*gemPortId, err := dh.flowMgr.GetPacketOutGemPortId(intfId, onuId, uint32(egress_port_no))
+		intfID := IntfIDFromUniPortNum(uint32(egressPortNo))
+		onuID := OnuIDFromPortNum(uint32(egressPortNo))
+		uniID := UniIDFromPortNum(uint32(egressPortNo))
+		/*gemPortId, err := dh.flowMgr.GetPacketOutGemPortId(intfID, onuID, uint32(egress_port_no))
 		  if err != nil{
 		      log.Errorw("Error while getting gemport to packet-out",log.Fields{"error": err})
 		      return err
 		  }*/
-		onuPkt := oop.OnuPacket{IntfId: intfId, OnuId: onuId, PortNo: uint32(egress_port_no), Pkt: packet.Data}
-		log.Debug("sending-packet-to-ONU", log.Fields{"egress_port_no": egress_port_no, "IntfId": intfId, "onuId": onuId,
-			"uniId": uniId, "packet": packet.Data})
+		onuPkt := oop.OnuPacket{IntfId: intfID, OnuId: onuID, PortNo: uint32(egressPortNo), Pkt: packet.Data}
+		log.Debug("sending-packet-to-ONU", log.Fields{"egress_port_no": egressPortNo, "IntfId": intfID, "onuID": onuID,
+			"uniID": uniID, "packet": packet.Data})
 		if _, err := dh.Client.OnuPacketOut(context.Background(), &onuPkt); err != nil {
 			log.Errorw("Error while sending packet-out to ONU", log.Fields{"error": err})
 			return err
 		}
 	} else if egressPortType == voltha.Port_ETHERNET_NNI {
-		uplinkPkt := oop.UplinkPacket{IntfId: IntfIdFromNniPortNum(uint32(egress_port_no)), Pkt: packet.Data}
+		uplinkPkt := oop.UplinkPacket{IntfId: IntfIDFromNniPortNum(uint32(egressPortNo)), Pkt: packet.Data}
 		log.Debug("sending-packet-to-uplink", log.Fields{"uplink_pkt": uplinkPkt})
 		if _, err := dh.Client.UplinkPacketOut(context.Background(), &uplinkPkt); err != nil {
 			log.Errorw("Error while sending packet-out to uplink", log.Fields{"error": err})
 			return err
 		}
 	} else {
-		log.Warnw("Packet-out-to-this-interface-type-not-implemented", log.Fields{"egress_port_no": egress_port_no, "egressPortType": egressPortType})
+		log.Warnw("Packet-out-to-this-interface-type-not-implemented", log.Fields{"egress_port_no": egressPortNo, "egressPortType": egressPortType})
 	}
 	return nil
 }
 
-func (dh *DeviceHandler) formOnuKey(intfId uint32, onuId uint32) string {
-	return ("" + strconv.Itoa(int(intfId)) + "." + strconv.Itoa(int(onuId)))
-
+func (dh *DeviceHandler) formOnuKey(intfID, onuID uint32) string {
+	return "" + strconv.Itoa(int(intfID)) + "." + strconv.Itoa(int(onuID))
 }
diff --git a/adaptercore/olt_platform.go b/adaptercore/olt_platform.go
index 648db1d..7f457dc 100644
--- a/adaptercore/olt_platform.go
+++ b/adaptercore/olt_platform.go
@@ -13,13 +13,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+//Package adaptercore provides the utility for olt devices, flows and statistics
 package adaptercore
 
 import (
 	"errors"
 	"github.com/opencord/voltha-go/rw_core/utils"
 	ofp "github.com/opencord/voltha-protos/go/openflow_13"
-	voltha "github.com/opencord/voltha-protos/go/voltha"
+	"github.com/opencord/voltha-protos/go/voltha"
 )
 
 /*=====================================================================
@@ -78,89 +80,84 @@
     +--------+------------------------~~~------+
 */
 
-var MAX_ONUS_PER_PON = 32
-var MIN_UPSTREAM_PORT_ID = 0xfffd
-var MAX_UPSTREAM_PORT_ID = 0xfffffffd
+//MaxOnusPerPon value
+var MaxOnusPerPon = 32
 
-var controllerPorts []uint32 = []uint32{0xfffd, 0x7ffffffd, 0xfffffffd}
+//MinUpstreamPortID value
+var MinUpstreamPortID = 0xfffd
 
-func MkUniPortNum(intfId uint32, onuId uint32, uniId uint32) uint32 {
+//MaxUpstreamPortID value
+var MaxUpstreamPortID = 0xfffffffd
+
+var controllerPorts = []uint32{0xfffd, 0x7ffffffd, 0xfffffffd}
+
+//MkUniPortNum returns new UNIportNum based on intfID, inuID and uniID
+func MkUniPortNum(intfID, onuID, uniID uint32) uint32 {
 	/* TODO: Add checks */
-	return ((intfId << 11) | (onuId << 4) | uniId)
+	return (intfID << 11) | (onuID << 4) | uniID
 }
 
-func MkFlowId(intfId uint32, onuId uint32, idx uint32) uint32 {
-	return (((intfId << 9) | (onuId << 4)) | idx)
+//OnuIDFromPortNum returns ONUID derived from portNumber
+func OnuIDFromPortNum(portNum uint32) uint32 {
+	return (portNum >> 4) & 127
 }
 
-func OnuIdFromPortNum(portNum uint32) uint32 {
-	return ((portNum >> 4) & 127)
+//IntfIDFromUniPortNum returns IntfID derived from portNum
+func IntfIDFromUniPortNum(portNum uint32) uint32 {
+	return (portNum >> 11) & 15
 }
 
-func IntfIdFromUniPortNum(portNum uint32) uint32 {
-	return ((portNum >> 11) & 15)
+//UniIDFromPortNum return UniID derived from portNum
+func UniIDFromPortNum(portNum uint32) uint32 {
+	return (portNum) & 0xF
 }
 
-func UniIdFromPortNum(portNum uint32) uint32 {
-	return ((portNum) & 0xF)
-}
-
-func IntfIdFromPonPortNo(portNo uint32) uint32 {
-	return (portNo & 15)
-}
-
-func IntfIdToPortNo(intfId uint32, intfType voltha.Port_PortType) uint32 {
+//IntfIDToPortNo returns portId derived from intftype, intfId and portType
+func IntfIDToPortNo(intfID uint32, intfType voltha.Port_PortType) uint32 {
 	if (intfType) == voltha.Port_ETHERNET_NNI {
-		return ((1 << 16) | intfId)
-	} else {
-		if (intfType) == voltha.Port_PON_OLT {
-			return ((2 << 28) | intfId)
-		} else {
-			return 0
-		}
+		return (1 << 16) | intfID
 	}
+	if (intfType) == voltha.Port_PON_OLT {
+		return (2 << 28) | intfID
+	}
+	return 0
 }
 
-func IntfIdFromNniPortNum(portNum uint32) uint32 {
-	return (portNum & 0xFFFF)
+//IntfIDFromNniPortNum returns Intf ID derived from portNum
+func IntfIDFromNniPortNum(portNum uint32) uint32 {
+	return portNum & 0xFFFF
 }
 
-func IntfIdToPortTypeName(intfId uint32) voltha.Port_PortType {
-	if ((2 << 28) ^ intfId) < 16 {
+//IntfIDToPortTypeName returns port type derived from the intfId
+func IntfIDToPortTypeName(intfID uint32) voltha.Port_PortType {
+	if ((2 << 28) ^ intfID) < 16 {
 		return voltha.Port_PON_OLT
-	} else {
-		if (intfId & (1 << 16)) == (1 << 16) {
-			return voltha.Port_ETHERNET_NNI
-		} else {
-			return voltha.Port_ETHERNET_UNI
-		}
 	}
+	if (intfID & (1 << 16)) == (1 << 16) {
+		return voltha.Port_ETHERNET_NNI
+	}
+	return voltha.Port_ETHERNET_UNI
 }
 
-func PortTypeNameByPortIndex(portIndex int32) string {
-	return voltha.Port_PortType_name[portIndex]
-}
-
-func ExtractAccessFromFlow(inPort uint32, outPort uint32) (uint32, uint32, uint32, uint32) {
+//ExtractAccessFromFlow returns AccessDevice information
+func ExtractAccessFromFlow(inPort, outPort uint32) (uint32, uint32, uint32, uint32) {
 	if IsUpstream(outPort) {
-		return inPort, IntfIdFromUniPortNum(inPort), OnuIdFromPortNum(inPort), UniIdFromPortNum(inPort)
-	} else {
-		return outPort, IntfIdFromUniPortNum(outPort), OnuIdFromPortNum(outPort), UniIdFromPortNum(outPort)
+		return inPort, IntfIDFromUniPortNum(inPort), OnuIDFromPortNum(inPort), UniIDFromPortNum(inPort)
 	}
+	return outPort, IntfIDFromUniPortNum(outPort), OnuIDFromPortNum(outPort), UniIDFromPortNum(outPort)
 }
 
+//IsUpstream returns true for Upstream and false for downstream
 func IsUpstream(outPort uint32) bool {
 	for _, port := range controllerPorts {
 		if port == outPort {
 			return true
 		}
 	}
-	if (outPort & (1 << 16)) == (1 << 16) {
-		return true
-	}
-	return false
+	return (outPort & (1 << 16)) == (1 << 16)
 }
 
+//IsControllerBoundFlow returns true/false
 func IsControllerBoundFlow(outPort uint32) bool {
 	for _, port := range controllerPorts {
 		if port == outPort {
@@ -170,15 +167,17 @@
 	return false
 }
 
-func OnuIdFromUniPortNum(portNum uint32) uint32 {
+//OnuIDFromUniPortNum returns onuId from give portNum information.
+func OnuIDFromUniPortNum(portNum uint32) uint32 {
 	return (portNum >> 4) & 0x7F
 }
 
+//FlowExtractInfo fetches uniport from the flow, based on which it gets and returns ponInf, onuID and uniID
 func FlowExtractInfo(flow *ofp.OfpFlowStats, flowDirection string) (uint32, uint32, uint32, error) {
-	var uniPortNo uint32 = 0
-	var ponIntf uint32 = 0
-	var onuId uint32 = 0
-	var uniId uint32 = 0
+	var uniPortNo uint32
+	var ponIntf uint32
+	var onuID uint32
+	var uniID uint32
 
 	if flowDirection == "upstream" {
 		if uniPortNo = utils.GetChildPortFromTunnelId(flow); uniPortNo == 0 {
@@ -203,12 +202,12 @@
 	}
 
 	if uniPortNo == 0 {
-		return 0, 0, 0, errors.New("Failed to extract Pon Interface, ONU Id and Uni Id from flow")
+		return 0, 0, 0, errors.New("failed to extract Pon Interface, ONU Id and Uni Id from flow")
 	}
 
-	ponIntf = IntfIdFromUniPortNum(uniPortNo)
-	onuId = OnuIdFromUniPortNum(uniPortNo)
-	uniId = UniIdFromPortNum(uniPortNo)
+	ponIntf = IntfIDFromUniPortNum(uniPortNo)
+	onuID = OnuIDFromUniPortNum(uniPortNo)
+	uniID = UniIDFromPortNum(uniPortNo)
 
-	return ponIntf, onuId, uniId, nil
+	return ponIntf, onuID, uniID, nil
 }
diff --git a/adaptercore/olt_state_transitions.go b/adaptercore/olt_state_transitions.go
index 1cd71f0..bd410d3 100644
--- a/adaptercore/olt_state_transitions.go
+++ b/adaptercore/olt_state_transitions.go
@@ -13,6 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+//Package adaptercore provides the utility for olt devices, flows and statistics
 package adaptercore
 
 import (
@@ -141,7 +143,7 @@
 }
 
 // Handle moves the state machine to next state based on the trigger and invokes the before and
-//         after handlers
+// after handlers if the transition is a valid transition
 func (tMap *TransitionMap) Handle(trigger Trigger) {
 
 	// Check whether the transtion is valid from current state
@@ -152,17 +154,17 @@
 
 	// Invoke the before handlers
 	beforeHandlers := tMap.transitions[trigger].before
-	if beforeHandlers != nil {
-		for _, handler := range beforeHandlers {
-			log.Debugw("running-before-handler", log.Fields{"handler": funcName(handler)})
-			if err := handler(); err != nil {
-				// TODO handle error
-				return
-			}
-		}
-	} else {
+	if beforeHandlers == nil {
 		log.Debugw("No handlers for before", log.Fields{"trigger": trigger})
 	}
+	for _, handler := range beforeHandlers {
+		log.Debugw("running-before-handler", log.Fields{"handler": funcName(handler)})
+		if err := handler(); err != nil {
+			// TODO handle error
+			log.Error(err)
+			return
+		}
+	}
 
 	// Update the state
 	tMap.currentDeviceState = tMap.transitions[trigger].currentState
@@ -170,15 +172,15 @@
 
 	// Invoke the after handlers
 	afterHandlers := tMap.transitions[trigger].after
-	if afterHandlers != nil {
-		for _, handler := range afterHandlers {
-			log.Debugw("running-after-handler", log.Fields{"handler": funcName(handler)})
-			if err := handler(); err != nil {
-				// TODO handle error
-				return
-			}
-		}
-	} else {
+	if afterHandlers == nil {
 		log.Debugw("No handlers for after", log.Fields{"trigger": trigger})
 	}
+	for _, handler := range afterHandlers {
+		log.Debugw("running-after-handler", log.Fields{"handler": funcName(handler)})
+		if err := handler(); err != nil {
+			// TODO handle error
+			log.Error(err)
+			return
+		}
+	}
 }
diff --git a/adaptercore/openolt.go b/adaptercore/openolt.go
index 81639be..ce501ef 100644
--- a/adaptercore/openolt.go
+++ b/adaptercore/openolt.go
@@ -13,6 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+//Package adaptercore provides the utility for olt devices, flows and statistics
 package adaptercore
 
 import (
@@ -29,6 +31,7 @@
 	"github.com/opencord/voltha-protos/go/voltha"
 )
 
+//OpenOLT structure holds the OLT information
 type OpenOLT struct {
 	deviceHandlers        map[string]*DeviceHandler
 	coreProxy             *com.CoreProxy
@@ -42,6 +45,7 @@
 	lockDeviceHandlersMap sync.RWMutex
 }
 
+//NewOpenOLT returns a new instance of OpenOLT
 func NewOpenOLT(ctx context.Context, kafkaICProxy *kafka.InterContainerProxy, coreProxy *com.CoreProxy, adapterProxy *com.AdapterProxy, onuNumber int, kvStoreHost string, kvStorePort int, KVStoreType string) *OpenOLT {
 	var openOLT OpenOLT
 	openOLT.exitChannel = make(chan int, 1)
@@ -57,12 +61,14 @@
 	return &openOLT
 }
 
+//Start starts (logs) the device manager
 func (oo *OpenOLT) Start(ctx context.Context) error {
 	log.Info("starting-device-manager")
 	log.Info("device-manager-started")
 	return nil
 }
 
+//Stop terminates the session
 func (oo *OpenOLT) Stop(ctx context.Context) error {
 	log.Info("stopping-device-manager")
 	oo.exitChannel <- 1
@@ -72,7 +78,7 @@
 
 func sendResponse(ctx context.Context, ch chan interface{}, result interface{}) {
 	if ctx.Err() == nil {
-		// Returned response only of the ctx has not been cancelled/timeout/etc
+		// Returned response only of the ctx has not been canceled/timeout/etc
 		// Channel is automatically closed when a context is Done
 		ch <- result
 		log.Debugw("sendResponse", log.Fields{"result": result})
@@ -85,26 +91,27 @@
 func (oo *OpenOLT) addDeviceHandlerToMap(agent *DeviceHandler) {
 	oo.lockDeviceHandlersMap.Lock()
 	defer oo.lockDeviceHandlersMap.Unlock()
-	if _, exist := oo.deviceHandlers[agent.deviceId]; !exist {
-		oo.deviceHandlers[agent.deviceId] = agent
+	if _, exist := oo.deviceHandlers[agent.deviceID]; !exist {
+		oo.deviceHandlers[agent.deviceID] = agent
 	}
 }
 
 func (oo *OpenOLT) deleteDeviceHandlerToMap(agent *DeviceHandler) {
 	oo.lockDeviceHandlersMap.Lock()
 	defer oo.lockDeviceHandlersMap.Unlock()
-	delete(oo.deviceHandlers, agent.deviceId)
+	delete(oo.deviceHandlers, agent.deviceID)
 }
 
-func (oo *OpenOLT) getDeviceHandler(deviceId string) *DeviceHandler {
+func (oo *OpenOLT) getDeviceHandler(deviceID string) *DeviceHandler {
 	oo.lockDeviceHandlersMap.Lock()
 	defer oo.lockDeviceHandlersMap.Unlock()
-	if agent, ok := oo.deviceHandlers[deviceId]; ok {
+	if agent, ok := oo.deviceHandlers[deviceID]; ok {
 		return agent
 	}
 	return nil
 }
 
+//createDeviceTopic returns
 func (oo *OpenOLT) createDeviceTopic(device *voltha.Device) error {
 	log.Infow("create-device-topic", log.Fields{"deviceId": device.Id})
 	deviceTopic := kafka.Topic{Name: oo.kafkaICProxy.DefaultTopic.Name + "_" + device.Id}
@@ -116,6 +123,7 @@
 	return nil
 }
 
+// Adopt_device creates a new device handler if not present already and then adopts the device
 func (oo *OpenOLT) Adopt_device(device *voltha.Device) error {
 	if device == nil {
 		log.Warn("device-is-nil")
@@ -133,6 +141,7 @@
 	return nil
 }
 
+//Get_ofp_device_info returns OFP information for the given device
 func (oo *OpenOLT) Get_ofp_device_info(device *voltha.Device) (*ic.SwitchCapability, error) {
 	log.Infow("Get_ofp_device_info", log.Fields{"deviceId": device.Id})
 	if handler := oo.getDeviceHandler(device.Id); handler != nil {
@@ -142,15 +151,17 @@
 	return nil, errors.New("device-handler-not-set")
 }
 
-func (oo *OpenOLT) Get_ofp_port_info(device *voltha.Device, port_no int64) (*ic.PortCapability, error) {
+//Get_ofp_port_info returns OFP port information for the given device
+func (oo *OpenOLT) Get_ofp_port_info(device *voltha.Device, portNo int64) (*ic.PortCapability, error) {
 	log.Infow("Get_ofp_port_info", log.Fields{"deviceId": device.Id})
 	if handler := oo.getDeviceHandler(device.Id); handler != nil {
-		return handler.GetOfpPortInfo(device, port_no)
+		return handler.GetOfpPortInfo(device, portNo)
 	}
 	log.Errorw("device-handler-not-set", log.Fields{"deviceId": device.Id})
 	return nil, errors.New("device-handler-not-set")
 }
 
+//Process_inter_adapter_message sends messages to a target device (between adapters)
 func (oo *OpenOLT) Process_inter_adapter_message(msg *ic.InterAdapterMessage) error {
 	log.Infow("Process_inter_adapter_message", log.Fields{"msgId": msg.Header.Id})
 	targetDevice := msg.Header.ProxyDeviceId // Request?
@@ -159,31 +170,37 @@
 		targetDevice = msg.Header.ToDeviceId
 	}
 	if handler := oo.getDeviceHandler(targetDevice); handler != nil {
-		return handler.Process_inter_adapter_message(msg)
+		return handler.ProcessInterAdapterMessage(msg)
 	}
-	return errors.New(fmt.Sprintf("handler-not-found-%s", targetDevice))
+	return fmt.Errorf(fmt.Sprintf("handler-not-found-%s", targetDevice))
 }
 
+//Adapter_descriptor not implemented
 func (oo *OpenOLT) Adapter_descriptor() error {
-	return errors.New("UnImplemented")
+	return errors.New("unImplemented")
 }
 
+//Device_types unimplemented
 func (oo *OpenOLT) Device_types() (*voltha.DeviceTypes, error) {
-	return nil, errors.New("UnImplemented")
+	return nil, errors.New("unImplemented")
 }
 
+//Health  returns unimplemented
 func (oo *OpenOLT) Health() (*voltha.HealthStatus, error) {
-	return nil, errors.New("UnImplemented")
+	return nil, errors.New("unImplemented")
 }
 
+//Reconcile_device unimplemented
 func (oo *OpenOLT) Reconcile_device(device *voltha.Device) error {
-	return errors.New("UnImplemented")
+	return errors.New("unImplemented")
 }
 
+//Abandon_device unimplemented
 func (oo *OpenOLT) Abandon_device(device *voltha.Device) error {
-	return errors.New("UnImplemented")
+	return errors.New("unImplemented")
 }
 
+//Disable_device disables the given device
 func (oo *OpenOLT) Disable_device(device *voltha.Device) error {
 	log.Infow("disable-device", log.Fields{"deviceId": device.Id})
 	if handler := oo.getDeviceHandler(device.Id); handler != nil {
@@ -193,6 +210,7 @@
 	return errors.New("device-handler-not-found")
 }
 
+//Reenable_device enables the olt device after disable
 func (oo *OpenOLT) Reenable_device(device *voltha.Device) error {
 	log.Infow("reenable-device", log.Fields{"deviceId": device.Id})
 	if handler := oo.getDeviceHandler(device.Id); handler != nil {
@@ -202,6 +220,7 @@
 	return errors.New("device-handler-not-found")
 }
 
+//Reboot_device reboots the given device
 func (oo *OpenOLT) Reboot_device(device *voltha.Device) error {
 	log.Infow("reboot-device", log.Fields{"deviceId": device.Id})
 	if handler := oo.getDeviceHandler(device.Id); handler != nil {
@@ -212,22 +231,27 @@
 
 }
 
+//Self_test_device unimplented
 func (oo *OpenOLT) Self_test_device(device *voltha.Device) error {
-	return errors.New("UnImplemented")
+	return errors.New("unImplemented")
 }
 
+//Delete_device unimplemented
 func (oo *OpenOLT) Delete_device(device *voltha.Device) error {
-	return errors.New("UnImplemented")
+	return errors.New("unImplemented")
 }
 
+//Get_device_details unimplemented
 func (oo *OpenOLT) Get_device_details(device *voltha.Device) error {
-	return errors.New("UnImplemented")
+	return errors.New("unImplemented")
 }
 
+//Update_flows_bulk returns
 func (oo *OpenOLT) Update_flows_bulk(device *voltha.Device, flows *voltha.Flows, groups *voltha.FlowGroups) error {
-	return errors.New("UnImplemented")
+	return errors.New("unImplemented")
 }
 
+//Update_flows_incrementally updates (add/remove) the flows on a given device
 func (oo *OpenOLT) Update_flows_incrementally(device *voltha.Device, flows *openflow_13.FlowChanges, groups *openflow_13.FlowGroupChanges) error {
 	log.Debugw("Update_flows_incrementally", log.Fields{"deviceId": device.Id, "flows": flows})
 	if handler := oo.getDeviceHandler(device.Id); handler != nil {
@@ -237,43 +261,52 @@
 	return errors.New("device-handler-not-set")
 }
 
-func (oo *OpenOLT) Update_pm_config(device *voltha.Device, pm_configs *voltha.PmConfigs) error {
-	return errors.New("UnImplemented")
+//Update_pm_config returns PmConfigs nil or error
+func (oo *OpenOLT) Update_pm_config(device *voltha.Device, pmConfigs *voltha.PmConfigs) error {
+	return errors.New("unImplemented")
 }
 
-func (oo *OpenOLT) Receive_packet_out(deviceId string, egress_port_no int, packet *openflow_13.OfpPacketOut) error {
-	log.Debugw("Receive_packet_out", log.Fields{"deviceId": deviceId, "egress_port_no": egress_port_no, "pkt": packet})
-	if handler := oo.getDeviceHandler(deviceId); handler != nil {
-		return handler.PacketOut(egress_port_no, packet)
+//Receive_packet_out sends packet out to the device
+func (oo *OpenOLT) Receive_packet_out(deviceID string, egressPortNo int, packet *openflow_13.OfpPacketOut) error {
+	log.Debugw("Receive_packet_out", log.Fields{"deviceId": deviceID, "egress_port_no": egressPortNo, "pkt": packet})
+	if handler := oo.getDeviceHandler(deviceID); handler != nil {
+		return handler.PacketOut(egressPortNo, packet)
 	}
-	log.Errorw("Receive_packet_out failed-device-handler-not-set", log.Fields{"deviceId": deviceId, "egressport": egress_port_no, "packet": packet})
+	log.Errorw("Receive_packet_out failed-device-handler-not-set", log.Fields{"deviceId": deviceID, "egressport": egressPortNo, "packet": packet})
 	return errors.New("device-handler-not-set")
 }
 
+//Suppress_alarm unimplemented
 func (oo *OpenOLT) Suppress_alarm(filter *voltha.AlarmFilter) error {
-	return errors.New("UnImplemented")
+	return errors.New("unImplemented")
 }
 
+//Unsuppress_alarm  unimplemented
 func (oo *OpenOLT) Unsuppress_alarm(filter *voltha.AlarmFilter) error {
-	return errors.New("UnImplemented")
+	return errors.New("unImplemented")
 }
 
+//Download_image unimplemented
 func (oo *OpenOLT) Download_image(device *voltha.Device, request *voltha.ImageDownload) (*voltha.ImageDownload, error) {
-	return nil, errors.New("UnImplemented")
+	return nil, errors.New("unImplemented")
 }
 
+//Get_image_download_status unimplemented
 func (oo *OpenOLT) Get_image_download_status(device *voltha.Device, request *voltha.ImageDownload) (*voltha.ImageDownload, error) {
-	return nil, errors.New("UnImplemented")
+	return nil, errors.New("unImplemented")
 }
 
+//Cancel_image_download unimplemented
 func (oo *OpenOLT) Cancel_image_download(device *voltha.Device, request *voltha.ImageDownload) (*voltha.ImageDownload, error) {
-	return nil, errors.New("UnImplemented")
+	return nil, errors.New("unImplemented")
 }
 
+//Activate_image_update unimplemented
 func (oo *OpenOLT) Activate_image_update(device *voltha.Device, request *voltha.ImageDownload) (*voltha.ImageDownload, error) {
-	return nil, errors.New("UnImplemented")
+	return nil, errors.New("unImplemented")
 }
 
+//Revert_image_update unimplemented
 func (oo *OpenOLT) Revert_image_update(device *voltha.Device, request *voltha.ImageDownload) (*voltha.ImageDownload, error) {
-	return nil, errors.New("UnImplemented")
+	return nil, errors.New("unImplemented")
 }
diff --git a/adaptercore/openolt_flowmgr.go b/adaptercore/openolt_flowmgr.go
index 19abc26..1d96d2c 100644
--- a/adaptercore/openolt_flowmgr.go
+++ b/adaptercore/openolt_flowmgr.go
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+//Package adaptercore provides the utility for olt devices, flows and statistics
 package adaptercore
 
 import (
@@ -28,90 +29,129 @@
 	rsrcMgr "github.com/opencord/voltha-openolt-adapter/adaptercore/resourcemanager"
 	ic "github.com/opencord/voltha-protos/go/inter_container"
 	ofp "github.com/opencord/voltha-protos/go/openflow_13"
-	openolt_pb2 "github.com/opencord/voltha-protos/go/openolt"
-	voltha "github.com/opencord/voltha-protos/go/voltha"
+	openoltpb2 "github.com/opencord/voltha-protos/go/openolt"
+	"github.com/opencord/voltha-protos/go/voltha"
 	"math/big"
 	//deepcopy "github.com/getlantern/deepcopy"
 )
 
 const (
 	// Flow categories
-	HSIA_FLOW  = "HSIA_FLOW"
-	EAPOL_FLOW = "EAPOL_FLOW"
 
-	IP_PROTO_DHCP = 17
+	//HsiaFlow flow category
+	HsiaFlow = "HSIA_FLOW"
 
-	IP_PROTO_IGMP = 2
+	//EapolFlow flow category
+	EapolFlow = "EAPOL_FLOW"
 
-	EAP_ETH_TYPE  = 0x888e
-	LLDP_ETH_TYPE = 0x88cc
+	//IPProtoDhcp flow category
+	IPProtoDhcp = 17
 
-	IGMP_PROTO = 2
+	//IPProtoIgmp flow category
+	IPProtoIgmp = 2
+
+	//EapEthType eapethtype value
+	EapEthType = 0x888e
+	//LldpEthType lldp ethtype value
+	LldpEthType = 0x88cc
+
+	//IgmpProto proto value
+	IgmpProto = 2
 
 	//FIXME - see also BRDCM_DEFAULT_VLAN in broadcom_onu.py
-	DEFAULT_MGMT_VLAN = 4091
+
+	//DefaultMgmtVlan default vlan value
+	DefaultMgmtVlan = 4091
 
 	// Openolt Flow
-	UPSTREAM        = "upstream"
-	DOWNSTREAM      = "downstream"
-	PACKET_TAG_TYPE = "pkt_tag_type"
-	UNTAGGED        = "untagged"
-	SINGLE_TAG      = "single_tag"
-	DOUBLE_TAG      = "double_tag"
+
+	//UPSTREAM constant
+	UPSTREAM = "upstream"
+	//DOWNSTREAM constant
+	DOWNSTREAM = "downstream"
+	//PacketTagType constant
+	PacketTagType = "pkt_tag_type"
+	//UNTAGGED constant
+	UNTAGGED = "untagged"
+	//SingleTag constant
+	SingleTag = "single_tag"
+	//DoubleTag constant
+	DoubleTag = "double_tag"
 
 	// classifierInfo
-	ETH_TYPE  = "eth_type"
-	TPID      = "tpid"
-	IP_PROTO  = "ip_proto"
-	IN_PORT   = "in_port"
-	VLAN_VID  = "vlan_vid"
-	VLAN_PCP  = "vlan_pcp"
-	UDP_DST   = "udp_dst"
-	UDP_SRC   = "udp_src"
-	IPV4_DST  = "ipv4_dst"
-	IPV4_SRC  = "ipv4_src"
-	METADATA  = "metadata"
-	TUNNEL_ID = "tunnel_id"
-	OUTPUT    = "output"
-	// Action
-	POP_VLAN     = "pop_vlan"
-	PUSH_VLAN    = "push_vlan"
-	TRAP_TO_HOST = "trap_to_host"
+
+	//EthType constant
+	EthType = "eth_type"
+	//TPID constant
+	TPID = "tpid"
+	//IPProto constant
+	IPProto = "ip_proto"
+	//InPort constant
+	InPort = "in_port"
+	//VlanVid constant
+	VlanVid = "vlan_vid"
+	//VlanPcp constant
+	VlanPcp = "vlan_pcp"
+
+	//UDPDst constant
+	UDPDst = "udp_dst"
+	//UDPSrc constant
+	UDPSrc = "udp_src"
+	//Ipv4Dst constant
+	Ipv4Dst = "ipv4_dst"
+	//Ipv4Src constant
+	Ipv4Src = "ipv4_src"
+	//METADATA constant
+	METADATA = "metadata"
+	//TunnelID constant
+	TunnelID = "tunnel_id"
+	//OUTPUT constant
+	OUTPUT = "output"
+	// Actions
+
+	//PopVlan constant
+	PopVlan = "pop_vlan"
+	//PushVlan constant
+	PushVlan = "push_vlan"
+	//TrapToHost constant
+	TrapToHost = "trap_to_host"
 )
 
 type onuInfo struct {
-	intfId       uint32
-	onuId        uint32
+	intfID       uint32
+	onuID        uint32
 	serialNumber string
 }
 
-type onuIdKey struct {
-	intfId uint32
-	onuId  uint32
+type onuIDKey struct {
+	intfID uint32
+	onuID  uint32
 }
 
 type gemPortKey struct {
-	intfId  uint32
+	intfID  uint32
 	gemPort uint32
 }
 
 type packetInInfoKey struct {
-	intfId      uint32
-	onuId       uint32
+	intfID      uint32
+	onuID       uint32
 	logicalPort uint32
 }
 
+//OpenOltFlowMgr creates the Structure of OpenOltFlowMgr obj
 type OpenOltFlowMgr struct {
 	techprofile       []*tp.TechProfileMgr
 	deviceHandler     *DeviceHandler
 	resourceMgr       *rsrcMgr.OpenOltResourceMgr
-	onuIds            map[onuIdKey]onuInfo       //OnuId -> OnuInfo
+	onuIds            map[onuIDKey]onuInfo       //OnuId -> OnuInfo
 	onuSerialNumbers  map[string]onuInfo         //onu serial_number (string) -> OnuInfo
 	onuGemPortIds     map[gemPortKey]onuInfo     //GemPortId -> OnuInfo
 	packetInGemPort   map[packetInInfoKey]uint32 //packet in gem port
 	storedDeviceFlows []ofp.OfpFlowStats         /* Required during deletion to obtain device flows from logical flows */
 }
 
+//NewFlowManager creates OpenOltFlowMgr object and initializes the parameters
 func NewFlowManager(dh *DeviceHandler, rsrcMgr *rsrcMgr.OpenOltResourceMgr) *OpenOltFlowMgr {
 	log.Info("Initializing flow manager")
 	var flowMgr OpenOltFlowMgr
@@ -121,7 +161,7 @@
 		log.Error("Error while populating tech profile mgr\n")
 		return nil
 	}
-	flowMgr.onuIds = make(map[onuIdKey]onuInfo)
+	flowMgr.onuIds = make(map[onuIDKey]onuInfo)
 	flowMgr.onuSerialNumbers = make(map[string]onuInfo)
 	flowMgr.onuGemPortIds = make(map[gemPortKey]onuInfo)
 	flowMgr.packetInGemPort = make(map[packetInInfoKey]uint32)
@@ -129,25 +169,25 @@
 	return &flowMgr
 }
 
-func (f *OpenOltFlowMgr) generateStoredFlowId(flowId uint32, direction string) (uint64, error) {
+func (f *OpenOltFlowMgr) generateStoredFlowID(flowID uint32, direction string) (uint64, error) {
 	if direction == UPSTREAM {
 		log.Debug("upstream flow, shifting id")
-		return 0x1<<15 | uint64(flowId), nil
+		return 0x1<<15 | uint64(flowID), nil
 	} else if direction == DOWNSTREAM {
 		log.Debug("downstream flow, not shifting id")
-		return uint64(flowId), nil
+		return uint64(flowID), nil
 	} else {
 		log.Debug("Unrecognized direction")
-		return 0, errors.New(fmt.Sprintf("Unrecognized direction %s", direction))
+		return 0, fmt.Errorf("unrecognized direction %s", direction)
 	}
 }
 
-func (f *OpenOltFlowMgr) registerFlow(flowFromCore *ofp.OfpFlowStats, deviceFlow *openolt_pb2.Flow) {
+func (f *OpenOltFlowMgr) registerFlow(flowFromCore *ofp.OfpFlowStats, deviceFlow *openoltpb2.Flow) {
 	log.Debug("Registering Flow for Device ", log.Fields{"flow": flowFromCore},
-		log.Fields{"device": f.deviceHandler.deviceId})
+		log.Fields{"device": f.deviceHandler.deviceID})
 
 	var storedFlow ofp.OfpFlowStats
-	storedFlow.Id, _ = f.generateStoredFlowId(deviceFlow.FlowId, deviceFlow.FlowType)
+	storedFlow.Id, _ = f.generateStoredFlowID(deviceFlow.FlowId, deviceFlow.FlowType)
 	log.Debug(fmt.Sprintf("Generated stored device flow. id = %d, flowId = %d, direction = %s", storedFlow.Id,
 		deviceFlow.FlowId, deviceFlow.FlowType))
 	storedFlow.Cookie = flowFromCore.Id
@@ -155,19 +195,19 @@
 	log.Debugw("updated Stored flow info", log.Fields{"storedDeviceFlows": f.storedDeviceFlows})
 }
 
-func (f *OpenOltFlowMgr) divideAndAddFlow(intfId uint32, onuId uint32, uniId uint32, portNo uint32, classifierInfo map[string]interface{}, actionInfo map[string]interface{}, flow *ofp.OfpFlowStats) {
-	var allocId []uint32
+func (f *OpenOltFlowMgr) divideAndAddFlow(intfID uint32, onuID uint32, uniID uint32, portNo uint32, classifierInfo map[string]interface{}, actionInfo map[string]interface{}, flow *ofp.OfpFlowStats) {
+	var allocID []uint32
 	var gemPorts []uint32
 
-	log.Infow("Dividing flow", log.Fields{"intfId": intfId, "onuId": onuId, "uniId": uniId, "portNo": portNo, "classifier": classifierInfo, "action": actionInfo})
+	log.Infow("Dividing flow", log.Fields{"intfId": intfID, "onuId": onuID, "uniId": uniID, "portNo": portNo, "classifier": classifierInfo, "action": actionInfo})
 
-	log.Infow("sorting flow", log.Fields{"intfId": intfId, "onuId": onuId, "uniId": uniId, "portNo": portNo,
+	log.Infow("sorting flow", log.Fields{"intfId": intfID, "onuId": onuID, "uniId": uniID, "portNo": portNo,
 		"classifierInfo": classifierInfo, "actionInfo": actionInfo})
 
-	uni := getUniPortPath(intfId, onuId, uniId)
+	uni := getUniPortPath(intfID, onuID, uniID)
 	log.Debugw("Uni port name", log.Fields{"uni": uni})
-	allocId, gemPorts = f.createTcontGemports(intfId, onuId, uniId, uni, portNo, flow.GetTableId())
-	if allocId == nil || gemPorts == nil {
+	allocID, gemPorts = f.createTcontGemports(intfID, onuID, uniID, uni, portNo, flow.GetTableId())
+	if allocID == nil || gemPorts == nil {
 		log.Error("alloc-id-gem-ports-unavailable")
 		return
 	}
@@ -176,36 +216,36 @@
 	 * Hence adding flows for all gemports
 	 */
 	for _, gemPort := range gemPorts {
-		if ipProto, ok := classifierInfo[IP_PROTO]; ok {
-			if ipProto.(uint32) == IP_PROTO_DHCP {
+		if ipProto, ok := classifierInfo[IPProto]; ok {
+			if ipProto.(uint32) == IPProtoDhcp {
 				log.Info("Adding DHCP flow")
-				f.addDHCPTrapFlow(intfId, onuId, uniId, portNo, classifierInfo, actionInfo, flow, allocId[0], gemPort)
-			} else if ipProto == IP_PROTO_IGMP {
+				f.addDHCPTrapFlow(intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, allocID[0], gemPort)
+			} else if ipProto == IPProtoIgmp {
 				log.Info("igmp flow add ignored, not implemented yet")
 			} else {
 				log.Errorw("Invalid-Classifier-to-handle", log.Fields{"classifier": classifierInfo, "action": actionInfo})
 				//return errors.New("Invalid-Classifier-to-handle")
 			}
-		} else if ethType, ok := classifierInfo[ETH_TYPE]; ok {
-			if ethType.(uint32) == EAP_ETH_TYPE {
+		} else if ethType, ok := classifierInfo[EthType]; ok {
+			if ethType.(uint32) == EapEthType {
 				log.Info("Adding EAPOL flow")
-				f.addEAPOLFlow(intfId, onuId, uniId, portNo, flow, allocId[0], gemPort, DEFAULT_MGMT_VLAN)
+				f.addEAPOLFlow(intfID, onuID, uniID, portNo, flow, allocID[0], gemPort, DefaultMgmtVlan)
 				if vlan := getSubscriberVlan(utils.GetInPort(flow)); vlan != 0 {
-					f.addEAPOLFlow(intfId, onuId, uniId, portNo, flow, allocId[0], gemPort, vlan)
+					f.addEAPOLFlow(intfID, onuID, uniID, portNo, flow, allocID[0], gemPort, vlan)
 				}
 				// Send Techprofile download event to child device in go routine as it takes time
-				go f.sendTPDownloadMsgToChild(intfId, onuId, uniId, uni)
+				go f.sendTPDownloadMsgToChild(intfID, onuID, uniID, uni)
 			}
-			if ethType == LLDP_ETH_TYPE {
+			if ethType == LldpEthType {
 				log.Info("Adding LLDP flow")
 				addLLDPFlow(flow, portNo)
 			}
-		} else if _, ok := actionInfo[PUSH_VLAN]; ok {
+		} else if _, ok := actionInfo[PushVlan]; ok {
 			log.Info("Adding upstream data rule")
-			f.addUpstreamDataFlow(intfId, onuId, uniId, portNo, classifierInfo, actionInfo, flow, allocId[0], gemPort)
-		} else if _, ok := actionInfo[POP_VLAN]; ok {
+			f.addUpstreamDataFlow(intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, allocID[0], gemPort)
+		} else if _, ok := actionInfo[PopVlan]; ok {
 			log.Info("Adding Downstream data rule")
-			f.addDownstreamDataFlow(intfId, onuId, uniId, portNo, classifierInfo, actionInfo, flow, allocId[0], gemPort)
+			f.addDownstreamDataFlow(intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow, allocID[0], gemPort)
 		} else {
 			log.Errorw("Invalid-flow-type-to-handle", log.Fields{"classifier": classifierInfo, "action": actionInfo, "flow": flow})
 		}
@@ -213,36 +253,36 @@
 }
 
 // This function allocates tconts and GEM ports for an ONU, currently one TCONT is supported per ONU
-func (f *OpenOltFlowMgr) createTcontGemports(intfId uint32, onuId uint32, uniId uint32, uni string, uniPort uint32, tableID uint32) ([]uint32, []uint32) {
+func (f *OpenOltFlowMgr) createTcontGemports(intfID uint32, onuID uint32, uniID uint32, uni string, uniPort uint32, tableID uint32) ([]uint32, []uint32) {
 	var allocID []uint32
 	var gemPortIDs []uint32
 	//If we already have allocated earlier for this onu, render them
-	if tcontId := f.resourceMgr.GetCurrentAllocIDForOnu(intfId, onuId, uniId); tcontId != 0 {
-		allocID = append(allocID, tcontId)
+	if tcontID := f.resourceMgr.GetCurrentAllocIDForOnu(intfID, onuID, uniID); tcontID != 0 {
+		allocID = append(allocID, tcontID)
 	}
-	gemPortIDs = f.resourceMgr.GetCurrentGEMPortIDsForOnu(intfId, onuId, uniId)
+	gemPortIDs = f.resourceMgr.GetCurrentGEMPortIDsForOnu(intfID, onuID, uniID)
 	if len(allocID) != 0 && len(gemPortIDs) != 0 {
-		log.Debug("Rendered Tcont and GEM ports from resource manager", log.Fields{"intfId": intfId, "onuId": onuId, "uniPort": uniId,
+		log.Debug("Rendered Tcont and GEM ports from resource manager", log.Fields{"intfId": intfID, "onuId": onuID, "uniPort": uniID,
 			"allocID": allocID, "gemPortIDs": gemPortIDs})
 		return allocID, gemPortIDs
 	}
-	log.Debug("Creating New TConts and Gem ports", log.Fields{"pon": intfId, "onu": onuId, "uni": uniId})
+	log.Debug("Creating New TConts and Gem ports", log.Fields{"pon": intfID, "onu": onuID, "uni": uniID})
 
 	//FIXME: If table id is <= 63 using 64 as table id
 	if tableID < tp.DEFAULT_TECH_PROFILE_TABLE_ID {
 		tableID = tp.DEFAULT_TECH_PROFILE_TABLE_ID
 	}
-	tpPath := f.getTPpath(intfId, uni)
+	tpPath := f.getTPpath(intfID, uni)
 	// Check tech profile instance already exists for derived port name
-	tech_profile_instance, err := f.techprofile[intfId].GetTPInstanceFromKVStore(tableID, tpPath)
+	techProfileInstance, err := f.techprofile[intfID].GetTPInstanceFromKVStore(tableID, tpPath)
 	if err != nil { // This should not happen, something wrong in KV backend transaction
 		log.Errorw("Error in fetching tech profile instance from KV store", log.Fields{"tableID": tableID, "path": tpPath})
 		return nil, nil
 	}
-	if tech_profile_instance == nil {
+	if techProfileInstance == nil {
 		log.Info("Creating tech profile instance", log.Fields{"path": tpPath})
-		tech_profile_instance = f.techprofile[intfId].CreateTechProfInstance(tableID, uni, intfId)
-		if tech_profile_instance == nil {
+		techProfileInstance = f.techprofile[intfID].CreateTechProfInstance(tableID, uni, intfID)
+		if techProfileInstance == nil {
 			log.Error("Tech-profile-instance-creation-failed")
 			return nil, nil
 		}
@@ -250,107 +290,107 @@
 		log.Debugw("Tech-profile-instance-already-exist-for-given port-name", log.Fields{"uni": uni})
 	}
 	// Get upstream and downstream scheduler protos
-	us_scheduler := f.techprofile[intfId].GetUsScheduler(tech_profile_instance)
-	ds_scheduler := f.techprofile[intfId].GetDsScheduler(tech_profile_instance)
+	usScheduler := f.techprofile[intfID].GetUsScheduler(techProfileInstance)
+	dsScheduler := f.techprofile[intfID].GetDsScheduler(techProfileInstance)
 	// Get TCONTS protos
-	tconts := f.techprofile[intfId].GetTconts(tech_profile_instance, us_scheduler, ds_scheduler)
+	tconts := f.techprofile[intfID].GetTconts(techProfileInstance, usScheduler, dsScheduler)
 	if len(tconts) == 0 {
 		log.Error("TCONTS not found ")
 		return nil, nil
 	}
 	log.Debugw("Sending Create tcont to device",
-		log.Fields{"onu": onuId, "uni": uniId, "portNo": "", "tconts": tconts})
+		log.Fields{"onu": onuID, "uni": uniID, "portNo": "", "tconts": tconts})
 	if _, err := f.deviceHandler.Client.CreateTconts(context.Background(),
-		&openolt_pb2.Tconts{IntfId: intfId,
-			OnuId:  onuId,
-			UniId:  uniId,
+		&openoltpb2.Tconts{IntfId: intfID,
+			OnuId:  onuID,
+			UniId:  uniID,
 			PortNo: uniPort,
 			Tconts: tconts}); err != nil {
 		log.Errorw("Error while creating TCONT in device", log.Fields{"error": err})
 		return nil, nil
 	}
-	allocID = append(allocID, tech_profile_instance.UsScheduler.AllocID)
-	for _, gem := range tech_profile_instance.UpstreamGemPortAttributeList {
+	allocID = append(allocID, techProfileInstance.UsScheduler.AllocID)
+	for _, gem := range techProfileInstance.UpstreamGemPortAttributeList {
 		gemPortIDs = append(gemPortIDs, gem.GemportID)
 	}
 	log.Debugw("Allocated Tcont and GEM ports", log.Fields{"allocID": allocID, "gemports": gemPortIDs})
 	// Send Tconts and GEM ports to KV store
-	f.storeTcontsGEMPortsIntoKVStore(intfId, onuId, uniId, allocID, gemPortIDs)
+	f.storeTcontsGEMPortsIntoKVStore(intfID, onuID, uniID, allocID, gemPortIDs)
 	return allocID, gemPortIDs
 }
 
-func (f *OpenOltFlowMgr) storeTcontsGEMPortsIntoKVStore(intfId uint32, onuId uint32, uniId uint32, allocID []uint32, gemPortIDs []uint32) {
+func (f *OpenOltFlowMgr) storeTcontsGEMPortsIntoKVStore(intfID uint32, onuID uint32, uniID uint32, allocID []uint32, gemPortIDs []uint32) {
 
 	log.Debugw("Storing allocated Tconts and GEM ports into KV store",
-		log.Fields{"intfId": intfId, "onuId": onuId, "uniId": uniId, "allocID": allocID, "gemPortIDs": gemPortIDs})
+		log.Fields{"intfId": intfID, "onuId": onuID, "uniId": uniID, "allocID": allocID, "gemPortIDs": gemPortIDs})
 	/* Update the allocated alloc_id and gem_port_id for the ONU/UNI to KV store  */
-	if err := f.resourceMgr.UpdateAllocIdsForOnu(intfId, onuId, uniId, allocID); err != nil {
+	if err := f.resourceMgr.UpdateAllocIdsForOnu(intfID, onuID, uniID, allocID); err != nil {
 		log.Error("Errow while uploading allocID to KV store")
 	}
-	if err := f.resourceMgr.UpdateGEMPortIDsForOnu(intfId, onuId, uniId, gemPortIDs); err != nil {
+	if err := f.resourceMgr.UpdateGEMPortIDsForOnu(intfID, onuID, uniID, gemPortIDs); err != nil {
 		log.Error("Errow while uploading GEMports to KV store")
 	}
-	if err := f.resourceMgr.UpdateGEMportsPonportToOnuMapOnKVStore(gemPortIDs, intfId, onuId, uniId); err != nil {
+	if err := f.resourceMgr.UpdateGEMportsPonportToOnuMapOnKVStore(gemPortIDs, intfID, onuID, uniID); err != nil {
 		log.Error("Errow while uploading gemtopon map to KV store")
 	}
 	log.Debug("Stored tconts and GEM into KV store successfully")
 	for _, gemPort := range gemPortIDs {
-		f.addGemPortToOnuInfoMap(intfId, onuId, gemPort)
+		f.addGemPortToOnuInfoMap(intfID, onuID, gemPort)
 	}
 }
 
 func (f *OpenOltFlowMgr) populateTechProfilePerPonPort() error {
 	for _, techRange := range f.resourceMgr.DevInfo.Ranges {
-		for intfId := range techRange.IntfIds {
-			f.techprofile = append(f.techprofile, f.resourceMgr.ResourceMgrs[uint32(intfId)].TechProfileMgr)
+		for intfID := range techRange.IntfIds {
+			f.techprofile = append(f.techprofile, f.resourceMgr.ResourceMgrs[uint32(intfID)].TechProfileMgr)
 		}
 	}
 	//Make sure we have as many tech_profiles as there are pon ports on the device
 	if len(f.techprofile) != int(f.resourceMgr.DevInfo.GetPonPorts()) {
 		log.Errorw("Error while populating techprofile",
 			log.Fields{"numofTech": len(f.techprofile), "numPonPorts": f.resourceMgr.DevInfo.GetPonPorts()})
-		return errors.New("Error while populating techprofile mgrs")
+		return errors.New("error while populating techprofile mgrs")
 	}
 	log.Infow("Populated techprofile per ponport successfully",
 		log.Fields{"numofTech": len(f.techprofile), "numPonPorts": f.resourceMgr.DevInfo.GetPonPorts()})
 	return nil
 }
 
-func (f *OpenOltFlowMgr) addUpstreamDataFlow(intfId uint32, onuId uint32, uniId uint32,
+func (f *OpenOltFlowMgr) addUpstreamDataFlow(intfID uint32, onuID uint32, uniID uint32,
 	portNo uint32, uplinkClassifier map[string]interface{},
 	uplinkAction map[string]interface{}, logicalFlow *ofp.OfpFlowStats,
-	allocId uint32, gemportId uint32) {
-	uplinkClassifier[PACKET_TAG_TYPE] = SINGLE_TAG
+	allocID uint32, gemportID uint32) {
+	uplinkClassifier[PacketTagType] = SingleTag
 	log.Debugw("Adding upstream data flow", log.Fields{"uplinkClassifier": uplinkClassifier, "uplinkAction": uplinkAction})
-	f.addHSIAFlow(intfId, onuId, uniId, portNo, uplinkClassifier, uplinkAction,
-		UPSTREAM, logicalFlow, allocId, gemportId)
+	f.addHSIAFlow(intfID, onuID, uniID, portNo, uplinkClassifier, uplinkAction,
+		UPSTREAM, logicalFlow, allocID, gemportID)
 	/* TODO: Install Secondary EAP on the subscriber vlan */
 }
 
-func (f *OpenOltFlowMgr) addDownstreamDataFlow(intfId uint32, onuId uint32, uniId uint32,
+func (f *OpenOltFlowMgr) addDownstreamDataFlow(intfID uint32, onuID uint32, uniID uint32,
 	portNo uint32, downlinkClassifier map[string]interface{},
 	downlinkAction map[string]interface{}, logicalFlow *ofp.OfpFlowStats,
-	allocId uint32, gemportId uint32) {
-	downlinkClassifier[PACKET_TAG_TYPE] = DOUBLE_TAG
+	allocID uint32, gemportID uint32) {
+	downlinkClassifier[PacketTagType] = DoubleTag
 	log.Debugw("Adding downstream data flow", log.Fields{"downlinkClassifier": downlinkClassifier,
 		"downlinkAction": downlinkAction})
 	// Ignore private VLAN flow given by decomposer, cannot do anything with this flow
-	if uint32(downlinkClassifier[METADATA].(uint64)) == MkUniPortNum(intfId, onuId, uniId) &&
-		downlinkClassifier[VLAN_VID] == (uint32(ofp.OfpVlanId_OFPVID_PRESENT)|4000) {
+	if uint32(downlinkClassifier[METADATA].(uint64)) == MkUniPortNum(intfID, onuID, uniID) &&
+		downlinkClassifier[VlanVid] == (uint32(ofp.OfpVlanId_OFPVID_PRESENT)|4000) {
 		log.Infow("EAPOL DL flow , Already added ,ignoring it", log.Fields{"downlinkClassifier": downlinkClassifier,
 			"downlinkAction": downlinkAction})
 		return
 	}
 	/* Already this info available classifier? */
-	downlinkAction[POP_VLAN] = true
-	downlinkAction[VLAN_VID] = downlinkClassifier[VLAN_VID]
-	f.addHSIAFlow(intfId, onuId, uniId, portNo, downlinkClassifier, downlinkAction,
-		DOWNSTREAM, logicalFlow, allocId, gemportId)
+	downlinkAction[PopVlan] = true
+	downlinkAction[VlanVid] = downlinkClassifier[VlanVid]
+	f.addHSIAFlow(intfID, onuID, uniID, portNo, downlinkClassifier, downlinkAction,
+		DOWNSTREAM, logicalFlow, allocID, gemportID)
 }
 
-func (f *OpenOltFlowMgr) addHSIAFlow(intfId uint32, onuId uint32, uniId uint32, portNo uint32, classifier map[string]interface{},
+func (f *OpenOltFlowMgr) addHSIAFlow(intfID uint32, onuID uint32, uniID uint32, portNo uint32, classifier map[string]interface{},
 	action map[string]interface{}, direction string, logicalFlow *ofp.OfpFlowStats,
-	allocId uint32, gemPortId uint32) {
+	allocID uint32, gemPortID uint32) {
 	/* One of the OLT platform (Broadcom BAL) requires that symmetric
 	   flows require the same flow_id to be used across UL and DL.
 	   Since HSIA flow is the only symmetric flow currently, we need to
@@ -358,18 +398,18 @@
 	   takes priority over flow_cookie to find any available HSIA_FLOW
 	   id for the ONU.
 	*/
-	log.Debugw("Adding HSIA flow", log.Fields{"intfId": intfId, "onuId": onuId, "uniId": uniId, "classifier": classifier,
-		"action": action, "direction": direction, "allocId": allocId, "gemPortId": gemPortId,
+	log.Debugw("Adding HSIA flow", log.Fields{"intfId": intfID, "onuId": onuID, "uniId": uniID, "classifier": classifier,
+		"action": action, "direction": direction, "allocId": allocID, "gemPortId": gemPortID,
 		"logicalFlow": *logicalFlow})
 	flowCategory := "HSIA"
-	flowStoreCookie := getFlowStoreCookie(classifier, gemPortId)
-	flowId, err := f.resourceMgr.GetFlowID(intfId, onuId, uniId, flowStoreCookie, flowCategory)
+	flowStoreCookie := getFlowStoreCookie(classifier, gemPortID)
+	flowID, err := f.resourceMgr.GetFlowID(intfID, onuID, uniID, flowStoreCookie, flowCategory)
 	if err != nil {
 		log.Errorw("Flow id unavailable for HSIA flow", log.Fields{"direction": direction})
 		return
 	}
-	var classifierProto *openolt_pb2.Classifier
-	var actionProto *openolt_pb2.Action
+	var classifierProto *openoltpb2.Classifier
+	var actionProto *openoltpb2.Action
 	if classifierProto = makeOpenOltClassifierField(classifier); classifierProto == nil {
 		log.Error("Error in making classifier protobuf for hsia flow")
 		return
@@ -380,15 +420,15 @@
 		return
 	}
 	log.Debugw("Created action proto", log.Fields{"action": *actionProto})
-	networkIntfId := f.deviceHandler.nniIntfId
-	flow := openolt_pb2.Flow{AccessIntfId: int32(intfId),
-		OnuId:         int32(onuId),
-		UniId:         int32(uniId),
-		FlowId:        flowId,
+	networkIntfID := f.deviceHandler.nniIntfID
+	flow := openoltpb2.Flow{AccessIntfId: int32(intfID),
+		OnuId:         int32(onuID),
+		UniId:         int32(uniID),
+		FlowId:        flowID,
 		FlowType:      direction,
-		AllocId:       int32(allocId),
-		NetworkIntfId: int32(networkIntfId),
-		GemportId:     int32(gemPortId),
+		AllocId:       int32(allocID),
+		NetworkIntfId: int32(networkIntfID),
+		GemportId:     int32(gemPortID),
 		Classifier:    classifierProto,
 		Action:        actionProto,
 		Priority:      int32(logicalFlow.Priority),
@@ -396,7 +436,7 @@
 		PortNo:        portNo}
 	if ok := f.addFlowToDevice(logicalFlow, &flow); ok {
 		log.Debug("HSIA flow added to device successfully", log.Fields{"direction": direction})
-		flowsToKVStore := f.getUpdatedFlowInfo(&flow, flowStoreCookie, "HSIA", flowId)
+		flowsToKVStore := f.getUpdatedFlowInfo(&flow, flowStoreCookie, "HSIA", flowID)
 		if err := f.updateFlowInfoToKVStore(flow.AccessIntfId,
 			flow.OnuId,
 			flow.UniId,
@@ -406,29 +446,29 @@
 		}
 	}
 }
-func (f *OpenOltFlowMgr) addDHCPTrapFlow(intfId uint32, onuId uint32, uniId uint32, portNo uint32, classifier map[string]interface{}, action map[string]interface{}, logicalFlow *ofp.OfpFlowStats, allocId uint32, gemPortId uint32) {
+func (f *OpenOltFlowMgr) addDHCPTrapFlow(intfID uint32, onuID uint32, uniID uint32, portNo uint32, classifier map[string]interface{}, action map[string]interface{}, logicalFlow *ofp.OfpFlowStats, allocID uint32, gemPortID uint32) {
 
-	var dhcpFlow openolt_pb2.Flow
-	var actionProto *openolt_pb2.Action
-	var classifierProto *openolt_pb2.Classifier
+	var dhcpFlow openoltpb2.Flow
+	var actionProto *openoltpb2.Action
+	var classifierProto *openoltpb2.Classifier
 
 	// Clear the action map
 	for k := range action {
 		delete(action, k)
 	}
 
-	action[TRAP_TO_HOST] = true
-	classifier[UDP_SRC] = uint32(68)
-	classifier[UDP_DST] = uint32(67)
-	classifier[PACKET_TAG_TYPE] = SINGLE_TAG
-	delete(classifier, VLAN_VID)
+	action[TrapToHost] = true
+	classifier[UDPSrc] = uint32(68)
+	classifier[UDPDst] = uint32(67)
+	classifier[PacketTagType] = SingleTag
+	delete(classifier, VlanVid)
 
-	flowStoreCookie := getFlowStoreCookie(classifier, gemPortId)
+	flowStoreCookie := getFlowStoreCookie(classifier, gemPortID)
 
-	flowID, err := f.resourceMgr.GetFlowID(intfId, onuId, uniId, flowStoreCookie, "")
+	flowID, err := f.resourceMgr.GetFlowID(intfID, onuID, uniID, flowStoreCookie, "")
 
 	if err != nil {
-		log.Errorw("flowId unavailable for UL EAPOL", log.Fields{"intfId": intfId, "onuId": onuId, "flowStoreCookie": flowStoreCookie})
+		log.Errorw("flowId unavailable for UL EAPOL", log.Fields{"intfId": intfID, "onuId": onuID, "flowStoreCookie": flowStoreCookie})
 		return
 	}
 
@@ -443,16 +483,16 @@
 		log.Error("Error in making action protobuf for ul flow")
 		return
 	}
-	networkIntfId := f.deviceHandler.nniIntfId
+	networkIntfID := f.deviceHandler.nniIntfID
 
-	dhcpFlow = openolt_pb2.Flow{AccessIntfId: int32(intfId),
-		OnuId:         int32(onuId),
-		UniId:         int32(uniId),
+	dhcpFlow = openoltpb2.Flow{AccessIntfId: int32(intfID),
+		OnuId:         int32(onuID),
+		UniId:         int32(uniID),
 		FlowId:        flowID,
 		FlowType:      UPSTREAM,
-		AllocId:       int32(allocId),
-		NetworkIntfId: int32(networkIntfId),
-		GemportId:     int32(gemPortId),
+		AllocId:       int32(allocID),
+		NetworkIntfId: int32(networkIntfID),
+		GemportId:     int32(gemPortID),
 		Classifier:    classifierProto,
 		Action:        actionProto,
 		Priority:      int32(logicalFlow.Priority),
@@ -474,33 +514,33 @@
 	return
 }
 
-// Add EAPOL to  device
-func (f *OpenOltFlowMgr) addEAPOLFlow(intfId uint32, onuId uint32, uniId uint32, portNo uint32, logicalFlow *ofp.OfpFlowStats, allocId uint32, gemPortId uint32, vlanId uint32) {
-	log.Debugw("Adding EAPOL to device", log.Fields{"intfId": intfId, "onuId": onuId, "portNo": portNo, "allocId": allocId, "gemPortId": gemPortId, "vlanId": vlanId, "flow": logicalFlow})
+// Add EAPOL flow to  device with mac, vlanId as classifier for upstream and downstream
+func (f *OpenOltFlowMgr) addEAPOLFlow(intfID uint32, onuID uint32, uniID uint32, portNo uint32, logicalFlow *ofp.OfpFlowStats, allocID uint32, gemPortID uint32, vlanID uint32) {
+	log.Debugw("Adding EAPOL to device", log.Fields{"intfId": intfID, "onuId": onuID, "portNo": portNo, "allocId": allocID, "gemPortId": gemPortID, "vlanId": vlanID, "flow": logicalFlow})
 
 	uplinkClassifier := make(map[string]interface{})
 	uplinkAction := make(map[string]interface{})
 	downlinkClassifier := make(map[string]interface{})
 	downlinkAction := make(map[string]interface{})
-	var upstreamFlow openolt_pb2.Flow
-	var downstreamFlow openolt_pb2.Flow
+	var upstreamFlow openoltpb2.Flow
+	var downstreamFlow openoltpb2.Flow
 
 	// Fill Classfier
-	uplinkClassifier[ETH_TYPE] = uint32(EAP_ETH_TYPE)
-	uplinkClassifier[PACKET_TAG_TYPE] = SINGLE_TAG
-	uplinkClassifier[VLAN_VID] = vlanId
+	uplinkClassifier[EthType] = uint32(EapEthType)
+	uplinkClassifier[PacketTagType] = SingleTag
+	uplinkClassifier[VlanVid] = vlanID
 	// Fill action
-	uplinkAction[TRAP_TO_HOST] = true
-	flowStoreCookie := getFlowStoreCookie(uplinkClassifier, gemPortId)
+	uplinkAction[TrapToHost] = true
+	flowStoreCookie := getFlowStoreCookie(uplinkClassifier, gemPortID)
 	//Add Uplink EAPOL Flow
-	uplinkFlowId, err := f.resourceMgr.GetFlowID(intfId, onuId, uniId, flowStoreCookie, "")
+	uplinkFlowID, err := f.resourceMgr.GetFlowID(intfID, onuID, uniID, flowStoreCookie, "")
 	if err != nil {
-		log.Errorw("flowId unavailable for UL EAPOL", log.Fields{"intfId": intfId, "onuId": onuId, "flowStoreCookie": flowStoreCookie})
+		log.Errorw("flowId unavailable for UL EAPOL", log.Fields{"intfId": intfID, "onuId": onuID, "flowStoreCookie": flowStoreCookie})
 		return
 	}
-	var classifierProto *openolt_pb2.Classifier
-	var actionProto *openolt_pb2.Action
-	log.Debugw("Creating UL EAPOL flow", log.Fields{"ul_classifier": uplinkClassifier, "ul_action": uplinkAction, "uplinkFlowId": uplinkFlowId})
+	var classifierProto *openoltpb2.Classifier
+	var actionProto *openoltpb2.Action
+	log.Debugw("Creating UL EAPOL flow", log.Fields{"ul_classifier": uplinkClassifier, "ul_action": uplinkAction, "uplinkFlowId": uplinkFlowID})
 
 	if classifierProto = makeOpenOltClassifierField(uplinkClassifier); classifierProto == nil {
 		log.Error("Error in making classifier protobuf for ul flow")
@@ -512,15 +552,15 @@
 		return
 	}
 	log.Debugw("Created action proto", log.Fields{"action": *actionProto})
-	networkIntfId := f.deviceHandler.nniIntfId
-	upstreamFlow = openolt_pb2.Flow{AccessIntfId: int32(intfId),
-		OnuId:         int32(onuId),
-		UniId:         int32(uniId),
-		FlowId:        uplinkFlowId,
+	networkIntfID := f.deviceHandler.nniIntfID
+	upstreamFlow = openoltpb2.Flow{AccessIntfId: int32(intfID),
+		OnuId:         int32(onuID),
+		UniId:         int32(uniID),
+		FlowId:        uplinkFlowID,
 		FlowType:      UPSTREAM,
-		AllocId:       int32(allocId),
-		NetworkIntfId: int32(networkIntfId),
-		GemportId:     int32(gemPortId),
+		AllocId:       int32(allocID),
+		NetworkIntfId: int32(networkIntfID),
+		GemportId:     int32(gemPortID),
 		Classifier:    classifierProto,
 		Action:        actionProto,
 		Priority:      int32(logicalFlow.Priority),
@@ -529,7 +569,7 @@
 	if ok := f.addFlowToDevice(logicalFlow, &upstreamFlow); ok {
 		log.Debug("EAPOL UL flow added to device successfully")
 		flowCategory := "EAPOL"
-		flowsToKVStore := f.getUpdatedFlowInfo(&upstreamFlow, flowStoreCookie, flowCategory, uplinkFlowId)
+		flowsToKVStore := f.getUpdatedFlowInfo(&upstreamFlow, flowStoreCookie, flowCategory, uplinkFlowID)
 		if err := f.updateFlowInfoToKVStore(upstreamFlow.AccessIntfId,
 			upstreamFlow.OnuId,
 			upstreamFlow.UniId,
@@ -541,7 +581,7 @@
 		}
 	}
 
-	if vlanId == DEFAULT_MGMT_VLAN {
+	if vlanID == DefaultMgmtVlan {
 		/* Add Downstream EAPOL Flow, Only for first EAP flow (BAL
 		# requirement)
 		# On one of the platforms (Broadcom BAL), when same DL classifier
@@ -551,8 +591,8 @@
 		# onu_id and uniId is used.
 		# uniId defaults to 0, so add 1 to it.
 		*/
-		log.Debugw("Creating DL EAPOL flow with default vlan", log.Fields{"vlan": vlanId})
-		specialVlanDlFlow := 4090 - intfId*onuId*(uniId+1)
+		log.Debugw("Creating DL EAPOL flow with default vlan", log.Fields{"vlan": vlanID})
+		specialVlanDlFlow := 4090 - intfID*onuID*(uniID+1)
 		// Assert that we do not generate invalid vlans under no condition
 		if specialVlanDlFlow <= 2 {
 			log.Fatalw("invalid-vlan-generated", log.Fields{"vlan": specialVlanDlFlow})
@@ -560,20 +600,20 @@
 		}
 		log.Debugw("specialVlanEAPOLDlFlow:", log.Fields{"dl_vlan": specialVlanDlFlow})
 		// Fill Classfier
-		downlinkClassifier[PACKET_TAG_TYPE] = SINGLE_TAG
-		downlinkClassifier[VLAN_VID] = uint32(specialVlanDlFlow)
+		downlinkClassifier[PacketTagType] = SingleTag
+		downlinkClassifier[VlanVid] = uint32(specialVlanDlFlow)
 		// Fill action
-		downlinkAction[PUSH_VLAN] = true
-		downlinkAction[VLAN_VID] = vlanId
-		flowStoreCookie := getFlowStoreCookie(downlinkClassifier, gemPortId)
-		downlinkFlowId, err := f.resourceMgr.GetFlowID(intfId, onuId, uniId, flowStoreCookie, "")
+		downlinkAction[PushVlan] = true
+		downlinkAction[VlanVid] = vlanID
+		flowStoreCookie := getFlowStoreCookie(downlinkClassifier, gemPortID)
+		downlinkFlowID, err := f.resourceMgr.GetFlowID(intfID, onuID, uniID, flowStoreCookie, "")
 		if err != nil {
 			log.Errorw("flowId unavailable for DL EAPOL",
-				log.Fields{"intfId": intfId, "onuId": onuId, "flowStoreCookie": flowStoreCookie})
+				log.Fields{"intfId": intfID, "onuId": onuID, "flowStoreCookie": flowStoreCookie})
 			return
 		}
 		log.Debugw("Creating DL EAPOL flow",
-			log.Fields{"dl_classifier": downlinkClassifier, "dl_action": downlinkAction, "downlinkFlowId": downlinkFlowId})
+			log.Fields{"dl_classifier": downlinkClassifier, "dl_action": downlinkAction, "downlinkFlowId": downlinkFlowID})
 		if classifierProto = makeOpenOltClassifierField(downlinkClassifier); classifierProto == nil {
 			log.Error("Error in making classifier protobuf for downlink flow")
 			return
@@ -583,14 +623,14 @@
 			return
 		}
 		// Downstream flow in grpc protobuf
-		downstreamFlow = openolt_pb2.Flow{AccessIntfId: int32(intfId),
-			OnuId:         int32(onuId),
-			UniId:         int32(uniId),
-			FlowId:        downlinkFlowId,
+		downstreamFlow = openoltpb2.Flow{AccessIntfId: int32(intfID),
+			OnuId:         int32(onuID),
+			UniId:         int32(uniID),
+			FlowId:        downlinkFlowID,
 			FlowType:      DOWNSTREAM,
-			AllocId:       int32(allocId),
-			NetworkIntfId: int32(networkIntfId),
-			GemportId:     int32(gemPortId),
+			AllocId:       int32(allocID),
+			NetworkIntfId: int32(networkIntfID),
+			GemportId:     int32(gemPortID),
 			Classifier:    classifierProto,
 			Action:        actionProto,
 			Priority:      int32(logicalFlow.Priority),
@@ -599,7 +639,7 @@
 		if ok := f.addFlowToDevice(logicalFlow, &downstreamFlow); ok {
 			log.Debug("EAPOL DL flow added to device successfully")
 			flowCategory := ""
-			flowsToKVStore := f.getUpdatedFlowInfo(&downstreamFlow, flowStoreCookie, flowCategory, downlinkFlowId)
+			flowsToKVStore := f.getUpdatedFlowInfo(&downstreamFlow, flowStoreCookie, flowCategory, downlinkFlowID)
 			if err := f.updateFlowInfoToKVStore(downstreamFlow.AccessIntfId,
 				downstreamFlow.OnuId,
 				downstreamFlow.UniId,
@@ -611,46 +651,46 @@
 			}
 		}
 	} else {
-		log.Infow("EAPOL flow with non-default mgmt vlan is not supported", log.Fields{"vlanId": vlanId})
+		log.Infow("EAPOL flow with non-default mgmt vlan is not supported", log.Fields{"vlanId": vlanID})
 		return
 	}
 	log.Debugw("Added EAPOL flows to device successfully", log.Fields{"flow": logicalFlow})
 }
 
-func makeOpenOltClassifierField(classifierInfo map[string]interface{}) *openolt_pb2.Classifier {
-	var classifier openolt_pb2.Classifier
-	if etherType, ok := classifierInfo[ETH_TYPE]; ok {
+func makeOpenOltClassifierField(classifierInfo map[string]interface{}) *openoltpb2.Classifier {
+	var classifier openoltpb2.Classifier
+	if etherType, ok := classifierInfo[EthType]; ok {
 		classifier.EthType = etherType.(uint32)
 	}
-	if ipProto, ok := classifierInfo[IP_PROTO]; ok {
+	if ipProto, ok := classifierInfo[IPProto]; ok {
 		classifier.IpProto = ipProto.(uint32)
 	}
-	if vlanId, ok := classifierInfo[VLAN_VID]; ok {
-		classifier.OVid = (vlanId.(uint32)) & 0xFFF
+	if vlanID, ok := classifierInfo[VlanVid]; ok {
+		classifier.OVid = (vlanID.(uint32)) & 0xFFF
 	}
 	if metadata, ok := classifierInfo[METADATA]; ok { // TODO: Revisit
 		classifier.IVid = uint32(metadata.(uint64))
 	}
-	if vlanPcp, ok := classifierInfo[VLAN_PCP]; ok {
+	if vlanPcp, ok := classifierInfo[VlanPcp]; ok {
 		classifier.OPbits = vlanPcp.(uint32)
 	}
-	if udpSrc, ok := classifierInfo[UDP_SRC]; ok {
+	if udpSrc, ok := classifierInfo[UDPSrc]; ok {
 		classifier.SrcPort = udpSrc.(uint32)
 	}
-	if udpDst, ok := classifierInfo[UDP_DST]; ok {
+	if udpDst, ok := classifierInfo[UDPDst]; ok {
 		classifier.DstPort = udpDst.(uint32)
 	}
-	if ipv4Dst, ok := classifierInfo[IPV4_DST]; ok {
+	if ipv4Dst, ok := classifierInfo[Ipv4Dst]; ok {
 		classifier.DstIp = ipv4Dst.(uint32)
 	}
-	if ipv4Src, ok := classifierInfo[IPV4_SRC]; ok {
+	if ipv4Src, ok := classifierInfo[Ipv4Src]; ok {
 		classifier.SrcIp = ipv4Src.(uint32)
 	}
-	if pktTagType, ok := classifierInfo[PACKET_TAG_TYPE]; ok {
-		if pktTagType.(string) == SINGLE_TAG {
-			classifier.PktTagType = SINGLE_TAG
-		} else if pktTagType.(string) == DOUBLE_TAG {
-			classifier.PktTagType = DOUBLE_TAG
+	if pktTagType, ok := classifierInfo[PacketTagType]; ok {
+		if pktTagType.(string) == SingleTag {
+			classifier.PktTagType = SingleTag
+		} else if pktTagType.(string) == DoubleTag {
+			classifier.PktTagType = DoubleTag
 		} else if pktTagType.(string) == UNTAGGED {
 			classifier.PktTagType = UNTAGGED
 		} else {
@@ -661,18 +701,18 @@
 	return &classifier
 }
 
-func makeOpenOltActionField(actionInfo map[string]interface{}) *openolt_pb2.Action {
-	var actionCmd openolt_pb2.ActionCmd
-	var action openolt_pb2.Action
+func makeOpenOltActionField(actionInfo map[string]interface{}) *openoltpb2.Action {
+	var actionCmd openoltpb2.ActionCmd
+	var action openoltpb2.Action
 	action.Cmd = &actionCmd
-	if _, ok := actionInfo[POP_VLAN]; ok {
-		action.OVid = actionInfo[VLAN_VID].(uint32)
+	if _, ok := actionInfo[PopVlan]; ok {
+		action.OVid = actionInfo[VlanVid].(uint32)
 		action.Cmd.RemoveOuterTag = true
-	} else if _, ok := actionInfo[PUSH_VLAN]; ok {
-		action.OVid = actionInfo[VLAN_VID].(uint32)
+	} else if _, ok := actionInfo[PushVlan]; ok {
+		action.OVid = actionInfo[VlanVid].(uint32)
 		action.Cmd.AddOuterTag = true
-	} else if _, ok := actionInfo[TRAP_TO_HOST]; ok {
-		action.Cmd.TrapToHost = actionInfo[TRAP_TO_HOST].(bool)
+	} else if _, ok := actionInfo[TrapToHost]; ok {
+		action.Cmd.TrapToHost = actionInfo[TrapToHost].(bool)
 	} else {
 		log.Errorw("Invalid-action-field", log.Fields{"action": actionInfo})
 		return nil
@@ -680,17 +720,17 @@
 	return &action
 }
 
-func (f *OpenOltFlowMgr) getTPpath(intfId uint32, uni string) string {
+func (f *OpenOltFlowMgr) getTPpath(intfID uint32, uni string) string {
 	/*
 	   FIXME
 	   Should get Table id form the flow, as of now hardcoded to DEFAULT_TECH_PROFILE_TABLE_ID (64)
 	   'tp_path' contains the suffix part of the tech_profile_instance path. The prefix to the 'tp_path' should be set to
 	   TechProfile.KV_STORE_TECH_PROFILE_PATH_PREFIX by the ONU adapter.
 	*/
-	return f.techprofile[intfId].GetTechProfileInstanceKVPath(tp.DEFAULT_TECH_PROFILE_TABLE_ID, uni)
+	return f.techprofile[intfID].GetTechProfileInstanceKVPath(tp.DEFAULT_TECH_PROFILE_TABLE_ID, uni)
 }
 
-func getFlowStoreCookie(classifier map[string]interface{}, gemPortId uint32) uint64 {
+func getFlowStoreCookie(classifier map[string]interface{}, gemPortID uint32) uint64 {
 	if len(classifier) == 0 { // should never happen
 		log.Error("Invalid classfier object")
 		return 0
@@ -704,33 +744,35 @@
 		return 0
 	}
 	flowString = string(jsonData)
-	if gemPortId != 0 {
-		flowString = fmt.Sprintf("%s%s", string(jsonData), string(gemPortId))
+	if gemPortID != 0 {
+		flowString = fmt.Sprintf("%s%s", string(jsonData), string(gemPortID))
 	}
 	h := md5.New()
-	h.Write([]byte(flowString))
+	_, _ = h.Write([]byte(flowString))
 	hash := big.NewInt(0)
 	hash.SetBytes(h.Sum(nil))
 	return hash.Uint64()
 }
 
-func (f *OpenOltFlowMgr) getUpdatedFlowInfo(flow *openolt_pb2.Flow, flowStoreCookie uint64, flowCategory string, deviceFlowId uint32) *[]rsrcMgr.FlowInfo {
-	var flows []rsrcMgr.FlowInfo = []rsrcMgr.FlowInfo{rsrcMgr.FlowInfo{Flow: flow, FlowCategory: flowCategory, FlowStoreCookie: flowStoreCookie}}
-	var intfId uint32
+func (f *OpenOltFlowMgr) getUpdatedFlowInfo(flow *openoltpb2.Flow, flowStoreCookie uint64, flowCategory string, deviceFlowID uint32) *[]rsrcMgr.FlowInfo {
+	var flows = []rsrcMgr.FlowInfo{{Flow: flow, FlowCategory: flowCategory, FlowStoreCookie: flowStoreCookie}}
+	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 .
 	*/
 	if flow.AccessIntfId != -1 {
-		intfId = uint32(flow.AccessIntfId)
+		intfID = uint32(flow.AccessIntfId)
 	} else {
-		intfId = uint32(flow.NetworkIntfId)
+		intfID = uint32(flow.NetworkIntfId)
 	}
-	existingFlows := f.resourceMgr.GetFlowIDInfo(intfId, uint32(flow.OnuId), uint32(flow.UniId), flow.FlowId)
+	// Get existing flows matching flowid for given subscriber from KV store
+	existingFlows := f.resourceMgr.GetFlowIDInfo(intfID, uint32(flow.OnuId), uint32(flow.UniId), flow.FlowId)
 	if existingFlows != nil {
 		log.Debugw("Flow exists for given flowID, appending it to current flow", log.Fields{"flowID": flow.FlowId})
-		for _, f := range *existingFlows {
-			flows = append(flows, f)
-		}
+		//for _, f := range *existingFlows {
+		//	flows = append(flows, f)
+		//}
+		flows = append(flows, *existingFlows...)
 	}
 	log.Debugw("Updated flows for given flowID and onuid", log.Fields{"updatedflow": flows, "flowid": flow.FlowId, "onu": flow.OnuId})
 	return &flows
@@ -759,9 +801,9 @@
 //	return &flows
 //}
 
-func (f *OpenOltFlowMgr) updateFlowInfoToKVStore(intfId int32, onuId int32, uniId int32, flowId uint32, flows *[]rsrcMgr.FlowInfo) error {
+func (f *OpenOltFlowMgr) updateFlowInfoToKVStore(intfID int32, onuID int32, uniID int32, flowID uint32, flows *[]rsrcMgr.FlowInfo) error {
 	log.Debugw("Storing flow(s) into KV store", log.Fields{"flows": *flows})
-	if err := f.resourceMgr.UpdateFlowIDInfo(intfId, onuId, uniId, flowId, flows); err != nil {
+	if err := f.resourceMgr.UpdateFlowIDInfo(intfID, onuID, uniID, flowID, flows); err != nil {
 		log.Debug("Error while Storing flow into KV store")
 		return err
 	}
@@ -769,26 +811,27 @@
 	return nil
 }
 
-func (f *OpenOltFlowMgr) addFlowToDevice(logicalFlow *ofp.OfpFlowStats, deviceFlow *openolt_pb2.Flow) bool {
+func (f *OpenOltFlowMgr) addFlowToDevice(logicalFlow *ofp.OfpFlowStats, deviceFlow *openoltpb2.Flow) bool {
 	log.Debugw("Sending flow to device via grpc", log.Fields{"flow": *deviceFlow})
 	_, err := f.deviceHandler.Client.FlowAdd(context.Background(), deviceFlow)
 	if err != nil {
 		log.Errorw("Failed to Add flow to device", log.Fields{"err": err, "deviceFlow": deviceFlow})
 		return false
 	}
-	log.Debugw("Flow added to device successfuly ", log.Fields{"flow": *deviceFlow})
+	log.Debugw("Flow added to device successfully ", log.Fields{"flow": *deviceFlow})
+	log.Debugw("Flow added to device successfully ", log.Fields{"flow": *deviceFlow})
 	f.registerFlow(logicalFlow, deviceFlow)
 	return true
 }
 
-func (f *OpenOltFlowMgr) removeFlowFromDevice(deviceFlow *openolt_pb2.Flow) bool {
+func (f *OpenOltFlowMgr) removeFlowFromDevice(deviceFlow *openoltpb2.Flow) bool {
 	log.Debugw("Sending flow to device via grpc", log.Fields{"flow": *deviceFlow})
 	_, err := f.deviceHandler.Client.FlowRemove(context.Background(), deviceFlow)
 	if err != nil {
 		log.Errorw("Failed to Remove flow from device", log.Fields{"err": err, "deviceFlow": deviceFlow})
 		return false
 	}
-	log.Debugw("Flow removed from device successfuly ", log.Fields{"flow": *deviceFlow})
+	log.Debugw("Flow removed from device successfully ", log.Fields{"flow": *deviceFlow})
 	return true
 }
 
@@ -813,18 +856,20 @@
 */
 
 func addLLDPFlow(flow *ofp.OfpFlowStats, portNo uint32) {
-	log.Info("Unimplemented")
-}
-func getUniPortPath(intfId uint32, onuId uint32, uniId uint32) string {
-	return fmt.Sprintf("pon-{%d}/onu-{%d}/uni-{%d}", intfId, onuId, uniId)
+	log.Info("unimplemented flow : %v, portNo : %v ", flow, portNo)
 }
 
-func (f *OpenOltFlowMgr) getOnuChildDevice(intfId uint32, onuId uint32) (*voltha.Device, error) {
-	log.Debugw("GetChildDevice", log.Fields{"pon port": intfId, "onuId": onuId})
-	parentPortNo := IntfIdToPortNo(intfId, voltha.Port_PON_OLT)
-	onuDevice := f.deviceHandler.GetChildDevice(parentPortNo, onuId)
+func getUniPortPath(intfID uint32, onuID uint32, uniID uint32) string {
+	return fmt.Sprintf("pon-{%d}/onu-{%d}/uni-{%d}", intfID, onuID, uniID)
+}
+
+//getOnuChildDevice to fetch onu
+func (f *OpenOltFlowMgr) getOnuChildDevice(intfID uint32, onuID uint32) (*voltha.Device, error) {
+	log.Debugw("GetChildDevice", log.Fields{"pon port": intfID, "onuId": onuID})
+	parentPortNo := IntfIDToPortNo(intfID, voltha.Port_PON_OLT)
+	onuDevice := f.deviceHandler.GetChildDevice(parentPortNo, onuID)
 	if onuDevice == nil {
-		log.Errorw("onu not found", log.Fields{"intfId": parentPortNo, "onuId": onuId})
+		log.Errorw("onu not found", log.Fields{"intfId": parentPortNo, "onuId": onuID})
 		return nil, errors.New("onu not found")
 	}
 	log.Debugw("Successfully received child device from core", log.Fields{"child_device": *onuDevice})
@@ -832,41 +877,41 @@
 }
 
 func findNextFlow(flow *ofp.OfpFlowStats) *ofp.OfpFlowStats {
-	log.Info("Unimplemented")
+	log.Info("unimplemented flow : %v", flow)
 	return nil
 }
 
 func getSubscriberVlan(inPort uint32) uint32 {
 	/* For EAPOL case we will use default VLAN , so will implement later if required */
-	log.Info("Unimplemented")
+	log.Info("unimplemented inport %v", inPort)
 	return 0
 }
 
-func (f *OpenOltFlowMgr) clear_flows_and_scheduler_for_logical_port(childDevice *voltha.Device, logicalPort *voltha.LogicalPort) {
-	log.Info("Unimplemented")
+func (f *OpenOltFlowMgr) clearFlowsAndSchedulerForLogicalPort(childDevice *voltha.Device, logicalPort *voltha.LogicalPort) {
+	log.Info("unimplemented device %v, logicalport %v", childDevice, logicalPort)
 }
 
-func (f *OpenOltFlowMgr) decodeStoredId(id uint64) (uint64, string) {
+func (f *OpenOltFlowMgr) decodeStoredID(id uint64) (uint64, string) {
 	if id>>15 == 0x1 {
 		return id & 0x7fff, UPSTREAM
 	}
 	return id, DOWNSTREAM
 }
 
-func (f *OpenOltFlowMgr) clearFlowFromResourceManager(flow *ofp.OfpFlowStats, flowId uint32, flowDirection string) {
-	log.Debugw("clearFlowFromResourceManager", log.Fields{"flowId": flowId, "flowDirection": flowDirection, "flow": *flow})
-	ponIntf, onuId, uniId, err := FlowExtractInfo(flow, flowDirection)
+func (f *OpenOltFlowMgr) clearFlowFromResourceManager(flow *ofp.OfpFlowStats, flowID uint32, flowDirection string) {
+	log.Debugw("clearFlowFromResourceManager", log.Fields{"flowID": flowID, "flowDirection": flowDirection, "flow": *flow})
+	ponIntf, onuID, uniID, err := FlowExtractInfo(flow, flowDirection)
 	if err != nil {
 		log.Error(err)
 		return
 	}
 	log.Debugw("Extracted access info from flow to be deleted",
-		log.Fields{"ponIntf": ponIntf, "onuId": onuId, "uniId": uniId, "flowId": flowId})
+		log.Fields{"ponIntf": ponIntf, "onuID": onuID, "uniID": uniID, "flowID": flowID})
 
-	flowsInfo := f.resourceMgr.GetFlowIDInfo(ponIntf, onuId, uniId, flowId)
+	flowsInfo := f.resourceMgr.GetFlowIDInfo(ponIntf, onuID, uniID, flowID)
 	if flowsInfo == nil {
 		log.Debugw("No FlowInfo found found in KV store",
-			log.Fields{"ponIntf": ponIntf, "onuId": onuId, "uniId": uniId, "flowId": flowId})
+			log.Fields{"ponIntf": ponIntf, "onuID": onuID, "uniID": uniID, "flowID": flowID})
 		return
 	}
 	var updatedFlows []rsrcMgr.FlowInfo
@@ -889,17 +934,18 @@
 		// So the flow should not be freed yet.
 		// For ex: Case of HSIA where same flow is shared
 		// between DS and US.
-		f.updateFlowInfoToKVStore(int32(ponIntf), int32(onuId), int32(uniId), flowId, &updatedFlows)
+		f.updateFlowInfoToKVStore(int32(ponIntf), int32(onuID), int32(uniID), flowID, &updatedFlows)
 		return
 	}
-	log.Debugw("Releasing flow Id to resource manager", log.Fields{"ponIntf": ponIntf, "onuId": onuId, "uniId": uniId, "flowId": flowId})
-	f.resourceMgr.FreeFlowID(ponIntf, onuId, uniId, flowId)
-	flowIds := f.resourceMgr.GetCurrentFlowIDsForOnu(ponIntf, onuId, uniId)
+	log.Debugw("Releasing flow Id to resource manager", log.Fields{"ponIntf": ponIntf, "onuID": onuID, "uniID": uniID, "flowID": flowID})
+	f.resourceMgr.FreeFlowID(ponIntf, onuID, uniID, flowID)
+	flowIds := f.resourceMgr.GetCurrentFlowIDsForOnu(ponIntf, onuID, uniID)
 	if len(flowIds) == 0 {
 		/* TODO: Remove Upstream and Downstream Schedulers */
 	}
 }
 
+//RemoveFlow removes the flow from the device
 func (f *OpenOltFlowMgr) RemoveFlow(flow *ofp.OfpFlowStats) {
 	log.Debugw("Removing Flow", log.Fields{"flow": flow})
 	var deviceFlowsToRemove []ofp.OfpFlowStats
@@ -912,8 +958,8 @@
 	}
 	log.Debugw("Flows to be deleted", log.Fields{"deviceFlowsToRemove": deviceFlowsToRemove})
 	for index, curFlow := range deviceFlowsToRemove {
-		id, direction := f.decodeStoredId(curFlow.GetId())
-		removeFlowMessage := openolt_pb2.Flow{FlowId: uint32(id), FlowType: direction}
+		id, direction := f.decodeStoredID(curFlow.GetId())
+		removeFlowMessage := openoltpb2.Flow{FlowId: uint32(id), FlowType: direction}
 		if ok := f.removeFlowFromDevice(&removeFlowMessage); ok {
 			log.Debug("Flow removed from device successfully")
 			deletedFlowsIdx = append(deletedFlowsIdx, index)
@@ -936,107 +982,25 @@
 	return
 }
 
+// AddFlow add flow to device
 func (f *OpenOltFlowMgr) AddFlow(flow *ofp.OfpFlowStats) {
-	classifierInfo := make(map[string]interface{}, 0)
-	actionInfo := make(map[string]interface{}, 0)
+	classifierInfo := make(map[string]interface{})
+	actionInfo := make(map[string]interface{})
 	log.Debug("Adding Flow", log.Fields{"flow": flow})
 	for _, field := range utils.GetOfbFields(flow) {
-		if field.Type == utils.ETH_TYPE {
-			classifierInfo[ETH_TYPE] = field.GetEthType()
-			log.Debug("field-type-eth-type", log.Fields{"classifierInfo[ETH_TYPE]": classifierInfo[ETH_TYPE].(uint32)})
-		} else if field.Type == utils.IP_PROTO {
-			classifierInfo[IP_PROTO] = field.GetIpProto()
-			log.Debug("field-type-ip-proto", log.Fields{"classifierInfo[IP_PROTO]": classifierInfo[IP_PROTO].(uint32)})
-		} else if field.Type == utils.IN_PORT {
-			classifierInfo[IN_PORT] = field.GetPort()
-			log.Debug("field-type-in-port", log.Fields{"classifierInfo[IN_PORT]": classifierInfo[IN_PORT].(uint32)})
-		} else if field.Type == utils.VLAN_VID {
-			classifierInfo[VLAN_VID] = field.GetVlanVid()
-			log.Debug("field-type-vlan-vid", log.Fields{"classifierInfo[VLAN_VID]": classifierInfo[VLAN_VID].(uint32)})
-		} else if field.Type == utils.VLAN_PCP {
-			classifierInfo[VLAN_PCP] = field.GetVlanPcp()
-			log.Debug("field-type-vlan-pcp", log.Fields{"classifierInfo[VLAN_PCP]": classifierInfo[VLAN_PCP].(uint32)})
-		} else if field.Type == utils.UDP_DST {
-			classifierInfo[UDP_DST] = field.GetUdpDst()
-			log.Debug("field-type-udp-dst", log.Fields{"classifierInfo[UDP_DST]": classifierInfo[UDP_DST].(uint32)})
-		} else if field.Type == utils.UDP_SRC {
-			classifierInfo[UDP_SRC] = field.GetUdpSrc()
-			log.Debug("field-type-udp-src", log.Fields{"classifierInfo[UDP_SRC]": classifierInfo[UDP_SRC].(uint32)})
-		} else if field.Type == utils.IPV4_DST {
-			classifierInfo[IPV4_DST] = field.GetIpv4Dst()
-			log.Debug("field-type-ipv4-dst", log.Fields{"classifierInfo[IPV4_DST]": classifierInfo[IPV4_DST].(uint32)})
-		} else if field.Type == utils.IPV4_SRC {
-			classifierInfo[IPV4_SRC] = field.GetIpv4Src()
-			log.Debug("field-type-ipv4-src", log.Fields{"classifierInfo[IPV4_SRC]": classifierInfo[IPV4_SRC].(uint32)})
-		} else if field.Type == utils.METADATA {
-			classifierInfo[METADATA] = field.GetTableMetadata()
-			log.Debug("field-type-metadata", log.Fields{"classifierInfo[METADATA]": classifierInfo[METADATA].(uint64)})
-		} else if field.Type == utils.TUNNEL_ID {
-			classifierInfo[TUNNEL_ID] = field.GetTunnelId()
-			log.Debug("field-type-tunnelId", log.Fields{"classifierInfo[TUNNEL_ID]": classifierInfo[TUNNEL_ID].(uint64)})
-		} else {
-			log.Errorw("Un supported field type", log.Fields{"type": field.Type})
-			return
-		}
+		f.updateClassifierInfo(field, classifierInfo)
 	}
 	for _, action := range utils.GetActions(flow) {
-		if action.Type == utils.OUTPUT {
-			if out := action.GetOutput(); out != nil {
-				actionInfo[OUTPUT] = out.GetPort()
-				log.Debugw("action-type-output", log.Fields{"out_port": actionInfo[OUTPUT].(uint32)})
-			} else {
-				log.Error("Invalid output port in action")
-				return
-			}
-		} else if action.Type == utils.POP_VLAN {
-			actionInfo[POP_VLAN] = true
-			log.Debugw("action-type-pop-vlan", log.Fields{"in_port": classifierInfo[IN_PORT].(uint32)})
-		} else if action.Type == utils.PUSH_VLAN {
-			if out := action.GetPush(); out != nil {
-				if tpid := out.GetEthertype(); tpid != 0x8100 {
-					log.Errorw("Invalid ethertype in push action", log.Fields{"ethertype": actionInfo[PUSH_VLAN].(int32)})
-				} else {
-					actionInfo[PUSH_VLAN] = true
-					actionInfo[TPID] = tpid
-					log.Debugw("action-type-push-vlan",
-						log.Fields{"push_tpid": actionInfo[TPID].(uint32), "in_port": classifierInfo[IN_PORT].(uint32)})
-				}
-			}
-		} else if action.Type == utils.SET_FIELD {
-			if out := action.GetSetField(); out != nil {
-				if field := out.GetField(); field != nil {
-					if ofClass := field.GetOxmClass(); ofClass != ofp.OfpOxmClass_OFPXMC_OPENFLOW_BASIC {
-						log.Errorw("Invalid openflow class", log.Fields{"class": ofClass})
-						return
-					}
-					/*log.Debugw("action-type-set-field",log.Fields{"field": field, "in_port": classifierInfo[IN_PORT].(uint32)})*/
-					if ofbField := field.GetOfbField(); ofbField != nil {
-						if fieldtype := ofbField.GetType(); fieldtype == ofp.OxmOfbFieldTypes_OFPXMT_OFB_VLAN_VID {
-							if vlan := ofbField.GetVlanVid(); vlan != 0 {
-								actionInfo[VLAN_VID] = vlan & 0xfff
-								log.Debugw("action-set-vlan-vid", log.Fields{"actionInfo[VLAN_VID]": actionInfo[VLAN_VID].(uint32)})
-							} else {
-								log.Error("No Invalid vlan id in set vlan-vid action")
-							}
-						} else {
-							log.Errorw("unsupported-action-set-field-type", log.Fields{"type": fieldtype})
-						}
-					}
-				}
-			}
-		} else {
-			log.Errorw("Un supported action type", log.Fields{"type": action.Type})
-			return
-		}
+		f.updateFlowActionInfo(action, actionInfo, classifierInfo)
 	}
 	/* Controller bound trap flows */
 	if isControllerFlow := IsControllerBoundFlow(actionInfo[OUTPUT].(uint32)); isControllerFlow {
 		log.Debug("Controller bound trap flows, getting inport from tunnelid")
 		/* Get UNI port/ IN Port from tunnel ID field for upstream controller bound flows  */
-		if portType := IntfIdToPortTypeName(classifierInfo[IN_PORT].(uint32)); portType == voltha.Port_PON_OLT {
+		if portType := IntfIDToPortTypeName(classifierInfo[InPort].(uint32)); portType == voltha.Port_PON_OLT {
 			if uniPort := utils.GetChildPortFromTunnelId(flow); uniPort != 0 {
-				classifierInfo[IN_PORT] = uniPort
-				log.Debugw("upstream pon-to-controller-flow,inport-in-tunnelid", log.Fields{"newInPort": classifierInfo[IN_PORT].(uint32), "outPort": actionInfo[OUTPUT].(uint32)})
+				classifierInfo[InPort] = uniPort
+				log.Debugw("upstream pon-to-controller-flow,inport-in-tunnelid", log.Fields{"newInPort": classifierInfo[InPort].(uint32), "outPort": actionInfo[OUTPUT].(uint32)})
 			} else {
 				log.Error("upstream pon-to-controller-flow, NO-inport-in-tunnelid")
 				return
@@ -1045,32 +1009,32 @@
 	} else {
 		log.Debug("Non-Controller flows, getting uniport from tunnelid")
 		// Downstream flow from NNI to PON port , Use tunnel ID as new OUT port / UNI port
-		if portType := IntfIdToPortTypeName(actionInfo[OUTPUT].(uint32)); portType == voltha.Port_PON_OLT {
+		if portType := IntfIDToPortTypeName(actionInfo[OUTPUT].(uint32)); portType == voltha.Port_PON_OLT {
 			if uniPort := utils.GetChildPortFromTunnelId(flow); uniPort != 0 {
 				actionInfo[OUTPUT] = uniPort
 				log.Debugw("downstream-nni-to-pon-port-flow, outport-in-tunnelid", log.Fields{"newOutPort": actionInfo[OUTPUT].(uint32), "outPort": actionInfo[OUTPUT].(uint32)})
 			} else {
-				log.Debug("downstream-nni-to-pon-port-flow, no-outport-in-tunnelid", log.Fields{"InPort": classifierInfo[IN_PORT].(uint32), "outPort": actionInfo[OUTPUT].(uint32)})
+				log.Debug("downstream-nni-to-pon-port-flow, no-outport-in-tunnelid", log.Fields{"InPort": classifierInfo[InPort].(uint32), "outPort": actionInfo[OUTPUT].(uint32)})
 				return
 			}
 			// Upstream flow from PON to NNI port , Use tunnel ID as new IN port / UNI port
-		} else if portType := IntfIdToPortTypeName(classifierInfo[IN_PORT].(uint32)); portType == voltha.Port_PON_OLT {
+		} else if portType := IntfIDToPortTypeName(classifierInfo[InPort].(uint32)); portType == voltha.Port_PON_OLT {
 			if uniPort := utils.GetChildPortFromTunnelId(flow); uniPort != 0 {
-				classifierInfo[IN_PORT] = uniPort
+				classifierInfo[InPort] = uniPort
 				log.Debugw("upstream-pon-to-nni-port-flow, inport-in-tunnelid", log.Fields{"newInPort": actionInfo[OUTPUT].(uint32),
 					"outport": actionInfo[OUTPUT].(uint32)})
 			} else {
-				log.Debug("upstream-pon-to-nni-port-flow, no-inport-in-tunnelid", log.Fields{"InPort": classifierInfo[IN_PORT].(uint32),
+				log.Debug("upstream-pon-to-nni-port-flow, no-inport-in-tunnelid", log.Fields{"InPort": classifierInfo[InPort].(uint32),
 					"outPort": actionInfo[OUTPUT].(uint32)})
 				return
 			}
 		}
 	}
-	log.Infow("Flow ports", log.Fields{"classifierInfo_inport": classifierInfo[IN_PORT], "action_output": actionInfo[OUTPUT]})
-	portNo, intfId, onuId, uniId := ExtractAccessFromFlow(classifierInfo[IN_PORT].(uint32), actionInfo[OUTPUT].(uint32))
-	if ipProto, ok := classifierInfo[IP_PROTO]; ok {
-		if ipProto.(uint32) == IP_PROTO_DHCP {
-			if udpSrc, ok := classifierInfo[UDP_SRC]; ok {
+	log.Infow("Flow ports", log.Fields{"classifierInfo_inport": classifierInfo[InPort], "action_output": actionInfo[OUTPUT]})
+	portNo, intfID, onuID, uniID := ExtractAccessFromFlow(classifierInfo[InPort].(uint32), actionInfo[OUTPUT].(uint32))
+	if ipProto, ok := classifierInfo[IPProto]; ok {
+		if ipProto.(uint32) == IPProtoDhcp {
+			if udpSrc, ok := classifierInfo[UDPSrc]; ok {
 				if udpSrc.(uint32) == uint32(67) {
 					log.Debug("trap-dhcp-from-nni-flow")
 					f.addDHCPTrapFlowOnNNI(flow, classifierInfo, portNo)
@@ -1079,20 +1043,112 @@
 			}
 		}
 	}
-	f.divideAndAddFlow(intfId, onuId, uniId, portNo, classifierInfo, actionInfo, flow)
+	f.divideAndAddFlow(intfID, onuID, uniID, portNo, classifierInfo, actionInfo, flow)
 }
 
-func (f *OpenOltFlowMgr) sendTPDownloadMsgToChild(intfId uint32, onuId uint32, uniId uint32, uni string) error {
+func (f *OpenOltFlowMgr) updateClassifierInfo(field *ofp.OfpOxmOfbField, classifierInfo map[string]interface{}) {
+	if field.Type == utils.ETH_TYPE {
+		classifierInfo[EthType] = field.GetEthType()
+		log.Debug("field-type-eth-type", log.Fields{"classifierInfo[ETH_TYPE]": classifierInfo[EthType].(uint32)})
+	} else if field.Type == utils.IP_PROTO {
+		classifierInfo[IPProto] = field.GetIpProto()
+		log.Debug("field-type-ip-proto", log.Fields{"classifierInfo[IP_PROTO]": classifierInfo[IPProto].(uint32)})
+	} else if field.Type == utils.IN_PORT {
+		classifierInfo[InPort] = field.GetPort()
+		log.Debug("field-type-in-port", log.Fields{"classifierInfo[IN_PORT]": classifierInfo[InPort].(uint32)})
+	} else if field.Type == utils.VLAN_VID {
+		classifierInfo[VlanVid] = field.GetVlanVid()
+		log.Debug("field-type-vlan-vid", log.Fields{"classifierInfo[VLAN_VID]": classifierInfo[VlanVid].(uint32)})
+	} else if field.Type == utils.VLAN_PCP {
+		classifierInfo[VlanPcp] = field.GetVlanPcp()
+		log.Debug("field-type-vlan-pcp", log.Fields{"classifierInfo[VLAN_PCP]": classifierInfo[VlanPcp].(uint32)})
+	} else if field.Type == utils.UDP_DST {
+		classifierInfo[UDPDst] = field.GetUdpDst()
+		log.Debug("field-type-udp-dst", log.Fields{"classifierInfo[UDP_DST]": classifierInfo[UDPDst].(uint32)})
+	} else if field.Type == utils.UDP_SRC {
+		classifierInfo[UDPSrc] = field.GetUdpSrc()
+		log.Debug("field-type-udp-src", log.Fields{"classifierInfo[UDP_SRC]": classifierInfo[UDPSrc].(uint32)})
+	} else if field.Type == utils.IPV4_DST {
+		classifierInfo[Ipv4Dst] = field.GetIpv4Dst()
+		log.Debug("field-type-ipv4-dst", log.Fields{"classifierInfo[IPV4_DST]": classifierInfo[Ipv4Dst].(uint32)})
+	} else if field.Type == utils.IPV4_SRC {
+		classifierInfo[Ipv4Src] = field.GetIpv4Src()
+		log.Debug("field-type-ipv4-src", log.Fields{"classifierInfo[IPV4_SRC]": classifierInfo[Ipv4Src].(uint32)})
+	} else if field.Type == utils.METADATA {
+		classifierInfo[METADATA] = field.GetTableMetadata()
+		log.Debug("field-type-metadata", log.Fields{"classifierInfo[METADATA]": classifierInfo[METADATA].(uint64)})
+	} else if field.Type == utils.TUNNEL_ID {
+		classifierInfo[TunnelID] = field.GetTunnelId()
+		log.Debug("field-type-tunnelId", log.Fields{"classifierInfo[TUNNEL_ID]": classifierInfo[TunnelID].(uint64)})
+	} else {
+		log.Errorw("Un supported field type", log.Fields{"type": field.Type})
+		return
+	}
+}
 
-	onuDevice, err := f.getOnuChildDevice(intfId, onuId)
+func (f *OpenOltFlowMgr) updateFlowActionInfo(action *ofp.OfpAction, actionInfo map[string]interface{}, classifierInfo map[string]interface{}) {
+	if action.Type == utils.OUTPUT {
+		if out := action.GetOutput(); out != nil {
+			actionInfo[OUTPUT] = out.GetPort()
+			log.Debugw("action-type-output", log.Fields{"out_port": actionInfo[OUTPUT].(uint32)})
+		} else {
+			log.Error("Invalid output port in action")
+			return
+		}
+	} else if action.Type == utils.POP_VLAN {
+		actionInfo[PopVlan] = true
+		log.Debugw("action-type-pop-vlan", log.Fields{"in_port": classifierInfo[InPort].(uint32)})
+	} else if action.Type == utils.PUSH_VLAN {
+		if out := action.GetPush(); out != nil {
+			if tpid := out.GetEthertype(); tpid != 0x8100 {
+				log.Errorw("Invalid ethertype in push action", log.Fields{"ethertype": actionInfo[PushVlan].(int32)})
+			} else {
+				actionInfo[PushVlan] = true
+				actionInfo[TPID] = tpid
+				log.Debugw("action-type-push-vlan",
+					log.Fields{"push_tpid": actionInfo[TPID].(uint32), "in_port": classifierInfo[InPort].(uint32)})
+			}
+		}
+	} else if action.Type == utils.SET_FIELD {
+		if out := action.GetSetField(); out != nil {
+			if field := out.GetField(); field != nil {
+				if ofClass := field.GetOxmClass(); ofClass != ofp.OfpOxmClass_OFPXMC_OPENFLOW_BASIC {
+					log.Errorw("Invalid openflow class", log.Fields{"class": ofClass})
+					return
+				}
+				/*log.Debugw("action-type-set-field",log.Fields{"field": field, "in_port": classifierInfo[IN_PORT].(uint32)})*/
+				if ofbField := field.GetOfbField(); ofbField != nil {
+					if fieldtype := ofbField.GetType(); fieldtype == ofp.OxmOfbFieldTypes_OFPXMT_OFB_VLAN_VID {
+						if vlan := ofbField.GetVlanVid(); vlan != 0 {
+							actionInfo[VlanVid] = vlan & 0xfff
+							log.Debugw("action-set-vlan-vid", log.Fields{"actionInfo[VLAN_VID]": actionInfo[VlanVid].(uint32)})
+						} else {
+							log.Error("No Invalid vlan id in set vlan-vid action")
+						}
+					} else {
+						log.Errorw("unsupported-action-set-field-type", log.Fields{"type": fieldtype})
+					}
+				}
+			}
+		}
+	} else {
+		log.Errorw("Un supported action type", log.Fields{"type": action.Type})
+		return
+	}
+}
+
+//sendTPDownloadMsgToChild send payload
+func (f *OpenOltFlowMgr) sendTPDownloadMsgToChild(intfID uint32, onuID uint32, uniID uint32, uni string) error {
+
+	onuDevice, err := f.getOnuChildDevice(intfID, onuID)
 	if err != nil {
-		log.Errorw("Error while fetching Child device from core", log.Fields{"onuId": onuId})
+		log.Errorw("Error while fetching Child device from core", log.Fields{"onuId": onuID})
 		return err
 	}
 	log.Debugw("Got child device from OLT device handler", log.Fields{"device": *onuDevice})
 
-	tpPath := f.getTPpath(intfId, uni)
-	tpDownloadMsg := &ic.InterAdapterTechProfileDownloadMessage{UniId: uniId, Path: tpPath}
+	tpPath := f.getTPpath(intfID, uni)
+	tpDownloadMsg := &ic.InterAdapterTechProfileDownloadMessage{UniId: uniID, Path: tpPath}
 	log.Infow("Sending Load-tech-profile-request-to-brcm-onu-adapter", log.Fields{"msg": *tpDownloadMsg})
 	sendErr := f.deviceHandler.AdapterProxy.SendInterAdapterMessage(context.Background(),
 		tpDownloadMsg,
@@ -1111,92 +1167,94 @@
 	return nil
 }
 
-// This function adds onu info to cache
+//UpdateOnuInfo function adds onu info to cache
 func (f *OpenOltFlowMgr) UpdateOnuInfo(intfID uint32, onuID uint32, serialNum string) {
-	onu := onuInfo{intfId: intfID, onuId: onuID, serialNumber: serialNum}
-	onuIDkey := onuIdKey{intfId: intfID, onuId: onuID}
+	onu := onuInfo{intfID: intfID, onuID: onuID, serialNumber: serialNum}
+	onuIDkey := onuIDKey{intfID: intfID, onuID: onuID}
 	f.onuIds[onuIDkey] = onu
 	log.Debugw("Updated onuinfo", log.Fields{"intfID": intfID, "onuID": onuID, "serialNum": serialNum})
 }
 
-// This function stores adds GEMport to ONU map
-func (f *OpenOltFlowMgr) addGemPortToOnuInfoMap(intfId uint32, onuId uint32, gemPort uint32) {
-	onuIDkey := onuIdKey{intfId: intfId, onuId: onuId}
+//addGemPortToOnuInfoMap function stores adds GEMport to ONU map
+func (f *OpenOltFlowMgr) addGemPortToOnuInfoMap(intfID uint32, onuID uint32, gemPort uint32) {
+	onuIDkey := onuIDKey{intfID: intfID, onuID: onuID}
 	if val, ok := f.onuIds[onuIDkey]; ok {
 		onuInfo := val
-		gemPortKey := gemPortKey{intfId: intfId, gemPort: gemPort}
-		f.onuGemPortIds[gemPortKey] = onuInfo
-		log.Debugw("Cached Gemport to Onuinfo map", log.Fields{"GemPort": gemPort, "intfId": onuInfo.intfId, "onuId": onuInfo.onuId})
+		gemportKey := gemPortKey{intfID: intfID, gemPort: gemPort}
+		f.onuGemPortIds[gemportKey] = onuInfo
+		log.Debugw("Cached Gemport to Onuinfo map", log.Fields{"GemPort": gemPort, "intfId": onuInfo.intfID, "onuId": onuInfo.onuID})
 		return
 	}
-	log.Errorw("OnuInfo not found", log.Fields{"intfId": intfId, "onuId": onuId, "gemPort": gemPort})
+	log.Errorw("OnuInfo not found", log.Fields{"intfId": intfID, "onuId": onuID, "gemPort": gemPort})
 }
 
 // This function Lookup maps  by serialNumber or (intfId, gemPort)
-// Returns OnuID,nil if found or set 0,error if no onuId is found for serialNumber or (intfId, gemPort)
-func (f *OpenOltFlowMgr) getOnuIdfromGemPortMap(serialNumber string, intfId uint32, gemPortId uint32) (uint32, error) {
-	log.Debugw("Getting ONU ID from GEM port and PON port", log.Fields{"serialNumber": serialNumber, "intfId": intfId, "gemPortId": gemPortId})
+
+//getOnuIDfromGemPortMap Returns OnuID,nil if found or set 0,error if no onuId is found for serialNumber or (intfId, gemPort)
+func (f *OpenOltFlowMgr) getOnuIDfromGemPortMap(serialNumber string, intfID uint32, gemPortID uint32) (uint32, error) {
+	log.Debugw("Getting ONU ID from GEM port and PON port", log.Fields{"serialNumber": serialNumber, "intfId": intfID, "gemPortId": gemPortID})
 	if serialNumber != "" {
 		if onuInfo, ok := f.onuSerialNumbers[serialNumber]; ok {
-			return onuInfo.onuId, nil
+			return onuInfo.onuID, nil
 		}
 	} else {
-		gemPortKey := gemPortKey{intfId: intfId, gemPort: gemPortId}
-		if onuInfo, ok := f.onuGemPortIds[gemPortKey]; ok {
-			log.Debugw("Retrived onu info from access", log.Fields{"intfId": intfId, "gemPortId": gemPortId, "onuId": onuInfo.onuId})
-			return onuInfo.onuId, nil
+		gemportKey := gemPortKey{intfID: intfID, gemPort: gemPortID}
+		if onuInfo, ok := f.onuGemPortIds[gemportKey]; ok {
+			log.Debugw("Retrieved onu info from access", log.Fields{"intfId": intfID, "gemPortId": gemPortID, "onuId": onuInfo.onuID})
+			return onuInfo.onuID, nil
 		}
 	}
-	log.Errorw("ONU ID  is not found", log.Fields{"serialNumber": serialNumber, "intfId": intfId, "gemPort": gemPortId})
-	return uint32(0), errors.New("Key Error ,ONU ID  is not found") // ONU ID 0 is not a valid one
+	log.Errorw("onuid is not found", log.Fields{"serialNumber": serialNumber, "intfId": intfID, "gemPort": gemPortID})
+	return uint32(0), errors.New("key error, onuid is not found") // ONU ID 0 is not a valid one
 }
 
-// This function computes logical port UNI/NNI port from packet-in indication and returns the same
-func (f *OpenOltFlowMgr) GetLogicalPortFromPacketIn(packetIn *openolt_pb2.PacketIndication) (uint32, error) {
+//GetLogicalPortFromPacketIn function computes logical port UNI/NNI port from packet-in indication and returns the same
+func (f *OpenOltFlowMgr) GetLogicalPortFromPacketIn(packetIn *openoltpb2.PacketIndication) (uint32, error) {
 	var logicalPortNum uint32
-	var onuId uint32
+	var onuID uint32
 	var err error
 
 	if packetIn.IntfType == "pon" {
 		// packet indication does not have serial number , so sending as nil
-		if onuId, err = f.getOnuIdfromGemPortMap("", packetIn.IntfId, packetIn.GemportId); err != nil {
+		if onuID, err = f.getOnuIDfromGemPortMap("", packetIn.IntfId, packetIn.GemportId); err != nil {
 			log.Errorw("Unable to get ONU ID from GEM/PON port", log.Fields{"pon port": packetIn.IntfId, "gemport": packetIn.GemportId})
 			return logicalPortNum, err
 		}
 		if packetIn.PortNo != 0 {
 			logicalPortNum = packetIn.PortNo
 		} else {
-			uniId := uint32(0) //  FIXME - multi-uni support
-			logicalPortNum = MkUniPortNum(packetIn.IntfId, onuId, uniId)
+			uniID := uint32(0) //  FIXME - multi-uni support
+			logicalPortNum = MkUniPortNum(packetIn.IntfId, onuID, uniID)
 		}
 		// Store the gem port through which the packet_in came. Use the same gem port for packet_out
-		pktInkey := packetInInfoKey{intfId: packetIn.IntfId, onuId: onuId, logicalPort: logicalPortNum}
+		pktInkey := packetInInfoKey{intfID: packetIn.IntfId, onuID: onuID, logicalPort: logicalPortNum}
 		f.packetInGemPort[pktInkey] = packetIn.GemportId
 	} else if packetIn.IntfType == "nni" {
-		logicalPortNum = IntfIdToPortNo(packetIn.IntfId, voltha.Port_ETHERNET_NNI)
+		logicalPortNum = IntfIDToPortNo(packetIn.IntfId, voltha.Port_ETHERNET_NNI)
 	}
 	log.Debugw("Retrieved logicalport from  packet-in", log.Fields{"logicalPortNum": logicalPortNum, "IntfType": packetIn.IntfType})
 	return logicalPortNum, nil
 }
 
-func (f *OpenOltFlowMgr) GetPacketOutGemPortId(intfId uint32, onuId uint32, portNum uint32) (uint32, error) {
-	var gemPortId uint32
+//GetPacketOutGemPortID returns gemPortId
+func (f *OpenOltFlowMgr) GetPacketOutGemPortID(intfID uint32, onuID uint32, portNum uint32) (uint32, error) {
+	var gemPortID uint32
 	var err error
-	key := packetInInfoKey{intfId: intfId, onuId: onuId, logicalPort: portNum}
+	key := packetInInfoKey{intfID: intfID, onuID: onuID, logicalPort: portNum}
 	if val, ok := f.packetInGemPort[key]; ok {
-		gemPortId = val
+		gemPortID = val
 	} else {
 		log.Errorw("Key-Error while fetching packet-out GEM port", log.Fields{"key": key})
-		err = errors.New("Key-Error while fetching packet-out GEM port")
+		err = errors.New("key-error while fetching packet-out GEM port")
 	}
-	return gemPortId, err
+	return gemPortID, err
 }
 
 func (f *OpenOltFlowMgr) addDHCPTrapFlowOnNNI(logicalFlow *ofp.OfpFlowStats, classifier map[string]interface{}, portNo uint32) {
 	log.Debug("Adding trap-dhcp-of-nni-flow")
 	action := make(map[string]interface{})
-	classifier[PACKET_TAG_TYPE] = DOUBLE_TAG
-	action[TRAP_TO_HOST] = true
+	classifier[PacketTagType] = DoubleTag
+	action[TrapToHost] = true
 	/* We manage flowId resource pool on per PON port basis.
 	   Since this situation is tricky, as a hack, we pass the NNI port
 	   index (network_intf_id) as PON port Index for the flowId resource
@@ -1208,23 +1266,23 @@
 	   we need to have a re-look at this.
 	   *********************************************
 	*/
-	onuId := -1
-	uniId := -1
-	gemPortId := -1
-	allocId := -1
-	networkInterfaceId := f.deviceHandler.nniIntfId
+	onuID := -1
+	uniID := -1
+	gemPortID := -1
+	allocID := -1
+	networkInterfaceID := f.deviceHandler.nniIntfID
 	flowStoreCookie := getFlowStoreCookie(classifier, uint32(0))
-	if present := f.resourceMgr.IsFlowCookieOnKVStore(uint32(networkInterfaceId), uint32(onuId), uint32(uniId), flowStoreCookie); present {
+	if present := f.resourceMgr.IsFlowCookieOnKVStore(uint32(networkInterfaceID), uint32(onuID), uint32(uniID), flowStoreCookie); present {
 		log.Debug("Flow-exists--not-re-adding")
 		return
 	}
-	flowId, err := f.resourceMgr.GetFlowID(uint32(networkInterfaceId), uint32(onuId), uint32(uniId), flowStoreCookie, "")
+	flowID, err := f.resourceMgr.GetFlowID(uint32(networkInterfaceID), uint32(onuID), uint32(uniID), flowStoreCookie, "")
 	if err != nil {
 		log.Errorw("Flow id unavailable for DHCP traponNNI flow", log.Fields{"error": err})
 		return
 	}
-	var classifierProto *openolt_pb2.Classifier
-	var actionProto *openolt_pb2.Action
+	var classifierProto *openoltpb2.Classifier
+	var actionProto *openoltpb2.Action
 	if classifierProto = makeOpenOltClassifierField(classifier); classifierProto == nil {
 		log.Error("Error in making classifier protobuf for  dhcp trap on nni flow")
 		return
@@ -1235,14 +1293,14 @@
 		return
 	}
 	log.Debugw("Created action proto", log.Fields{"action": *actionProto})
-	downstreamflow := openolt_pb2.Flow{AccessIntfId: int32(-1), // AccessIntfId not required
-		OnuId:         int32(onuId), // OnuId not required
-		UniId:         int32(uniId), // UniId not used
-		FlowId:        flowId,
+	downstreamflow := openoltpb2.Flow{AccessIntfId: int32(-1), // AccessIntfId not required
+		OnuId:         int32(onuID), // OnuId not required
+		UniId:         int32(uniID), // UniId not used
+		FlowId:        flowID,
 		FlowType:      DOWNSTREAM,
-		AllocId:       int32(allocId), // AllocId not used
-		NetworkIntfId: int32(networkInterfaceId),
-		GemportId:     int32(gemPortId), // GemportId not used
+		AllocId:       int32(allocID), // AllocId not used
+		NetworkIntfId: int32(networkInterfaceID),
+		GemportId:     int32(gemPortID), // GemportId not used
 		Classifier:    classifierProto,
 		Action:        actionProto,
 		Priority:      int32(logicalFlow.Priority),
@@ -1250,11 +1308,11 @@
 		PortNo:        portNo}
 	if ok := f.addFlowToDevice(logicalFlow, &downstreamflow); ok {
 		log.Debug("DHCP trap on NNI flow added to device successfully")
-		flowsToKVStore := f.getUpdatedFlowInfo(&downstreamflow, flowStoreCookie, "", flowId)
-		if err := f.updateFlowInfoToKVStore(int32(networkInterfaceId),
-			int32(onuId),
-			int32(uniId),
-			flowId, flowsToKVStore); err != nil {
+		flowsToKVStore := f.getUpdatedFlowInfo(&downstreamflow, flowStoreCookie, "", flowID)
+		if err := f.updateFlowInfoToKVStore(int32(networkInterfaceID),
+			int32(onuID),
+			int32(uniID),
+			flowID, flowsToKVStore); err != nil {
 			log.Errorw("Error uploading DHCP DL  flow into KV store", log.Fields{"flow": downstreamflow, "error": err})
 		}
 	}
diff --git a/adaptercore/resourcemanager/resourcemanager.go b/adaptercore/resourcemanager/resourcemanager.go
index 524997a..799a733 100755
--- a/adaptercore/resourcemanager/resourcemanager.go
+++ b/adaptercore/resourcemanager/resourcemanager.go
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+//Package resourcemanager provides the utility for managing resources
 package resourcemanager
 
 import (
@@ -30,16 +31,22 @@
 	"github.com/opencord/voltha-protos/go/openolt"
 )
 
-const KVSTORE_TIMEOUT = 5
-const BASE_PATH_KV_STORE = "service/voltha/openolt/{%s}" // service/voltha/openolt/<device_id>
+// KvstoreTimeout specifies the time out for KV Store Connection
+const KvstoreTimeout = 5
 
+// BasePathKvStore - service/voltha/openolt/<device_id>
+const BasePathKvStore = "service/voltha/openolt/{%s}"
+
+// FlowInfo holds the flow information
 type FlowInfo struct {
 	Flow            *openolt.Flow
 	FlowStoreCookie uint64
 	FlowCategory    string
 }
+
+// OpenOltResourceMgr holds resource related information as provided below for each field
 type OpenOltResourceMgr struct {
-	DeviceID    string         //OLT device id
+	DeviceID    string         // OLT device id
 	HostAndPort string         // Host and port of the kv store to connect to
 	Args        string         // args
 	KVStore     *model.Backend // backend kv store connection handle
@@ -51,7 +58,7 @@
 	ResourceMgrs map[uint32]*ponrmgr.PONResourceManager
 }
 
-func newKVClient(storeType string, address string, timeout uint32) (kvstore.Client, error) {
+func newKVClient(storeType, address string, timeout uint32) (kvstore.Client, error) {
 	log.Infow("kv-store-type", log.Fields{"store": storeType})
 	switch storeType {
 	case "consul":
@@ -62,44 +69,43 @@
 	return nil, errors.New("unsupported-kv-store")
 }
 
-func SetKVClient(Backend string, Host string, Port int, DeviceID string) *model.Backend {
+// SetKVClient sets the KV client and return a kv backend
+func SetKVClient(backend string, Host string, Port int, DeviceID string) *model.Backend {
 	addr := Host + ":" + strconv.Itoa(Port)
 	// TODO : Make sure direct call to NewBackend is working fine with backend , currently there is some
 	// issue between kv store and backend , core is not calling NewBackend directly
-	kvClient, err := newKVClient(Backend, addr, KVSTORE_TIMEOUT)
+	kvClient, err := newKVClient(backend, addr, KvstoreTimeout)
 	if err != nil {
 		log.Fatalw("Failed to init KV client\n", log.Fields{"err": err})
 		return nil
 	}
 	kvbackend := &model.Backend{
 		Client:     kvClient,
-		StoreType:  Backend,
+		StoreType:  backend,
 		Host:       Host,
 		Port:       Port,
-		Timeout:    KVSTORE_TIMEOUT,
-		PathPrefix: fmt.Sprintf(BASE_PATH_KV_STORE, DeviceID)}
+		Timeout:    KvstoreTimeout,
+		PathPrefix: fmt.Sprintf(BasePathKvStore, DeviceID)}
 
 	return kvbackend
 }
 
-func NewResourceMgr(DeviceID string, KVStoreHostPort string, KVStoreType string, DeviceType string, DevInfo *openolt.DeviceInfo) *OpenOltResourceMgr {
-
-	/* init a New resource maanger instance which in turn instantiates pon resource manager
-	   instances according to technology. Initializes the default resource ranges for all
-	   the reources.
-	*/
+// NewResourceMgr init a New resource maanger instance which in turn instantiates pon resource manager
+// instances according to technology. Initializes the default resource ranges for all
+// the resources.
+func NewResourceMgr(deviceID string, KVStoreHostPort string, kvStoreType string, deviceType string, devInfo *openolt.DeviceInfo) *OpenOltResourceMgr {
 	var ResourceMgr OpenOltResourceMgr
-	log.Debugf("Init new resource manager , host_port: %s, deviceid: %s", KVStoreHostPort, DeviceID)
+	log.Debugf("Init new resource manager , host_port: %s, deviceid: %s", KVStoreHostPort, deviceID)
 	ResourceMgr.HostAndPort = KVStoreHostPort
-	ResourceMgr.DeviceType = DeviceType
-	ResourceMgr.DevInfo = DevInfo
-	IpPort := strings.Split(KVStoreHostPort, ":")
-	ResourceMgr.Host = IpPort[0]
-	ResourceMgr.Port, _ = strconv.Atoi(IpPort[1])
+	ResourceMgr.DeviceType = deviceType
+	ResourceMgr.DevInfo = devInfo
+	IPPort := strings.Split(KVStoreHostPort, ":")
+	ResourceMgr.Host = IPPort[0]
+	ResourceMgr.Port, _ = strconv.Atoi(IPPort[1])
 
-	Backend := KVStoreType
+	Backend := kvStoreType
 	ResourceMgr.KVStore = SetKVClient(Backend, ResourceMgr.Host,
-		ResourceMgr.Port, DeviceID)
+		ResourceMgr.Port, deviceID)
 	if ResourceMgr.KVStore == nil {
 		log.Error("Failed to setup KV store")
 	}
@@ -114,11 +120,11 @@
 	   the legacy global per-device informaiton. This, in theory, is temporary until
 	   the legacy drivers are upgrade to support pool ranges.
 	*/
-	if DevInfo.Ranges == nil {
+	if devInfo.Ranges == nil {
 		var ranges openolt.DeviceInfo_DeviceResourceRanges
-		ranges.Technology = DevInfo.GetTechnology()
+		ranges.Technology = devInfo.GetTechnology()
 
-		NumPONPorts := DevInfo.GetPonPorts()
+		NumPONPorts := devInfo.GetPonPorts()
 		var index uint32
 		for index = 0; index < NumPONPorts; index++ {
 			ranges.IntfIds = append(ranges.IntfIds, index)
@@ -126,76 +132,80 @@
 
 		var Pool openolt.DeviceInfo_DeviceResourceRanges_Pool
 		Pool.Type = openolt.DeviceInfo_DeviceResourceRanges_Pool_ONU_ID
-		Pool.Start = DevInfo.OnuIdStart
-		Pool.End = DevInfo.OnuIdEnd
+		Pool.Start = devInfo.OnuIdStart
+		Pool.End = devInfo.OnuIdEnd
 		Pool.Sharing = openolt.DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF
 		ranges.Pools = append(ranges.Pools, &Pool)
 
 		Pool.Type = openolt.DeviceInfo_DeviceResourceRanges_Pool_ALLOC_ID
-		Pool.Start = DevInfo.AllocIdStart
-		Pool.End = DevInfo.AllocIdEnd
+		Pool.Start = devInfo.AllocIdStart
+		Pool.End = devInfo.AllocIdEnd
 		Pool.Sharing = openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH
 		ranges.Pools = append(ranges.Pools, &Pool)
 
 		Pool.Type = openolt.DeviceInfo_DeviceResourceRanges_Pool_GEMPORT_ID
-		Pool.Start = DevInfo.GemportIdStart
-		Pool.End = DevInfo.GemportIdEnd
+		Pool.Start = devInfo.GemportIdStart
+		Pool.End = devInfo.GemportIdEnd
 		Pool.Sharing = openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH
 		ranges.Pools = append(ranges.Pools, &Pool)
 
 		Pool.Type = openolt.DeviceInfo_DeviceResourceRanges_Pool_FLOW_ID
-		Pool.Start = DevInfo.FlowIdStart
-		Pool.End = DevInfo.FlowIdEnd
+		Pool.Start = devInfo.FlowIdStart
+		Pool.End = devInfo.FlowIdEnd
 		Pool.Sharing = openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH
 		ranges.Pools = append(ranges.Pools, &Pool)
 		// Add to device info
-		DevInfo.Ranges = append(DevInfo.Ranges, &ranges)
+		devInfo.Ranges = append(devInfo.Ranges, &ranges)
 	}
 
-	//Create a separate Resource Manager instance for each range. This assumes that
+	// Create a separate Resource Manager instance for each range. This assumes that
 	// each technology is represented by only a single range
 	var GlobalPONRsrcMgr *ponrmgr.PONResourceManager
 	var err error
-	for _, TechRange := range DevInfo.Ranges {
+	for _, TechRange := range devInfo.Ranges {
 		technology := TechRange.Technology
 		log.Debugf("Device info technology %s", technology)
 		Ranges[technology] = TechRange
-		RsrcMgrsByTech[technology], err = ponrmgr.NewPONResourceManager(technology, DeviceType, DeviceID,
+		RsrcMgrsByTech[technology], err = ponrmgr.NewPONResourceManager(technology, deviceType, deviceID,
 			Backend, ResourceMgr.Host, ResourceMgr.Port)
 		if err != nil {
 			log.Errorf("Failed to create pon resource manager instacnce for technology %s", technology)
 			return nil
 		}
-		//resource_mgrs_by_tech[technology] = resource_mgr
+		// resource_mgrs_by_tech[technology] = resource_mgr
 		if GlobalPONRsrcMgr == nil {
 			GlobalPONRsrcMgr = RsrcMgrsByTech[technology]
 		}
-		for _, IntfId := range TechRange.IntfIds {
-			ResourceMgr.ResourceMgrs[uint32(IntfId)] = RsrcMgrsByTech[technology]
+		for _, IntfID := range TechRange.IntfIds {
+			ResourceMgr.ResourceMgrs[uint32(IntfID)] = RsrcMgrsByTech[technology]
 		}
-		//self.initialize_device_resource_range_and_pool(resource_mgr, global_resource_mgr, arange)
+		// self.initialize_device_resource_range_and_pool(resource_mgr, global_resource_mgr, arange)
 		InitializeDeviceResourceRangeAndPool(RsrcMgrsByTech[technology], GlobalPONRsrcMgr,
-			TechRange, DevInfo)
+			TechRange, devInfo)
 	}
 	// After we have initialized resource ranges, initialize the
 	// resource pools accordingly.
 	for _, PONRMgr := range RsrcMgrsByTech {
-		PONRMgr.InitDeviceResourcePool()
+		_ = PONRMgr.InitDeviceResourcePool()
 	}
 	log.Info("Initialization of  resource manager success!")
 	return &ResourceMgr
 }
 
-func InitializeDeviceResourceRangeAndPool(PONRMgr *ponrmgr.PONResourceManager, GlobalPONRMgr *ponrmgr.PONResourceManager,
-	TechRange *openolt.DeviceInfo_DeviceResourceRanges, DevInfo *openolt.DeviceInfo) {
+// InitializeDeviceResourceRangeAndPool initializes the resource range pool according to the sharing type, then apply
+// device specific information. If KV doesn't exist
+// or is broader than the device, the device's information will
+// dictate the range limits
+func InitializeDeviceResourceRangeAndPool(ponRMgr *ponrmgr.PONResourceManager, globalPONRMgr *ponrmgr.PONResourceManager,
+	techRange *openolt.DeviceInfo_DeviceResourceRanges, devInfo *openolt.DeviceInfo) {
 
 	// init the resource range pool according to the sharing type
 
-	log.Debugf("Resource range pool init for technology %s", PONRMgr.Technology)
-	//first load from KV profiles
-	status := PONRMgr.InitResourceRangesFromKVStore()
-	if status == false {
-		log.Debugf("Failed to load resource ranges from KV store for tech %s", PONRMgr.Technology)
+	log.Debugf("Resource range pool init for technology %s", ponRMgr.Technology)
+	// first load from KV profiles
+	status := ponRMgr.InitResourceRangesFromKVStore()
+	if !status {
+		log.Debugf("Failed to load resource ranges from KV store for tech %s", ponRMgr.Technology)
 	}
 
 	/*
@@ -203,22 +213,22 @@
 	   or is broader than the device, the device's informationw ill
 	   dictate the range limits
 	*/
-	log.Debugf("Using device info to init pon resource ranges for tech", PONRMgr.Technology)
+	log.Debugf("Using device info to init pon resource ranges for tech", ponRMgr.Technology)
 
-	ONUIDStart := DevInfo.OnuIdStart
-	ONUIDEnd := DevInfo.OnuIdEnd
+	ONUIDStart := devInfo.OnuIdStart
+	ONUIDEnd := devInfo.OnuIdEnd
 	ONUIDShared := openolt.DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF
 	ONUIDSharedPoolID := uint32(0)
-	AllocIDStart := DevInfo.AllocIdStart
-	AllocIDEnd := DevInfo.AllocIdEnd
+	AllocIDStart := devInfo.AllocIdStart
+	AllocIDEnd := devInfo.AllocIdEnd
 	AllocIDShared := openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH // TODO EdgeCore/BAL limitation
 	AllocIDSharedPoolID := uint32(0)
-	GEMPortIDStart := DevInfo.GemportIdStart
-	GEMPortIDEnd := DevInfo.GemportIdEnd
+	GEMPortIDStart := devInfo.GemportIdStart
+	GEMPortIDEnd := devInfo.GemportIdEnd
 	GEMPortIDShared := openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH // TODO EdgeCore/BAL limitation
 	GEMPortIDSharedPoolID := uint32(0)
-	FlowIDStart := DevInfo.FlowIdStart
-	FlowIDEnd := DevInfo.FlowIdEnd
+	FlowIDStart := devInfo.FlowIdStart
+	FlowIDEnd := devInfo.FlowIdEnd
 	FlowIDShared := openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH // TODO EdgeCore/BAL limitation
 	FlowIDSharedPoolID := uint32(0)
 
@@ -227,9 +237,9 @@
 
 	/*
 	 * As a zero check is made against SharedPoolID to check whether the resources are shared across all intfs
-	 * if resources are shared accross interfaces then SharedPoolID is given a positive number.
+	 * if resources are shared across interfaces then SharedPoolID is given a positive number.
 	 */
-	for _, FirstIntfPoolID = range TechRange.IntfIds {
+	for _, FirstIntfPoolID = range techRange.IntfIds {
 		// skip the intf id 0
 		if FirstIntfPoolID == 0 {
 			continue
@@ -237,7 +247,7 @@
 		break
 	}
 
-	for _, RangePool := range TechRange.Pools {
+	for _, RangePool := range techRange.Pools {
 		if RangePool.Sharing == openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH {
 			SharedPoolID = FirstIntfPoolID
 		} else if RangePool.Sharing == openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_SAME_TECH {
@@ -268,7 +278,7 @@
 		}
 	}
 
-	log.Debugw("Device info init", log.Fields{"technology": TechRange.Technology,
+	log.Debugw("Device info init", log.Fields{"technology": techRange.Technology,
 		"onu_id_start": ONUIDStart, "onu_id_end": ONUIDEnd, "onu_id_shared_pool_id": ONUIDSharedPoolID,
 		"alloc_id_start": AllocIDStart, "alloc_id_end": AllocIDEnd,
 		"alloc_id_shared_pool_id": AllocIDSharedPoolID,
@@ -277,46 +287,47 @@
 		"flow_id_start":             FlowIDStart,
 		"flow_id_end_idx":           FlowIDEnd,
 		"flow_id_shared_pool_id":    FlowIDSharedPoolID,
-		"intf_ids":                  TechRange.IntfIds,
+		"intf_ids":                  techRange.IntfIds,
 		"uni_id_start":              0,
-		"uni_id_end_idx":/*MaxUNIIDperONU()*/ 1})
+		"uni_id_end_idx":            1, /*MaxUNIIDperONU()*/
+	})
 
-	PONRMgr.InitDefaultPONResourceRanges(ONUIDStart, ONUIDEnd, ONUIDSharedPoolID,
+	ponRMgr.InitDefaultPONResourceRanges(ONUIDStart, ONUIDEnd, ONUIDSharedPoolID,
 		AllocIDStart, AllocIDEnd, AllocIDSharedPoolID,
 		GEMPortIDStart, GEMPortIDEnd, GEMPortIDSharedPoolID,
 		FlowIDStart, FlowIDEnd, FlowIDSharedPoolID, 0, 1,
-		DevInfo.PonPorts, TechRange.IntfIds)
+		devInfo.PonPorts, techRange.IntfIds)
 
 	// For global sharing, make sure to refresh both local and global resource manager instances' range
 
 	if ONUIDShared == openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH {
-		GlobalPONRMgr.UpdateRanges(ponrmgr.ONU_ID_START_IDX, ONUIDStart, ponrmgr.ONU_ID_END_IDX, ONUIDEnd,
+		globalPONRMgr.UpdateRanges(ponrmgr.ONU_ID_START_IDX, ONUIDStart, ponrmgr.ONU_ID_END_IDX, ONUIDEnd,
 			"", 0, nil)
-		PONRMgr.UpdateRanges(ponrmgr.ONU_ID_START_IDX, ONUIDStart, ponrmgr.ONU_ID_END_IDX, ONUIDEnd,
-			"", 0, GlobalPONRMgr)
+		ponRMgr.UpdateRanges(ponrmgr.ONU_ID_START_IDX, ONUIDStart, ponrmgr.ONU_ID_END_IDX, ONUIDEnd,
+			"", 0, globalPONRMgr)
 	}
 	if AllocIDShared == openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH {
-		GlobalPONRMgr.UpdateRanges(ponrmgr.ALLOC_ID_START_IDX, AllocIDStart, ponrmgr.ALLOC_ID_END_IDX, AllocIDEnd,
+		globalPONRMgr.UpdateRanges(ponrmgr.ALLOC_ID_START_IDX, AllocIDStart, ponrmgr.ALLOC_ID_END_IDX, AllocIDEnd,
 			"", 0, nil)
 
-		PONRMgr.UpdateRanges(ponrmgr.ALLOC_ID_START_IDX, AllocIDStart, ponrmgr.ALLOC_ID_END_IDX, AllocIDEnd,
-			"", 0, GlobalPONRMgr)
+		ponRMgr.UpdateRanges(ponrmgr.ALLOC_ID_START_IDX, AllocIDStart, ponrmgr.ALLOC_ID_END_IDX, AllocIDEnd,
+			"", 0, globalPONRMgr)
 	}
 	if GEMPortIDShared == openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH {
-		GlobalPONRMgr.UpdateRanges(ponrmgr.GEMPORT_ID_START_IDX, GEMPortIDStart, ponrmgr.GEMPORT_ID_END_IDX, GEMPortIDEnd,
+		globalPONRMgr.UpdateRanges(ponrmgr.GEMPORT_ID_START_IDX, GEMPortIDStart, ponrmgr.GEMPORT_ID_END_IDX, GEMPortIDEnd,
 			"", 0, nil)
-		PONRMgr.UpdateRanges(ponrmgr.GEMPORT_ID_START_IDX, GEMPortIDStart, ponrmgr.GEMPORT_ID_END_IDX, GEMPortIDEnd,
-			"", 0, GlobalPONRMgr)
+		ponRMgr.UpdateRanges(ponrmgr.GEMPORT_ID_START_IDX, GEMPortIDStart, ponrmgr.GEMPORT_ID_END_IDX, GEMPortIDEnd,
+			"", 0, globalPONRMgr)
 	}
 	if FlowIDShared == openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH {
-		GlobalPONRMgr.UpdateRanges(ponrmgr.FLOW_ID_START_IDX, FlowIDStart, ponrmgr.FLOW_ID_END_IDX, FlowIDEnd,
+		globalPONRMgr.UpdateRanges(ponrmgr.FLOW_ID_START_IDX, FlowIDStart, ponrmgr.FLOW_ID_END_IDX, FlowIDEnd,
 			"", 0, nil)
-		PONRMgr.UpdateRanges(ponrmgr.FLOW_ID_START_IDX, FlowIDStart, ponrmgr.FLOW_ID_END_IDX, FlowIDEnd,
-			"", 0, GlobalPONRMgr)
+		ponRMgr.UpdateRanges(ponrmgr.FLOW_ID_START_IDX, FlowIDStart, ponrmgr.FLOW_ID_END_IDX, FlowIDEnd,
+			"", 0, globalPONRMgr)
 	}
 
 	// Make sure loaded range fits the platform bit encoding ranges
-	PONRMgr.UpdateRanges(ponrmgr.UNI_ID_START_IDX, 0, ponrmgr.UNI_ID_END_IDX /* TODO =OpenOltPlatform.MAX_UNIS_PER_ONU-1*/, 1, "", 0, nil)
+	ponRMgr.UpdateRanges(ponrmgr.UNI_ID_START_IDX, 0, ponrmgr.UNI_ID_END_IDX /* TODO =OpenOltPlatform.MAX_UNIS_PER_ONU-1*/, 1, "", 0, nil)
 }
 
 /* TODO
@@ -341,35 +352,35 @@
         self.resource_mgrs[pon_intf_id].assert_resource_limits(uni_id, PONResourceManager.UNI_ID)
 */
 
-func (RsrcMgr *OpenOltResourceMgr) GetONUID(PONIntfID uint32) (uint32, error) {
+// GetONUID returns the available OnuID for the given pon-port
+func (RsrcMgr *OpenOltResourceMgr) GetONUID(ponIntfID uint32) (uint32, error) {
 
 	// Get ONU id for a provided pon interface ID.
 
-	ONUID, err := RsrcMgr.ResourceMgrs[PONIntfID].GetResourceID(PONIntfID,
+	ONUID, err := RsrcMgr.ResourceMgrs[ponIntfID].GetResourceID(ponIntfID,
 		ponrmgr.ONU_ID, 1)
 	if err != nil {
 		log.Errorf("Failed to get resource for interface %d for type %s",
-			PONIntfID, ponrmgr.ONU_ID)
+			ponIntfID, ponrmgr.ONU_ID)
 		return ONUID[0], err
 	}
 	if ONUID != nil {
-		RsrcMgr.ResourceMgrs[PONIntfID].InitResourceMap(fmt.Sprintf("%d,%d", PONIntfID, ONUID))
+		RsrcMgr.ResourceMgrs[ponIntfID].InitResourceMap(fmt.Sprintf("%d,%d", ponIntfID, ONUID))
+		return ONUID[0], err
 	}
 
-	return ONUID[0], err
+	return 0, err // return OnuID 0 on error
 }
 
-func (RsrcMgr *OpenOltResourceMgr) GetFlowIDInfo(PONIntfID uint32, ONUID uint32, UNIID uint32, FlowID uint32) *[]FlowInfo {
-
-	/*
-	   Note: For flows which trap from the NNI and not really associated with any particular
-	   ONU (like LLDP), the onu_id and uni_id is set as -1. The intf_id is the NNI intf_id.
-	*/
+// GetFlowIDInfo returns the slice of flow info of the given pon-port
+// Note: For flows which trap from the NNI and not really associated with any particular
+// ONU (like LLDP), the onu_id and uni_id is set as -1. The intf_id is the NNI intf_id.
+func (RsrcMgr *OpenOltResourceMgr) GetFlowIDInfo(ponIntfID uint32, onuID uint32, uniID uint32, flowID uint32) *[]FlowInfo {
 	var flows []FlowInfo
 
-	FlowPath := fmt.Sprintf("%d,%d,%d", PONIntfID, ONUID, UNIID)
-	if err := RsrcMgr.ResourceMgrs[PONIntfID].GetFlowIDInfo(FlowPath, FlowID, &flows); err != nil {
-		log.Errorw("Error while getting flows from KV store", log.Fields{"flowId": FlowID})
+	FlowPath := fmt.Sprintf("%d,%d,%d", ponIntfID, onuID, uniID)
+	if err := RsrcMgr.ResourceMgrs[ponIntfID].GetFlowIDInfo(FlowPath, flowID, &flows); err != nil {
+		log.Errorw("Error while getting flows from KV store", log.Fields{"flowId": flowID})
 		return nil
 	}
 	if len(flows) == 0 {
@@ -379,82 +390,82 @@
 	return &flows
 }
 
+// GetCurrentFlowIDsForOnu fetches flow ID from the resource manager
+// Note: For flows which trap from the NNI and not really associated with any particular
+// ONU (like LLDP), the onu_id and uni_id is set as -1. The intf_id is the NNI intf_id.
 func (RsrcMgr *OpenOltResourceMgr) GetCurrentFlowIDsForOnu(PONIntfID uint32, ONUID uint32, UNIID uint32) []uint32 {
-	/*
-	   Note: For flows which trap from the NNI and not really associated with any particular
-	   ONU (like LLDP), the onu_id and uni_id is set as -1. The intf_id is the NNI intf_id.
-	*/
+
 	FlowPath := fmt.Sprintf("%d,%d,%d", PONIntfID, ONUID, UNIID)
 	return RsrcMgr.ResourceMgrs[PONIntfID].GetCurrentFlowIDsForOnu(FlowPath)
 }
 
-func (RsrcMgr *OpenOltResourceMgr) UpdateFlowIDInfo(PONIntfID int32, ONUID int32, UNIID int32,
-	FlowID uint32, FlowData *[]FlowInfo) error {
-
-	/*
-	   Note: For flows which trap from the NNI and not really associated with any particular
-	   ONU (like LLDP), the onu_id and uni_id is set as -1. The intf_id is the NNI intf_id.
-	*/
-	FlowPath := fmt.Sprintf("%d,%d,%d", PONIntfID, ONUID, UNIID)
-	return RsrcMgr.ResourceMgrs[uint32(PONIntfID)].UpdateFlowIDInfoForOnu(FlowPath, FlowID, *FlowData)
+// UpdateFlowIDInfo updates flow info for the given pon interface, onu id, and uni id
+// Note: For flows which trap from the NNI and not really associated with any particular
+// ONU (like LLDP), the onu_id and uni_id is set as -1. The intf_id is the NNI intf_id.
+func (RsrcMgr *OpenOltResourceMgr) UpdateFlowIDInfo(ponIntfID int32, onuID int32, uniID int32,
+	flowID uint32, flowData *[]FlowInfo) error {
+	FlowPath := fmt.Sprintf("%d,%d,%d", ponIntfID, onuID, uniID)
+	return RsrcMgr.ResourceMgrs[uint32(ponIntfID)].UpdateFlowIDInfoForOnu(FlowPath, flowID, *flowData)
 }
 
-func (RsrcMgr *OpenOltResourceMgr) GetFlowID(PONIntfID uint32, ONUID uint32, UNIID uint32,
-	FlowStoreCookie uint64,
-	FlowCategory string) (uint32, error) {
-
-	// Get flow ID for a given pon interface id, onu id and uni id.
+// GetFlowID return flow ID for a given pon interface id, onu id and uni id
+func (RsrcMgr *OpenOltResourceMgr) GetFlowID(ponIntfID uint32, ONUID uint32, uniID uint32,
+	flowStoreCookie uint64,
+	flowCategory string) (uint32, error) {
 
 	var err error
-	FlowPath := fmt.Sprintf("%d,%d,%d", PONIntfID, ONUID, UNIID)
-	FlowIDs := RsrcMgr.ResourceMgrs[PONIntfID].GetCurrentFlowIDsForOnu(FlowPath)
+	FlowPath := fmt.Sprintf("%d,%d,%d", ponIntfID, ONUID, uniID)
+	FlowIDs := RsrcMgr.ResourceMgrs[ponIntfID].GetCurrentFlowIDsForOnu(FlowPath)
 	if FlowIDs != nil {
-		log.Debugw("Found flowId(s) for this ONU", log.Fields{"pon": PONIntfID, "ONUID": ONUID, "UNIID": UNIID, "KVpath": FlowPath})
-		for _, flowId := range FlowIDs {
-			FlowInfo := RsrcMgr.GetFlowIDInfo(PONIntfID, ONUID, UNIID, uint32(flowId))
+		log.Debugw("Found flowId(s) for this ONU", log.Fields{"pon": ponIntfID, "ONUID": ONUID, "uniID": uniID, "KVpath": FlowPath})
+		for _, flowID := range FlowIDs {
+			FlowInfo := RsrcMgr.GetFlowIDInfo(ponIntfID, ONUID, uniID, uint32(flowID))
 			if FlowInfo != nil {
 				for _, Info := range *FlowInfo {
-					if FlowCategory != "" && Info.FlowCategory == FlowCategory {
-						log.Debug("Found flow matching with flow catagory", log.Fields{"flowId": flowId, "FlowCategory": FlowCategory})
-						return flowId, nil
+					if flowCategory != "" && Info.FlowCategory == flowCategory {
+						log.Debug("Found flow matching with flow category", log.Fields{"flowId": flowID, "flowCategory": flowCategory})
+						return flowID, nil
 					}
-					if FlowStoreCookie != 0 && Info.FlowStoreCookie == FlowStoreCookie {
-						log.Debug("Found flow matching with flowStore cookie", log.Fields{"flowId": flowId, "FlowStoreCookie": FlowStoreCookie})
-						return flowId, nil
+					if flowStoreCookie != 0 && Info.FlowStoreCookie == flowStoreCookie {
+						log.Debug("Found flow matching with flowStore cookie", log.Fields{"flowId": flowID, "flowStoreCookie": flowStoreCookie})
+						return flowID, nil
 					}
 				}
 			}
 		}
 	}
 	log.Debug("No matching flows with flow cookie or flow category, allocating new flowid")
-	FlowIDs, err = RsrcMgr.ResourceMgrs[PONIntfID].GetResourceID(PONIntfID,
+	FlowIDs, err = RsrcMgr.ResourceMgrs[ponIntfID].GetResourceID(ponIntfID,
 		ponrmgr.FLOW_ID, 1)
 	if err != nil {
 		log.Errorf("Failed to get resource for interface %d for type %s",
-			PONIntfID, ponrmgr.FLOW_ID)
+			ponIntfID, ponrmgr.FLOW_ID)
 		return uint32(0), err
 	}
 	if FlowIDs != nil {
-		RsrcMgr.ResourceMgrs[PONIntfID].UpdateFlowIDForOnu(FlowPath, FlowIDs[0], true)
+		_ = RsrcMgr.ResourceMgrs[ponIntfID].UpdateFlowIDForOnu(FlowPath, FlowIDs[0], true)
+		return FlowIDs[0], err
 	}
 
-	return FlowIDs[0], err
+	return 0, err
 }
 
-func (RsrcMgr *OpenOltResourceMgr) GetAllocID(IntfID uint32, ONUID uint32, UNIID uint32) uint32 {
+// GetAllocID return the first Alloc ID for a given pon interface id and onu id and then update the resource map on
+// the KV store with the list of alloc_ids allocated for the pon_intf_onu_id tuple
+// Currently of all the alloc_ids available, it returns the first alloc_id in the list for tha given ONU
+func (RsrcMgr *OpenOltResourceMgr) GetAllocID(intfID uint32, onuID uint32, uniID uint32) uint32 {
 
-	// Get alloc id for a given pon interface id and onu id.
 	var err error
-	IntfOnuIDUniID := fmt.Sprintf("%d,%d,%d", IntfID, ONUID, UNIID)
-	AllocID := RsrcMgr.ResourceMgrs[IntfID].GetCurrentAllocIDForOnu(IntfOnuIDUniID)
+	IntfOnuIDUniID := fmt.Sprintf("%d,%d,%d", intfID, onuID, uniID)
+	AllocID := RsrcMgr.ResourceMgrs[intfID].GetCurrentAllocIDForOnu(IntfOnuIDUniID)
 	if AllocID != nil {
 		// Since we support only one alloc_id for the ONU at the moment,
 		// return the first alloc_id in the list, if available, for that
 		// ONU.
-		log.Debugw("Retrived alloc ID from pon resource mgr", log.Fields{"AllocID": AllocID})
+		log.Debugw("Retrieved alloc ID from pon resource mgr", log.Fields{"AllocID": AllocID})
 		return AllocID[0]
 	}
-	AllocID, err = RsrcMgr.ResourceMgrs[IntfID].GetResourceID(IntfID,
+	AllocID, err = RsrcMgr.ResourceMgrs[intfID].GetResourceID(intfID,
 		ponrmgr.ALLOC_ID, 1)
 
 	if AllocID == nil || err != nil {
@@ -463,7 +474,7 @@
 	}
 	// update the resource map on KV store with the list of alloc_id
 	// allocated for the pon_intf_onu_id tuple
-	err = RsrcMgr.ResourceMgrs[IntfID].UpdateAllocIdsForOnu(IntfOnuIDUniID, AllocID)
+	err = RsrcMgr.ResourceMgrs[intfID].UpdateAllocIdsForOnu(IntfOnuIDUniID, AllocID)
 	if err != nil {
 		log.Error("Failed to update Alloc ID")
 		return 0
@@ -472,30 +483,30 @@
 	return AllocID[0]
 }
 
-func (RsrcMgr *OpenOltResourceMgr) UpdateAllocIdsForOnu(PONPort uint32, ONUID uint32, UNIID uint32, AllocID []uint32) error {
+// UpdateAllocIdsForOnu updates alloc ids in kv store for a given pon interface id, onu id and uni id
+func (RsrcMgr *OpenOltResourceMgr) UpdateAllocIdsForOnu(ponPort uint32, onuID uint32, uniID uint32, allocID []uint32) error {
 
-	/* update alloc ids in kv store for a given pon interface id,
-	   onu id and uni id.
-	*/
-	IntfOnuIDUniID := fmt.Sprintf("%d,%d,%d", PONPort, ONUID, UNIID)
-	return RsrcMgr.ResourceMgrs[PONPort].UpdateAllocIdsForOnu(IntfOnuIDUniID,
-		AllocID)
+	IntfOnuIDUniID := fmt.Sprintf("%d,%d,%d", ponPort, onuID, uniID)
+	return RsrcMgr.ResourceMgrs[ponPort].UpdateAllocIdsForOnu(IntfOnuIDUniID,
+		allocID)
 }
-func (RsrcMgr *OpenOltResourceMgr) GetCurrentGEMPortIDsForOnu(IntfID uint32, ONUID uint32,
-	UNIID uint32) []uint32 {
+
+// GetCurrentGEMPortIDsForOnu returns gem ports for given pon interface , onu id and uni id
+func (RsrcMgr *OpenOltResourceMgr) GetCurrentGEMPortIDsForOnu(intfID uint32, onuID uint32,
+	uniID uint32) []uint32 {
 
 	/* Get gem ports for given pon interface , onu id and uni id. */
 
-	IntfOnuIDUniID := fmt.Sprintf("%d,%d,%d", IntfID, ONUID, UNIID)
-	return RsrcMgr.ResourceMgrs[IntfID].GetCurrentGEMPortIDsForOnu(IntfOnuIDUniID)
+	IntfOnuIDUniID := fmt.Sprintf("%d,%d,%d", intfID, onuID, uniID)
+	return RsrcMgr.ResourceMgrs[intfID].GetCurrentGEMPortIDsForOnu(IntfOnuIDUniID)
 }
 
-func (RsrcMgr *OpenOltResourceMgr) GetCurrentAllocIDForOnu(IntfID uint32, ONUID uint32, UNIID uint32) uint32 {
+// GetCurrentAllocIDForOnu returns alloc ids for given pon interface and onu id
+// Currently of all the alloc_ids available, it returns the first alloc_id in the list for tha given ONU
+func (RsrcMgr *OpenOltResourceMgr) GetCurrentAllocIDForOnu(intfID uint32, onuID uint32, uniID uint32) uint32 {
 
-	/* Get alloc ids for given pon interface and onu id. */
-
-	IntfOnuIDUniID := fmt.Sprintf("%d,%d,%d", IntfID, ONUID, UNIID)
-	AllocID := RsrcMgr.ResourceMgrs[IntfID].GetCurrentAllocIDForOnu(IntfOnuIDUniID)
+	IntfOnuIDUniID := fmt.Sprintf("%d,%d,%d", intfID, onuID, uniID)
+	AllocID := RsrcMgr.ResourceMgrs[intfID].GetCurrentAllocIDForOnu(IntfOnuIDUniID)
 	if AllocID != nil {
 		// Since we support only one alloc_id for the ONU at the moment,
 		// return the first alloc_id in the list, if available, for that
@@ -505,22 +516,23 @@
 	return 0
 }
 
-func (RsrcMgr *OpenOltResourceMgr) UpdateGEMportsPonportToOnuMapOnKVStore(GEMPorts []uint32, PonPort uint32,
-	ONUID uint32, UNIID uint32) error {
+// UpdateGEMportsPonportToOnuMapOnKVStore updates onu and uni id associated with the gem port to the kv store
+// This stored information is used when packet_indication is received and we need to derive the ONU Id for which
+// the packet arrived based on the pon_intf and gemport available in the packet_indication
+func (RsrcMgr *OpenOltResourceMgr) UpdateGEMportsPonportToOnuMapOnKVStore(gemPorts []uint32, PonPort uint32,
+	onuID uint32, uniID uint32) error {
 
 	/* Update onu and uni id associated with the gem port to the kv store. */
 	var IntfGEMPortPath string
-	Data := fmt.Sprintf("%d %d", ONUID, UNIID)
-	for _, GEM := range GEMPorts {
+	Data := fmt.Sprintf("%d %d", onuID, uniID)
+	for _, GEM := range gemPorts {
 		IntfGEMPortPath = fmt.Sprintf("%d,%d", PonPort, GEM)
 		Val, err := json.Marshal(Data)
 		if err != nil {
 			log.Error("failed to Marshal")
 			return err
 		}
-		// This information is used when packet_indication is received and
-		// we need to derive the ONU Id for which the packet arrived based
-		// on the pon_intf and gemport available in the packet_indication
+
 		if err = RsrcMgr.KVStore.Put(IntfGEMPortPath, Val); err != nil {
 			log.Errorf("Failed to update resource %s", IntfGEMPortPath)
 			return err
@@ -529,56 +541,24 @@
 	return nil
 }
 
-func (RsrcMgr *OpenOltResourceMgr) GetONUUNIfromPONPortGEMPort(PONPort uint32, GEMPort uint32) (err error, OnuID uint32, UniID uint32) {
-
-	var ONUID uint32
-	var UNIID uint32
-	var Data string
-
-	/* get the onu and uni id for a given gem port and pon port */
-	IntfGEMPortPath := fmt.Sprintf("%d,%d", PONPort, GEMPort)
-	Value, err := RsrcMgr.KVStore.Get(IntfGEMPortPath)
-	if err == nil {
-		if Value != nil {
-			Val, _ := kvstore.ToByte(Value.Value)
-			if err = json.Unmarshal(Val, &Data); err != nil {
-				log.Error("Failed to unmarshal")
-				return err, ONUID, UNIID
-			}
-			IDs := strings.Split(Data, " ")
-			for index, val := range IDs {
-				switch index {
-				case 0:
-					if intval, err := strconv.Atoi(val); err == nil {
-						ONUID = uint32(intval)
-					}
-				case 1:
-					if intval, err := strconv.Atoi(val); err == nil {
-						UNIID = uint32(intval)
-					}
-				}
-			}
-		}
-	}
-	return err, ONUID, UNIID
-}
-
-func (RsrcMgr *OpenOltResourceMgr) GetGEMPortID(PONPort uint32, ONUID uint32,
-	UNIID uint32, NumOfPorts uint32) ([]uint32, error) {
+// GetGEMPortID gets gem port id for a particular pon port, onu id and uni id and then update the resource map on
+// the KV store with the list of gemport_id allocated for the pon_intf_onu_id tuple
+func (RsrcMgr *OpenOltResourceMgr) GetGEMPortID(ponPort uint32, onuID uint32,
+	uniID uint32, NumOfPorts uint32) ([]uint32, error) {
 
 	/* Get gem port id for a particular pon port, onu id
 	   and uni id.
 	*/
 
 	var err error
-	IntfOnuIDUniID := fmt.Sprintf("%d,%d,%d", PONPort, ONUID, UNIID)
+	IntfOnuIDUniID := fmt.Sprintf("%d,%d,%d", ponPort, onuID, uniID)
 
-	GEMPortList := RsrcMgr.ResourceMgrs[PONPort].GetCurrentGEMPortIDsForOnu(IntfOnuIDUniID)
+	GEMPortList := RsrcMgr.ResourceMgrs[ponPort].GetCurrentGEMPortIDsForOnu(IntfOnuIDUniID)
 	if GEMPortList != nil {
 		return GEMPortList, nil
 	}
 
-	GEMPortList, err = RsrcMgr.ResourceMgrs[PONPort].GetResourceID(PONPort,
+	GEMPortList, err = RsrcMgr.ResourceMgrs[ponPort].GetResourceID(ponPort,
 		ponrmgr.GEMPORT_ID, NumOfPorts)
 	if err != nil && GEMPortList == nil {
 		log.Errorf("Failed to get gem port id for %s", IntfOnuIDUniID)
@@ -587,123 +567,122 @@
 
 	// update the resource map on KV store with the list of gemport_id
 	// allocated for the pon_intf_onu_id tuple
-	err = RsrcMgr.ResourceMgrs[PONPort].UpdateGEMPortIDsForOnu(IntfOnuIDUniID,
+	err = RsrcMgr.ResourceMgrs[ponPort].UpdateGEMPortIDsForOnu(IntfOnuIDUniID,
 		GEMPortList)
 	if err != nil {
 		log.Errorf("Failed to update GEM ports to kv store for %s", IntfOnuIDUniID)
 		return nil, err
 	}
-	RsrcMgr.UpdateGEMportsPonportToOnuMapOnKVStore(GEMPortList, PONPort,
-		ONUID, UNIID)
+	_ = RsrcMgr.UpdateGEMportsPonportToOnuMapOnKVStore(GEMPortList, ponPort,
+		onuID, uniID)
 	return GEMPortList, err
 }
 
-func (RsrcMgr *OpenOltResourceMgr) UpdateGEMPortIDsForOnu(PONPort uint32, ONUID uint32,
-	UNIID uint32, GEMPortList []uint32) error {
-
-	/* Update gemport ids on to kv store for a given pon port,
-	   onu id and uni id.
-	*/
-	IntfOnuIDUniID := fmt.Sprintf("%d,%d,%d", PONPort, ONUID, UNIID)
-	return RsrcMgr.ResourceMgrs[PONPort].UpdateGEMPortIDsForOnu(IntfOnuIDUniID,
+// UpdateGEMPortIDsForOnu updates gemport ids on to the kv store for a given pon port, onu id and uni id
+func (RsrcMgr *OpenOltResourceMgr) UpdateGEMPortIDsForOnu(ponPort uint32, onuID uint32,
+	uniID uint32, GEMPortList []uint32) error {
+	IntfOnuIDUniID := fmt.Sprintf("%d,%d,%d", ponPort, onuID, uniID)
+	return RsrcMgr.ResourceMgrs[ponPort].UpdateGEMPortIDsForOnu(IntfOnuIDUniID,
 		GEMPortList)
 
 }
-func (RsrcMgr *OpenOltResourceMgr) FreeONUID(IntfID uint32, ONUID []uint32) {
+
+// FreeonuID releases(make free) onu id for a particular pon-port
+func (RsrcMgr *OpenOltResourceMgr) FreeonuID(intfID uint32, onuID []uint32) {
+
+	RsrcMgr.ResourceMgrs[intfID].FreeResourceID(intfID, ponrmgr.ONU_ID, onuID)
 
 	/* Free onu id for a particular interface.*/
-	RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID, ponrmgr.ONU_ID, ONUID)
-
-	var IntfONUID string
-	for _, onu := range ONUID {
-		IntfONUID = fmt.Sprintf("%d,%d", IntfID, onu)
-		RsrcMgr.ResourceMgrs[IntfID].RemoveResourceMap(IntfONUID)
+	var IntfonuID string
+	for _, onu := range onuID {
+		IntfonuID = fmt.Sprintf("%d,%d", intfID, onu)
+		RsrcMgr.ResourceMgrs[intfID].RemoveResourceMap(IntfonuID)
 	}
-	return
 }
 
-func (RsrcMgr *OpenOltResourceMgr) FreeFlowID(IntfID uint32, ONUID uint32,
-	UNIID uint32, FlowId uint32) {
+// FreeFlowID returns the free flow id for a given interface, onu id and uni id
+func (RsrcMgr *OpenOltResourceMgr) FreeFlowID(IntfID uint32, onuID uint32,
+	uniID uint32, FlowID uint32) {
 	var IntfONUID string
 	var err error
-	IntfONUID = fmt.Sprintf("%d,%d,%d", IntfID, ONUID, UNIID)
-	err = RsrcMgr.ResourceMgrs[IntfID].UpdateFlowIDForOnu(IntfONUID, FlowId, false)
+	IntfONUID = fmt.Sprintf("%d,%d,%d", IntfID, onuID, uniID)
+	err = RsrcMgr.ResourceMgrs[IntfID].UpdateFlowIDForOnu(IntfONUID, FlowID, false)
 	if err != nil {
 		log.Error("Failed to Update flow id infor for %s", IntfONUID)
 	}
-	RsrcMgr.ResourceMgrs[IntfID].RemoveFlowIDInfo(IntfONUID, FlowId)
+	RsrcMgr.ResourceMgrs[IntfID].RemoveFlowIDInfo(IntfONUID, FlowID)
 }
 
-func (RsrcMgr *OpenOltResourceMgr) FreeFlowIDs(IntfID uint32, ONUID uint32,
-	UNIID uint32, FlowID []uint32) {
-
-	/* Free flow id for a given interface, onu id and uni id.*/
+// FreeFlowIDs releases the flow Ids
+func (RsrcMgr *OpenOltResourceMgr) FreeFlowIDs(IntfID uint32, onuID uint32,
+	uniID uint32, FlowID []uint32) {
 
 	RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID, ponrmgr.FLOW_ID, FlowID)
 
 	var IntfOnuIDUniID string
 	var err error
 	for _, flow := range FlowID {
-		IntfOnuIDUniID = fmt.Sprintf("%d,%d,%d", IntfID, ONUID, UNIID)
+		IntfOnuIDUniID = fmt.Sprintf("%d,%d,%d", IntfID, onuID, uniID)
 		err = RsrcMgr.ResourceMgrs[IntfID].UpdateFlowIDForOnu(IntfOnuIDUniID, flow, false)
 		if err != nil {
 			log.Error("Failed to Update flow id infor for %s", IntfOnuIDUniID)
 		}
 		RsrcMgr.ResourceMgrs[IntfID].RemoveFlowIDInfo(IntfOnuIDUniID, flow)
 	}
-	return
 }
 
-func (RsrcMgr *OpenOltResourceMgr) FreePONResourcesForONU(IntfID uint32, ONUID uint32, UNIID uint32) {
+// FreePONResourcesForONU make the pon resources free for a given pon interface and onu id, and the clears the
+// resource map and the onuID associated with (pon_intf_id, gemport_id) tuple,
+func (RsrcMgr *OpenOltResourceMgr) FreePONResourcesForONU(intfID uint32, onuID uint32, uniID uint32) {
 
-	/* Free pon resources for a given pon interface and onu id. */
+	var onuIDs []uint32
+	onuIDs = append(onuIDs, onuID)
+	IntfOnuIDUniID := fmt.Sprintf("%d,%d,%d", intfID, onuID, uniID)
 
-	var ONUIDs []uint32
-	ONUIDs = append(ONUIDs, ONUID)
-	IntfOnuIDUniID := fmt.Sprintf("%d,%d,%d", IntfID, ONUID, UNIID)
+	AllocIDs := RsrcMgr.ResourceMgrs[intfID].GetCurrentAllocIDForOnu(IntfOnuIDUniID)
 
-	AllocIDs := RsrcMgr.ResourceMgrs[IntfID].GetCurrentAllocIDForOnu(IntfOnuIDUniID)
-
-	RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID,
+	RsrcMgr.ResourceMgrs[intfID].FreeResourceID(intfID,
 		ponrmgr.ALLOC_ID,
 		AllocIDs)
 
-	GEMPortIDs := RsrcMgr.ResourceMgrs[IntfID].GetCurrentGEMPortIDsForOnu(IntfOnuIDUniID)
-	RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID,
+	GEMPortIDs := RsrcMgr.ResourceMgrs[intfID].GetCurrentGEMPortIDsForOnu(IntfOnuIDUniID)
+	RsrcMgr.ResourceMgrs[intfID].FreeResourceID(intfID,
 		ponrmgr.GEMPORT_ID,
 		GEMPortIDs)
 
-	FlowIDs := RsrcMgr.ResourceMgrs[IntfID].GetCurrentFlowIDsForOnu(IntfOnuIDUniID)
-	RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID,
+	FlowIDs := RsrcMgr.ResourceMgrs[intfID].GetCurrentFlowIDsForOnu(IntfOnuIDUniID)
+	RsrcMgr.ResourceMgrs[intfID].FreeResourceID(intfID,
 		ponrmgr.FLOW_ID,
 		FlowIDs)
-	RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID,
+	RsrcMgr.ResourceMgrs[intfID].FreeResourceID(intfID,
 		ponrmgr.ONU_ID,
-		ONUIDs)
+		onuIDs)
 
 	// Clear resource map associated with (pon_intf_id, gemport_id) tuple.
-	RsrcMgr.ResourceMgrs[IntfID].RemoveResourceMap(IntfOnuIDUniID)
+	RsrcMgr.ResourceMgrs[intfID].RemoveResourceMap(IntfOnuIDUniID)
 
 	// Clear the ONU Id associated with the (pon_intf_id, gemport_id) tuple.
 	for _, GEM := range GEMPortIDs {
-		RsrcMgr.KVStore.Delete(fmt.Sprintf("%d,%d", IntfID, GEM))
+		_ = RsrcMgr.KVStore.Delete(fmt.Sprintf("%d,%d", intfID, GEM))
 	}
 }
 
-func (RsrcMgr *OpenOltResourceMgr) IsFlowCookieOnKVStore(PONIntfID uint32, ONUID uint32, UNIID uint32,
-	FlowStoreCookie uint64) bool {
+// IsFlowCookieOnKVStore checks if the given flow cookie is present on the kv store
+// Returns true if the flow cookie is found, otherwise it returns false
+func (RsrcMgr *OpenOltResourceMgr) IsFlowCookieOnKVStore(ponIntfID uint32, onuID uint32, uniID uint32,
+	flowStoreCookie uint64) bool {
 
-	FlowPath := fmt.Sprintf("%d,%d,%d", PONIntfID, ONUID, UNIID)
-	FlowIDs := RsrcMgr.ResourceMgrs[PONIntfID].GetCurrentFlowIDsForOnu(FlowPath)
+	FlowPath := fmt.Sprintf("%d,%d,%d", ponIntfID, onuID, uniID)
+	FlowIDs := RsrcMgr.ResourceMgrs[ponIntfID].GetCurrentFlowIDsForOnu(FlowPath)
 	if FlowIDs != nil {
-		log.Debugw("Found flowId(s) for this ONU", log.Fields{"pon": PONIntfID, "ONUID": ONUID, "UNIID": UNIID, "KVpath": FlowPath})
-		for _, flowId := range FlowIDs {
-			FlowInfo := RsrcMgr.GetFlowIDInfo(PONIntfID, ONUID, UNIID, uint32(flowId))
+		log.Debugw("Found flowId(s) for this ONU", log.Fields{"pon": ponIntfID, "onuID": onuID, "uniID": uniID, "KVpath": FlowPath})
+		for _, flowID := range FlowIDs {
+			FlowInfo := RsrcMgr.GetFlowIDInfo(ponIntfID, onuID, uniID, uint32(flowID))
 			if FlowInfo != nil {
-				log.Debugw("Found flows", log.Fields{"flows": *FlowInfo, "flowId": flowId})
+				log.Debugw("Found flows", log.Fields{"flows": *FlowInfo, "flowId": flowID})
 				for _, Info := range *FlowInfo {
-					if Info.FlowStoreCookie == FlowStoreCookie {
-						log.Debug("Found flow matching with flowStore cookie", log.Fields{"flowId": flowId, "FlowStoreCookie": FlowStoreCookie})
+					if Info.FlowStoreCookie == flowStoreCookie {
+						log.Debug("Found flow matching with flowStore cookie", log.Fields{"flowId": flowID, "flowStoreCookie": flowStoreCookie})
 						return true
 					}
 				}
diff --git a/adaptercore/statsmanager.go b/adaptercore/statsmanager.go
index 8d7f467..6b2dfdc 100755
--- a/adaptercore/statsmanager.go
+++ b/adaptercore/statsmanager.go
@@ -13,6 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+//Package adaptercore provides the utility for olt devices, flows and statistics
 package adaptercore
 
 import (
@@ -20,10 +22,11 @@
 	"fmt"
 
 	"github.com/opencord/voltha-go/common/log"
-	openolt "github.com/opencord/voltha-protos/go/openolt"
+	"github.com/opencord/voltha-protos/go/openolt"
 	"github.com/opencord/voltha-protos/go/voltha"
 )
 
+// PonPort representation
 type PonPort struct {
 	/*
 	   This is a highly reduced version taken from the adtran pon_port.
@@ -61,6 +64,7 @@
 	TxErrorPackets uint64
 }
 
+// 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
@@ -109,6 +113,7 @@
 	return &PON
 }
 
+// NniPort representation
 type NniPort struct {
 	/*
 	   Northbound network port, often Ethernet-based
@@ -134,6 +139,7 @@
 	TxErrorPackets uint64
 }
 
+// NewNniPort returns a new instance of NniPort initialized with the given PortNum and IntfID
 func NewNniPort(PortNum uint32, IntfID uint32) *NniPort {
 
 	var NNI NniPort
@@ -157,6 +163,7 @@
 	return &NNI
 }
 
+// OpenOltStatisticsMgr structure
 type OpenOltStatisticsMgr struct {
 	Device         *DeviceHandler
 	NorthBoundPort map[uint32]NniPort
@@ -164,6 +171,7 @@
 	// TODO  PMMetrics Metrics
 }
 
+// NewOpenOltStatsMgr returns a new instance of the OpenOltStatisticsMgr
 func NewOpenOltStatsMgr(Dev *DeviceHandler) *OpenOltStatisticsMgr {
 
 	var StatMgr OpenOltStatisticsMgr
@@ -173,14 +181,15 @@
 	// Northbound and Southbound ports
 	// added to initialize the pm_metrics
 	var Ports interface{}
-	Ports, _ = InitPorts("nni", Dev.deviceId)
+	Ports, _ = InitPorts("nni", Dev.deviceID)
 	StatMgr.NorthBoundPort, _ = Ports.(map[uint32]NniPort)
-	Ports, _ = InitPorts("pon", Dev.deviceId)
+	Ports, _ = InitPorts("pon", Dev.deviceID)
 	StatMgr.SouthBoundPort, _ = Ports.(map[uint32]PonPort)
 
 	return &StatMgr
 }
 
+// InitPorts collects the port objects:  nni and pon that are updated with the current data from the OLT
 func InitPorts(Intftype string, DeviceID string) (interface{}, error) {
 	/*
 	     This method collects the port objects:  nni and pon that are updated with the
@@ -210,13 +219,14 @@
 		return PONPorts, nil
 	} else {
 		log.Errorf("Invalid type of interface %s", Intftype)
-		return nil, errors.New("Invalid type of interface ")
+		return nil, errors.New("invalid type of interface ")
 	}
 }
 
+// BuildPortObject allows for updating north and southbound ports, newly discovered ports, and devices
 func BuildPortObject(PortNum uint32, IntfType string, DeviceID string) interface{} {
 	/*
-	   Seperate method to allow for updating north and southbound ports
+	   Separate method to allow for updating north and southbound ports
 	   newly discovered ports and devices
 
 	   :param port_num:
@@ -227,12 +237,12 @@
 	//This builds a port object which is added to the
 	//appropriate northbound or southbound values
 	if IntfType == "nni" {
-		IntfID := IntfIdToPortNo(PortNum, voltha.Port_ETHERNET_UNI)
+		IntfID := IntfIDToPortNo(PortNum, voltha.Port_ETHERNET_UNI)
 		return NewNniPort(PortNum, IntfID)
 	} else if IntfType == "pon" {
 		// PON ports require a different configuration
 		//  intf_id and pon_id are currently equal.
-		IntfID := IntfIdToPortNo(PortNum, voltha.Port_ETHERNET_NNI)
+		IntfID := IntfIDToPortNo(PortNum, voltha.Port_ETHERNET_NNI)
 		PONID := IntfID
 		return NewPONPort(PONID, DeviceID, IntfID, PortNum)
 	} else {
@@ -241,17 +251,20 @@
 	}
 }
 
+// PortStatisticsIndication handles the port statistics indication
 func (StatMgr *OpenOltStatisticsMgr) PortStatisticsIndication(PortStats *openolt.PortStatistics) {
 	log.Debugf("port-stats-collected %v", PortStats)
 	StatMgr.PortsStatisticsKpis(PortStats)
 	// TODO send stats to core topic to the voltha kafka or a different kafka ?
 }
 
+// FlowStatisticsIndication to be implemented
 func FlowStatisticsIndication(self, FlowStats *openolt.FlowStatistics) {
 	log.Debugf("flow-stats-collected %v", FlowStats)
 	//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(PortStats *openolt.PortStatistics) {
 
 	/*map the port stats values into a dictionary
@@ -263,55 +276,54 @@
 	//var err error
 	IntfID := PortStats.IntfId
 
-	if (IntfIdToPortNo(0, voltha.Port_ETHERNET_NNI) < IntfID) &&
-		(IntfID < IntfIdToPortNo(4, voltha.Port_ETHERNET_NNI)) {
+	if (IntfIDToPortNo(0, voltha.Port_ETHERNET_NNI) < IntfID) &&
+		(IntfID < IntfIDToPortNo(4, voltha.Port_ETHERNET_NNI)) {
 		/*
 		   for this release we are only interested in the first NNI for
 		   Northbound.
 		   we are not using the other 3
 		*/
 		return
-	} else {
-
-		PMData := make(map[string]uint64)
-		PMData["rx_bytes"] = PortStats.RxBytes
-		PMData["rx_packets"] = PortStats.RxPackets
-		PMData["rx_ucast_packets"] = PortStats.RxUcastPackets
-		PMData["rx_mcast_packets"] = PortStats.RxMcastPackets
-		PMData["rx_bcast_packets"] = PortStats.RxBcastPackets
-		PMData["rx_error_packets"] = PortStats.RxErrorPackets
-		PMData["tx_bytes"] = PortStats.TxBytes
-		PMData["tx_packets"] = PortStats.TxPackets
-		PMData["tx_ucast_packets"] = PortStats.TxUcastPackets
-		PMData["tx_mcast_packets"] = PortStats.TxMcastPackets
-		PMData["tx_bcast_packets"] = PortStats.TxBcastPackets
-		PMData["tx_error_packets"] = PortStats.TxErrorPackets
-		PMData["rx_crc_errors"] = PortStats.RxCrcErrors
-		PMData["bip_errors"] = PortStats.BipErrors
-
-		PMData["intf_id"] = uint64(PortStats.IntfId)
-
-		/*
-		   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
-
-		   Based upon the intf_id the port object (nni_port or pon_port) will
-		   have its data attr. updated by the current dataset collected.
-
-		   For prefixing the rule is currently to use the port number and not the intf_id
-		*/
-		//FIXME : Just use first NNI for now
-		/* TODO should the data be marshalled before sending it ?
-		   if IntfID == IntfIdToPortNo(0, voltha.Port_ETHERNET_NNI) {
-		       //NNI port (just the first one)
-		       err = UpdatePortObjectKpiData(StatMgr.NorthBoundPorts[PortStats.IntfID], PMData)
-		   } else {
-		       //PON ports
-		       err = UpdatePortObjectKpiData(SouthboundPorts[PortStats.IntfID], PMData)
-		   }
-		   if (err != nil) {
-		       log.Error("Error publishing statistics data")
-		   }
-		*/
 	}
+	PMData := make(map[string]uint64)
+	PMData["rx_bytes"] = PortStats.RxBytes
+	PMData["rx_packets"] = PortStats.RxPackets
+	PMData["rx_ucast_packets"] = PortStats.RxUcastPackets
+	PMData["rx_mcast_packets"] = PortStats.RxMcastPackets
+	PMData["rx_bcast_packets"] = PortStats.RxBcastPackets
+	PMData["rx_error_packets"] = PortStats.RxErrorPackets
+	PMData["tx_bytes"] = PortStats.TxBytes
+	PMData["tx_packets"] = PortStats.TxPackets
+	PMData["tx_ucast_packets"] = PortStats.TxUcastPackets
+	PMData["tx_mcast_packets"] = PortStats.TxMcastPackets
+	PMData["tx_bcast_packets"] = PortStats.TxBcastPackets
+	PMData["tx_error_packets"] = PortStats.TxErrorPackets
+	PMData["rx_crc_errors"] = PortStats.RxCrcErrors
+	PMData["bip_errors"] = PortStats.BipErrors
+
+	PMData["intf_id"] = uint64(PortStats.IntfId)
+
+	/*
+	   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
+
+	   Based upon the intf_id the port object (nni_port or pon_port) will
+	   have its data attr. updated by the current dataset collected.
+
+	   For prefixing the rule is currently to use the port number and not the intf_id
+	*/
+	//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)
+	       err = UpdatePortObjectKpiData(StatMgr.NorthBoundPorts[PortStats.IntfID], PMData)
+	   } else {
+	       //PON ports
+	       err = UpdatePortObjectKpiData(SouthboundPorts[PortStats.IntfID], PMData)
+	   }
+	   if (err != nil) {
+	       log.Error("Error publishing statistics data")
+	   }
+	*/
+
 }
