diff --git a/adaptercore/resourcemanager/resourcemanager.go b/adaptercore/resourcemanager/resourcemanager.go
index 7ed1d2c..2006315 100644
--- a/adaptercore/resourcemanager/resourcemanager.go
+++ b/adaptercore/resourcemanager/resourcemanager.go
@@ -17,291 +17,291 @@
 package resourcemanager
 
 import (
-    "encoding/json"
-    "errors"
-    "fmt"
-    "strconv"
-    "strings"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"strconv"
+	"strings"
 
-    ponrmgr "github.com/opencord/voltha-go/common/ponresourcemanager"
-    "github.com/opencord/voltha-go/common/log"
-    "github.com/opencord/voltha-go/db/kvstore"
-    "github.com/opencord/voltha-go/db/model"
-    "github.com/opencord/voltha-protos/go/openolt"
+	"github.com/opencord/voltha-go/common/log"
+	ponrmgr "github.com/opencord/voltha-go/common/ponresourcemanager"
+	"github.com/opencord/voltha-go/db/kvstore"
+	"github.com/opencord/voltha-go/db/model"
+	"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>
 
 type OpenOltResourceMgr struct {
-    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
-    DeviceType  string
-    Host        string        // Host ip of the kv store
-    Port        int           // port of the kv store
-    DevInfo     *openolt.DeviceInfo // device information
-    // array of pon resource managers per interface technology
-    ResourceMgrs map[uint32]*ponrmgr.PONResourceManager
+	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
+	DeviceType  string
+	Host        string              // Host ip of the kv store
+	Port        int                 // port of the kv store
+	DevInfo     *openolt.DeviceInfo // device information
+	// array of pon resource managers per interface technology
+	ResourceMgrs map[uint32]*ponrmgr.PONResourceManager
 }
 
 func newKVClient(storeType string, address string, timeout uint32) (kvstore.Client, error) {
-    log.Infow("kv-store-type", log.Fields{"store": storeType})
-    switch storeType {
-    case "consul":
-        return kvstore.NewConsulClient(address, int(timeout))
-    case "etcd":
-        return kvstore.NewEtcdClient(address, int(timeout))
-    }
-    return nil, errors.New("unsupported-kv-store")
+	log.Infow("kv-store-type", log.Fields{"store": storeType})
+	switch storeType {
+	case "consul":
+		return kvstore.NewConsulClient(address, int(timeout))
+	case "etcd":
+		return kvstore.NewEtcdClient(address, int(timeout))
+	}
+	return nil, errors.New("unsupported-kv-store")
 }
 
 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) 
-    if err != nil {
-        log.Fatalw("Failed to init KV client\n", log.Fields{"err": err})
-        return nil
-    }
-    kvbackend := &model.Backend{
-        Client:     kvClient,
-        StoreType:  Backend,
-        Host:       Host,
-        Port:       Port,
-        Timeout:    KVSTORE_TIMEOUT,
-        PathPrefix: fmt.Sprintf(BASE_PATH_KV_STORE, DeviceID)}
+	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)
+	if err != nil {
+		log.Fatalw("Failed to init KV client\n", log.Fields{"err": err})
+		return nil
+	}
+	kvbackend := &model.Backend{
+		Client:     kvClient,
+		StoreType:  Backend,
+		Host:       Host,
+		Port:       Port,
+		Timeout:    KVSTORE_TIMEOUT,
+		PathPrefix: fmt.Sprintf(BASE_PATH_KV_STORE, DeviceID)}
 
