diff --git a/lib/netconfig/example_test.go b/lib/netconfig/example_test.go
deleted file mode 100644
index 33ab162..0000000
--- a/lib/netconfig/example_test.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package netconfig_test
-
-import (
-	"fmt"
-	"log"
-
-	"v.io/x/ref/lib/netconfig"
-)
-
-func ExampleNetConfigWatcher() {
-	w, err := netconfig.NewNetConfigWatcher()
-	if err != nil {
-		log.Fatalf("oops: %s", err)
-	}
-	fmt.Println("Do something to your network. You should see one or more dings.")
-	for {
-		<-w.Channel()
-		fmt.Println("ding")
-	}
-}
diff --git a/lib/netconfig/ipaux_bsd.go b/lib/netconfig/ipaux_bsd.go
deleted file mode 100644
index 507f013..0000000
--- a/lib/netconfig/ipaux_bsd.go
+++ /dev/null
@@ -1,192 +0,0 @@
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package netconfig
-
-// We connect to the Route socket and parse messages to
-// look for network configuration changes.  This is generic
-// to all BSD based systems (including MacOS).  The net
-// library already has code to parse the messages so all
-// we need to do is look for message types.
-
-import (
-	"errors"
-	"net"
-	"sync"
-	"syscall"
-	"time"
-
-	"v.io/x/lib/vlog"
-)
-
-/*
-#include <sys/socket.h>
-*/
-import "C"
-
-type bsdNetConfigWatcher struct {
-	sync.Mutex
-	t       *time.Timer
-	c       chan struct{}
-	s       int
-	stopped bool
-}
-
-func (w *bsdNetConfigWatcher) Stop() {
-	w.Lock()
-	defer w.Unlock()
-	if w.stopped {
-		return
-	}
-	w.stopped = true
-	syscall.Close(w.s)
-}
-
-func (w *bsdNetConfigWatcher) Channel() chan struct{} {
-	return w.c
-}
-
-// NewNetConfigWatcher returns a watcher that sends a message
-// on the Channel() whenever the config changes.
-func NewNetConfigWatcher() (NetConfigWatcher, error) {
-	s, err := syscall.Socket(C.PF_ROUTE, syscall.SOCK_RAW, syscall.AF_UNSPEC)
-	if err != nil {
-		vlog.Infof("socket failed: %s", err)
-		return nil, err
-	}
-	w := &bsdNetConfigWatcher{c: make(chan struct{}, 1), s: s}
-	go w.watcher()
-	return w, nil
-}
-
-func (w *bsdNetConfigWatcher) ding() {
-	w.Lock()
-	defer w.Unlock()
-	w.t = nil
-	if w.stopped {
-		return
-	}
-	// Don't let us hang in the lock.  The default is safe because the requirement
-	// is that the client get a message after the last config change.  Since this is
-	// a queued chan, we really don't have to stuff anything in it if there's already
-	// something there.
-	select {
-	case w.c <- struct{}{}:
-	default:
-	}
-}
-
-func (w *bsdNetConfigWatcher) watcher() {
-	defer w.Stop()
-
-	// Loop waiting for messages.
-	for {
-		b := make([]byte, 4096)
-		nr, err := syscall.Read(w.s, b)
-		if err != nil {
-			return
-		}
-		msgs, err := syscall.ParseRoutingMessage(b[:nr])
-		if err != nil {
-			vlog.Infof("Couldn't parse: %s", err)
-			continue
-		}
-
-		// Decode the addresses.
-		for _, m := range msgs {
-			switch m.(type) {
-			case *syscall.InterfaceMessage:
-			case *syscall.InterfaceAddrMessage:
-			case *syscall.RouteMessage:
-			default:
-				continue
-			}
-			// Changing networks usually spans many seconds and involves
-			// multiple network config changes.  We add histeresis by
-			// setting an alarm when the first change is detected and
-			// not informing the client till the alarm goes off.
-			// NOTE(p): I chose 3 seconds because that covers all the
-			// events involved in moving from one wifi network to another.
-			w.Lock()
-			if w.t == nil {
-				w.t = time.AfterFunc(3*time.Second, w.ding)
-			}
-			w.Unlock()
-		}
-	}
-
-	w.Stop()
-	w.Lock()
-	close(w.c)
-	if w.t != nil {
-		w.t.Stop()
-	}
-	w.Unlock()
-}
-
-func toIP(sa syscall.Sockaddr) (net.IP, error) {
-	switch v := sa.(type) {
-	case *syscall.SockaddrInet4:
-		return net.IPv4(v.Addr[0], v.Addr[1], v.Addr[2], v.Addr[3]), nil
-	case *syscall.SockaddrInet6:
-		return net.IP(v.Addr[:]), nil
-	}
-	return net.IPv6zero, errors.New("unknown sockaddr ip")
-}
-
-func toIPNet(sa syscall.Sockaddr, msa syscall.Sockaddr) (net.IPNet, error) {
-	var x net.IPNet
-	var err error
-	x.IP, err = toIP(sa)
-	if err != nil {
-		return x, err
-	}
-	switch v := msa.(type) {
-	case *syscall.SockaddrInet4:
-		x.Mask = net.IPv4Mask(v.Addr[0], v.Addr[1], v.Addr[2], v.Addr[3])
-		return x, nil
-	case *syscall.SockaddrInet6:
-		x.Mask = net.IPMask(v.Addr[:])
-		return x, nil
-	}
-	return x, errors.New("unknown sockaddr ipnet")
-}
-
-// IPRoutes returns all kernel known routes.  If defaultOnly is set, only default routes
-// are returned.
-func GetIPRoutes(defaultOnly bool) []*IPRoute {
-	var x []*IPRoute
-	rib, err := syscall.RouteRIB(syscall.NET_RT_DUMP, 0)
-	if err != nil {
-		vlog.Infof("Couldn't read: %s", err)
-		return x
-	}
-	msgs, err := syscall.ParseRoutingMessage(rib)
-	if err != nil {
-		vlog.Infof("Couldn't parse: %s", err)
-		return x
-	}
-	for _, m := range msgs {
-		switch v := m.(type) {
-		case *syscall.RouteMessage:
-			addrs, err := syscall.ParseRoutingSockaddr(m)
-			if err != nil {
-				return x
-			}
-			if addrs[0] == nil || addrs[1] == nil || addrs[2] == nil {
-				continue
-			}
-			r := new(IPRoute)
-			if r.Gateway, err = toIP(addrs[1]); err != nil {
-				continue
-			}
-			if r.Net, err = toIPNet(addrs[0], addrs[2]); err != nil {
-				continue
-			}
-			r.IfcIndex = int(v.Header.Index)
-			if !defaultOnly || IsDefaultIPRoute(r) {
-				x = append(x, r)
-			}
-		}
-	}
-	return x
-}
diff --git a/lib/netconfig/ipaux_linux.go b/lib/netconfig/ipaux_linux.go
deleted file mode 100644
index e36b9e5..0000000
--- a/lib/netconfig/ipaux_linux.go
+++ /dev/null
@@ -1,457 +0,0 @@
-// +build linux
-
-package netconfig
-
-// We connect to the Netlink Route socket and parse messages to
-// look for network configuration changes.  This is very Linux
-// specific, hence the file name.
-
-import (
-	"errors"
-	"fmt"
-	"net"
-	"sync"
-	"syscall"
-	"time"
-	"unsafe"
-
-	"v.io/x/lib/vlog"
-)
-
-/*
-#include <linux/rtnetlink.h>
-*/
-import "C"
-
-// All rtnetlink attributes start with this header.
-type rtAttrHdr C.struct_rtattr
-
-const rtAttrHdrLen = C.sizeof_struct_rtattr
-
-// The address change messages (RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR).
-type ifaddrMsgHdr C.struct_ifaddrmsg
-
-const ifaddrMsgHdrLen = C.sizeof_struct_ifaddrmsg
-
-type rtAttribute fmt.Stringer
-
-type rtAddressMessage struct {
-	name       string
-	hdr        ifaddrMsgHdr
-	attributes []rtAttribute
-}
-
-// Attribute types (see rtnetlink(7))
-type ifaAddress net.IP
-type ifaLocal net.IP
-type ifaBroadcast net.IP
-type ifaAnycast net.IP
-type ifaMulticast net.IP
-type ifaLabel string
-type ifaCacheInfo C.struct_ifa_cacheinfo
-
-const ifaCacheInfoLen = C.sizeof_struct_ifa_cacheinfo
-
-// String routines to make debugging easier.
-func (a ifaAddress) String() string   { return "Address=" + net.IP(a).String() }
-func (a ifaLocal) String() string     { return "Local=" + net.IP(a).String() }
-func (a ifaBroadcast) String() string { return "Braodcast=" + net.IP(a).String() }
-func (a ifaAnycast) String() string   { return "Anycast=" + net.IP(a).String() }
-func (a ifaMulticast) String() string { return "Anycast=" + net.IP(a).String() }
-func (a ifaLabel) String() string     { return "Label=" + string(a) }
-func (a ifaCacheInfo) String() string {
-	return fmt.Sprintf("CacheInfo[preferred %d valid %d cstamp %d tstamp %d]", a.ifa_prefered, a.ifa_valid, a.cstamp, a.tstamp)
-}
-func (m *rtAddressMessage) String() string {
-	return fmt.Sprintf("%s: index %d %v", m.name, m.hdr.ifa_index, m.attributes)
-}
-
-// Address looks for the address attribute in an rtAddressMessage.  If it isn't there, just assume the null address.
-func (m *rtAddressMessage) Address() net.IP {
-	for _, a := range m.attributes {
-		switch a.(type) {
-		case ifaAddress:
-			return net.IP(a.(ifaAddress))
-		}
-	}
-	return net.IPv4zero
-}
-
-func parsertAddressAttribute(b []byte) (rtAttribute, []byte, error) {
-	if len(b) == 0 {
-		return nil, nil, nil
-	}
-	if len(b) < rtAttrHdrLen {
-		return nil, nil, errors.New("attribute too short")
-	}
-	ahdr := (*rtAttrHdr)(unsafe.Pointer(&b[0]))
-	rounded := ((ahdr.rta_len + 3) / 4) * 4
-	if len(b) < int(rounded) {
-		return nil, nil, errors.New("attribute too short")
-	}
-	remaining := b[rounded:]
-	b = b[rtAttrHdrLen:ahdr.rta_len]
-	switch ahdr.rta_type {
-	case C.IFA_ADDRESS:
-		return rtAttribute(ifaAddress(net.IP(b))), remaining, nil
-	case C.IFA_LOCAL:
-		return rtAttribute(ifaLocal(b)), remaining, nil
-	case C.IFA_LABEL:
-		return rtAttribute(ifaLabel(b)), remaining, nil
-	case C.IFA_BROADCAST:
-		return rtAttribute(ifaBroadcast(b)), remaining, nil
-	case C.IFA_ANYCAST:
-		return rtAttribute(ifaAnycast(b)), remaining, nil
-	case C.IFA_CACHEINFO:
-		if len(b) < ifaCacheInfoLen {
-			return nil, nil, errors.New("attribute too short")
-		}
-		return rtAttribute(ifaCacheInfo(*(*C.struct_ifa_cacheinfo)(unsafe.Pointer(&b[0])))), remaining, nil
-	case C.IFA_MULTICAST:
-		return rtAttribute(ifaMulticast(b)), remaining, nil
-	}
-	return nil, remaining, errors.New("unknown attribute")
-}
-
-func parsertAddressMessage(nlm syscall.NetlinkMessage) (*rtAddressMessage, error) {
-	var name string
-	switch nlm.Header.Type {
-	case C.RTM_NEWADDR:
-		name = "RTM_NEWADDR"
-	case C.RTM_DELADDR:
-		name = "RTM_DELADDR"
-	case C.RTM_GETADDR:
-		name = "RTM_GETADDR"
-	default:
-		return nil, fmt.Errorf("unknown message type")
-	}
-	if len(nlm.Data) < ifaddrMsgHdrLen {
-		return nil, errors.New("bad length")
-	}
-	m := &rtAddressMessage{name: name, hdr: *(*ifaddrMsgHdr)(unsafe.Pointer(&nlm.Data[0]))}
-	b := nlm.Data[ifaddrMsgHdrLen:]
-	for {
-		var a rtAttribute
-		var err error
-		a, b, err = parsertAddressAttribute(b)
-		if b == nil {
-			break
-		}
-		if err == nil {
-			m.attributes = append(m.attributes, a)
-		}
-	}
-	return m, nil
-}
-
-// The link change messages (RTM_NEWLINK, RTM_DELLINK, RTM_GETLINK).
-type ifInfoMsgHdr C.struct_ifinfomsg
-
-const ifInfoMsgHdrLen = C.sizeof_struct_ifinfomsg
-
-type rtLinkMessage struct {
-	name       string
-	hdr        ifInfoMsgHdr
-	attributes []rtAttribute
-}
-
-// Attribute types (see rtnetlink(7))
-type iflaAddress []byte
-type iflaBroadcast []byte
-type iflaIFName string
-type iflaMTU uint32
-type iflaLink int
-type iflaQDisc string
-type iflaOperstate int
-type iflaStats C.struct_rtnl_link_stats
-
-const iflaStatsLen = C.sizeof_struct_rtnl_link_stats
-
-// String routines to make debugging easier.
-func (a iflaAddress) String() string   { return fmt.Sprintf("HWAddress=%v", []byte(a)) }
-func (a iflaBroadcast) String() string { return fmt.Sprintf("HWBroadcast=%v", []byte(a)) }
-func (a iflaIFName) String() string    { return "Name=" + string(a) }
-func (a iflaMTU) String() string       { return fmt.Sprintf("MTU=%d", uint32(a)) }
-func (a iflaLink) String() string      { return fmt.Sprintf("Type=%d", int(a)) }
-func (a iflaQDisc) String() string     { return "Qdisc=" + string(a) }
-func (a iflaStats) String() string {
-	return fmt.Sprintf("Stats[rx %d tx %d ...]", a.rx_packets, a.tx_packets)
-}
-func (a iflaOperstate) String() string { return fmt.Sprintf("Operstate=%d", int(a)) }
-func (m *rtLinkMessage) String() string {
-	return fmt.Sprintf("%s: index %d %v", m.name, m.hdr.ifi_index, m.attributes)
-}
-
-func parseRTLinkAttribute(b []byte) (rtAttribute, []byte, error) {
-	if len(b) == 0 {
-		return nil, nil, nil
-	}
-	if len(b) < rtAttrHdrLen {
-		return nil, nil, errors.New("attribute too short")
-	}
-	ahdr := (*rtAttrHdr)(unsafe.Pointer(&b[0]))
-	rounded := ((ahdr.rta_len + 3) / 4) * 4
-	if len(b) < int(rounded) {
-		return nil, nil, errors.New("attribute too short")
-	}
-	remaining := b[rounded:]
-	b = b[rtAttrHdrLen:ahdr.rta_len]
-	switch ahdr.rta_type {
-	case C.IFLA_ADDRESS:
-		return rtAttribute(iflaAddress(b)), remaining, nil
-	case C.IFLA_BROADCAST:
-		return rtAttribute(iflaBroadcast(b)), remaining, nil
-	case C.IFLA_IFNAME:
-		return rtAttribute(iflaIFName(string(b))), remaining, nil
-	case C.IFLA_MTU:
-		return rtAttribute(iflaMTU(*(*C.uint)(unsafe.Pointer(&b[0])))), remaining, nil
-	case C.IFLA_LINK:
-		return rtAttribute(iflaMTU(*(*C.int)(unsafe.Pointer(&b[0])))), remaining, nil
-	case C.IFLA_QDISC:
-		return rtAttribute(iflaQDisc(string(b))), remaining, nil
-	case C.IFLA_STATS:
-		if len(b) < iflaStatsLen {
-			return nil, remaining, errors.New("attribute too short")
-		}
-		return rtAttribute(iflaStats(*(*C.struct_rtnl_link_stats)(unsafe.Pointer(&b[0])))), remaining, nil
-	case C.IFLA_OPERSTATE:
-		return rtAttribute(iflaOperstate(*(*C.int)(unsafe.Pointer(&b[0])))), remaining, nil
-	}
-	return nil, remaining, errors.New("unknown attribute")
-}
-
-func parsertLinkMessage(nlm syscall.NetlinkMessage) (*rtLinkMessage, error) {
-	var name string
-	switch nlm.Header.Type {
-	case C.RTM_NEWLINK:
-		name = "RTM_NEWLINK"
-	case C.RTM_DELLINK:
-		name = "RTM_DELLINK"
-	case C.RTM_GETLINK:
-		name = "RTM_GETLINK"
-	default:
-		return nil, fmt.Errorf("unknown message type")
-	}
-	if len(nlm.Data) < ifInfoMsgHdrLen {
-		return nil, errors.New("bad length")
-	}
-	m := &rtLinkMessage{name: name, hdr: *(*ifInfoMsgHdr)(unsafe.Pointer(&nlm.Data[0]))}
-	b := nlm.Data[ifInfoMsgHdrLen:]
-	for {
-		var a rtAttribute
-		var err error
-		a, b, err = parseRTLinkAttribute(b)
-		if b == nil {
-			break
-		}
-		if err == nil {
-			m.attributes = append(m.attributes, a)
-		}
-	}
-	return m, nil
-}
-
-type rtnetlinkWatcher struct {
-	sync.Mutex
-	t       *time.Timer
-	c       chan struct{}
-	s       int
-	stopped bool
-}
-
-func (w *rtnetlinkWatcher) Stop() {
-	w.Lock()
-	defer w.Unlock()
-	if w.stopped {
-		return
-	}
-	w.stopped = true
-	syscall.Close(w.s)
-}
-
-func (w *rtnetlinkWatcher) Channel() chan struct{} {
-	return w.c
-}
-
-const (
-	GROUPS = C.RTMGRP_LINK | C.RTMGRP_IPV4_IFADDR | C.RTMGRP_IPV4_MROUTE | C.RTMGRP_IPV4_ROUTE | C.RTMGRP_IPV6_IFADDR | C.RTMGRP_IPV6_MROUTE | C.RTMGRP_IPV6_ROUTE | C.RTMGRP_NOTIFY
-)
-
-// NewNetConfigWatcher returns a watcher that wakes up anyone
-// calling the Wait routine whenever the configuration changes.
-func NewNetConfigWatcher() (NetConfigWatcher, error) {
-	s, err := syscall.Socket(syscall.AF_NETLINK, syscall.SOCK_RAW, syscall.NETLINK_ROUTE)
-	if err != nil {
-		vlog.Infof("netconfig socket failed: %s", err)
-		return nil, err
-	}
-
-	lsa := &syscall.SockaddrNetlink{Family: syscall.AF_NETLINK, Groups: GROUPS}
-	if err := syscall.Bind(s, lsa); err != nil {
-		vlog.Infof("netconfig bind failed: %s", err)
-		return nil, err
-	}
-
-	w := &rtnetlinkWatcher{c: make(chan struct{}, 1), s: s}
-	go w.watcher()
-	return w, nil
-}
-
-func (w *rtnetlinkWatcher) ding() {
-	w.Lock()
-	defer w.Unlock()
-	w.t = nil
-	if w.stopped {
-		return
-	}
-	// Don't let us hang in the lock.  The default is safe because the requirement
-	// is that the client get a message after the last config change.  Since this is
-	// a queued chan, we really don't have to stuff anything in it if there's already
-	// something there.
-	select {
-	case w.c <- struct{}{}:
-	default:
-	}
-}
-
-func (w *rtnetlinkWatcher) watcher() {
-	var newAddrs []net.IP
-	for {
-		rb := make([]byte, 4096)
-		nr, _, err := syscall.Recvfrom(w.s, rb, 0)
-		if err != nil {
-			break
-		}
-		rb = rb[:nr]
-		msgs, err := syscall.ParseNetlinkMessage(rb)
-		if err != nil {
-			vlog.Infof("ParseNetlinkMessage failed: %s", err)
-			continue
-		}
-	L:
-		for _, m := range msgs {
-			if am, err := parsertAddressMessage(m); err == nil {
-				// NOTE(p): We get continuous NEWADDR messages about some
-				// IPv6 addresses in Google corp.  Just ignore duplicate back
-				// to back NEWADDRs about the same addresses.
-				if am.name == "RTM_NEWADDR" {
-					addr := am.Address()
-					for _, a := range newAddrs {
-						if addr.Equal(a) {
-							break L
-						}
-					}
-					newAddrs = append(newAddrs, addr)
-				} else {
-					newAddrs = nil
-				}
-			} else if _, err := parsertLinkMessage(m); err == nil {
-				newAddrs = nil
-			} else {
-				continue
-			}
-			// Changing networks usually spans many seconds and involves
-			// multiple network config changes.  We add histeresis by
-			// setting an alarm when the first change is detected and
-			// not informing the client till the alarm goes off.
-			// NOTE(p): I chose 3 seconds because that covers all the
-			// events involved in moving from one wifi network to another.
-			w.Lock()
-			if w.t == nil {
-				w.t = time.AfterFunc(3*time.Second, w.ding)
-			}
-			w.Unlock()
-		}
-	}
-
-	w.Stop()
-	w.Lock()
-	close(w.c)
-	if w.t != nil {
-		w.t.Stop()
-	}
-	w.Unlock()
-}
-func toIP(a []byte) (net.IP, error) {
-	switch len(a) {
-	case 4:
-		return net.IPv4(a[0], a[1], a[2], a[3]), nil
-	case 16:
-		return net.IP(a), nil
-	}
-	return net.IPv6unspecified, errors.New("unknown ip address len")
-}
-
-// IPRoutes returns all kernel known routes.  If defaultOnly is set, only default routes
-// are returned.
-func GetIPRoutes(defaultOnly bool) []*IPRoute {
-	var iproutes []*IPRoute
-	rib, err := syscall.NetlinkRIB(syscall.RTM_GETROUTE, syscall.AF_UNSPEC)
-	if err != nil {
-		vlog.Infof("Couldn't read: %s", err)
-		return iproutes
-	}
-	msgs, err := syscall.ParseNetlinkMessage(rib)
-	if err != nil {
-		vlog.Infof("Couldn't parse: %s", err)
-		return iproutes
-	}
-L:
-	for _, m := range msgs {
-		if m.Header.Type != syscall.RTM_NEWROUTE {
-			continue
-		}
-		attrs, err := syscall.ParseNetlinkRouteAttr(&m)
-		if err != nil {
-			continue
-		}
-		r := new(IPRoute)
-		for _, a := range attrs {
-			switch a.Attr.Type {
-			case syscall.RTA_DST:
-				if r.Net.IP, err = toIP(a.Value[:]); err != nil {
-					continue L
-				}
-			case syscall.RTA_GATEWAY:
-				if r.Gateway, err = toIP(a.Value[:]); err != nil {
-					continue L
-				}
-			case syscall.RTA_OIF:
-				r.IfcIndex = int(a.Value[0])
-			case syscall.RTA_PREFSRC:
-				if r.PreferredSource, err = toIP(a.Value[:]); err != nil {
-					continue L
-				}
-			}
-		}
-
-		// There is no RTA_DST attribute if destination is a default gateway.
-		// Set the destination IP with zero IP, if not set yet.
-		if r.Net.IP == nil {
-			if r.Gateway == nil {
-				continue
-			}
-			if r.Gateway.To4() != nil {
-				r.Net.IP = net.IPv4zero
-			} else {
-				r.Net.IP = net.IPv6zero
-			}
-		}
-
-		addrLen := 128
-		if r.Net.IP.To4() != nil {
-			addrLen = 32
-		}
-
-		b := m.Data[:syscall.SizeofRtMsg]
-		a := (*syscall.RtMsg)(unsafe.Pointer(&b[0]))
-		if int(a.Dst_len) > addrLen {
-			continue
-		}
-		r.Net.Mask = net.CIDRMask(int(a.Dst_len), addrLen)
-		if !defaultOnly || IsDefaultIPRoute(r) {
-			iproutes = append(iproutes, r)
-		}
-	}
-	return iproutes
-}
diff --git a/lib/netconfig/ipaux_other.go b/lib/netconfig/ipaux_other.go
deleted file mode 100644
index 948c0c7..0000000
--- a/lib/netconfig/ipaux_other.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// +build !linux,!darwin,!dragonfly,!freebsd,!netbsd,!openbsd
-// TODO(bprosnitz) Should change for nacl?
-
-package netconfig
-
-// Code to signal a network change every 2 minutes.   We use
-// this for systems where we don't yet have a good way to
-// watch for network changes.
-
-import (
-	"time"
-)
-
-type timerNetConfigWatcher struct {
-	c    chan struct{} // channel to signal confg changes
-	stop chan struct{} // channel to tell the watcher to stop
-}
-
-// Stop any waiter
-func (w *timerNetConfigWatcher) Stop() {
-	w.stop <- struct{}{}
-}
-
-func (w *timerNetConfigWatcher) Channel() chan struct{} {
-	return w.c
-}
-
-func (w *timerNetConfigWatcher) watcher() {
-	for {
-		select {
-		case <-w.stop:
-			close(w.c)
-			return
-		case <-time.NewTimer(2 * time.Minute).C:
-			select {
-			case w.c <- struct{}{}:
-			default:
-			}
-		}
-	}
-}
-
-func NewNetConfigWatcher() (NetConfigWatcher, error) {
-	w := &timerNetConfigWatcher{}
-	w.c = make(chan struct{})
-	w.stop = make(chan struct{}, 1)
-	go w.watcher()
-	return w, nil
-}
-
-func GetIPRoutes(defaultOnly bool) []*IPRoute {
-	// TODO(nlacasse,bprosnitz): Consider implementing? For now return
-	// empty array, since that seems to keep things working.
-	return []*IPRoute{}
-}
diff --git a/lib/netconfig/iproute.go b/lib/netconfig/iproute.go
deleted file mode 100644
index 43115e3..0000000
--- a/lib/netconfig/iproute.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// package netconfig implements a network configuration watcher.
-// NOTE(p): This is also where we should put any code that changes
-//          network configuration.
-
-package netconfig
-
-import "net"
-
-func isZeroSlice(a []byte) bool {
-	for _, i := range a {
-		if i != 0 {
-			return false
-		}
-	}
-	return true
-}
-
-// IsDefaultRoute returns true if r is a default route, i.e., that it matches any destination address.
-func IsDefaultIPRoute(r *IPRoute) bool {
-	if !r.Net.IP.Equal(net.IPv4zero) && !r.Net.IP.Equal(net.IPv6zero) {
-		return false
-	}
-	return isZeroSlice(r.Net.Mask[:])
-}
-
-// IsDefaultIPv4Route returns true if r is a default IPv4 route.
-func IsDefaultIPv4Route(r *IPRoute) bool {
-	if !r.Net.IP.Equal(net.IPv4zero) && !r.Net.IP.Equal(net.IPv6zero) {
-		return false
-	}
-	return len(r.Net.Mask) == 4 && isZeroSlice(r.Net.Mask[:])
-}
-
-// IsDefaultIPv6Route returns true if r is a default IPv6 route.
-func IsDefaultIPv6Route(r *IPRoute) bool {
-	if !r.Net.IP.Equal(net.IPv4zero) && !r.Net.IP.Equal(net.IPv6zero) {
-		return false
-	}
-	return len(r.Net.Mask) == 16 && isZeroSlice(r.Net.Mask[:])
-}
diff --git a/lib/netconfig/model.go b/lib/netconfig/model.go
deleted file mode 100644
index 27898cc..0000000
--- a/lib/netconfig/model.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// package netconfig implements a network configuration watcher.
-// NOTE(p): This is also where we should put any code that changes
-//          network configuration.
-
-package netconfig
-
-import (
-	"net"
-)
-
-// NetConfigWatcher sends on channel whenever an interface or interface address
-// is added or deleted.
-type NetConfigWatcher interface {
-	// Stop watching.
-	Stop()
-
-	// A channel that returns an item whenever the network addresses or
-	// interfaces have changed. It is up to the caller to reread the
-	// network configuration in such cases.
-	Channel() chan struct{}
-}
-
-// IPRoute represents a route in the kernel's routing table.
-// Any route with a nil Gateway is a directly connected network.
-type IPRoute struct {
-	Net             net.IPNet
-	Gateway         net.IP
-	PreferredSource net.IP
-	IfcIndex        int
-}
diff --git a/lib/netstate/isgloballyroutable.go b/lib/netstate/isgloballyroutable.go
deleted file mode 100644
index ee6bae5..0000000
--- a/lib/netstate/isgloballyroutable.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package netstate
-
-import (
-	"net"
-)
-
-var privateCIDRs = []net.IPNet{
-	net.IPNet{IP: net.IPv4(10, 0, 0, 0), Mask: net.IPv4Mask(0xff, 0, 0, 0)},
-	net.IPNet{IP: net.IPv4(172, 16, 0, 0), Mask: net.IPv4Mask(0xff, 0xf0, 0, 0)},
-	net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(0xff, 0xff, 0, 0)},
-}
-
-// IsGloballyRoutable returns true if the argument is a globally routable IP address.
-func IsGloballyRoutableIP(ip net.IP) bool {
-	if !ip.IsGlobalUnicast() {
-		return false
-	}
-	if ip4 := ip.To4(); ip4 != nil {
-		for _, cidr := range privateCIDRs {
-			if cidr.Contains(ip4) {
-				return false
-			}
-		}
-		if ip4.Equal(net.IPv4bcast) {
-			return false
-		}
-	}
-	return true
-}
diff --git a/lib/netstate/isgloballyroutable_test.go b/lib/netstate/isgloballyroutable_test.go
deleted file mode 100644
index dd0885a..0000000
--- a/lib/netstate/isgloballyroutable_test.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package netstate
-
-import (
-	"net"
-	"testing"
-)
-
-func TestIsGloballyRoutable(t *testing.T) {
-	tests := []struct {
-		ip   string
-		want bool
-	}{
-		{"192.168.1.1", false},
-		{"192.169.0.3", true},
-		{"10.1.1.1", false},
-		{"172.17.100.255", false},
-		{"172.32.0.1", true},
-		{"255.255.255.255", false},
-		{"127.0.0.1", false},
-		{"224.0.0.1", false},
-		{"FF02::FB", false},
-		{"fe80::be30:5bff:fed3:843f", false},
-		{"2620:0:1000:8400:be30:5bff:fed3:843f", true},
-	}
-	for _, test := range tests {
-		ip := net.ParseIP(test.ip)
-		if got := IsGloballyRoutableIP(ip); got != test.want {
-			t.Fatalf("%s: want %v got %v", test.ip, test.want, got)
-		}
-	}
-}
diff --git a/lib/netstate/netstate.go b/lib/netstate/netstate.go
deleted file mode 100644
index 623e7b2..0000000
--- a/lib/netstate/netstate.go
+++ /dev/null
@@ -1,398 +0,0 @@
-// Package netstate provides routines to obtain the available set of
-// of network addresess, for determining changes to those addresses and for
-// selecting from amongst them according to some set of policies that are
-// implemented by applying simple predicates (functions with names of the form
-// Is<condition>) to filter or find the first matching address from a list
-// of addresses. The intent is to make it easy to create policies that do
-// things like 'find the first IPv4 unicast address that is globally routable,
-// failing that use a private IPv4 address, and failing that, an IPv6 address'.
-//
-// A simple usage would be:
-//
-//   state, _ := netstate.GetAccessibleIPs()
-//   ipv4 := state.Filter(netstate.IsPublicUnicastIPv4)
-//   // ipv4 will contain all of the public IPv4 addresses, if any.
-//
-// The example policy described above would be implemented using a
-// series of calls to Filter with appropriate predicates.
-//
-// In some cases, it may be necessary to take IP routing information
-// into account and hence interface hosting the address. The interface
-// hosting each address is provided in the AddrIfc structure used to represent
-// addresses and the IP routing information is provided by the GetAccessibleIPs
-// function which will typically be used to obtain the available IP addresses.
-//
-// Although most commercial networking hardware supports IPv6, some consumer
-// devices and more importantly many ISPs do not, so routines are provided
-// to allow developers to easily distinguish between the two and to use
-// whichever is appropriate for their product/situation.
-//
-// The term 'accessible' is used to refer to any non-loopback IP address.
-// The term 'public' is used to refer to any globally routable IP address.
-//
-// All IPv6 addresses are intended to be 'public', but any starting with
-// fc00::/7 (RFC4193) are reserved for private use, but the go
-// net libraries do not appear to recognise this. Similarly fe80::/10
-// (RFC 4291) are reserved for 'site-local' usage, but again this is not
-// implemented in the go libraries. Any developer who needs to distinguish
-// these cases will need to write their own routines to test for them.
-//
-// When using the go net package it is important to remember that IPv6
-// addresses subsume IPv4 and hence in many cases the same internal
-// representation is used for both, thus testing for the length of the IP
-// address is unreliable. The reliable test is to use the net.To4() which
-// will return a non-nil result if can be used as an IPv4 one. Any address
-// can be used as an IPv6 and hence the only reliable way to test for an IPv6
-// address that is not an IPv4 one also is for the To4 call to return nil for
-// it.
-package netstate
-
-import (
-	"fmt"
-	"net"
-	"strings"
-
-	"v.io/v23/ipc"
-
-	"v.io/x/ref/lib/netconfig"
-)
-
-// AddrIfc represents a network address and the network interface that
-// hosts it.
-type AddrIfc struct {
-	// Network address
-	Addr net.Addr
-
-	// The name of the network interface this address is hosted on, empty
-	// if this information is not available.
-	Name string
-
-	// The IPRoutes of the network interface this address is hosted on,
-	// nil if this information is not available.
-	IPRoutes []*netconfig.IPRoute
-}
-
-func (a *AddrIfc) String() string {
-	if a.IPRoutes != nil {
-		r := fmt.Sprintf("%s: %s[", a.Addr, a.Name)
-		for _, rt := range a.IPRoutes {
-			src := ""
-			if rt.PreferredSource != nil {
-				src = ", src: " + rt.PreferredSource.String()
-			}
-			r += fmt.Sprintf("{%d: net: %s, gw: %s%s}, ", rt.IfcIndex, rt.Net, rt.Gateway, src)
-		}
-		r = strings.TrimSuffix(r, ", ")
-		r += "]"
-		return r
-	}
-	return a.Addr.String()
-}
-
-func (a *AddrIfc) Address() net.Addr {
-	return a.Addr
-}
-
-func (a *AddrIfc) InterfaceIndex() int {
-	if len(a.IPRoutes) == 0 {
-		return -1
-	}
-	return a.IPRoutes[0].IfcIndex
-}
-
-func (a *AddrIfc) InterfaceName() string {
-	return a.Name
-}
-
-func (a *AddrIfc) Networks() []net.Addr {
-	nets := []net.Addr{}
-	for _, r := range a.IPRoutes {
-		nets = append(nets, &r.Net)
-	}
-	return nets
-}
-
-type AddrList []ipc.Address
-
-func (al AddrList) String() string {
-	r := ""
-	for _, v := range al {
-		r += fmt.Sprintf("(%s) ", v)
-	}
-	return strings.TrimRight(r, " ")
-}
-
-// GetAll gets all of the available addresses on the device, including
-// loopback addresses, non-IP protocols etc.
-func GetAll() (AddrList, error) {
-	interfaces, err := net.Interfaces()
-	if err != nil {
-		return nil, err
-	}
-	routes := netconfig.GetIPRoutes(false)
-	routeTable := make(map[int][]*netconfig.IPRoute)
-	for _, r := range routes {
-		routeTable[r.IfcIndex] = append(routeTable[r.IfcIndex], r)
-	}
-	var all AddrList
-	for _, ifc := range interfaces {
-		addrs, err := ifc.Addrs()
-		if err != nil {
-			continue
-		}
-		for _, a := range addrs {
-			all = append(all, &AddrIfc{a, ifc.Name, routeTable[ifc.Index]})
-		}
-	}
-	return all, nil
-}
-
-// GetAccessibleIPs returns all of the accessible IP addresses on the device
-// - i.e. excluding loopback and unspecified addresses.
-// The IP addresses returned will be host addresses.
-func GetAccessibleIPs() (AddrList, error) {
-	all, err := GetAll()
-	if err != nil {
-		return nil, err
-	}
-	return all.Map(ConvertAccessibleIPHost), nil
-}
-
-// AddressPredicate defines the function signature for predicate functions
-// to be used with AddrList
-type AddressPredicate func(a ipc.Address) bool
-
-// Filter returns all of the addresses for which the predicate
-// function is true.
-func (al AddrList) Filter(predicate AddressPredicate) AddrList {
-	r := AddrList{}
-	for _, a := range al {
-		if predicate(a) {
-			r = append(r, a)
-		}
-	}
-	return r
-}
-
-type Mapper func(a ipc.Address) ipc.Address
-
-// Map will apply the Mapper function to all of the items in its receiver
-// and return a new AddrList containing all of the non-nil results from
-// said calls.
-func (al AddrList) Map(mapper Mapper) AddrList {
-	var ral AddrList
-	for _, a := range al {
-		if na := mapper(a); na != nil {
-			ral = append(ral, na)
-		}
-	}
-	return ral
-}
-
-// ConvertToIPHost converts the network address component of an ipc.Address into
-// an instance with a net.Addr that contains an IP host address (as opposed to a
-// network CIDR for example).
-func ConvertToIPHost(a ipc.Address) ipc.Address {
-	aifc, ok := a.(*AddrIfc)
-	if !ok {
-		return nil
-	}
-	aifc.Addr = AsIPAddr(aifc.Addr)
-	return aifc
-}
-
-// ConvertAccessibleIPHost converts the network address component of an ipc.Address
-// into an instance with a net.Addr that contains an IP host address (as opposed to a
-// network CIDR for example) with filtering out a loopback or non-accessible IPs.
-func ConvertAccessibleIPHost(a ipc.Address) ipc.Address {
-	if !IsAccessibleIP(a) {
-		return nil
-	}
-	aifc, ok := a.(*AddrIfc)
-	if !ok {
-		return nil
-	}
-	if ip := AsIPAddr(aifc.Addr); ip != nil {
-		aifc.Addr = ip
-	}
-	return aifc
-}
-
-// IsIPProtocol returns true if its parameter is one of the allowed
-// network/protocol values for IP.
-func IsIPProtocol(n string) bool {
-	// Removed the training IP version number.
-	n = strings.TrimRightFunc(n, func(r rune) bool { return r == '4' || r == '6' })
-	switch n {
-	case "ip+net", "ip", "tcp", "udp", "ws", "wsh":
-		return true
-	default:
-		return false
-	}
-}
-
-// AsIPAddr returns its argument as a net.IPAddr if that's possible.
-func AsIPAddr(a net.Addr) *net.IPAddr {
-	if v, ok := a.(*net.IPAddr); ok {
-		return v
-	}
-	if ipn, ok := a.(*net.IPNet); ok {
-		return &net.IPAddr{IP: ipn.IP}
-	}
-	if IsIPProtocol(a.Network()) {
-		if r := net.ParseIP(a.String()); r != nil {
-			return &net.IPAddr{IP: r}
-		}
-	}
-	return nil
-}
-
-// AsIP returns its argument as a net.IP if that's possible.
-func AsIP(a net.Addr) net.IP {
-	ipAddr := AsIPAddr(a)
-	if ipAddr == nil {
-		return nil
-	}
-	return ipAddr.IP
-}
-
-// IsUnspecified returns true if its argument is an unspecified IP address
-func IsUnspecifiedIP(a ipc.Address) bool {
-	if ip := AsIP(a.Address()); ip != nil {
-		return ip.IsUnspecified()
-	}
-	return false
-}
-
-// IsLoopback returns true if its argument is a loopback IP address
-func IsLoopbackIP(a ipc.Address) bool {
-	if ip := AsIP(a.Address()); ip != nil && !ip.IsUnspecified() {
-		return ip.IsLoopback()
-	}
-	return false
-}
-
-// IsAccessible returns true if its argument is an accessible (non-loopback)
-// IP address.
-func IsAccessibleIP(a ipc.Address) bool {
-	if ip := AsIP(a.Address()); ip != nil && !ip.IsUnspecified() {
-		return !ip.IsLoopback()
-	}
-	return false
-}
-
-// IsUnicastIP returns true if its argument is a unicast IP address.
-func IsUnicastIP(a ipc.Address) bool {
-	if ip := AsIP(a.Address()); ip != nil && !ip.IsUnspecified() {
-		// ipv4 or v6
-		return !(ip.IsMulticast() || ip.IsLinkLocalMulticast() || ip.IsInterfaceLocalMulticast())
-	}
-	return false
-}
-
-// IsUnicastIPv4 returns true if its argument is a unicast IP4 address
-func IsUnicastIPv4(a ipc.Address) bool {
-	if ip := AsIP(a.Address()); ip != nil && ip.To4() != nil {
-		return !ip.IsUnspecified() && !ip.IsMulticast()
-	}
-	return false
-}
-
-// IsPublicUnicastIPv4 returns true if its argument is a globally routable,
-// public IPv4 unicast address.
-func IsPublicUnicastIPv4(a ipc.Address) bool {
-	if ip := AsIP(a.Address()); ip != nil && !ip.IsUnspecified() {
-		if t := ip.To4(); t != nil && IsGloballyRoutableIP(t) {
-			return !ip.IsMulticast()
-		}
-	}
-	return false
-}
-
-// IsUnicastIPv6 returns true if its argument is a unicast IPv6 address
-func IsUnicastIPv6(a ipc.Address) bool {
-	if ip := AsIP(a.Address()); ip != nil && ip.To4() == nil {
-		return !ip.IsUnspecified() && !(ip.IsLinkLocalMulticast() || ip.IsInterfaceLocalMulticast())
-	}
-	return false
-}
-
-// IsUnicastIPv6 returns true if its argument is a globally routable IP6
-// address
-func IsPublicUnicastIPv6(a ipc.Address) bool {
-	if ip := AsIP(a.Address()); ip != nil && ip.To4() == nil {
-		if t := ip.To16(); t != nil && IsGloballyRoutableIP(t) {
-			return true
-		}
-	}
-	return false
-}
-
-// IsPublicUnicastIP returns true if its argument is a global routable IPv4
-// or 6 address.
-func IsPublicUnicastIP(a ipc.Address) bool {
-	if ip := AsIP(a.Address()); ip != nil {
-		if t := ip.To4(); t != nil && IsGloballyRoutableIP(t) {
-			return true
-		}
-		if t := ip.To16(); t != nil && IsGloballyRoutableIP(t) {
-			return true
-		}
-	}
-	return false
-}
-
-func diffAB(a, b AddrList) AddrList {
-	diff := AddrList{}
-	for _, av := range a {
-		found := false
-		for _, bv := range b {
-			if av.Address().Network() == bv.Address().Network() &&
-				av.Address().String() == bv.Address().String() {
-				found = true
-				break
-			}
-		}
-		if !found {
-			diff = append(diff, av)
-		}
-	}
-	return diff
-}
-
-// FindAdded returns the set addresses that are present in b, but not
-// in a - i.e. have been added.
-func FindAdded(a, b AddrList) AddrList {
-	return diffAB(b, a)
-}
-
-// FindRemoved returns the set of addresses that are present in a, but not
-// in b - i.e. have been removed.
-func FindRemoved(a, b AddrList) AddrList {
-	return diffAB(a, b)
-}
-
-// SameMachine returns true if the provided addr is on the device executing this
-// function.
-func SameMachine(addr net.Addr) (bool, error) {
-	// The available interfaces may change between calls.
-	addrs, err := GetAll()
-	if err != nil {
-		return false, err
-	}
-	ips := make(map[string]struct{})
-	for _, a := range addrs {
-		ip, _, err := net.ParseCIDR(a.Address().String())
-		if err != nil {
-			return false, err
-		}
-		ips[ip.String()] = struct{}{}
-	}
-
-	client, _, err := net.SplitHostPort(addr.String())
-	if err != nil {
-		return false, err
-	}
-	_, islocal := ips[client]
-	return islocal, nil
-}
diff --git a/lib/netstate/netstate_test.go b/lib/netstate/netstate_test.go
deleted file mode 100644
index 954b9d4..0000000
--- a/lib/netstate/netstate_test.go
+++ /dev/null
@@ -1,448 +0,0 @@
-package netstate_test
-
-import (
-	"net"
-	"reflect"
-	"testing"
-
-	"v.io/v23/ipc"
-
-	"v.io/x/ref/lib/netconfig"
-	"v.io/x/ref/lib/netstate"
-)
-
-func TestGet(t *testing.T) {
-	// We assume that this machine running this test has at least
-	// one non-loopback interface.
-	all, err := netstate.GetAll()
-	if err != nil {
-		t.Fatalf("unexpected error: %s", err)
-	}
-	all = all.Map(netstate.ConvertToIPHost)
-	accessible, err := netstate.GetAccessibleIPs()
-	if err != nil {
-		t.Fatalf("unexpected error: %s", err)
-	}
-	if len(all) == 0 || len(accessible) == 0 {
-		t.Errorf("expected non zero lengths, not %d and %d", len(all), len(accessible))
-	}
-	if len(accessible) > len(all) {
-		t.Errorf("should never be more accessible addresses than 'all' addresses")
-	}
-	loopback := netstate.FindAdded(accessible, all)
-	if got, want := loopback.Filter(netstate.IsLoopbackIP), loopback; !reflect.DeepEqual(got, want) {
-		t.Errorf("got %v, want %v", got, want)
-	}
-}
-
-type ma struct {
-	n, a string
-}
-
-func (a *ma) Network() string {
-	return a.n
-}
-
-func (a *ma) String() string {
-	return a.a
-}
-
-func mkAddr(n, a string) net.Addr {
-	ip := net.ParseIP(a)
-	return &ma{n: n, a: ip.String()}
-}
-
-func TestAsIP(t *testing.T) {
-	lh := net.ParseIP("127.0.0.1")
-	if got, want := netstate.AsIP(&net.IPAddr{IP: lh}), "127.0.0.1"; got == nil || got.String() != want {
-		t.Errorf("got %v, want %v", got, want)
-	}
-	if got, want := netstate.AsIP(&net.IPNet{IP: lh}), "127.0.0.1"; got == nil || got.String() != want {
-		t.Errorf("got %v, want %v", got, want)
-	}
-	if got, want := netstate.AsIP(&ma{"tcp", lh.String()}), "127.0.0.1"; got == nil || got.String() != want {
-		t.Errorf("got %v, want %v", got, want)
-	}
-}
-
-func TestRoutes(t *testing.T) {
-	accessible, err := netstate.GetAccessibleIPs()
-	if err != nil {
-		t.Fatalf("unexpected error: %s", err)
-	}
-	ifcl, err := netstate.GetInterfaces()
-	if err != nil {
-		t.Fatalf("unexpected error: %s", err)
-	}
-
-	if len(ifcl) == 0 || len(accessible) == 0 {
-		t.Errorf("expected non zero lengths, not %d and %d", len(ifcl), len(accessible))
-	}
-
-	routes := netstate.GetRoutes()
-	// Make sure that the routes refer to valid interfaces
-	for _, r := range routes {
-		found := false
-		for _, ifc := range ifcl {
-			if r.IfcIndex == ifc.Index {
-				found = true
-				break
-			}
-		}
-		if !found {
-			t.Errorf("failed to find ifc index %d", r.IfcIndex)
-		}
-	}
-}
-
-func mkAddrIfc(n, a string) *netstate.AddrIfc {
-	ip := net.ParseIP(a)
-	return &netstate.AddrIfc{
-		Addr: &ma{n: n, a: ip.String()},
-	}
-}
-
-type hw struct{}
-
-func (*hw) Network() string { return "mac" }
-func (*hw) String() string  { return "01:23:45:67:89:ab:cd:ef" }
-
-func TestPredicates(t *testing.T) {
-	hwifc := &netstate.AddrIfc{Addr: &hw{}}
-	if got, want := netstate.IsUnicastIP(hwifc), false; got != want {
-		t.Errorf("got %t, want %t", got, want)
-
-	}
-	cases := []struct {
-		f func(a ipc.Address) bool
-		a string
-		r bool
-	}{
-		{netstate.IsUnspecifiedIP, "0.0.0.0", true},
-		{netstate.IsUnspecifiedIP, "::", true},
-		{netstate.IsUnspecifiedIP, "127.0.0.1", false},
-		{netstate.IsUnspecifiedIP, "::1", false},
-
-		{netstate.IsLoopbackIP, "0.0.0.0", false},
-		{netstate.IsLoopbackIP, "::", false},
-		{netstate.IsLoopbackIP, "127.0.0.1", true},
-		{netstate.IsLoopbackIP, "::1", true},
-
-		{netstate.IsAccessibleIP, "0.0.0.0", false},
-		{netstate.IsAccessibleIP, "::", false},
-		{netstate.IsAccessibleIP, "127.0.0.1", false},
-		{netstate.IsAccessibleIP, "::1", false},
-		{netstate.IsAccessibleIP, "224.0.0.2", true},
-		{netstate.IsAccessibleIP, "fc00:1234::", true},
-		{netstate.IsAccessibleIP, "192.168.1.1", true},
-		{netstate.IsAccessibleIP, "2001:4860:0:2001::68", true},
-
-		{netstate.IsUnicastIP, "0.0.0.0", false},
-		{netstate.IsUnicastIP, "::", false},
-		{netstate.IsUnicastIP, "127.0.0.1", true},
-		{netstate.IsUnicastIP, "::1", true},
-		{netstate.IsUnicastIP, "192.168.1.2", true},
-		{netstate.IsUnicastIP, "74.125.239.36", true},
-		{netstate.IsUnicastIP, "224.0.0.2", false},
-		{netstate.IsUnicastIP, "fc00:1235::", true},
-		{netstate.IsUnicastIP, "ff01::01", false},
-		{netstate.IsUnicastIP, "2001:4860:0:2001::69", true},
-
-		{netstate.IsUnicastIPv4, "0.0.0.0", false},
-		{netstate.IsUnicastIPv4, "::", false},
-		{netstate.IsUnicastIPv4, "127.0.0.1", true},
-		{netstate.IsUnicastIPv4, "::1", false},
-		{netstate.IsUnicastIPv4, "192.168.1.3", true},
-		{netstate.IsUnicastIPv6, "74.125.239.37", false},
-		{netstate.IsUnicastIPv4, "224.0.0.2", false},
-		{netstate.IsUnicastIPv4, "fc00:1236::", false},
-		{netstate.IsUnicastIPv4, "ff01::02", false},
-		{netstate.IsUnicastIPv4, "2001:4860:0:2001::6a", false},
-
-		{netstate.IsUnicastIPv6, "0.0.0.0", false},
-		{netstate.IsUnicastIPv6, "::", false},
-		{netstate.IsUnicastIPv6, "127.0.0.1", false},
-		{netstate.IsUnicastIPv6, "::1", true},
-		{netstate.IsUnicastIPv6, "192.168.1.4", false},
-		{netstate.IsUnicastIPv6, "74.125.239.38", false},
-		{netstate.IsUnicastIPv6, "224.0.0.2", false},
-		{netstate.IsUnicastIPv6, "fc00:1237::", true},
-		{netstate.IsUnicastIPv6, "ff01::03", false},
-		{netstate.IsUnicastIPv6, "2607:f8b0:4003:c00::6b", true},
-
-		{netstate.IsPublicUnicastIP, "0.0.0.0", false},
-		{netstate.IsPublicUnicastIP, "::", false},
-		{netstate.IsPublicUnicastIP, "127.0.0.1", false},
-		{netstate.IsPublicUnicastIP, "::1", false},
-		{netstate.IsPublicUnicastIP, "192.168.1.2", false},
-		{netstate.IsPublicUnicastIP, "74.125.239.39", true},
-		{netstate.IsPublicUnicastIP, "224.0.0.2", false},
-		// Arguably this is buggy, the fc00:/7 prefix is supposed to be
-		// non-routable.
-		{netstate.IsPublicUnicastIP, "fc00:1238::", true},
-		{netstate.IsPublicUnicastIP, "ff01::01", false},
-		{netstate.IsPublicUnicastIP, "2001:4860:0:2001::69", true},
-
-		{netstate.IsPublicUnicastIPv4, "0.0.0.0", false},
-		{netstate.IsPublicUnicastIPv4, "::", false},
-		{netstate.IsPublicUnicastIPv4, "127.0.0.1", false},
-		{netstate.IsPublicUnicastIPv4, "::1", false},
-		{netstate.IsPublicUnicastIPv4, "192.168.1.3", false},
-		{netstate.IsPublicUnicastIPv4, "74.125.239.40", true},
-		{netstate.IsPublicUnicastIPv4, "224.0.0.2", false},
-		{netstate.IsPublicUnicastIPv4, "fc00:1239::", false},
-		{netstate.IsPublicUnicastIPv4, "ff01::02", false},
-		{netstate.IsPublicUnicastIPv4, "2001:4860:0:2001::6a", false},
-
-		{netstate.IsPublicUnicastIPv6, "0.0.0.0", false},
-		{netstate.IsPublicUnicastIPv6, "::", false},
-		{netstate.IsPublicUnicastIPv6, "127.0.0.1", false},
-		{netstate.IsPublicUnicastIPv6, "::1", false},
-		{netstate.IsPublicUnicastIPv6, "192.168.1.4", false},
-		{netstate.IsPublicUnicastIPv6, "74.125.239.41", false},
-		{netstate.IsPublicUnicastIPv6, "224.0.0.2", false},
-		// Arguably this is buggy, the fc00:/7 prefix is supposed to be
-		// non-routable.
-		{netstate.IsPublicUnicastIPv6, "fc00:123a::", true},
-		{netstate.IsPublicUnicastIPv6, "ff01::03", false},
-		{netstate.IsPublicUnicastIPv6, "2607:f8b0:4003:c00::6b", true},
-	}
-	for i, c := range cases {
-		net := "tcp"
-		if got, want := c.f(mkAddrIfc(net, c.a)), c.r; got != want {
-			t.Errorf("#%d: %s %s: got %t, want %t", i+1, net, c.a, got, want)
-		}
-	}
-}
-
-func TestRoutePredicate(t *testing.T) {
-	net1_ip, net1, _ := net.ParseCIDR("192.168.1.10/24")
-	net2_ip, net2, _ := net.ParseCIDR("172.16.1.11/24")
-	net3_ip, net3, _ := net.ParseCIDR("172.16.2.12/24")
-	// net4 and net5 are on the same interface.
-	net4_ip, net4, _ := net.ParseCIDR("172.19.39.142/23")
-	net5_ip, net5, _ := net.ParseCIDR("2620::1000:5e01:56e4:3aff:fef1:1383/64")
-
-	rt1 := []*netconfig.IPRoute{{*net1, net.ParseIP("192.168.1.1"), nil, 1}}
-	rt2 := []*netconfig.IPRoute{{*net2, net.ParseIP("172.16.1.1"), nil, 2}}
-	rt3 := []*netconfig.IPRoute{{*net3, net.ParseIP("172.16.2.1"), nil, 3}}
-	rt4_0 := &netconfig.IPRoute{*net4, net.ParseIP("172.19.39.142"), nil, 6}
-	rt4_1 := &netconfig.IPRoute{*net5, net.ParseIP("fe80::5:73ff:fea0:fb"), nil, 6}
-	rt4 := []*netconfig.IPRoute{rt4_0, rt4_1}
-
-	net1_addr := &netstate.AddrIfc{&net.IPAddr{IP: net1_ip}, "eth0", rt1}
-	net2_addr := &netstate.AddrIfc{&net.IPAddr{IP: net2_ip}, "eth1", rt2}
-	net3_addr := &netstate.AddrIfc{&net.IPAddr{IP: net3_ip}, "eth2", rt3}
-	net4_addr := &netstate.AddrIfc{&net.IPAddr{IP: net4_ip}, "wn0", rt4}
-	net5_addr := &netstate.AddrIfc{&net.IPAddr{IP: net5_ip}, "wn0", rt4}
-
-	al := netstate.AddrList{}
-	if got, want := al.Filter(netstate.IsOnDefaultRoute), (netstate.AddrList{}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %v, want %v", got, want)
-	}
-
-	al = netstate.AddrList{net1_addr, net2_addr, net3_addr, net4_addr, net5_addr}
-	if got, want := al.Filter(netstate.IsOnDefaultRoute), (netstate.AddrList{}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %v, want %v", got, want)
-	}
-
-	defaultRoute := net.IPNet{net.IPv4zero, make([]byte, net.IPv4len)}
-	// Make eth1 a default route.
-	rt2[0].Net = defaultRoute
-	if got, want := al.Filter(netstate.IsOnDefaultRoute), (netstate.AddrList{net2_addr}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %v, want %v", got, want)
-	}
-
-	// Make wn0 a default route also.
-	rt3[0].Net = defaultRoute
-	if got, want := al.Filter(netstate.IsOnDefaultRoute), (netstate.AddrList{net2_addr, net3_addr}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %v, want %v", got, want)
-	}
-
-	// Restore the original route.
-	rt2[0].Net = *net2
-	rt4_0.Net = defaultRoute
-	if got, want := al.Filter(netstate.IsOnDefaultRoute), (netstate.AddrList{net3_addr, net4_addr}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %v, want %v", got, want)
-	}
-
-	// Shouldn't return the IPv6 default route so long as al doesn't
-	// contain any IPv6 default routes.
-	rt4_0.Net = *net4
-	rt4_1.Net = defaultRoute
-	if got, want := al.Filter(netstate.IsOnDefaultRoute), (netstate.AddrList{net3_addr}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %v, want %v", got, want)
-	}
-
-	// Now that we have an IPv6 default route that matches an IPv6 gateway
-	// we can expect to find the IPv6 host address
-	rt4_1.Net = net.IPNet{net.IPv6zero, make([]byte, net.IPv6len)}
-	if got, want := al.Filter(netstate.IsOnDefaultRoute), (netstate.AddrList{net3_addr, net5_addr}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %v, want %v", got, want)
-	}
-}
-
-var (
-	a  = mkAddrIfc("tcp4", "1.2.3.4")
-	b  = mkAddrIfc("tcp4", "1.2.3.5")
-	c  = mkAddrIfc("tcp4", "1.2.3.6")
-	d  = mkAddrIfc("tcp4", "1.2.3.7")
-	a6 = mkAddrIfc("tcp6", "2001:4860:0:2001::68")
-	b6 = mkAddrIfc("tcp6", "2001:4860:0:2001::69")
-	c6 = mkAddrIfc("tcp6", "2001:4860:0:2001::70")
-	d6 = mkAddrIfc("tcp6", "2001:4860:0:2001::71")
-)
-
-func TestRemoved(t *testing.T) {
-	al := netstate.AddrList{a, b, c, a6, b6, c6}
-	bl := netstate.AddrList{}
-
-	// no changes.
-	got, want := netstate.FindRemoved(al, al), netstate.AddrList{}
-	if !reflect.DeepEqual(got, want) {
-		t.Errorf("got %#v, want %#v", got, want)
-	}
-
-	// missing everything
-	if got, want := netstate.FindRemoved(al, bl), al; !reflect.DeepEqual(got, want) {
-		t.Errorf("got %s, want %s", got, want)
-	}
-
-	// missing nothing
-	if got, want := netstate.FindRemoved(bl, al), (netstate.AddrList{}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %s, want %s", got, want)
-	}
-
-	// remove some addresses
-	bl = netstate.AddrList{a, b, a6, b6}
-	if got, want := netstate.FindRemoved(al, bl), (netstate.AddrList{c, c6}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %s, want %s", got, want)
-	}
-
-	// add some addresses
-	bl = netstate.AddrList{a, b, c, a6, b6, c6, d6}
-	if got, want := netstate.FindRemoved(al, bl), (netstate.AddrList{}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %s, want %s", got, want)
-	}
-
-	// change some addresses
-	bl = netstate.AddrList{a, b, d, a6, d6, c6}
-	if got, want := netstate.FindRemoved(al, bl), (netstate.AddrList{c, b6}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %s, want %s", got, want)
-	}
-}
-
-func TestAdded(t *testing.T) {
-	al := netstate.AddrList{a, b, c, a6, b6, c6}
-	bl := netstate.AddrList{}
-
-	// no changes.
-	if got, want := netstate.FindAdded(al, al), (netstate.AddrList{}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %s, want %s", got, want)
-	}
-
-	// add nothing
-	if got, want := netstate.FindAdded(al, bl), bl; !reflect.DeepEqual(got, want) {
-		t.Errorf("got %s, want %s", got, want)
-	}
-
-	// add everything
-	if got, want := netstate.FindAdded(bl, al), al; !reflect.DeepEqual(got, want) {
-		t.Errorf("got %s, want %s", got, want)
-	}
-
-	// add some addresses
-	bl = netstate.AddrList{a, b, c, d, a6, b6, c6, d6}
-	if got, want := netstate.FindAdded(al, bl), (netstate.AddrList{d, d6}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %s, want %s", got, want)
-	}
-
-	// remove some addresses
-	bl = netstate.AddrList{a, b, c, b6}
-	if got, want := netstate.FindAdded(al, bl), (netstate.AddrList{}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %s, want %s", got, want)
-	}
-
-	// change some addresses
-	bl = netstate.AddrList{a, d, c, a6, d6, c6}
-	if got, want := netstate.FindAdded(al, bl), (netstate.AddrList{d, d6}); !reflect.DeepEqual(got, want) {
-		t.Errorf("got %s, want %s", got, want)
-	}
-}
-
-// buildNonLocalhostTestAddress constructs a selection of test addresses
-// that are local.
-func buildNonLocalhostTestAddress(t *testing.T) []string {
-	addrs, err := net.InterfaceAddrs()
-	if err != nil {
-		t.Errorf("InterfaceAddrs() failed: %v\n", err)
-	}
-
-	ips := make([]string, 0, len(addrs))
-	for _, a := range addrs {
-		ip, _, err := net.ParseCIDR(a.String())
-		if err != nil {
-			t.Errorf("ParseCIDR() failed: %v\n", err)
-		}
-		ips = append(ips, net.JoinHostPort(ip.String(), "111"))
-	}
-	return ips
-}
-
-func TestSameMachine(t *testing.T) {
-	cases := []struct {
-		Addr *ma
-		Same bool
-		Err  error
-	}{
-		{
-			Addr: &ma{
-				n: "tcp",
-				a: "batman.com:4444",
-			},
-			Same: false,
-			Err:  nil,
-		},
-		{
-			Addr: &ma{
-				n: "tcp",
-				a: "127.0.0.1:1000",
-			},
-			Same: true,
-			Err:  nil,
-		},
-		{
-			Addr: &ma{
-				n: "tcp",
-				a: "::1/128",
-			},
-			Same: false,
-			Err:  &net.AddrError{Err: "too many colons in address", Addr: "::1/128"},
-		},
-	}
-
-	for _, a := range buildNonLocalhostTestAddress(t) {
-		cases = append(cases, struct {
-			Addr *ma
-			Same bool
-			Err  error
-		}{
-			Addr: &ma{
-				n: "tcp",
-				a: a,
-			},
-			Same: true,
-			Err:  nil,
-		})
-	}
-
-	for _, v := range cases {
-		issame, err := netstate.SameMachine(v.Addr)
-		if !reflect.DeepEqual(err, v.Err) {
-			t.Errorf("Bad error: got %#v, expected %#v\n", err, v.Err)
-		}
-		if issame != v.Same {
-			t.Errorf("for Endpoint address %v: got %v, expected %v\n", v.Addr.a, issame, v.Same)
-		}
-	}
-}
diff --git a/lib/netstate/route.go b/lib/netstate/route.go
deleted file mode 100644
index 906dc9e..0000000
--- a/lib/netstate/route.go
+++ /dev/null
@@ -1,105 +0,0 @@
-package netstate
-
-import (
-	"fmt"
-	"net"
-	"strings"
-
-	"v.io/v23/ipc"
-
-	"v.io/x/ref/lib/netconfig"
-)
-
-// Interface represents a network interface.
-type Interface struct {
-	Index int
-	Name  string
-}
-type InterfaceList []*Interface
-
-// GetInterfaces returns a list of all of the network interfaces on this
-// device.
-func GetInterfaces() (InterfaceList, error) {
-	ifcl := InterfaceList{}
-	interfaces, err := net.Interfaces()
-	if err != nil {
-		return nil, err
-	}
-	for _, ifc := range interfaces {
-		ifcl = append(ifcl, &Interface{ifc.Index, ifc.Name})
-	}
-	return ifcl, nil
-}
-
-func (ifcl InterfaceList) String() string {
-	r := ""
-	for _, ifc := range ifcl {
-		r += fmt.Sprintf("(%d: %s) ", ifc.Index, ifc.Name)
-	}
-	return strings.TrimRight(r, " ")
-}
-
-// IPRouteList is a slice of IPRoutes as returned by the netconfig package.
-type IPRouteList []*netconfig.IPRoute
-
-func (rl IPRouteList) String() string {
-	r := ""
-	for _, rt := range rl {
-		src := ""
-		if len(rt.PreferredSource) > 0 {
-			src = ", src: " + rt.PreferredSource.String()
-		}
-		r += fmt.Sprintf("(%d: net: %s, gw: %s%s) ", rt.IfcIndex, rt.Net, rt.Gateway, src)
-	}
-	return strings.TrimRight(r, " ")
-}
-
-func GetRoutes() IPRouteList {
-	return netconfig.GetIPRoutes(false)
-}
-
-// RoutePredicate defines the function signature for predicate functions
-// to be used with RouteList
-type RoutePredicate func(r *netconfig.IPRoute) bool
-
-// Filter returns all of the routes for which the predicate
-// function is true.
-func (rl IPRouteList) Filter(predicate RoutePredicate) IPRouteList {
-	r := IPRouteList{}
-	for _, rt := range rl {
-		if predicate(rt) {
-			r = append(r, rt)
-		}
-	}
-	return r
-}
-
-// IsDefaultRoute returns true if the supplied IPRoute is a default route.
-func IsDefaultRoute(r *netconfig.IPRoute) bool {
-	return netconfig.IsDefaultIPRoute(r)
-}
-
-// IsOnDefaultRoute returns true for addresses that are on an interface that
-// has a default route set for the supplied address.
-func IsOnDefaultRoute(a ipc.Address) bool {
-	aifc, ok := a.(*AddrIfc)
-	if !ok || len(aifc.IPRoutes) == 0 {
-		return false
-	}
-	ipv4 := IsUnicastIPv4(a)
-	for _, r := range aifc.IPRoutes {
-		// Ignore entries with a nil gateway.
-		if r.Gateway == nil {
-			continue
-		}
-		// We have a default route, so we check the gateway to make sure
-		// it matches the format of the default route.
-		if ipv4 {
-			return netconfig.IsDefaultIPv4Route(r) && r.Gateway.To4() != nil
-		}
-		if netconfig.IsDefaultIPv6Route(r) {
-			return true
-		}
-	}
-	return false
-}
diff --git a/profiles/gce/init.go b/profiles/gce/init.go
index e92b472..cf52683 100644
--- a/profiles/gce/init.go
+++ b/profiles/gce/init.go
@@ -14,8 +14,8 @@
 	"v.io/v23/ipc"
 	"v.io/x/lib/vlog"
 
