diff --git a/common/log/log.go b/common/log/log.go
index e86ba0d..7f43e87 100644
--- a/common/log/log.go
+++ b/common/log/log.go
@@ -149,26 +149,6 @@
 	return defaultLogger, nil
 }
 
-func SetPackageLevelLoggers(outputType string, level int, defaultFields Fields, pkgNames []string) error {
-	cfgs = make(map[string]zp.Config)
-	loggers = make(map[string]*logger)
-	for _, pkg := range pkgNames {
-		// Build a custom config using zap - for now initialzie all packages uses the same config
-		cfgs[pkg] = getDefaultConfig(outputType, level, defaultFields)
-
-		l, err := cfgs[pkg].Build()
-		if err != nil {
-			return err
-		}
-
-		loggers[pkg] = &logger{
-			log:    l.Sugar(),
-			parent: l,
-		}
-	}
-
-	return nil
-}
 
 func AddPackage(outputType string, level int, defaultFields Fields) error {
 	if cfgs == nil {
@@ -217,24 +197,6 @@
 	return nil
 }
 
-//func SetDefaultLoglevel(level int) {
-//	switch level {
-//	case DebugLevel:
-//		cfg.Level.SetLevel(zc.DebugLevel)
-//	case InfoLevel:
-//		cfg.Level.SetLevel(zc.InfoLevel)
-//	case WarnLevel:
-//		cfg.Level.SetLevel(zc.WarnLevel)
-//	case ErrorLevel:
-//		cfg.Level.SetLevel(zc.ErrorLevel)
-//	case PanicLevel:
-//		cfg.Level.SetLevel(zc.PanicLevel)
-//	case FatalLevel:
-//		cfg.Level.SetLevel(zc.FatalLevel)
-//	default:
-//		cfg.Level.SetLevel(zc.ErrorLevel)
-//	}
-//}
 
 func SetPackageLogLevel(packageName string, level int) {
 	// Get proper config
@@ -258,6 +220,28 @@
 	}
 }
 
+func SetAllLogLevel(level int) {
+	// Get proper config
+	for _, cfg := range cfgs{
+		switch level {
+		case DebugLevel:
+			cfg.Level.SetLevel(zc.DebugLevel)
+		case InfoLevel:
+			cfg.Level.SetLevel(zc.InfoLevel)
+		case WarnLevel:
+			cfg.Level.SetLevel(zc.WarnLevel)
+		case ErrorLevel:
+			cfg.Level.SetLevel(zc.ErrorLevel)
+		case PanicLevel:
+			cfg.Level.SetLevel(zc.PanicLevel)
+		case FatalLevel:
+			cfg.Level.SetLevel(zc.FatalLevel)
+		default:
+			cfg.Level.SetLevel(zc.ErrorLevel)
+		}
+	}
+}
+
 // CleanUp flushed any buffered log entries. Applications should take care to call
 // CleanUp before exiting.
 func CleanUp() error {
@@ -280,82 +264,55 @@
 	return nil
 }
 