-    return kvbackend
+	return kvbackend
 }
 
 func NewResourceMgr(DeviceID string, HostPort 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.
-    */
-    var ResourceMgr OpenOltResourceMgr
-    log.Debugf("Init new resource manager , host_port: %s, deviceid: %s", HostPort, DeviceID)
-    ResourceMgr.HostAndPort = HostPort
-    ResourceMgr.DeviceType = DeviceType  
-    ResourceMgr.DevInfo = DevInfo
-    IpPort := strings.Split(HostPort, ":")
-    ResourceMgr.Host = IpPort[0]
-    ResourceMgr.Port, _ = strconv.Atoi(IpPort[1])
+	/* 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.
+	*/
+	var ResourceMgr OpenOltResourceMgr
+	log.Debugf("Init new resource manager , host_port: %s, deviceid: %s", HostPort, DeviceID)
+	ResourceMgr.HostAndPort = HostPort
+	ResourceMgr.DeviceType = DeviceType
+	ResourceMgr.DevInfo = DevInfo
+	IpPort := strings.Split(HostPort, ":")
+	ResourceMgr.Host = IpPort[0]
+	ResourceMgr.Port, _ = strconv.Atoi(IpPort[1])
 
-    Backend := "etcd" /* TODO  remove this once we get backend store from registry*/
-    ResourceMgr.KVStore = SetKVClient(Backend, ResourceMgr.Host,
-        ResourceMgr.Port, DeviceID)
-    if ResourceMgr.KVStore == nil {
-        log.Error("Failed to setup KV store")
-    }
-    Ranges := make(map[string]*openolt.DeviceInfo_DeviceResourceRanges)
-    RsrcMgrsByTech := make(map[string]*ponrmgr.PONResourceManager)
-    ResourceMgr.ResourceMgrs = make(map[uint32]*ponrmgr.PONResourceManager)
+	Backend := "etcd" /* TODO  remove this once we get backend store from registry*/
+	ResourceMgr.KVStore = SetKVClient(Backend, ResourceMgr.Host,
+		ResourceMgr.Port, DeviceID)
+	if ResourceMgr.KVStore == nil {
+		log.Error("Failed to setup KV store")
+	}
+	Ranges := make(map[string]*openolt.DeviceInfo_DeviceResourceRanges)
+	RsrcMgrsByTech := make(map[string]*ponrmgr.PONResourceManager)
+	ResourceMgr.ResourceMgrs = make(map[uint32]*ponrmgr.PONResourceManager)
 
-    // TODO self.args = registry('main').get_args()
+	// TODO self.args = registry('main').get_args()
 
-    /*
-       If a legacy driver returns protobuf without any ranges,s synthesize one from
-       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 {
-        var ranges openolt.DeviceInfo_DeviceResourceRanges
-        ranges.Technology = DevInfo.GetTechnology()
+	/*
+	   If a legacy driver returns protobuf without any ranges,s synthesize one from
+	   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 {
+		var ranges openolt.DeviceInfo_DeviceResourceRanges
+		ranges.Technology = DevInfo.GetTechnology()
 
-        NumPONPorts := DevInfo.GetPonPorts()
-        var index uint32
-        for index = 0; index < NumPONPorts; index++ {
-            ranges.IntfIds = append(ranges.IntfIds, index)
-        }
+		NumPONPorts := DevInfo.GetPonPorts()
+		var index uint32
+		for index = 0; index < NumPONPorts; index++ {
+			ranges.IntfIds = append(ranges.IntfIds, index)
+		}
 
-        var Pool *openolt.DeviceInfo_DeviceResourceRanges_Pool
-        Pool.Type = openolt.DeviceInfo_DeviceResourceRanges_Pool_ONU_ID
-        Pool.Start = DevInfo.OnuIdStart
-        Pool.End = DevInfo.OnuIdEnd
-        Pool.Sharing = openolt.DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF
-        ranges.Pools = append(ranges.Pools, Pool)
+		var Pool *openolt.DeviceInfo_DeviceResourceRanges_Pool
+		Pool.Type = openolt.DeviceInfo_DeviceResourceRanges_Pool_ONU_ID
+		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.Sharing = openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH
-        ranges.Pools = append(ranges.Pools, Pool)
+		Pool.Type = openolt.DeviceInfo_DeviceResourceRanges_Pool_ALLOC_ID
+		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.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.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.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.Sharing = openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH
+		ranges.Pools = append(ranges.Pools, Pool)
+	}
 
-    //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 {
-        technology := TechRange.Technology
-        log.Debugf("Device info technology %s", technology)
-        Ranges[technology] = TechRange
-        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
-        if GlobalPONRsrcMgr == nil {
-            GlobalPONRsrcMgr = 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)
-        InitializeDeviceResourceRangeAndPool(RsrcMgrsByTech[technology], GlobalPONRsrcMgr,
-            TechRange, DevInfo)
-    }
-    // After we have initialized resource ranges, initialize the
-    // resource pools accordingly.
-    for _, PONRMgr := range RsrcMgrsByTech {
-        PONRMgr.InitDeviceResourcePool()
-    }
-    return &ResourceMgr
+	//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 {
+		technology := TechRange.Technology
+		log.Debugf("Device info technology %s", technology)
+		Ranges[technology] = TechRange
+		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
+		if GlobalPONRsrcMgr == nil {
+			GlobalPONRsrcMgr = 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)
+		InitializeDeviceResourceRangeAndPool(RsrcMgrsByTech[technology], GlobalPONRsrcMgr,
+			TechRange, DevInfo)
+	}
+	// After we have initialized resource ranges, initialize the
+	// resource pools accordingly.
+	for _, PONRMgr := range RsrcMgrsByTech {
+		PONRMgr.InitDeviceResourcePool()
+	}
+	return &ResourceMgr
 }
 
 func InitializeDeviceResourceRangeAndPool(PONRMgr *ponrmgr.PONResourceManager, GlobalPONRMgr *ponrmgr.PONResourceManager,
-    TechRange *openolt.DeviceInfo_DeviceResourceRanges, DevInfo *openolt.DeviceInfo) {
+	TechRange *openolt.DeviceInfo_DeviceResourceRanges, DevInfo *openolt.DeviceInfo) {
 
-    // init the resource range pool according to the sharing type
+	// 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 == false {
+		log.Debugf("Failed to load resource ranges from KV store for tech %s", PONRMgr.Technology)
+	}
 
-    /*
-       Then apply device specific information. If KV doesn't exist
-       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)
+	/*
+	   Then apply device specific information. If KV doesn't exist
+	   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)
 
-    ONUIDStart := DevInfo.OnuIdStart
-    ONUIDEnd := DevInfo.OnuIdEnd
-    ONUIDShared := openolt.DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF
-    ONUIDSharedPoolID := uint32(0)
-    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
-    GEMPortIDShared := openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH // TODO EdgeCore/BAL limitation
-    GEMPortIDSharedPoolID := uint32(0)
-    FlowIDStart := DevInfo.FlowIdStart
-    FlowIDEnd := DevInfo.FlowIdEnd
-    FlowIDShared := openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH // TODO EdgeCore/BAL limitation
-    FlowIDSharedPoolID := uint32(0)
+	ONUIDStart := DevInfo.OnuIdStart
+	ONUIDEnd := DevInfo.OnuIdEnd
+	ONUIDShared := openolt.DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF
+	ONUIDSharedPoolID := uint32(0)
+	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
+	GEMPortIDShared := openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH // TODO EdgeCore/BAL limitation
+	GEMPortIDSharedPoolID := uint32(0)
+	FlowIDStart := DevInfo.FlowIdStart
+	FlowIDEnd := DevInfo.FlowIdEnd
+	FlowIDShared := openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH // TODO EdgeCore/BAL limitation
+	FlowIDSharedPoolID := uint32(0)
 
-    var GlobalPoolID uint32
-    var FirstIntfPoolID uint32
-    var SharedPoolID uint32
+	var GlobalPoolID uint32
+	var FirstIntfPoolID uint32
+	var SharedPoolID uint32
 
-    for _, FirstIntfPoolID = range TechRange.IntfIds {
-        break
-    }
+	for _, FirstIntfPoolID = range TechRange.IntfIds {
+		break
+	}
 
-    for _, RangePool := range TechRange.Pools {
-        if RangePool.Sharing == openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH {
-            SharedPoolID = GlobalPoolID
-        } else if RangePool.Sharing == openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_SAME_TECH {
-            SharedPoolID = FirstIntfPoolID
-        } else {
-            SharedPoolID = 0
-        }
-        if RangePool.Type == openolt.DeviceInfo_DeviceResourceRanges_Pool_ONU_ID {
-            ONUIDStart = RangePool.Start
-            ONUIDEnd = RangePool.End
-            ONUIDShared = RangePool.Sharing
-            ONUIDSharedPoolID = SharedPoolID
-        } else if RangePool.Type == openolt.DeviceInfo_DeviceResourceRanges_Pool_ALLOC_ID {
-            AllocIDStart = RangePool.Start
-            AllocIDEnd = RangePool.End
-            AllocIDShared = RangePool.Sharing
-            AllocIDSharedPoolID = SharedPoolID
-        } else if RangePool.Type == openolt.DeviceInfo_DeviceResourceRanges_Pool_GEMPORT_ID {
-            GEMPortIDStart = RangePool.Start
-            GEMPortIDEnd = RangePool.End
-            GEMPortIDShared = RangePool.Sharing
-            GEMPortIDSharedPoolID = SharedPoolID
-        } else if RangePool.Type == openolt.DeviceInfo_DeviceResourceRanges_Pool_FLOW_ID {
-            FlowIDStart = RangePool.Start
-            FlowIDEnd = RangePool.End
-            FlowIDShared = RangePool.Sharing
-            FlowIDSharedPoolID = SharedPoolID
-        }
-    }
+	for _, RangePool := range TechRange.Pools {
+		if RangePool.Sharing == openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH {
+			SharedPoolID = GlobalPoolID
+		} else if RangePool.Sharing == openolt.DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_SAME_TECH {
+			SharedPoolID = FirstIntfPoolID
+		} else {
+			SharedPoolID = 0
+		}
+		if RangePool.Type == openolt.DeviceInfo_DeviceResourceRanges_Pool_ONU_ID {
+			ONUIDStart = RangePool.Start
+			ONUIDEnd = RangePool.End
+			ONUIDShared = RangePool.Sharing
+			ONUIDSharedPoolID = SharedPoolID
+		} else if RangePool.Type == openolt.DeviceInfo_DeviceResourceRanges_Pool_ALLOC_ID {
+			AllocIDStart = RangePool.Start
+			AllocIDEnd = RangePool.End
+			AllocIDShared = RangePool.Sharing
+			AllocIDSharedPoolID = SharedPoolID
+		} else if RangePool.Type == openolt.DeviceInfo_DeviceResourceRanges_Pool_GEMPORT_ID {
+			GEMPortIDStart = RangePool.Start
+			GEMPortIDEnd = RangePool.End
+			GEMPortIDShared = RangePool.Sharing
+			GEMPortIDSharedPoolID = SharedPoolID
+		} else if RangePool.Type == openolt.DeviceInfo_DeviceResourceRanges_Pool_FLOW_ID {
+			FlowIDStart = RangePool.Start
+			FlowIDEnd = RangePool.End
+			FlowIDShared = RangePool.Sharing
+			FlowIDSharedPoolID = SharedPoolID
+		}
+	}
 
-    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,
-        "gemport_id_start":        GEMPortIDStart, "gemport_id_end": GEMPortIDEnd,
-        "gemport_id_shared_pool_id": GEMPortIDSharedPoolID,
-        "flow_id_start":             FlowIDStart,
-        "flow_id_end_idx":           FlowIDEnd,
-        "flow_id_shared_pool_id":    FlowIDSharedPoolID,
-        "intf_ids":                  TechRange.IntfIds,
-        "uni_id_start":              0,
-        "uni_id_end_idx":/*MaxUNIIDperONU()*/ 1})
+	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,
+		"gemport_id_start":        GEMPortIDStart, "gemport_id_end": GEMPortIDEnd,
+		"gemport_id_shared_pool_id": GEMPortIDSharedPoolID,
+		"flow_id_start":             FlowIDStart,
+		"flow_id_end_idx":           FlowIDEnd,
+		"flow_id_shared_pool_id":    FlowIDSharedPoolID,
+		"intf_ids":                  TechRange.IntfIds,
+		"uni_id_start":              0,
+		"uni_id_end_idx":/*MaxUNIIDperONU()*/ 1})
 
