diff --git a/adaptercore/openolt.go b/adaptercore/openolt.go
index 18ef08f..9a6afc3 100644
--- a/adaptercore/openolt.go
+++ b/adaptercore/openolt.go
@@ -16,144 +16,146 @@
 package adaptercore
 
 import (
-    "context"
-    "errors"
-    "fmt"
-    "sync"
+	"context"
+	"errors"
+	"fmt"
+	"sync"
 
-    com "github.com/opencord/voltha-go/adapters/common"
-    "github.com/opencord/voltha-go/common/log"
-    "github.com/opencord/voltha-go/kafka"
-    ic "github.com/opencord/voltha-go/protos/inter_container"
-    "github.com/opencord/voltha-go/protos/openflow_13"
-    "github.com/opencord/voltha-go/protos/voltha"
+	com "github.com/opencord/voltha-go/adapters/common"
+	"github.com/opencord/voltha-go/common/log"
+	"github.com/opencord/voltha-go/kafka"
+	ic "github.com/opencord/voltha-go/protos/inter_container"
+	"github.com/opencord/voltha-go/protos/openflow_13"
+	"github.com/opencord/voltha-go/protos/voltha"
 )
 
 type OpenOLT struct {
-    deviceHandlers        map[string]*DeviceHandler
-    coreProxy             *com.CoreProxy
-    kafkaICProxy          *kafka.InterContainerProxy
-    numOnus               int
-    exitChannel           chan int
-    lockDeviceHandlersMap sync.RWMutex
+	deviceHandlers        map[string]*DeviceHandler
+	coreProxy             *com.CoreProxy
+	adapterProxy          *com.AdapterProxy
+	kafkaICProxy          *kafka.InterContainerProxy
+	numOnus               int
+	exitChannel           chan int
+	lockDeviceHandlersMap sync.RWMutex
 }
 
-func NewOpenOLT(ctx context.Context, kafkaICProxy *kafka.InterContainerProxy, coreProxy *com.CoreProxy, onuNumber int) *OpenOLT {
-    var openOLT OpenOLT
-    openOLT.exitChannel = make(chan int, 1)
-    openOLT.deviceHandlers = make(map[string]*DeviceHandler)
-    openOLT.kafkaICProxy = kafkaICProxy
-    openOLT.numOnus = onuNumber
-    openOLT.coreProxy = coreProxy
-    openOLT.lockDeviceHandlersMap = sync.RWMutex{}
-    return &openOLT
+func NewOpenOLT(ctx context.Context, kafkaICProxy *kafka.InterContainerProxy, coreProxy *com.CoreProxy, adapterProxy *com.AdapterProxy, onuNumber int) *OpenOLT {
+	var openOLT OpenOLT
+	openOLT.exitChannel = make(chan int, 1)
+	openOLT.deviceHandlers = make(map[string]*DeviceHandler)
+	openOLT.kafkaICProxy = kafkaICProxy
+	openOLT.numOnus = onuNumber
+	openOLT.coreProxy = coreProxy
+	openOLT.adapterProxy = adapterProxy
+	openOLT.lockDeviceHandlersMap = sync.RWMutex{}
+	return &openOLT
 }
 
 func (oo *OpenOLT) Start(ctx context.Context) error {
-    log.Info("starting-device-manager")
-    log.Info("device-manager-started")
-    return nil
+	log.Info("starting-device-manager")
+	log.Info("device-manager-started")
+	return nil
 }
 
 func (oo *OpenOLT) Stop(ctx context.Context) error {
-    log.Info("stopping-device-manager")
-    oo.exitChannel <- 1
-    log.Info("device-manager-stopped")
-    return nil
+	log.Info("stopping-device-manager")
+	oo.exitChannel <- 1
+	log.Info("device-manager-stopped")
+	return nil
 }
 
 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
-        // Channel is automatically closed when a context is Done
-        ch <- result
-        log.Debugw("sendResponse", log.Fields{"result": result})
-    } else {
-        // Should the transaction be reverted back?
-        log.Debugw("sendResponse-context-error", log.Fields{"context-error": ctx.Err()})
-    }
+	if ctx.Err() == nil {
+		// Returned response only of the ctx has not been cancelled/timeout/etc
+		// Channel is automatically closed when a context is Done
+		ch <- result
+		log.Debugw("sendResponse", log.Fields{"result": result})
+	} else {
+		// Should the transaction be reverted back?
+		log.Debugw("sendResponse-context-error", log.Fields{"context-error": ctx.Err()})
+	}
 }
 
 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
