diff --git a/.gitignore b/.gitignore
index 5a1a698..8ae7909 100644
--- a/.gitignore
+++ b/.gitignore
@@ -56,6 +56,3 @@
 # test output
 tests/results
 sca-report
-
-# etcd mocks
-ro_core/core/voltha.lib.mocks.etcd
diff --git a/Makefile b/Makefile
index 78783a5..f79717a 100644
--- a/Makefile
+++ b/Makefile
@@ -30,7 +30,6 @@
 DOCKER_REPOSITORY          ?=
 DOCKER_TAG                 ?= ${VERSION}$(shell [[ ${DOCKER_LABEL_VCS_DIRTY} == "true" ]] && echo "-dirty" || true)
 RWCORE_IMAGENAME           := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-rw-core
-ROCORE_IMAGENAME           := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-ro-core
 TYPE                       ?= minimal
 
 ## Docker labels. Only set ref and commit date if committed
@@ -58,7 +57,7 @@
 DOCKER_BUILD_ARGS_LOCAL ?= ${DOCKER_BUILD_ARGS} \
 	--build-arg LOCAL_PROTOS=${LOCAL_PROTOS}
 
-.PHONY: rw_core ro_core local-protos
+.PHONY: rw_core local-protos
 
 # This should to be the first and default target in this Makefile
 help:
@@ -68,7 +67,6 @@
 	@echo "build                : Build the docker images."
 	@echo "                         - If this is the first time you are building, choose 'make build' option."
 	@echo "rw_core              : Build the rw_core docker image"
-	@echo "ro_core              : Build the ro_core docker image"
 	@echo "clean                : Remove files created by the build and tests"
 	@echo "distclean            : Remove sca directory and clean"
 	@echo "docker-push          : Push the docker images to an external repository"
@@ -99,22 +97,17 @@
 
 build: docker-build
 
-docker-build: rw_core ro_core
+docker-build: rw_core
 
 rw_core: local-protos local-lib-go
 	docker build $(DOCKER_BUILD_ARGS) -t ${RWCORE_IMAGENAME}:${DOCKER_TAG} -t ${RWCORE_IMAGENAME}:latest -f docker/Dockerfile.rw_core .
 
-ro_core: local-protos local-lib-go
-	docker build $(DOCKER_BUILD_ARGS) -t ${ROCORE_IMAGENAME}:${DOCKER_TAG} -t ${ROCORE_IMAGENAME}:latest -f docker/Dockerfile.ro_core .
-
 docker-push:
 	docker push ${RWCORE_IMAGENAME}:${DOCKER_TAG}
-	docker push ${ROCORE_IMAGENAME}:${DOCKER_TAG}
 
 docker-kind-load:
 	@if [ "`kind get clusters | grep voltha-$(TYPE)`" = '' ]; then echo "no voltha-$(TYPE) cluster found" && exit 1; fi
 	kind load docker-image ${RWCORE_IMAGENAME}:${DOCKER_TAG} --name=voltha-$(TYPE) --nodes $(shell kubectl get nodes --template='{{range .items}}{{.metadata.name}},{{end}}' | rev | cut -c 2- | rev)
-	kind load docker-image ${ROCORE_IMAGENAME}:${DOCKER_TAG} --name=voltha-$(TYPE) --nodes $(shell kubectl get nodes --template='{{range .items}}{{.metadata.name}},{{end}}' | rev | cut -c 2- | rev)
 
 ## lint and unit tests
 
@@ -200,7 +193,7 @@
 sca: golangci_lint_tool_install
 	rm -rf ./sca-report
 	@mkdir -p ./sca-report
-	$(GOLANGCI_LINT_TOOL) run --deadline=2m -E golint --out-format junit-xml ./cli/... ./rw_core/... ./ro_core/... ./tests/... ./common/... ./db/... 2>&1 | tee ./sca-report/sca-report.xml
+	$(GOLANGCI_LINT_TOOL) run --deadline=4m -E golint --out-format junit-xml ./rw_core/... ./tests/... ./common/... ./db/... 2>&1 | tee ./sca-report/sca-report.xml
 
 test: go_junit_install gocover_cobertura_install local-lib-go
 	@mkdir -p ./tests/results
diff --git a/cli/main.go b/cli/main.go
deleted file mode 100644
index f87bd6c..0000000
--- a/cli/main.go
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"log"
-	"os/exec"
-
-	"github.com/opencord/voltha-go/cli/menu/mainmenu"
-	l "github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"google.golang.org/grpc"
-)
-
-func main() {
-
-	// disable input buffering
-	err := exec.Command("stty", "-F", "/dev/tty", "cbreak", "min", "1").Run()
-	if err != nil {
-		l.Errorw("unable-to-configure-terminal-session-parameters-cbreak-and-min", l.Fields{"error": err})
-	}
-	// do not display entered characters on the screen
-	err = exec.Command("stty", "-F", "/dev/tty", "-echo").Run()
-	if err != nil {
-		l.Errorw("unable-to-configure-terminal-session-parameter-echo", l.Fields{"error": err})
-	}
-	printHeader()
-
-	volthaAddress := flag.String("voltha_address", "localhost:6161", "IP/Hostname:Port for Voltha Core")
-	h := flag.Bool("h", false, "Print help")
-	help := flag.Bool("help", false, "Print help")
-	flag.Parse()
-	if *h || *help {
-		fmt.Println("cli -h(elp) print this message")
-		fmt.Println("cli -voltha_address=$VOLTHA_ADDRESS:PORT default localhost:6161")
-		return
-	}
-	conn, err := grpc.Dial(*volthaAddress, grpc.WithInsecure())
-	if err != nil {
-		log.Fatalf("did not connect: %s", err)
-	}
-	defer conn.Close()
-	fmt.Println("Connecting to " + *volthaAddress)
-
-	mainmenu.MainLoop(conn)
-}
-func printHeader() {
-	header :=
-		`         _ _   _            ___ _    ___
-__ _____| | |_| |_  __ _   / __| |  |_ _|
-\ V / _ \ |  _| ' \/ _' | | (__| |__ | |
- \_/\___/_|\__|_||_\__,_|  \___|____|___|
-`
-	fmt.Println(header)
-}
diff --git a/cli/menu/devicemenu/deviceMenu.go b/cli/menu/devicemenu/deviceMenu.go
deleted file mode 100644
index a392e95..0000000
--- a/cli/menu/devicemenu/deviceMenu.go
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import (
-	"fmt"
-
-	"github.com/bclicn/color"
-	"github.com/opencord/voltha-go/cli/util"
-	"google.golang.org/grpc"
-)
-
-/*
-Conn - the grpc connection to use for making calls to voltha core
-*/
-var (
-	Conn        *grpc.ClientConn
-	DeviceID    *string
-	InputPrompt *string
-	Commands    *[]string
-)
-
-/*
-MainLoop - the loop which processes commands at the main level
-*/
-func MainLoop(conn *grpc.ClientConn, deviceID string) {
-
-	DeviceID = &deviceID
-	inputPrompt := fmt.Sprint("(" + color.LightRed("device "+deviceID) + ") ")
-	InputPrompt = &inputPrompt
-	funcTable := make(map[string]func(bool))
-	//	inputPromptSize := len(inputPrompt)
-	Conn = conn
-	funcTable["quit"] = util.Exit
-	funcTable["exit"] = nil
-	funcTable["edit"] = doEdit
-	funcTable["history"] = doHistory
-	funcTable["img_dnld_request"] = doImgDnldRequest
-	funcTable["perf_config"] = doPerfConfig
-	funcTable["save"] = doSave
-	funcTable["eof"] = doEOF
-	funcTable["images"] = doImages
-	funcTable["img_dnld_status"] = doImgDnldStatus
-	funcTable["ports"] = doPorts
-	funcTable["set"] = doSet
-	funcTable["img_activate"] = doImgActivate
-	funcTable["img_revert"] = doImgRevert
-	funcTable["py"] = doPy
-	funcTable["shell"] = doShell
-	funcTable["flows"] = doFlows
-	funcTable["img_dnld_canel"] = doImgDnldCancel
-	funcTable["list"] = doList
-	funcTable["shortcuts"] = doShortCuts
-	funcTable["help"] = doHelp
-	funcTable["img_dnld_list"] = doImgDnldList
-	funcTable["pause"] = doPause
-	funcTable["run"] = doRun
-	funcTable["show"] = doShow
-
-	commands := make([]string, len(funcTable))
-	i := 0
-	for key := range funcTable {
-		commands[i] = key
-		i++
-	}
-	Commands = &commands
-
-	util.ProcessTable(funcTable, inputPrompt)
-
-}
diff --git a/cli/menu/devicemenu/edit.go b/cli/menu/devicemenu/edit.go
deleted file mode 100644
index 137ec10..0000000
--- a/cli/menu/devicemenu/edit.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doEdit(enterPressed bool) {
-	fmt.Println("doEdit")
-}
diff --git a/cli/menu/devicemenu/eof.go b/cli/menu/devicemenu/eof.go
deleted file mode 100644
index 2c73b26..0000000
--- a/cli/menu/devicemenu/eof.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doEOF(enterPressed bool) {
-	fmt.Println("doEOF")
-}
diff --git a/cli/menu/devicemenu/flows.go b/cli/menu/devicemenu/flows.go
deleted file mode 100644
index b9c3add..0000000
--- a/cli/menu/devicemenu/flows.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doFlows(enterPressed bool) {
-	fmt.Println("doFlows")
-}
diff --git a/cli/menu/devicemenu/help.go b/cli/menu/devicemenu/help.go
deleted file mode 100644
index 69475c0..0000000
--- a/cli/menu/devicemenu/help.go
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import (
-	"fmt"
-	"os"
-	"strings"
-
-	"github.com/opencord/voltha-go/cli/util"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-)
-
-func doHelp(enterPressed bool) {
-	input := ""
-	var b = make([]byte, 1)
-	inputPrompt := *InputPrompt + "help "
-	for {
-		_, err := os.Stdin.Read(b)
-		if err != nil {
-			log.Errorw("unable-to-read-from-stdin-file", log.Fields{"error": err})
-		}
-		char := string(b)
-		if char == "\t" || char == "\n" || char == "?" {
-			if enterPressed {
-				baseHelp()
-				return
-			}
-
-			fmt.Println("")
-			ret, prompt := util.Test(input, *Commands)
-			if len(ret) == 1 {
-				input = ret[0]
-				if input == "quit" {
-					util.Exit(true)
-				} else if input == "exit" {
-					return
-				}
-
-				MainLoop(Conn, input)
-				return
-			} else if len(ret) == 0 {
-				input = ""
-				fmt.Print("Invalid Input \n" + inputPrompt)
-			} else {
-
-				fmt.Println(ret)
-				input = prompt
-				fmt.Print(prompt + inputPrompt)
-			}
-		} else if b[0] == 127 || char == "\b" {
-
-			sz := len(input)
-			if sz > 0 {
-				fmt.Print("\b \b")
-				input = input[:sz-1]
-			}
-			if !(strings.HasPrefix(input, "device")) {
-				return
-			}
-		} else {
-			fmt.Print(char)
-			input += char
-		}
-	}
-}
-func baseHelp() {
-	message := `
-Documented commands (type help <topic>):
-========================================
-edit   help          img_dnld_cancel   img_revert   ports  set
-eof    history       img_dnld_list     list         py     shell
-exit   images        img_dnld_request  pause        run    shortcuts
-flows  img_activate  img_dnld_status   perf_config  save   show
-
-Miscellaneous help topics:
-==========================
-load
-
-Undocumented commands:
-======================
-quit
-
-`
-	fmt.Println(message)
-}
diff --git a/cli/menu/devicemenu/history.go b/cli/menu/devicemenu/history.go
deleted file mode 100644
index 009fb16..0000000
--- a/cli/menu/devicemenu/history.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doHistory(enterPressed bool) {
-	fmt.Println("doHistory")
-}
diff --git a/cli/menu/devicemenu/images.go b/cli/menu/devicemenu/images.go
deleted file mode 100644
index b859af2..0000000
--- a/cli/menu/devicemenu/images.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doImages(enterPressed bool) {
-	fmt.Println("doImages")
-}
diff --git a/cli/menu/devicemenu/img_activate.go b/cli/menu/devicemenu/img_activate.go
deleted file mode 100644
index d900401..0000000
--- a/cli/menu/devicemenu/img_activate.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doImgActivate(enterPressed bool) {
-	fmt.Println("doImgActivate")
-}
diff --git a/cli/menu/devicemenu/img_dnld_cancel.go b/cli/menu/devicemenu/img_dnld_cancel.go
deleted file mode 100644
index 7dbffd8..0000000
--- a/cli/menu/devicemenu/img_dnld_cancel.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doImgDnldCancel(enterPressed bool) {
-	fmt.Println("doImgDnldCancel")
-}
diff --git a/cli/menu/devicemenu/img_dnld_list.go b/cli/menu/devicemenu/img_dnld_list.go
deleted file mode 100644
index 06b0e48..0000000
--- a/cli/menu/devicemenu/img_dnld_list.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doImgDnldList(enterPressed bool) {
-	fmt.Println("doImgDnldList")
-}
diff --git a/cli/menu/devicemenu/img_dnld_request.go b/cli/menu/devicemenu/img_dnld_request.go
deleted file mode 100644
index c2cb739..0000000
--- a/cli/menu/devicemenu/img_dnld_request.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doImgDnldRequest(enterPressed bool) {
-	fmt.Println("doImgDnldRequest")
-}
diff --git a/cli/menu/devicemenu/img_dnld_status.go b/cli/menu/devicemenu/img_dnld_status.go
deleted file mode 100644
index c338524..0000000
--- a/cli/menu/devicemenu/img_dnld_status.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doImgDnldStatus(enterPressed bool) {
-	fmt.Println("doImgDnldStatus")
-}
diff --git a/cli/menu/devicemenu/img_revert.go b/cli/menu/devicemenu/img_revert.go
deleted file mode 100644
index 4d0aaa5..0000000
--- a/cli/menu/devicemenu/img_revert.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doImgRevert(enterPressed bool) {
-	fmt.Println("doImgRevert")
-}
diff --git a/cli/menu/devicemenu/list.go b/cli/menu/devicemenu/list.go
deleted file mode 100644
index 31804e5..0000000
--- a/cli/menu/devicemenu/list.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doList(enterPressed bool) {
-	fmt.Println("doList")
-}
diff --git a/cli/menu/devicemenu/pause.go b/cli/menu/devicemenu/pause.go
deleted file mode 100644
index 3c77bfb..0000000
--- a/cli/menu/devicemenu/pause.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doPause(enterPressed bool) {
-	fmt.Println("doPause")
-}
diff --git a/cli/menu/devicemenu/perf_config.go b/cli/menu/devicemenu/perf_config.go
deleted file mode 100644
index 178a17e..0000000
--- a/cli/menu/devicemenu/perf_config.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doPerfConfig(enterPressed bool) {
-	fmt.Println("doPrefConfig")
-}
diff --git a/cli/menu/devicemenu/ports.go b/cli/menu/devicemenu/ports.go
deleted file mode 100644
index 2d9f276..0000000
--- a/cli/menu/devicemenu/ports.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doPorts(enterPressed bool) {
-	fmt.Println("doPorts")
-}
diff --git a/cli/menu/devicemenu/py.go b/cli/menu/devicemenu/py.go
deleted file mode 100644
index 8667ed3..0000000
--- a/cli/menu/devicemenu/py.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doPy(enterPressed bool) {
-	fmt.Println("doPy")
-}
diff --git a/cli/menu/devicemenu/run.go b/cli/menu/devicemenu/run.go
deleted file mode 100644
index b8b780b..0000000
--- a/cli/menu/devicemenu/run.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doRun(enterPressed bool) {
-	fmt.Println("doRun")
-}
diff --git a/cli/menu/devicemenu/save.go b/cli/menu/devicemenu/save.go
deleted file mode 100644
index dd531da..0000000
--- a/cli/menu/devicemenu/save.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doSave(enterPressed bool) {
-	fmt.Println("doSave")
-}
diff --git a/cli/menu/devicemenu/set.go b/cli/menu/devicemenu/set.go
deleted file mode 100644
index c44e164..0000000
--- a/cli/menu/devicemenu/set.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doSet(enterPressed bool) {
-	fmt.Println("doSet")
-}
diff --git a/cli/menu/devicemenu/shell.go b/cli/menu/devicemenu/shell.go
deleted file mode 100644
index ddfd8f8..0000000
--- a/cli/menu/devicemenu/shell.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doShell(enterPressed bool) {
-	fmt.Println("doShell")
-}
diff --git a/cli/menu/devicemenu/shortcuts.go b/cli/menu/devicemenu/shortcuts.go
deleted file mode 100644
index 0e3d120..0000000
--- a/cli/menu/devicemenu/shortcuts.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import "fmt"
-
-func doShortCuts(enterPressed bool) {
-	fmt.Println("doShortCuts")
-}
diff --git a/cli/menu/devicemenu/show.go b/cli/menu/devicemenu/show.go
deleted file mode 100644
index 4113532..0000000
--- a/cli/menu/devicemenu/show.go
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package devicemenu
-
-import (
-	"context"
-	"fmt"
-	"strconv"
-
-	"github.com/opencord/voltha-go/cli/util"
-	"github.com/opencord/voltha-protos/v3/go/common"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-)
-
-func doShow(enterPressed bool) {
-	client := voltha.NewVolthaServiceClient(Conn)
-	fmt.Println(*DeviceID)
-	device, err := client.GetDevice(context.Background(), &common.ID{Id: *DeviceID})
-	if err != nil {
-		fmt.Println(err)
-	}
-	fields := []string{"field", "value"}
-	var rows []map[string]string
-
-	id := make(map[string]string)
-	id["field"] = "id"
-	id["value"] = device.Id
-	rows = append(rows, id)
-
-	Type := make(map[string]string)
-	Type["field"] = "type"
-	Type["value"] = device.Type
-	rows = append(rows, Type)
-
-	parentID := make(map[string]string)
-	parentID["field"] = "parent_id"
-	parentID["value"] = device.ParentId
-	rows = append(rows, parentID)
-
-	vlan := make(map[string]string)
-	vlan["field"] = "vlan"
-	vlan["value"] = strconv.FormatUint(uint64(device.Vlan), 10)
-	rows = append(rows, vlan)
-
-	adminState := make(map[string]string)
-	adminState["field"] = "admin_state"
-	adminState["value"] = strconv.FormatUint(uint64(device.AdminState), 10)
-	rows = append(rows, adminState)
-
-	proxyAddress := device.GetProxyAddress()
-	proxyDeviceID := make(map[string]string)
-	proxyDeviceID["field"] = "proxy_address.device_id"
-	proxyDeviceID["value"] = proxyAddress.DeviceId
-	rows = append(rows, proxyDeviceID)
-
-	proxyDeviceType := make(map[string]string)
-	proxyDeviceType["field"] = "proxy_address.device_type"
-	proxyDeviceType["value"] = proxyAddress.DeviceType
-	rows = append(rows, proxyDeviceType)
-
-	proxyChannelID := make(map[string]string)
-	proxyChannelID["field"] = "proxy_address.channel_id"
-	proxyChannelID["value"] = strconv.FormatUint(uint64(proxyAddress.ChannelId), 10)
-	rows = append(rows, proxyChannelID)
-
-	parentPortNumber := make(map[string]string)
-	parentPortNumber["field"] = "parent_port_no"
-	parentPortNumber["value"] = strconv.FormatUint(uint64(device.GetParentPortNo()), 10)
-	rows = append(rows, parentPortNumber)
-
-	output, _ := util.BuildTable(fields, rows)
-
-	fmt.Println(output)
-}
diff --git a/cli/menu/mainmenu/Makefile b/cli/menu/mainmenu/Makefile
deleted file mode 100644
index fd522a5..0000000
--- a/cli/menu/mainmenu/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-VOLTHA_PROTO_PATH := protos/voltha_protos
-VOLTHA_PROTO_FILES := $(wildcard protos/voltha_protos/*.proto)
-VOLTHA_PROTO_GO_FILES := $(foreach f,$(VOLTHA_PROTO_FILES),$(subst .proto,.pb.go,$(f)))
-VOLTHA_PROTO_DESC_FILES := $(foreach f,$(VOLTHA_PROTO_FILES),$(subst .proto,.desc,$(f)))
-
-voltha-api: $(VOLTHA_PROTO_GO_FILES)
-
-%.pb.go: %.proto
-	@protoc -I ${VOLTHA_PROTO_PATH} \
-                --go_out=plugins=grpc:${VOLTHA_PROTO_PATH} \
-                -I${GOPATH}/src \
-                -I${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \
-                $<
diff --git a/cli/menu/mainmenu/alarmFilters.go b/cli/menu/mainmenu/alarmFilters.go
deleted file mode 100644
index 4473a87..0000000
--- a/cli/menu/mainmenu/alarmFilters.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doAlarmFilters(enterPressed bool) {
-	fmt.Print("input: alarm_filters>")
-}
diff --git a/cli/menu/mainmenu/arriveOnus.go b/cli/menu/mainmenu/arriveOnus.go
deleted file mode 100644
index 06b699d..0000000
--- a/cli/menu/mainmenu/arriveOnus.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doArriveOnus(enterPressed bool) {
-	fmt.Print("input: arrive_onus>")
-}
diff --git a/cli/menu/mainmenu/cmdEnvironment.go b/cli/menu/mainmenu/cmdEnvironment.go
deleted file mode 100644
index d3a54fe..0000000
--- a/cli/menu/mainmenu/cmdEnvironment.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doCmdEnvironment(enterPressed bool) {
-	fmt.Println("input: doCmdEnvironment> ")
-}
diff --git a/cli/menu/mainmenu/delete.go b/cli/menu/mainmenu/delete.go
deleted file mode 100644
index c8d4226..0000000
--- a/cli/menu/mainmenu/delete.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doDelete(enterPressed bool) {
-	fmt.Println("input: delete > ")
-}
diff --git a/cli/menu/mainmenu/deleteAllFlows.go b/cli/menu/mainmenu/deleteAllFlows.go
deleted file mode 100644
index bf13cfb..0000000
--- a/cli/menu/mainmenu/deleteAllFlows.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doDeleteAllFlows(enterPressed bool) {
-	fmt.Print("input: delete_all_flows>")
-}
diff --git a/cli/menu/mainmenu/device.go b/cli/menu/mainmenu/device.go
deleted file mode 100644
index 783c064..0000000
--- a/cli/menu/mainmenu/device.go
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import (
-	"context"
-	"fmt"
-	"os"
-	"strings"
-
-	"github.com/golang/protobuf/ptypes/empty"
-	"github.com/opencord/voltha-go/cli/menu/devicemenu"
-	"github.com/opencord/voltha-go/cli/util"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-)
-
-func doDevice(enterPressed bool) {
-	fmt.Print(" ")
-	client := voltha.NewVolthaServiceClient(Conn)
-	devices, err := client.ListDevices(context.Background(), &empty.Empty{})
-	items := devices.GetItems()
-	if err != nil {
-		fmt.Println(err)
-	}
-	deviceIDs := []string{"exit", "quit"}
-	for i := 0; i < len(items); i++ {
-		deviceIDs = append(deviceIDs, items[i].Id)
-	}
-	var b = make([]byte, 1)
-	input := ""
-
-	for {
-		_, err := os.Stdin.Read(b)
-		if err != nil {
-			log.Errorw("unable-to-read-from-stdin-file", log.Fields{"error": err})
-		}
-		char := string(b)
-		if char == "\t" || char == "\n" || char == "?" {
-			fmt.Println("")
-			ret, prompt := util.Test(input, deviceIDs)
-			if len(ret) == 1 {
-				input = ret[0]
-				if input == "quit" {
-					util.Exit(true)
-				} else if input == "exit" {
-					return
-				}
-
-				devicemenu.MainLoop(Conn, input)
-				return
-			} else if len(ret) == 0 {
-				input = ""
-				fmt.Print("Invalid Input \ninput:")
-			} else {
-
-				fmt.Println(ret)
-				input = prompt
-				fmt.Print("input: " + prompt)
-			}
-		} else if b[0] == 127 || char == "\b" {
-
-			sz := len(input)
-			if sz > 0 {
-				fmt.Print("\b \b")
-				input = input[:sz-1]
-			}
-			if !(strings.HasPrefix(input, "device")) {
-				return
-			}
-		} else {
-			fmt.Print(char)
-			input += char
-		}
-	}
-
-}
diff --git a/cli/menu/mainmenu/devices.go b/cli/menu/mainmenu/devices.go
deleted file mode 100644
index ec373a0..0000000
--- a/cli/menu/mainmenu/devices.go
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import (
-	"context"
-	"fmt"
-	"strconv"
-
-	"github.com/golang/protobuf/ptypes/empty"
-	"github.com/opencord/voltha-go/cli/util"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-)
-
-/*
- reason | proxy_address.device_id | proxy_address.onu_id | proxy_address.onu_session_id |
-*/
-func doDevices(enterPressed bool) {
-
-	client := voltha.NewVolthaServiceClient(Conn)
-	devices, err := client.ListDevices(context.Background(), &empty.Empty{})
-	if err != nil {
-		fmt.Println(err)
-	}
-	var rows []map[string]string
-	items := devices.GetItems()
-	var fields = []string{"id", "type", "root", "parent_id", "serial_number", "admin_state", "oper_status", "connect_status", "parent_port_no", "host_and_port", "reason",
-		"proxy_address.device_id", "proxy_address.onu_id", "proxy_address.onu_session_id"}
-
-	for i := 0; i < len(items); i++ {
-		//fmt.Println(items[i])
-		device := items[i]
-		row := make(map[string]string)
-		row["id"] = device.Id
-		row["type"] = device.Type
-		row["root"] = strconv.FormatBool(device.Root)
-		row["parent_id"] = device.ParentId
-		row["serial_number"] = device.SerialNumber
-		row["admin_state"] = device.AdminState.String()
-		row["oper_status"] = device.OperStatus.String()
-		row["connect_status"] = device.ConnectStatus.String()
-		row["parent_port_no"] = strconv.FormatUint(uint64(device.GetParentPortNo()), 10)
-		row["host_and_port"] = device.GetHostAndPort()
-		row["reason"] = device.Reason
-		proxyAddress := device.GetProxyAddress()
-		if proxyAddress != nil {
-			row["proxy_address.device_id"] = proxyAddress.DeviceId
-			row["proxy_address.onu_id"] = strconv.FormatUint(uint64(proxyAddress.OnuId), 10)
-			row["proxy_address.onu_session_id"] = strconv.FormatUint(uint64(proxyAddress.OnuSessionId), 10)
-		} else {
-			row["proxy_address.device_id"] = ""
-			row["proxy_address.onu_id"] = ""
-			row["proxy_address.onu_session_id"] = ""
-		}
-
-		rows = append(rows, row)
-	}
-	output, err := util.BuildTable(fields, rows)
-	if err != nil {
-		fmt.Println(err)
-	}
-	fmt.Print(output)
-
-}
diff --git a/cli/menu/mainmenu/disable.go b/cli/menu/mainmenu/disable.go
deleted file mode 100644
index f0bfb0f..0000000
--- a/cli/menu/mainmenu/disable.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doDisable(enterPressed bool) {
-	fmt.Print("input: disable>")
-}
diff --git a/cli/menu/mainmenu/enable.go b/cli/menu/mainmenu/enable.go
deleted file mode 100644
index 691407d..0000000
--- a/cli/menu/mainmenu/enable.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doEnable(enterPressed bool) {
-	fmt.Print("input: enable>")
-}
diff --git a/cli/menu/mainmenu/health.go b/cli/menu/mainmenu/health.go
deleted file mode 100644
index b6ca362..0000000
--- a/cli/menu/mainmenu/health.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doHealth(enterPressed bool) {
-	fmt.Print("input: health>")
-}
diff --git a/cli/menu/mainmenu/injectEapolStart.go b/cli/menu/mainmenu/injectEapolStart.go
deleted file mode 100644
index c71e958..0000000
--- a/cli/menu/mainmenu/injectEapolStart.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doInjectEapolStart(enterPressed bool) {
-	fmt.Print("input: inject_eapol_start>")
-}
diff --git a/cli/menu/mainmenu/installAllControllerBoundFlows.go b/cli/menu/mainmenu/installAllControllerBoundFlows.go
deleted file mode 100644
index 6f394d7..0000000
--- a/cli/menu/mainmenu/installAllControllerBoundFlows.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doInstallAllControllerBoundFlows(enterPressed bool) {
-	fmt.Print("input: install_all_controller_bound_flows>")
-}
diff --git a/cli/menu/mainmenu/installAllSampleFlows.go b/cli/menu/mainmenu/installAllSampleFlows.go
deleted file mode 100644
index fedb7e3..0000000
--- a/cli/menu/mainmenu/installAllSampleFlows.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doInstallAllSampleFlows(enterPressed bool) {
-	fmt.Print("input: install_all_sample_flows>")
-}
diff --git a/cli/menu/mainmenu/installDhcpFlows.go b/cli/menu/mainmenu/installDhcpFlows.go
deleted file mode 100644
index 3b71b35..0000000
--- a/cli/menu/mainmenu/installDhcpFlows.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doInstallDhcpFlows(enterPressed bool) {
-	fmt.Print("input: install_dhcp_flows>")
-}
diff --git a/cli/menu/mainmenu/installEapolFlow.go b/cli/menu/mainmenu/installEapolFlow.go
deleted file mode 100644
index 5c68d98..0000000
--- a/cli/menu/mainmenu/installEapolFlow.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doInstallEapolFlow(enterPressed bool) {
-	fmt.Print("input: install_eapol_flow>")
-}
diff --git a/cli/menu/mainmenu/launch.go b/cli/menu/mainmenu/launch.go
deleted file mode 100644
index ec5a40b..0000000
--- a/cli/menu/mainmenu/launch.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doLaunch(enterPressed bool) {
-	fmt.Print("input: launch")
-}
diff --git a/cli/menu/mainmenu/load.go b/cli/menu/mainmenu/load.go
deleted file mode 100644
index 8b462b0..0000000
--- a/cli/menu/mainmenu/load.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doLoad(enterPressed bool) {
-	fmt.Println("input: load>")
-}
diff --git a/cli/menu/mainmenu/log.go b/cli/menu/mainmenu/log.go
deleted file mode 100644
index 7f5a9bd..0000000
--- a/cli/menu/mainmenu/log.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doLog(enterPressed bool) {
-	fmt.Print("input: log>")
-}
diff --git a/cli/menu/mainmenu/logicalDevice.go b/cli/menu/mainmenu/logicalDevice.go
deleted file mode 100644
index 2ba2874..0000000
--- a/cli/menu/mainmenu/logicalDevice.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doLogicalDevice(enterPressed bool) {
-	fmt.Print("input: logical_device>")
-}
diff --git a/cli/menu/mainmenu/logicalDevices.go b/cli/menu/mainmenu/logicalDevices.go
deleted file mode 100644
index a178366..0000000
--- a/cli/menu/mainmenu/logicalDevices.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doLogicalDevices(enterPressed bool) {
-	fmt.Print("input: logical_devices>")
-}
diff --git a/cli/menu/mainmenu/mainMenu.go b/cli/menu/mainmenu/mainMenu.go
deleted file mode 100644
index 8d45917..0000000
--- a/cli/menu/mainmenu/mainMenu.go
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import (
-	"fmt"
-
-	"github.com/bclicn/color"
-	"github.com/opencord/voltha-go/cli/util"
-	"google.golang.org/grpc"
-)
-
-/*
-Conn - the grpc connection to use for making calls to voltha core
-*/
-var Conn *grpc.ClientConn
-
-/*
-MainLoop - the loop which processes commands at the main level
-*/
-func MainLoop(conn *grpc.ClientConn) {
-
-	inputPrompt := fmt.Sprint("(" + color.LightBlue("voltha") + ") ")
-	//	inputPromptSize := len(inputPrompt)
-	Conn = conn
-	mainFuncTable := make(map[string]func(bool))
-	mainFuncTable["quit"] = util.Exit
-	mainFuncTable["exit"] = nil
-	mainFuncTable["cmdenvironment"] = doCmdEnvironment
-	mainFuncTable["load"] = doLoad
-	mainFuncTable["relative_load"] = doRelativeLoad
-	mainFuncTable["reset_history"] = doResetHistory
-	mainFuncTable["log"] = doLog
-	mainFuncTable["launch"] = doLaunch
-	mainFuncTable["restart"] = doRestart
-	mainFuncTable["devices"] = doDevices
-	mainFuncTable["device"] = doDevice
-	mainFuncTable["logical_devices"] = doLogicalDevices
-	mainFuncTable["logical_device"] = doLogicalDevice
-	mainFuncTable["omci"] = doOmci
-	mainFuncTable["pdb"] = doPdb
-	mainFuncTable["version"] = doVersion
-	mainFuncTable["health"] = doHealth
-	mainFuncTable["preprovison_olt"] = doPreprovisionOlt
-	mainFuncTable["enable"] = doEnable
-	mainFuncTable["reboot"] = doReboot
-	mainFuncTable["self_test"] = doSelfTest
-	mainFuncTable["delete"] = doDelete
-	mainFuncTable["disable"] = doDisable
-	mainFuncTable["test"] = doTest
-	mainFuncTable["alarm_filters"] = doAlarmFilters
-	mainFuncTable["arrive_onus"] = doArriveOnus
-	mainFuncTable["install_eapol_flow"] = doInstallEapolFlow
-	mainFuncTable["install_all_controller_bound_flows"] = doInstallAllControllerBoundFlows
-	mainFuncTable["install_all_sample_flows"] = doInstallAllSampleFlows
-	mainFuncTable["install_dhcp_flows"] = doInstallDhcpFlows
-	mainFuncTable["delete_all_flows"] = doDeleteAllFlows
-	mainFuncTable["send_simulated_upstream_eapol"] = doSendSimulatedUpstreamEapol
-	mainFuncTable["inject_eapol_start"] = doInjectEapolStart
-	util.ProcessTable(mainFuncTable, inputPrompt)
-}
diff --git a/cli/menu/mainmenu/omci.go b/cli/menu/mainmenu/omci.go
deleted file mode 100644
index d648960..0000000
--- a/cli/menu/mainmenu/omci.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doOmci(enterPressed bool) {
-	fmt.Print("input: ocmi>")
-}
diff --git a/cli/menu/mainmenu/pdb.go b/cli/menu/mainmenu/pdb.go
deleted file mode 100644
index ec44436..0000000
--- a/cli/menu/mainmenu/pdb.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doPdb(enterPressed bool) {
-	fmt.Print("input: pdb>")
-}
diff --git a/cli/menu/mainmenu/preprovisionOlt.go b/cli/menu/mainmenu/preprovisionOlt.go
deleted file mode 100644
index effa8ed..0000000
--- a/cli/menu/mainmenu/preprovisionOlt.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doPreprovisionOlt(enterPressed bool) {
-	fmt.Print("input preprovision_olt>")
-}
diff --git a/cli/menu/mainmenu/reboot.go b/cli/menu/mainmenu/reboot.go
deleted file mode 100644
index 7dcbd6e..0000000
--- a/cli/menu/mainmenu/reboot.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doReboot(enterPressed bool) {
-	fmt.Print("input: reboot>")
-}
diff --git a/cli/menu/mainmenu/relativeLoad.go b/cli/menu/mainmenu/relativeLoad.go
deleted file mode 100644
index 1416e26..0000000
--- a/cli/menu/mainmenu/relativeLoad.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doRelativeLoad(enterPressed bool) {
-	fmt.Print("input: relative_load>")
-}
diff --git a/cli/menu/mainmenu/resetHistory.go b/cli/menu/mainmenu/resetHistory.go
deleted file mode 100644
index 3fb86cd..0000000
--- a/cli/menu/mainmenu/resetHistory.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doResetHistory(enterPressed bool) {
-	fmt.Print("input: reset_history>")
-}
diff --git a/cli/menu/mainmenu/restart.go b/cli/menu/mainmenu/restart.go
deleted file mode 100644
index a014f55..0000000
--- a/cli/menu/mainmenu/restart.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doRestart(enterPressed bool) {
-	fmt.Print("input: restart>")
-}
diff --git a/cli/menu/mainmenu/selfTest.go b/cli/menu/mainmenu/selfTest.go
deleted file mode 100644
index 3ef6675..0000000
--- a/cli/menu/mainmenu/selfTest.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doSelfTest(enterPressed bool) {
-	fmt.Print("input: self_test>")
-}
diff --git a/cli/menu/mainmenu/sendSimulatedUpstreamEapol.go b/cli/menu/mainmenu/sendSimulatedUpstreamEapol.go
deleted file mode 100644
index 22b1e47..0000000
--- a/cli/menu/mainmenu/sendSimulatedUpstreamEapol.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doSendSimulatedUpstreamEapol(enterPressed bool) {
-	fmt.Print("input: send_simulated_upstream_eapol>")
-}
diff --git a/cli/menu/mainmenu/test.go b/cli/menu/mainmenu/test.go
deleted file mode 100644
index 768b0c2..0000000
--- a/cli/menu/mainmenu/test.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doTest(enterPressed bool) {
-	fmt.Print("input: test>")
-}
diff --git a/cli/menu/mainmenu/version.go b/cli/menu/mainmenu/version.go
deleted file mode 100644
index 20c30a4..0000000
--- a/cli/menu/mainmenu/version.go
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package mainmenu
-
-import "fmt"
-
-func doVersion(enterPressed bool) {
-	fmt.Print("input: version>")
-}
diff --git a/cli/util/menuProcessor.go b/cli/util/menuProcessor.go
deleted file mode 100644
index db2387d..0000000
--- a/cli/util/menuProcessor.go
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package util
-
-import (
-	"fmt"
-	"os"
-
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-)
-
-/*
-ProcessTable parses table structure and executes functions
-*/
-func ProcessTable(functionTable map[string]func(bool), inputPrompt string) {
-	keys := []string{}
-	for k := range functionTable {
-		keys = append(keys, k)
-	}
-	var b = make([]byte, 1)
-	input := ""
-	fmt.Print(inputPrompt)
-	for {
-		_, err := os.Stdin.Read(b)
-		if err != nil {
-			log.Errorw("unable-to-read-from-stdin-file", log.Fields{"error": err})
-		}
-		char := string(b)
-		if char == "\t" || char == "\n" || char == "?" {
-			fmt.Println("")
-			ret, prompt := Test(input, keys)
-			if len(ret) == 1 {
-				input = ret[0]
-				if input == "exit" {
-					return
-				}
-				if char == "\n" {
-					Route(input, functionTable, true)
-				} else {
-					Route(input, functionTable, false)
-				}
-				input = ""
-				fmt.Print(inputPrompt)
-			} else if len(ret) == 0 {
-				input = ""
-				fmt.Println("\nInvalid Input ")
-				fmt.Print(inputPrompt)
-			} else if len(ret) == 0 {
-			} else {
-
-				fmt.Println(ret)
-				input = prompt
-				fmt.Print(inputPrompt)
-				fmt.Print(prompt)
-			}
-		} else if char == " " {
-			_, ok := functionTable[input]
-			if ok {
-				Route(input, functionTable, false)
-				fmt.Print(inputPrompt)
-				input = ""
-			} else {
-				ret, prompt := Test(input, keys)
-				if len(ret) == 1 {
-					input = ret[0]
-					Route(input, functionTable, false)
-					input = ""
-					fmt.Print(inputPrompt)
-				} else if len(ret) == 0 {
-					input = ""
-					fmt.Println("\nInvalid Input ")
-					fmt.Print(inputPrompt)
-				} else {
-
-					fmt.Println(ret)
-					input = prompt
-					fmt.Print(inputPrompt + input)
-				}
-			}
-
-		} else if b[0] == 127 || char == "\b" {
-			sz := len(input)
-
-			if sz > 0 {
-				fmt.Print("\b \b")
-				input = input[:sz-1]
-			}
-		} else {
-			fmt.Print(char)
-			input += char
-		}
-	}
-}
diff --git a/cli/util/parseCmd.go b/cli/util/parseCmd.go
deleted file mode 100644
index aa78589..0000000
--- a/cli/util/parseCmd.go
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package util
-
-import (
-	"os"
-	"strings"
-)
-
-// Test makes a bunch on new commands available
-func Test(chars string, values []string) ([]string, string) {
-
-	var ret []string
-	for i := 0; i < len(values); i++ {
-		if strings.HasPrefix(values[i], chars) {
-			ret = append(ret, values[i])
-		}
-	}
-	if len(ret) == 0 {
-		return ret, ""
-	}
-	shortIndex := 0
-	if len(ret) > 1 {
-		for i := 0; i < len(ret); i++ {
-			if len(ret[i]) < len(ret[shortIndex]) {
-				shortIndex = i
-			}
-		}
-	}
-	for i := len(chars); i < len(ret[shortIndex]); i++ {
-		inAllWords := true
-		for j := 0; j < len(ret); j++ {
-			inAllWords = inAllWords && ret[j][i] == ret[shortIndex][i]
-		}
-		if inAllWords {
-			chars += string(ret[shortIndex][i])
-		} else {
-			return ret, chars
-		}
-
-	}
-
-	return ret, chars
-}
-
-// Route will fetch information with respect to table fields
-func Route(command string, table map[string]func(bool), enterPressed bool) {
-	cmd := table[command]
-	cmd(enterPressed)
-
-}
-
-// Exit will come out of connected session
-func Exit(notUsed bool) {
-	os.Exit(0)
-}
diff --git a/cli/util/tableGen.go b/cli/util/tableGen.go
deleted file mode 100644
index 7672eb5..0000000
--- a/cli/util/tableGen.go
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package util
-
-import (
-	"fmt"
-	"strings"
-)
-
-// BuildTable populates input data in tabular format
-func BuildTable(keys []string, rows []map[string]string) (string, error) {
-	var returnString string
-	fieldSizes := make(map[string]int)
-
-	for i := 0; i < len(rows); i++ {
-		for key, value := range rows[i] {
-			currentSize := len(value)
-			if currentSize > fieldSizes[key] {
-				fieldSizes[key] = currentSize
-			}
-
-		}
-	}
-	for i := 0; i < len(keys); i++ {
-		currentSize := len(keys[i])
-		if currentSize > fieldSizes[keys[i]] {
-			fieldSizes[keys[i]] = currentSize
-		}
-	}
-	bottom := "+"
-
-	for i := 0; i < len(rows); i++ {
-		header := "|"
-		line := "|"
-		for j := 0; j < len(keys); j++ {
-			key := keys[j]
-			value := rows[i][key]
-			if i == 0 {
-				pad := 2 + fieldSizes[key] - len(key)
-				field := fmt.Sprintf("%s%s|", strings.Repeat(" ", pad), key)
-				spacer := fmt.Sprintf("%s+", strings.Repeat("-", fieldSizes[key]+2))
-				header = header + field
-				bottom = bottom + spacer
-			}
-			pad := 2 + fieldSizes[key] - len(value)
-			field := fmt.Sprintf("%s%s|", strings.Repeat(" ", pad), value)
-			line = line + field
-
-		}
-		if i == 0 {
-			returnString = bottom + "\n" + header + "\n" + bottom + "\n"
-		}
-
-		returnString = returnString + line + "\n"
-	}
-	returnString = returnString + bottom + "\n"
-
-	return returnString, nil
-
-}
diff --git a/compose/ro_core.yml b/compose/ro_core.yml
deleted file mode 100644
index d23013c..0000000
--- a/compose/ro_core.yml
+++ /dev/null
@@ -1,38 +0,0 @@
----
-# Copyright 2018 the original author or authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-version: '2'
-services:
-  ro_core:
-    image: voltha-ro-core
-    entrypoint:
-        - /app/ro_core
-        - -kv_store_type=etcd
-        - -kv_store_host=${DOCKER_HOST_IP}
-        - -kv_store_port=2379
-        - -grpc_port=50057
-        - -banner=true
-        - -ro_core_topic=rocore
-        - -log_level=0
-    ports:
-      - 50057:50057
-    volumes:
-    - "/var/run/docker.sock:/tmp/docker.sock"
-    networks:
-    - default
-
-networks:
-  default:
-    driver: bridge
diff --git a/docker/Dockerfile.ro_core b/docker/Dockerfile.ro_core
deleted file mode 100644
index 60a5a1f..0000000
--- a/docker/Dockerfile.ro_core
+++ /dev/null
@@ -1,93 +0,0 @@
-# Copyright 2016 the original author or authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# -------------
-# Build stage
-
-FROM golang:1.12-alpine3.9 AS build-env
-
-# Install required packages
-RUN apk add --no-cache \
-        wget=1.20.3-r0 \
-        git=2.20.2-r0 \
-        make=4.2.1-r2 \
-        build-base=0.5-r1 \
-        protobuf=3.6.1-r1 \
-        protobuf-dev=3.6.1-r1
-
-# Golang container has GOPATH set to /go by default. Hence, need to explicitly enable
-# Go modules while using folder /go/src under GOPATH as build path; lest go modules
-# will be disabled
-ENV GO111MODULE=on
-
-# Use Standard go build directory structure
-WORKDIR /go/src
-
-# Copy common files.
-COPY common ./common
-COPY db ./db
-COPY vendor ./vendor
-
-# Copy files.
-COPY ro_core ./ro_core
-COPY go.mod ./
-COPY go.sum ./
-
-ARG org_label_schema_version=unknown
-ARG org_label_schema_vcs_url=unknown
-ARG org_label_schema_vcs_ref=unknown
-ARG org_label_schema_build_date=unknown
-ARG org_opencord_vcs_commit_date=unknown
-ARG org_opencord_vcs_dirty=unknown
-
-# Build
-WORKDIR /go/src/ro_core
-SHELL ["/bin/ash", "-o", "pipefail", "-c"]
-RUN go build -mod=vendor -o /go/bin/ro_core \
-	-ldflags \
-	"-X github.com/opencord/voltha-lib-go/v3/pkg/version.version=$org_label_schema_version \
-	 -X github.com/opencord/voltha-lib-go/v3/pkg/version.vcsRef=$org_label_schema_vcs_ref  \
-	 -X github.com/opencord/voltha-lib-go/v3/pkg/version.vcsDirty=$org_opencord_vcs_dirty \
-	 -X github.com/opencord/voltha-lib-go/v3/pkg/version.goVersion=$(go version 2>&1 | sed -E  's/.*go([0-9]+\.[0-9]+\.[0-9]+).*/\1/g') \
-	 -X github.com/opencord/voltha-lib-go/v3/pkg/version.os=$(go env GOHOSTOS) \
-	 -X github.com/opencord/voltha-lib-go/v3/pkg/version.arch=$(go env GOHOSTARCH) \
-	 -X github.com/opencord/voltha-lib-go/v3/pkg/version.buildTime=$org_label_schema_build_date"
-
-# -------------
-# Image creation stage
-
-FROM alpine:3.9.4
-
-# Set the working directory
-WORKDIR /app
-
-# Copy required files
-COPY --from=build-env /go/bin/ro_core /app/
-
-# Label image
-ARG org_label_schema_version=unknown
-ARG org_label_schema_vcs_url=unknown
-ARG org_label_schema_vcs_ref=unknown
-ARG org_label_schema_build_date=unknown
-ARG org_opencord_vcs_commit_date=unknown
-ARG org_opencord_vcs_dirty=unknown
-
-LABEL org.label-schema.schema-version=1.0 \
-      org.label-schema.name=voltha-ro-core \
-      org.label-schema.version=$org_label_schema_version \
-      org.label-schema.vcs-url=$org_label_schema_vcs_url \
-      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
-      org.label-schema.build-date=$org_label_schema_build_date \
-      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date \
-      org.opencord.vcs-dirty=$org_opencord_vcs_dirty
diff --git a/go.mod b/go.mod
index 51eded6..1c71efe 100644
--- a/go.mod
+++ b/go.mod
@@ -3,7 +3,6 @@
 go 1.12
 
 require (
-	github.com/bclicn/color v0.0.0-20180711051946-108f2023dc84
 	github.com/gogo/protobuf v1.3.0
 	github.com/golang/protobuf v1.3.2
 	github.com/google/uuid v1.1.1
diff --git a/go.sum b/go.sum
index 542ac38..b2ff9d1 100644
--- a/go.sum
+++ b/go.sum
@@ -17,8 +17,6 @@
 github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 h1:EFSB7Zo9Eg91v7MJPVsifUysc/wPdN+NOnVe6bWbdBM=
 github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg=
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/bclicn/color v0.0.0-20180711051946-108f2023dc84 h1:cutFptzj+ospnc1PETUqcSVTH3VQ44Bi0rpt3nE9gvo=
-github.com/bclicn/color v0.0.0-20180711051946-108f2023dc84/go.mod h1:Va9ap1qxjAWkIVaW1E9rH0aNgE8SDI5A4n8Ds8P0fAA=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
diff --git a/ro_core/config/config.go b/ro_core/config/config.go
deleted file mode 100644
index 8d856ff..0000000
--- a/ro_core/config/config.go
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package config
-
-import (
-	"flag"
-	"fmt"
-	"os"
-	"time"
-
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-)
-
-// RO Core service default constants
-const (
-	ConsulStoreName                = "consul"
-	EtcdStoreName                  = "etcd"
-	defaultInstanceID              = "rocore001"
-	defaultGrpcPort                = 50057
-	defaultGrpcHost                = ""
-	defaultKVStoreType             = EtcdStoreName
-	defaultKVStoreTimeout          = 5 //in seconds
-	defaultKVStoreHost             = "127.0.0.1"
-	defaultKVStorePort             = 2379 // Consul = 8500; Etcd = 2379
-	defaultKVTxnKeyDelTime         = 60
-	defaultLogLevel                = 0
-	defaultBanner                  = false
-	defaultDisplayVersionOnly      = false
-	defaultCoreTopic               = "rocore"
-	defaultROCoreEndpoint          = "rocore"
-	defaultROCoreKey               = "pki/voltha.key"
-	defaultROCoreCert              = "pki/voltha.crt"
-	defaultROCoreCA                = "pki/voltha-CA.pem"
-	defaultAffinityRouterTopic     = "affinityRouter"
-	defaultProbeHost               = ""
-	defaultProbePort               = 8080
-	defaultLiveProbeInterval       = 60 * time.Second
-	defaultNotLiveProbeInterval    = 5 * time.Second // Probe more frequently to detect Recovery early
-	defaultCoreTimeout             = 59 * time.Second
-	defaultMaxConnectionRetries    = -1              // retries forever
-	defaultConnectionRetryInterval = 2 * time.Second // in seconds
-)
-
-// ROCoreFlags represents the set of configurations used by the read-only core service
-type ROCoreFlags struct {
-	// Command line parameters
-	InstanceID              string
-	ROCoreEndpoint          string
-	GrpcHost                string
-	GrpcPort                int
-	KVStoreType             string
-	KVStoreTimeout          int // in seconds
-	KVStoreHost             string
-	KVStorePort             int
-	KVTxnKeyDelTime         int
-	CoreTopic               string
-	LogLevel                int
-	Banner                  bool
-	DisplayVersionOnly      bool
-	ROCoreKey               string
-	ROCoreCert              string
-	ROCoreCA                string
-	AffinityRouterTopic     string
-	ProbeHost               string
-	ProbePort               int
-	LiveProbeInterval       time.Duration
-	NotLiveProbeInterval    time.Duration
-	CoreTimeout             time.Duration
-	MaxConnectionRetries    int
-	ConnectionRetryInterval time.Duration
-}
-
-func init() {
-	_, err := log.AddPackage(log.JSON, log.WarnLevel, nil)
-	if err != nil {
-		log.Errorw("unable-to-register-package-to-the-log-map", log.Fields{"error": err})
-	}
-}
-
-// NewROCoreFlags returns a new ROCore config
-func NewROCoreFlags() *ROCoreFlags {
-	var roCoreFlag = ROCoreFlags{ // Default values
-		InstanceID:              defaultInstanceID,
-		ROCoreEndpoint:          defaultROCoreEndpoint,
-		GrpcHost:                defaultGrpcHost,
-		GrpcPort:                defaultGrpcPort,
-		KVStoreType:             defaultKVStoreType,
-		KVStoreTimeout:          defaultKVStoreTimeout,
-		KVStoreHost:             defaultKVStoreHost,
-		KVStorePort:             defaultKVStorePort,
-		KVTxnKeyDelTime:         defaultKVTxnKeyDelTime,
-		CoreTopic:               defaultCoreTopic,
-		LogLevel:                defaultLogLevel,
-		Banner:                  defaultBanner,
-		DisplayVersionOnly:      defaultDisplayVersionOnly,
-		ROCoreKey:               defaultROCoreKey,
-		ROCoreCert:              defaultROCoreCert,
-		ROCoreCA:                defaultROCoreCA,
-		AffinityRouterTopic:     defaultAffinityRouterTopic,
-		ProbeHost:               defaultProbeHost,
-		ProbePort:               defaultProbePort,
-		LiveProbeInterval:       defaultLiveProbeInterval,
-		NotLiveProbeInterval:    defaultNotLiveProbeInterval,
-		CoreTimeout:             defaultCoreTimeout,
-		MaxConnectionRetries:    defaultMaxConnectionRetries,
-		ConnectionRetryInterval: defaultConnectionRetryInterval,
-	}
-	return &roCoreFlag
-}
-
-// ParseCommandArguments parses the arguments when running read-only core service
-func (cf *ROCoreFlags) ParseCommandArguments() {
-
-	help := fmt.Sprintf("RO core endpoint address")
-	flag.StringVar(&(cf.ROCoreEndpoint), "vcore-endpoint", defaultROCoreEndpoint, help)
-
-	help = fmt.Sprintf("GRPC server - host")
-	flag.StringVar(&(cf.GrpcHost), "grpc_host", defaultGrpcHost, help)
-
-	help = fmt.Sprintf("GRPC server - port")
-	flag.IntVar(&(cf.GrpcPort), "grpc_port", defaultGrpcPort, help)
-
-	help = fmt.Sprintf("RO Core topic")
-	flag.StringVar(&(cf.CoreTopic), "ro_core_topic", defaultCoreTopic, help)
-
-	help = fmt.Sprintf("Affinity Router topic")
-	flag.StringVar(&(cf.AffinityRouterTopic), "affinity_router_topic", defaultAffinityRouterTopic, help)
-
-	help = fmt.Sprintf("KV store type")
-	flag.StringVar(&(cf.KVStoreType), "kv_store_type", defaultKVStoreType, help)
-
-	help = fmt.Sprintf("The default timeout when making a kv store request")
-	flag.IntVar(&(cf.KVStoreTimeout), "kv_store_request_timeout", defaultKVStoreTimeout, help)
-
-	help = fmt.Sprintf("KV store host")
-	flag.StringVar(&(cf.KVStoreHost), "kv_store_host", defaultKVStoreHost, help)
-
-	help = fmt.Sprintf("KV store port")
-	flag.IntVar(&(cf.KVStorePort), "kv_store_port", defaultKVStorePort, help)
-
-	help = fmt.Sprintf("The time to wait before deleting a completed transaction key")
-	flag.IntVar(&(cf.KVTxnKeyDelTime), "kv_txn_delete_time", defaultKVTxnKeyDelTime, help)
-
-	help = fmt.Sprintf("Log level")
-	flag.IntVar(&(cf.LogLevel), "log_level", defaultLogLevel, help)
-
-	help = fmt.Sprintf("Show startup banner log lines")
-	flag.BoolVar(&cf.Banner, "banner", defaultBanner, help)
-
-	help = fmt.Sprintf("Show version information and exit")
-	flag.BoolVar(&cf.DisplayVersionOnly, "version", defaultDisplayVersionOnly, help)
-
-	help = fmt.Sprintf("The address on which to listen to answer liveness and readiness probe queries over HTTP.")
-	flag.StringVar(&(cf.ProbeHost), "probe_host", defaultProbeHost, help)
-
-	help = fmt.Sprintf("The port on which to listen to answer liveness and readiness probe queries over HTTP.")
-	flag.IntVar(&(cf.ProbePort), "probe_port", defaultProbePort, help)
-
-	help = fmt.Sprintf("Time interval between liveness probes while in a live state")
-	flag.DurationVar(&(cf.LiveProbeInterval), "live_probe_interval", defaultLiveProbeInterval, help)
-
-	help = fmt.Sprintf("Time interval between liveness probes while in a not live state")
-	flag.DurationVar(&(cf.NotLiveProbeInterval), "not_live_probe_interval", defaultNotLiveProbeInterval, help)
-
-	help = fmt.Sprintf("The maximum time the core will wait while attempting to connect to a dependent component duration")
-	flag.DurationVar(&(cf.CoreTimeout), "core_timeout", defaultCoreTimeout, help)
-
-	help = fmt.Sprintf("The number of retries to connect to a dependent component")
-	flag.IntVar(&(cf.MaxConnectionRetries), "max_connection_retries", defaultMaxConnectionRetries, help)
-
-	help = fmt.Sprintf("The duration between each connection retry attempt ")
-	flag.DurationVar(&(cf.ConnectionRetryInterval), "connection_retry_interval", defaultConnectionRetryInterval, help)
-
-	flag.Parse()
-
-	containerName := getContainerInfo()
-	if len(containerName) > 0 {
-		cf.InstanceID = containerName
-	}
-
-}
-
-func getContainerInfo() string {
-	return os.Getenv("HOSTNAME")
-}
diff --git a/ro_core/config/config_test.go b/ro_core/config/config_test.go
deleted file mode 100644
index fb03cbb..0000000
--- a/ro_core/config/config_test.go
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package config
-
-import (
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/stretchr/testify/assert"
-	"os"
-	"testing"
-)
-
-const (
-	/*
-	 * This sets the LogLevel of the Voltha logger. It's pinned to FatalLevel here, as we
-	 * generally don't want to see logger output, even when running go test in verbose
-	 * mode. Even "Error" level messages are expected to be output by some unit tests.
-	 *
-	 * If you are developing a unit test, and experiencing problems or wish additional
-	 * debugging from Voltha, then changing this constant to log.DebugLevel may be
-	 * useful.
-	 */
-
-	VOLTHALogLevel = log.FatalLevel
-)
-
-func localInit() {
-
-	// Logger must be configured or bad things happen
-	_, err := log.SetDefaultLogger(log.JSON, VOLTHALogLevel, log.Fields{"instanceId": 1})
-	if err != nil {
-		panic(err)
-	}
-}
-
-func checkConfigFlags(t *testing.T, cf *ROCoreFlags) {
-
-	if cf.ROCoreEndpoint != defaultROCoreEndpoint {
-		t.Errorf("ROCoreEndpoint want %s, got %s", defaultROCoreEndpoint, cf.ROCoreEndpoint)
-	}
-	if cf.GrpcHost != defaultGrpcHost {
-		t.Errorf("GrpcHost want %s, got %s", defaultGrpcHost, cf.GrpcHost)
-	}
-	if cf.GrpcPort != defaultGrpcPort {
-		t.Errorf("GrpcPort want %d, got %d", defaultGrpcPort, cf.GrpcPort)
-	}
-	if cf.KVStoreType != defaultKVStoreType {
-		t.Errorf("KVStoreType want %s, got %s", defaultKVStoreType, cf.KVStoreType)
-	}
-	if cf.KVStoreTimeout != defaultKVStoreTimeout {
-		t.Errorf("KVStoreTimeout want %d, got %d", defaultKVStoreTimeout, cf.KVStoreTimeout)
-	}
-	if cf.KVStoreHost != defaultKVStoreHost {
-		t.Errorf("KVStoreHost want %s, got %s", defaultKVStoreHost, cf.KVStoreHost)
-	}
-	if cf.KVStorePort != defaultKVStorePort {
-		t.Errorf("KVStorePort want %d, got %d", defaultKVStorePort, cf.KVStorePort)
-	}
-	if cf.KVTxnKeyDelTime != defaultKVTxnKeyDelTime {
-		t.Errorf("KVTxnKeyDelTime want %d, got %d", defaultKVTxnKeyDelTime, cf.KVTxnKeyDelTime)
-	}
-	if cf.CoreTopic != defaultCoreTopic {
-		t.Errorf("CoreTopic want %s, got %s", defaultCoreTopic, cf.CoreTopic)
-	}
-	if cf.LogLevel != defaultLogLevel {
-		t.Errorf("LogLevel want %d, got %d", defaultLogLevel, cf.LogLevel)
-	}
-	if cf.Banner != defaultBanner {
-		t.Errorf("Banner want %v, got %v", defaultBanner, cf.Banner)
-	}
-	if cf.DisplayVersionOnly != defaultDisplayVersionOnly {
-		t.Errorf("DisplayVersionOnly want %v, got %v", defaultDisplayVersionOnly, cf.DisplayVersionOnly)
-	}
-	if cf.ROCoreKey != defaultROCoreKey {
-		t.Errorf("ROCoreKey want %s, got %s", defaultROCoreKey, cf.ROCoreKey)
-	}
-	if cf.ROCoreCert != defaultROCoreCert {
-		t.Errorf("ROCoreCert want %s, got %s", defaultROCoreCert, cf.ROCoreCert)
-	}
-	if cf.ROCoreCA != defaultROCoreCA {
-		t.Errorf("ROCoreCA want %s, got %s", defaultROCoreCA, cf.ROCoreCA)
-	}
-	if cf.AffinityRouterTopic != defaultAffinityRouterTopic {
-		t.Errorf("AffinityRouterTopic want %s, got %s", defaultAffinityRouterTopic, cf.AffinityRouterTopic)
-	}
-	if cf.ProbeHost != defaultProbeHost {
-		t.Errorf("ProbeHost want %s, got %s", defaultProbeHost, cf.ProbeHost)
-	}
-	if cf.ProbePort != defaultProbePort {
-		t.Errorf("ProbePort want %d, got %d", defaultProbePort, cf.ProbePort)
-	}
-}
-
-func TestNewROCoreFlags(t *testing.T) {
-	localInit()
-
-	var testStr string
-
-	configFlags := NewROCoreFlags()
-	assert.NotNil(t, configFlags)
-
-	configFlags.ParseCommandArguments()
-	checkConfigFlags(t, configFlags)
-
-	seErr := os.Setenv("HOSTNAME", "PC-4")
-	if seErr == nil {
-		testStr = getContainerInfo()
-		assert.NotNil(t, testStr)
-		t.Logf("hostname: %s \n", testStr)
-		if testStr != "PC-4" {
-			t.Errorf("getContainerInfo failed. want: %s, got: %s", "PC-3", testStr)
-		}
-	} else {
-		testStr = getContainerInfo()
-		assert.NotNil(t, testStr)
-	}
-}
diff --git a/ro_core/core/common_test.go b/ro_core/core/common_test.go
deleted file mode 100644
index 44f8d65..0000000
--- a/ro_core/core/common_test.go
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package core
-
-import (
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-)
-
-const (
-	/*
-	 * This sets the LogLevel of the Voltha logger. It's pinned to FatalLevel here, as we
-	 * generally don't want to see logger output, even when running go test in verbose
-	 * mode. Even "Error" level messages are expected to be output by some unit tests.
-	 *
-	 * If you are developing a unit test, and experiencing problems or wish additional
-	 * debugging from Voltha, then changing this constant to log.DebugLevel may be
-	 * useful.
-	 */
-
-	VolthaLogLevel = log.FatalLevel
-)
-
-// Unit test initialization. This init() function handles all unit tests in
-// the current directory.
-func init() {
-	// Logger must be configured or bad things happen
-	_, err := log.SetDefaultLogger(log.JSON, VolthaLogLevel, log.Fields{"instanceID": 1})
-	if err != nil {
-		panic(err)
-	}
-}
diff --git a/ro_core/core/core.go b/ro_core/core/core.go
deleted file mode 100644
index 2a20784..0000000
--- a/ro_core/core/core.go
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package core
-
-import (
-	"context"
-	"fmt"
-
-	"time"
-
-	"github.com/opencord/voltha-go/db/model"
-	"github.com/opencord/voltha-go/ro_core/config"
-	"github.com/opencord/voltha-lib-go/v3/pkg/db"
-	"github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore"
-	grpcserver "github.com/opencord/voltha-lib-go/v3/pkg/grpc"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-lib-go/v3/pkg/probe"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-	"google.golang.org/grpc"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/status"
-)
-
-// Core holds all information of read only core service
-type Core struct {
-	instanceID        string
-	genericMgr        *ModelProxyManager
-	deviceMgr         *DeviceManager
-	logicalDeviceMgr  *LogicalDeviceManager
-	grpcServer        *grpcserver.GrpcServer
-	grpcNBIAPIHandler *APIHandler
-	config            *config.ROCoreFlags
-	clusterDataRoot   model.Root
-	localDataRoot     model.Root
-	clusterDataProxy  *model.Proxy
-	localDataProxy    *model.Proxy
-	exitChannel       chan int
-	kvClient          kvstore.Client
-	backend           db.Backend
-}
-
-func init() {
-	_, err := log.AddPackage(log.JSON, log.DebugLevel, nil)
-	if err != nil {
-		log.Errorw("unable-to-register-package-to-the-log-map", log.Fields{"error": err})
-	}
-}
-
-// NewCore instantiates core service parameters
-func NewCore(ctx context.Context, id string, cf *config.ROCoreFlags, kvClient kvstore.Client) *Core {
-	var core Core
-	core.instanceID = id
-	core.exitChannel = make(chan int, 1)
-	core.config = cf
-	core.kvClient = kvClient
-
-	// Configure backend to push Liveness Status at least every cf.LiveProbeInterval / 2 seconds
-	// so as to avoid trigger of Liveness check (due to Liveness timeout) when backend is alive
-	livenessChannelInterval := cf.LiveProbeInterval / 2
-
-	// Setup the KV store
-	// Do not call NewBackend constructor; it creates its own KV client
-	// Commented the backend for now until the issue between the model and the KV store
-	// is resolved.
-	core.backend = db.Backend{
-		Client:                  kvClient,
-		StoreType:               cf.KVStoreType,
-		Host:                    cf.KVStoreHost,
-		Port:                    cf.KVStorePort,
-		Timeout:                 cf.KVStoreTimeout,
-		LivenessChannelInterval: livenessChannelInterval,
-		PathPrefix:              "service/voltha"}
-	core.clusterDataRoot = model.NewRoot(&voltha.Voltha{}, &core.backend)
-	core.localDataRoot = model.NewRoot(&voltha.CoreInstance{}, &core.backend)
-
-	return &core
-}
-
-// waitUntilKVStoreReachableOrMaxTries will wait until it can connect to a KV store or until maxtries has been reached
-func (core *Core) waitUntilKVStoreReachableOrMaxTries(ctx context.Context, maxRetries int, retryInterval time.Duration) error {
-	log.Infow("verifying-KV-store-connectivity", log.Fields{"host": core.config.KVStoreHost,
-		"port": core.config.KVStorePort, "retries": maxRetries, "retryInterval": retryInterval})
-
-	// Get timeout in seconds with 1 second set as minimum
-	timeout := int(core.config.CoreTimeout.Seconds())
-	if timeout < 1 {
-		timeout = 1
-	}
-	count := 0
-	for {
-		if !core.kvClient.IsConnectionUp(timeout) {
-			log.Info("KV-store-unreachable")
-			if maxRetries != -1 {
-				if count >= maxRetries {
-					return status.Error(codes.Unavailable, "kv store unreachable")
-				}
-			}
-			count++
-			//      Take a nap before retrying
-			time.Sleep(retryInterval)
-			log.Infow("retry-KV-store-connectivity", log.Fields{"retryCount": count, "maxRetries": maxRetries, "retryInterval": retryInterval})
-
-		} else {
-			break
-		}
-	}
-	log.Info("KV-store-reachable")
-	return nil
-}
-
-// Start will start core adapter services
-func (core *Core) Start(ctx context.Context) error {
-	var err error
-	log.Info("starting-adaptercore", log.Fields{"coreId": core.instanceID})
-
-	// Wait until connection to KV Store is up
-	if err := core.waitUntilKVStoreReachableOrMaxTries(ctx, core.config.MaxConnectionRetries, core.config.ConnectionRetryInterval); err != nil {
-		log.Fatal("Unable-to-connect-to-KV-store")
-	}
-
-	probe.UpdateStatusFromContext(ctx, "kv-store", probe.ServiceStatusRunning)
-
-	core.clusterDataProxy, err = core.clusterDataRoot.CreateProxy(context.Background(), "/", false)
-	if err != nil {
-		probe.UpdateStatusFromContext(ctx, "kv-store", probe.ServiceStatusNotReady)
-		return fmt.Errorf("Failed to create cluster data proxy")
-	}
-	core.localDataProxy, err = core.localDataRoot.CreateProxy(context.Background(), "/", false)
-	if err != nil {
-		probe.UpdateStatusFromContext(ctx, "kv-store", probe.ServiceStatusNotReady)
-		return fmt.Errorf("Failed to create local cluster data proxy")
-	}
-	core.genericMgr = newModelProxyManager(core.clusterDataProxy)
-	core.deviceMgr = newDeviceManager(core.clusterDataProxy, core.instanceID)
-	core.logicalDeviceMgr = newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	go core.startDeviceManager(ctx)
-	go core.startLogicalDeviceManager(ctx)
-	go core.startGRPCService(ctx)
-	go core.monitorKvstoreLiveness(ctx)
-
-	log.Info("adaptercore-started")
-	return nil
-}
-
-// Stop will stop core services
-func (core *Core) Stop(ctx context.Context) {
-	log.Info("stopping-adaptercore")
-	if core.exitChannel != nil {
-		core.exitChannel <- 1
-	}
-	// Stop all the started services
-	if core.grpcServer != nil {
-		core.grpcServer.Stop()
-	}
-	if core.logicalDeviceMgr != nil {
-		core.logicalDeviceMgr.stop(ctx)
-	}
-	if core.deviceMgr != nil {
-		core.deviceMgr.stop(ctx)
-	}
-	log.Info("adaptercore-stopped")
-}
-
-//startGRPCService creates the grpc service handlers, registers it to the grpc server
-// and starts the server
-func (core *Core) startGRPCService(ctx context.Context) {
-	//	create an insecure gserver server
-	core.grpcServer = grpcserver.NewGrpcServer(core.config.GrpcHost, core.config.GrpcPort, nil, false, probe.GetProbeFromContext(ctx))
-	log.Info("grpc-server-created")
-
-	core.grpcNBIAPIHandler = NewAPIHandler(core.genericMgr, core.deviceMgr, core.logicalDeviceMgr)
-	core.logicalDeviceMgr.setGrpcNbiHandler(core.grpcNBIAPIHandler)
-	//	Create a function to register the core GRPC service with the GRPC server
-	f := func(gs *grpc.Server) {
-		voltha.RegisterVolthaServiceServer(
-			gs,
-			core.grpcNBIAPIHandler,
-		)
-	}
-
-	core.grpcServer.AddService(f)
-	log.Info("grpc-service-added")
-
-	/*
-	 * Start the GRPC server
-	 *
-	 * This is a bit sub-optimal here as the grpcServer.Start call does not return (blocks)
-	 * until something fails, but we want to send a "start" status update. As written this
-	 * means that we are actually sending the "start" status update before the server is
-	 * started, which means it is possible that the status is "running" before it actually is.
-	 *
-	 * This means that there is a small window in which the core could return its status as
-	 * ready, when it really isn't.
-	 */
-	probe.UpdateStatusFromContext(ctx, "grpc-service", probe.ServiceStatusRunning)
-
-	//	Start the server
-	log.Info("grpc-server-started")
-	core.grpcServer.Start(context.Background())
-
-	probe.UpdateStatusFromContext(ctx, "grpc-service", probe.ServiceStatusStopped)
-}
-
-func (core *Core) startDeviceManager(ctx context.Context) {
-	// TODO: Interaction between the logicaldevicemanager and devicemanager should mostly occur via
-	// callbacks.  For now, until the model is ready, devicemanager will keep a reference to the
-	// logicaldevicemanager to initiate the creation of logical devices
-	log.Info("starting-DeviceManager")
-	core.deviceMgr.start(ctx, core.logicalDeviceMgr)
-	log.Info("started-DeviceManager")
-}
-
-func (core *Core) startLogicalDeviceManager(ctx context.Context) {
-	log.Info("starting-Logical-DeviceManager")
-	core.logicalDeviceMgr.start(ctx)
-	log.Info("started-Logical-DeviceManager")
-}
-
-/*
-* Thread to monitor kvstore Liveness (connection status)
-*
-* This function constantly monitors Liveness State of kvstore as reported
-* periodically by backend and updates the Status of kv-store service registered
-* with ro_core probe.
-*
-* If no liveness event has been seen within a timeout, then the thread will make
-* an trigger a "liveness" check, which will in turn trigger a liveness event on
-* the liveness channel, true or false depending on whether the attempt succeeded.
-*
-* The gRPC server in turn monitors the state of the readiness probe and will
-* start issuing UNAVAILABLE response while the probe is not ready.
- */
-func (core *Core) monitorKvstoreLiveness(ctx context.Context) {
-	log.Info("start-monitoring-kvstore-liveness")
-
-	// Instruct backend to create Liveness channel for transporting state updates
-	livenessChannel := core.backend.EnableLivenessChannel()
-
-	log.Debug("enabled-kvstore-liveness-channel")
-
-	// Default state for kvstore is not alive
-	timeout := core.config.NotLiveProbeInterval
-	for {
-		timeoutTimer := time.NewTimer(timeout)
-		select {
-
-		case liveness := <-livenessChannel:
-			log.Debugw("received-liveness-change-notification", log.Fields{"liveness": liveness})
-
-			if !liveness {
-				probe.UpdateStatusFromContext(ctx, "kv-store", probe.ServiceStatusNotReady)
-
-				if core.grpcServer != nil {
-					log.Info("kvstore-set-server-notready")
-				}
-
-				timeout = core.config.NotLiveProbeInterval
-			} else {
-				probe.UpdateStatusFromContext(ctx, "kv-store", probe.ServiceStatusRunning)
-
-				if core.grpcServer != nil {
-					log.Info("kvstore-set-server-ready")
-				}
-
-				timeout = core.config.LiveProbeInterval
-			}
-
-			if !timeoutTimer.Stop() {
-				<-timeoutTimer.C
-			}
-
-		case <-timeoutTimer.C:
-			log.Info("kvstore-perform-liveness-check-on-timeout")
-
-			// Trigger Liveness check if no liveness update received within the timeout period.
-			// The Liveness check will push Live state to same channel which this routine is
-			// reading and processing. This, do it asynchronously to avoid blocking for
-			// backend response and avoid any possibility of deadlock
-			go core.backend.PerformLivenessCheck(core.config.KVStoreTimeout)
-		}
-	}
-}
diff --git a/ro_core/core/core_test.go b/ro_core/core/core_test.go
deleted file mode 100644
index 5af1048..0000000
--- a/ro_core/core/core_test.go
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package core
-
-import (
-	"context"
-	"errors"
-	"fmt"
-	"testing"
-
-	"github.com/opencord/voltha-go/ro_core/config"
-	"github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-lib-go/v3/pkg/mocks"
-	ic "github.com/opencord/voltha-protos/v3/go/inter_container"
-	"github.com/phayes/freeport"
-	"github.com/stretchr/testify/assert"
-)
-
-type roCore struct {
-	kvClient    kvstore.Client
-	config      *config.ROCoreFlags
-	halted      bool
-	exitChannel chan int
-	//For test
-	receiverChannels []<-chan *ic.InterContainerMessage
-}
-
-func newROCore(cf *config.ROCoreFlags) *roCore {
-	var roCoreV roCore
-	roCoreV.config = cf
-	roCoreV.halted = false
-	roCoreV.exitChannel = make(chan int, 1)
-	roCoreV.receiverChannels = make([]<-chan *ic.InterContainerMessage, 0)
-	return &roCoreV
-}
-
-func newKVClient(storeType string, address string, timeout int) (kvstore.Client, error) {
-
-	log.Infow("kv-store-type", log.Fields{"store": storeType})
-	switch storeType {
-	case "consul":
-		return kvstore.NewConsulClient(address, timeout)
-	case "etcd":
-		return kvstore.NewEtcdClient(address, timeout)
-	}
-	return nil, errors.New("unsupported-kv-store")
-}
-
-func makeTestNewCore() (*config.ROCoreFlags, *roCore) {
-
-	clientPort, err := freeport.GetFreePort()
-	if err == nil {
-		peerPort, err := freeport.GetFreePort()
-		if err != nil {
-			log.Fatal(err)
-		}
-		etcdServer := mocks.StartEtcdServer(mocks.MKConfig("voltha.mock.test", clientPort, peerPort, "voltha.lib.mocks.etcd", "error"))
-		if etcdServer == nil {
-			log.Fatal("Embedded server failed to start")
-		}
-		clientAddr := fmt.Sprintf("localhost:%d", clientPort)
-
-		roCoreFlgs := config.NewROCoreFlags()
-		roC := newROCore(roCoreFlgs)
-		if (roC != nil) && (roCoreFlgs != nil) {
-			cli, err := newKVClient("etcd", clientAddr, 5)
-			if err == nil {
-				roC.kvClient = cli
-				return roCoreFlgs, roC
-			}
-			etcdServer.Stop()
-			log.Fatal("Failed to create an Etcd client")
-		}
-	}
-	return nil, nil
-}
-
-func TestNewCore(t *testing.T) {
-
-	var ctx context.Context
-
-	roCoreFlgs, roC := makeTestNewCore()
-	assert.NotNil(t, roCoreFlgs)
-	assert.NotNil(t, roC)
-	core := NewCore(ctx, "ro_core", roCoreFlgs, roC.kvClient)
-	assert.NotNil(t, core)
-}
-
-func TestNewCoreStartStop(t *testing.T) {
-
-	var ctx context.Context
-
-	roCoreFlgs, roC := makeTestNewCore()
-	assert.NotNil(t, roCoreFlgs)
-	assert.NotNil(t, roC)
-	core := NewCore(ctx, "ro_core", roCoreFlgs, roC.kvClient)
-	assert.NotNil(t, core)
-
-	err := core.Start(ctx)
-	assert.Nil(t, err)
-	core.Stop(ctx)
-}
diff --git a/ro_core/core/device_agent.go b/ro_core/core/device_agent.go
deleted file mode 100644
index 109d060..0000000
--- a/ro_core/core/device_agent.go
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package core
-
-import (
-	"context"
-	"sync"
-
-	"github.com/gogo/protobuf/proto"
-	"github.com/opencord/voltha-go/db/model"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/status"
-)
-
-// DeviceAgent holds device specific information
-type DeviceAgent struct {
-	deviceID         string
-	deviceType       string
-	lastData         *voltha.Device
-	deviceMgr        *DeviceManager
-	clusterDataProxy *model.Proxy
-	exitChannel      chan int
-	lockDevice       sync.RWMutex
-}
-
-//newDeviceAgent creates a new device agent along as creating a unique ID for the device and set the device state to
-//preprovisioning
-func newDeviceAgent(device *voltha.Device, deviceMgr *DeviceManager, cdProxy *model.Proxy) *DeviceAgent {
-	var agent DeviceAgent
-	agent.deviceID = device.Id
-	agent.deviceType = device.Type
-	agent.lastData = device
-	agent.deviceMgr = deviceMgr
-	agent.exitChannel = make(chan int, 1)
-	agent.clusterDataProxy = cdProxy
-	agent.lockDevice = sync.RWMutex{}
-	return &agent
-}
-
-// start save the device to the data model and registers for callbacks on that device
-func (agent *DeviceAgent) start(ctx context.Context, loadFromDb bool) error {
-	agent.lockDevice.Lock()
-	defer agent.lockDevice.Unlock()
-	log.Debugw("starting-device-agent", log.Fields{"device": agent.lastData})
-	if loadFromDb {
-		if device, err := agent.clusterDataProxy.Get(ctx, "/devices/"+agent.deviceID, 0, false, ""); err != nil {
-			log.Errorw("failed-to-get-device", log.Fields{"error": err})
-			return err
-		} else if device != nil {
-			if d, ok := device.(*voltha.Device); ok {
-				agent.lastData = proto.Clone(d).(*voltha.Device)
-			}
-		} else {
-			log.Errorw("failed-to-load-device", log.Fields{"deviceID": agent.deviceID})
-			return status.Errorf(codes.NotFound, "device-%s", agent.deviceID)
-		}
-		log.Debugw("device-loaded-from-dB", log.Fields{"device": agent.lastData})
-	}
-	log.Debug("device-agent-started")
-	return nil
-}
-
-// stop stops the device agent.  Not much to do for now
-func (agent *DeviceAgent) stop(ctx context.Context) {
-	agent.lockDevice.Lock()
-	defer agent.lockDevice.Unlock()
-	log.Debug("stopping-device-agent")
-	agent.exitChannel <- 1
-	log.Debug("device-agent-stopped")
-}
-
-// GetDevice retrieves the latest device information from the data model
-func (agent *DeviceAgent) getDevice() (*voltha.Device, error) {
-	agent.lockDevice.Lock()
-	defer agent.lockDevice.Unlock()
-	if device, err := agent.clusterDataProxy.Get(context.Background(), "/devices/"+agent.deviceID, 0, false, ""); err != nil {
-		log.Errorw("failed-to-get-device", log.Fields{"error": err})
-		return nil, err
-	} else if device != nil {
-		if d, ok := device.(*voltha.Device); ok {
-			cloned := proto.Clone(d).(*voltha.Device)
-			return cloned, nil
-		}
-	}
-	return nil, status.Errorf(codes.NotFound, "device-%s", agent.deviceID)
-}
-
-// ListDevicePorts retrieves the ports information for a particular device.
-func (agent *DeviceAgent) ListDevicePorts(ctx context.Context) (*voltha.Ports, error) {
-	log.Debugw("ListDevicePorts", log.Fields{"id": agent.deviceID})
-	ports := &voltha.Ports{}
-	if device, _ := agent.deviceMgr.GetDevice(agent.deviceID); device != nil {
-		ports.Items = append(ports.Items, device.GetPorts()...)
-		return ports, nil
-	}
-	return nil, status.Errorf(codes.NotFound, "device-%s", agent.deviceID)
-}
-
-// ListDevicePmConfigs retrieves the ports information for a particular device.
-func (agent *DeviceAgent) ListDevicePmConfigs(ctx context.Context) (*voltha.PmConfigs, error) {
-	log.Debugw("ListDevicePmConfigs", log.Fields{"id": agent.deviceID})
-	if device, _ := agent.deviceMgr.GetDevice(agent.deviceID); device != nil {
-		return device.GetPmConfigs(), nil
-	}
-	return nil, status.Errorf(codes.NotFound, "device-%s", agent.deviceID)
-}
-
-// ListDeviceFlows retrieves the ports information for a particular device.
-func (agent *DeviceAgent) ListDeviceFlows(ctx context.Context) (*voltha.Flows, error) {
-	log.Debugw("ListDeviceFlows", log.Fields{"id": agent.deviceID})
-	if device, _ := agent.deviceMgr.GetDevice(agent.deviceID); device != nil {
-		return device.GetFlows(), nil
-	}
-	return nil, status.Errorf(codes.NotFound, "device-%s", agent.deviceID)
-}
-
-// ListDeviceFlowGroups retrieves the ports information for a particular device.
-func (agent *DeviceAgent) ListDeviceFlowGroups(ctx context.Context) (*voltha.FlowGroups, error) {
-	log.Debugw("ListDeviceFlowGroups", log.Fields{"id": agent.deviceID})
-	if device, _ := agent.deviceMgr.GetDevice(agent.deviceID); device != nil {
-		return device.GetFlowGroups(), nil
-	}
-	return nil, status.Errorf(codes.NotFound, "device-%s", agent.deviceID)
-}
-
-// GetImageDownloadStatus retrieves the download status of an image of a particular device.
-func (agent *DeviceAgent) GetImageDownloadStatus(ctx context.Context, imageName string) (*voltha.ImageDownload, error) {
-	log.Debugw("GetImageDownloadStatus", log.Fields{"id": agent.deviceID})
-	if device, _ := agent.deviceMgr.GetDevice(agent.deviceID); device != nil {
-		for _, img := range device.GetImageDownloads() {
-			if img.GetName() == imageName {
-				return img, nil
-			}
-		}
-		return nil, status.Errorf(codes.NotFound, "device-%s, image-%s", agent.deviceID, imageName)
-	}
-	return nil, status.Errorf(codes.NotFound, "device-%s", agent.deviceID)
-}
-
-// GetImageDownload retrieves the image download for a particular device.
-func (agent *DeviceAgent) GetImageDownload(ctx context.Context, imageName string) (*voltha.ImageDownload, error) {
-	log.Debugw("GetImageDownload", log.Fields{"id": agent.deviceID})
-	if device, _ := agent.deviceMgr.GetDevice(agent.deviceID); device != nil {
-		for _, img := range device.GetImageDownloads() {
-			if img.GetName() == imageName {
-				return img, nil
-			}
-		}
-		return nil, status.Errorf(codes.NotFound, "device-%s, image-%s", agent.deviceID, imageName)
-	}
-	return nil, status.Errorf(codes.NotFound, "device-%s", agent.deviceID)
-}
-
-// ListImageDownloads retrieves the image downloads for a particular device.
-func (agent *DeviceAgent) ListImageDownloads(ctx context.Context) (*voltha.ImageDownloads, error) {
-	log.Debugw("ListImageDownloads", log.Fields{"id": agent.deviceID})
-	if device, _ := agent.deviceMgr.GetDevice(agent.deviceID); device != nil {
-		return &voltha.ImageDownloads{Items: device.GetImageDownloads()}, nil
-	}
-	return nil, status.Errorf(codes.NotFound, "device-%s", agent.deviceID)
-}
-
-// GetImages retrieves the list of images for a particular device.
-func (agent *DeviceAgent) GetImages(ctx context.Context) (*voltha.Images, error) {
-	log.Debugw("GetImages", log.Fields{"id": agent.deviceID})
-	if device, _ := agent.deviceMgr.GetDevice(agent.deviceID); device != nil {
-		return device.GetImages(), nil
-	}
-	return nil, status.Errorf(codes.NotFound, "device-%s", agent.deviceID)
-}
diff --git a/ro_core/core/device_agent_test.go b/ro_core/core/device_agent_test.go
deleted file mode 100644
index 9634408..0000000
--- a/ro_core/core/device_agent_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package core
-
-import (
-	"testing"
-
-	"github.com/opencord/voltha-go/db/model"
-	"github.com/opencord/voltha-go/ro_core/config"
-	"github.com/opencord/voltha-lib-go/v3/pkg/db"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-	"github.com/stretchr/testify/assert"
-)
-
-func TestNewDeviceAgent(t *testing.T) {
-
-	var core Core
-	core.instanceID = "ro_core"
-	core.config = config.NewROCoreFlags()
-	backend := db.Backend{
-		Client:     core.kvClient,
-		StoreType:  core.config.KVStoreType,
-		Host:       core.config.KVStoreHost,
-		Port:       core.config.KVStorePort,
-		Timeout:    core.config.KVStoreTimeout,
-		PathPrefix: "service/voltha"}
-	core.clusterDataRoot = model.NewRoot(&voltha.Voltha{}, &backend)
-	core.genericMgr = newModelProxyManager(core.clusterDataProxy)
-	core.deviceMgr = newDeviceManager(core.clusterDataProxy, core.instanceID)
-
-	devAgent := newDeviceAgent(&voltha.Device{Id: "new_device"}, core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, devAgent)
-
-}
diff --git a/ro_core/core/device_manager.go b/ro_core/core/device_manager.go
deleted file mode 100644
index aaa4a73..0000000
--- a/ro_core/core/device_manager.go
+++ /dev/null
@@ -1,389 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package core
-
-import (
-	"context"
-	"sync"
-
-	"github.com/opencord/voltha-go/db/model"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-lib-go/v3/pkg/probe"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/status"
-)
-
-// DeviceManager represents device manager related information
-type DeviceManager struct {
-	deviceAgents     sync.Map
-	logicalDeviceMgr *LogicalDeviceManager
-	clusterDataProxy *model.Proxy
-	coreInstanceID   string
-	exitChannel      chan int
-}
-
-func newDeviceManager(cdProxy *model.Proxy, coreInstanceID string) *DeviceManager {
-	var deviceMgr DeviceManager
-	deviceMgr.exitChannel = make(chan int, 1)
-	deviceMgr.coreInstanceID = coreInstanceID
-	deviceMgr.clusterDataProxy = cdProxy
-	return &deviceMgr
-}
-
-func (dMgr *DeviceManager) start(ctx context.Context, logicalDeviceMgr *LogicalDeviceManager) {
-	log.Info("starting-device-manager")
-	dMgr.logicalDeviceMgr = logicalDeviceMgr
-	probe.UpdateStatusFromContext(ctx, "device-manager", probe.ServiceStatusRunning)
-	log.Info("device-manager-started")
-}
-
-func (dMgr *DeviceManager) stop(ctx context.Context) {
-	log.Info("stopping-device-manager")
-	dMgr.exitChannel <- 1
-	probe.UpdateStatusFromContext(ctx, "device-manager", probe.ServiceStatusStopped)
-	log.Info("device-manager-stopped")
-}
-
-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()})
-	}
-}
-
-func (dMgr *DeviceManager) addDeviceAgentToMap(agent *DeviceAgent) {
-	if _, exist := dMgr.deviceAgents.Load(agent.deviceID); !exist {
-		dMgr.deviceAgents.Store(agent.deviceID, agent)
-	}
-}
-
-func (dMgr *DeviceManager) deleteDeviceAgentToMap(agent *DeviceAgent) {
-	dMgr.deviceAgents.Delete(agent.deviceID)
-}
-
-func (dMgr *DeviceManager) getDeviceAgent(deviceID string) *DeviceAgent {
-	if agent, ok := dMgr.deviceAgents.Load(deviceID); ok {
-		return agent.(*DeviceAgent)
-	}
-	//	Try to load into memory - loading will also create the device agent
-	if err := dMgr.load(deviceID); err == nil {
-		if agent, ok := dMgr.deviceAgents.Load(deviceID); ok {
-			return agent.(*DeviceAgent)
-		}
-	}
-	return nil
-}
-
-// listDeviceIDsFromMap returns the list of device IDs that are in memory
-func (dMgr *DeviceManager) listDeviceIDsFromMap() *voltha.IDs {
-	result := &voltha.IDs{Items: make([]*voltha.ID, 0)}
-	dMgr.deviceAgents.Range(func(key, value interface{}) bool {
-		result.Items = append(result.Items, &voltha.ID{Id: key.(string)})
-		return true
-	})
-	return result
-}
-
-// GetDevice will returns a device, either from memory or from the dB, if present
-func (dMgr *DeviceManager) GetDevice(id string) (*voltha.Device, error) {
-	log.Debugw("GetDevice", log.Fields{"deviceid": id})
-	if agent := dMgr.getDeviceAgent(id); agent != nil {
-		return agent.getDevice()
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", id)
-}
-
-// IsDeviceInCache returns true if device exists in cache
-func (dMgr *DeviceManager) IsDeviceInCache(id string) bool {
-	_, exist := dMgr.deviceAgents.Load(id)
-	return exist
-}
-
-// IsRootDevice returns true if root device is present in either memory or db
-func (dMgr *DeviceManager) IsRootDevice(id string) (bool, error) {
-	device, err := dMgr.GetDevice(id)
-	if err != nil {
-		return false, err
-	}
-	return device.Root, nil
-}
-
-// ListDevices retrieves the latest devices from the data model
-func (dMgr *DeviceManager) ListDevices() (*voltha.Devices, error) {
-	log.Debug("ListDevices")
-	result := &voltha.Devices{}
-	if devices, err := dMgr.clusterDataProxy.List(context.Background(), "/devices", 0, false, ""); err != nil {
-		log.Errorw("failed-to-list-devices", log.Fields{"error": err})
-		return nil, err
-	} else if devices != nil {
-		for _, device := range devices.([]interface{}) {
-			// If device is not in memory then set it up
-			if !dMgr.IsDeviceInCache(device.(*voltha.Device).Id) {
-				agent := newDeviceAgent(device.(*voltha.Device), dMgr, dMgr.clusterDataProxy)
-				if err := agent.start(context.TODO(), true); err != nil {
-					log.Warnw("failure-starting-agent", log.Fields{"deviceID": device.(*voltha.Device).Id})
-					agent.stop(context.TODO())
-				} else {
-					dMgr.addDeviceAgentToMap(agent)
-				}
-			}
-			result.Items = append(result.Items, device.(*voltha.Device))
-		}
-	}
-	return result, nil
-}
-
-// loadDevice loads the deviceID in memory, if not present
-func (dMgr *DeviceManager) loadDevice(deviceID string) (*DeviceAgent, error) {
-	log.Debugw("loading-device", log.Fields{"deviceID": deviceID})
-	// Sanity check
-	if deviceID == "" {
-		return nil, status.Error(codes.InvalidArgument, "deviceID empty")
-	}
-	if !dMgr.IsDeviceInCache(deviceID) {
-		agent := newDeviceAgent(&voltha.Device{Id: deviceID}, dMgr, dMgr.clusterDataProxy)
-		if err := agent.start(context.TODO(), true); err != nil {
-			agent.stop(context.TODO())
-			return nil, err
-		}
-		dMgr.addDeviceAgentToMap(agent)
-	}
-	if agent := dMgr.getDeviceAgent(deviceID); agent != nil {
-		return agent, nil
-	}
-	return nil, status.Error(codes.NotFound, deviceID) // This should nto happen
-}
-
-// loadRootDeviceParentAndChildren loads the children and parents of a root device in memory
-func (dMgr *DeviceManager) loadRootDeviceParentAndChildren(device *voltha.Device) error {
-	log.Debugw("loading-parent-and-children", log.Fields{"deviceID": device.Id})
-	if device.Root {
-		// Scenario A
-		if device.ParentId != "" {
-			//	 Load logical device if needed.
-			if err := dMgr.logicalDeviceMgr.load(device.ParentId); err != nil {
-				log.Warnw("failure-loading-logical-device", log.Fields{"lDeviceID": device.ParentId})
-			}
-		} else {
-			log.Debugw("no-parent-to-load", log.Fields{"deviceID": device.Id})
-		}
-		//	Load all child devices, if needed
-		if childDeviceIDs, err := dMgr.getAllChildDeviceIDs(device); err == nil {
-			for _, childDeviceID := range childDeviceIDs {
-				if _, err := dMgr.loadDevice(childDeviceID); err != nil {
-					log.Warnw("failure-loading-device", log.Fields{"deviceID": childDeviceID})
-					return err
-				}
-			}
-			log.Debugw("loaded-children", log.Fields{"deviceID": device.Id, "numChildren": len(childDeviceIDs)})
-		} else {
-			log.Debugw("no-child-to-load", log.Fields{"deviceID": device.Id})
-		}
-	}
-	return nil
-}
-
-// load loads the deviceID in memory, if not present, and also loads its accompanying parents and children.  Loading
-// in memory is for improved performance.  It is not imperative that a device needs to be in memory when a request
-// acting on the device is received by the core. In such a scenario, the Core will load the device in memory first
-// and the proceed with the request.
-func (dMgr *DeviceManager) load(deviceID string) error {
-	log.Debug("load...")
-	// First load the device - this may fail in case the device was deleted intentionally by the other core
-	var dAgent *DeviceAgent
-	var err error
-	if dAgent, err = dMgr.loadDevice(deviceID); err != nil {
-		log.Warnw("failure-loading-device", log.Fields{"deviceID": deviceID})
-		return err
-	}
-	// Get the loaded device details
-	var device *voltha.Device
-	if device, err = dAgent.getDevice(); err != nil {
-		return err
-	}
-
-	// If the device is in Pre-provisioning or deleted state stop here
-	if device.AdminState == voltha.AdminState_PREPROVISIONED || device.AdminState == voltha.AdminState_DELETED {
-		return nil
-	}
-
-	// Now we face two scenarios
-	if device.Root {
-		// Load all children as well as the parent of this device (logical_device)
-		if err := dMgr.loadRootDeviceParentAndChildren(device); err != nil {
-			log.Warnw("failure-loading-device-parent-and-children", log.Fields{"deviceID": deviceID})
-			return err
-		}
-		log.Debugw("successfully-loaded-parent-and-children", log.Fields{"deviceID": deviceID})
-	} else {
-		//	Scenario B - use the parentID of that device (root device) to trigger the loading
-		if device.ParentId != "" {
-			return dMgr.load(device.ParentId)
-		}
-	}
-	return nil
-}
-
-// ListDeviceIDs retrieves the latest device IDs information from the data model (memory data only)
-func (dMgr *DeviceManager) ListDeviceIDs() (*voltha.IDs, error) {
-	log.Debug("ListDeviceIDs")
-	// Report only device IDs that are in the device agent map
-	return dMgr.listDeviceIDsFromMap(), nil
-}
-
-//ReconcileDevices is a request to a voltha core to managed a list of devices based on their IDs
-func (dMgr *DeviceManager) ReconcileDevices(ctx context.Context, ids *voltha.IDs, ch chan interface{}) {
-	log.Debug("ReconcileDevices")
-	var res interface{}
-	if ids != nil {
-		toReconcile := len(ids.Items)
-		reconciled := 0
-		for _, id := range ids.Items {
-			//	 Act on the device only if its not present in the agent map
-			if !dMgr.IsDeviceInCache(id.Id) {
-				//	Device ID not in memory
-				log.Debugw("reconciling-device", log.Fields{"id": id.Id})
-				// Load device from dB
-				agent := newDeviceAgent(&voltha.Device{Id: id.Id}, dMgr, dMgr.clusterDataProxy)
-				if err := agent.start(context.TODO(), true); err != nil {
-					log.Warnw("failure-loading-device", log.Fields{"deviceID": id.Id})
-					agent.stop(context.TODO())
-				} else {
-					dMgr.addDeviceAgentToMap(agent)
-					reconciled++
-				}
-			} else {
-				reconciled++
-			}
-		}
-		if toReconcile != reconciled {
-			res = status.Errorf(codes.DataLoss, "less-device-reconciled:%d/%d", reconciled, toReconcile)
-		}
-	} else {
-		res = status.Errorf(codes.InvalidArgument, "empty-list-of-ids")
-	}
-	sendResponse(ctx, ch, res)
-}
-
-// ListDevicePorts returns ports details for a specific device
-func (dMgr *DeviceManager) ListDevicePorts(ctx context.Context, deviceID string) (*voltha.Ports, error) {
-	log.Debugw("ListDevicePorts", log.Fields{"deviceid": deviceID})
-	if agent := dMgr.getDeviceAgent(deviceID); agent != nil {
-		return agent.ListDevicePorts(ctx)
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", deviceID)
-
-}
-
-// ListDevicePmConfigs returns PM config details for a specific device
-func (dMgr *DeviceManager) ListDevicePmConfigs(ctx context.Context, deviceID string) (*voltha.PmConfigs, error) {
-	log.Debugw("ListDevicePmConfigs", log.Fields{"deviceid": deviceID})
-	if agent := dMgr.getDeviceAgent(deviceID); agent != nil {
-		return agent.ListDevicePmConfigs(ctx)
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", deviceID)
-
-}
-
-// ListDeviceFlows returns flow details for a specific device
-func (dMgr *DeviceManager) ListDeviceFlows(ctx context.Context, deviceID string) (*voltha.Flows, error) {
-	log.Debugw("ListDeviceFlows", log.Fields{"deviceid": deviceID})
-	if agent := dMgr.getDeviceAgent(deviceID); agent != nil {
-		return agent.ListDeviceFlows(ctx)
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", deviceID)
-}
-
-// ListDeviceFlowGroups returns flow group details for a specific device
-func (dMgr *DeviceManager) ListDeviceFlowGroups(ctx context.Context, deviceID string) (*voltha.FlowGroups, error) {
-	log.Debugw("ListDeviceFlowGroups", log.Fields{"deviceid": deviceID})
-	if agent := dMgr.getDeviceAgent(deviceID); agent != nil {
-		return agent.ListDeviceFlowGroups(ctx)
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", deviceID)
-
-}
-
-// GetImageDownloadStatus returns the download status of an image of a particular device
-func (dMgr *DeviceManager) GetImageDownloadStatus(ctx context.Context, deviceID string, imageName string) (*voltha.ImageDownload, error) {
-	log.Debugw("GetImageDownloadStatus", log.Fields{"deviceid": deviceID, "imagename": imageName})
-	if agent := dMgr.getDeviceAgent(deviceID); agent != nil {
-		return agent.GetImageDownloadStatus(ctx, imageName)
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", deviceID)
-
-}
-
-// GetImageDownload return the download details for a specific image entry
-func (dMgr *DeviceManager) GetImageDownload(ctx context.Context, deviceID string, imageName string) (*voltha.ImageDownload, error) {
-	log.Debugw("GetImageDownload", log.Fields{"deviceid": deviceID, "imagename": imageName})
-	if agent := dMgr.getDeviceAgent(deviceID); agent != nil {
-		return agent.GetImageDownload(ctx, imageName)
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", deviceID)
-
-}
-
-// ListImageDownloads returns all image downloads known to the system
-func (dMgr *DeviceManager) ListImageDownloads(ctx context.Context, deviceID string) (*voltha.ImageDownloads, error) {
-	log.Debugw("ListImageDownloads", log.Fields{"deviceid": deviceID})
-	if agent := dMgr.getDeviceAgent(deviceID); agent != nil {
-		return agent.ListImageDownloads(ctx)
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", deviceID)
-
-}
-
-// GetImages returns all images for a specific device entry
-func (dMgr *DeviceManager) GetImages(ctx context.Context, deviceID string) (*voltha.Images, error) {
-	log.Debugw("GetImages", log.Fields{"deviceid": deviceID})
-	if agent := dMgr.getDeviceAgent(deviceID); agent != nil {
-		return agent.GetImages(ctx)
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", deviceID)
-
-}
-
-func (dMgr *DeviceManager) getParentDevice(childDevice *voltha.Device) *voltha.Device {
-	//	Sanity check
-	if childDevice.Root {
-		// childDevice is the parent device
-		return childDevice
-	}
-	parentDevice, _ := dMgr.GetDevice(childDevice.ParentId)
-	return parentDevice
-}
-
-//getAllChildDeviceIDs is a helper method to get all the child device IDs from the device passed as parameter
-func (dMgr *DeviceManager) getAllChildDeviceIDs(parentDevice *voltha.Device) ([]string, error) {
-	log.Debugw("getAllChildDeviceIDs", log.Fields{"parentDeviceID": parentDevice.Id})
-	childDeviceIDs := make([]string, 0)
-	if parentDevice != nil {
-		for _, port := range parentDevice.Ports {
-			for _, peer := range port.Peers {
-				childDeviceIDs = append(childDeviceIDs, peer.DeviceId)
-			}
-		}
-	}
-	return childDeviceIDs, nil
-}
diff --git a/ro_core/core/device_manager_test.go b/ro_core/core/device_manager_test.go
deleted file mode 100644
index 510eb45..0000000
--- a/ro_core/core/device_manager_test.go
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package core
-
-import (
-	"testing"
-
-	"github.com/opencord/voltha-go/db/model"
-	"github.com/opencord/voltha-go/ro_core/config"
-	"github.com/opencord/voltha-lib-go/v3/pkg/db"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-	"github.com/stretchr/testify/assert"
-)
-
-func MakeTestDevManagerConfig() (*Core, error) {
-	var core Core
-	core.instanceID = "ro_core"
-	core.config = config.NewROCoreFlags()
-	backend := db.Backend{
-		Client:     core.kvClient,
-		StoreType:  core.config.KVStoreType,
-		Host:       core.config.KVStoreHost,
-		Port:       core.config.KVStorePort,
-		Timeout:    core.config.KVStoreTimeout,
-		PathPrefix: "service/voltha"}
-	core.clusterDataRoot = model.NewRoot(&voltha.Voltha{}, &backend)
-	core.genericMgr = newModelProxyManager(core.clusterDataProxy)
-
-	return &core, nil
-}
-func TestNewDeviceManager(t *testing.T) {
-
-	core, _ := MakeTestDevManagerConfig()
-
-	core.deviceMgr = newDeviceManager(core.clusterDataProxy, core.instanceID)
-	assert.NotNil(t, core.deviceMgr)
-}
-
-func TestListDeviceIds(t *testing.T) {
-
-	core, _ := MakeTestDevManagerConfig()
-
-	core.deviceMgr = newDeviceManager(core.clusterDataProxy, core.instanceID)
-	assert.NotNil(t, core.deviceMgr)
-
-	myIds, _ := core.deviceMgr.ListDeviceIDs()
-	assert.NotNil(t, myIds)
-}
-
-func TestGetDeviceAgent(t *testing.T) {
-
-	// Tests also methods addDeviceAgentToMap,
-	//                    listDeviceIdsFromMap
-	//                    deleteDeviceAgentToMap
-
-	core, _ := MakeTestDevManagerConfig()
-
-	core.deviceMgr = newDeviceManager(core.clusterDataProxy, core.instanceID)
-	assert.NotNil(t, core.deviceMgr)
-
-	devAgent := newDeviceAgent(&voltha.Device{Id: "new_device"}, core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, devAgent)
-
-	// addDeviceAgentToMap
-	core.deviceMgr.addDeviceAgentToMap(devAgent)
-
-	// listDeviceIdsFromMap
-	myIDs := core.deviceMgr.listDeviceIDsFromMap()
-	assert.NotNil(t, myIDs)
-
-	// getDeviceAgent
-	myDevAgent := core.deviceMgr.getDeviceAgent(devAgent.deviceID)
-	assert.NotNil(t, myDevAgent)
-
-	// deleteDeviceAgentToMap
-	core.deviceMgr.deleteDeviceAgentToMap(devAgent)
-}
-
-func TestLoadDevice(t *testing.T) {
-
-	core, _ := MakeTestDevManagerConfig()
-
-	core.deviceMgr = newDeviceManager(core.clusterDataProxy, core.instanceID)
-	assert.NotNil(t, core.deviceMgr)
-
-	devAgent := newDeviceAgent(&voltha.Device{Id: "new_device"}, core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, devAgent)
-
-	// addDeviceAgentToMap
-	core.deviceMgr.addDeviceAgentToMap(devAgent)
-
-	myDev, err := core.deviceMgr.loadDevice("new_device")
-	assert.NotNil(t, myDev)
-	assert.Nil(t, err)
-}
-
-func TestIsDeviceInCache(t *testing.T) {
-
-	// Tests also methods addDeviceAgentToMap,
-	//                    listDeviceIdsFromMap
-	//                    deleteDeviceAgentToMap
-
-	core, _ := MakeTestDevManagerConfig()
-
-	core.deviceMgr = newDeviceManager(core.clusterDataProxy, core.instanceID)
-	assert.NotNil(t, core.deviceMgr)
-
-	devAgent := newDeviceAgent(&voltha.Device{Id: "new_device"}, core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, devAgent)
-
-	// addDeviceAgentToMap
-	core.deviceMgr.addDeviceAgentToMap(devAgent)
-
-	isInCache := core.deviceMgr.IsDeviceInCache(devAgent.deviceID)
-	assert.True(t, isInCache)
-
-	// deleteDeviceAgentToMap
-	core.deviceMgr.deleteDeviceAgentToMap(devAgent)
-
-	isInCacheDel := core.deviceMgr.IsDeviceInCache(devAgent.deviceID)
-	assert.False(t, isInCacheDel)
-}
-
-func TestLoadRootDeviceParentAndChildren(t *testing.T) {
-
-	core, _ := MakeTestDevManagerConfig()
-
-	core.deviceMgr = newDeviceManager(core.clusterDataProxy, core.instanceID)
-	assert.NotNil(t, core.deviceMgr)
-
-	devAgent := newDeviceAgent(&voltha.Device{Id: "new_device"}, core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, devAgent)
-
-	// addDeviceAgentToMap
-	core.deviceMgr.addDeviceAgentToMap(devAgent)
-
-	err := core.deviceMgr.loadRootDeviceParentAndChildren(devAgent.lastData)
-	assert.Nil(t, err)
-}
-
-func TestGetParentDevice(t *testing.T) {
-
-	core, _ := MakeTestDevManagerConfig()
-
-	core.deviceMgr = newDeviceManager(core.clusterDataProxy, core.instanceID)
-	assert.NotNil(t, core.deviceMgr)
-
-	devAgent := newDeviceAgent(&voltha.Device{Id: "new_device"}, core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, devAgent)
-
-	// addDeviceAgentToMap
-	core.deviceMgr.addDeviceAgentToMap(devAgent)
-
-	myDev := core.deviceMgr.getParentDevice(devAgent.lastData)
-	assert.Nil(t, myDev)
-}
-
-func TestGetAllChildDeviceIds(t *testing.T) {
-
-	core, _ := MakeTestDevManagerConfig()
-
-	core.deviceMgr = newDeviceManager(core.clusterDataProxy, core.instanceID)
-	assert.NotNil(t, core.deviceMgr)
-
-	devAgent := newDeviceAgent(&voltha.Device{Id: "new_device"}, core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, devAgent)
-
-	// addDeviceAgentToMap
-	core.deviceMgr.addDeviceAgentToMap(devAgent)
-
-	myIds, err := core.deviceMgr.getAllChildDeviceIDs(devAgent.lastData)
-	assert.NotNil(t, myIds)
-	assert.Nil(t, err)
-}
diff --git a/ro_core/core/grpc_nbi_api_handler.go b/ro_core/core/grpc_nbi_api_handler.go
deleted file mode 100644
index 8fdc03c..0000000
--- a/ro_core/core/grpc_nbi_api_handler.go
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package core
-
-import (
-	"context"
-	"errors"
-
-	"github.com/golang/protobuf/ptypes/empty"
-	da "github.com/opencord/voltha-go/common/core/northbound/grpc"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-protos/v3/go/common"
-	"github.com/opencord/voltha-protos/v3/go/omci"
-	"github.com/opencord/voltha-protos/v3/go/openflow_13"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/metadata"
-	"google.golang.org/grpc/status"
-)
-
-// APIHandler represents API handler related information
-type APIHandler struct {
-	commonMgr        *ModelProxyManager
-	deviceMgr        *DeviceManager
-	logicalDeviceMgr *LogicalDeviceManager
-	da.DefaultAPIHandler
-}
-
-// NewAPIHandler creates API handler
-func NewAPIHandler(generalMgr *ModelProxyManager, deviceMgr *DeviceManager, lDeviceMgr *LogicalDeviceManager) *APIHandler {
-	handler := &APIHandler{
-		commonMgr:        generalMgr,
-		deviceMgr:        deviceMgr,
-		logicalDeviceMgr: lDeviceMgr,
-	}
-	return handler
-}
-
-// isTestMode is a helper function to determine a function is invoked for testing only
-func isTestMode(ctx context.Context) bool {
-	md, _ := metadata.FromIncomingContext(ctx)
-	_, exist := md[common.TestModeKeys_api_test.String()]
-	return exist
-}
-
-// waitForNilResponseOnSuccess is a helper function to wait for a response on channel ch where an nil
-// response is expected in a successful scenario
-func waitForNilResponseOnSuccess(ctx context.Context, ch chan interface{}) (*empty.Empty, error) {
-	select {
-	case res := <-ch:
-		if res == nil {
-			return new(empty.Empty), nil
-		} else if err, ok := res.(error); ok {
-			return new(empty.Empty), err
-		} else {
-			log.Warnw("unexpected-return-type", log.Fields{"result": res})
-			err = status.Errorf(codes.Internal, "%s", res)
-			return new(empty.Empty), err
-		}
-	case <-ctx.Done():
-		log.Debug("client-timeout")
-		return nil, ctx.Err()
-	}
-}
-
-// UpdateLogLevel updates log level to the requested level in specific packaged if mentioned
-func (*APIHandler) UpdateLogLevel(ctx context.Context, logging *voltha.Logging) (*empty.Empty, error) {
-	log.Debugw("UpdateLogLevel-request", log.Fields{"package": logging.PackageName, "intval": int(logging.Level)})
-	out := new(empty.Empty)
-	if logging.PackageName == "" {
-		log.SetAllLogLevel(int(logging.Level))
-		log.SetDefaultLogLevel(int(logging.Level))
-	} else if logging.PackageName == "default" {
-		log.SetDefaultLogLevel(int(logging.Level))
-	} else {
-		log.SetPackageLogLevel(logging.PackageName, int(logging.Level))
-	}
-
-	return out, nil
-}
-
-// GetLogLevels returns log levels for requested packages
-func (APIHandler) GetLogLevels(ctx context.Context, in *voltha.LoggingComponent) (*voltha.Loggings, error) {
-	logLevels := &voltha.Loggings{}
-
-	// do the per-package log levels
-	for _, packageName := range log.GetPackageNames() {
-		level, err := log.GetPackageLogLevel(packageName)
-		if err != nil {
-			return nil, err
-		}
-		logLevel := &voltha.Logging{
-			ComponentName: in.ComponentName,
-			PackageName:   packageName,
-			Level:         voltha.LogLevel_Types(level)}
-		logLevels.Items = append(logLevels.Items, logLevel)
-	}
-
-	// now do the default log level
-	logLevel := &voltha.Logging{
-		ComponentName: in.ComponentName,
-		PackageName:   "default",
-		Level:         voltha.LogLevel_Types(log.GetDefaultLogLevel())}
-	logLevels.Items = append(logLevels.Items, logLevel)
-
-	return logLevels, nil
-}
-
-// GetVoltha returns the contents of all components (i.e. devices, logical_devices, ...)
-func (handler *APIHandler) GetVoltha(ctx context.Context, empty *empty.Empty) (*voltha.Voltha, error) {
-	log.Debug("GetVoltha")
-	return handler.commonMgr.GetVoltha(ctx)
-}
-
-// ListCoreInstances returns details on the running core containers
-func (handler *APIHandler) ListCoreInstances(ctx context.Context, empty *empty.Empty) (*voltha.CoreInstances, error) {
-	log.Debug("ListCoreInstances")
-	return handler.commonMgr.ListCoreInstances(ctx)
-}
-
-// GetCoreInstance returns the details of a specific core container
-func (handler *APIHandler) GetCoreInstance(ctx context.Context, id *voltha.ID) (*voltha.CoreInstance, error) {
-	log.Debugw("GetCoreInstance", log.Fields{"id": id})
-	return handler.commonMgr.GetCoreInstance(ctx, id.Id)
-}
-
-// ListAdapters returns the contents of all adapters known to the system
-func (handler *APIHandler) ListAdapters(ctx context.Context, empty *empty.Empty) (*voltha.Adapters, error) {
-	log.Debug("ListDevices")
-	return handler.commonMgr.ListAdapters(ctx)
-}
-
-// GetDevice returns the details a specific device
-func (handler *APIHandler) GetDevice(ctx context.Context, id *voltha.ID) (*voltha.Device, error) {
-	log.Debugw("GetDevice-request", log.Fields{"id": id})
-	return handler.deviceMgr.GetDevice(id.Id)
-}
-
-// ListDevices returns the contents of all devices known to the system
-func (handler *APIHandler) ListDevices(ctx context.Context, empty *empty.Empty) (*voltha.Devices, error) {
-	log.Debug("ListDevices")
-	devices, err := handler.deviceMgr.ListDevices()
-	if err != nil {
-		log.Errorw("failed-to-list-devices", log.Fields{"error": err})
-		return nil, err
-	}
-	return devices, nil
-}
-
-// ListDeviceIds returns the list of device ids managed by a voltha core
-func (handler *APIHandler) ListDeviceIds(ctx context.Context, empty *empty.Empty) (*voltha.IDs, error) {
-	log.Debug("ListDeviceIDs")
-	if isTestMode(ctx) {
-		out := &voltha.IDs{Items: make([]*voltha.ID, 0)}
-		return out, nil
-	}
-	return handler.deviceMgr.ListDeviceIDs()
-}
-
-// ListDevicePorts returns the ports details for a specific device entry
-func (handler *APIHandler) ListDevicePorts(ctx context.Context, id *voltha.ID) (*voltha.Ports, error) {
-	log.Debugw("ListDevicePorts", log.Fields{"deviceid": id})
-	return handler.deviceMgr.ListDevicePorts(ctx, id.Id)
-}
-
-// ListDevicePmConfigs returns the PM config details for a specific device entry
-func (handler *APIHandler) ListDevicePmConfigs(ctx context.Context, id *voltha.ID) (*voltha.PmConfigs, error) {
-	log.Debugw("ListDevicePmConfigs", log.Fields{"deviceid": id})
-	return handler.deviceMgr.ListDevicePmConfigs(ctx, id.Id)
-}
-
-// ListDeviceFlows returns the flow details for a specific device entry
-func (handler *APIHandler) ListDeviceFlows(ctx context.Context, id *voltha.ID) (*voltha.Flows, error) {
-	log.Debugw("ListDeviceFlows", log.Fields{"deviceid": id})
-	return handler.deviceMgr.ListDeviceFlows(ctx, id.Id)
-}
-
-// ListDeviceFlowGroups returns the flow group details for a specific device entry
-func (handler *APIHandler) ListDeviceFlowGroups(ctx context.Context, id *voltha.ID) (*voltha.FlowGroups, error) {
-	log.Debugw("ListDeviceFlowGroups", log.Fields{"deviceid": id})
-	return handler.deviceMgr.ListDeviceFlowGroups(ctx, id.Id)
-}
-
-// ListDeviceTypes returns all the device types known to the system
-func (handler *APIHandler) ListDeviceTypes(ctx context.Context, empty *empty.Empty) (*voltha.DeviceTypes, error) {
-	log.Debug("ListDeviceTypes")
-	return handler.commonMgr.ListDeviceTypes(ctx)
-}
-
-// GetDeviceType returns the device type for a specific device entry
-func (handler *APIHandler) GetDeviceType(ctx context.Context, id *voltha.ID) (*voltha.DeviceType, error) {
-	log.Debugw("GetDeviceType", log.Fields{"typeid": id})
-	return handler.commonMgr.GetDeviceType(ctx, id.Id)
-}
-
-// ListDeviceGroups returns all the device groups known to the system
-func (handler *APIHandler) ListDeviceGroups(ctx context.Context, empty *empty.Empty) (*voltha.DeviceGroups, error) {
-	log.Debug("ListDeviceGroups")
-	return handler.commonMgr.ListDeviceGroups(ctx)
-}
-
-// GetDeviceGroup returns a specific device group entry
-func (handler *APIHandler) GetDeviceGroup(ctx context.Context, id *voltha.ID) (*voltha.DeviceGroup, error) {
-	log.Debugw("GetDeviceGroup", log.Fields{"groupid": id})
-	return handler.commonMgr.GetDeviceGroup(ctx, id.Id)
-}
-
-// GetImageDownloadStatus returns the download status for a specific image entry
-func (handler *APIHandler) GetImageDownloadStatus(ctx context.Context, img *voltha.ImageDownload) (*voltha.ImageDownload, error) {
-	log.Debugw("GetImageDownloadStatus", log.Fields{"deviceid": img.GetId(), "imagename": img.GetName()})
-	return handler.deviceMgr.GetImageDownloadStatus(ctx, img.GetId(), img.GetName())
-}
-
-// GetImageDownload return the download details for a specific image entry
-func (handler *APIHandler) GetImageDownload(ctx context.Context, img *voltha.ImageDownload) (*voltha.ImageDownload, error) {
-	log.Debugw("GetImageDownload", log.Fields{"deviceid": img.GetId(), "imagename": img.GetName()})
-	return handler.deviceMgr.GetImageDownload(ctx, img.GetId(), img.GetName())
-}
-
-// ListImageDownloads returns all image downloads known to the system
-func (handler *APIHandler) ListImageDownloads(ctx context.Context, id *voltha.ID) (*voltha.ImageDownloads, error) {
-	log.Debugw("GetImageDownload", log.Fields{"deviceid": id})
-	return handler.deviceMgr.ListImageDownloads(ctx, id.Id)
-}
-
-// GetImages returns all images for a specific device entry
-func (handler *APIHandler) GetImages(ctx context.Context, id *voltha.ID) (*voltha.Images, error) {
-	log.Debugw("GetImages", log.Fields{"deviceid": id})
-	return handler.deviceMgr.GetImages(ctx, id.Id)
-}
-
-// ListEventFilters return all event filters known to the system
-func (handler *APIHandler) ListEventFilters(ctx context.Context, empty *empty.Empty) (*voltha.EventFilters, error) {
-	log.Debug("ListEventFilters")
-	return handler.commonMgr.ListEventFilters(ctx)
-}
-
-// GetEventFilter returns a  filter for a specific device
-func (handler *APIHandler) GetEventFilter(ctx context.Context, id *voltha.ID) (*voltha.EventFilters, error) {
-	log.Debugw("GetEventFilter", log.Fields{"deviceid": id})
-	return handler.commonMgr.GetEventFilter(ctx, id.Id)
-}
-
-//ReconcileDevices is a request to a voltha core to managed a list of devices  based on their IDs
-func (handler *APIHandler) ReconcileDevices(ctx context.Context, ids *voltha.IDs) (*empty.Empty, error) {
-	log.Debug("ReconcileDevices")
-	if isTestMode(ctx) {
-		out := new(empty.Empty)
-		return out, nil
-	}
-	ch := make(chan interface{})
-	defer close(ch)
-	go handler.deviceMgr.ReconcileDevices(ctx, ids, ch)
-	return waitForNilResponseOnSuccess(ctx, ch)
-}
-
-// GetLogicalDevice returns the details for a specific logical device entry
-func (handler *APIHandler) GetLogicalDevice(ctx context.Context, id *voltha.ID) (*voltha.LogicalDevice, error) {
-	log.Debugw("GetLogicalDevice-request", log.Fields{"id": id})
-	return handler.logicalDeviceMgr.getLogicalDevice(id.Id)
-}
-
-// ListLogicalDevices returns all logical devices known to the system
-func (handler *APIHandler) ListLogicalDevices(ctx context.Context, empty *empty.Empty) (*voltha.LogicalDevices, error) {
-	log.Debug("ListLogicalDevices")
-	return handler.logicalDeviceMgr.listLogicalDevices()
-}
-
-// ListLogicalDevicePorts returns port details for a specific logical device entry
-func (handler *APIHandler) ListLogicalDevicePorts(ctx context.Context, id *voltha.ID) (*voltha.LogicalPorts, error) {
-	log.Debugw("ListLogicalDevicePorts", log.Fields{"logicaldeviceid": id})
-	return handler.logicalDeviceMgr.ListLogicalDevicePorts(ctx, id.Id)
-}
-
-// ListLogicalDeviceFlows returns flow details for a specific logical device entry
-func (handler *APIHandler) ListLogicalDeviceFlows(ctx context.Context, id *voltha.ID) (*voltha.Flows, error) {
-	log.Debugw("ListLogicalDeviceFlows", log.Fields{"logicaldeviceid": id})
-	return handler.logicalDeviceMgr.ListLogicalDeviceFlows(ctx, id.Id)
-}
-
-// ListLogicalDeviceFlowGroups returns flow group details for a specific logical device entry
-func (handler *APIHandler) ListLogicalDeviceFlowGroups(ctx context.Context, id *voltha.ID) (*voltha.FlowGroups, error) {
-	log.Debugw("ListLogicalDeviceFlows", log.Fields{"logicaldeviceid": id})
-	return handler.logicalDeviceMgr.ListLogicalDeviceFlowGroups(ctx, id.Id)
-}
-
-// SelfTest - TODO
-func (handler *APIHandler) SelfTest(ctx context.Context, id *voltha.ID) (*voltha.SelfTestResponse, error) {
-	log.Debugw("SelfTest-request", log.Fields{"id": id})
-	if isTestMode(ctx) {
-		resp := &voltha.SelfTestResponse{Result: voltha.SelfTestResponse_SUCCESS}
-		return resp, nil
-	}
-	return nil, errors.New("UnImplemented")
-}
-
-// GetAlarmDeviceData - @TODO useless stub, what should this actually do?
-func (handler *APIHandler) GetAlarmDeviceData(
-	ctx context.Context,
-	in *common.ID,
-) (*omci.AlarmDeviceData, error) {
-	log.Debug("GetAlarmDeviceData-stub")
-	return nil, nil
-}
-
-// GetMeterStatsOfLogicalDevice - @TODO useless stub, what should this actually do?
-func (handler *APIHandler) GetMeterStatsOfLogicalDevice(
-	ctx context.Context,
-	in *common.ID,
-) (*openflow_13.MeterStatsReply, error) {
-	log.Debug("GetMeterStatsOfLogicalDevice-stub")
-	return nil, nil
-}
-
-// GetMibDeviceData - @TODO useless stub, what should this actually do?
-func (handler *APIHandler) GetMibDeviceData(
-	ctx context.Context,
-	in *common.ID,
-) (*omci.MibDeviceData, error) {
-	log.Debug("GetMibDeviceData-stub")
-	return nil, nil
-}
-
-// SimulateAlarm - @TODO useless stub, what should this actually do?
-func (handler *APIHandler) SimulateAlarm(
-	ctx context.Context,
-	in *voltha.SimulateAlarmRequest,
-) (*common.OperationResp, error) {
-	log.Debug("SimulateAlarm-stub")
-	return nil, nil
-}
diff --git a/ro_core/core/grpc_nbi_api_handler_test.go b/ro_core/core/grpc_nbi_api_handler_test.go
deleted file mode 100644
index a62f8e5..0000000
--- a/ro_core/core/grpc_nbi_api_handler_test.go
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package core
-
-import (
-	"context"
-	"strconv"
-	"testing"
-
-	"github.com/opencord/voltha-go/ro_core/config"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-protos/v3/go/common"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-	"github.com/phayes/freeport"
-	"github.com/stretchr/testify/assert"
-)
-
-func MakeTestGrpcNbiConfig() *Core {
-	var ctx context.Context
-	var core *Core
-	var roCoreFlgs *config.ROCoreFlags
-	var roC *roCore
-
-	freePort, errP := freeport.GetFreePort()
-	if errP == nil {
-		freePortStr := strconv.Itoa(freePort)
-
-		roCoreFlgs = config.NewROCoreFlags()
-		roC = newROCore(roCoreFlgs)
-		if (roC != nil) && (roCoreFlgs != nil) {
-			addr := "127.0.0.1" + ":" + freePortStr
-			cli, err := newKVClient("etcd", addr, 5)
-			if err == nil {
-				roC.kvClient = cli
-				core = NewCore(ctx, "ro_core", roCoreFlgs, roC.kvClient)
-			}
-		}
-	}
-
-	return core
-}
-
-func TestNewAPIHandler_grpc(t *testing.T) {
-	core := MakeTestGrpcNbiConfig()
-	assert.NotNil(t, core)
-
-	// NewAPIHandler declares, initializes and returns an handler struct
-	apiHdl := NewAPIHandler(core.genericMgr, core.deviceMgr, core.logicalDeviceMgr)
-	assert.NotNil(t, apiHdl)
-}
-
-func TestUpdateLogLevel_grpc(t *testing.T) {
-	core := MakeTestGrpcNbiConfig()
-	assert.NotNil(t, core)
-
-	var testCtx = context.Background()
-	testLogDef := &voltha.Logging{
-		ComponentName: "testing",
-		PackageName:   "default",
-		Level:         voltha.LogLevel_Types(log.GetDefaultLogLevel())}
-	testLogEmpty := &voltha.Logging{
-		ComponentName: "testing",
-		PackageName:   "",
-		Level:         voltha.LogLevel_Types(log.GetDefaultLogLevel())}
-	testLog := &voltha.Logging{
-		ComponentName: "testing",
-		PackageName:   "testing",
-		Level:         voltha.LogLevel_Types(log.GetDefaultLogLevel())}
-	testLog3 := &voltha.Logging{
-		ComponentName: "testing",
-		PackageName:   "github.com/opencord/voltha-go/ro_core/core",
-		Level:         3 /*voltha.LogLevel_LogLevel(log.GetDefaultLogLevel())*/}
-	ahndl := NewAPIHandler(core.genericMgr, core.deviceMgr, core.logicalDeviceMgr)
-
-	type args struct {
-		ctx     context.Context
-		logging *voltha.Logging
-	}
-	tests := []struct {
-		name    string
-		ah      *APIHandler
-		args    args
-		want    int
-		wantErr error
-	}{
-		{"TestUpdateLogLevel-1", ahndl, args{testCtx, testLogDef}, log.DebugLevel, nil},
-		{"TestUpdateLogLevel-2", ahndl, args{testCtx, testLogEmpty}, log.FatalLevel, nil},
-		{"TestUpdateLogLevel-3", ahndl, args{testCtx, testLog}, log.FatalLevel, nil},
-		{"TestUpdateLogLevel-4", ahndl, args{testCtx, testLog3}, log.ErrorLevel, nil},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			_, gotErr := tt.ah.UpdateLogLevel(tt.args.ctx, tt.args.logging)
-			if tt.wantErr != gotErr {
-				t.Errorf("Error")
-			}
-			for _, packageNames := range log.GetPackageNames() {
-				logLev, errLogLev := log.GetPackageLogLevel(packageNames)
-				if errLogLev == nil {
-					if packageNames == "github.com/opencord/voltha-go/ro_core/core" {
-						if logLev != tt.want {
-							t.Errorf("Error. Want %d, Got %d", tt.want, logLev)
-						}
-					}
-				}
-			}
-		})
-	}
-}
-
-func TestGetLogLevels_grpc(t *testing.T) {
-	core := MakeTestGrpcNbiConfig()
-	assert.NotNil(t, core)
-
-	testCtx := context.Background()
-	testLc := new(common.LoggingComponent)
-	testLc.ComponentName = "testing"
-
-	ahndl := NewAPIHandler(core.genericMgr, core.deviceMgr, core.logicalDeviceMgr)
-
-	type args struct {
-		ctx    context.Context
-		testLc *voltha.LoggingComponent
-	}
-	tests := []struct {
-		name    string
-		ah      *APIHandler
-		args    args
-		want    int
-		wantErr error
-	}{
-		{"TestGetLogLevels-1", ahndl, args{testCtx, testLc}, log.DebugLevel, nil},
-		{"TestGetLogLevels-2", ahndl, args{testCtx, testLc}, log.InfoLevel, nil},
-		{"TestGetLogLevels-3", ahndl, args{testCtx, testLc}, log.WarnLevel, nil},
-		{"TestGetLogLevels-4", ahndl, args{testCtx, testLc}, log.ErrorLevel, nil},
-		{"TestGetLogLevels-5", ahndl, args{testCtx, testLc}, log.FatalLevel, nil},
-		{"TestGetLogLevels-6", ahndl, args{testCtx, testLc}, log.ErrorLevel, nil},
-	}
-	for itt, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			// itt index match log levels to test (from DEBUG=0, to FATAL=6)
-			log.SetPackageLogLevel("github.com/opencord/voltha-go/ro_core/core", itt)
-			logLevs, gotErr := tt.ah.GetLogLevels(tt.args.ctx, tt.args.testLc)
-			if (logLevs == nil) || (gotErr != nil) {
-				t.Errorf("Error %v\n", gotErr)
-			}
-			for _, lli := range logLevs.Items {
-				if lli.PackageName == "github.com/opencord/voltha-go/ro_core/core" {
-					if int(lli.Level) != tt.want {
-						t.Errorf("logLev wanted %v logLev %v \n", tt.want, lli.Level)
-					}
-				}
-			}
-		})
-	}
-
-}
diff --git a/ro_core/core/logical_device_agent.go b/ro_core/core/logical_device_agent.go
deleted file mode 100644
index 374b2aa..0000000
--- a/ro_core/core/logical_device_agent.go
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package core
-
-import (
-	"context"
-	"sync"
-
-	"github.com/gogo/protobuf/proto"
-	"github.com/opencord/voltha-go/db/model"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/status"
-)
-
-// LogicalDeviceAgent represents logical device agent related information
-type LogicalDeviceAgent struct {
-	logicalDeviceID   string
-	lastData          *voltha.LogicalDevice
-	rootDeviceID      string
-	deviceMgr         *DeviceManager
-	ldeviceMgr        *LogicalDeviceManager
-	clusterDataProxy  *model.Proxy
-	exitChannel       chan int
-	lockLogicalDevice sync.RWMutex
-}
-
-func newLogicalDeviceAgent(id string, deviceID string, ldeviceMgr *LogicalDeviceManager, deviceMgr *DeviceManager, cdProxy *model.Proxy) *LogicalDeviceAgent {
-	var agent LogicalDeviceAgent
-	agent.exitChannel = make(chan int, 1)
-	agent.logicalDeviceID = id
-	agent.rootDeviceID = deviceID
-	agent.deviceMgr = deviceMgr
-	agent.clusterDataProxy = cdProxy
-	agent.ldeviceMgr = ldeviceMgr
-	agent.lockLogicalDevice = sync.RWMutex{}
-	return &agent
-}
-
-// start creates the logical device and add it to the data model
-func (agent *LogicalDeviceAgent) start(ctx context.Context, loadFromDb bool) error {
-	log.Infow("starting-logical_device-agent", log.Fields{"logicaldeviceID": agent.logicalDeviceID, "loadFromdB": loadFromDb})
-	agent.lockLogicalDevice.Lock()
-	defer agent.lockLogicalDevice.Unlock()
-	if loadFromDb {
-		//	load from dB - the logical may not exist at this time.  On error, just return and the calling function
-		// will destroy this agent.
-		if logicalDevice, err := agent.clusterDataProxy.Get(ctx, "/logical_devices/"+agent.logicalDeviceID, 0, false, ""); err != nil {
-			log.Errorw("failed-to-get-logical-device", log.Fields{"error": err})
-			return err
-		} else if logicalDevice != nil {
-			if lDevice, ok := logicalDevice.(*voltha.LogicalDevice); ok {
-				agent.lastData = proto.Clone(lDevice).(*voltha.LogicalDevice)
-			}
-		} else {
-			log.Errorw("failed-to-load-device", log.Fields{"logicaldeviceID": agent.logicalDeviceID})
-			return status.Errorf(codes.NotFound, "logicaldeviceID-%s", agent.logicalDeviceID)
-		}
-	}
-	log.Info("logical_device-agent-started")
-	return nil
-}
-
-// stop terminates the logical device agent.
-func (agent *LogicalDeviceAgent) stop(ctx context.Context) {
-	log.Info("stopping-logical_device-agent")
-	agent.lockLogicalDevice.Lock()
-	defer agent.lockLogicalDevice.Unlock()
-	//Remove the logical device from the model
-	agent.exitChannel <- 1
-	log.Info("logical_device-agent-stopped")
-}
-
-// GetLogicalDevice locks the logical device model and then retrieves the latest logical device information
-func (agent *LogicalDeviceAgent) GetLogicalDevice() (*voltha.LogicalDevice, error) {
-	log.Debug("GetLogicalDevice")
-	agent.lockLogicalDevice.Lock()
-	defer agent.lockLogicalDevice.Unlock()
-	if logicalDevice, err := agent.clusterDataProxy.Get(context.Background(), "/logical_devices/"+agent.logicalDeviceID, 0, false, ""); err != nil {
-		log.Errorw("failed-to-get-logical-device", log.Fields{"error": err})
-		return nil, err
-	} else if logicalDevice != nil {
-		if lDevice, ok := logicalDevice.(*voltha.LogicalDevice); ok {
-			return lDevice, nil
-		}
-	}
-	return nil, status.Errorf(codes.NotFound, "logical_device-%s", agent.logicalDeviceID)
-}
-
-// ListLogicalDevicePorts returns all logical device ports details
-func (agent *LogicalDeviceAgent) ListLogicalDevicePorts() (*voltha.LogicalPorts, error) {
-	log.Debug("ListLogicalDevicePorts")
-	if logicalDevice, _ := agent.ldeviceMgr.getLogicalDevice(agent.logicalDeviceID); logicalDevice != nil {
-		lPorts := make([]*voltha.LogicalPort, 0)
-		lPorts = append(lPorts, logicalDevice.Ports...)
-		return &voltha.LogicalPorts{Items: lPorts}, nil
-	}
-	return nil, status.Errorf(codes.NotFound, "logical_device-%s", agent.logicalDeviceID)
-}
-
-// ListLogicalDeviceFlows - listFlows locks the logical device model and then retrieves the latest flow information
-func (agent *LogicalDeviceAgent) ListLogicalDeviceFlows() (*voltha.Flows, error) {
-	log.Debug("ListLogicalDeviceFlows")
-	if logicalDevice, _ := agent.ldeviceMgr.getLogicalDevice(agent.logicalDeviceID); logicalDevice != nil {
-		return logicalDevice.GetFlows(), nil
-	}
-	return nil, status.Errorf(codes.NotFound, "logical_device-%s", agent.logicalDeviceID)
-}
-
-// ListLogicalDeviceFlowGroups - listFlowGroups locks the logical device model and then retrieves the latest flow groups information
-func (agent *LogicalDeviceAgent) ListLogicalDeviceFlowGroups() (*voltha.FlowGroups, error) {
-	log.Debug("ListLogicalDeviceFlowGroups")
-	if logicalDevice, _ := agent.ldeviceMgr.getLogicalDevice(agent.logicalDeviceID); logicalDevice != nil {
-		return logicalDevice.GetFlowGroups(), nil
-	}
-	return nil, status.Errorf(codes.NotFound, "logical_device-%s", agent.logicalDeviceID)
-}
diff --git a/ro_core/core/logical_device_agent_test.go b/ro_core/core/logical_device_agent_test.go
deleted file mode 100644
index 18e8c97..0000000
--- a/ro_core/core/logical_device_agent_test.go
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package core
-
-import (
-	"context"
-	"github.com/opencord/voltha-go/ro_core/config"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/phayes/freeport"
-	"github.com/stretchr/testify/assert"
-	"strconv"
-	"testing"
-)
-
-func MakeTestLogDevAgConfig() (*Core, error) {
-	var ctx context.Context
-	var core *Core
-	var roCoreFlgs *config.ROCoreFlags
-	var roC *roCore
-
-	freePort, errP := freeport.GetFreePort()
-	if errP == nil {
-		freePortStr := strconv.Itoa(freePort)
-
-		roCoreFlgs = config.NewROCoreFlags()
-		roC = newROCore(roCoreFlgs)
-
-		if (roC != nil) && (roCoreFlgs != nil) {
-			addr := "127.0.0.1" + ":" + freePortStr
-			cli, err := newKVClient("etcd", addr, 5)
-			if err == nil {
-				roC.kvClient = cli
-				//return roCoreFlgs, roC
-			}
-		}
-	}
-
-	core = NewCore(ctx, "ro_core", roCoreFlgs, roC.kvClient)
-	return core, nil
-}
-
-// newLogicalDeviceAgent test
-func TestNewLogicalDeviceAgent(t *testing.T) {
-	core, _ := MakeTestLogDevAgConfig()
-	assert.NotNil(t, core)
-	logAgent := newLogicalDeviceAgent("log-dev", "", core.logicalDeviceMgr, core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, logAgent)
-}
-
-// GetLogicalDevice, Flows, Ports test
-func TestGetLogicalDevice(t *testing.T) {
-	core, _ := MakeTestLogDevAgConfig()
-	assert.NotNil(t, core)
-
-	var err1 error
-	if core.clusterDataProxy, err1 = core.localDataRoot.CreateProxy(context.Background(), "/", false); err1 != nil {
-		log.Errorw("failed-to-create-cluster-proxy", log.Fields{"error": err1})
-		assert.NotNil(t, err1)
-	}
-
-	logDevMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, logDevMgr)
-
-	logAgent := newLogicalDeviceAgent("log-dev-ag", "", logDevMgr, core.deviceMgr, logDevMgr.clusterDataProxy)
-	assert.NotNil(t, logAgent)
-
-	logDevMgr.addLogicalDeviceAgentToMap(logAgent)
-
-	logDev, err := logAgent.GetLogicalDevice()
-	assert.Nil(t, logDev)
-	assert.NotNil(t, err)
-
-	Flws, err := logAgent.ListLogicalDeviceFlows()
-	assert.Nil(t, Flws)
-	assert.NotNil(t, err)
-	FlwsGrp, err := logAgent.ListLogicalDeviceFlowGroups()
-	assert.Nil(t, FlwsGrp)
-	assert.NotNil(t, err)
-
-	logDevPorts, err := logAgent.ListLogicalDevicePorts()
-	assert.Nil(t, logDevPorts)
-	assert.NotNil(t, err)
-
-}
diff --git a/ro_core/core/logical_device_manager.go b/ro_core/core/logical_device_manager.go
deleted file mode 100644
index e9e433f..0000000
--- a/ro_core/core/logical_device_manager.go
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package core
-
-import (
-	"context"
-	"sync"
-
-	"github.com/opencord/voltha-go/db/model"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-lib-go/v3/pkg/probe"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/status"
-)
-
-// LogicalDeviceManager represents logical device manager related information
-type LogicalDeviceManager struct {
-	logicalDeviceAgents        sync.Map
-	deviceMgr                  *DeviceManager
-	grpcNbiHdlr                *APIHandler
-	clusterDataProxy           *model.Proxy
-	exitChannel                chan int
-	lockLogicalDeviceAgentsMap sync.RWMutex
-}
-
-func newLogicalDeviceManager(deviceMgr *DeviceManager, cdProxy *model.Proxy) *LogicalDeviceManager {
-	var logicalDeviceMgr LogicalDeviceManager
-	logicalDeviceMgr.exitChannel = make(chan int, 1)
-	logicalDeviceMgr.deviceMgr = deviceMgr
-	logicalDeviceMgr.clusterDataProxy = cdProxy
-	logicalDeviceMgr.lockLogicalDeviceAgentsMap = sync.RWMutex{}
-	return &logicalDeviceMgr
-}
-
-func (ldMgr *LogicalDeviceManager) setGrpcNbiHandler(grpcNbiHandler *APIHandler) {
-	ldMgr.grpcNbiHdlr = grpcNbiHandler
-}
-
-func (ldMgr *LogicalDeviceManager) start(ctx context.Context) {
-	log.Info("starting-logical-device-manager")
-	probe.UpdateStatusFromContext(ctx, "logical-device-manager", probe.ServiceStatusRunning)
-	log.Info("logical-device-manager-started")
-}
-
-func (ldMgr *LogicalDeviceManager) stop(ctx context.Context) {
-	log.Info("stopping-logical-device-manager")
-	ldMgr.exitChannel <- 1
-	probe.UpdateStatusFromContext(ctx, "logical-device-manager", probe.ServiceStatusStopped)
-	log.Info("logical-device-manager-stopped")
-}
-
-func (ldMgr *LogicalDeviceManager) addLogicalDeviceAgentToMap(agent *LogicalDeviceAgent) {
-	if _, exist := ldMgr.logicalDeviceAgents.Load(agent.logicalDeviceID); !exist {
-		ldMgr.logicalDeviceAgents.Store(agent.logicalDeviceID, agent)
-	}
-}
-
-// getLogicalDeviceAgent returns the logical device agent.  If the device is not in memory then the device will
-// be loaded from dB and a logical device agent created to managed it.
-func (ldMgr *LogicalDeviceManager) getLogicalDeviceAgent(logicalDeviceID string) *LogicalDeviceAgent {
-	agent, ok := ldMgr.logicalDeviceAgents.Load(logicalDeviceID)
-	if ok {
-		return agent.(*LogicalDeviceAgent)
-	}
-	//	Try to load into memory - loading will also create the logical device agent
-	if err := ldMgr.load(logicalDeviceID); err == nil {
-		if agent, ok = ldMgr.logicalDeviceAgents.Load(logicalDeviceID); ok {
-			return agent.(*LogicalDeviceAgent)
-		}
-	}
-	return nil
-}
-
-func (ldMgr *LogicalDeviceManager) deleteLogicalDeviceAgent(logicalDeviceID string) {
-	ldMgr.logicalDeviceAgents.Delete(logicalDeviceID)
-}
-
-// GetLogicalDevice provides a cloned most up to date logical device
-func (ldMgr *LogicalDeviceManager) getLogicalDevice(id string) (*voltha.LogicalDevice, error) {
-	log.Debugw("getlogicalDevice", log.Fields{"logicaldeviceid": id})
-	if agent := ldMgr.getLogicalDeviceAgent(id); agent != nil {
-		return agent.GetLogicalDevice()
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", id)
-}
-
-//listLogicalDevices returns the list of all logical devices
-func (ldMgr *LogicalDeviceManager) listLogicalDevices() (*voltha.LogicalDevices, error) {
-	log.Debug("ListAllLogicalDevices")
-	result := &voltha.LogicalDevices{}
-	if logicalDevices, err := ldMgr.clusterDataProxy.List(context.Background(), "/logical_devices", 0, false,
-		""); err != nil {
-		log.Errorw("failed-to-list-devices", log.Fields{"error": err})
-		return nil, err
-	} else if logicalDevices != nil {
-		for _, logicalDevice := range logicalDevices.([]interface{}) {
-			result.Items = append(result.Items, logicalDevice.(*voltha.LogicalDevice))
-		}
-	}
-	return result, nil
-}
-
-// load loads a logical device manager in memory
-func (ldMgr *LogicalDeviceManager) load(lDeviceID string) error {
-	log.Debugw("loading-logical-device", log.Fields{"lDeviceID": lDeviceID})
-	// To prevent a race condition, let's hold the logical device agent map lock.  This will prevent a loading and
-	// a create logical device callback from occurring at the same time.
-	if ldAgent, _ := ldMgr.logicalDeviceAgents.Load(lDeviceID); ldAgent == nil {
-		// Logical device not in memory - create a temp logical device Agent and let it load from memory
-		agent := newLogicalDeviceAgent(lDeviceID, "", ldMgr, ldMgr.deviceMgr, ldMgr.clusterDataProxy)
-		if err := agent.start(context.TODO(), true); err != nil {
-			agent.stop(context.TODO())
-			return err
-		}
-		ldMgr.logicalDeviceAgents.Store(agent.logicalDeviceID, agent)
-	}
-	// TODO: load the child device
-	return nil
-}
-
-func (ldMgr *LogicalDeviceManager) getLogicalDeviceID(device *voltha.Device) (*string, error) {
-	// Device can either be a parent or a child device
-	if device.Root {
-		// Parent device.  The ID of a parent device is the logical device ID
-		return &device.ParentId, nil
-	}
-	// Device is child device
-	//	retrieve parent device using child device ID
-	if parentDevice := ldMgr.deviceMgr.getParentDevice(device); parentDevice != nil {
-		return &parentDevice.ParentId, nil
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", device.Id)
-}
-
-func (ldMgr *LogicalDeviceManager) getLogicalPortID(device *voltha.Device) (*voltha.LogicalPortId, error) {
-	// Get the logical device where this device is attached
-	var lDeviceID *string
-	var err error
-	if lDeviceID, err = ldMgr.getLogicalDeviceID(device); err != nil {
-		return nil, err
-	}
-	var lDevice *voltha.LogicalDevice
-	if lDevice, err = ldMgr.getLogicalDevice(*lDeviceID); err != nil {
-		return nil, err
-	}
-	// Go over list of ports
-	for _, port := range lDevice.Ports {
-		if port.DeviceId == device.Id {
-			return &voltha.LogicalPortId{Id: *lDeviceID, PortId: port.Id}, nil
-		}
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", device.Id)
-}
-
-// ListLogicalDevicePorts returns port details for a specific logical device entry
-func (ldMgr *LogicalDeviceManager) ListLogicalDevicePorts(ctx context.Context, id string) (*voltha.LogicalPorts, error) {
-	log.Debugw("ListLogicalDevicePorts", log.Fields{"logicaldeviceid": id})
-	if agent := ldMgr.getLogicalDeviceAgent(id); agent != nil {
-		return agent.ListLogicalDevicePorts()
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", id)
-
-}
-
-// ListLogicalDeviceFlows returns flow details for a specific logical device entry
-func (ldMgr *LogicalDeviceManager) ListLogicalDeviceFlows(ctx context.Context, id string) (*voltha.Flows, error) {
-	log.Debugw("ListLogicalDeviceFlows", log.Fields{"logicaldeviceid": id})
-	if agent := ldMgr.getLogicalDeviceAgent(id); agent != nil {
-		return agent.ListLogicalDeviceFlows()
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", id)
-
-}
-
-// ListLogicalDeviceFlowGroups returns flow group details for a specific logical device entry
-func (ldMgr *LogicalDeviceManager) ListLogicalDeviceFlowGroups(ctx context.Context, id string) (*voltha.FlowGroups, error) {
-	log.Debugw("ListLogicalDeviceFlowGroups", log.Fields{"logicaldeviceid": id})
-	if agent := ldMgr.getLogicalDeviceAgent(id); agent != nil {
-		return agent.ListLogicalDeviceFlowGroups()
-	}
-	return nil, status.Errorf(codes.NotFound, "%s", id)
-
-}
-
-func (ldMgr *LogicalDeviceManager) getLogicalPort(lPortID *voltha.LogicalPortId) (*voltha.LogicalPort, error) {
-	// Get the logical device where this device is attached
-	var err error
-	var lDevice *voltha.LogicalDevice
-	if lDevice, err = ldMgr.getLogicalDevice(lPortID.Id); err != nil {
-		return nil, err
-	}
-	// Go over list of ports
-	for _, port := range lDevice.Ports {
-		if port.Id == lPortID.PortId {
-			return port, nil
-		}
-	}
-	return nil, status.Errorf(codes.NotFound, "%s-%s", lPortID.Id, lPortID.PortId)
-}
diff --git a/ro_core/core/logical_device_manager_test.go b/ro_core/core/logical_device_manager_test.go
deleted file mode 100644
index 7e91d37..0000000
--- a/ro_core/core/logical_device_manager_test.go
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package core
-
-import (
-	"context"
-	"reflect"
-	"testing"
-
-	"github.com/opencord/voltha-go/db/model"
-	"github.com/opencord/voltha-go/ro_core/config"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-protos/v3/go/openflow_13"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-	"github.com/stretchr/testify/assert"
-)
-
-func MakeTestNewCoreConfig() *Core {
-	var core Core
-	core.instanceID = "ro_core"
-	var err error
-	core.config = config.NewROCoreFlags()
-	core.clusterDataRoot = model.NewRoot(&voltha.Voltha{}, nil)
-	core.clusterDataProxy, err = core.clusterDataRoot.CreateProxy(context.Background(), "/", false)
-	if err != nil {
-		log.With(log.Fields{"error": err}).Fatal("Cannot create cluster data proxy")
-	}
-	core.genericMgr = newModelProxyManager(core.clusterDataProxy)
-	core.deviceMgr = newDeviceManager(core.clusterDataProxy, core.instanceID)
-
-	return &core
-}
-
-func TestNewLogicalDeviceManager(t *testing.T) {
-	core := MakeTestNewCoreConfig()
-
-	logicalDevMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, logicalDevMgr)
-}
-
-func TestAddLogicalDeviceAgentToMap(t *testing.T) {
-	core := MakeTestNewCoreConfig()
-	ldMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldMgr)
-
-	// Before ADD
-	ldAgentNil := ldMgr.getLogicalDeviceAgent("id")
-	assert.Nil(t, ldAgentNil)
-
-	/*** Case: addLogicalDeviceAgentToMap() is Success ***/
-	ldAgent := newLogicalDeviceAgent("id", "", ldMgr, core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldAgent)
-	ldMgr.addLogicalDeviceAgentToMap(ldAgent)
-
-	// Verify ADD is successful
-	ldAgentNotNil := ldMgr.getLogicalDeviceAgent("id")
-	assert.NotNil(t, ldAgentNotNil)
-	assert.Equal(t, "id", ldAgentNotNil.logicalDeviceID)
-}
-
-func TestGetLogicalDeviceAgent(t *testing.T) {
-	core := MakeTestNewCoreConfig()
-	ldMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldMgr)
-
-	/*** Case: getLogicalDeviceAgent() is NIL ***/
-	ldAgentNil := ldMgr.getLogicalDeviceAgent("id")
-	assert.Nil(t, ldAgentNil)
-
-	/*** Case: getLogicalDeviceAgent() is Success ***/
-	ldAgent := newLogicalDeviceAgent("id", "", ldMgr, core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldAgent)
-	ldMgr.addLogicalDeviceAgentToMap(ldAgent)
-	ldAgentNotNil := ldMgr.getLogicalDeviceAgent("id")
-	assert.NotNil(t, ldAgentNotNil)
-	assert.Equal(t, "id", ldAgentNotNil.logicalDeviceID)
-}
-
-func TestDeleteLogicalDeviceAgent(t *testing.T) {
-	core := MakeTestNewCoreConfig()
-	ldMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldMgr)
-
-	/*** Case: deleteLogicalDeviceAgent() with Invalid Value ***/
-	ldAgentNilChk := ldMgr.getLogicalDeviceAgent("invalid_id")
-	assert.Nil(t, ldAgentNilChk)
-	ldMgr.deleteLogicalDeviceAgent("invalid_id")
-
-	/*** Case: deleteLogicalDeviceAgent() is Success ***/
-	// Initialize and Add Logical Device Agent
-	ldAgent := newLogicalDeviceAgent("id", "", ldMgr, core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldAgent)
-	ldMgr.addLogicalDeviceAgentToMap(ldAgent)
-
-	// Verify ADD is successful
-	ldAgentNotNil := ldMgr.getLogicalDeviceAgent("id")
-	assert.NotNil(t, ldAgentNotNil)
-	assert.Equal(t, "id", ldAgentNotNil.logicalDeviceID)
-
-	// Method under Test
-	ldMgr.deleteLogicalDeviceAgent("id")
-
-	// Verify DEL is successful
-	ldAgentNil := ldMgr.getLogicalDeviceAgent("id")
-	assert.Nil(t, ldAgentNil)
-}
-
-func TestLdMgrGetLogicalDevice(t *testing.T) {
-	wantResult := &voltha.LogicalDevice{}
-
-	core := MakeTestNewCoreConfig()
-	ldMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldMgr)
-
-	/*** Case: getLogicalDevice() is NIL ***/
-	logicalDevNil, errNotNil := ldMgr.getLogicalDevice("id")
-	assert.Nil(t, logicalDevNil)
-	assert.NotNil(t, errNotNil)
-
-	/*** Case: getLogicalDevice() is Success ***/
-	// Add Data
-	added, err := core.clusterDataProxy.Add(
-		context.Background(),
-		"/logical_devices",
-		&voltha.LogicalDevice{
-			Id: "id",
-		},
-		"")
-	if err != nil {
-		log.Errorw("failed-to-add-logical-device", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	}
-	if added == nil {
-		t.Error("Failed to add logical device")
-	}
-	ldAgent := newLogicalDeviceAgent("id", "device_id", ldMgr, core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldAgent)
-	ldMgr.addLogicalDeviceAgentToMap(ldAgent)
-
-	// Verify Add is successful
-	ldAgentNotNil := ldMgr.getLogicalDeviceAgent("id")
-	assert.NotNil(t, ldAgentNotNil)
-	assert.Equal(t, "id", ldAgentNotNil.logicalDeviceID)
-
-	// Verify getLogicalDevice() is NOT NIL
-	logicalDevNotNil, errNil := ldMgr.getLogicalDevice("id")
-	assert.NotNil(t, logicalDevNotNil)
-	assert.Nil(t, errNil)
-	if reflect.TypeOf(logicalDevNotNil) != reflect.TypeOf(wantResult) {
-		t.Errorf("GetLogicalDevice() = %v, want %v", logicalDevNotNil, wantResult)
-	}
-	assert.Equal(t, "id", logicalDevNotNil.Id)
-}
-
-func TestListLogicalDevices(t *testing.T) {
-	wantResult := &voltha.LogicalDevices{}
-
-	core := MakeTestNewCoreConfig()
-	ldMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldMgr)
-
-	/*** Case: listLogicalDevices() is Empty ***/
-	result, error := ldMgr.listLogicalDevices()
-	assert.NotNil(t, result)
-	assert.Nil(t, error)
-	if reflect.TypeOf(result) != reflect.TypeOf(wantResult) {
-		t.Errorf("ListLogicalDevices() = %v, want %v", result, wantResult)
-	}
-	assert.Empty(t, result)
-}
-
-func TestLoad(t *testing.T) {
-	core := MakeTestNewCoreConfig()
-	ldMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldMgr)
-
-	/*** Case: Error Scenario ***/
-	error := ldMgr.load("id")
-	assert.NotNil(t, error)
-}
-
-func TestGetLogicalDeviceId(t *testing.T) {
-	core := MakeTestNewCoreConfig()
-	ldMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldMgr)
-
-	/*** Case: Logical Device Id Found ***/
-	result0, error0 := ldMgr.getLogicalDeviceID(&voltha.Device{Id: "id", Root: true, ParentId: "parent_id"})
-	assert.NotNil(t, result0)
-	assert.Nil(t, error0)
-
-	/*** Case: Logical Device Id Not Found ***/
-	result1, error1 := ldMgr.getLogicalDeviceID(&voltha.Device{Id: "id", ParentId: "parent_id"})
-	assert.Nil(t, result1)
-	assert.NotNil(t, error1)
-}
-
-func TestGetLogicalPortId(t *testing.T) {
-	wantResult := &voltha.LogicalPortId{}
-
-	core := MakeTestNewCoreConfig()
-	ldMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldMgr)
-
-	/*** Case: Logical Port Id Not Found: getLogicalDeviceId() Error ***/
-	result0, error0 := ldMgr.getLogicalPortID(&voltha.Device{Id: "id", ParentId: "parent_id"})
-	assert.Nil(t, result0)
-	assert.NotNil(t, error0)
-
-	/*** Case: Logical Port Id Not Found: getLogicalDevice() Error ***/
-	result1, error1 := ldMgr.getLogicalPortID(&voltha.Device{Id: "id", Root: true, ParentId: "parent_id"})
-	assert.Nil(t, result1)
-	assert.NotNil(t, error1)
-
-	/*** Case: Logical Port Id Found ***/
-	device := &voltha.Device{Id: "id", Root: true, ParentId: "parent_id"}
-
-	// Add Data
-	added, err := core.clusterDataProxy.Add(
-		context.Background(),
-		"/logical_devices",
-		&voltha.LogicalDevice{
-			Id: "parent_id",
-			Ports: []*voltha.LogicalPort{
-				{
-					Id:       "123",
-					DeviceId: "id",
-				},
-			},
-		},
-		"")
-	if err != nil {
-		log.Errorw("failed-to-add-logical-device", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	}
-	if added == nil {
-		t.Error("Failed to add logical device")
-	}
-	ldAgent := newLogicalDeviceAgent("parent_id", "device_id", ldMgr, core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldAgent)
-	ldMgr.addLogicalDeviceAgentToMap(ldAgent)
-
-	// Verify Add is successful
-	ldAgentNotNil := ldMgr.getLogicalDeviceAgent("parent_id")
-	assert.NotNil(t, ldAgentNotNil)
-	assert.Equal(t, "parent_id", ldAgentNotNil.logicalDeviceID)
-
-	// Verify getLogicalPortId() is Success
-	result2, error2 := ldMgr.getLogicalPortID(device)
-	assert.NotNil(t, result2)
-	assert.Nil(t, error2)
-	if reflect.TypeOf(result2) != reflect.TypeOf(wantResult) {
-		t.Errorf("GetLogicalPortId() = %v, want %v", result2, wantResult)
-	}
-	assert.Equal(t, "parent_id", result2.Id)
-}
-
-func TestListLogicalDevicePorts(t *testing.T) {
-	core := MakeTestNewCoreConfig()
-	ldMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldMgr)
-
-	/*** Case: Logical Device Ports Not Found ***/
-	result0, error0 := ldMgr.ListLogicalDevicePorts(context.Background(), "id")
-	assert.Nil(t, result0)
-	assert.NotNil(t, error0)
-
-	/*** Case: Logical Device Ports Found ***/
-	wantResult := &voltha.LogicalPorts{
-		Items: []*voltha.LogicalPort{
-			{
-				Id: "123",
-			},
-		},
-	}
-
-	// Add Data
-	added, err := core.clusterDataProxy.Add(
-		context.Background(),
-		"/logical_devices",
-		&voltha.LogicalDevice{
-			Id: "id",
-			Ports: []*voltha.LogicalPort{
-				{
-					Id: "123",
-				},
-			},
-		},
-		"")
-	if err != nil {
-		log.Errorw("failed-to-add-logical-device", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	}
-	if added == nil {
-		t.Error("Failed to add logical device")
-	}
-	ldAgent := newLogicalDeviceAgent("id", "", ldMgr, core.deviceMgr, core.clusterDataProxy)
-	ldMgr.addLogicalDeviceAgentToMap(ldAgent)
-
-	// Verify Add is successful
-	ldAgentNotNil := ldMgr.getLogicalDeviceAgent("id")
-	assert.NotNil(t, ldAgentNotNil)
-	assert.Equal(t, "id", ldAgentNotNil.logicalDeviceID)
-
-	// Verify ListLogicalDevicePorts() is Success
-	result1, error1 := ldMgr.ListLogicalDevicePorts(context.Background(), "id")
-	assert.NotNil(t, result1)
-	assert.Nil(t, error1)
-	if reflect.TypeOf(result1) != reflect.TypeOf(wantResult) {
-		t.Errorf("ListLogicalDevicePorts() = %v, want %v", result1, wantResult)
-	}
-	assert.Equal(t, wantResult, result1)
-}
-
-func TestListLogicalDeviceFlows(t *testing.T) {
-	core := MakeTestNewCoreConfig()
-	ldMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldMgr)
-
-	/*** Case: Logical Device Flows Not Found ***/
-	result0, error0 := ldMgr.ListLogicalDeviceFlows(context.Background(), "id")
-	assert.Nil(t, result0)
-	assert.NotNil(t, error0)
-
-	/*** Case: Logical Device Flows Found ***/
-	wantResult := &voltha.Flows{}
-
-	// Add Data
-	added, err := core.clusterDataProxy.Add(
-		context.Background(),
-		"/logical_devices",
-		&voltha.LogicalDevice{
-			Id: "id",
-			Flows: &openflow_13.Flows{
-				Items: []*openflow_13.OfpFlowStats{
-					&openflow_13.OfpFlowStats{
-						Id: 1111,
-					},
-				},
-			},
-		},
-		"")
-	if err != nil {
-		log.Errorw("failed-to-add-logical-device", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	}
-	if added == nil {
-		t.Error("Failed to add logical device")
-	}
-	ldAgent := newLogicalDeviceAgent("id", "", ldMgr, core.deviceMgr, core.clusterDataProxy)
-	ldMgr.addLogicalDeviceAgentToMap(ldAgent)
-
-	// Verify Add is successful
-	ldAgentNotNil := ldMgr.getLogicalDeviceAgent("id")
-	assert.NotNil(t, ldAgentNotNil)
-	assert.Equal(t, "id", ldAgentNotNil.logicalDeviceID)
-
-	// Verify ListLogicalDeviceFlows() is Success
-	result1, error1 := ldMgr.ListLogicalDeviceFlows(context.Background(), "id")
-	assert.NotNil(t, result1)
-	assert.Nil(t, error1)
-	if reflect.TypeOf(result1) != reflect.TypeOf(wantResult) {
-		t.Errorf("ListLogicalDeviceFlows() = %v, want %v", result1, wantResult)
-	}
-	assert.NotEmpty(t, result1)
-}
-
-func TestListLogicalDeviceFlowGroups(t *testing.T) {
-	core := MakeTestNewCoreConfig()
-	ldMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldMgr)
-
-	/*** Case: Logical Device Flow Groups Not Found ***/
-	result0, error0 := ldMgr.ListLogicalDeviceFlowGroups(context.Background(), "id")
-	assert.Nil(t, result0)
-	assert.NotNil(t, error0)
-
-	/*** Case: Logical Device Flow Groups Found ***/
-	wantResult := &voltha.FlowGroups{}
-
-	// Add Data
-	added, err := core.clusterDataProxy.Add(
-		context.Background(),
-		"/logical_devices",
-		&voltha.LogicalDevice{
-			Id: "id",
-			FlowGroups: &openflow_13.FlowGroups{
-				Items: []*openflow_13.OfpGroupEntry{
-					{
-						Stats: &openflow_13.OfpGroupStats{
-							GroupId: 1,
-						},
-					},
-				},
-			},
-		},
-		"")
-	if err != nil {
-		log.Errorw("failed-to-add-logical-device", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	}
-	if added == nil {
-		t.Error("Failed to add logical device")
-	}
-	ldAgent := newLogicalDeviceAgent("id", "", ldMgr, core.deviceMgr, core.clusterDataProxy)
-	ldMgr.addLogicalDeviceAgentToMap(ldAgent)
-
-	// Verify Add is successful
-	ldAgentNotNil := ldMgr.getLogicalDeviceAgent("id")
-	assert.NotNil(t, ldAgentNotNil)
-	assert.Equal(t, "id", ldAgentNotNil.logicalDeviceID)
-
-	// Verify ListLogicalDeviceFlowGroups() is Success
-	result1, error1 := ldMgr.ListLogicalDeviceFlowGroups(context.Background(), "id")
-	assert.NotNil(t, result1)
-	assert.Nil(t, error1)
-	if reflect.TypeOf(result1) != reflect.TypeOf(wantResult) {
-		t.Errorf("ListLogicalDeviceFlowGroups() = %v, want %v", result1, wantResult)
-	}
-	assert.NotEmpty(t, result1)
-}
-
-func TestGetLogicalPort(t *testing.T) {
-	core := MakeTestNewCoreConfig()
-	ldMgr := newLogicalDeviceManager(core.deviceMgr, core.clusterDataProxy)
-	assert.NotNil(t, ldMgr)
-
-	/*** Case: Logical Port Not Found: getLogicalDevice() Error ***/
-	result0, error0 := ldMgr.getLogicalPort(&voltha.LogicalPortId{Id: "id", PortId: "123"})
-	assert.Nil(t, result0)
-	assert.NotNil(t, error0)
-
-	/*** Case: Logical Port Found ***/
-	wantResult := &voltha.LogicalPort{Id: "123"}
-
-	// Add Data
-	added, err := core.clusterDataProxy.Add(
-		context.Background(),
-		"/logical_devices",
-		&voltha.LogicalDevice{
-			Id: "id",
-			Ports: []*voltha.LogicalPort{
-				{
-					Id: "123",
-				},
-			},
-		},
-		"")
-	if err != nil {
-		log.Errorw("failed-to-add-logical-device", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	}
-	if added == nil {
-		t.Error("Failed to add logical device")
-	}
-	ldAgent := newLogicalDeviceAgent("id", "", ldMgr, core.deviceMgr, core.clusterDataProxy)
-	ldMgr.addLogicalDeviceAgentToMap(ldAgent)
-
-	// Verify Add is successful
-	ldAgentNotNil := ldMgr.getLogicalDeviceAgent("id")
-	assert.NotNil(t, ldAgentNotNil)
-	assert.Equal(t, "id", ldAgentNotNil.logicalDeviceID)
-
-	// Verify getLogicalPort() is Success
-	result1, error1 := ldMgr.getLogicalPort(&voltha.LogicalPortId{Id: "id", PortId: "123"})
-	assert.NotNil(t, result1)
-	assert.Nil(t, error1)
-	if reflect.TypeOf(result1) != reflect.TypeOf(wantResult) {
-		t.Errorf("getLogicalPort() = %v, want %v", result1, wantResult)
-	}
-	assert.Equal(t, wantResult, result1)
-}
diff --git a/ro_core/core/model_proxy.go b/ro_core/core/model_proxy.go
deleted file mode 100644
index 3775540..0000000
--- a/ro_core/core/model_proxy.go
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package core
-
-import (
-	"context"
-	"strings"
-	"sync"
-
-	"github.com/opencord/voltha-go/db/model"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/status"
-)
-
-// ModelProxy controls requests made to the data model
-type ModelProxy struct {
-	rootProxy *model.Proxy
-	basePath  string
-	mutex     sync.RWMutex
-}
-
-func newModelProxy(basePath string, rootProxy *model.Proxy) *ModelProxy {
-	ga := &ModelProxy{}
-	ga.rootProxy = rootProxy
-
-	if strings.HasPrefix(basePath, "/") {
-		ga.basePath = basePath
-	} else {
-		ga.basePath = "/" + basePath
-	}
-
-	return ga
-}
-
-// Get retrieves information at the provided path
-func (mp *ModelProxy) Get(parts ...string) (interface{}, error) {
-	mp.mutex.Lock()
-	defer mp.mutex.Unlock()
-
-	rawPath := []string{mp.basePath}
-	rawPath = append(rawPath, parts...)
-	path := strings.Join(rawPath, "/")
-
-	log.Debugw("get-data", log.Fields{"path": path})
-
-	if data, err := mp.rootProxy.Get(context.Background(), path, 1, false, ""); err != nil {
-		log.Errorw("failed-to-retrieve-data-from-model-proxy", log.Fields{"error": err})
-		return nil, err
-	} else if data != nil {
-		return data, nil
-	}
-	return nil, status.Errorf(codes.NotFound, "data-path: %s", path)
-}
diff --git a/ro_core/core/model_proxy_manager.go b/ro_core/core/model_proxy_manager.go
deleted file mode 100644
index 42d0ad6..0000000
--- a/ro_core/core/model_proxy_manager.go
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package core
-
-import (
-	"context"
-	"encoding/json"
-
-	"github.com/opencord/voltha-go/db/model"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-lib-go/v3/pkg/version"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/status"
-)
-
-// DataModelType - Enumerated type to keep track of miscellaneous data path agents
-type DataModelType int
-
-// Enumerated list of data path agents
-const (
-	Adapters DataModelType = 1 + iota
-	EventFilters
-	CoreInstances
-	DeviceTypes
-	DeviceGroups
-	Voltha
-)
-
-// SentinelAdapterID is used to watch adapters in kv
-const SentinelAdapterID = "adapter_sentinel"
-
-// String equivalent for data path agents
-var commonTypes = []string{
-	"Adapters",
-	"EventFilters",
-	"CoreInstances",
-	"DeviceTypes",
-	"DeviceGroups",
-	"Voltha",
-}
-
-// String converts the enumerated data path agent value to its string equivalent
-func (t DataModelType) String() string {
-	return commonTypes[t-1]
-}
-
-// MultipleValuesMsg represents multiple values message
-const MultipleValuesMsg = "Expected a single value for KV query for an instance (%s) of type '%s', but received multiple values"
-
-// ModelProxyManager controls requests made to the miscellaneous data path agents
-type ModelProxyManager struct {
-	modelProxy       map[string]*ModelProxy
-	clusterDataProxy *model.Proxy
-}
-
-func newModelProxyManager(cdProxy *model.Proxy) *ModelProxyManager {
-	var mgr ModelProxyManager
-	mgr.modelProxy = make(map[string]*ModelProxy)
-	mgr.clusterDataProxy = cdProxy
-	return &mgr
-}
-
-// GetVoltha - GetDeviceType returns the device type associated to the provided id
-func (mpMgr *ModelProxyManager) GetVoltha(ctx context.Context) (*voltha.Voltha, error) {
-	log.Debug("GetVoltha")
-
-	/*
-	 * For now, encode all the version information into a JSON object and
-	 * pass that back as "version" so the client can get all the
-	 * information associated with the version. Long term the API should
-	 * better accomidate this, but for now this will work.
-	 */
-	data, err := json.Marshal(&version.VersionInfo)
-	info := version.VersionInfo.Version
-	if err != nil {
-		log.Warnf("Unable to encode version information as JSON: %s", err.Error())
-	} else {
-		info = string(data)
-	}
-
-	return &voltha.Voltha{
-		Version: info,
-	}, nil
-}
-
-// ListCoreInstances returns all the core instances known to the system
-func (mpMgr *ModelProxyManager) ListCoreInstances(ctx context.Context) (*voltha.CoreInstances, error) {
-	log.Debug("ListCoreInstances")
-
-	// TODO: Need to retrieve the list of registered cores
-
-	return &voltha.CoreInstances{}, status.Errorf(codes.NotFound, "no-core-instances")
-}
-
-// GetCoreInstance returns the core instance associated to the provided id
-func (mpMgr *ModelProxyManager) GetCoreInstance(ctx context.Context, id string) (*voltha.CoreInstance, error) {
-	log.Debugw("GetCoreInstance", log.Fields{"id": id})
-
-	// TODO: Need to retrieve the list of registered cores
-
-	return &voltha.CoreInstance{}, status.Errorf(codes.NotFound, "core-instance-%s", id)
-}
-
-// ListAdapters returns all the device types known to the system
-func (mpMgr *ModelProxyManager) ListAdapters(ctx context.Context) (*voltha.Adapters, error) {
-	log.Debug("ListAdapters")
-
-	var agent *ModelProxy
-	var exists bool
-	var adapter *voltha.Adapter
-
-	if agent, exists = mpMgr.modelProxy[Adapters.String()]; !exists {
-		agent = newModelProxy("adapters", mpMgr.clusterDataProxy)
-		mpMgr.modelProxy[Adapters.String()] = agent
-	}
-
-	adapters := &voltha.Adapters{}
-	if items, err := agent.Get(); err != nil {
-		return nil, status.Errorf(codes.Internal, err.Error())
-	} else if items != nil {
-		list, ok := items.([]interface{})
-		if !ok {
-			list = []interface{}{items}
-		}
-		for _, item := range list {
-			adapter = item.(*voltha.Adapter)
-			if adapter.Id != SentinelAdapterID { // don't report the sentinel
-				adapters.Items = append(adapters.Items, adapter)
-			}
-		}
-		log.Debugw("retrieved-adapters", log.Fields{"adapters": adapters})
-		return adapters, nil
-	}
-
-	return adapters, status.Errorf(codes.NotFound, "no-adapters")
-}
-
-// ListDeviceTypes returns all the device types known to the system
-func (mpMgr *ModelProxyManager) ListDeviceTypes(ctx context.Context) (*voltha.DeviceTypes, error) {
-	log.Debug("ListDeviceTypes")
-
-	var agent *ModelProxy
-	var exists bool
-
-	if agent, exists = mpMgr.modelProxy[DeviceTypes.String()]; !exists {
-		agent = newModelProxy("device_types", mpMgr.clusterDataProxy)
-		mpMgr.modelProxy[DeviceTypes.String()] = agent
-	}
-
-	deviceTypes := &voltha.DeviceTypes{}
-	if items, err := agent.Get(); err != nil {
-		return nil, status.Errorf(codes.Internal, err.Error())
-	} else if items != nil {
-		list, ok := items.([]interface{})
-		if !ok {
-			list = []interface{}{items}
-		}
-		for _, item := range list {
-			deviceTypes.Items = append(deviceTypes.Items, item.(*voltha.DeviceType))
-		}
-		return deviceTypes, nil
-	}
-
-	return deviceTypes, status.Errorf(codes.NotFound, "no-device-types")
-}
-
-// GetDeviceType returns the device type associated to the provided id
-func (mpMgr *ModelProxyManager) GetDeviceType(ctx context.Context, id string) (*voltha.DeviceType, error) {
-	log.Debugw("GetDeviceType", log.Fields{"id": id})
-
-	var agent *ModelProxy
-	var exists bool
-
-	if agent, exists = mpMgr.modelProxy[DeviceTypes.String()]; !exists {
-		agent = newModelProxy("device_types", mpMgr.clusterDataProxy)
-		mpMgr.modelProxy[DeviceTypes.String()] = agent
-	}
-
-	if deviceType, err := agent.Get(id); err != nil {
-		return nil, status.Errorf(codes.Internal, err.Error())
-	} else if deviceType != nil {
-		_, ok := deviceType.(*voltha.DeviceType)
-		if !ok {
-			return nil, status.Errorf(codes.Internal, MultipleValuesMsg,
-				id, DeviceTypes.String())
-		}
-		return deviceType.(*voltha.DeviceType), nil
-	}
-
-	return &voltha.DeviceType{}, status.Errorf(codes.NotFound, "device-type-%s", id)
-}
-
-// ListDeviceGroups returns all the device groups known to the system
-func (mpMgr *ModelProxyManager) ListDeviceGroups(ctx context.Context) (*voltha.DeviceGroups, error) {
-	log.Debug("ListDeviceGroups")
-
-	var agent *ModelProxy
-	var exists bool
-
-	if agent, exists = mpMgr.modelProxy[DeviceGroups.String()]; !exists {
-		agent = newModelProxy("device_groups", mpMgr.clusterDataProxy)
-		mpMgr.modelProxy[DeviceGroups.String()] = agent
-	}
-
-	deviceGroups := &voltha.DeviceGroups{}
-	if items, err := agent.Get(); err != nil {
-		return nil, status.Errorf(codes.Internal, err.Error())
-	} else if items != nil {
-		list, ok := items.([]interface{})
-		if !ok {
-			list = []interface{}{items}
-		}
-		for _, item := range list {
-			deviceGroups.Items = append(deviceGroups.Items, item.(*voltha.DeviceGroup))
-		}
-		return deviceGroups, nil
-	}
-
-	return deviceGroups, status.Errorf(codes.NotFound, "no-device-groups")
-}
-
-// GetDeviceGroup returns the device group associated to the provided id
-func (mpMgr *ModelProxyManager) GetDeviceGroup(ctx context.Context, id string) (*voltha.DeviceGroup, error) {
-	log.Debugw("GetDeviceGroup", log.Fields{"id": id})
-
-	var agent *ModelProxy
-	var exists bool
-
-	if agent, exists = mpMgr.modelProxy[DeviceGroups.String()]; !exists {
-		agent = newModelProxy("device_groups", mpMgr.clusterDataProxy)
-		mpMgr.modelProxy[DeviceGroups.String()] = agent
-	}
-
-	if deviceGroup, err := agent.Get(id); err != nil {
-		return nil, status.Errorf(codes.Internal, err.Error())
-	} else if deviceGroup != nil {
-		_, ok := deviceGroup.(*voltha.DeviceGroup)
-		if !ok {
-			return nil, status.Errorf(codes.Internal, MultipleValuesMsg,
-				id, DeviceGroups.String())
-		}
-		return deviceGroup.(*voltha.DeviceGroup), nil
-	}
-
-	return &voltha.DeviceGroup{}, status.Errorf(codes.NotFound, "device-group-%s", id)
-}
-
-// ListEventFilters returns all the event filters known to the system
-func (mpMgr *ModelProxyManager) ListEventFilters(ctx context.Context) (*voltha.EventFilters, error) {
-	log.Debug("ListEventFilters")
-
-	var agent *ModelProxy
-	var exists bool
-
-	if agent, exists = mpMgr.modelProxy[EventFilters.String()]; !exists {
-		agent = newModelProxy("event_filters", mpMgr.clusterDataProxy)
-		mpMgr.modelProxy[EventFilters.String()] = agent
-	}
-
-	eventFilters := &voltha.EventFilters{}
-	if items, err := agent.Get(); err != nil {
-		return nil, status.Errorf(codes.Internal, err.Error())
-	} else if items != nil {
-		list, ok := items.([]interface{})
-		if !ok {
-			list = []interface{}{items}
-		}
-		for _, item := range list {
-			eventFilters.Filters = append(eventFilters.Filters, item.(*voltha.EventFilter))
-		}
-		return eventFilters, nil
-	}
-
-	return eventFilters, status.Errorf(codes.NotFound, "no-event-filters")
-}
-
-// GetEventFilter returns the event filter associated to the provided device id
-func (mpMgr *ModelProxyManager) GetEventFilter(ctx context.Context, id string) (*voltha.EventFilters, error) {
-	log.Debugw("GetEventFilter", log.Fields{"id": id})
-
-	var agent *ModelProxy
-	var exists bool
-
-	if agent, exists = mpMgr.modelProxy[EventFilters.String()]; !exists {
-		agent = newModelProxy("event_filters", mpMgr.clusterDataProxy)
-		mpMgr.modelProxy[EventFilters.String()] = agent
-	}
-
-	if _, err := agent.Get(id); err != nil {
-		return nil, status.Errorf(codes.Internal, err.Error())
-	}
-	//TODO: VOL-2305 Code to get filters for a particular device once Event filtering mechanism is implemented
-
-	return &voltha.EventFilters{}, status.Errorf(codes.NotFound, "event-filter-%s", id)
-}
diff --git a/ro_core/core/model_proxy_manager_test.go b/ro_core/core/model_proxy_manager_test.go
deleted file mode 100644
index b23781b..0000000
--- a/ro_core/core/model_proxy_manager_test.go
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package core
-
-import (
-	"context"
-	"reflect"
-	"testing"
-
-	"github.com/opencord/voltha-go/db/model"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-	"github.com/stretchr/testify/assert"
-)
-
-func makeModelProxyManagerObj() *ModelProxyManager {
-	cdRoot := model.NewRoot(&voltha.Voltha{}, nil)
-	cdProxy, err := cdRoot.CreateProxy(context.Background(), "/", false)
-	if err != nil {
-		log.With(log.Fields{"error": err}).Fatal("Failed to create model proxy manager")
-	}
-	mpMgr := newModelProxyManager(cdProxy)
-	return mpMgr
-}
-
-func TestNewModelProxyManager(t *testing.T) {
-	type args struct {
-		clusterDataProxy *model.Proxy
-	}
-	tests := []struct {
-		name string
-		args args
-		want *ModelProxyManager
-	}{
-		{"NewModelProxyManager", args{&model.Proxy{}}, &ModelProxyManager{}},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			if got := newModelProxyManager(tt.args.clusterDataProxy); reflect.TypeOf(got) != reflect.TypeOf(tt.want) {
-				t.Errorf("newModelProxy() = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
-
-func TestGetVoltha(t *testing.T) {
-	wantResult := &voltha.Voltha{}
-	mpMgr := makeModelProxyManagerObj()
-	result, err := mpMgr.GetVoltha(context.Background())
-	if reflect.TypeOf(result) != reflect.TypeOf(wantResult) {
-		t.Errorf("GetVoltha() = %v, want %v", result, wantResult)
-	}
-	assert.NotNil(t, result)
-	assert.Nil(t, err)
-}
-
-func TestListCoreInstances(t *testing.T) {
-	wantResult := &voltha.CoreInstances{}
-	mpMgr := makeModelProxyManagerObj()
-	result, err := mpMgr.ListCoreInstances(context.Background())
-	if reflect.TypeOf(result) != reflect.TypeOf(wantResult) {
-		t.Errorf("ListCoreInstances() = %v, want %v", result, wantResult)
-	}
-	assert.Nil(t, result.Items)
-	assert.NotNil(t, err)
-}
-
-func TestGetCoreInstance(t *testing.T) {
-	wantResult := &voltha.CoreInstance{}
-	mpMgr := makeModelProxyManagerObj()
-	result, err := mpMgr.GetCoreInstance(context.Background(), "id")
-	if reflect.TypeOf(result) != reflect.TypeOf(wantResult) {
-		t.Errorf("GetCoreInstance() = %v, want %v", result, wantResult)
-	}
-	assert.NotNil(t, err)
-}
-
-func TestListAdapters(t *testing.T) {
-	wantResult := &voltha.Adapters{
-		Items: []*voltha.Adapter{
-			{
-				Id: "id",
-			},
-		},
-	}
-
-	mpMgr := makeModelProxyManagerObj()
-
-	// Case 1: Not Found
-	result0, err0 := mpMgr.ListAdapters(context.Background())
-	if reflect.TypeOf(result0) != reflect.TypeOf(wantResult) {
-		t.Errorf("ListAdapters() = %v, want %v", result0, wantResult)
-	}
-	assert.Nil(t, result0.Items)
-	assert.Nil(t, err0)
-
-	// Case 2: Found
-	added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/adapters", &voltha.Adapter{Id: "id"}, "")
-	if err != nil {
-		log.Errorw("failed-to-add-adapter-to-cluster-proxy", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	}
-	if added == nil {
-		t.Error("Failed to add adapter")
-	}
-	result1, err1 := mpMgr.ListAdapters(context.Background())
-	if reflect.TypeOf(result1) != reflect.TypeOf(wantResult) {
-		t.Errorf("ListAdapters() = %v, want %v", result1, wantResult)
-	}
-	assert.NotNil(t, result1.Items)
-	assert.Nil(t, err1)
-	assert.Equal(t, wantResult, result1)
-}
-
-func TestListDeviceTypes(t *testing.T) {
-	wantResult := &voltha.DeviceTypes{
-		Items: []*voltha.DeviceType{
-			{
-				Id: "id",
-			},
-		},
-	}
-
-	mpMgr := makeModelProxyManagerObj()
-
-	// Case 1: Not Found
-	result0, err0 := mpMgr.ListDeviceTypes(context.Background())
-	if reflect.TypeOf(result0) != reflect.TypeOf(wantResult) {
-		t.Errorf("ListDeviceTypes() = %v, want %v", result0, wantResult)
-	}
-	assert.Nil(t, result0.Items)
-	assert.Nil(t, err0)
-
-	// Case 2: Found
-	added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/device_types", &voltha.DeviceType{Id: "id"}, "")
-	if err != nil {
-		log.Errorw("failed-to-add-device-types-to-cluster-proxy", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	}
-	if added == nil {
-		t.Error("Failed to add device type")
-	}
-	result1, err1 := mpMgr.ListDeviceTypes(context.Background())
-	if reflect.TypeOf(result1) != reflect.TypeOf(wantResult) {
-		t.Errorf("ListDeviceTypes() = %v, want %v", result1, wantResult)
-	}
-	assert.NotNil(t, result1.Items)
-	assert.Nil(t, err1)
-	assert.Equal(t, wantResult, result1)
-}
-
-func TestGetDeviceType(t *testing.T) {
-	wantResult := &voltha.DeviceType{}
-	mpMgr := makeModelProxyManagerObj()
-
-	// Case 1: Not Found
-	result0, err0 := mpMgr.GetDeviceType(context.Background(), "id")
-	if reflect.TypeOf(result0) != reflect.TypeOf(wantResult) {
-		t.Errorf("GetDeviceType() = %v, want %v", result0, wantResult)
-	}
-	assert.Nil(t, result0)
-	assert.NotNil(t, err0)
-
-	// Case 2: Found
-	added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/device_types", &voltha.DeviceType{Id: "id"}, "")
-	if err != nil {
-		log.Errorw("failed-to-add-adapter-to-device-types-proxy", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	} else if added == nil {
-		t.Error("Failed to add device type")
-	}
-	result1, err1 := mpMgr.GetDeviceType(context.Background(), "id")
-	if reflect.TypeOf(result1) != reflect.TypeOf(wantResult) {
-		t.Errorf("GetDeviceType() = %v, want %v", result1, wantResult)
-	}
-	assert.NotNil(t, result1)
-	assert.Nil(t, err1)
-	assert.Equal(t, "id", result1.Id)
-}
-
-func TestListDeviceGroups(t *testing.T) {
-	wantResult := &voltha.DeviceGroups{
-		Items: []*voltha.DeviceGroup{
-			{
-				Id: "id",
-			},
-		},
-	}
-
-	mpMgr := makeModelProxyManagerObj()
-
-	// Case 1: Not Found
-	result0, err0 := mpMgr.ListDeviceGroups(context.Background())
-	if reflect.TypeOf(result0) != reflect.TypeOf(wantResult) {
-		t.Errorf("ListDeviceGroups() = %v, want %v", result0, wantResult)
-	}
-	assert.Nil(t, result0.Items)
-	assert.Nil(t, err0)
-
-	// Case 2: Found
-	added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/device_groups", &voltha.DeviceGroup{Id: "id"}, "")
-	if err != nil {
-		log.Errorw("failed-to-add-device-groups-to-cluster-proxy", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	}
-	if added == nil {
-		t.Error("Failed to add device group")
-	}
-	result1, err1 := mpMgr.ListDeviceGroups(context.Background())
-	if reflect.TypeOf(result1) != reflect.TypeOf(wantResult) {
-		t.Errorf("ListDeviceGroups() = %v, want %v", result1, wantResult)
-	}
-	assert.NotNil(t, result1.Items)
-	assert.Nil(t, err1)
-	assert.Equal(t, wantResult, result1)
-}
-
-func TestGetDeviceGroup(t *testing.T) {
-	wantResult := &voltha.DeviceGroup{}
-	mpMgr := makeModelProxyManagerObj()
-
-	// Case 1: Not Found
-	result0, err0 := mpMgr.GetDeviceGroup(context.Background(), "id")
-	if reflect.TypeOf(result0) != reflect.TypeOf(wantResult) {
-		t.Errorf("GetDeviceGroup() = %v, want %v", result0, wantResult)
-	}
-	assert.Nil(t, result0)
-	assert.NotNil(t, err0)
-
-	// Case 2: Found
-	added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/device_groups", &voltha.DeviceGroup{Id: "id"}, "")
-	if err != nil {
-		log.Errorw("failed-to-add-device-groups-to-cluster-proxy", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	}
-	if added == nil {
-		t.Error("Failed to add device group")
-	}
-	result1, err1 := mpMgr.GetDeviceGroup(context.Background(), "id")
-	if reflect.TypeOf(result1) != reflect.TypeOf(wantResult) {
-		t.Errorf("GetDeviceGroup() = %v, want %v", result1, wantResult)
-	}
-	assert.NotNil(t, result1)
-	assert.Nil(t, err1)
-	assert.Equal(t, "id", result1.Id)
-}
-
-func TestListEventFilters(t *testing.T) {
-	wantResult := &voltha.EventFilters{
-		Filters: []*voltha.EventFilter{
-			{
-				Id: "id",
-			},
-		},
-	}
-
-	mpMgr := makeModelProxyManagerObj()
-
-	// Case 1: Not Found
-	result0, err0 := mpMgr.ListEventFilters(context.Background())
-	if reflect.TypeOf(result0) != reflect.TypeOf(wantResult) {
-		t.Errorf("ListEventFilters() = %v, want %v", result0, wantResult)
-	}
-	assert.Nil(t, result0.Filters)
-	assert.Nil(t, err0)
-
-	// Case 2: Found
-	added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/event_filters", &voltha.EventFilter{Id: "id"}, "")
-	if err != nil {
-		log.Errorw("failed-to-add-alarm-filters-to-cluster-proxy", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	}
-	if added == nil {
-		t.Error("Failed to add event filter")
-	}
-	result1, err1 := mpMgr.ListEventFilters(context.Background())
-	if reflect.TypeOf(result1) != reflect.TypeOf(wantResult) {
-		t.Errorf("ListEventFilters() = %v, want %v", result1, wantResult)
-	}
-	assert.NotNil(t, result1.Filters)
-	assert.Nil(t, err1)
-	assert.Equal(t, wantResult, result1)
-}
-
-func TestGetEventFilter(t *testing.T) {
-	wantResult := &voltha.EventFilters{
-		Filters: []*voltha.EventFilter{
-			{
-				Id: "id",
-			},
-		},
-	}
-
-	mpMgr := makeModelProxyManagerObj()
-
-	// Case 1: Not Found
-	result0, _ := mpMgr.GetEventFilter(context.Background(), "id")
-	if reflect.TypeOf(result0) != reflect.TypeOf(wantResult) {
-		t.Errorf("GetEventFilters() = %v, want %v", result0, wantResult)
-	}
-	assert.Nil(t, result0)
-	// Case 2: Found
-	//added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/alarm_filters", &voltha.EventFilter{Id: "id"}, "")
-	added, err := mpMgr.clusterDataProxy.Add(context.Background(), "/event_filters", &voltha.EventFilter{Id: "id"}, "")
-	if err != nil {
-		log.Errorw("failed-to-add-adapter-to-alarm-filter-to-proxy", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	}
-	if added == nil {
-		t.Error("Failed to add event filter")
-	}
-	result1, err1 := mpMgr.ListEventFilters(context.Background())
-	if reflect.TypeOf(result1) != reflect.TypeOf(wantResult) {
-		t.Errorf("GetEventFilters() = %v, want %v", result1, wantResult)
-	}
-	assert.NotNil(t, result1)
-	assert.Nil(t, err1)
-	assert.Equal(t, wantResult, result1)
-
-}
diff --git a/ro_core/core/model_proxy_test.go b/ro_core/core/model_proxy_test.go
deleted file mode 100644
index 41f814c..0000000
--- a/ro_core/core/model_proxy_test.go
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package core
-
-import (
-	"context"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/stretchr/testify/assert"
-	"reflect"
-	"testing"
-
-	"github.com/opencord/voltha-go/db/model"
-	"github.com/opencord/voltha-protos/v3/go/voltha"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/status"
-)
-
-type fields struct {
-	rootProxy *model.Proxy
-	basePath  string
-}
-
-func getModelProxyPathNotFound(t *testing.T) *fields {
-	var modelProxy fields
-
-	TestProxyRoot := model.NewRoot(&voltha.Voltha{}, nil)
-	TestProxyRootProxy, err := TestProxyRoot.CreateProxy(context.Background(), "/", false)
-	if err != nil {
-		log.Errorw("failed-to-create-test-proxy", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	}
-	modelProxy.rootProxy = TestProxyRootProxy
-	modelProxy.basePath = "base_path"
-
-	return &modelProxy
-}
-
-func getModelProxyPathFound(t *testing.T) *fields {
-	var modelProxy fields
-
-	TestProxyRoot := model.NewRoot(&voltha.Voltha{}, nil)
-	TestProxyRootProxy, err := TestProxyRoot.CreateProxy(context.Background(), "/", false)
-	if err != nil {
-		log.Errorw("failed-to-create-test-proxy", log.Fields{"error": err})
-		assert.NotNil(t, err)
-	}
-	modelProxy.rootProxy = TestProxyRootProxy
-	modelProxy.basePath = "devices"
-
-	return &modelProxy
-}
-
-func testModelProxyObject(testModelProxy *fields) *ModelProxy {
-	return &ModelProxy{
-		rootProxy: testModelProxy.rootProxy,
-		basePath:  testModelProxy.basePath,
-	}
-}
-
-func TestNewModelProxy(t *testing.T) {
-	type args struct {
-		basePath  string
-		rootProxy *model.Proxy
-	}
-	tests := []struct {
-		name string
-		args args
-		want *ModelProxy
-	}{
-		{"NewModelProxy-1", args{"base_path", &model.Proxy{}}, &ModelProxy{}},
-		{"NewModelProxy-2", args{"/base_path", &model.Proxy{}}, &ModelProxy{}},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			if got := newModelProxy(tt.args.basePath, tt.args.rootProxy); reflect.TypeOf(got) != reflect.TypeOf(tt.want) {
-				t.Errorf("newModelProxy() = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
-
-func TestModelProxy_Get(t *testing.T) {
-	tests := []struct {
-		name    string
-		fields  *fields
-		wantErr error
-	}{
-		{"Get-PathNotFound", getModelProxyPathNotFound(t), status.Errorf(codes.NotFound, "data-path: base_path")},
-		{"Get-PathFound", getModelProxyPathFound(t), nil},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			ModelProxyObj := testModelProxyObject(tt.fields)
-			_, err := ModelProxyObj.Get()
-			if err != nil && reflect.TypeOf(err) != reflect.TypeOf(tt.wantErr) {
-				t.Errorf("Get() error = %t, wantErr %t", err, tt.wantErr)
-			}
-		})
-	}
-}
diff --git a/ro_core/main.go b/ro_core/main.go
deleted file mode 100644
index 141a07f..0000000
--- a/ro_core/main.go
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package main
-
-import (
-	"context"
-	"errors"
-	"fmt"
-	"os"
-	"os/signal"
-	"strconv"
-	"syscall"
-	"time"
-
-	"github.com/opencord/voltha-go/ro_core/config"
-	c "github.com/opencord/voltha-go/ro_core/core"
-	"github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"github.com/opencord/voltha-lib-go/v3/pkg/probe"
-	"github.com/opencord/voltha-lib-go/v3/pkg/version"
-	ic "github.com/opencord/voltha-protos/v3/go/inter_container"
-)
-
-type roCore struct {
-	kvClient    kvstore.Client
-	config      *config.ROCoreFlags
-	halted      bool
-	exitChannel chan int
-	core        *c.Core
-	//For test
-	receiverChannels []<-chan *ic.InterContainerMessage
-}
-
-func init() {
-	_, err := log.AddPackage(log.JSON, log.DebugLevel, nil)
-	if err != nil {
-		log.Errorw("unable-to-register-package-to-the-log-map", log.Fields{"error": err})
-	}
-}
-
-func newKVClient(storeType string, address string, timeout int) (kvstore.Client, error) {
-
-	log.Infow("kv-store-type", log.Fields{"store": storeType})
-	switch storeType {
-	case "consul":
-		return kvstore.NewConsulClient(address, timeout)
-	case "etcd":
-		return kvstore.NewEtcdClient(address, timeout)
-	}
-	return nil, errors.New("unsupported-kv-store")
-}
-
-func newROCore(cf *config.ROCoreFlags) *roCore {
-	var roCore roCore
-	roCore.config = cf
-	roCore.halted = false
-	roCore.exitChannel = make(chan int, 1)
-	roCore.receiverChannels = make([]<-chan *ic.InterContainerMessage, 0)
-	return &roCore
-}
-
-func (ro *roCore) setKVClient() error {
-	addr := ro.config.KVStoreHost + ":" + strconv.Itoa(ro.config.KVStorePort)
-	client, err := newKVClient(ro.config.KVStoreType, addr, ro.config.KVStoreTimeout)
-	if err != nil {
-		ro.kvClient = nil
-		log.Error(err)
-		return err
-	}
-	ro.kvClient = client
-	return nil
-}
-
-func (ro *roCore) start(ctx context.Context) {
-	log.Info("Starting RW Core components")
-
-	// If the context has a probe then fetch it and register our services
-	var p *probe.Probe
-	if value := ctx.Value(probe.ProbeContextKey); value != nil {
-		if _, ok := value.(*probe.Probe); ok {
-			p = value.(*probe.Probe)
-			p.RegisterService(
-				"kv-store",
-				"device-manager",
-				"logical-device-manager",
-				"grpc-service",
-			)
-		}
-	}
-
-	// Setup KV Client
-	log.Debugw("create-kv-client", log.Fields{"kvstore": ro.config.KVStoreType})
-
-	if err := ro.setKVClient(); err != nil {
-		log.Fatalw("failed-to-connect-kv-client", log.Fields{"error": err})
-		return
-	}
-
-	// Create the core service
-	ro.core = c.NewCore(ctx, ro.config.InstanceID, ro.config, ro.kvClient)
-
-	if p != nil {
-		p.UpdateStatus("kv-store", probe.ServiceStatusPrepared)
-	}
-
-	// start the core
-	if err := ro.core.Start(ctx); err != nil {
-		log.Fatalf("failed-to-start-rocore", log.Fields{"error": err})
-	}
-}
-
-func (ro *roCore) stop(ctx context.Context) {
-	// Stop leadership tracking
-	ro.halted = true
-
-	// send exit signal
-	ro.exitChannel <- 0
-
-	// Cleanup - applies only if we had a kvClient
-	if ro.kvClient != nil {
-		// Release all reservations
-		if err := ro.kvClient.ReleaseAllReservations(); err != nil {
-			log.Infow("fail-to-release-all-reservations", log.Fields{"error": err})
-		}
-		// Close the DB connection
-		ro.kvClient.Close()
-	}
-
-	ro.core.Stop(ctx)
-}
-
-func waitForExit() int {
-	signalChannel := make(chan os.Signal, 1)
-	signal.Notify(signalChannel,
-		syscall.SIGHUP,
-		syscall.SIGINT,
-		syscall.SIGTERM,
-		syscall.SIGQUIT)
-
-	exitChannel := make(chan int)
-
-	go func() {
-		s := <-signalChannel
-		switch s {
-		case syscall.SIGHUP,
-			syscall.SIGINT,
-			syscall.SIGTERM,
-			syscall.SIGQUIT:
-			log.Infow("closing-signal-received", log.Fields{"signal": s})
-			exitChannel <- 0
-		default:
-			log.Infow("unexpected-signal-received", log.Fields{"signal": s})
-			exitChannel <- 1
-		}
-	}()
-
-	code := <-exitChannel
-	return code
-}
-
-func printBanner() {
-	fmt.Println()
-	fmt.Println(" ____   ___   ____               ")
-	fmt.Println("|  _ \\ / _ \\ / ___|___  _ __ ___ ")
-	fmt.Println("| |_) | | | | |   / _ \\| '__/ _ \\")
-	fmt.Println("|  _ <| |_| | |__| (_) | | |  __/")
-	fmt.Println("|_| \\_\\\\___/ \\____\\___/|_|  \\___|")
-	fmt.Println()
-
-}
-
-func printVersion() {
-	fmt.Println("VOLTHA Read-Only Core")
-	fmt.Println(version.VersionInfo.String("  "))
-}
-
-func main() {
-	start := time.Now()
-
-	cf := config.NewROCoreFlags()
-	cf.ParseCommandArguments()
-
-	//// Setup logging
-
-	//Setup default logger - applies for packages that do not have specific logger set
-	if _, err := log.SetDefaultLogger(log.JSON, cf.LogLevel, log.Fields{"instanceID": cf.InstanceID}); err != nil {
-		log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
-	}
-
-	// Update all loggers (provisionned via init) with a common field
-	if err := log.UpdateAllLoggers(log.Fields{"instanceID": cf.InstanceID}); err != nil {
-		log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
-	}
-
-	log.SetPackageLogLevel("github.com/opencord/voltha-go/ro_core/core", log.DebugLevel)
-
-	defer func() {
-		err := log.CleanUp()
-		if err != nil {
-			log.Errorw("unable-to-flush-any-buffered-log-entries", log.Fields{"error": err})
-		}
-	}()
-
-	// Print verison / build information and exit
-	if cf.DisplayVersionOnly {
-		printVersion()
-		return
-	}
-
-	// Print banner if specified
-	if cf.Banner {
-		printBanner()
-	}
-
-	log.Infow("ro-core-config", log.Fields{"config": *cf})
-
-	// Create the RO Core
-	ro := newROCore(cf)
-
-	ctx, cancel := context.WithCancel(context.Background())
-	defer cancel()
-
-	/*
-	 * Create and start the liveness and readiness container management probes. This
-	 * is done in the main function so just in case the main starts multiple other
-	 * objects there can be a single probe end point for the process.
-	 */
-	p := &probe.Probe{}
-	go p.ListenAndServe(fmt.Sprintf("%s:%d", ro.config.ProbeHost, ro.config.ProbePort))
-
-	// Add the probe to the context to pass to all the services started
-	probeCtx := context.WithValue(ctx, probe.ProbeContextKey, p)
-
-	// Start the RO core
-	go ro.start(probeCtx)
-
-	code := waitForExit()
-	log.Infow("received-a-closing-signal", log.Fields{"code": code})
-
-	// Cleanup before leaving
-	ro.stop(probeCtx)
-
-	elapsed := time.Since(start)
-	log.Infow("ro-core-run-time", log.Fields{"core": ro.config.InstanceID, "time": elapsed / time.Second})
-}
diff --git a/tests/afrouter/arouter_test.json b/tests/afrouter/arouter_test.json
deleted file mode 100644
index d58f26d..0000000
--- a/tests/afrouter/arouter_test.json
+++ /dev/null
@@ -1,205 +0,0 @@
-{
-    "servers": [
-	    {
-		    "name": "grpc_command",
-			"port": 5000,
-			"address":"",
-			"type": "grpc",
-			"routers": [
-				{
-					"_TODO":"Suport a router list, remove the package and service from the router",
-					"package":"voltha",
-					"service":"VolthaService",
-					"router":"vcore"
-				}
-			]
-		}
-	],
-	"routers": [
-	    {
-		    "name":"vcore",
-			"package": "voltha",
-			"service": "VolthaService",
-            "routes": [
-				{
-					"name":"dev_manager",
-            		"proto_descriptor":"voltha.pb",
-		   			"type":"rpc_affinity_message",
-		   			"association":"round_robin",
-           			"routing_field": "id",
-					"backend_cluster":"vcore",
-					"_COMMENT":"Methods are naturally southbound affinity binding unless otherwise specified below",
-					"methods":[ "CreateDevice",
-								"EnableLogicalDevicePort",
-								"DisableLogicalDevicePort",
-								"UpdateLogicalDeviceFlowTable",
-								"UpdateLogicalDeviceFlowGroupTable",
-								"EnableDevice",
-								"DisableDevice",
-								"RebootDevice",
-								"DeleteDevice",
-								"DownloadImage",
-								"CancelImageDownload",
-								"ActivateImageUpdate",
-								"RevertImageUpdate",
-								"UpdateDevicePmConfigs",
-								"CreateAlarmFilter",
-								"UpdateAlarmFilter",
-								"DeleteAlarmFilter",
-								"SelfTest"],
-					"_COMMENT":"If a method is northbound affinity binding then association is used to route",
-					"_COMMENT":"but affinity is not set southbound but only based on the response",
-					"_COMMENT":"Methods here MUST be specified above, this overrides thier default beahvior",
-					"nb_binding_methods":["CreateDevice"],
-					"_TODO":"Overrides not implemented yet, config ignored",
-					"overrides": [
-               			{"methods":["abc","def"], "routing_field":"id"},
-               			{"methods":["ghi","jkl"]},
-               			{"method":"mno", "routing_field":"id"},
-               			{"method":"pqr"}
-					]
-				},
-				{
-					"name":"control",
-		   			"type":"round_robin",
-		   			"association":"round_robin",
-					"backend_cluster":"vcore",
-					"methods":[ 
-								"UpdateLogLevel"
-					]
-				},
-				{
-					"name":"read_only",
-		   			"type":"round_robin",
-		   			"association":"round_robin",
-					"backend_cluster":"vcore",
-					"methods":[ "ListDevicePorts",
-								"ListDevicePmConfigs",
-								"GetImages",
-								"GetImageDownloadStatus",
-								"GetImageDownload",
-								"ListImageDownloads",
-								"ListDeviceFlows",
-								"ListDeviceFlowGroups",
-								"ListLogicalDeviceFlows",
-								"ListLogicalDeviceFlowGroups",
-								"ListDevices",
-								"GetDevice",
-								"GetDeviceType",
-								"GetDeviceGroup",
-								"GetLogicalDevice",
-								"GetAlarmFilter",
-								"ListLogicalDevices",
-								"ListLogicalDevicePorts",
-								"GetLogicalDevicePort",
-								"GetVoltha",
-								"ListCoreInstances",
-								"ListAdapters",
-								"ListDeviceIds",
-								"ListDeviceTypes",
-								"ListDeviceGroups",
-								"ListAlarmFilters",
-								"GetCoreInstance"
-					]
-				},
-				{
-					"name":"dev_manager_ofagent",
-		   			"type":"binding",
-		   			"_association":"round_robin",
-					"binding": {
-						"type":"header",
-						"field":"voltha_backend_name",
-						"method":"Subscribe",
-						"association":"round_robin"
-					},
-					"backend_cluster":"vcore",
-                    "methods":["StreamPacketsOut",
-                               "Subscribe",
-                               "ListLogicalDevices",
-                               "ListDeviceFlowGroups",
-                               "ListLogicalDeviceFlowGroups",
-                               "ListDeviceFlows",
-                               "UpdateLogicalDeviceFlowTable",
-                               "UpdateLogicalDeviceFlowGroupTable",
-                               "ListLogicalDeviceFlows"
-					],
-					"_TODO":"Overrides not implemented yet, config ignored",
-					"overrides": [
-               			{"methods":["abc","def"], "routing_field":"id"},
-               			{"methods":["ghi","jkl"]},
-               			{"method":"mno", "routing_field":"id"},
-               			{"method":"pqr"}
-					]
-				}
-            ]
-		 }
-	],
-	"backend_clusters": [
-	  {
-        "name":"vcore",
-		"backends":[ {
-			"name":"vcore1",
-			"type":"active_active",
-			"association": {
-				"strategy":"serial_number",
-				"location":"header",
-				"_TODO":"The key below needs to be implemented, currently hard coded",
-				"key":"voltha_serial_number"
-			},
-			"connections": [ {
-		   		"name":"vcore11",
-		   		"addr":"127.0.0.1",
-		   		"port":"5011"
-			},
-			{
-				"name":"vcore12",
-				"addr":"127.0.0.1",
-				"port":"5012"
-			}]
-		},
-		{
-			"name":"vcore2",
-			"type":"active_active",
-			"association": {
-				"strategy":"serial_number",
-				"location":"header",
-				"key":"voltha_serial_number"
-			},
-			"connections": [ {
-		   		"name":"vcore21",
-		   		"addr":"127.0.0.1",
-		   		"port":"5021"
-			},
-			{
-				"name":"vcore22",
-				"addr":"127.0.0.1",
-				"port":"5022"
-			}]
-		},
-		{
-			"name":"vcore3",
-			"type":"active_active",
-			"association": {
-				"strategy":"serial_number",
-				"location":"header",
-				"key":"voltha_serial_number"
-			},
-			"connections": [ {
-		   		"name":"vcore31",
-		   		"addr":"127.0.0.1",
-		   		"port":"5031"
-			},
-			{
-				"name":"vcore32",
-				"addr":"127.0.0.1",
-				"port":"5032"
-			}]
-		}]
-	  }
-	],
-	"api": {
-		"_comment":"If this isn't defined then no api is available for dynamic configuration and queries",
-		"address":"",
-		"port":55554
-	}
-}
diff --git a/tests/afrouter/suites/main.json b/tests/afrouter/suites/main.json
deleted file mode 100644
index 594bc8a..0000000
--- a/tests/afrouter/suites/main.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-"__COMMENT":"Top level test driver file",
-"suites": [
-	"test1",
-	"test2",
-	"test3"
-	]
-}
diff --git a/tests/afrouter/suites/test1/test1.json b/tests/afrouter/suites/test1/test1.json
deleted file mode 100644
index 14be12c..0000000
--- a/tests/afrouter/suites/test1/test1.json
+++ /dev/null
@@ -1,223 +0,0 @@
-{
-	"environment":{
-		"cmdLine":"afrouter -logLevel 1 -config arouter_test.json",
-		"protoFiles": [
-			{
-				"importPath":"github.com/opencord/voltha-protos/v3/go/",
-				"service":"VolthaService",
-				"package":"voltha"
-			},
-			{
-				"importPath":"github.com/opencord/voltha-protos/v3/go/",
-				"service":"Configuration",
-				"package":"afrouter"
-			}
-		],
-		"Junk": [
-			{
-				"importPath":"github.com/opencord/voltha-protos/v3/go/",
-				"service":"Configuration",
-				"package":"afrouter"
-			}
-		],
-		"imports": [
-			"github.com/opencord/voltha-protos/v3/go/common"
-		],
-		"protoDesc":"voltha.pb",
-		"protoSubst": [
-			{
-				"from":"google.protobuf.Empty",
-				"to":"empty.Empty"
-			}
-		],
-		"clients": {
-			"imports": [
-				"github.com/golang/protobuf/ptypes/empty",
-				"github.com/opencord/voltha-protos/v3/go/openflow_13",
-				"github.com/opencord/voltha-protos/v3/go/common"
-			],
-			"endpoints": [
-				{
-					"name":"client",
-					"port":"5000"
-				},
-				{
-					"name":"stats",
-					"port":"55554"
-				}
-			]
-		},
-		"servers": {
-			"imports": [
-				"github.com/golang/protobuf/ptypes/empty",
-				"github.com/opencord/voltha-protos/v3/go/openflow_13",
-				"github.com/opencord/voltha-protos/v3/go/common",
-				"github.com/opencord/voltha-protos/v3/go/omci"
-			],
-			"endpoints": [
-			{
-				"name":"core11",
-				"port":"5011"
-			},
-			{
-				"name":"core12",
-				"port":"5012"
-			},
-			{
-				"name":"core21",
-				"port":"5021"
-			},
-			{
-				"name":"core22",
-				"port":"5022"
-			},
-			{
-				"name":"core31",
-				"port":"5031"
-			},
-			{
-				"name":"core32",
-				"port":"5032"
-			},
-			{
-				"name":"roCore1",
-				"port":"5001"
-			},
-			{
-				"name":"roCore2",
-				"port":"5002"
-			},
-			{
-				"name":"roCore3",
-				"port":"5003"
-			}
-			]
-		}
-	},
-	"tests":[
-		{
-			"name":"Test CreateDevice",
-			"send": {
-				"client":"client",
-				"method":"CreateDevice",
-				"param":"{Type:\"simulated_olt\"}",
-				"expect":"{Id:\"abcd1234\",Type:\"simulated_olt\"}",
-				"_meta":"",
-				"_expectMeta":""
-			},
-			"servers": [
-				{
-					"name":"core11",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"0"
-						}
-					]
-				},
-				{
-					"name":"core12",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"0"
-						}
-					]
-				}
-			]
-		},
-		{
-			"name":"Test GetDevice",
-			"send": {
-				"client":"client",
-				"method":"GetDevice",
-				"param":"{Id:\"abcd1234\"}",
-				"expect":"{Id:\"abcd1234\",Type:\"simulated_olt\"}",
-				"_meta":"",
-				"_expectMeta":""
-			},
-			"servers": [
-				{
-					"name":"core11",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"1"
-						}
-					]
-				},
-				{
-					"name":"core12",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"1"
-						}
-					]
-				}
-			]
-		},
-		{
-			"name":"Test Subscribe",
-			"send": {
-				"client":"client",
-				"method":"Subscribe",
-				"param":"{OfagentId:\"Agent007\"}",
-				"meta": [
-					{
-						"key":"voltha_backend_name",
-						"value":""
-					}
-				],
-				"expect":"{OfagentId:\"Agent007\",VolthaId:\"core11\"}",
-				"expectMeta": [
-					{
-						"key":"voltha_backend_name",
-						"value":"vcore1"
-					}
-				]
-			},
-			"servers": [
-				{
-					"name":"core11",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"2"
-						},
-						{
-							"key":"voltha_backend_name",
-							"value":""
-						}
-					]
-				},
-				{
-					"name":"core12",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"2"
-						},
-						{
-							"key":"voltha_backend_name",
-							"value":""
-						}
-					]
-				}
-			]
-		},
-		{
-			"name":"Get goroutine count",
-			"infoOnly":true,
-			"send": {
-				"client":"stats",
-				"method":"GetGoroutineCount",
-				"param":"{}",
-				"meta": [ ],
-				"expect":"{Count:43}",
-				"expectMeta": [ ]
-			},
-			"servers": [ ]
-		}
-	]
-}
diff --git a/tests/afrouter/suites/test2/test2.go b/tests/afrouter/suites/test2/test2.go
deleted file mode 100644
index 68ce93c..0000000
--- a/tests/afrouter/suites/test2/test2.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// +build integration
-
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package main
-
-import (
-	"os"
-	//"fmt"
-	//"flag"
-	//"path"
-	//"bufio"
-	//"errors"
-	//"os/exec"
-	//"strconv"
-	//"io/ioutil"
-	//"encoding/json"
-	"text/template"
-	//"github.com/golang/protobuf/proto"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	//pb "github.com/golang/protobuf/protoc-gen-go/descriptor"
-)
-
-type test struct {
-	Core  int
-	SerNo int
-}
-
-type suite struct {
-	CrTests  []test
-	GetTests []test
-}
-
-const SUITE_LEN = 55000
-
-//const SUITE_LEN = 100
-
-func main() {
-
-	var ary suite
-
-	// Setup logging
-	if _, err := log.SetDefaultLogger(log.JSON, 0, nil); err != nil {
-		log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
-	}
-
-	for i := 0; i < SUITE_LEN; i++ {
-		ary.CrTests = append(ary.CrTests, test{Core: (i % 3) + 1, SerNo: i})
-		ary.GetTests = append(ary.GetTests, test{Core: (i % 3) + 1, SerNo: i + SUITE_LEN})
-	}
-
-	// Load the template to execute
-	t := template.Must(template.New("").ParseFiles("./test2.tmpl.json"))
-	if f, err := os.Create("test2.json"); err == nil {
-		defer f.Close()
-		if err := t.ExecuteTemplate(f, "test2.tmpl.json", ary); err != nil {
-			log.Errorf("Unable to execute template for test2.tmpl.json: %v", err)
-		}
-	} else {
-		log.Errorf("Couldn't create file test2.json: %v", err)
-	}
-	return
-}
diff --git a/tests/afrouter/suites/test2/test2.tmpl.json b/tests/afrouter/suites/test2/test2.tmpl.json
deleted file mode 100644
index 34ea334..0000000
--- a/tests/afrouter/suites/test2/test2.tmpl.json
+++ /dev/null
@@ -1,239 +0,0 @@
-{
-	"environment":{
-		"cmdLine":"afrouter -config arouter_test.json -logLevel 1",
-		"protoFiles": [
-			{
-				"importPath":"github.com/opencord/voltha-protos/v3/go/",
-				"service":"VolthaService",
-				"package":"voltha"
-			},
-			{
-				"importPath":"github.com/opencord/voltha-protos/v3/go/",
-				"service":"Configuration",
-				"package":"afrouter"
-			}
-		],
-		"imports": [
-			"github.com/golang/protobuf/ptypes/empty",
-			"github.com/opencord/voltha-protos/v3/go/common"
-		],
-		"protoDesc":"voltha.pb",
-		"protoSubst": [
-			{
-				"from":"google.protobuf.Empty",
-				"to":"empty.Empty"
-			}
-		],
-		"clients": {
-			"imports": [
-				"github.com/golang/protobuf/ptypes/empty",
-				"github.com/opencord/voltha-protos/v3/go/openflow_13",
-				"github.com/opencord/voltha-protos/v3/go/common"
-			],
-			"endpoints": [
-				{
-					"name":"client",
-					"port":"5000"
-				},
-				{
-					"name":"stats",
-					"port":"55554"
-				}
-			]
-		},
-		"servers": {
-			"imports": [
-				"github.com/golang/protobuf/ptypes/empty",
-				"github.com/opencord/voltha-protos/v3/go/openflow_13",
-				"github.com/opencord/voltha-protos/v3/go/omci",
-				"github.com/opencord/voltha-protos/v3/go/common"
-			],
-			"endpoints": [
-			{
-				"name":"core11",
-				"port":"5011"
-			},
-			{
-				"name":"core12",
-				"port":"5012"
-			},
-			{
-				"name":"core21",
-				"port":"5021"
-			},
-			{
-				"name":"core22",
-				"port":"5022"
-			},
-			{
-				"name":"core31",
-				"port":"5031"
-			},
-			{
-				"name":"core32",
-				"port":"5032"
-			}
-			]
-		}
-	},
-	"tests":[
-		{{range $k,$v := .CrTests}}
-		{
-			"name":"Test CreateDevice",
-			"send": {
-				"client":"client",
-				"method":"CreateDevice",
-				"param":"{Type:\"simulated_olt\"}",
-				"expect":"{Id:\"abcd1234{{$k}}\",Type:\"simulated_olt\"}",
-				"_meta":""
-			},
-			"servers": [
-				{
-					"name":"core{{$v.Core}}1",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"{{$v.SerNo}}"
-						}
-					]
-				},
-				{
-					"name":"core{{$v.Core}}2",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"{{$v.SerNo}}"
-						}
-					]
-				}
-			]
-		},
-		{{end}}
-		{{range $k,$v := .GetTests}}
-		{
-			"name":"Test EnableDevice",
-			"send": {
-				"client":"client",
-				"_method":"GetDevice",
-				"method":"EnableDevice",
-				"param":"{Id:\"abcd1234{{$k}}\"}",
-				"expect":"{}",
-				"_expect":"{Id:\"abcd1234{{$k}}\",Type:\"simulated_olt\"}",
-				"_meta":""
-			},
-			"servers": [
-				{
-					"name":"core{{$v.Core}}1",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"{{$v.SerNo}}"
-						}
-					]
-				},
-				{
-					"name":"core{{$v.Core}}2",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"{{$v.SerNo}}"
-						}
-					]
-				}
-			]
-		},
-		{{end}}
-		{
-			"name":"Test GetDevice",
-			"send": {
-				"client":"client",
-				"method":"GetDevice",
-				"param":"{Id:\"abcd12340\"}",
-				"expect":"{Id:\"abcd12340\",Type:\"simulated_olt\"}",
-				"_meta":""
-			},
-			"servers": [
-				{
-					"name":"core11",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"110000"
-						}
-					]
-				},
-				{
-					"name":"core12",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"110000"
-						}
-					]
-				}
-			]
-		},
-		{
-			"name":"Test Subscribe",
-			"send": {
-				"client":"client",
-				"method":"Subscribe",
-				"param":"{OfagentId:\"Agent007\"}",
-				"meta": [
-					{
-						"key":"voltha_backend_name",
-						"value":""
-					}
-				],
-				"expect":"{OfagentId:\"Agent007\",VolthaId:\"core11\"}",
-				"expectMeta": [
-					{
-						"key":"voltha_backend_name",
-						"value":"vcore1"
-					}
-				]
-			},
-			"servers": [
-				{
-					"name":"core11",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"110001"
-						},
-						{
-							"key":"voltha_backend_name",
-							"value":""
-						}
-					]
-				},
-				{
-					"name":"core12",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"110001"
-						},
-						{
-							"key":"voltha_backend_name",
-							"value":""
-						}
-					]
-				}
-			]
-		},
-		{
-			"_COMMENT":"If this test case fails, there could be a goroutine leak",
-			"name":"Get goroutine count",
-			"send": {
-				"client":"stats",
-				"method":"GetGoroutineCount",
-				"param":"{}",
-				"meta": [ ],
-				"expect":"{Count:43}",
-				"expectMeta": [ ]
-			},
-			"servers": [ ]
-		}
-	]
-}
diff --git a/tests/afrouter/suites/test3/test3.go b/tests/afrouter/suites/test3/test3.go
deleted file mode 100644
index 956152b..0000000
--- a/tests/afrouter/suites/test3/test3.go
+++ /dev/null
@@ -1,420 +0,0 @@
-// +build integration
-
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package main
-
-import (
-	"fmt"
-	"os"
-	//"flag"
-	//"path"
-	//"bufio"
-	"errors"
-	//"os/exec"
-	//"strconv"
-	"io/ioutil"
-	//"encoding/json"
-	"text/template"
-	//"github.com/golang/protobuf/proto"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	//pb "github.com/golang/protobuf/protoc-gen-go/descriptor"
-)
-
-// This test suite validates that the different method types get routed
-// properly. That is, rw methods to the rw cores and ro methods to the
-// ro cores
-type test struct {
-	Name   string
-	Core   int
-	SerNo  int
-	Method string
-	Param  string
-	Expect string
-}
-
-type tests struct {
-	RoTests  []test
-	RwTests  []test
-	CtlTests []test
-}
-
-var roMethods []test = []test{
-	{
-		Name:   "Test GetVoltha",
-		Method: "GetVoltha", // rpc GetVoltha(google.protobuf.Empty) returns(Voltha)
-		Param:  "{}",
-		Expect: `{Version:\"abcdef\"}`,
-	},
-	/*
-		    {
-				Name: "Test ListCoreInstances",
-				Method: "ListCoreInstances", // rpc ListCoreInstances(google.protobuf.Empty) returns(CoreInstances)
-				Param: "{}",
-				Expect:  `{Items:[]*voltha.CoreInstance{&voltha.CoreInstance{InstanceId:\"ABC\",Health:&voltha.HealthStatus{State:0}}}}`,
-			},
-			{
-				Name: "Test GetCoreInstance",
-				Method: "GetCoreInstance", // rpc GetCoreInstance(ID) returns(CoreInstance)
-				Param: `{Id:\"arou8390\"}`,
-				Expect: `{InstanceId:\"arou8390\", Health:&voltha.HealthStatus{State:0}}`,
-			},*/
-	{
-		Name:   "Test ListAdapters",
-		Method: "ListAdapters", // rpc ListAdapters(google.protobuf.Empty) returns(Adapters)
-		Param:  "{}",
-		Expect: `{Items:[]*voltha.Adapter{&voltha.Adapter{Id:\"ABC\", Vendor:\"afrouterTest\", Version:\"Version 1.0\"}}}`,
-	},
-	{
-		Name:   "Test ListLogicalDevices",
-		Method: "ListLogicalDevices", // rpc ListLogicalDevices(google.protobuf.Empty) returns(LogicalDevices)
-		Param:  "{}",
-		Expect: `{Items:[]*voltha.LogicalDevice{&voltha.LogicalDevice{Id:\"LDevId\", DatapathId:64, RootDeviceId:\"Root\"}}}`,
-	},
-	{
-		Name:   "Test GetLogicalDevice",
-		Method: "GetLogicalDevice", // rpc GetLogicalDevice(ID) returns(LogicalDevice)
-		Param:  `{Id:\"ABC123XYZ\"}`,
-		Expect: `{Id:\"ABC123XYZ\", DatapathId:64, RootDeviceId:\"Root-of:ABC123XYZ\"}`,
-	},
-	{
-		Name:   "Test ListLogicalDevicePorts",
-		Method: "ListLogicalDevicePorts", // rpc ListLogicalDevicePorts(ID) returns(LogicalPorts)
-		Param:  `{Id:\"ABC123XYZ\"}`,
-		Expect: `{Items:[]*voltha.LogicalPort{&voltha.LogicalPort{Id:\"PortId-1\", DeviceId:\"ABC12XYZ\", DevicePortNo:64, RootPort:true},&voltha.LogicalPort{Id:\"PortId-2\", DeviceId:\"ABC12XYZ\", DevicePortNo:64, RootPort:false}}}`,
-	},
-	{
-		Name:   "Test GetLogicalDevicePort",
-		Method: "GetLogicalDevicePort", // rpc GetLogicalDevicePort(LogicalPortId) returns(LogicalPort)
-		Param:  `{Id:\"PortId-1\"}`,
-		Expect: `{Id:\"PortId-1\", DeviceId:\"ABC12XYZ\", DevicePortNo:64, RootPort:true}`,
-	},
-	{
-		Name:   "Test ListLogicalDeviceFlows",
-		Method: "ListLogicalDeviceFlows", // rpc ListLogicalDeviceFlows(ID) returns(openflow_13.Flows)
-		Param:  `{Id:\"Flow-ABC123XYZ\"}`,
-		Expect: `{Items:[]*openflow_13.OfpFlowStats{&openflow_13.OfpFlowStats{Id:1, TableId:2, DurationSec:12, Priority:0},&openflow_13.OfpFlowStats{Id:1, TableId:2, DurationSec:12, Priority:0}}}`,
-	},
-	{
-		Name:   "Test ListLogicalDeviceFlowGroups",
-		Method: "ListLogicalDeviceFlowGroups", // rpc ListLogicalDeviceFlowGroups(ID) returns(openflow_13.FlowGroups)
-		Param:  `{Id:\"Flow-ABC123XYZ\"}`,
-		Expect: `{Items:[]*openflow_13.OfpGroupEntry{&openflow_13.OfpGroupEntry{Desc:&openflow_13.OfpGroupDesc{GroupId:12}, Stats:&openflow_13.OfpGroupStats{GroupId:1, RefCount:1, PacketCount:3}}}}`,
-	},
-	{
-		Name:   "Test ListDevices",
-		Method: "ListDevices", // rpc ListDevices(google.protobuf.Empty) returns(Devices)
-		Param:  `{}`,
-		Expect: `{Items:[]*voltha.Device{&voltha.Device{Id:\"ABC123XYZ\", Type:\"SomeDeviceType\", Root:false, ParentId:\"ZYX321CBA\"},&voltha.Device{Id:\"ZYX321CBA\", Type:\"SomeDeviceType\", Root:true, ParentId:\"ROOT\"}}}`,
-	},
-	{
-		Name:   "Test ListDeviceIds",
-		Method: "ListDeviceIds", // rpc ListDeviceIds(google.protobuf.Empty) returns(IDs)
-		Param:  `{}`,
-		Expect: `{Items:[]*voltha.ID{&voltha.ID{Id:\"ABC123XYZ\"},&voltha.ID{Id:\"ZYX321CBA\"}}}`,
-	},
-	{
-		Name:   "Test GetDevice",
-		Method: "GetDevice", // rpc GetDevice(ID) returns(Device)
-		Param:  `{Id:\"ZYX321CBA\"}`,
-		Expect: `{Id:\"ABC123XYZ\", Type:\"SomeDeviceType\", Root:false, ParentId:\"ZYX321CBA\"}`,
-	},
-	{
-		Name:   "Test GetImageDownloadStatus",
-		Method: "GetImageDownloadStatus", // rpc GetImageDownloadStatus(ImageDownload) returns(ImageDownload)
-		Param:  `{Id:\"Image-ZYX321CBA\"}`,
-		Expect: `{Id:\"Image-ABC123XYZ\", Name:\"SomeName\", Url:\"Some URL\", Crc:123456}`,
-	},
-	{
-		Name:   "Test GetImageDownload",
-		Method: "GetImageDownload", // rpc GetImageDownload(ImageDownload) returns(ImageDownload)
-		Param:  `{Id:\"Image-ZYX321CBA\"}`,
-		Expect: `{Id:\"Image-ABC123XYZ\", Name:\"SomeName\", Url:\"Some URL\", Crc:123456}`,
-	},
-	{
-		Name:   "Test ListImageDownloads",
-		Method: "ListImageDownloads", // rpc ListImageDownloads(ID) returns(ImageDownloads)
-		Param:  `{Id:\"ZYX321CBA\"}`,
-		Expect: `{Items:[]*voltha.ImageDownload{&voltha.ImageDownload{Id:\"Image1-ABC123XYZ\", Name:\"SomeName\", Url:\"Some URL\", Crc:123456}, &voltha.ImageDownload{Id:\"Image2-ABC123XYZ\", Name:\"SomeName\", Url:\"Some other URL\", Crc:654321}}}`,
-	},
-	{
-		Name:   "Test ListDevicePorts",
-		Method: "ListDevicePorts", // rpc ListDevicePorts(ID) returns(Ports)
-		Param:  `{}`,
-		Expect: `{Items:[]*voltha.Port{&voltha.Port{PortNo:100000, Label:\"Port one hundred thousand\", DeviceId:\"ZYX321CBA\"},&voltha.Port{PortNo:100001, Label:\"Port one hundred thousand and one\", DeviceId:\"ZYX321CBA\"}}}`,
-	},
-	{
-		Name:   "Test ListDevicePmConfigs",
-		Method: "ListDevicePmConfigs", // rpc ListDevicePmConfigs(ID) returns(PmConfigs)
-		Param:  `{}`,
-		Expect: `{Id:\"ABC123XYZ\", DefaultFreq: 10000, Grouped:false, FreqOverride:false, Metrics:[]*voltha.PmConfig{&voltha.PmConfig{Name:\"Speed\", Enabled: true, SampleFreq:10000}, &voltha.PmConfig{Name:\"Errors\", Enabled: true, SampleFreq:10000}}}`,
-	},
-	{
-		Name:   "Test ListDeviceFlows",
-		Method: "ListDeviceFlows", // rpc ListDeviceFlows(ID) returns(openflow_13.Flows)
-		Param:  `{Id:\"Flow-ABC123XYZ\"}`,
-		Expect: `{Items:[]*openflow_13.OfpFlowStats{&openflow_13.OfpFlowStats{Id:1, TableId:2, DurationSec:12, Priority:0},&openflow_13.OfpFlowStats{Id:1, TableId:2, DurationSec:12, Priority:0}}}`,
-	},
-	{
-		Name:   "Test ListDeviceFlowGroups",
-		Method: "ListDeviceFlowGroups", // rpc ListDeviceFlowGroups(ID) returns(openflow_13.FlowGroups)
-		Param:  `{Id:\"Flow-ABC123XYZ\"}`,
-		Expect: `{Items:[]*openflow_13.OfpGroupEntry{&openflow_13.OfpGroupEntry{Desc:&openflow_13.OfpGroupDesc{GroupId:12}, Stats:&openflow_13.OfpGroupStats{GroupId:1, RefCount:1, PacketCount:3}}}}`,
-	},
-	{
-		Name:   "Test ListDeviceTypes",
-		Method: "ListDeviceTypes", // rpc ListDeviceTypes(google.protobuf.Empty) returns(DeviceTypes)
-		Param:  `{}`,
-		Expect: `{Items:[]*voltha.DeviceType{&voltha.DeviceType{Id:\"ABC123XYZ\", VendorId:\"Ciena\", Adapter:\"SAOS\"},&voltha.DeviceType{Id:\"ZYX321CBA\", VendorId:\"Ciena\", Adapter:\"SAOS-Tibit\"}}}`,
-	},
-	{
-		Name:   "Test GetDeviceType",
-		Method: "GetDeviceType", // rpc GetDeviceType(ID) returns(DeviceType)
-		Param:  `{Id:\"ZYX321CBA\"}`,
-		Expect: `{Id:\"ZYX321CBA\", VendorId:\"Ciena\", Adapter:\"SAOS-Tibit\"}`,
-	},
-	{
-		Name:   "Test ListDeviceGroups",
-		Method: "ListDeviceGroups", // rpc ListDeviceGroups(google.protobuf.Empty) returns(DeviceGroups)
-		Param:  `{}`,
-		Expect: `{Items:[]*voltha.DeviceGroup{&voltha.DeviceGroup{Id:\"group-ABC123XYZ\", LogicalDevices: []*voltha.LogicalDevice{&voltha.LogicalDevice{Id:\"LDevId\", DatapathId:64, RootDeviceId:\"Root\"}}, Devices: []*voltha.Device{&voltha.Device{Id:\"ABC123XYZ\", Type:\"SomeDeviceType\", Root:false, ParentId:\"ZYX321CBA\"},&voltha.Device{Id:\"ZYX321CBA\", Type:\"SomeDeviceType\", Root:true, ParentId:\"ROOT\"}}}}}`,
-	},
-	{
-		Name:   "Test GetDeviceGroup",
-		Method: "GetDeviceGroup", // rpc GetDeviceGroup(ID) returns(DeviceGroup)
-		Param:  `{Id:\"ZYX321CBA\"}`,
-		Expect: `{Id:\"group-ABC123XYZ\", LogicalDevices: []*voltha.LogicalDevice{&voltha.LogicalDevice{Id:\"LDevId\", DatapathId:64, RootDeviceId:\"Root\"}}, Devices: []*voltha.Device{&voltha.Device{Id:\"ABC123XYZ\", Type:\"SomeDeviceType\", Root:false, ParentId:\"ZYX321CBA\"},&voltha.Device{Id:\"ZYX321CBA\", Type:\"SomeDeviceType\", Root:true, ParentId:\"ROOT\"}}}`,
-	},
-	{
-		Name:   "Test ListEventFilters",
-		Method: "ListEventFilters", // rpc ListEventFilters(google.protobuf.Empty) returns(EventFilters)
-		Param:  `{}`,
-		Expect: `{Filters:[]*voltha.EventFilter{&voltha.EventFilter{Id:\"ABC123XYZ\", DeviceId: \"Device123\", Enable: \"True\", EventType: \"DeviceEvent\", Rules: []*voltha.EventFilterRule{&voltha.EventFilterRule{Value:\"Rule Value\"}}}}}`,
-	},
-	{
-		Name:   "Test GetEventFilter",
-		Method: "GetEventFilter", // rpc GetEventFilter(ID) returns(EventFilters)
-		Param:  `{Id:\"ABC123XYZ\"}`,
-		Expect: `{Filters:[]*voltha.EventFilter{&voltha.EventFilter{Id:\"ABC123XYZ\", DeviceId: \"Device123\", Enable: \"True\", EventType: \"DeviceEvent\", Rules: []*voltha.EventFilterRule{&voltha.EventFilterRule{Value:\"Rule Value\"}}}}}`,
-	},
-	{
-		Name:   "Test GetImages",
-		Method: "GetImages", // rpc GetImages(ID) returns(Images)
-		Param:  `{Id:\"ZYX321CBA\"}`,
-		Expect: `{Image: []*voltha.Image{&voltha.Image{Name:\"Image1\", Version: \"0.1\", Hash:\"123@\", InstallDatetime:\"Yesterday\", IsActive:true, IsCommitted:true, IsValid:false},&voltha.Image{Name:\"Image2\", Version: \"0.2\", Hash:\"ABC@\", InstallDatetime:\"Today\", IsActive:false, IsCommitted:false, IsValid:false}}}`,
-	},
-}
-
-var ctlMethods []test = []test{
-	{
-		Name:   "Test UpdateLogLevel",
-		Method: "UpdateLogLevel", // rpc UpdateLogLevel(Logging) returns(google.protobuf.Empty)
-		Param:  `{Level: 0, PackageName:\"abc123\"}`,
-		Expect: "{}",
-	},
-}
-
-var rwMethods []test = []test{
-	{
-		Name:   "Test EnableLogicalDevicePort",
-		Method: "EnableLogicalDevicePort", // rpc EnableLogicalDevicePort(LogicalPortId) returns(google.protobuf.Empty)
-		Param:  `{Id:\"ZYX321CBA\", PortId:\"100,000\"}`,
-		Expect: `{}`,
-	},
-	{
-		Name:   "Test DisableLogicalDevicePort",
-		Method: "DisableLogicalDevicePort", // rpc DisableLogicalDevicePort(LogicalPortId) returns(google.protobuf.Empty)
-		Param:  `{Id:\"ABC123XYZ\", PortId:\"100,000\"}`,
-		Expect: `{}`,
-	},
-	{
-		Name:   "Test UpdateLogicalDeviceFlowTable",
-		Method: "UpdateLogicalDeviceFlowTable", // rpc UpdateLogicalDeviceFlowTable(openflow_13.FlowTableUpdate)
-		Param:  `{Id:\"XYZ123ABC\", FlowMod:&openflow_13.OfpFlowMod{Cookie:10, CookieMask:255, TableId:10000, Command:openflow_13.OfpFlowModCommand_OFPFC_ADD}}`,
-		Expect: `{}`,
-	},
-	{
-		Name:   "Test UpdateLogicalDeviceFlowGroupTable",
-		Method: "UpdateLogicalDeviceFlowGroupTable", // rpc UpdateLogicalDeviceFlowGroupTable(openflow_13.FlowGroupTableUpdate)
-		Param:  `{Id:\"ZYX123ABC\", GroupMod:&openflow_13.OfpGroupMod{Command:openflow_13.OfpGroupModCommand_OFPGC_ADD, Type:openflow_13.OfpGroupType_OFPGT_INDIRECT, GroupId:255}}`,
-		Expect: `{}`,
-	},
-	//"ReconcileDevices", // rpc ReconcileDevices(IDs) returns(google.protobuf.Empty)
-	{
-		Name:   "Test CreateDevice",
-		Method: "CreateDevice", // rpc CreateDevice(Device) returns(Device)
-		Param:  `{Type:\"simulated_OLT\"}`,
-		Expect: `{Id:\"ZYX321ABC\", Type:\"\"}`,
-	},
-	{
-		Name:   "Test EnableDevice",
-		Method: "EnableDevice", // rpc EnableDevice(ID) returns(google.protobuf.Empty)
-		Param:  `{Id:\"XYZ321ABC\"}`,
-		Expect: `{}`,
-	},
-	{
-		Name:   "Test DisableDevice",
-		Method: "DisableDevice", // rpc DisableDevice(ID) returns(google.protobuf.Empty)
-		Param:  `{Id:\"XYZ123CBA\"}`,
-		Expect: `{}`,
-	},
-	{
-		Name:   "Test RebootDevice",
-		Method: "RebootDevice", // rpc RebootDevice(ID) returns(google.protobuf.Empty)
-		Param:  `{Id:\"ZYX123CBA\"}`,
-		Expect: `{}`,
-	},
-	{
-		Name:   "Test DeleteDevice",
-		Method: "DeleteDevice", // rpc DeleteDevice(ID) returns(google.protobuf.Empty)
-		Param:  `{Id:\"CBA123XYZ\"}`,
-		Expect: `{}`,
-	},
-	{
-		Name:   "Test DownloadImage",
-		Method: "DownloadImage", // rpc DownloadImage(ImageDownload) returns(OperationResp)
-		Param:  `{Id:\"CBA321XYZ\", Name:\"Image-1\", Crc: 54321}`,
-		Expect: `{Code:voltha.OperationResp_OPERATION_SUCCESS, AdditionalInfo:\"It worked!\"}`,
-	},
-	{
-		Name:   "Test CancelImageDownload",
-		Method: "CancelImageDownload", // rpc CancelImageDownload(ImageDownload) returns(OperationResp)
-		Param:  `{Id:\"CBA321ZYX\", Name:\"Image-1\", Crc: 54321}`,
-		Expect: `{Code:voltha.OperationResp_OPERATION_SUCCESS, AdditionalInfo:\"It worked!\"}`,
-	},
-	{
-		Name:   "Test ActivateImageUpdate",
-		Method: "ActivateImageUpdate", // rpc ActivateImageUpdate(ImageDownload) returns(OperationResp)
-		Param:  `{Id:\"ABC321ZYX\", Name:\"Image-1\", Crc: 54321}`,
-		Expect: `{Code:voltha.OperationResp_OPERATION_FAILURE, AdditionalInfo:\"It bombed!\"}`,
-	},
-	{
-		Name:   "Test RevertImageUpdate",
-		Method: "RevertImageUpdate", // rpc RevertImageUpdate(ImageDownload) returns(OperationResp)
-		Param:  `{Id:\"ABC123ZYX\", Name:\"Image-1\", Crc: 54321}`,
-		Expect: `{Code:voltha.OperationResp_OPERATION_FAILURE, AdditionalInfo:\"It bombed!\"}`,
-	},
-	{
-		Name:   "Test UpdateDevicePmConfigs",
-		Method: "UpdateDevicePmConfigs", // rpc UpdateDevicePmConfigs(voltha.PmConfigs) returns(google.protobuf.Empty)
-		Param:  `{Id:\"CBA123ZYX\", DefaultFreq:1000000, Grouped: false, FreqOverride: false}`,
-		Expect: `{}`,
-	},
-	{
-		Name:   "Test CreateEventFilter",
-		Method: "CreateEventFilter", // rpc CreateEventFilter(EventFilter) returns(EventFilter)
-		//		Param:  `{Id:\"abc123xyz\", Rules:[]*voltha.EventFilterRule{&voltha.AlarmFilterRule{Key:voltha.AlarmFilterRuleKey_type, Value:\"Type man, it's the type!\"}, &voltha.AlarmFilterRule{Key:voltha.AlarmFilterRuleKey_category, Value:\"Category yeah!\"}}}`,
-		Param:  `{Id:\"abc123xyz\", DeviceId: \"Device123\", Enable: True, EventType: \"device_event\", Rules:[]*voltha.EventFilterRule{&voltha.EventFilterRule{Key:voltha.EventFilterRuleKey_category, Value:\"Equipment\"}, &voltha.EventFilterRule{Key:voltha.EventFilterRuleKey_sub_category, Value:\"ONU\"}, &voltha.EventFilterRule{Key:voltha.EventFilterRuleKey_device_event_type, Value:\"dying_gasp_event\"}}}`,
-		Expect: `{Id:\"abc123xyz\", DeviceId: \"Device123\", Enable: True, EventType: \"device_event\", Rules:[]*voltha.EventFilterRule{&voltha.EventFilterRule{Key:voltha.EventFilterRuleKey_category, Value:\"Equipment\"},     &voltha.EventFilterRule{Key:voltha.EventFilterRuleKey_sub_category, Value:\"ONU\"}, &voltha.EventFilterRule{Key:voltha.EventFilterRuleKey_device_event_type, Value:\"dying_gasp_event\"}}}`,
-	},
-	{
-		Name:   "Test UpdateEventFilter",
-		Method: "UpdateEventFilter", // rpc UpdateEventFilter(EventFilter) returns(EventFilter)
-		Param:  `{Id:\"abc123xyz\", DeviceId: \"Device123\", Enable: True, EventType: \"device_event\", Rules:[]*voltha.EventFilterRule{&voltha.EventFilterRule{Key:voltha.EventFilterRuleKey_category, Value:\"Equipment\"}, &voltha.EventFilterRule{Key:voltha.EventFilterRuleKey_sub_category, Value:\"ONU\"}, &voltha.EventFilterRule{Key:voltha.EventFilterRuleKey_device_event_type, Value:\"dying_gasp_event\"}}}`,
-		Expect: `{Id:\"abc123xyz\", DeviceId: \"Device123\", Enable: True, EventType: \"device_event\", Rules:[]*voltha.EventFilterRule{&voltha.EventFilterRule{Key:voltha.EventFilterRuleKey_category, Value:\"Equipment\"}, &voltha.EventFilterRule{Key:voltha.EventFilterRuleKey_sub_category, Value:\"ONU\"}, &voltha.EventFilterRule{Key:voltha.EventFilterRuleKey_device_event_type, Value:\"dying_gasp_event\"}}}`,
-	},
-	{
-		Name:   "Test DeleteEventFilter",
-		Method: "DeleteEventFilter", // rpc DeleteEventFilter(EventFilter) returns(google.protobuf.Empty)
-		Param:  `{Id:\"acb123xyz\"}`,
-		Expect: `{}`,
-	},
-	{
-		Name:   "Test SelfTest",
-		Method: "SelfTest", // rpc SelfTest(ID) returns(SelfTestResponse)
-		Param:  `{Id:\"bac123xyz\"}`,
-		Expect: `{Result:voltha.SelfTestResponse_UNKNOWN_ERROR}`,
-	},
-} /*
-//    "StreamPacketsOut", // rpc StreamPacketsOut(stream openflow_13.PacketOut)
-//    "ReceivePacketsIn", // rpc ReceivePacketsIn(google.protobuf.Empty)
-//    "ReceiveChangeEvents", // rpc ReceiveChangeEvents(google.protobuf.Empty)
-    "Subscribe ", // rpc Subscribe (OfAgentSubscriber) returns (OfAgentSubscriber)
-
-}
-*/
-
-func dumpFile(fileNm string) error {
-	// Dump the generated file for debugging purposes
-	if c, err := ioutil.ReadFile(fileNm); err == nil {
-		fmt.Print(string(c))
-	} else {
-		e := errors.New(fmt.Sprintf("Could not read the file '%s', %v", fileNm, err))
-		return e
-	}
-	return nil
-}
-
-func main() {
-
-	//var rwAry []test
-	//var roAry []test
-	var serNo int = 0
-
-	// Setup logging
-	if _, err := log.SetDefaultLogger(log.JSON, 0, nil); err != nil {
-		log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
-	}
-
-	core := 0
-	for k, _ := range roMethods {
-		roMethods[k].SerNo = serNo
-		roMethods[k].Core = (core % 3) + 1
-		log.Infof("Processing method %s, serNo: %d", roMethods[k].Method, roMethods[k].SerNo)
-		serNo++
-		core++
-	}
-
-	// New round robin starts here because of the different route
-	core = 0
-	for k, _ := range rwMethods {
-		rwMethods[k].SerNo = serNo
-		rwMethods[k].Core = (core % 3) + 1
-		log.Infof("Processing method %s, serNo: %d", rwMethods[k].Method, rwMethods[k].SerNo)
-		serNo++
-		core++
-	}
-
-	// New round robin starts here because of the different route
-	core = 0
-	for k, _ := range ctlMethods {
-		ctlMethods[k].SerNo = serNo
-		ctlMethods[k].Core = (core % 3) + 1
-		log.Infof("Processing method %s, serNo: %d", ctlMethods[k].Method, ctlMethods[k].SerNo)
-		serNo++
-		core++
-	}
-
-	tsts := tests{RoTests: roMethods, RwTests: rwMethods, CtlTests: ctlMethods}
-
-	t := template.Must(template.New("").ParseFiles("./test3.tmpl.json"))
-	if f, err := os.Create("test3.json"); err == nil {
-		_ = f
-		defer f.Close()
-		if err := t.ExecuteTemplate(f, "test3.tmpl.json", tsts); err != nil {
-			log.Errorf("Unable to execute template for test3.tmpl.json: %v", err)
-		}
-	} else {
-		log.Errorf("Couldn't create file test3.json: %v", err)
-	}
-
-	// Dump the generated file for debugging purposes
-	//if err := dumpFile("test3.json"); err != nil {
-	//	log.Error(err)
-	//}
-
-}
diff --git a/tests/afrouter/suites/test3/test3.tmpl.json b/tests/afrouter/suites/test3/test3.tmpl.json
deleted file mode 100644
index 75d678b..0000000
--- a/tests/afrouter/suites/test3/test3.tmpl.json
+++ /dev/null
@@ -1,252 +0,0 @@
-{
-	"environment":{
-		"cmdLine":"afrouter -config arouter_test.json -logLevel 1",
-		"protoFiles": [
-			{
-				"importPath":"github.com/opencord/voltha-protos/v3/go/",
-				"service":"VolthaService",
-				"package":"voltha"
-			},
-			{
-				"importPath":"github.com/opencord/voltha-protos/v3/go/",
-				"service":"Configuration",
-				"package":"afrouter"
-			}
-		],
-		"imports": [
-			"github.com/golang/protobuf/ptypes/empty",
-			"github.com/opencord/voltha-protos/v3/go/openflow_13",
-			"github.com/opencord/voltha-protos/v3/go/common"
-		],
-		"protoDesc":"voltha.pb",
-		"protoSubst": [
-			{
-				"from":"google.protobuf.Empty",
-				"to":"empty.Empty"
-			}
-		],
-		"clients": {
-			"imports": [
-				"github.com/golang/protobuf/ptypes/empty",
-				"github.com/opencord/voltha-protos/v3/go/openflow_13",
-				"github.com/opencord/voltha-protos/v3/go/common"
-			],
-			"endpoints": [
-				{
-					"name":"client",
-					"port":"5000"
-				},
-				{
-					"name":"stats",
-					"port":"55554"
-				}
-			]
-		},
-		"servers": {
-			"imports": [
-				"github.com/golang/protobuf/ptypes/empty",
-				"github.com/opencord/voltha-protos/v3/go/openflow_13",
-				"github.com/opencord/voltha-protos/v3/go/omci",
-				"github.com/opencord/voltha-protos/v3/go/common"
-			],
-			"endpoints": [
-			{
-				"name":"core11",
-				"port":"5011"
-			},
-			{
-				"name":"core12",
-				"port":"5012"
-			},
-			{
-				"name":"core21",
-				"port":"5021"
-			},
-			{
-				"name":"core22",
-				"port":"5022"
-			},
-			{
-				"name":"core31",
-				"port":"5031"
-			},
-			{
-				"name":"core32",
-				"port":"5032"
-			},
-			{
-				"name":"roCore1",
-				"port":"5001"
-			},
-			{
-				"name":"roCore2",
-				"port":"5002"
-			},
-			{
-				"name":"roCore3",
-				"port":"5003"
-			}
-			]
-		}
-	},
-	"tests":[
-		{{range $k,$v := .RoTests}}
-		{
-			"name":"{{$v.Name}}",
-			"send": {
-				"client":"client",
-				"method":"{{$v.Method}}",
-				"param":"{{$v.Param}}",
-				"expect":"{{$v.Expect}}",
-				"_meta":""
-			},
-			"servers": [
-				{
-					"name":"core{{$v.Core}}1",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"{{$v.SerNo}}"
-						}
-					]
-				},
-				{
-					"name":"core{{$v.Core}}2",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"{{$v.SerNo}}"
-						}
-					]
-				}
-			]
-		},
-		{{end}}
-		{{range $k,$v := .RwTests}}
-		{
-			"name":"{{$v.Name}}",
-			"send": {
-				"client":"client",
-				"method":"{{$v.Method}}",
-				"param":"{{$v.Param}}",
-				"expect":"{{$v.Expect}}",
-				"_meta":""
-			},
-			"servers": [
-				{
-					"name":"core{{$v.Core}}1",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"{{$v.SerNo}}"
-						}
-					]
-				},
-				{
-					"name":"core{{$v.Core}}2",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"{{$v.SerNo}}"
-						}
-					]
-				}
-			]
-		},
-		{{end}}
-		{{range $k,$v := .CtlTests}}
-		{
-			"name":"{{$v.Name}}",
-			"send": {
-				"client":"client",
-				"method":"{{$v.Method}}",
-				"param":"{{$v.Param}}",
-				"expect":"{{$v.Expect}}",
-				"_meta":""
-			},
-			"servers": [
-				{
-					"name":"core{{$v.Core}}1",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"{{$v.SerNo}}"
-						}
-					]
-				},
-				{
-					"name":"core{{$v.Core}}2",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"{{$v.SerNo}}"
-						}
-					]
-				}
-			]
-		},
-		{{end}}
-		{
-			"name":"Test Subscribe",
-			"send": {
-				"client":"client",
-				"method":"Subscribe",
-				"param":"{OfagentId:\"Agent007\"}",
-				"meta": [
-					{
-						"key":"voltha_backend_name",
-						"value":""
-					}
-				],
-				"expect":"{OfagentId:\"Agent007\",VolthaId:\"core11\"}",
-				"expectMeta": [
-					{
-						"key":"voltha_backend_name",
-						"value":"vcore1"
-					}
-				]
-			},
-			"servers": [
-				{
-					"name":"core11",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"44"
-						},
-						{
-							"key":"voltha_backend_name",
-							"value":""
-						}
-					]
-				},
-				{
-					"name":"core12",
-					"meta": [
-						{
-							"key":"voltha_serial_number",
-							"value":"44"
-						},
-						{
-							"key":"voltha_backend_name",
-							"value":""
-						}
-					]
-				}
-			]
-		},
-		{
-			"_COMMENT":"If this test case fails, there could be a goroutine leak",
-			"name":"Get goroutine count",
-			"send": {
-				"client":"stats",
-				"method":"GetGoroutineCount",
-				"param":"{}",
-				"meta": [ ],
-				"expect":"{Count:43}",
-				"expectMeta": [ ]
-			},
-			"servers": [ ]
-		}
-	]
-}
diff --git a/tests/afrouter/templates/client.go.tmpl b/tests/afrouter/templates/client.go.tmpl
deleted file mode 100644
index 79bad83..0000000
--- a/tests/afrouter/templates/client.go.tmpl
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package main
-
-import (
-	"fmt"
-	"errors"
-	"encoding/json"
-	"google.golang.org/grpc"
-	"golang.org/x/net/context"
-	"google.golang.org/grpc/metadata"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	// Values generated by the go template
-	{{range .Imports}}
-	"{{.}}"
-	{{end}}
-	{{range .ProtoImports}}
-	{{.Short}} "{{.Package}}"
-	{{end}}
-	// End go template values
-)
-
-{{if .Ct}}{{else}}
-type clientCtl struct {
-	send func(string, context.Context, interface{}, string, metadata.MD) error
-	cncl  context.CancelFunc
-	ctx context.Context
-}
-{{end}}
-
-type {{.Name}}ClientConn struct {
-	conn * grpc.ClientConn
-	control * clientCtl
-}
-
-
-var {{.Name}}Client *{{.Name}}ClientConn
-
-
-func {{.Name}}Connect() (*{{.Name}}ClientConn, error)  {
-	log.Infof("Connecting client {{.Name}} to addr:127.0.0.1, port:{{.Port}}")
-	// Dial doesn't block, it just returns and continues connecting in the background.
-	// Check back later to confirm and increase the connection count.
-	cl := &{{.Name}}ClientConn{control:&clientCtl{}}
-	ctx, cnclFnc := context.WithCancel(context.Background())
-	cl.control.cncl = cnclFnc
-	cl.control.ctx = ctx
-	if conn, err := grpc.Dial("127.0.0.1:{{.Port}}", grpc.WithInsecure()); err != nil {
-		log.Errorf("Dialng connection :%v",err)
-		return nil, err
-	} else {
-		cl.conn = conn
-	}
-	{{.Name}}Client = cl
-	cl.control.send = {{.Name}}Send
-	clients["{{.Name}}"] = cl.control
-	return cl, nil
-}
-
-// This function will make the requested RPC with the supplied
-// parameter and validate that the response matches the expected
-// value provided. It will return nil if successful or an error
-// if not.
-func {{.Name}}Send(mthd string, ctx context.Context, param interface{},
-					expect string, expectMeta metadata.MD) error {
-	switch mthd {
-	{{range .Methods}}
-	case "{{.Name}}":
-		var hdr metadata.MD
-		switch param.(type) {
-		case *{{.Param}}:
-	{{if .Ss}}
-			_=hdr
-	{{else if .Cs}}
-			_=hdr
-	{{else}}
-			client := {{.Pkg}}.New{{.Svc}}Client({{$.Name}}Client.conn)
-			res, err := client.{{.Name}}(ctx, param.(*{{.Param}}), grpc.Header(&hdr))
-			if err != nil {
-				return errors.New("Error sending method {{.Name}}")
-			}
-			// Marshal the result and compare it to the expected
-			// value.
-			if resS,err := json.Marshal(res); err == nil {
-				if string(resS) != expect {
-					stats.testLog("Unexpected result returned expected '%s' got '%s'\n", expect, string(resS))
-					return errors.New("Unexpected result on method {{.Name}}")
-				}
-			} else {
-				return errors.New("Error Marshaling the reply for method {{.Name}}")
-			}
-			// Now validate the metadata in the response
-			for k,v := range expectMeta {
-				if rv,ok := hdr[k]; ok == true {
-					if rv[0] != v[0] {
-						stats.testLog("Mismatch on returned metadata for key '%s' expected '%s' and got '%s'\n", k, v, rv)
-						err = errors.New("Failure on returned metadata")
-					}
-				} else {
-					stats.testLog("Returned metadata missing key '%s'; expected value '%s' at that key\n", k, v)
-					err = errors.New("Failure on returned metadata")
-				}
-			}
-			return err
-		default:
-			return errors.New("Invalid parameter type for method {{.Name}}")
-	{{end}}
-		}
-	{{end}}
-		default:
-			return errors.New(fmt.Sprintf("Unexpected method %s in send", mthd))
-	}
-	return nil
-}
-
diff --git a/tests/afrouter/templates/clientInit.go.tmpl b/tests/afrouter/templates/clientInit.go.tmpl
deleted file mode 100644
index e8f4836..0000000
--- a/tests/afrouter/templates/clientInit.go.tmpl
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package main
-
-var clients map[string]*clientCtl
-
-func clientInit() error {
-	clients = make(map[string]*clientCtl)
-	{{range .}}
-	if _,err := {{.Name}}Connect(); err != nil {
-		return err
-	}
-	{{end}}
-	return nil
-}
-
-
diff --git a/tests/afrouter/templates/main.go.tmpl b/tests/afrouter/templates/main.go.tmpl
deleted file mode 100644
index f1bb3ed..0000000
--- a/tests/afrouter/templates/main.go.tmpl
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-// The template for the tester.
-// This template is filled in by the
-// test driver based on the configuration.
-
-package main
-
-import (
-	"os"
-	"time"
-	"os/exec"
-	"strings"
-	"context"
-	//slog "log"
-	//"google.golang.org/grpc/grpclog"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-)
-
-func startSut(cmdStr string) (*exec.Cmd, context.CancelFunc, error) {
-	var err error = nil
-
-	cmdAry := strings.Fields(cmdStr)
-	log.Infof("Running the affinity router: %s",cmdStr)
-	//ctx, cncl := context.WithCancel(context.Background())
-	ctx, cncl := context.WithCancel(context.Background())
-	cmd := exec.CommandContext(ctx, cmdAry[0], cmdAry[1:]...)
-	cmd.Stdin = os.Stdin
-	cmd.Stdout = os.Stdout
-	cmd.Stderr = os.Stderr
-	if err = cmd.Start(); err != nil {
-		log.Errorf("Failed to run the affinity router: %s %v", cmdStr,err)
-	}
-	time.Sleep(1 * time.Second) // Give the command time to get started
-	return cmd, cncl, err
-}
-
-func cleanUp(cmd *exec.Cmd, cncl context.CancelFunc) {
-	cncl()
-	cmd.Wait()
-}
-
-func main() {
-	var err error
-
-	// Setup logging
-	if _, err = log.SetDefaultLogger(log.JSON, 1, nil); err != nil {
-		log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
-	}
-	defer log.CleanUp()
-
-	if len(os.Args) < 2 {
-		log.Fatalf("Stat file name parameter missing for %s. Aborting...", os.Args[0])
-	} else {
-		statFn = os.Args[1]
-	}
-
-	if stats,err = readStats(statFn); err != nil {
-		log.Error(err)
-		return
-	}
-	defer writeStats(statFn, stats)
-
-	// Add a stat entry for this run
-
-	stats.appendNew()
-	tsIdx :=  len(stats.TestSuites) - 1
-	stats.TestSuites[tsIdx].Name = os.Args[0]
-
-
-	// Initialize the servers
-	if err := serverInit(); err != nil {
-		log.Errorf("Error initializing server: %v", err)
-		return
-	}
-
-	// Start the sofware under test
-	cmd, cnclFunc, err := startSut("./{{.Command}}");
-	defer cleanUp(cmd, cnclFunc)
-	if  err != nil {
-		return
-	}
-
-	// Initialize the clients
-	if err := clientInit(); err != nil {
-		log.Errorf("Error initializing client: %v", err)
-		return
-	}
-
-	log.Infof("The servers are: %v",servers)
-
-	// Run all the test cases now
-	log.Infof("Executing tests")
-
-	//log.Infof("Stats struct: %v", stats)
-	runTests()
-
-}
diff --git a/tests/afrouter/templates/runAll.go.tmpl b/tests/afrouter/templates/runAll.go.tmpl
deleted file mode 100644
index d270b68..0000000
--- a/tests/afrouter/templates/runAll.go.tmpl
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-// The template for the tester.
-// This template is filled in by the
-// test driver based on the configuration.
-
-package main
-
-import (
-	"os"
-	//"time"
-	"fmt"
-	"os/exec"
-	"io/ioutil"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-)
-
-
-func main() {
-	var cmd *exec.Cmd
-	var cmdStr string
-	// Setup logging
-	if _, err := log.SetDefaultLogger(log.JSON, 0, nil); err != nil {
-		log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
-	}
-
-	defer log.CleanUp()
-
-	statFn = "stats.json"
-
-	log.Info("Running tests")
-	if err:= os.Chdir(os.Args[1]); err != nil {
-		log.Error("Could not change directory to %s: %v", os.Args[1], err)
-	}
-
-	if err := initStats(statFn); err != nil {
-		log.Error(err)
-		return
-	}
-
-	{{range .}}
-	cmdStr =  "./"+"{{.}}"+".e"
-
-	log.Infof("Running test suite %s",cmdStr)
-	cmd = exec.Command(cmdStr, statFn)
-	cmd.Stdin = os.Stdin
-	cmd.Stdout = os.Stdout
-	cmd.Stderr = os.Stderr
-	if err := cmd.Run(); err != nil {
-		log.Errorf("Test '%s' failed", cmdStr)
-	}
-	{{end}}
-	// Open the results file and output it.
-	if s,err := readStats(statFn); err != nil {
-		log.Error(err)
-		return
-	} else {
-		stats = s
-	}
-
-	//log.Infof("Stats are: %v", stats)
-	if resFile, err := ioutil.ReadFile(statFn); err == nil {
-		fmt.Println(string(resFile))
-	} else {
-		log.Error("Could not load the stats file 'stats.json'")
-	}
-	fmt.Println("Test result summary")
-	for _,v := range stats.TestSuites {
-		fmt.Printf("Test suite: %s\n", v.Name[2:len(v.Name)-2])
-		pass := 0
-		fail := 0
-		total := 0
-		for _,v1 := range v.TestCases {
-			total++
-			if v1.Result == true {
-				pass++
-			} else {
-				fail++
-			}
-		}
-		fmt.Printf("\tTotal test cases: %d\n", total)
-		fmt.Printf("\t\tTotal passed test cases: %d\n", pass)
-		fmt.Printf("\t\tTotal failed test cases: %d\n", fail)
-	}
-	log.Info("Tests complete")
-}
diff --git a/tests/afrouter/templates/runTests.go.tmpl b/tests/afrouter/templates/runTests.go.tmpl
deleted file mode 100644
index 62b938d..0000000
--- a/tests/afrouter/templates/runTests.go.tmpl
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package main
-
-import (
-{{if .HasFuncs}}
-	"fmt"
-	"time"
-	"errors"
-	"context"
-	"encoding/json"
-	//"golang.org/x/net/context"
-	"google.golang.org/grpc/metadata"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-{{end}}
-	{{range .Imports}}
-	{{if .Used}}
-	"{{.Package}}"
-	{{end}}
-	{{end}}
-	{{range .ProtoImports}}
-	{{if .Used}}
-	{{.Short}} "{{.Package}}"
-	{{end}}
-	{{end}}
-)
-
-
-{{if .FileNum}}
-{{else}}
-var glCtx context.Context
-
-func resetChannels() {
-	// Drain all channels of data
-	for _,v := range servers {
-		done := false
-		for {
-			select {
-			case _ = <-v.incmg:
-			case _ = <-v.replyData:
-			default:
-				done = true
-			}
-			if done == true {
-				break
-			}
-		}
-	}
-}
-
-type testData struct {
-	function func(int, string, string, []string,[]string,[]string,
-				  map[string][]string,interface{}, interface{}) error
-	testNum int
-	testName string
-	sendClient string
-	srvrs []string
-	sendMeta []string
-	expectMeta []string // Send Meta
-	srvMeta map[string][]string
-	parm interface{}
-	ret interface{}
-}
-
-func addTestSlot(stats * TestRun) {
-	tsIdx := len(stats.TestSuites) - 1
-	stats.TestSuites[tsIdx].TestCases =
-			append(stats.TestSuites[tsIdx].TestCases, TestCase{Info:[]string{}})
-}
-{{end}}
-
-{{if .FileNum}}
-func runTests{{.FileNum}}() {
-{{else}}
-func runTests() {
-{{end}}
-	tsIdx := len(stats.TestSuites) - 1
-	tests := []testData {
-	{{$ofs := .Offset}}
-	{{range $k,$v := .Tests}}
-	testData {
-		{{$v.Send.Method}}_test,
-		{{$k}} + {{$ofs}},
-		"{{$v.Name}}",
-		"{{$v.Send.Client}}",
-		[]string{ {{range $sk,$sv := $v.Srvr}} "{{$sv.Name}}",{{end}} },
-		[]string{ {{range $mk,$mv := $v.Send.MetaData}}"{{$mv.Key}}","{{$mv.Val}}",{{end}} },
-		[]string{ {{range $mk,$mv := $v.Send.ExpectMeta}}"{{$mv.Key}}","{{$mv.Val}}",{{end}} },
-		map[string][]string {
-		{{range $sk,$sv := $v.Srvr}}
-			"{{$sv.Name}}":[]string {
-			{{range $mk, $mv := $sv.Meta}}
-				 "{{$mv.Key}}","{{$mv.Val}}",
-			{{end}}
-			},
-		{{end}}
-		},
-		&{{$v.Send.ParamType}}{{$v.Send.Param}},
-		&{{$v.Send.ExpectType}}{{$v.Send.Expect}},
-	},
-	{{end}}
-	}
-
-	for _,v := range tests {
-		addTestSlot(stats)
-		stats.TestSuites[tsIdx].TestCases[v.testNum].Title = v.testName
-		if err := v.function(
-			v.testNum,
-			v.testName,
-			v.sendClient,
-			v.srvrs,
-			v.sendMeta,
-			v.expectMeta,
-			v.srvMeta,
-			v.parm,
-			v.ret); err != nil {
-			stats.TestSuites[tsIdx].TestCases[v.testNum].Result = false
-		} else {
-			stats.TestSuites[tsIdx].TestCases[v.testNum].Result = true
-		}
-	}
-	{{if .FileNum}}
-	{{else}}
-	{{range $k,$v := .RunTestsCallList}}
-	{{$v}}()
-	{{end}}
-	{{end}}
-	return
-	//resetChannels()
-}
-
-{{range $k,$v := .Funcs }}
-{{if $v.CodeGenerated}}
-{{else}}
-func {{$k}}_test(testNum int, testName string, sendClient string, srvrs []string,
-				 sendMeta []string, expectMeta []string, srvrMeta map[string][]string,
-				 parm interface{}, ret interface{}) error {
-
-	var rtrn error = nil
-	var cancel context.CancelFunc
-	var repl *reply
-
-	log.Debug("Running Test %d",testNum)
-	glCtx, cancel = context.WithTimeout(context.Background(), 900*time.Millisecond)
-	defer cancel()
-
-	cl := clients[sendClient]
-	// Create the server's reply data structure
-	switch r := ret.(type) {
-	case *{{$v.ReturnType}}:
-		repl = &reply{repl:r}
-	default:
-		log.Errorf("Invalid type in call to {{$k}}_test expecting {{$v.ReturnType}} got %T", ret)
-	}
-	// Send the reply data structure to each of the servers
-	for _,v := range srvrs {
-		if servers[v] == nil {
-			err := errors.New(fmt.Sprintf("Server %s is nil", v))
-			log.Error(err)
-			return err
-		}
-		// Start a go routine to send the the reply data to the
-		// server. The go routine blocks until the server picks
-		// up the data or the timeout is exceeded.
-		go func (ctx context.Context, srv string) {
-			select {
-			case servers[srv].replyData <- repl:
-			case <-ctx.Done():
-				rtrn := errors.New(fmt.Sprintf("Could not provide server %s with reply data",srv))
-				log.Error(rtrn)
-				stats.testLog("%s\n", rtrn.Error())
-			}
-		}(glCtx,v)
-	}
-
-	// Now call the RPC with the data provided
-	if expct,err := json.Marshal(repl.repl); err != nil {
-		log.Errorf("Marshaling the reply for test %s: %v",testName, err)
-	} else {
-		// Create the context for the call
-		ctx := context.Background()
-		for i:=0; i<len(sendMeta); i += 2 {
-			ctx = metadata.AppendToOutgoingContext(ctx, sendMeta[i], sendMeta[i+1])
-		}
-		var md map[string]string = make(map[string]string)
-		for i:=0; i<len(expectMeta); i+=2 {
-			md[expectMeta[i]] = expectMeta[i+1]
-		}
-		expectMd := metadata.New(md)
-		if err := cl.send("{{$k}}", ctx, parm, string(expct), expectMd); err != nil {
-			log.Errorf("Test case %s failed!: %v", testName, err)
-			rtrn = err
-		}
-	}
-
-	// Now read the servers' information to validate it
-	var s *serverCtl
-	var payload string
-	var i *incoming
-	if pld, err := json.Marshal(parm); err != nil {
-		log.Errorf("Marshaling paramter for test %s: %v", testName, err)
-	} else {
-		payload = string(pld)
-	}
-	for _,v := range srvrs {
-		s = servers[v]
-		// Oddly sometimes the data isn't in the channel yet when we come to read it.
-		select {
-		case i = <-s.incmg:
-			if i.payload != payload {
-				rtrn = errors.New(fmt.Sprintf("Mismatched payload expected '%s', got '%s'", payload, i.payload))
-				log.Error(rtrn.Error())
-				stats.testLog("%s\n", rtrn.Error())
-			}
-			for j:=0; j<len(srvrMeta[v]); j+=2 {
-				if mv,ok := i.meta[srvrMeta[v][j]]; ok == true {
-					if srvrMeta[v][j+1] != mv[0] {
-						rtrn=errors.New(fmt.Sprintf("Mismatched metadata on server '%s' expected '%s', got '%s'", srvrMeta[v][j], srvrMeta[v][j+1], mv[0]))
-						log.Error(rtrn.Error())
-						stats.testLog("%s\n", rtrn.Error())
-					}
-				}
-			}
-		case <-glCtx.Done():
-			rtrn = errors.New(fmt.Sprintf("Timeout: no response data available for server %s (%s)", v, testName))
-			stats.testLog("%s\n", rtrn.Error())
-			log.Error(rtrn)
-		}
-	}
-
-	return rtrn
-}
-{{end}}
-{{end}}
diff --git a/tests/afrouter/templates/server.go.tmpl b/tests/afrouter/templates/server.go.tmpl
deleted file mode 100644
index 0830b12..0000000
--- a/tests/afrouter/templates/server.go.tmpl
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-// The template for the tester.
-// This template is filled in by the
-// test driver based on the configuration.
-
-package main
-
-import (
-	"fmt"
-	"net"
-	"errors"
-	"encoding/json"
-	"google.golang.org/grpc"
-	"golang.org/x/net/context"
-	"google.golang.org/grpc/metadata"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	// Values generated by the go template
-	{{range .Imports}}
-	"{{.}}"
-	{{end}}
-	{{range .ProtoImports}}
-	{{.Short}} "{{.Package}}"
-	{{end}}
-	// End go template values
-)
-
-// The channels to get fed the expected results by the test driver.
-//var {{.Name}}Meta <-chan string
-////var {{.Name}}Payload <-chan string
-
-{{if .Ct}}{{else}}
-type reply struct {
-	repl interface{}
-}
-type incoming struct {
-	meta metadata.MD
-	payload string
-}
-type  serverCtl struct {
-	replyData chan * reply
-	incmg chan * incoming
-}
-{{end}}
-
-type {{.Name}}TestServer struct {
-	control *serverCtl
-	srv *grpc.Server
-}
-
-/*
-func init() {
-	{{if .Ct}}{{else}}
-	if _, err := log.SetDefaultLogger(log.JSON, 0, nil); err != nil {
-		log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
-	}
-	{{end}}
-	{{.Name}}ListenAndServe()
-}
-*/
-
-
-func {{.Name}}ListenAndServe() error {
-	var s {{.Name}}TestServer
-
-	s.control = &serverCtl{replyData:make(chan *reply), incmg:make(chan *incoming)}
-	servers["{{.Name}}"] = s.control
-
-	log.Debugf("Starting server %s on port %d", "{{.Name}}", {{.Port}})
-	// THe test head always uses localhost 127.0.0.1
-	addr := fmt.Sprintf("127.0.0.1:%d", {{.Port}})
-
-	// Create the gRPC server
-	s.srv = grpc.NewServer()
-
-{{range .ProtoImports}}
-	// Register the handler object
-	{{.Short}}.Register{{.Service}}Server(s.srv, s)
-{{end}}
-
-	// Create the channel to listen on
-	lis, err := net.Listen("tcp", addr)
-	if err != nil {
-		log.Errorf("could not listen on %s: %s", addr, err)
-		return err
-	}
-
-	// Serve and Listen
-	go func() {
-		if err = s.srv.Serve(lis); err != nil {
-			log.Errorf("grpc serve error: %s", err)
-			return
-		}
-	}()
-
-	return err
-}
-
-{{range .Methods}}
-{{if .Ss}}
-func (ts {{$.Name}}TestServer) {{.Name}}(in *{{.Param}}, srvr {{.Pkg}}.{{.Svc}}_{{.Name}}Server) error {
-	log.Debug("Serving server streaming {{$.Name}}")
-	return nil
-}
-{{else if .Cs}}
-func (ts {{$.Name}}TestServer) {{.Name}}({{.Pkg}}.{{.Svc}}_{{.Name}}Server) error {
-	log.Debug("Serving client streaming {{$.Name}}")
-	return nil
-}
-{{else}}
-func  (ts {{$.Name}}TestServer) {{.Name}}(ctx context.Context, in *{{.Param}}) (*{{.Rtrn}}, error) {
-	var r * incoming = &incoming{}
-	//log.Debug("Serving {{$.Name}}")
-	// Read the metadata
-	if md,ok := metadata.FromIncomingContext(ctx); ok == false {
-		log.Error("Getting matadata during call to {{.Name}}")
-	} else {
-		r.meta = md.Copy()
-	}
-	// Read the data sent to the function
-	if parm,err := json.Marshal(in); err != nil {
-		log.Error("Marshalling the {{.Param}} for {{.Name}}")
-	} else {
-		r.payload = string(parm)
-	}
-	// Send the server information back to the test framework
-	go func(ctx context.Context) {
-		select {
-		case ts.control.incmg <- r:
-			return
-		case <-ctx.Done():
-			return
-
-		}
-	}(glCtx)
-	// Read the value that needs to be returned from the channel
-	select {
-	case d := <-ts.control.replyData:
-		switch r := d.repl.(type) {
-			case *{{.Rtrn}}:
-				return r, nil
-			default:
-				return nil, errors.New("Mismatched type in call to {{.Name}}")
-		}
-	case <-glCtx.Done():
-		return nil, errors.New("Timeout: nothing in the reply data channel in call to {{.Name}}, sending nil")
-	}
-	return &{{.Rtrn}}{},nil
-}
-{{end}}
-{{end}}
-
diff --git a/tests/afrouter/templates/serverInit.go.tmpl b/tests/afrouter/templates/serverInit.go.tmpl
deleted file mode 100644
index e97e6ff..0000000
--- a/tests/afrouter/templates/serverInit.go.tmpl
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package main
-
-var servers map[string]*serverCtl
-
-func serverInit() error {
-	servers = make(map[string]*serverCtl)
-	{{range .}}
-	if err := {{.Name}}ListenAndServe(); err != nil {
-		return err
-	}
-	{{end}}
-	return nil
-}
-
-
diff --git a/tests/afrouter/templates/stats.go.tmpl b/tests/afrouter/templates/stats.go.tmpl
deleted file mode 100644
index 3eb4008..0000000
--- a/tests/afrouter/templates/stats.go.tmpl
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-// The template for the tester.
-// This template is filled in by the
-// test driver based on the configuration.
-
-package main
-
-import (
-	"os"
-	"fmt"
-	//slog "log"
-	"io/ioutil"
-	"encoding/json"
-	//"google.golang.org/grpc/grpclog"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-)
-
-type TestCase struct {
-	Title string `json:"title"`
-	Result bool `json:"passed"`
-	Info []string `json:"info"`
-}
-
-type TestSuite struct {
-	Name string `json:"name"`
-	Info []string `json:"info"`
-	TestCases []TestCase `json:"testCases"`
-}
-
-type TestRun struct {
-	TestSuites []TestSuite
-}
-
-func (tr * TestRun) testLog(format string, a ...interface{}) {
-
-	tridx := len(tr.TestSuites) - 1
-	tcidx := len(tr.TestSuites[tridx].TestCases) - 1
-
-	tr.TestSuites[tridx].TestCases[tcidx].Info =
-			append(tr.TestSuites[tridx].TestCases[tcidx].Info, fmt.Sprintf(format, a...))
-
-}
-
-func (tr * TestRun) suiteLog(format string, a ...interface{}) {
-
-	tridx := len(tr.TestSuites) - 1
-
-	tr.TestSuites[tridx].Info =
-			append(tr.TestSuites[tridx].Info, fmt.Sprintf(format, a...))
-
-}
-
-func readStats(statFn string) (*TestRun, error) {
-	// Check if the  stats file exists
-	if _,err := os.Stat(statFn); err != nil {
-		// Nothing to do, just return
-		return &TestRun{}, nil
-	}
-	rtrn := &TestRun{}
-	// The file is there, read it an unmarshal it into the stats struct
-	if statBytes, err := ioutil.ReadFile(statFn); err != nil {
-		log.Error(err)
-		return nil, err
-	} else if err := json.Unmarshal(statBytes, rtrn); err != nil {
-		log.Error(err)
-		return nil, err
-	}
-	return rtrn, nil
-}
-
-func writeStats(statFn string, stats * TestRun) error {
-	// Check if the  stats file exists
-	// The file is there, read it an unmarshal it into the stats struct
-	if statBytes, err := json.MarshalIndent(stats, "","    "); err != nil {
-		log.Error(err)
-		return err
-	} else if err := ioutil.WriteFile(statFn+".new", statBytes, 0644); err != nil {
-		log.Error(err)
-		return err
-	}
-	if err := os.Rename(statFn, statFn+"~"); err != nil {
-		log.Error(err)
-		return err
-	}
-	if err := os.Rename(statFn+".new", statFn); err != nil {
-		log.Error(err)
-		return err
-	}
-	return nil
-}
-
-func (tr * TestRun) appendNew() {
-	tr.TestSuites = append(tr.TestSuites, TestSuite{})
-}
-
-func initStats(statFn string) error {
-	s := &TestRun{}
-
-	if statBytes, err := json.MarshalIndent(s, "","    "); err != nil {
-		log.Error(err)
-		return err
-	} else if err := ioutil.WriteFile(statFn, statBytes, 0644); err != nil {
-		log.Error(err)
-		return err
-	}
-
-	return nil
-}
-
-
-var statFn string
-var stats *TestRun
diff --git a/tests/afrouter/tester.go b/tests/afrouter/tester.go
deleted file mode 100644
index b6dcd3c..0000000
--- a/tests/afrouter/tester.go
+++ /dev/null
@@ -1,853 +0,0 @@
-// +build integration
-
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-// gRPC affinity router with active/active backends
-
-package main
-
-import (
-	"encoding/json"
-	"errors"
-	"flag"
-	"fmt"
-	"github.com/golang/protobuf/proto"
-	pb "github.com/golang/protobuf/protoc-gen-go/descriptor"
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"io/ioutil"
-	"math"
-	"os"
-	"os/exec"
-	"path"
-	"regexp"
-	"strconv"
-	"text/template"
-)
-
-const MAX_CT = 500
-
-type TestConfig struct {
-	configFile *string
-	logLevel   *int
-	grpcLog    *bool
-	Suites     []string `json:"suites"`
-}
-
-type Connection struct {
-	Name string `json:"name"`
-	Port string `json:"port"`
-}
-
-type EndpointList struct {
-	Imports   []string     `json:"imports"`
-	Endpoints []Connection `json:"endPoints"`
-}
-
-type ProtoFile struct {
-	ImportPath string `json:"importPath"`
-	Service    string `json:"service"`
-	Package    string `json:"package"`
-}
-
-type ProtoSubst struct {
-	From string `json:"from"`
-	To   string `json:"to"`
-}
-
-type Environment struct {
-	Command     string       `json:"cmdLine"`
-	ProtoFiles  []ProtoFile  `json:"protoFiles"`
-	ProtoDesc   string       `json:"protoDesc"`
-	Clients     EndpointList `json:"clients"`
-	Servers     EndpointList `json:"servers"`
-	Imports     []string     `json:"imports"`
-	ProtoSubsts []ProtoSubst `json:"protoSubst"`
-}
-
-type Rpc struct {
-	Client     string  `json:"client"`
-	Method     string  `json:"method"`
-	Param      string  `json:"param"`
-	Expect     string  `json:"expect"`
-	MetaData   []MetaD `json:"meta"`
-	ExpectMeta []MetaD `json:"expectMeta"`
-}
-
-type MetaD struct {
-	Key string `json:"key"`
-	Val string `json:"value"`
-}
-
-type Server struct {
-	Name string  `json:"name"`
-	Meta []MetaD `json:"meta"`
-}
-
-type Test struct {
-	Name     string   `json:"name"`
-	InfoOnly bool     `json:"infoOnly"`
-	Send     Rpc      `json:"send"`
-	Servers  []Server `json:"servers"`
-}
-
-type TestSuite struct {
-	Env   Environment `json:"environment"`
-	Tests []Test      `json:"tests"`
-}
-
-type ProtoImport struct {
-	Service string
-	Short   string
-	Package string
-	Used    bool
-}
-
-type SendItem struct {
-	Client     string
-	Method     string
-	Param      string
-	ParamType  string
-	Expect     string
-	ExpectType string
-	MetaData   []MetaD
-	ExpectMeta []MetaD
-}
-
-type TestCase struct {
-	Name     string
-	InfoOnly bool
-	Send     SendItem
-	Srvr     []Server
-}
-
-type MethodTypes struct {
-	ParamType     string
-	ReturnType    string
-	CodeGenerated bool
-}
-
-type Import struct {
-	Package string
-	Used    bool
-}
-
-type TestList struct {
-	ProtoImports     []ProtoImport
-	Imports          []Import
-	Tests            []TestCase
-	Funcs            map[string]MethodTypes
-	RunTestsCallList []string
-	FileNum          int
-	//NextFile int
-	HasFuncs bool
-	Offset   int
-}
-
-type ClientConfig struct {
-	Ct           int
-	Name         string
-	Port         string
-	Imports      []string
-	Methods      map[string]*mthd
-	ProtoImports []ProtoImport
-}
-
-type ServerConfig struct {
-	Ct           int
-	Name         string
-	Port         string
-	Imports      []string
-	Methods      map[string]*mthd
-	ProtoImports []ProtoImport
-}
-
-type mthd struct {
-	Pkg   string
-	Svc   string
-	Name  string
-	Param string
-	Rtrn  string
-	Ss    bool // Server streaming
-	Cs    bool // Clieent streaming
-}
-
-func parseCmd() (*TestConfig, error) {
-	config := &TestConfig{}
-	cmdParse := flag.NewFlagSet(path.Base(os.Args[0]), flag.ContinueOnError)
-	config.configFile = cmdParse.String("config", "suites.json", "The configuration file for the affinity router tester")
-	config.logLevel = cmdParse.Int("logLevel", 0, "The log level for the affinity router tester")
-	config.grpcLog = cmdParse.Bool("grpclog", false, "Enable GRPC logging")
-
-	err := cmdParse.Parse(os.Args[1:])
-	if err != nil {
-		//return err
-		return nil, errors.New("Error parsing the command line")
-	}
-	return config, nil
-}
-
-func (conf *TestConfig) loadConfig() error {
-
-	configF, err := os.Open(*conf.configFile)
-	log.Info("Loading configuration from: ", *conf.configFile)
-	if err != nil {
-		log.Error(err)
-		return err
-	}
-
-	defer configF.Close()
-
-	if configBytes, err := ioutil.ReadAll(configF); err != nil {
-		log.Error(err)
-		return err
-	} else if err := json.Unmarshal(configBytes, conf); err != nil {
-		log.Error(err)
-		return err
-	}
-
-	return nil
-}
-
-func (suite *TestSuite) loadSuite(suiteN string) error {
-	// Check if there's a corresponding go file for the suite.
-	// If it is present then the json test suite file is a
-	// template. Compile the go file and run it to process
-	// the template.
-	if _, err := os.Stat(suiteN + "/" + suiteN + ".go"); err == nil {
-		// Compile and run the the go file
-		log.Infof("Suite '%s' is a template, compiling '%s'", suiteN, suiteN+".go")
-		cmd := exec.Command("go", "build", "-o", suiteN+".te", suiteN+".go")
-		cmd.Stdin = os.Stdin
-		cmd.Stdout = os.Stdout
-		cmd.Stderr = os.Stderr
-		cmd.Dir = suiteN
-		if err := cmd.Run(); err != nil {
-			log.Errorf("Error running the compile command:%v", err)
-		}
-		cmd = exec.Command("./" + suiteN + ".te")
-		cmd.Stdin = os.Stdin
-		cmd.Stdout = os.Stdout
-		cmd.Stderr = os.Stderr
-		cmd.Dir = suiteN
-		if err := cmd.Run(); err != nil {
-			log.Errorf("Error running the %s command:%v", suiteN+".te", err)
-		}
-	}
-	suiteF, err := os.Open(suiteN + "/" + suiteN + ".json")
-	log.Infof("Loading test suite from: %s", suiteN+"/"+suiteN+".json")
-	if err != nil {
-		log.Error(err)
-		return err
-	}
-
-	defer suiteF.Close()
-
-	if suiteBytes, err := ioutil.ReadAll(suiteF); err != nil {
-		log.Error(err)
-		return err
-	} else if err := json.Unmarshal(suiteBytes, suite); err != nil {
-		log.Error(err)
-		return err
-	}
-
-	return nil
-}
-
-func loadProtoMap(fileName string, pkg string, svc string, substs []ProtoSubst) (map[string]*mthd, error) {
-	var mthds map[string]*mthd = make(map[string]*mthd)
-	var rtrn_err bool
-
-	// Load the protobuf descriptor file
-	protoDescriptor := &pb.FileDescriptorSet{}
-	fb, err := ioutil.ReadFile(fileName)
-	if err != nil {
-		log.Errorf("Could not open proto file '%s'", fileName)
-		rtrn_err = true
-	}
-	err = proto.Unmarshal(fb, protoDescriptor)
-	if err != nil {
-		log.Errorf("Could not unmarshal %s, %v", "proto.pb", err)
-		rtrn_err = true
-	}
-
-	var substM map[string]string = make(map[string]string)
-	// Create a substitution map
-	log.Debugf("Creating import map")
-	for _, v := range substs {
-		log.Debugf("Mapping from %s to %s", v.From, v.To)
-		substM[v.From] = v.To
-	}
-
-	// Build the a map containing the method as the key
-	// and the paramter and return types as the fields
-	for _, f := range protoDescriptor.File {
-		if *f.Package == pkg {
-			for _, s := range f.Service {
-				if *s.Name == svc {
-					log.Debugf("Loading package data '%s' for service '%s'", *f.Package, *s.Name)
-					// Now create a map keyed by method name with the value being the
-					// field number of the route selector.
-					//var ok bool
-					for _, m := range s.Method {
-						// Find the input type in the messages and extract the
-						// field number and save it for future reference.
-						log.Debugf("Processing method (%s(%s) (%s){}", *m.Name, (*m.InputType)[1:], (*m.OutputType)[1:])
-						mthds[*m.Name] = &mthd{Pkg: pkg, Svc: svc, Name: *m.Name, Param: (*m.InputType)[1:],
-							Rtrn: (*m.OutputType)[1:]}
-						if m.ClientStreaming != nil && *m.ClientStreaming == true {
-							log.Debugf("Method %s is a client streaming method", *m.Name)
-							mthds[*m.Name].Cs = true
-						}
-						if m.ServerStreaming != nil && *m.ServerStreaming == true {
-							log.Debugf("Method %s is a server streaming method", *m.Name)
-							mthds[*m.Name].Ss = true
-						}
-						// Perform the required substitutions
-						if _, ok := substM[mthds[*m.Name].Param]; ok == true {
-							mthds[*m.Name].Param = substM[mthds[*m.Name].Param]
-						}
-						if _, ok := substM[mthds[*m.Name].Rtrn]; ok == true {
-							mthds[*m.Name].Rtrn = substM[mthds[*m.Name].Rtrn]
-						}
-					}
-				}
-			}
-		}
-	}
-	if rtrn_err {
-		return nil, errors.New(fmt.Sprintf("Failed to load protobuf descriptor file '%s'", fileName))
-	}
-	return mthds, nil
-}
-
-// Server source code generation
-func generateServers(conf *TestConfig, suiteDir string, ts *TestSuite,
-	t *template.Template) error {
-	var servers []ServerConfig
-
-	for k, v := range ts.Env.Servers.Endpoints {
-		log.Infof("Generating the code for server[%d]: %s", k, v.Name)
-		sc := &ServerConfig{Name: v.Name, Port: v.Port, Ct: k, Imports: ts.Env.Servers.Imports,
-			Methods: make(map[string]*mthd)}
-		for k1, v1 := range ts.Env.ProtoFiles {
-			imp := &ProtoImport{Short: "pb" + strconv.Itoa(k1),
-				Package: v1.ImportPath + v1.Package,
-				Service: v1.Service,
-				Used:    true}
-			imp = &ProtoImport{Short: v1.Package,
-				Package: v1.ImportPath + v1.Package,
-				Service: v1.Service,
-				Used:    true}
-			sc.ProtoImports = append(sc.ProtoImports, *imp)
-			// Compile the template from the file
-			log.Debugf("Proto substs: %v", ts.Env.ProtoSubsts)
-			if mthds, err := loadProtoMap(ts.Env.ProtoDesc, v1.Package,
-				v1.Service, ts.Env.ProtoSubsts); err != nil {
-				log.Errorf("Unable to process proto descriptor file %s for package: %s, service: %s",
-					ts.Env.ProtoDesc, v1.Package, v1.Service)
-				return err
-			} else {
-				//Generate all the function calls required by the
-				for k, v := range mthds {
-					sc.Methods[k] = v
-				}
-				//sc.Methods = mthds
-			}
-		}
-		log.Debugf("Server: %v", *sc)
-		// Save this server for the next steop
-		servers = append(servers, *sc)
-		// Open an output file to put the output in.
-		if f, err := os.Create(suiteDir + "/" + v.Name + ".go"); err == nil {
-			defer f.Close()
-			//if err := t.ExecuteTemplate(os.Stdout, "server.go.tmpl", *sc); err != nil {}
-			if err := t.ExecuteTemplate(f, "server.go.tmpl", *sc); err != nil {
-				log.Errorf("Unable to execute template for server[%d]: %s: %v", k, v.Name, err)
-				return err
-			}
-		}
-	}
-	// Generate the server initialization code
-	if f, err := os.Create(suiteDir + "/serverInit.go"); err == nil {
-		defer f.Close()
-		//if err := t.ExecuteTemplate(os.Stdout, "server.go.tmpl", *sc); err != nil {}
-		if err := t.ExecuteTemplate(f, "serverInit.go.tmpl", servers); err != nil {
-			log.Errorf("Unable to execute template for serverInit.go: %v", err)
-			return err
-		}
-	}
-
-	return nil
-}
-
-func generateClients(conf *TestConfig, suiteDir string, ts *TestSuite,
-	t *template.Template) error {
-	var clients []ClientConfig
-	for k, v := range ts.Env.Clients.Endpoints {
-		log.Infof("Generating the code for client[%d]: %s", k, v.Name)
-		cc := &ClientConfig{Name: v.Name, Port: v.Port, Ct: k, Imports: ts.Env.Clients.Imports,
-			Methods: make(map[string]*mthd)}
-		for _, v1 := range ts.Env.ProtoFiles {
-			imp := &ProtoImport{Short: v1.Package,
-				Package: v1.ImportPath + v1.Package,
-				Service: v1.Service}
-			cc.ProtoImports = append(cc.ProtoImports, *imp)
-			// Compile the template from the file
-			log.Debugf("Proto substs: %v", ts.Env.ProtoSubsts)
-			if mthds, err := loadProtoMap(ts.Env.ProtoDesc, v1.Package,
-				v1.Service, ts.Env.ProtoSubsts); err != nil {
-				log.Errorf("Unable to process proto descriptor file %s for package: %s, service: %s",
-					ts.Env.ProtoDesc, v1.Package, v1.Service)
-				return err
-			} else {
-				// Add to the known methods
-				for k, v := range mthds {
-					cc.Methods[k] = v
-				}
-			}
-		}
-		clients = append(clients, *cc)
-		if f, err := os.Create(suiteDir + "/" + v.Name + "_client.go"); err == nil {
-			_ = f
-			defer f.Close()
-			if err := t.ExecuteTemplate(f, "client.go.tmpl", cc); err != nil {
-				log.Errorf("Unable to execute template for client.go: %v", err)
-				return err
-			}
-		} else {
-			log.Errorf("Couldn't create file %s : %v", suiteDir+"/"+v.Name+"_client.go", err)
-			return err
-		}
-	}
-	if f, err := os.Create(suiteDir + "/clientInit.go"); err == nil {
-		defer f.Close()
-		//if err := t.ExecuteTemplate(os.Stdout, "server.go.tmpl", *sc); err != nil {}
-		if err := t.ExecuteTemplate(f, "clientInit.go.tmpl", clients); err != nil {
-			log.Errorf("Unable to execute template for clientInit.go: %v", err)
-			return err
-		}
-	}
-	return nil
-}
-
-func serverExists(srvr string, ts *TestSuite) bool {
-	for _, v := range ts.Env.Servers.Endpoints {
-		if v.Name == srvr {
-			return true
-		}
-	}
-	return false
-}
-
-func getPackageList(tests []TestCase) map[string]struct{} {
-	var rtrn map[string]struct{} = make(map[string]struct{})
-	var p string
-	var e string
-	r := regexp.MustCompile(`^([^.]+)\..*$`)
-	for _, v := range tests {
-		pa := r.FindStringSubmatch(v.Send.ParamType)
-		if len(pa) == 2 {
-			p = pa[1]
-		} else {
-			log.Errorf("Internal error regexp returned %v", pa)
-		}
-		ea := r.FindStringSubmatch(v.Send.ExpectType)
-		if len(ea) == 2 {
-			e = ea[1]
-		} else {
-			log.Errorf("Internal error regexp returned %v", pa)
-		}
-		if _, ok := rtrn[p]; ok == false {
-			rtrn[p] = struct{}{}
-		}
-		if _, ok := rtrn[e]; ok == false {
-			rtrn[e] = struct{}{}
-		}
-	}
-	return rtrn
-}
-
-func fixupProtoImports(protoImports []ProtoImport, used map[string]struct{}) []ProtoImport {
-	var rtrn []ProtoImport
-	//log.Infof("Updating imports %v, using %v", protoImports, used)
-	for _, v := range protoImports {
-		//log.Infof("Looking for package %s", v.Package)
-		if _, ok := used[v.Short]; ok == true {
-			rtrn = append(rtrn, ProtoImport{
-				Service: v.Service,
-				Short:   v.Short,
-				Package: v.Package,
-				Used:    true,
-			})
-		} else {
-			rtrn = append(rtrn, ProtoImport{
-				Service: v.Service,
-				Short:   v.Short,
-				Package: v.Package,
-				Used:    false,
-			})
-		}
-	}
-	//log.Infof("After update %v", rtrn)
-	return rtrn
-}
-
-func fixupImports(imports []Import, used map[string]struct{}) []Import {
-	var rtrn []Import
-	var p string
-	re := regexp.MustCompile(`^.*/([^/]+)$`)
-	//log.Infof("Updating imports %v, using %v", protoImports, used)
-	for _, v := range imports {
-		//log.Infof("Looking for match in %s", v.Package)
-		pa := re.FindStringSubmatch(v.Package)
-		if len(pa) == 2 {
-			p = pa[1]
-		} else {
-			log.Errorf("Substring match failed, regexp returned %v", pa)
-		}
-		//log.Infof("Looking for package %s", v.Package)
-		if _, ok := used[p]; ok == true {
-			rtrn = append(rtrn, Import{
-				Package: v.Package,
-				Used:    true,
-			})
-		} else {
-			rtrn = append(rtrn, Import{
-				Package: v.Package,
-				Used:    false,
-			})
-		}
-	}
-	//log.Infof("After update %v", rtrn)
-	return rtrn
-}
-
-func generateTestCases(conf *TestConfig, suiteDir string, ts *TestSuite,
-	t *template.Template) error {
-	var mthdMap map[string]*mthd
-	mthdMap = make(map[string]*mthd)
-	// Generate the test cases
-	log.Info("Generating the test cases: runTests.go")
-	tc := &TestList{Funcs: make(map[string]MethodTypes),
-		FileNum: 0, HasFuncs: false,
-		Offset: 0}
-	for _, v := range ts.Env.Imports {
-		tc.Imports = append(tc.Imports, Import{Package: v, Used: true})
-	}
-
-	// Load the proto descriptor file
-	for _, v := range ts.Env.ProtoFiles {
-		imp := &ProtoImport{Short: v.Package,
-			Package: v.ImportPath + v.Package,
-			Service: v.Service,
-			Used:    true}
-		tc.ProtoImports = append(tc.ProtoImports, *imp)
-		// Compile the template from the file
-		log.Debugf("Proto substs: %v", ts.Env.ProtoSubsts)
-		if mthds, err := loadProtoMap(ts.Env.ProtoDesc, v.Package,
-			v.Service, ts.Env.ProtoSubsts); err != nil {
-			log.Errorf("Unable to process proto descriptor file %s for package: %s, service: %s",
-				ts.Env.ProtoDesc, v.Package, v.Service)
-			return err
-		} else {
-			// Add to the known methods
-			for k, v := range mthds {
-				mthdMap[k] = v
-			}
-		}
-	}
-	// Since the input file can possibly be a template with loops that
-	// make multiple calls to exactly the same method with potentially
-	// different parameters it is best to try to optimize for that case.
-	// Creating a function for each method used will greatly reduce the
-	// code size and repetition. In the case where a method is used only
-	// once the resulting code will be bigger but this is an acceptable
-	// tradeoff to allow huge suites that call the same method repeatedly
-	// to test for leaks.
-
-	// The go compiler has trouble compiling files that are too large. In order
-	// to mitigate that, It's necessary to create more smaller files than the
-	// single one large one while making sure that the functions for the distinct
-	// methods are only defined once in one of the files.
-
-	// Yet another hiccup with the go compiler, it doesn't like deep function
-	// nesting meaning that each runTests function can't call the next without
-	// eventually blowing the stack check. In order to work around this, the
-	// first runTests function needs to call all the others in sequence to
-	// keep the stack depth constant.
-
-	// Counter limiting the number of tests to output to each file
-	maxCt := MAX_CT
-
-	// Get the list of distinct methods
-	//for _,v := range ts.Tests {
-	//	if _,ok := tc.Funcs[v.Send.Method]; ok == false {
-	//		tc.Funcs[v.Send.Method] = MethodTypes{ParamType:mthdMap[v.Send.Method].Param,
-	//											  ReturnType:mthdMap[v.Send.Method].Rtrn}
-	//	}
-	//}
-	for i := 1; i < int(math.Ceil(float64(len(ts.Tests))/float64(MAX_CT))); i++ {
-		tc.RunTestsCallList = append(tc.RunTestsCallList, "runTests"+strconv.Itoa(i))
-	}
-
-	// Create the test data structure for the template
-	for _, v := range ts.Tests {
-		var test TestCase
-
-		if _, ok := tc.Funcs[v.Send.Method]; ok == false {
-			tc.Funcs[v.Send.Method] = MethodTypes{ParamType: mthdMap[v.Send.Method].Param,
-				ReturnType:    mthdMap[v.Send.Method].Rtrn,
-				CodeGenerated: false}
-			tc.HasFuncs = true
-		}
-
-		test.Name = v.Name
-		test.InfoOnly = v.InfoOnly
-		test.Send.Client = v.Send.Client
-		test.Send.Method = v.Send.Method
-		test.Send.Param = v.Send.Param
-		test.Send.ParamType = mthdMap[test.Send.Method].Param
-		test.Send.Expect = v.Send.Expect
-		test.Send.ExpectType = mthdMap[test.Send.Method].Rtrn
-		for _, v1 := range v.Send.MetaData {
-			test.Send.MetaData = append(test.Send.MetaData, v1)
-		}
-		for _, v1 := range v.Send.ExpectMeta {
-			test.Send.ExpectMeta = append(test.Send.ExpectMeta, v1)
-		}
-		for _, v1 := range v.Servers {
-			var srvr Server
-			if serverExists(v1.Name, ts) == false {
-				log.Errorf("Server '%s' is not defined!!", v1.Name)
-				return errors.New(fmt.Sprintf("Failed to build test case %s", v.Name))
-			}
-			srvr.Name = v1.Name
-			srvr.Meta = v1.Meta
-			test.Srvr = append(test.Srvr, srvr)
-		}
-		tc.Tests = append(tc.Tests, test)
-		if maxCt--; maxCt == 0 {
-			// Get the list of proto pacakges required for this file
-			pkgs := getPackageList(tc.Tests)
-			// Adjust the proto import data accordingly
-			tc.ProtoImports = fixupProtoImports(tc.ProtoImports, pkgs)
-			tc.Imports = fixupImports(tc.Imports, pkgs)
-			//log.Infof("The packages needed are: %v", pkgs)
-			if f, err := os.Create(suiteDir + "/runTests" + strconv.Itoa(tc.FileNum) + ".go"); err == nil {
-				if err := t.ExecuteTemplate(f, "runTests.go.tmpl", tc); err != nil {
-					log.Errorf("Unable to execute template for runTests.go: %v", err)
-				}
-				f.Close()
-			} else {
-				log.Errorf("Couldn't create file %s : %v",
-					suiteDir+"/runTests"+strconv.Itoa(tc.FileNum)+".go", err)
-			}
-			tc.FileNum++
-			//tc.NextFile++
-			maxCt = MAX_CT
-			// Mark the functions as generated.
-			tc.Tests = []TestCase{}
-			for k, v := range tc.Funcs {
-				tc.Funcs[k] = MethodTypes{ParamType: v.ParamType,
-					ReturnType:    v.ReturnType,
-					CodeGenerated: true}
-			}
-			tc.HasFuncs = false
-			tc.Offset += MAX_CT
-			//tmp,_ := strconv.Atoi(tc.Offset)
-			//tc.Offset = strconv.Itoa(tmp+500)
-		}
-	}
-	//tc.NextFile = 0
-	// Get the list of proto pacakges required for this file
-	pkgs := getPackageList(tc.Tests)
-	// Adjust the proto import data accordingly
-	tc.ProtoImports = fixupProtoImports(tc.ProtoImports, pkgs)
-	tc.Imports = fixupImports(tc.Imports, pkgs)
-	//log.Infof("The packages needed are: %v", pkgs)
-	if f, err := os.Create(suiteDir + "/runTests" + strconv.Itoa(tc.FileNum) + ".go"); err == nil {
-		if err := t.ExecuteTemplate(f, "runTests.go.tmpl", tc); err != nil {
-			log.Errorf("Unable to execute template for runTests.go: %v", err)
-		}
-		f.Close()
-	} else {
-		log.Errorf("Couldn't create file %s : %v",
-			suiteDir+"/runTests"+strconv.Itoa(tc.FileNum)+".go", err)
-	}
-
-	//if f,err := os.Create(suiteDir+"/runTests.go"); err == nil {
-	//	if err := t.ExecuteTemplate(f, "runTests.go.tmpl", tc); err != nil {
-	//			log.Errorf("Unable to execute template for runTests.go: %v", err)
-	//	}
-	//	f.Close()
-	//} else {
-	//	log.Errorf("Couldn't create file %s : %v", suiteDir+"/runTests.go", err)
-	//}
-	return nil
-}
-
-func generateTestSuites(conf *TestConfig, srcDir string, outDir string) error {
-
-	// Create a directory for the tests
-	if err := os.Mkdir(srcDir, 0777); err != nil {
-		log.Errorf("Unable to create directory 'tests':%v\n", err)
-		return err
-	}
-
-	for k, v := range conf.Suites {
-		var suiteDir string = srcDir + "/" + v
-		log.Debugf("Suite[%d] - %s", k, v)
-		ts := &TestSuite{}
-		ts.loadSuite(v)
-		log.Debugf("Suite %s: %v", v, ts)
-		log.Infof("Processing test suite %s", v)
-
-		t := template.Must(template.New("").ParseFiles("../templates/server.go.tmpl",
-			"../templates/serverInit.go.tmpl",
-			"../templates/client.go.tmpl",
-			"../templates/clientInit.go.tmpl",
-			"../templates/runTests.go.tmpl",
-			"../templates/stats.go.tmpl",
-			"../templates/main.go.tmpl"))
-		// Create a directory for he source code for this test suite
-		if err := os.Mkdir(suiteDir, 0777); err != nil {
-			log.Errorf("Unable to create directory '%s':%v\n", v, err)
-			return err
-		}
-		// Generate the server source files
-		if err := generateServers(conf, suiteDir, ts, t); err != nil {
-			log.Errorf("Unable to generate server source files: %v", err)
-			return err
-		}
-		// Generate the client source files
-		if err := generateClients(conf, suiteDir, ts, t); err != nil {
-			log.Errorf("Unable to generate client source files: %v", err)
-			return err
-		}
-		// Generate the test case source file
-		if err := generateTestCases(conf, suiteDir, ts, t); err != nil {
-			log.Errorf("Unable to generate test case source file: %v", err)
-			return err
-		}
-
-		// Finally generate the main file
-		log.Info("Generating main.go")
-		if f, err := os.Create(suiteDir + "/main.go"); err == nil {
-			if err := t.ExecuteTemplate(f, "main.go.tmpl", ts.Env); err != nil {
-				log.Errorf("Unable to execute template for main.go: %v", err)
-			}
-			f.Close()
-		} else {
-			log.Errorf("Couldn't create file %s : %v", suiteDir+"/main.go", err)
-		}
-
-		log.Infof("Copying over common modules")
-		if f, err := os.Create(suiteDir + "/stats.go"); err == nil {
-			if err := t.ExecuteTemplate(f, "stats.go.tmpl", ts.Env); err != nil {
-				log.Errorf("Unable to execute template for stats.go: %v", err)
-			}
-			f.Close()
-		} else {
-			log.Errorf("Couldn't create file %s : %v", suiteDir+"/stats.go", err)
-		}
-
-		log.Infof("Compiling test suite: %s in directory %s", v, suiteDir)
-		if err := os.Chdir(suiteDir); err != nil {
-			log.Errorf("Could not change to directory '%s':%v", suiteDir, err)
-		}
-		cmd := exec.Command("go", "build", "-o", outDir+"/"+v+".e")
-		cmd.Stdin = os.Stdin
-		cmd.Stdout = os.Stdout
-		cmd.Stderr = os.Stderr
-		if err := cmd.Run(); err != nil {
-			log.Errorf("Error running the compile command:%v", err)
-		}
-		if err := os.Chdir("../../suites"); err != nil {
-			log.Errorf("Could not change to directory '%s':%v", "../../suites", err)
-		}
-	}
-	return nil
-
-}
-
-func generateTestDriver(conf *TestConfig, srcDir string, outDir string) error {
-	// Generate the main test driver file
-	if err := os.Mkdir(srcDir, 0777); err != nil {
-		log.Errorf("Unable to create directory 'driver':%v\n", err)
-		return err
-	}
-	t := template.Must(template.New("").ParseFiles("../templates/runAll.go.tmpl",
-		"../templates/stats.go.tmpl"))
-	if f, err := os.Create(srcDir + "/runAll.go"); err == nil {
-		if err := t.ExecuteTemplate(f, "runAll.go.tmpl", conf.Suites); err != nil {
-			log.Errorf("Unable to execute template for runAll.go: %v", err)
-		}
-		f.Close()
-	} else {
-		log.Errorf("Couldn't create file %s : %v", srcDir+"/runAll.go", err)
-	}
-	if f, err := os.Create(srcDir + "/stats.go"); err == nil {
-		if err := t.ExecuteTemplate(f, "stats.go.tmpl", conf.Suites); err != nil {
-			log.Errorf("Unable to execute template for stats.go: %v", err)
-		}
-		f.Close()
-	} else {
-		log.Errorf("Couldn't create file %s : %v", srcDir+"/stats.go", err)
-	}
-
-	// Compile the test driver file
-	log.Info("Compiling the test driver")
-	if err := os.Chdir("../tests/driver"); err != nil {
-		log.Errorf("Could not change to directory 'driver':%v", err)
-	}
-	cmd := exec.Command("go", "build", "-o", outDir+"/runAll")
-	cmd.Stdin = os.Stdin
-	cmd.Stdout = os.Stdout
-	cmd.Stderr = os.Stderr
-	if err := cmd.Run(); err != nil {
-		log.Errorf("Error running the compile command:%v", err)
-	}
-	if err := os.Chdir("../../suites"); err != nil {
-		log.Errorf("Could not change to directory 'driver':%v", err)
-	}
-
-	return nil
-}
-
-func main() {
-
-	conf, err := parseCmd()
-	if err != nil {
-		fmt.Printf("Error: %v\n", err)
-		return
-	}
-
-	// Setup logging
-	if _, err := log.SetDefaultLogger(log.JSON, *conf.logLevel, nil); err != nil {
-		log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
-	}
-
-	defer log.CleanUp()
-
-	// Parse the config file
-	if err := conf.loadConfig(); err != nil {
-		log.Error(err)
-	}
-
-	generateTestSuites(conf, "../tests", "/src/tests")
-	generateTestDriver(conf, "../tests/driver", "/src/tests")
-	return
-}
diff --git a/tests/afrouter/tester/main.go b/tests/afrouter/tester/main.go
deleted file mode 100644
index b733efc..0000000
--- a/tests/afrouter/tester/main.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// +build integration
-
-/*
- * Copyright 2018-present Open Networking Foundation
-
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
-
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-// The template for the tester.
-// This template is filled in by the
-// test driver based on the configuration.
-
-package main
-
-import (
-	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-)
-
-func main() {
-	// Setup logging
-	/*
-		if _, err := log.SetDefaultLogger(log.JSON, 0, nil); err != nil {
-			log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
-		}
-	*/
-
-	defer log.CleanUp()
-
-	log.Info("Template runs!")
-}
diff --git a/vendor/github.com/bclicn/color/LICENSE b/vendor/github.com/bclicn/color/LICENSE
deleted file mode 100644
index c22bc5f..0000000
--- a/vendor/github.com/bclicn/color/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-
-The MIT License (MIT)
-
-Copyright (c) 2016-2018 bcli
-
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/vendor/github.com/bclicn/color/README.md b/vendor/github.com/bclicn/color/README.md
deleted file mode 100644
index 1065950..0000000
--- a/vendor/github.com/bclicn/color/README.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# GoLang Colorized Output
-
-GoLang colorized output library for Mac & Linux Shell, [中文版说明](README_CN.md)
-
-## Showcase
-![img](showcase.jpg)
-
-## Install
-
-1. __Make sure__ your've read [GoLang Official File Structure](https://golang.org/doc/code.html)
-2. Make sure you've set a correct GOPATH
-3. `$ go get github.com/bclicn/color`
-4. In your script, `import "github.com/bclicn/color"` then call `color.Test()`
-5. Use `fmt.Println("Hello" + color.Red("World"))` to assemble a colorized output
-6. API examples available in `color-test.go`
-
-## Quick (brainless) Usage
-
-1. Download `color.go`
-2. Modify its `package color` to `package main`
-3. Put your script under the same directory and write `fmt.Println(Red("I'm red !!!"))`
-4. Run `go run color.go yourScript.go`
-5. Or build by `go build color.go yourScript.go`
-
-## A simple test script
-
-    package main
-
-    import (
-	    "fmt"
-	    "github.com/bclicn/color"
-    )
-
-    func main(){
-	    fmt.Println(color.Red("Red output"))
-	    color.Test()
-    }
-
-## License
-
-[MIT](LICENSE)
-
-bcli, 2018-7-11
diff --git a/vendor/github.com/bclicn/color/README_CN.md b/vendor/github.com/bclicn/color/README_CN.md
deleted file mode 100644
index 25b447e..0000000
--- a/vendor/github.com/bclicn/color/README_CN.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# GoLang 彩色输出
-
-用于Mac和Linux Shell的GoLang彩色文字输出, [English Version](README.md)
-
-## 效果展示
-![img](showcase.jpg)
-
-## 安装
-
-1. __确保__你已经读过  [GoLang官方文件结构](https://golang.org/doc/code.html)
-2. 确保你的GOPATH环境变量正确
-3. `go get github.com/bclicn/color`
-3. 在你的脚本中,`import "github.com/bclicn/color"` 然后调用 `color.Test()`查看全部效果
-5. 使用`fmt.Println("Hello" + color.Red("World"))`进行彩色输出
-4. API调用示例在`color-test.go`
-
-## 快速(无脑)使用
-
-1. 下载`color.go`
-2. 将其第一行的`package color`改为`package main`
-3. 把你的脚本放在同一个文件夹下,直接调用如`fmt.Println(Red("I'm red !!!"))`
-4. 运行`go run color.go yourScript.go`
-5. 你也可以直接`go build color.go yourScript.go`
-
-## 快速调用示例
-
-    package main
-
-    import (
-	    "fmt"
-	    "github.com/bclicn/color"
-    )
-
-    func main(){
-	    fmt.Println(color.Red("Red output"))
-	    color.Test()
-    }
-
-##  License
-
-[MIT](LICENSE)
-
-bcli, 2018-7-11
diff --git a/vendor/github.com/bclicn/color/color-test.go b/vendor/github.com/bclicn/color/color-test.go
deleted file mode 100644
index 59e9b5b..0000000
--- a/vendor/github.com/bclicn/color/color-test.go
+++ /dev/null
@@ -1,87 +0,0 @@
-package color
-
-import (
-	"fmt"
-)
-
-// github.com/bclicn/color
-// colorized output for Mac & Linux terminal
-// version: 1.0.0
-// author:  bcli, bclicn@gmail.com, 2016-11-4
-// see:     http://misc.flogisoft.com/bash/tip_colors_and_formatting
-// usage:
-// For official code layout
-// 	$ go get github.com/bclicn/color
-// 	# in your project
-// 	import "github.com/bclicn/color"
-// 	func main() {
-//		color.Test()
-//	}
-
-func ColorTest() {
-
-	const HEAD = " "
-	const TAIL = " "
-
-	// regular
-	fmt.Println(HEAD + Black("black") + TAIL)
-	fmt.Println(HEAD + Red("red") + TAIL)
-	fmt.Println(HEAD + Green("green") + TAIL)
-	fmt.Println(HEAD + Yellow("yellow") + TAIL)
-	fmt.Println(HEAD + Blue("blue") + TAIL)
-	fmt.Println(HEAD + Purple("purple") + TAIL)
-	fmt.Println(HEAD + Cyan("cyan") + TAIL)
-	fmt.Println(HEAD + LightGray("light gray") + TAIL)
-	fmt.Println(HEAD + DarkGray("dark gray") + TAIL)
-	fmt.Println(HEAD + LightRed("light red") + TAIL)
-	fmt.Println(HEAD + LightGreen("light green") + TAIL)
-	fmt.Println(HEAD + LightYellow("light yellow") + TAIL)
-	fmt.Println(HEAD + LightBlue("light blue") + TAIL)
-	fmt.Println(HEAD + LightPurple("light purple") + TAIL)
-	fmt.Println(HEAD + LightCyan("light cyan") + TAIL)
-	fmt.Println(HEAD + White("white") + TAIL)
-
-	// bold
-	fmt.Println(HEAD + BBlack("bold black") + TAIL)
-	fmt.Println(HEAD + BRed("bold red") + TAIL)
-	fmt.Println(HEAD + BGreen("bold green") + TAIL)
-	fmt.Println(HEAD + BYellow("bold yellow") + TAIL)
-	fmt.Println(HEAD + BBlue("bold blue") + TAIL)
-	fmt.Println(HEAD + BPurple("bold purple") + TAIL)
-	fmt.Println(HEAD + BCyan("bold cyan") + TAIL)
-	fmt.Println(HEAD + BLightGray("bold light gray") + TAIL)
-	fmt.Println(HEAD + BDarkGray("bold dark gray") + TAIL)
-	fmt.Println(HEAD + BLightRed("bold light red") + TAIL)
-	fmt.Println(HEAD + BLightGreen("bold light green") + TAIL)
-	fmt.Println(HEAD + BLightYellow("bold light yellow") + TAIL)
-	fmt.Println(HEAD + BLightBlue("bold light blue") + TAIL)
-	fmt.Println(HEAD + BLightPurple("bold light purple") + TAIL)
-	fmt.Println(HEAD + BLightCyan("bold light cyan") + TAIL)
-	fmt.Println(HEAD + BWhite("bold white") + TAIL)
-
-	// background
-	fmt.Println(HEAD + GBlack("background black") + TAIL)
-	fmt.Println(HEAD + GRed("background red") + TAIL)
-	fmt.Println(HEAD + GGreen("background green") + TAIL)
-	fmt.Println(HEAD + GYellow("background yellow") + TAIL)
-	fmt.Println(HEAD + GBlue("background blue") + TAIL)
-	fmt.Println(HEAD + GPurple("background purple") + TAIL)
-	fmt.Println(HEAD + GCyan("background cyan") + TAIL)
-	fmt.Println(HEAD + GLightGray("background light gray") + TAIL)
-	fmt.Println(HEAD + GDarkGray("background dark gray") + TAIL)
-	fmt.Println(HEAD + GLightRed("background light red") + TAIL)
-	fmt.Println(HEAD + GLightGreen("background light green") + TAIL)
-	fmt.Println(HEAD + GLightYellow("background light yellow") + TAIL)
-	fmt.Println(HEAD + GLightBlue("background light blue") + TAIL)
-	fmt.Println(HEAD + GLightPurple("background light purple") + TAIL)
-	fmt.Println(HEAD + GLightCyan("background light cyan") + TAIL)
-	fmt.Println(HEAD + GWhite("background white") + TAIL)
-
-	// special
-	fmt.Println("A " + Bold("bold") + " text")
-	fmt.Println("This is a " + Dim("dimmed") + " text")
-	fmt.Println("Add a " + Underline("underline"))
-	fmt.Println("Use " + Invert("invert") + " to highlight your text")
-	fmt.Println("Your password is:" + Hide("myPass"))
-	fmt.Println("OMG I'm " + Blink("blinking") + " !!!") // blinking works only on mac
-}
diff --git a/vendor/github.com/bclicn/color/color.go b/vendor/github.com/bclicn/color/color.go
deleted file mode 100644
index ce7fc83..0000000
--- a/vendor/github.com/bclicn/color/color.go
+++ /dev/null
@@ -1,330 +0,0 @@
-// github.com/bclicn/color
-// colorized output for Mac & Linux terminal
-// version: 1.0.0
-// author:  bcli, bclicn@gmail.com, 2018-7-11
-// see:     http://misc.flogisoft.com/bash/tip_colors_and_formatting
-// usage:
-// Official layout
-// 	$ go get github.com/bclicn/color
-// 	# in your project
-// 	import "github.com/bclicn/color"
-// 	func main() {
-//		fmt.Println(color.Red("I'm red!"))
-//		color.Test()
-//	}
-
-package color
-
-import (
-	"strconv"
-)
-
-const (
-	// common
-	reset  = "\033[0m" // auto reset the rest of text to default color
-	normal = 0
-	bold   = 1 // increase this value if you want bolder text
-	// special
-	dim       = 2
-	underline = 4
-	blink     = 5
-	reverse   = 7
-	hidden    = 8
-	// color
-	black       = 30 // default = 39
-	red         = 31
-	green       = 32
-	yellow      = 33
-	blue        = 34
-	purple      = 35 // purple = magenta
-	cyan        = 36
-	lightGray   = 37
-	darkGray    = 90
-	lightRed    = 91
-	lightGreen  = 92
-	lightYellow = 93
-	lightBlue   = 94
-	lightPurple = 95
-	lightCyan   = 96
-	white       = 97
-)
-
-// you can use custom color code and font size by calling this function
-func Render(colorCode int, fontSize int, content string) string {
-	return "\033[" + strconv.Itoa(fontSize) + ";" + strconv.Itoa(colorCode) + "m" + content + reset
-}
-
-// black text (use this with caution since most geeks use dark console)
-func Black(txt string) string {
-	return Render(black, normal, txt)
-}
-
-// red text
-func Red(txt string) string {
-	return Render(red, normal, txt)
-}
-
-// green text
-func Green(txt string) string {
-	return Render(green, normal, txt)
-}
-
-// yellow text
-func Yellow(txt string) string {
-	return Render(yellow, normal, txt)
-}
-
-// blue text
-func Blue(txt string) string {
-	return Render(blue, normal, txt)
-}
-
-// purple text
-func Purple(txt string) string {
-	return Render(purple, normal, txt)
-}
-
-// cyan text
-func Cyan(txt string) string {
-	return Render(cyan, normal, txt)
-}
-
-// light gray text
-func LightGray(txt string) string {
-	return Render(lightGray, normal, txt)
-}
-
-// dark gray text
-func DarkGray(txt string) string {
-	return Render(darkGray, normal, txt)
-}
-
-// light red text
-func LightRed(txt string) string {
-	return Render(lightRed, normal, txt)
-}
-
-// light green text
-func LightGreen(txt string) string {
-	return Render(lightGreen, normal, txt)
-}
-
-// light yellow text
-func LightYellow(txt string) string {
-	return Render(lightYellow, normal, txt)
-}
-
-// light blue text
-func LightBlue(txt string) string {
-	return Render(lightBlue, normal, txt)
-}
-
-// light purple text
-func LightPurple(txt string) string {
-	return Render(lightPurple, normal, txt)
-}
-
-// light cyan text
-func LightCyan(txt string) string {
-	return Render(lightCyan, normal, txt)
-}
-
-// white text
-func White(txt string) string {
-	return Render(white, normal, txt)
-}
-
-// black text (use this with caution since most geeks use dark console)
-func BBlack(txt string) string {
-	return Render(black, bold, txt)
-}
-
-// bold red
-func BRed(txt string) string {
-	return Render(red, bold, txt)
-}
-
-// bold green
-func BGreen(txt string) string {
-	return Render(green, bold, txt)
-}
-
-// bold yellow
-func BYellow(txt string) string {
-	return Render(yellow, bold, txt)
-}
-
-// bold blue
-func BBlue(txt string) string {
-	return Render(blue, bold, txt)
-}
-
-// bold purple
-func BPurple(txt string) string {
-	return Render(purple, bold, txt)
-}
-
-// bold cyan
-func BCyan(txt string) string {
-	return Render(cyan, bold, txt)
-}
-
-// bold light gray
-func BLightGray(txt string) string {
-	return Render(lightGray, bold, txt)
-}
-
-// bold dark gray
-func BDarkGray(txt string) string {
-	return Render(darkGray, bold, txt)
-}
-
-// bold light red
-func BLightRed(txt string) string {
-	return Render(lightRed, bold, txt)
-}
-
-// bold light green
-func BLightGreen(txt string) string {
-	return Render(lightGreen, bold, txt)
-}
-
-// bold light yellow
-func BLightYellow(txt string) string {
-	return Render(lightYellow, bold, txt)
-}
-
-// bold light blue
-func BLightBlue(txt string) string {
-	return Render(lightBlue, bold, txt)
-}
-
-// bold light purple
-func BLightPurple(txt string) string {
-	return Render(lightPurple, bold, txt)
-}
-
-// bold light cyan
-func BLightCyan(txt string) string {
-	return Render(lightCyan, bold, txt)
-}
-
-// bold white
-func BWhite(txt string) string {
-	return Render(white, bold, txt)
-}
-
-// black background (use this with caution since most of geeks use dark console)
-func GBlack(txt string) string {
-	return Render(black+1, normal, txt)
-}
-
-// red background
-func GRed(txt string) string {
-	return Render(red+1, normal, txt)
-}
-
-// green background
-func GGreen(txt string) string {
-	return Render(green+1, normal, txt)
-}
-
-// yellow background
-func GYellow(txt string) string {
-	return Render(yellow+1, normal, txt)
-}
-
-// blue background
-func GBlue(txt string) string {
-	return Render(blue+1, normal, txt)
-}
-
-// purple background
-func GPurple(txt string) string {
-	return Render(purple+1, normal, txt)
-}
-
-// cyan background
-func GCyan(txt string) string {
-	return Render(cyan+1, normal, txt)
-}
-
-// light gray background
-func GLightGray(txt string) string {
-	return Render(lightGray+1, normal, txt)
-}
-
-// dark gray background
-func GDarkGray(txt string) string {
-	return Render(darkGray+1, normal, txt)
-}
-
-// light red background
-func GLightRed(txt string) string {
-	return Render(lightRed+1, normal, txt)
-}
-
-// light green background
-func GLightGreen(txt string) string {
-	return Render(lightGreen+1, normal, txt)
-}
-
-// light yellow background
-func GLightYellow(txt string) string {
-	return Render(lightYellow+1, normal, txt)
-}
-
-// blue background
-func GLightBlue(txt string) string {
-	return Render(lightBlue+1, normal, txt)
-}
-
-// light purple background
-func GLightPurple(txt string) string {
-	return Render(lightPurple+1, normal, txt)
-}
-
-// light cyan background
-func GLightCyan(txt string) string {
-	return Render(lightCyan+1, normal, txt)
-}
-
-// give text a white background
-func GWhite(txt string) string {
-	return Render(white+1, normal, txt)
-}
-
-// bold text
-func Bold(txt string) string {
-	return Render(bold, normal, txt)
-}
-
-// dimmed text
-func Dim(txt string) string {
-	return Render(dim, normal, txt)
-}
-
-// underlined text
-func Underline(txt string) string {
-	return Render(underline, 0, txt)
-}
-
-// make given text blink, not supported by all consoles
-func Blink(txt string) string {
-	return Render(blink, normal, txt)
-}
-
-// invert the color of text and its background
-func Invert(txt string) string {
-	return Render(reverse, normal, txt)
-}
-
-// hide given text, useful for password input
-func Hide(txt string) string {
-	return Render(hidden, normal, txt)
-}
-
-// test all functions
-func Test() {
-	ColorTest()
-}
diff --git a/vendor/github.com/bclicn/color/showcase.jpg b/vendor/github.com/bclicn/color/showcase.jpg
deleted file mode 100644
index 39f270c..0000000
--- a/vendor/github.com/bclicn/color/showcase.jpg
+++ /dev/null
Binary files differ
diff --git a/vendor/modules.txt b/vendor/modules.txt
index bede00a..ea98501 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -4,8 +4,6 @@
 github.com/Shopify/sarama
 # github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878
 github.com/armon/go-metrics
-# github.com/bclicn/color v0.0.0-20180711051946-108f2023dc84
-github.com/bclicn/color
 # github.com/beorn7/perks v1.0.0
 github.com/beorn7/perks/quantile
 # github.com/bsm/sarama-cluster v2.1.15+incompatible
@@ -104,19 +102,19 @@
 github.com/opencord/voltha-lib-go/v3/pkg/log
 github.com/opencord/voltha-lib-go/v3/pkg/db
 github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore
+github.com/opencord/voltha-lib-go/v3/pkg/kafka
 github.com/opencord/voltha-lib-go/v3/pkg/probe
 github.com/opencord/voltha-lib-go/v3/pkg/version
-github.com/opencord/voltha-lib-go/v3/pkg/grpc
-github.com/opencord/voltha-lib-go/v3/pkg/kafka
 github.com/opencord/voltha-lib-go/v3/pkg/flows
+github.com/opencord/voltha-lib-go/v3/pkg/grpc
 github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif
 github.com/opencord/voltha-lib-go/v3/pkg/adapters/common
-github.com/opencord/voltha-lib-go/v3/pkg/mocks
 github.com/opencord/voltha-lib-go/v3/pkg/adapters
+github.com/opencord/voltha-lib-go/v3/pkg/mocks
 # github.com/opencord/voltha-protos/v3 v3.0.0
 github.com/opencord/voltha-protos/v3/go/common
-github.com/opencord/voltha-protos/v3/go/voltha
 github.com/opencord/voltha-protos/v3/go/openflow_13
+github.com/opencord/voltha-protos/v3/go/voltha
 github.com/opencord/voltha-protos/v3/go/inter_container
 github.com/opencord/voltha-protos/v3/go/omci
 # github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2
@@ -245,20 +243,20 @@
 go.uber.org/zap/internal/exit
 # golang.org/x/crypto v0.0.0-20191001170739-f9e2070545dc
 golang.org/x/crypto/bcrypt
-golang.org/x/crypto/blowfish
 golang.org/x/crypto/md4
-golang.org/x/crypto/ssh/terminal
+golang.org/x/crypto/blowfish
 golang.org/x/crypto/pbkdf2
+golang.org/x/crypto/ssh/terminal
 # golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3
 golang.org/x/net/trace
+golang.org/x/net/proxy
 golang.org/x/net/internal/timeseries
 golang.org/x/net/http2
 golang.org/x/net/http2/hpack
-golang.org/x/net/proxy
-golang.org/x/net/http/httpguts
-golang.org/x/net/idna
 golang.org/x/net/context
 golang.org/x/net/internal/socks
+golang.org/x/net/http/httpguts
+golang.org/x/net/idna
 # golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24
 golang.org/x/sys/unix
 golang.org/x/sys/windows
@@ -279,10 +277,10 @@
 google.golang.org/grpc/codes
 google.golang.org/grpc/metadata
 google.golang.org/grpc/status
+google.golang.org/grpc/credentials
 google.golang.org/grpc/balancer
 google.golang.org/grpc/balancer/roundrobin
 google.golang.org/grpc/connectivity
-google.golang.org/grpc/credentials
 google.golang.org/grpc/encoding
 google.golang.org/grpc/encoding/proto
 google.golang.org/grpc/grpclog
@@ -304,8 +302,8 @@
 google.golang.org/grpc/serviceconfig
 google.golang.org/grpc/stats
 google.golang.org/grpc/tap
-google.golang.org/grpc/balancer/base
 google.golang.org/grpc/credentials/internal
+google.golang.org/grpc/balancer/base
 google.golang.org/grpc/binarylog/grpc_binarylog_v1
 google.golang.org/grpc/internal/syscall
 google.golang.org/grpc/health