-    PONRMgr.InitDefaultPONResourceRanges(ONUIDStart, ONUIDEnd, ONUIDSharedPoolID,
-        AllocIDStart, AllocIDEnd, AllocIDSharedPoolID,
-        GEMPortIDStart, GEMPortIDEnd, GEMPortIDSharedPoolID,
-        FlowIDStart, FlowIDEnd, FlowIDSharedPoolID, 0, 1,
-        DevInfo.PonPorts, TechRange.IntfIds)
+	PONRMgr.InitDefaultPONResourceRanges(ONUIDStart, ONUIDEnd, ONUIDSharedPoolID,
+		AllocIDStart, AllocIDEnd, AllocIDSharedPoolID,
+		GEMPortIDStart, GEMPortIDEnd, GEMPortIDSharedPoolID,
+		FlowIDStart, FlowIDEnd, FlowIDSharedPoolID, 0, 1,
+		DevInfo.PonPorts, TechRange.IntfIds)
 
-    // For global sharing, make sure to refresh both local and global resource manager instances' range
+	// 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,
-            "", 0, nil)
-        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,
-            "", 0, nil)
+	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,
+			"", 0, nil)
+		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,
+			"", 0, nil)
 
-        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,
-            "", 0, nil)
-        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,
-            "", 0, nil)
-        PONRMgr.UpdateRanges(ponrmgr.FLOW_ID_START_IDX, FlowIDStart, ponrmgr.FLOW_ID_END_IDX, FlowIDEnd,
-            "", 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,
+			"", 0, nil)
+		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,
+			"", 0, nil)
+		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)
+	// 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)
 }
 
 /* TODO
@@ -328,293 +328,293 @@
 
 func (RsrcMgr *OpenOltResourceMgr) GetONUID(PONIntfID uint32) (uint32, error) {
 
-    // Get ONU id for a provided pon interface ID.
+	// Get ONU id for a provided pon interface ID.
 
-    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)
-        return ONUID[0], err
-    }
-    if ONUID != nil {
-        RsrcMgr.ResourceMgrs[PONIntfID].InitResourceMap(fmt.Sprintf("%d,%d", PONIntfID, ONUID))
-    }
+	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)
+		return ONUID[0], err
+	}
+	if ONUID != nil {
+		RsrcMgr.ResourceMgrs[PONIntfID].InitResourceMap(fmt.Sprintf("%d,%d", PONIntfID, ONUID))
+	}
 
-    return ONUID[0], err
+	return ONUID[0], err
 }
 
 func (RsrcMgr *OpenOltResourceMgr) GetFlowID(PONIntfID uint32, ONUID uint32, UNIID uint32,
-    FlowStoreCookie interface{},
-    FlowCategory interface{}) (uint32, error) {
+	FlowStoreCookie interface{},
+	FlowCategory interface{}) (uint32, error) {
 
-    // Get flow ID for a given pon interface id, onu id and uni id.
+	// Get flow ID for a given pon interface id, onu id and uni id.
 
-    var err error
-    FlowPath := fmt.Sprintf("%d,%d,%d", PONIntfID, ONUID, UNIID)
-    FlowIDs := RsrcMgr.ResourceMgrs[PONIntfID].GetCurrentFlowIDsForOnu(FlowPath)
-    if FlowIDs != nil {
-        /* TODO once the flow id info structure is known
-                for Flow := range FlowIDs {
-                    FlowInfo := RsrcMgr.ResourceMgrs[PONIntfID].GetFlowIDInfo(FlowPath, Flow)
-                    for Info := range FlowInfo {
-                        if FlowCategory != nil &&
-                            Info[FlowCategory] == FlowCategory {
-                            return 0, Flow
-                        }
-                        if FlowStoreCookie != nil &&
-                            Info[FlowStoreCookie] == FlowStoreCookie {
-                            return 0, Flow
-                        }
-                    }
-                }
-        */
-    }
-    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)
-        return FlowIDs[0], err
-    }
-    if FlowIDs != nil {
-        RsrcMgr.ResourceMgrs[PONIntfID].UpdateFlowIDForOnu(FlowPath, FlowIDs[0], true)
-    }
+	var err error
+	FlowPath := fmt.Sprintf("%d,%d,%d", PONIntfID, ONUID, UNIID)
+	FlowIDs := RsrcMgr.ResourceMgrs[PONIntfID].GetCurrentFlowIDsForOnu(FlowPath)
+	if FlowIDs != nil {
+		/* TODO once the flow id info structure is known
+		   for Flow := range FlowIDs {
+		       FlowInfo := RsrcMgr.ResourceMgrs[PONIntfID].GetFlowIDInfo(FlowPath, Flow)
+		       for Info := range FlowInfo {
+		           if FlowCategory != nil &&
+		               Info[FlowCategory] == FlowCategory {
+		               return 0, Flow
+		           }
+		           if FlowStoreCookie != nil &&
+		               Info[FlowStoreCookie] == FlowStoreCookie {
+		               return 0, Flow
+		           }
+		       }
+		   }
+		*/
+	}
+	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)
+		return FlowIDs[0], err
+	}
+	if FlowIDs != nil {
+		RsrcMgr.ResourceMgrs[PONIntfID].UpdateFlowIDForOnu(FlowPath, FlowIDs[0], true)
+	}
 