-    }
+	oo.lockDeviceHandlersMap.Lock()
+	defer oo.lockDeviceHandlersMap.Unlock()
+	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)
+	oo.lockDeviceHandlersMap.Lock()
+	defer oo.lockDeviceHandlersMap.Unlock()
+	delete(oo.deviceHandlers, agent.deviceId)
 }
 
 func (oo *OpenOLT) getDeviceHandler(deviceId string) *DeviceHandler {
-    oo.lockDeviceHandlersMap.Lock()
-    defer oo.lockDeviceHandlersMap.Unlock()
-    if agent, ok := oo.deviceHandlers[deviceId]; ok {
-        return agent
-    }
-    return nil
+	oo.lockDeviceHandlersMap.Lock()
+	defer oo.lockDeviceHandlersMap.Unlock()
+	if agent, ok := oo.deviceHandlers[deviceId]; ok {
+		return agent
+	}
+	return nil
 }
 
 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}
-    // TODO for the offset
-    if err := oo.kafkaICProxy.SubscribeWithDefaultRequestHandler(deviceTopic, 0); err != nil {
-        log.Infow("create-device-topic-failed", log.Fields{"deviceId": device.Id, "error": err})
-        return err
-    }
-    return nil
+	log.Infow("create-device-topic", log.Fields{"deviceId": device.Id})
+	deviceTopic := kafka.Topic{Name: oo.kafkaICProxy.DefaultTopic.Name + "_" + device.Id}
+	// TODO for the offset
+	if err := oo.kafkaICProxy.SubscribeWithDefaultRequestHandler(deviceTopic, 0); err != nil {
+		log.Infow("create-device-topic-failed", log.Fields{"deviceId": device.Id, "error": err})
+		return err
+	}
+	return nil
 }
 
 func (oo *OpenOLT) Adopt_device(device *voltha.Device) error {
-    if device == nil {
-        log.Warn("device-is-nil")
-        return errors.New("nil-device")
-    }
-    log.Infow("adopt-device", log.Fields{"deviceId": device.Id})
-    var handler *DeviceHandler
-    if handler = oo.getDeviceHandler(device.Id); handler == nil {
-        handler := NewDeviceHandler(oo.coreProxy, device, oo)
-        oo.addDeviceHandlerToMap(handler)
-        go handler.AdoptDevice(device)
-        // Launch the creation of the device topic
-        go oo.createDeviceTopic(device)
-    }
-    return nil
+	if device == nil {
+		log.Warn("device-is-nil")
+		return errors.New("nil-device")
+	}
+	log.Infow("adopt-device", log.Fields{"deviceId": device.Id})
+	var handler *DeviceHandler
+	if handler = oo.getDeviceHandler(device.Id); handler == nil {
+		handler := NewDeviceHandler(oo.coreProxy, oo.adapterProxy, device, oo)
+		oo.addDeviceHandlerToMap(handler)
+		go handler.AdoptDevice(device)
+		// Launch the creation of the device topic
+		// go oo.createDeviceTopic(device)
+	}
+	return nil
 }
 
 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 {
-        return handler.GetOfpDeviceInfo(device)
-    }
-    log.Errorw("device-handler-not-set", log.Fields{"deviceId": device.Id})
-    return nil, errors.New("device-handler-not-set")
+	log.Infow("Get_ofp_device_info", log.Fields{"deviceId": device.Id})
+	if handler := oo.getDeviceHandler(device.Id); handler != nil {
+		return handler.GetOfpDeviceInfo(device)
+	}
+	log.Errorw("device-handler-not-set", log.Fields{"deviceId": device.Id})
+	return nil, errors.New("device-handler-not-set")
 }
 
 func (oo *OpenOLT) Get_ofp_port_info(device *voltha.Device, port_no 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)
-    }
-    log.Errorw("device-handler-not-set", log.Fields{"deviceId": device.Id})
-    return nil, errors.New("device-handler-not-set")
+	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)
+	}
+	log.Errorw("device-handler-not-set", log.Fields{"deviceId": device.Id})
+	return nil, errors.New("device-handler-not-set")
 }
 
 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?
-    if targetDevice == "" && msg.Header.ToDeviceId != "" {
-        // Typical response
-        targetDevice = msg.Header.ToDeviceId
-    }
-    if handler := oo.getDeviceHandler(targetDevice); handler != nil {
-        return handler.Process_inter_adapter_message(msg)
-    }
-    return errors.New(fmt.Sprintf("handler-not-found-%s", targetDevice))
+	log.Infow("Process_inter_adapter_message", log.Fields{"msgId": msg.Header.Id})
+	targetDevice := msg.Header.ProxyDeviceId // Request?
+	if targetDevice == "" && msg.Header.ToDeviceId != "" {
+		// Typical response
+		targetDevice = msg.Header.ToDeviceId
+	}
+	if handler := oo.getDeviceHandler(targetDevice); handler != nil {
+		return handler.Process_inter_adapter_message(msg)
+	}
+	return errors.New(fmt.Sprintf("handler-not-found-%s", targetDevice))
 }
 
 func (oo *OpenOLT) Adapter_descriptor() error {