+	"v.io/x/lib/netstate"
 	"v.io/x/ref/lib/flags"
-	"v.io/x/ref/lib/netstate"
 	"v.io/x/ref/profiles/internal"
 	"v.io/x/ref/profiles/internal/gce"
 	_ "v.io/x/ref/profiles/internal/ipc/protocols/tcp"
diff --git a/profiles/internal/ipc/full_test.go b/profiles/internal/ipc/full_test.go
index b66b257..1918bfa 100644
--- a/profiles/internal/ipc/full_test.go
+++ b/profiles/internal/ipc/full_test.go
@@ -29,8 +29,8 @@
 	"v.io/x/lib/vlog"
 	"v.io/x/ref/profiles/internal/ipc/stream"
 
+	"v.io/x/lib/netstate"
 	"v.io/x/ref/lib/flags"
-	"v.io/x/ref/lib/netstate"
 	"v.io/x/ref/lib/stats"
 	"v.io/x/ref/lib/testutil"
 	tsecurity "v.io/x/ref/lib/testutil/security"
diff --git a/profiles/internal/ipc/server.go b/profiles/internal/ipc/server.go
index c289c3d..b1a6739 100644
--- a/profiles/internal/ipc/server.go
+++ b/profiles/internal/ipc/server.go
@@ -25,7 +25,7 @@
 	"v.io/x/lib/vlog"
 	"v.io/x/ref/profiles/internal/ipc/stream"
 