-    return FlowIDs[0], err
+	return FlowIDs[0], err
 }
 
 func (RsrcMgr *OpenOltResourceMgr) GetAllocID(IntfID uint32, ONUID uint32) uint32 {
 
-    // Get alloc id for a given pon interface id and onu id.
-    var err error
-    IntfONUID := fmt.Sprintf("%d,%d", IntfID, ONUID)
-    AllocID := RsrcMgr.ResourceMgrs[IntfID].GetCurrentAllocIDForOnu(IntfONUID)
-    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.
-        return AllocID[0]
-    }
-    AllocID, err = RsrcMgr.ResourceMgrs[IntfID].GetResourceID(IntfID,
-        ponrmgr.ALLOC_ID, 1)
+	// Get alloc id for a given pon interface id and onu id.
+	var err error
+	IntfONUID := fmt.Sprintf("%d,%d", IntfID, ONUID)
+	AllocID := RsrcMgr.ResourceMgrs[IntfID].GetCurrentAllocIDForOnu(IntfONUID)
+	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.
+		return AllocID[0]
+	}
+	AllocID, err = RsrcMgr.ResourceMgrs[IntfID].GetResourceID(IntfID,
+		ponrmgr.ALLOC_ID, 1)
 
-    if AllocID == nil || err != nil {
-        log.Error("Failed to allocate alloc id")
-        return 0
-    }
-    // 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(IntfONUID, AllocID)
-    if err != nil {
-        log.Error("Failed to update Alloc ID")
-        return 0
-    }
-    return AllocID[0]
+	if AllocID == nil || err != nil {
+		log.Error("Failed to allocate alloc id")
+		return 0
+	}
+	// 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(IntfONUID, AllocID)
+	if err != nil {
+		log.Error("Failed to update Alloc ID")
+		return 0
+	}
+	return AllocID[0]
 }
 
 func (RsrcMgr *OpenOltResourceMgr) UpdateAllocIdsForOnu(PONPort uint32, ONUID uint32,
-    UNIID uint32, AllocID []uint32) error {
+	UNIID uint32, AllocID []uint32) error {
 
-    /* update alloc ids in kv store for a given pon interface id,
-       onu id and uni id.
-    */
-    IntfONUID := fmt.Sprintf("%d,%d,%d", PONPort, ONUID, UNIID)
-    return RsrcMgr.ResourceMgrs[PONPort].UpdateAllocIdsForOnu(IntfONUID,
-        AllocID)
+	/* update alloc ids in kv store for a given pon interface id,
+	   onu id and uni id.
+	*/
+	IntfONUID := fmt.Sprintf("%d,%d,%d", PONPort, ONUID, UNIID)
+	return RsrcMgr.ResourceMgrs[PONPort].UpdateAllocIdsForOnu(IntfONUID,
+		AllocID)
 }
 func (RsrcMgr *OpenOltResourceMgr) GetCurrentGEMPortIDsForOnu(IntfID uint32, ONUID uint32,
-    UNIID uint32) []uint32 {
+	UNIID uint32) []uint32 {
 
-    /* Get gem ports for given pon interface , onu id and uni id. */
+	/* Get gem ports for given pon interface , onu id and uni id. */
 
-    IntfONUID := fmt.Sprintf("%d,%d,%d", IntfID, ONUID, UNIID)
-    GEMPortID := RsrcMgr.ResourceMgrs[IntfID].GetCurrentGEMPortIDsForOnu(IntfONUID)
-    if GEMPortID != 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.
-        return GEMPortID
-    }
-    return nil
+	IntfONUID := fmt.Sprintf("%d,%d,%d", IntfID, ONUID, UNIID)
+	GEMPortID := RsrcMgr.ResourceMgrs[IntfID].GetCurrentGEMPortIDsForOnu(IntfONUID)
+	if GEMPortID != 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.
+		return GEMPortID
+	}
+	return nil
 }
 
 func (RsrcMgr *OpenOltResourceMgr) GetCurrentAllocIDForOnu(IntfID uint32, ONUID uint32) uint32 {
 
-    /* Get alloc ids for given pon interface and onu id. */
+	/* Get alloc ids for given pon interface and onu id. */
 
-    IntfONUID := fmt.Sprintf("%d,%d", IntfID, ONUID)
-    AllocID := RsrcMgr.ResourceMgrs[IntfID].GetCurrentAllocIDForOnu(IntfONUID)
-    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.
-        return AllocID[0]
-    }
-    return 0
+	IntfONUID := fmt.Sprintf("%d,%d", IntfID, ONUID)
+	AllocID := RsrcMgr.ResourceMgrs[IntfID].GetCurrentAllocIDForOnu(IntfONUID)
+	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.
+		return AllocID[0]
+	}
+	return 0
 }
 
 func (RsrcMgr *OpenOltResourceMgr) UpdateGEMportsPonportToOnuMapOnKVStore(GEMPorts []uint32, PonPort uint32,
-    ONUID uint32, UNIID uint32) error {
+	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 {
-        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
-        }
-    }
-    return nil
+	/* 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 {
+		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
+		}
+	}
+	return nil
 }
 
 func (RsrcMgr *OpenOltResourceMgr) GetONUUNIfromPONPortGEMPort(PONPort uint32, GEMPort uint32) []uint32 {
 
-    /* get the onu and uni id for a given gem port. */
-    IntfGEMPortPath := fmt.Sprintf("%d,%d", PONPort, GEMPort)
-    var GEMPortIDs []uint32
-    var Data string
-    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 nil
-            }
-            IDs := strings.Split(Data, " ")
-            for _, port := range IDs {
-                Intport, _ := strconv.Atoi(port)
-                GEMPortIDs = append(GEMPortIDs, uint32(Intport))
-            }
-        }
-    }
-    return GEMPortIDs
+	/* get the onu and uni id for a given gem port. */
+	IntfGEMPortPath := fmt.Sprintf("%d,%d", PONPort, GEMPort)
+	var GEMPortIDs []uint32
+	var Data string
+	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 nil
+			}
+			IDs := strings.Split(Data, " ")
+			for _, port := range IDs {
+				Intport, _ := strconv.Atoi(port)
+				GEMPortIDs = append(GEMPortIDs, uint32(Intport))
+			}
+		}
+	}
+	return GEMPortIDs
 }
 
 func (RsrcMgr *OpenOltResourceMgr) GetGEMPortID(PONPort uint32, ONUID uint32,
-    UNIID uint32, NumOfPorts uint32) ([]uint32, error) {
+	UNIID uint32, NumOfPorts uint32) ([]uint32, error) {
 
-    /* Get gem port id for a particular pon port, onu id
-       and uni id.
-    */
+	/* Get gem port id for a particular pon port, onu id
+	   and uni id.
+	*/
 
-    var err error
-    IntfONUID := fmt.Sprintf("%d,%d,%d", PONPort, ONUID, UNIID)
+	var err error
+	IntfONUID := fmt.Sprintf("%d,%d,%d", PONPort, ONUID, UNIID)
 
-    GEMPortList := RsrcMgr.ResourceMgrs[PONPort].GetCurrentGEMPortIDsForOnu(IntfONUID)
-    if GEMPortList != nil {
-        return GEMPortList, nil
-    }
+	GEMPortList := RsrcMgr.ResourceMgrs[PONPort].GetCurrentGEMPortIDsForOnu(IntfONUID)
+	if GEMPortList != nil {
+		return GEMPortList, nil
+	}
 
-    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", IntfONUID)
-        return nil, err
-    }
+	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", IntfONUID)
+		return nil, err
+	}
 
