diff --git a/tests/core/api/grpc_nbi_api_handler_client_test.go b/tests/core/api/grpc_nbi_api_handler_client_test.go
index 47e4472..4eb5d1c 100644
--- a/tests/core/api/grpc_nbi_api_handler_client_test.go
+++ b/tests/core/api/grpc_nbi_api_handler_client_test.go
@@ -1,3 +1,5 @@
+// +build integration
+
 /*
  * Copyright 2018-present Open Networking Foundation
 
@@ -13,13 +15,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package api
 
 import (
 	"context"
 	"fmt"
-	com "github.com/opencord/voltha-go/adapters/common"
 	"github.com/golang/protobuf/ptypes/empty"
+	com "github.com/opencord/voltha-go/adapters/common"
 	"github.com/opencord/voltha-go/common/log"
 	"github.com/opencord/voltha-protos/go/common"
 	"github.com/opencord/voltha-protos/go/openflow_13"
@@ -121,7 +124,7 @@
 func startKafka() {
 	fmt.Println("Starting Kafka and Etcd ...")
 	command := "docker-compose"
-	cmd := exec.Command(command, "-f", "../../compose/docker-compose-zk-kafka-test.yml", "up", "-d")
+	cmd := exec.Command(command, "-f", "../../../compose/docker-compose-zk-kafka-test.yml", "up", "-d")
 	if err := cmd.Run(); err != nil {
 		log.Fatal(err)
 	}
@@ -130,7 +133,7 @@
 func startEtcd() {
 	fmt.Println("Starting Etcd ...")
 	command := "docker-compose"
-	cmd := exec.Command(command, "-f", "../../compose/docker-compose-etcd.yml", "up", "-d")
+	cmd := exec.Command(command, "-f", "../../../compose/docker-compose-etcd.yml", "up", "-d")
 	if err := cmd.Run(); err != nil {
 		log.Fatal(err)
 	}
@@ -139,7 +142,7 @@
 func stopKafka() {
 	fmt.Println("Stopping Kafka and Etcd ...")
 	command := "docker-compose"
-	cmd := exec.Command(command, "-f", "../../compose/docker-compose-zk-kafka-test.yml", "down")
+	cmd := exec.Command(command, "-f", "../../../compose/docker-compose-zk-kafka-test.yml", "down")
 	if err := cmd.Run(); err != nil {
 		// ignore error - as this is mostly due network being left behind as its being used by other
 		// containers
@@ -150,7 +153,7 @@
 func stopEtcd() {
 	fmt.Println("Stopping Etcd ...")
 	command := "docker-compose"
-	cmd := exec.Command(command, "-f", "../../compose/docker-compose-etcd.yml", "down")
+	cmd := exec.Command(command, "-f", "../../../compose/docker-compose-etcd.yml", "down")
 	if err := cmd.Run(); err != nil {
 		// ignore error - as this is mostly due network being left behind as its being used by other
 		// containers
@@ -161,7 +164,7 @@
 func startCore() {
 	fmt.Println("Starting voltha core ...")
 	command := "docker-compose"
-	cmd := exec.Command(command, "-f", "../../compose/rw_core.yml", "up", "-d")
+	cmd := exec.Command(command, "-f", "../../../compose/rw_core.yml", "up", "-d")
 	if err := cmd.Run(); err != nil {
 		log.Fatal(err)
 	}
@@ -170,7 +173,7 @@
 func stopCore() {
 	fmt.Println("Stopping voltha core ...")
 	command := "docker-compose"
-	cmd := exec.Command(command, "-f", "../../compose/rw_core.yml", "down")
+	cmd := exec.Command(command, "-f", "../../../compose/rw_core.yml", "down")
 	if err := cmd.Run(); err != nil {
 		// ignore error - as this is mostly due network being left behind as its being used by other
 		// containers
@@ -181,7 +184,7 @@
 func startSimulatedOLTAndONUAdapters() {
 	fmt.Println("Starting simulated OLT and ONU adapters ...")
 	command := "docker-compose"
-	cmd := exec.Command(command, "-f", "../../compose/adapters-simulated.yml", "up", "-d")
+	cmd := exec.Command(command, "-f", "../../../compose/adapters-simulated.yml", "up", "-d")
 	if err := cmd.Run(); err != nil {
 		log.Fatal(err)
 	}
@@ -190,7 +193,7 @@
 func stopSimulatedOLTAndONUAdapters() {
 	fmt.Println("Stopping simulated OLT and ONU adapters ...")
 	command := "docker-compose"
-	cmd := exec.Command(command, "-f", "../../compose/adapters-simulated.yml", "down")
+	cmd := exec.Command(command, "-f", "../../../compose/adapters-simulated.yml", "down")
 	if err := cmd.Run(); err != nil {
 		// ignore error - as this is mostly due network being left behind as its being used by other
 		// containers
@@ -198,7 +201,6 @@
 	}
 }
 
-
 func TestListDeviceIds(t *testing.T) {
 	fmt.Println("Testing list Devices Ids ...")
 	//0. Start kafka and Ectd
@@ -335,7 +337,7 @@
 	for i := 0; i < numberOfOLTDevices; i++ {
 		ctx := context.Background()
 		randomMacAddress := strings.ToUpper(com.GetRandomMacAddress())
-		device := &voltha.Device{Type: "simulated_olt", MacAddress:randomMacAddress}
+		device := &voltha.Device{Type: "simulated_olt", MacAddress: randomMacAddress}
 		response, err := stub.CreateDevice(ctx, device)
 		log.Infow("response", log.Fields{"res": response, "error": err})
 		assert.Nil(t, err)
@@ -345,7 +347,7 @@
 	//4. Enable all the devices
 	for id, _ := range devices {
 		ctx := context.Background()
-		response, err := stub.EnableDevice(ctx, &common.ID{Id:id})
+		response, err := stub.EnableDevice(ctx, &common.ID{Id: id})
 		log.Infow("response", log.Fields{"res": response, "error": err})
 		assert.Nil(t, err)
 	}
@@ -366,7 +368,7 @@
 	log.Infow("response", log.Fields{"res": response, "error": err})
 	assert.Nil(t, err)
 	assert.Equal(t, len(devices)*2, len(response.Items))
-	for _, d := range (response.Items) {
+	for _, d := range response.Items {
 		devices[d.Id] = d
 		assert.Equal(t, d.AdminState, voltha.AdminState_ENABLED)
 	}
@@ -377,7 +379,7 @@
 	log.Infow("response", log.Fields{"res": response, "error": lerr})
 	assert.Nil(t, lerr)
 	assert.Equal(t, numberOfOLTDevices, len(lresponse.Items))
-	for _, ld := range (lresponse.Items) {
+	for _, ld := range lresponse.Items {
 		logicalDevices[ld.Id] = ld
 		// Ensure each logical device have two ports
 		assert.Equal(t, 2, len(ld.Ports))
@@ -387,7 +389,7 @@
 	for id, d := range devices {
 		ctx := context.Background()
 		if d.Type == "simulated_onu" {
-			response, err := stub.DisableDevice(ctx, &common.ID{Id:id})
+			response, err := stub.DisableDevice(ctx, &common.ID{Id: id})
 			log.Infow("response", log.Fields{"res": response, "error": err})
 			assert.Nil(t, err)
 		}
@@ -401,7 +403,7 @@
 	log.Infow("response", log.Fields{"res": response, "error": err})
 	assert.Nil(t, err)
 	assert.Equal(t, len(devices), len(response.Items))
-	for _, d := range (response.Items) {
+	for _, d := range response.Items {
 		if d.Type == "simulated_onu" {
 			assert.Equal(t, d.AdminState, voltha.AdminState_DISABLED)
 			devices[d.Id] = d
@@ -415,7 +417,7 @@
 	log.Infow("response", log.Fields{"res": response, "error": lerr})
 	assert.Nil(t, lerr)
 	assert.Equal(t, numberOfOLTDevices, len(lresponse.Items))
-	for _, ld := range (lresponse.Items) {
+	for _, ld := range lresponse.Items {
 		logicalDevices[ld.Id] = ld
 		// Ensure each logical device have one port - only olt port
 		assert.Equal(t, 1, len(ld.Ports))
@@ -425,7 +427,7 @@
 	for id, d := range devices {
 		ctx := context.Background()
 		if d.Type == "simulated_onu" {
-			response, err := stub.EnableDevice(ctx, &common.ID{Id:id})
+			response, err := stub.EnableDevice(ctx, &common.ID{Id: id})
 			log.Infow("response", log.Fields{"res": response, "error": err})
 			assert.Nil(t, err)
 		}
@@ -439,7 +441,7 @@
 	log.Infow("response", log.Fields{"res": response, "error": err})
 	assert.Nil(t, err)
 	assert.Equal(t, len(devices), len(response.Items))
-	for _, d := range (response.Items) {
+	for _, d := range response.Items {
 		assert.Equal(t, d.AdminState, voltha.AdminState_ENABLED)
 		devices[d.Id] = d
 	}
@@ -474,7 +476,6 @@
 	//stopEtcd()
 }
 
-
 func TestGetDevice(t *testing.T) {
 	var id common.ID
 	id.Id = "anyid"
diff --git a/tests/core/concurrency/core_concurrency_test.go b/tests/core/concurrency/core_concurrency_test.go
index 42f5de0..5fbda49 100644
--- a/tests/core/concurrency/core_concurrency_test.go
+++ b/tests/core/concurrency/core_concurrency_test.go
@@ -1,3 +1,5 @@
+// +build integration
+
 /*
  * Copyright 2018-present Open Networking Foundation
 
@@ -62,7 +64,7 @@
 	devices = make(map[string]*voltha.Device)
 }
 
-func connectToCore(port int) (voltha.VolthaServiceClient, error)  {
+func connectToCore(port int) (voltha.VolthaServiceClient, error) {
 	grpcHostIP := os.Getenv("DOCKER_HOST_IP")
 	grpcHost := fmt.Sprintf("%s:%d", grpcHostIP, port)
 	conn, err := grpc.Dial(grpcHost, grpc.WithInsecure())
@@ -192,8 +194,7 @@
 	}
 }
 
-
-func sendCreateDeviceRequest(ctx context.Context, stub voltha.VolthaServiceClient, device *voltha.Device, ch chan interface{} ) {
+func sendCreateDeviceRequest(ctx context.Context, stub voltha.VolthaServiceClient, device *voltha.Device, ch chan interface{}) {
 	fmt.Println("Sending  create device ...")
 	if response, err := stub.CreateDevice(ctx, device); err != nil {
 		ch <- err
@@ -202,9 +203,9 @@
 	}
 }
 
-func sendEnableDeviceRequest(ctx context.Context, stub voltha.VolthaServiceClient, deviceId string, ch chan interface{} ) {
+func sendEnableDeviceRequest(ctx context.Context, stub voltha.VolthaServiceClient, deviceId string, ch chan interface{}) {
 	fmt.Println("Sending enable device ...")
-	if response, err := stub.EnableDevice(ctx, &common.ID{Id:deviceId}); err != nil {
+	if response, err := stub.EnableDevice(ctx, &common.ID{Id: deviceId}); err != nil {
 		ch <- err
 	} else {
 		ch <- response
@@ -253,7 +254,7 @@
 	ui := uuid.New()
 	ctx := metadata.NewOutgoingContext(context.Background(), metadata.Pairs(volthaSerialNumberKey, ui.String()))
 	randomMacAddress := strings.ToUpper(com.GetRandomMacAddress())
-	device := &voltha.Device{Type: "simulated_olt", MacAddress:randomMacAddress}
+	device := &voltha.Device{Type: "simulated_olt", MacAddress: randomMacAddress}
 	ch := make(chan interface{})
 	defer close(ch)
 	requestNum := 0
@@ -296,7 +297,7 @@
 			requestNum := 0
 			for _, stub := range stubs {
 				go sendEnableDeviceRequest(ctx, stub, deviceId, ch)
-				requestNum +=1
+				requestNum += 1
 			}
 			receivedResponse := 0
 			var err error
@@ -308,7 +309,7 @@
 				if !ok {
 				} else if er, ok := res.(error); ok {
 					err = er
-				} else if _ , ok := res.(*empty.Empty); ok {
+				} else if _, ok := res.(*empty.Empty); ok {
 					validResponseReceived = true
 				}
 				if receivedResponse == requestNum {
@@ -324,19 +325,22 @@
 	return nil
 }
 
-
 func TestConcurrentRequests(t *testing.T) {
 	fmt.Println("Testing Concurrent requests ...")
 
 	////0. Start kafka and Ectd
-	//startKafka()
-	//startEtcd()
+	startKafka()
+	defer stopKafka()
+	startEtcd()
+	defer stopKafka()
 	//
 	////1. Start the core
-	//startCores()
+	startCores()
+	defer stopCores()
 	//
 	////2. Start the simulated adapters
-	//startSimulatedOLTAndONUAdapters()
+	startSimulatedOLTAndONUAdapters()
+	defer stopSimulatedOLTAndONUAdapters()
 	//
 	//// Wait until the core and adapters sync up
 	//time.Sleep(10 * time.Second)
@@ -364,7 +368,6 @@
 	//stopEtcd()
 }
 
-
 func shutdown() {
 	for _, conn := range conns {
 		conn.Close()