-	"v.io/x/ref/lib/netstate"
+	"v.io/x/lib/netstate"
 	"v.io/x/ref/lib/stats"
 	"v.io/x/ref/profiles/internal/ipc/stream/vc"
 	"v.io/x/ref/profiles/internal/lib/publisher"
diff --git a/profiles/internal/ipc/server_test.go b/profiles/internal/ipc/server_test.go
index 2670900..b43c634 100644
--- a/profiles/internal/ipc/server_test.go
+++ b/profiles/internal/ipc/server_test.go
@@ -15,7 +15,7 @@
 	"v.io/v23/verror"
 	"v.io/x/lib/vlog"
 
-	"v.io/x/ref/lib/netstate"
+	"v.io/x/lib/netstate"
 	tsecurity "v.io/x/ref/lib/testutil/security"
 	imanager "v.io/x/ref/profiles/internal/ipc/stream/manager"
 	"v.io/x/ref/profiles/internal/ipc/stream/vc"
diff --git a/profiles/internal/ipc/sort_endpoints.go b/profiles/internal/ipc/sort_endpoints.go
index 61a3e5f..b51eb7a 100644
--- a/profiles/internal/ipc/sort_endpoints.go
+++ b/profiles/internal/ipc/sort_endpoints.go
@@ -8,7 +8,7 @@
 	"v.io/v23/naming"
 	"v.io/x/lib/vlog"
 