-// GetLogger returned the default logger.  If SetLogger was not previously invoked then
-// this method will return an error
-//func GetLogger() (Logger, error) {
-//	if defaultLogger == nil {
-//		// Setup the logger with default values - debug level,
-//		SetDefaultLogger(JSON, 0, Fields{"instanceId": "default-logger"})
-//		//return nil, errors.New("Uninitialized-logger")
-//	}
-//	return defaultLogger, nil
-//}
-
-//func extractFileNameAndLineNumber(skipLevel int) (string, int) {
-//	_, file, line, ok := runtime.Caller(skipLevel)
-//	var key string
-//	if !ok {
-//		key = "<???>"
-//		line = 1
-//	} else {
-//		slash := strings.LastIndex(file, "/")
-//		key = file[slash+1:]
-//	}
-//	return key, line
-//}
-
-// sourced adds a source field to the logger that contains
-// the file name and line where the logging happened.
-//func (l *logger) sourced() *zp.SugaredLogger {
-//	key, line := extractFileNameAndLineNumber(3)
-//	if strings.HasSuffix(key, "log.go") || strings.HasSuffix(key, "proc.go") {
-//		// Go to a lower level
-//		key, line = extractFileNameAndLineNumber(2)
-//	}
-//	if !strings.HasSuffix(key, ".go") {
-//		// Go to a higher level
-//		key, line = extractFileNameAndLineNumber(4)
-//	}
-//
-//	return l.log.With("caller", fmt.Sprintf("%s:%d", key, line))
-//}
-
-func retrieveCallInfo(skiplevel int) (string, string, string, int) {
-	pc, file, line, _ := runtime.Caller(skiplevel)
-	_, fileName := path.Split(file)
-	parts := strings.Split(runtime.FuncForPC(pc).Name(), ".")
-	pl := len(parts)
+func getCallerInfo() (string, string, string, int){
+	// Since the caller of a log function is one stack frame before (in terms of stack higher level) the log.go
+	// filename, then first look for the last log.go filename and then grab the caller info one level higher.
+	maxLevel := 3
+	skiplevel := 3  // Level with the most empirical success to see the last log.go stack frame.
+	pc := make([]uintptr, maxLevel)
+	n := runtime.Callers(skiplevel, pc)
 	packageName := ""
-	funcName := parts[pl-1]
-
-	if parts[pl-2][0] == '(' {
-		//funcName = parts[pl-2] + "." + funcName
-		packageName = strings.Join(parts[0:pl-2], ".")
-	} else {
-		packageName = strings.Join(parts[0:pl-1], ".")
+	funcName := ""
+	fileName := ""
+	var line int
+	if n == 0 {
+		return packageName, fileName, funcName, line
+	}
+	frames := runtime.CallersFrames(pc[:n])
+	var frame runtime.Frame
+	var foundFrame runtime.Frame
+	more := true
+	for more {
+		frame, more = frames.Next()
+		_, fileName = path.Split(frame.File)
+		if fileName != "log.go" {
+			foundFrame = frame // First frame after log.go in the frame stack
+			break
+		}
+	}
+	parts := strings.Split(foundFrame.Function, ".")
+	pl := len(parts)
+	if pl >= 2 {
+		funcName = parts[pl-1]
+		if parts[pl-2][0] == '(' {
+			packageName = strings.Join(parts[0:pl-2], ".")
+		} else {
+			packageName = strings.Join(parts[0:pl-1], ".")
+		}
 	}
 
-	return packageName, fileName, funcName, line
-}
-
-func getCallerInfo() (string, string, string, int) {
-	packageName, fileName, funcName, line := retrieveCallInfo(3)
-
-	if strings.HasSuffix(funcName, "log.go") || strings.HasSuffix(funcName, "proc.go") || strings.HasSuffix(packageName, ".init") {
-		// Go to a lower level
-		packageName, fileName, funcName, line = retrieveCallInfo(2)
-	}
-	if !strings.HasSuffix(funcName, ".go") {
-		// Go to a higher level
-		packageName, fileName, funcName, line = retrieveCallInfo(4)
+	if strings.HasSuffix(packageName, ".init") {
+		packageName= strings.TrimSuffix(packageName, ".init")
 	}
 
 	if strings.HasSuffix(fileName, ".go") {
-		fileName = strings.TrimSuffix(fileName, ".go")
+		fileName= strings.TrimSuffix(fileName, ".go")
 	}
-	return packageName, fileName, funcName, line
+
+	return packageName, fileName, funcName, foundFrame.Line
 }
 
+
 func getPackageLevelLogger() *zp.SugaredLogger {
 	pkgName, fileName, funcName, line := getCallerInfo()
 	if _, exist := loggers[pkgName]; exist {
diff --git a/db/model/proxy_test.go b/db/model/proxy_test.go
index ad02eb6..e7b644c 100644
--- a/db/model/proxy_test.go
+++ b/db/model/proxy_test.go
@@ -52,9 +52,10 @@
 )
 
 func init() {
-	if _, err := log.SetLogger(log.CONSOLE, 0, log.Fields{"instanceId": "proxy_test"}); err != nil {
-		log.With(log.Fields{"error": err}).Fatal("cannot setup logging")
-	}
+
+	log.AddPackage(log.JSON, log.ErrorLevel, nil)
+	log.UpdateAllLoggers(log.Fields{"instanceId": "proxy_test"})
+
 	defer log.CleanUp()
 
 	pt.Backend = NewBackend(pt.DbType, pt.DbHost, pt.DbPort, pt.DbTimeout, pt.DbPrefix)
diff --git a/db/model/transaction_test.go b/db/model/transaction_test.go
index 064b9ef..130a992 100644
--- a/db/model/transaction_test.go
+++ b/db/model/transaction_test.go
@@ -50,9 +50,10 @@
 )
 
 func init() {
-	if _, err := log.SetLogger(log.CONSOLE, 0, log.Fields{"instanceId": "transaction_test"}); err != nil {
-		log.With(log.Fields{"error": err}).Fatal("cannot setup logging")
-	}
+
+	log.AddPackage(log.JSON, log.ErrorLevel, nil)
+	log.UpdateAllLoggers(log.Fields{"instanceId": "transaction_test"})
+
 	defer log.CleanUp()
 
 	tx.Backend = NewBackend(tx.DbType, tx.DbHost, tx.DbPort, tx.DbTimeout, tx.DbPrefix)
diff --git a/kafka/kafka_inter_container_library.go b/kafka/kafka_inter_container_library.go
index c00fb60..619bd17 100644
--- a/kafka/kafka_inter_container_library.go
+++ b/kafka/kafka_inter_container_library.go
@@ -772,6 +772,10 @@
 	}
 
 	for _, arg := range kvArgs {
+		if arg == nil {
+			// In case the caller sends an array with empty args
+			continue
+		}
 		var marshalledArg *any.Any
 		var err error
 		// ascertain the value interface type is a proto.Message
diff --git a/rw_core/core/adapter_request_handler.go b/rw_core/core/adapter_request_handler.go
index 95ad69d..bfc4ee4 100644
--- a/rw_core/core/adapter_request_handler.go
+++ b/rw_core/core/adapter_request_handler.go
@@ -118,15 +118,15 @@
 		err := errors.New("invalid-number-of-args")
 		return nil, err
 	}
-	pID := &ca.StrType{}
+	pID := &voltha.ID{}
 	if err := ptypes.UnmarshalAny(args[0].Value, pID); err != nil {
 		log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
 		return nil, err
 	}
-	log.Debugw("GetChildDevice", log.Fields{"deviceId": pID.Val})
+	log.Debugw("GetChildDevice", log.Fields{"deviceId": pID.Id})
 
 	if rhp.TestMode { // Execute only for test cases
-		return &voltha.Device{Id: pID.Val}, nil
+		return &voltha.Device{Id: pID.Id}, nil
 	}
 	return nil, nil
 }
@@ -137,7 +137,7 @@
 		err := errors.New("invalid-number-of-args")
 		return nil, err
 	}
-	pID := &ca.StrType{}
+	pID := &voltha.ID{}
 	if err := ptypes.UnmarshalAny(args[0].Value, pID); err != nil {
 		log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
 		return nil, err
@@ -149,7 +149,7 @@
 		return nil, err
 	}
 
-	log.Debugw("GetPorts", log.Fields{"deviceID": pID.Val, "portype": pt.Val})
+	log.Debugw("GetPorts", log.Fields{"deviceID": pID.Id, "portype": pt.Val})
 
 	if rhp.TestMode { // Execute only for test cases
 		aPort := &voltha.Port{Label: "test_port"}
@@ -167,15 +167,15 @@
 		err := errors.New("invalid-number-of-args")
 		return nil, err
 	}
-	pID := &ca.StrType{}
+	pID := &voltha.ID{}
 	if err := ptypes.UnmarshalAny(args[0].Value, pID); err != nil {
 		log.Warnw("cannot-unmarshal-ID", log.Fields{"error": err})
 		return nil, err
 	}
-	log.Debugw("GetChildDevice", log.Fields{"deviceId": pID.Val})
+	log.Debugw("GetChildDevice", log.Fields{"deviceId": pID.Id})
 
 	if rhp.TestMode { // Execute only for test cases
-		return &voltha.Device{Id: pID.Val}, nil
+		return &voltha.Device{Id: pID.Id}, nil
 	}
 	//TODO: Complete
 	return nil, nil
diff --git a/rw_core/core/grpc_nbi_api_handler_client_test.go b/rw_core/core/grpc_nbi_api_handler_client_test.go
index 721271e..6a32ee5 100644
--- a/rw_core/core/grpc_nbi_api_handler_client_test.go
+++ b/rw_core/core/grpc_nbi_api_handler_client_test.go
@@ -36,9 +36,10 @@
 var testMode string
 
 /*
-NOTE:  These tests require the rw_core to run prior to executing these test cases
+Prerequite:  These tests require the rw_core to run prior to executing these test cases.
 */
 
+
 func setup() {
 	var err error
 
diff --git a/rw_core/main.go b/rw_core/main.go
index b73f131..25adee6 100644
--- a/rw_core/main.go
+++ b/rw_core/main.go
@@ -45,7 +45,7 @@
 }
 
 func init() {
-	log.AddPackage(log.JSON, log.WarnLevel, nil)
+	log.AddPackage(log.JSON, log.DebugLevel, nil)
 }
 
 func newKVClient(storeType string, address string, timeout int) (kvstore.Client, error) {
diff --git a/tests/kafka/kafka_inter_container_messaging_test.go b/tests/kafka/kafka_inter_container_messaging_test.go
index 1f60cb1..99ba2c4 100644
--- a/tests/kafka/kafka_inter_container_messaging_test.go
+++ b/tests/kafka/kafka_inter_container_messaging_test.go
@@ -29,20 +29,25 @@
 	"time"
 )
 
+/*
+Prerequite:  Start the kafka/zookeeper containers.
+*/
+
 var coreKafkaProxy *kk.KafkaMessagingProxy
 var adapterKafkaProxy *kk.KafkaMessagingProxy
 
 func init() {
-	if _, err := log.SetLogger(log.JSON, 3, log.Fields{"instanceId": "testing"}); err != nil {
-		log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
-	}
+	log.AddPackage(log.JSON, log.ErrorLevel, nil)
+	log.UpdateAllLoggers(log.Fields{"instanceId": "testing"})
+	log.SetAllLogLevel(log.ErrorLevel)
+
 	coreKafkaProxy, _ = kk.NewKafkaMessagingProxy(
-		kk.KafkaHost("10.176.215.107"),
+		kk.KafkaHost("192.168.0.20"),
 		kk.KafkaPort(9092),
 		kk.DefaultTopic(&kk.Topic{Name: "Core"}))
 
 	adapterKafkaProxy, _ = kk.NewKafkaMessagingProxy(
-		kk.KafkaHost("10.176.215.107"),
+		kk.KafkaHost("192.168.0.20"),
 		kk.KafkaPort(9092),
 		kk.DefaultTopic(&kk.Topic{Name: "Adapter"}))
 
@@ -53,7 +58,7 @@
 
 func subscribeTarget(kmp *kk.KafkaMessagingProxy) {
 	topic := kk.Topic{Name: "Core"}
-	requestProxy := &rhp.RequestHandlerProxy{TestMode: true}
+	requestProxy := &rhp.AdapterRequestHandlerProxy{TestMode: true}
 	kmp.SubscribeWithTarget(topic, requestProxy)
 }
 
@@ -94,7 +99,7 @@
 
 func TestMultipleSubscribeUnsubscribe(t *testing.T) {
 	// First subscribe to the specific topic
-	log.SetLoglevel(0)
+	//log.SetPackageLogLevel("github.com/opencord/voltha-go/kafka", log.DebugLevel)
 	var err error
 	var ch1 <-chan *ca.InterContainerMessage
 	var ch2 <-chan *ca.InterContainerMessage
@@ -133,7 +138,7 @@
 }
 
 func TestIncorrectAPI(t *testing.T) {
-	log.SetLoglevel(3)
+	log.SetPackageLogLevel("github.com/opencord/voltha-go/kafka", log.ErrorLevel)
 	trnsId := uuid.New().String()
 	protoMsg := &voltha.Device{Id: trnsId}
 	args := make([]*kk.KVArg, 1)
@@ -181,7 +186,7 @@
 
 func TestGetDevice(t *testing.T) {
 	trnsId := uuid.New().String()
-	protoMsg := &ca.StrType{Val: trnsId}
+	protoMsg := &voltha.ID{Id:trnsId}
 	args := make([]*kk.KVArg, 1)
 	args[0] = &kk.KVArg{
 		Key:   "deviceID",
@@ -207,7 +212,7 @@
 
 func TestGetDeviceTimeout(t *testing.T) {
 	trnsId := uuid.New().String()
-	protoMsg := &ca.StrType{Val: trnsId}
+	protoMsg := &voltha.ID{Id:trnsId}
 	args := make([]*kk.KVArg, 1)
 	args[0] = &kk.KVArg{
 		Key:   "deviceID",
@@ -232,7 +237,7 @@
 
 func TestGetChildDevice(t *testing.T) {
 	trnsId := uuid.New().String()
-	protoMsg := &ca.StrType{Val: trnsId}
+	protoMsg := &voltha.ID{Id:trnsId}
 	args := make([]*kk.KVArg, 1)
 	args[0] = &kk.KVArg{
 		Key:   "deviceID",
@@ -255,7 +260,7 @@
 
 func TestGetChildDevices(t *testing.T) {
 	trnsId := uuid.New().String()
-	protoMsg := &ca.StrType{Val: trnsId}
+	protoMsg := &voltha.ID{Id:trnsId}
 	args := make([]*kk.KVArg, 1)
 	args[0] = &kk.KVArg{
 		Key:   "deviceID",
@@ -278,7 +283,7 @@
 
 func TestGetPorts(t *testing.T) {
 	trnsId := uuid.New().String()
-	protoArg1 := &ca.StrType{Val: trnsId}
+	protoArg1 := &voltha.ID{Id:trnsId}
 	args := make([]*kk.KVArg, 2)
 	args[0] = &kk.KVArg{
 		Key:   "deviceID",
@@ -306,7 +311,7 @@
 
 func TestGetPortsMissingArgs(t *testing.T) {
 	trnsId := uuid.New().String()
-	protoArg1 := &ca.StrType{Val: trnsId}
+	protoArg1 := &voltha.ID{Id:trnsId}
 	args := make([]*kk.KVArg, 1)
 	args[0] = &kk.KVArg{
 		Key:   "deviceID",
@@ -423,11 +428,6 @@
 		Key:   "childDeviceType",
 		Value: protoArg3,
 	}
-	protoArg4 := &voltha.Device_ProxyAddress{DeviceId: trnsId, ChannelId: 100}
-	args[3] = &kk.KVArg{
-		Key:   "proxyAddress",
-		Value: protoArg4,
-	}
 
 	rpc := "ChildDeviceDetected"
 	topic := kk.Topic{Name: "Core"}