-    // 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(IntfONUID,
-        GEMPortList)
-    if err != nil {
-        log.Errorf("Failed to update GEM ports to kv store for %s", IntfONUID)
-        return nil, err
-    }
-    RsrcMgr.UpdateGEMportsPonportToOnuMapOnKVStore(GEMPortList, PONPort,
-        ONUID, UNIID)
-    return GEMPortList, err
+	// 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(IntfONUID,
+		GEMPortList)
+	if err != nil {
+		log.Errorf("Failed to update GEM ports to kv store for %s", IntfONUID)
+		return nil, err
+	}
+	RsrcMgr.UpdateGEMportsPonportToOnuMapOnKVStore(GEMPortList, PONPort,
+		ONUID, UNIID)
+	return GEMPortList, err
 }
 
 func (RsrcMgr *OpenOltResourceMgr) UpdateGEMPortIDsForOnu(PONPort uint32, ONUID uint32,
-    UNIID uint32, GEMPortList []uint32) error {
+	UNIID uint32, GEMPortList []uint32) error {
 
-    /* Update gemport ids on to kv store for a given pon port,
-       onu id and uni id.
-    */
-    IntfONUID := fmt.Sprintf("%d,%d,%d", PONPort, ONUID, UNIID)
-    return RsrcMgr.ResourceMgrs[PONPort].UpdateGEMPortIDsForOnu(IntfONUID,
-        GEMPortList)
+	/* Update gemport ids on to kv store for a given pon port,
+	   onu id and uni id.
+	*/
+	IntfONUID := fmt.Sprintf("%d,%d,%d", PONPort, ONUID, UNIID)
+	return RsrcMgr.ResourceMgrs[PONPort].UpdateGEMPortIDsForOnu(IntfONUID,
+		GEMPortList)
 
 }
 func (RsrcMgr *OpenOltResourceMgr) FreeONUID(IntfID uint32, ONUID []uint32) {
 
-    /* Free onu id for a particular interface.*/
-    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)
-    }
-    return
+	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) {
+	UNIID uint32, FlowID []uint32) {
 
-    /* Free flow id for a given interface, onu id and uni id.*/
+	/* Free flow id for a given interface, onu id and uni id.*/
 
-    RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID, ponrmgr.FLOW_ID, FlowID)
+	RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID, ponrmgr.FLOW_ID, FlowID)
 