-	"v.io/x/ref/lib/netstate"
+	"v.io/x/lib/netstate"
 	"v.io/x/ref/profiles/internal/ipc/version"
 	inaming "v.io/x/ref/profiles/internal/naming"
 )
diff --git a/profiles/internal/util.go b/profiles/internal/util.go
index 90bac92..ea659e6 100644
--- a/profiles/internal/util.go
+++ b/profiles/internal/util.go
@@ -8,9 +8,9 @@
 	"v.io/v23/ipc"
 	"v.io/x/lib/vlog"
 
+	"v.io/x/lib/netstate"
 	"v.io/x/ref/lib/exec"
 	"v.io/x/ref/lib/flags"
-	"v.io/x/ref/lib/netstate"
 )
 
 // ParseFlags parses all registered flags taking into account overrides from other
diff --git a/profiles/roaming/net_watcher.go b/profiles/roaming/net_watcher.go
index 89f0e97..0cf414e 100644
--- a/profiles/roaming/net_watcher.go
+++ b/profiles/roaming/net_watcher.go
@@ -9,7 +9,7 @@
 	"v.io/v23"
 	"v.io/v23/config"
 
-	"v.io/x/ref/lib/netstate"
+	"v.io/x/lib/netstate"
 	"v.io/x/ref/profiles/roaming"
 )
 
