diff --git a/Makefile b/Makefile
index 649b10b..e719891 100644
--- a/Makefile
+++ b/Makefile
@@ -90,7 +90,7 @@
 	@mkdir -p python/local_imports
 ifdef LOCAL_PROTOS
 	mkdir -p vendor/github.com/opencord/voltha-protos/go
-	cp -r ${GOPATH}/src/github.com/opencord/voltha-protos/go/* vendor/github.com/opencord/voltha-protos/go
+	cp -r ${LOCAL_PROTOS}/go/* vendor/github.com/opencord/voltha-protos/go
 	rm -rf python/local_imports/voltha-protos
 	mkdir -p python/local_imports/voltha-protos/dist
 	cp ../voltha-protos/dist/*.tar.gz python/local_imports/voltha-protos/dist/
@@ -100,7 +100,7 @@
 local-lib-go:
 ifdef LOCAL_LIB_GO
 	mkdir -p vendor/github.com/opencord/voltha-lib-go/pkg
-	cp -r ${GOPATH}/src/github.com/opencord/voltha-lib-go/pkg/* vendor/github.com/opencord/voltha-lib-go/pkg/
+	cp -r ${LOCAL_LIB_GO}/pkg/* vendor/github.com/opencord/voltha-lib-go/pkg/
 endif
 
 local-pyvoltha:
diff --git a/go.mod b/go.mod
index 6595e62..514830e 100644
--- a/go.mod
+++ b/go.mod
@@ -4,12 +4,11 @@
 
 require (
 	github.com/bclicn/color v0.0.0-20180711051946-108f2023dc84
-	github.com/cevaris/ordered_map v0.0.0-20190319150403-3adeae072e73
 	github.com/gogo/protobuf v1.3.0
 	github.com/golang/protobuf v1.3.2
 	github.com/google/uuid v1.1.1
 	github.com/gyuho/goraph v0.0.0-20160328020532-d460590d53a9
-	github.com/opencord/voltha-lib-go v0.0.0-20191023185531-80258b36a64b
+	github.com/opencord/voltha-lib-go v0.0.0-20191024175357-456b893dc42c
 	github.com/opencord/voltha-protos v1.0.3
 	github.com/stretchr/testify v1.4.0
 	google.golang.org/grpc v1.24.0
diff --git a/go.sum b/go.sum
index 5331e02..4831e35 100644
--- a/go.sum
+++ b/go.sum
@@ -192,8 +192,8 @@
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I=
 github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/opencord/voltha-lib-go v0.0.0-20191023185531-80258b36a64b h1:s3zvCa27RhpVy+wCk5R4iKa9H61B1MzbSL2164B1w68=
-github.com/opencord/voltha-lib-go v0.0.0-20191023185531-80258b36a64b/go.mod h1:+bjwfm5bbP1j6liscpn3UFqbh6hHDkmLDWU3AdYLDY4=
+github.com/opencord/voltha-lib-go v0.0.0-20191024175357-456b893dc42c h1:+8iex9a0qDyuNqCXfy2SBHOK0Cfiev38RhQqkIitpew=
+github.com/opencord/voltha-lib-go v0.0.0-20191024175357-456b893dc42c/go.mod h1:VDb+kLjSvAm4iaArzXB143fug199CG0/wv+Bseh1mcM=
 github.com/opencord/voltha-protos v1.0.3 h1:9v+R/QGF1xK+HKTqFM0IqCABoGCAxC8iKH4VzNBJDto=
 github.com/opencord/voltha-protos v1.0.3/go.mod h1:myfFIkJdA+rCXmKdLImhh79MfabN4ZOKQ4grk32DnPQ=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
diff --git a/rw_core/core/device_agent.go b/rw_core/core/device_agent.go
index 4a5274b..c8e07a9 100755
--- a/rw_core/core/device_agent.go
+++ b/rw_core/core/device_agent.go
@@ -19,8 +19,9 @@
 	"context"
 	"fmt"
 	"github.com/gogo/protobuf/proto"
-	fu "github.com/opencord/voltha-go/rw_core/utils"
+	coreutils "github.com/opencord/voltha-go/rw_core/utils"
 	"github.com/opencord/voltha-lib-go/pkg/db/model"
+	fu "github.com/opencord/voltha-lib-go/pkg/flows"
 	"github.com/opencord/voltha-lib-go/pkg/log"
 	ic "github.com/opencord/voltha-protos/go/inter_container"
 	ofp "github.com/opencord/voltha-protos/go/openflow_13"
@@ -323,7 +324,7 @@
 	device.FlowGroups = &voltha.FlowGroups{Items: updatedGroups}
 	go agent.updateDeviceWithoutLockAsync(device, chdB)
 
-	if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chAdapters, chdB); res != nil {
+	if res := coreutils.WaitForNilOrErrorResponses(agent.defaultTimeout, chAdapters, chdB); res != nil {
 		log.Debugw("Failed to get response from adapter[or] DB", log.Fields{"result": res})
 		return status.Errorf(codes.Aborted, "errors-%s", res)
 	}
@@ -414,7 +415,7 @@
 	device.FlowGroups = &voltha.FlowGroups{Items: groupsToKeep}
 	go agent.updateDeviceWithoutLockAsync(device, chdB)
 
-	if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chAdapters, chdB); res != nil {
+	if res := coreutils.WaitForNilOrErrorResponses(agent.defaultTimeout, chAdapters, chdB); res != nil {
 		return status.Errorf(codes.Aborted, "errors-%s", res)
 	}
 	return nil
@@ -522,7 +523,7 @@
 	device.FlowGroups = &voltha.FlowGroups{Items: updatedGroups}
 	go agent.updateDeviceWithoutLockAsync(device, chdB)
 
-	if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chAdapters, chdB); res != nil {
+	if res := coreutils.WaitForNilOrErrorResponses(agent.defaultTimeout, chAdapters, chdB); res != nil {
 		return status.Errorf(codes.Aborted, "errors-%s", res)
 	}
 	return nil
diff --git a/rw_core/core/logical_device_agent.go b/rw_core/core/logical_device_agent.go
index 21f65fa..c36e1a2 100644
--- a/rw_core/core/logical_device_agent.go
+++ b/rw_core/core/logical_device_agent.go
@@ -22,8 +22,9 @@
 	"github.com/gogo/protobuf/proto"
 	fd "github.com/opencord/voltha-go/rw_core/flow_decomposition"
 	"github.com/opencord/voltha-go/rw_core/graph"
-	fu "github.com/opencord/voltha-go/rw_core/utils"
+	coreutils "github.com/opencord/voltha-go/rw_core/utils"
 	"github.com/opencord/voltha-lib-go/pkg/db/model"
+	fu "github.com/opencord/voltha-lib-go/pkg/flows"
 	"github.com/opencord/voltha-lib-go/pkg/log"
 	ic "github.com/opencord/voltha-protos/go/inter_container"
 	ofp "github.com/opencord/voltha-protos/go/openflow_13"
@@ -406,7 +407,7 @@
 			}(child, ch)
 		}
 		// Wait for completion
-		if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
+		if res := coreutils.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
 			return status.Errorf(codes.Aborted, "errors-%s", res)
 		}
 	}
@@ -1034,7 +1035,7 @@
 		}(deviceId, value.ListFlows(), value.ListGroups())
 	}
 	// Wait for completion
-	if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
+	if res := coreutils.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
 		return status.Errorf(codes.Aborted, "errors-%s", res)
 	}
 	return nil
@@ -1056,7 +1057,7 @@
 		}(deviceId, value.ListFlows(), value.ListGroups())
 	}
 	// Wait for completion
-	if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
+	if res := coreutils.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
 		return status.Errorf(codes.Aborted, "errors-%s", res)
 	}
 	return nil
@@ -1078,7 +1079,7 @@
 		}(deviceId, value.ListFlows(), value.ListGroups())
 	}
 	// Wait for completion
-	if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
+	if res := coreutils.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
 		return status.Errorf(codes.Aborted, "errors-%s", res)
 	}
 	return nil
diff --git a/rw_core/flow_decomposition/flow_decomposer.go b/rw_core/flow_decomposition/flow_decomposer.go
index d28a803..ff9225c 100644
--- a/rw_core/flow_decomposition/flow_decomposer.go
+++ b/rw_core/flow_decomposition/flow_decomposer.go
@@ -20,7 +20,7 @@
 	"github.com/gogo/protobuf/proto"
 	"github.com/opencord/voltha-go/rw_core/coreIf"
 	"github.com/opencord/voltha-go/rw_core/graph"
-	fu "github.com/opencord/voltha-go/rw_core/utils"
+	fu "github.com/opencord/voltha-lib-go/pkg/flows"
 	"github.com/opencord/voltha-lib-go/pkg/log"
 	ofp "github.com/opencord/voltha-protos/go/openflow_13"
 	"github.com/opencord/voltha-protos/go/voltha"
diff --git a/rw_core/flow_decomposition/flow_decomposer_test.go b/rw_core/flow_decomposition/flow_decomposer_test.go
index 3264c12..37faa25 100644
--- a/rw_core/flow_decomposition/flow_decomposer_test.go
+++ b/rw_core/flow_decomposition/flow_decomposer_test.go
@@ -18,7 +18,7 @@
 import (
 	"errors"
 	"github.com/opencord/voltha-go/rw_core/graph"
-	fu "github.com/opencord/voltha-go/rw_core/utils"
+	fu "github.com/opencord/voltha-lib-go/pkg/flows"
 	"github.com/opencord/voltha-lib-go/pkg/log"
 	ofp "github.com/opencord/voltha-protos/go/openflow_13"
 	"github.com/opencord/voltha-protos/go/voltha"
diff --git a/rw_core/utils/flow_utils_test.go b/rw_core/utils/flow_utils_test.go
deleted file mode 100644
index c51a778..0000000
--- a/rw_core/utils/flow_utils_test.go
+++ /dev/null
@@ -1,689 +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 utils
-
-import (
-	"github.com/opencord/voltha-lib-go/pkg/log"
-	ofp "github.com/opencord/voltha-protos/go/openflow_13"
-	"github.com/stretchr/testify/assert"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/status"
-	"strings"
-	"testing"
-)
-
-func init() {
-	log.AddPackage(log.JSON, log.WarnLevel, nil)
-	timeoutError = status.Errorf(codes.Aborted, "timeout")
-	taskFailureError = status.Error(codes.Internal, "test failure task")
-}
-
-func TestFlowsAndGroups_AddFlow(t *testing.T) {
-	fg := NewFlowsAndGroups()
-	allFlows := fg.ListFlows()
-	assert.Equal(t, 0, len(allFlows))
-	fg.AddFlow(nil)
-	allFlows = fg.ListFlows()
-	assert.Equal(t, 0, len(allFlows))
-
-	var fa *FlowArgs
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(1),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 1),
-			TunnelId(uint64(1)),
-			EthType(0x0800),
-			Ipv4Dst(0xffffffff),
-			IpProto(17),
-			UdpSrc(68),
-			UdpDst(67),
-		},
-		Actions: []*ofp.OfpAction{
-			PushVlan(0x8100),
-			SetField(VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 4000)),
-			Output(uint32(ofp.OfpPortNo_OFPP_CONTROLLER)),
-		},
-	}
-	flow := MkFlowStat(fa)
-	fg.AddFlow(flow)
-
-	allFlows = fg.ListFlows()
-	assert.Equal(t, 1, len(allFlows))
-	assert.True(t, FlowMatch(flow, allFlows[0]))
-}
-
-func TestFlowsAndGroups_AddGroup(t *testing.T) {
-	var ga *GroupArgs
-
-	fg := NewFlowsAndGroups()
-	allGroups := fg.ListGroups()
-	assert.Equal(t, 0, len(allGroups))
-	fg.AddGroup(nil)
-	allGroups = fg.ListGroups()
-	assert.Equal(t, 0, len(allGroups))
-
-	ga = &GroupArgs{
-		GroupId: 10,
-		Buckets: []*ofp.OfpBucket{
-			{Actions: []*ofp.OfpAction{
-				PopVlan(),
-				Output(1),
-			},
-			},
-		},
-	}
-	group := MkGroupStat(ga)
-	fg.AddGroup(group)
-
-	allGroups = fg.ListGroups()
-	assert.Equal(t, 1, len(allGroups))
-	assert.Equal(t, ga.GroupId, allGroups[0].Desc.GroupId)
-}
-
-func TestFlowsAndGroups_Copy(t *testing.T) {
-	fg := NewFlowsAndGroups()
-	var fa *FlowArgs
-	var ga *GroupArgs
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-		},
-		Actions: []*ofp.OfpAction{
-			SetField(VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 10)),
-			Output(1),
-		},
-	}
-	flow := MkFlowStat(fa)
-	fg.AddFlow(flow)
-
-	ga = &GroupArgs{
-		GroupId: 10,
-		Buckets: []*ofp.OfpBucket{
-			{Actions: []*ofp.OfpAction{
-				PopVlan(),
-				Output(1),
-			},
-			},
-		},
-	}
-	group := MkGroupStat(ga)
-	fg.AddGroup(group)
-
-	fgCopy := fg.Copy()
-
-	allFlows := fgCopy.ListFlows()
-	assert.Equal(t, 1, len(allFlows))
-	assert.True(t, FlowMatch(flow, allFlows[0]))
-
-	allGroups := fgCopy.ListGroups()
-	assert.Equal(t, 1, len(allGroups))
-	assert.Equal(t, ga.GroupId, allGroups[0].Desc.GroupId)
-
-	fg = NewFlowsAndGroups()
-	fgCopy = fg.Copy()
-	allFlows = fgCopy.ListFlows()
-	allGroups = fgCopy.ListGroups()
-	assert.Equal(t, 0, len(allFlows))
-	assert.Equal(t, 0, len(allGroups))
-}
-
-func TestFlowsAndGroups_GetFlow(t *testing.T) {
-	fg := NewFlowsAndGroups()
-	var fa1 *FlowArgs
-	var fa2 *FlowArgs
-	var ga *GroupArgs
-
-	fa1 = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			Metadata_ofp((1000 << 32) | 1),
-			VlanPcp(0),
-		},
-		Actions: []*ofp.OfpAction{
-			PopVlan(),
-		},
-	}
-	flow1 := MkFlowStat(fa1)
-
-	fa2 = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 1500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(5),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-		},
-		Actions: []*ofp.OfpAction{
-			PushVlan(0x8100),
-			SetField(VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 1000)),
-			SetField(VlanPcp(0)),
-			Output(2),
-		},
-	}
-	flow2 := MkFlowStat(fa2)
-
-	fg.AddFlow(flow1)
-	fg.AddFlow(flow2)
-
-	ga = &GroupArgs{
-		GroupId: 10,
-		Buckets: []*ofp.OfpBucket{
-			{Actions: []*ofp.OfpAction{
-				PopVlan(),
-				Output(1),
-			},
-			},
-		},
-	}
-	group := MkGroupStat(ga)
-	fg.AddGroup(group)
-
-	gf1 := fg.GetFlow(0)
-	assert.True(t, FlowMatch(flow1, gf1))
-
-	gf2 := fg.GetFlow(1)
-	assert.True(t, FlowMatch(flow2, gf2))
-
-	gf3 := fg.GetFlow(2)
-	assert.Nil(t, gf3)
-
-	allFlows := fg.ListFlows()
-	assert.True(t, FlowMatch(flow1, allFlows[0]))
-	assert.True(t, FlowMatch(flow2, allFlows[1]))
-}
-
-func TestFlowsAndGroups_String(t *testing.T) {
-	fg := NewFlowsAndGroups()
-	var fa *FlowArgs
-	var ga *GroupArgs
-
-	str := fg.String()
-	assert.True(t, str == "")
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			Group(10),
-		},
-	}
-	flow := MkFlowStat(fa)
-	fg.AddFlow(flow)
-
-	ga = &GroupArgs{
-		GroupId: 10,
-		Buckets: []*ofp.OfpBucket{
-			{Actions: []*ofp.OfpAction{
-				PopVlan(),
-				Output(1),
-			},
-			},
-		},
-	}
-	group := MkGroupStat(ga)
-	fg.AddGroup(group)
-
-	str = fg.String()
-	assert.True(t, strings.Contains(str, "id: 1143307409938767207"))
-	assert.True(t, strings.Contains(str, "group_id: 10"))
-	assert.True(t, strings.Contains(str, "oxm_class: OFPXMC_OPENFLOW_BASICOFPXMC_OPENFLOW_BASIC"))
-	assert.True(t, strings.Contains(str, "type: OFPXMT_OFB_VLAN_VIDOFPXMT_OFB_VLAN_VID"))
-	assert.True(t, strings.Contains(str, "vlan_vid: 4096"))
-	assert.True(t, strings.Contains(str, "buckets:"))
-}
-
-func TestFlowsAndGroups_AddFrom(t *testing.T) {
-	fg := NewFlowsAndGroups()
-	var fa *FlowArgs
-	var ga *GroupArgs
-
-	str := fg.String()
-	assert.True(t, str == "")
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			Metadata_ofp(1000),
-			TunnelId(uint64(1)),
-			VlanPcp(0),
-		},
-		Actions: []*ofp.OfpAction{
-			PopVlan(),
-			Output(1),
-		},
-	}
-	flow := MkFlowStat(fa)
-	fg.AddFlow(flow)
-
-	ga = &GroupArgs{
-		GroupId: 10,
-		Buckets: []*ofp.OfpBucket{
-			{Actions: []*ofp.OfpAction{
-				PopVlan(),
-				Output(1),
-			},
-			},
-		},
-	}
-	group := MkGroupStat(ga)
-	fg.AddGroup(group)
-
-	fg1 := NewFlowsAndGroups()
-	fg1.AddFrom(fg)
-
-	allFlows := fg1.ListFlows()
-	allGroups := fg1.ListGroups()
-	assert.Equal(t, 1, len(allFlows))
-	assert.Equal(t, 1, len(allGroups))
-	assert.True(t, FlowMatch(flow, allFlows[0]))
-	assert.Equal(t, group.Desc.GroupId, allGroups[0].Desc.GroupId)
-}
-
-func TestDeviceRules_AddFlow(t *testing.T) {
-	dr := NewDeviceRules()
-	rules := dr.GetRules()
-	assert.True(t, len(rules) == 0)
-
-	dr.AddFlow("123456", nil)
-	rules = dr.GetRules()
-	assert.True(t, len(rules) == 1)
-	val, ok := rules["123456"]
-	assert.True(t, ok)
-	assert.Equal(t, 0, len(val.ListFlows()))
-	assert.Equal(t, 0, len(val.ListGroups()))
-
-	var fa *FlowArgs
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			Metadata_ofp(1000),
-			TunnelId(uint64(1)),
-			VlanPcp(0),
-		},
-		Actions: []*ofp.OfpAction{
-			PopVlan(),
-			Output(1),
-		},
-	}
-	flow := MkFlowStat(fa)
-	dr.AddFlow("123456", flow)
-	rules = dr.GetRules()
-	assert.True(t, len(rules) == 1)
-	val, ok = rules["123456"]
-	assert.True(t, ok)
-	assert.Equal(t, 1, len(val.ListFlows()))
-	assert.True(t, FlowMatch(flow, val.ListFlows()[0]))
-	assert.Equal(t, 0, len(val.ListGroups()))
-}
-
-func TestDeviceRules_AddFlowsAndGroup(t *testing.T) {
-	fg := NewFlowsAndGroups()
-	var fa *FlowArgs
-	var ga *GroupArgs
-
-	str := fg.String()
-	assert.True(t, str == "")
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 2000},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			Metadata_ofp(1000),
-			TunnelId(uint64(1)),
-			VlanPcp(0),
-		},
-		Actions: []*ofp.OfpAction{
-			PopVlan(),
-			Output(1),
-		},
-	}
-	flow := MkFlowStat(fa)
-	fg.AddFlow(flow)
-
-	ga = &GroupArgs{
-		GroupId: 10,
-		Buckets: []*ofp.OfpBucket{
-			{Actions: []*ofp.OfpAction{
-				PopVlan(),
-				Output(1),
-			},
-			},
-		},
-	}
-	group := MkGroupStat(ga)
-	fg.AddGroup(group)
-
-	dr := NewDeviceRules()
-	dr.AddFlowsAndGroup("123456", fg)
-	rules := dr.GetRules()
-	assert.True(t, len(rules) == 1)
-	val, ok := rules["123456"]
-	assert.True(t, ok)
-	assert.Equal(t, 1, len(val.ListFlows()))
-	assert.Equal(t, 1, len(val.ListGroups()))
-	assert.True(t, FlowMatch(flow, val.ListFlows()[0]))
-	assert.Equal(t, 10, int(val.ListGroups()[0].Desc.GroupId))
-}
-
-func TestFlowHasOutPort(t *testing.T) {
-	var flow *ofp.OfpFlowStats
-	assert.False(t, FlowHasOutPort(flow, 1))
-
-	fa := &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 2000},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			Metadata_ofp(1000),
-			TunnelId(uint64(1)),
-			VlanPcp(0),
-		},
-		Actions: []*ofp.OfpAction{
-			PopVlan(),
-			Output(1),
-		},
-	}
-	flow = MkFlowStat(fa)
-	assert.True(t, FlowHasOutPort(flow, 1))
-	assert.False(t, FlowHasOutPort(flow, 2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 2000},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-		},
-	}
-	flow = MkFlowStat(fa)
-	assert.False(t, FlowHasOutPort(flow, 1))
-}
-
-func TestFlowHasOutGroup(t *testing.T) {
-	var flow *ofp.OfpFlowStats
-	assert.False(t, FlowHasOutGroup(flow, 10))
-
-	fa := &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			Group(10),
-		},
-	}
-	flow = MkFlowStat(fa)
-	assert.True(t, FlowHasOutGroup(flow, 10))
-	assert.False(t, FlowHasOutGroup(flow, 11))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			Output(1),
-		},
-	}
-	flow = MkFlowStat(fa)
-	assert.False(t, FlowHasOutGroup(flow, 1))
-}
-
-func TestMatchFlow(t *testing.T) {
-	assert.False(t, FlowMatch(nil, nil))
-	fa := &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			Group(10),
-		},
-	}
-	flow1 := MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, nil))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			Group(10),
-		},
-	}
-	flow2 := MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, flow2))
-	assert.False(t, FlowMatch(nil, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.True(t, FlowMatch(flow1, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 501, "table_id": 1, "cookie": 38268468, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			Group(10),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 2, "cookie": 38268468, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268467, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 14},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(4),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			PopVlan(),
-			Output(1),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.True(t, FlowMatch(flow1, flow2))
-}
-
-func TestFlowMatchesMod(t *testing.T) {
-	assert.False(t, FlowMatchesMod(nil, nil))
-	fa := &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			Output(1),
-			Group(10),
-		},
-	}
-	flow := MkFlowStat(fa)
-	assert.False(t, FlowMatchesMod(flow, nil))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			PopVlan(),
-			Output(1),
-		},
-	}
-	flowMod := MkSimpleFlowMod(ToOfpOxmField(fa.MatchFields), fa.Actions, fa.Command, fa.KV)
-	assert.False(t, FlowMatchesMod(nil, flowMod))
-	assert.False(t, FlowMatchesMod(flow, flowMod))
-	assert.True(t, FlowMatch(flow, FlowStatsEntryFromFlowModMessage(flowMod)))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"table_id": uint64(ofp.OfpTable_OFPTT_ALL),
-			"cookie_mask": 0,
-			"out_port":    uint64(ofp.OfpPortNo_OFPP_ANY),
-			"out_group":   uint64(ofp.OfpGroup_OFPG_ANY),
-		},
-	}
-	flowMod = MkSimpleFlowMod(ToOfpOxmField(fa.MatchFields), fa.Actions, fa.Command, fa.KV)
-	assert.True(t, FlowMatchesMod(flow, flowMod))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"table_id": 1,
-			"cookie_mask": 0,
-			"out_port":    uint64(ofp.OfpPortNo_OFPP_ANY),
-			"out_group":   uint64(ofp.OfpGroup_OFPG_ANY),
-		},
-	}
-	flowMod = MkSimpleFlowMod(ToOfpOxmField(fa.MatchFields), fa.Actions, fa.Command, fa.KV)
-	assert.True(t, FlowMatchesMod(flow, flowMod))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"table_id": 1,
-			"cookie_mask": 0,
-			"out_port":    1,
-			"out_group":   uint64(ofp.OfpGroup_OFPG_ANY),
-		},
-	}
-	flowMod = MkSimpleFlowMod(ToOfpOxmField(fa.MatchFields), fa.Actions, fa.Command, fa.KV)
-	assert.True(t, FlowMatchesMod(flow, flowMod))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"table_id": 1,
-			"cookie_mask": 0,
-			"out_port":    1,
-			"out_group":   10,
-		},
-	}
-	flowMod = MkSimpleFlowMod(ToOfpOxmField(fa.MatchFields), fa.Actions, fa.Command, fa.KV)
-	assert.True(t, FlowMatchesMod(flow, flowMod))
-}
diff --git a/rw_core/utils/flow_utils.go b/vendor/github.com/opencord/voltha-lib-go/pkg/flows/flow_utils.go
similarity index 99%
rename from rw_core/utils/flow_utils.go
rename to vendor/github.com/opencord/voltha-lib-go/pkg/flows/flow_utils.go
index 7cb718e..2dbf52d 100644
--- a/rw_core/utils/flow_utils.go
+++ b/vendor/github.com/opencord/voltha-lib-go/pkg/flows/flow_utils.go
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package utils
+package flows
 
 import (
 	"bytes"
diff --git a/vendor/modules.txt b/vendor/modules.txt
index d52f030..bedca4f 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -62,7 +62,7 @@
 github.com/mitchellh/go-homedir
 # github.com/mitchellh/mapstructure v1.1.2
 github.com/mitchellh/mapstructure
-# github.com/opencord/voltha-lib-go v0.0.0-20191023185531-80258b36a64b
+# github.com/opencord/voltha-lib-go v0.0.0-20191024175357-456b893dc42c
 github.com/opencord/voltha-lib-go/pkg/log
 github.com/opencord/voltha-lib-go/pkg/db/kvstore
 github.com/opencord/voltha-lib-go/pkg/grpc
@@ -70,6 +70,7 @@
 github.com/opencord/voltha-lib-go/pkg/version
 github.com/opencord/voltha-lib-go/pkg/db/model
 github.com/opencord/voltha-lib-go/pkg/kafka
+github.com/opencord/voltha-lib-go/pkg/flows
 github.com/opencord/voltha-lib-go/pkg/adapters/common
 github.com/opencord/voltha-lib-go/pkg/adapters
 github.com/opencord/voltha-lib-go/pkg/adapters/adapterif