-    var IntfONUID string
-    var err error
-    for _, flow := range FlowID {
-        IntfONUID = fmt.Sprintf("%d,%d,%d", IntfID, ONUID, UNIID)
-        err = RsrcMgr.ResourceMgrs[IntfID].UpdateFlowIDForOnu(IntfONUID, flow, false)
-        if err != nil {
-            log.Error("Failed to Update flow id infor for %s", IntfONUID)
-        }
-        RsrcMgr.ResourceMgrs[IntfID].RemoveFlowIDInfo(IntfONUID, flow)
-    }
-    return
+	var IntfONUID string
+	var err error
+	for _, flow := range FlowID {
+		IntfONUID = fmt.Sprintf("%d,%d,%d", IntfID, ONUID, UNIID)
+		err = RsrcMgr.ResourceMgrs[IntfID].UpdateFlowIDForOnu(IntfONUID, flow, false)
+		if err != nil {
+			log.Error("Failed to Update flow id infor for %s", IntfONUID)
+		}
+		RsrcMgr.ResourceMgrs[IntfID].RemoveFlowIDInfo(IntfONUID, flow)
+	}
+	return
 }
 
 func (RsrcMgr *OpenOltResourceMgr) FreePONResourcesForONU(IntfID uint32, ONUID uint32) {
 
-    /* Free pon resources for a given pon interface and onu id. */
+	/* Free pon resources for a given pon interface and onu id. */
 
-    var ONUIDs []uint32
-    ONUIDs = append(ONUIDs, ONUID)
-    IntfONUID := fmt.Sprintf("%d,%d", IntfID, ONUID)
+	var ONUIDs []uint32
+	ONUIDs = append(ONUIDs, ONUID)
+	IntfONUID := fmt.Sprintf("%d,%d", IntfID, ONUID)
 
-    AllocIDs := RsrcMgr.ResourceMgrs[IntfID].GetCurrentAllocIDForOnu(IntfONUID)
+	AllocIDs := RsrcMgr.ResourceMgrs[IntfID].GetCurrentAllocIDForOnu(IntfONUID)
 
-    RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID,
-        ponrmgr.ALLOC_ID,
-        AllocIDs)
+	RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID,
+		ponrmgr.ALLOC_ID,
+		AllocIDs)
 