diff --git a/profiles/roaming/print_addrs.go b/profiles/roaming/print_addrs.go
index 98a82cd..eda0e7e 100644
--- a/profiles/roaming/print_addrs.go
+++ b/profiles/roaming/print_addrs.go
@@ -4,7 +4,7 @@
 
 import (
 	"fmt"
-	"v.io/x/ref/lib/netstate"
+	"v.io/x/lib/netstate"
 )
 
 func main() {
diff --git a/profiles/roaming/roaminginit.go b/profiles/roaming/roaminginit.go
index adbe94b..e43f512 100644
--- a/profiles/roaming/roaminginit.go
+++ b/profiles/roaming/roaminginit.go
@@ -19,9 +19,9 @@
 	"v.io/v23/ipc"
 	"v.io/x/lib/vlog"
 
+	"v.io/x/lib/netconfig"
+	"v.io/x/lib/netstate"
 	"v.io/x/ref/lib/flags"
-	"v.io/x/ref/lib/netconfig"
-	"v.io/x/ref/lib/netstate"
 	"v.io/x/ref/profiles/internal"
 	_ "v.io/x/ref/profiles/internal/ipc/protocols/tcp"
 	_ "v.io/x/ref/profiles/internal/ipc/protocols/ws"
diff --git a/profiles/static/staticinit.go b/profiles/static/staticinit.go
index f837434..b94f6ff 100644
--- a/profiles/static/staticinit.go
+++ b/profiles/static/staticinit.go
@@ -8,8 +8,8 @@
 	"v.io/v23/ipc"
 	"v.io/x/lib/vlog"
 
+	"v.io/x/lib/netstate"
 	"v.io/x/ref/lib/flags"
-	"v.io/x/ref/lib/netstate"
 	"v.io/x/ref/profiles/internal"
 	_ "v.io/x/ref/profiles/internal/ipc/protocols/tcp"
 	_ "v.io/x/ref/profiles/internal/ipc/protocols/ws"
diff --git a/services/mgmt/binary/binaryd/main.go b/services/mgmt/binary/binaryd/main.go
index ad6e1ae..e20c7d2 100644
--- a/services/mgmt/binary/binaryd/main.go
+++ b/services/mgmt/binary/binaryd/main.go
@@ -10,7 +10,7 @@
 	"v.io/v23/context"
 	"v.io/x/lib/vlog"
 
-	"v.io/x/ref/lib/netstate"
+	"v.io/x/lib/netstate"
 	"v.io/x/ref/lib/signals"
 	_ "v.io/x/ref/profiles/roaming"
 	"v.io/x/ref/services/mgmt/binary/impl"
diff --git a/services/mgmt/device/starter/starter.go b/services/mgmt/device/starter/starter.go
index f1fc91d..b53337b 100644
--- a/services/mgmt/device/starter/starter.go
+++ b/services/mgmt/device/starter/starter.go
@@ -11,7 +11,7 @@
 	"strconv"
 	"time"
 
-	"v.io/x/ref/lib/netstate"
+	"v.io/x/lib/netstate"
 	"v.io/x/ref/profiles/roaming"
 	"v.io/x/ref/services/mgmt/device/config"
 	"v.io/x/ref/services/mgmt/device/impl"
diff --git a/services/mounttable/lib/neighborhood.go b/services/mounttable/lib/neighborhood.go
index 17b6b3a..bed075c 100644
--- a/services/mounttable/lib/neighborhood.go
+++ b/services/mounttable/lib/neighborhood.go
@@ -6,8 +6,8 @@
 	"strconv"
 	"strings"
 
+	"v.io/x/lib/netconfig"
 	"v.io/x/ref/lib/glob"
-	"v.io/x/ref/lib/netconfig"
 
 	"v.io/v23"
 	"v.io/v23/ipc"