-    GEMPortIDs := RsrcMgr.ResourceMgrs[IntfID].GetCurrentGEMPortIDsForOnu(IntfONUID)
-    RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID,
-        ponrmgr.GEMPORT_ID,
-        GEMPortIDs)
+	GEMPortIDs := RsrcMgr.ResourceMgrs[IntfID].GetCurrentGEMPortIDsForOnu(IntfONUID)
+	RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID,
+		ponrmgr.GEMPORT_ID,
+		GEMPortIDs)
 
-    FlowIDs := RsrcMgr.ResourceMgrs[IntfID].GetCurrentFlowIDsForOnu(IntfONUID)
-    RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID,
-        ponrmgr.FLOW_ID,
-        FlowIDs)
-    RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID,
-        ponrmgr.ONU_ID,
-        ONUIDs)
+	FlowIDs := RsrcMgr.ResourceMgrs[IntfID].GetCurrentFlowIDsForOnu(IntfONUID)
+	RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID,
+		ponrmgr.FLOW_ID,
+		FlowIDs)
+	RsrcMgr.ResourceMgrs[IntfID].FreeResourceID(IntfID,
+		ponrmgr.ONU_ID,
+		ONUIDs)
 
-    // Clear resource map associated with (pon_intf_id, gemport_id) tuple.
-    RsrcMgr.ResourceMgrs[IntfID].RemoveResourceMap(IntfONUID)
+	// Clear resource map associated with (pon_intf_id, gemport_id) tuple.
+	RsrcMgr.ResourceMgrs[IntfID].RemoveResourceMap(IntfONUID)
 
-    // 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))
-    }
+	// 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))
+	}
 }
 
 /* TODO once the flow id info structure is known
@@ -639,4 +639,3 @@
 
   return False
 */
-
