diff --git a/core/cmd/nanoswitch/BUILD b/core/cmd/nanoswitch/BUILD
index 92044e6..56417c5 100644
--- a/core/cmd/nanoswitch/BUILD
+++ b/core/cmd/nanoswitch/BUILD
@@ -10,7 +10,8 @@
         "//core/internal/common:go_default_library",
         "//core/internal/common/supervisor:go_default_library",
         "//core/internal/launch:go_default_library",
-        "//core/internal/network/dhcp:go_default_library",
+        "//core/pkg/dhcp4c:go_default_library",
+        "//core/pkg/dhcp4c/callback:go_default_library",
         "@com_github_google_nftables//:go_default_library",
         "@com_github_google_nftables//expr:go_default_library",
         "@com_github_insomniacslk_dhcp//dhcpv4:go_default_library",
diff --git a/core/cmd/nanoswitch/nanoswitch.go b/core/cmd/nanoswitch/nanoswitch.go
index edf69bc..2fe2a81 100644
--- a/core/cmd/nanoswitch/nanoswitch.go
+++ b/core/cmd/nanoswitch/nanoswitch.go
@@ -41,7 +41,8 @@
 	"git.monogon.dev/source/nexantic.git/core/internal/common"
 	"git.monogon.dev/source/nexantic.git/core/internal/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/core/internal/launch"
-	"git.monogon.dev/source/nexantic.git/core/internal/network/dhcp"
+	"git.monogon.dev/source/nexantic.git/core/pkg/dhcp4c"
+	dhcpcb "git.monogon.dev/source/nexantic.git/core/pkg/dhcp4c/callback"
 )
 
 var switchIP = net.IP{10, 1, 0, 1}
@@ -52,7 +53,7 @@
 	reply.GatewayIPAddr = switchIP
 	reply.UpdateOption(dhcpv4.OptDNS(net.IPv4(10, 42, 0, 3))) // SLIRP fake DNS server
 	reply.UpdateOption(dhcpv4.OptRouter(switchIP))
-	reply.UpdateOption(dhcpv4.OptIPAddressLeaseTime(12 * time.Hour))
+	reply.UpdateOption(dhcpv4.OptIPAddressLeaseTime(30 * time.Second)) // Make sure we exercise our DHCP client in E2E tests
 	reply.UpdateOption(dhcpv4.OptSubnetMask(switchSubnetMask))
 }
 
@@ -88,7 +89,11 @@
 			case dhcpv4.MessageTypeRequest:
 				reply.UpdateOption(dhcpv4.OptMessageType(dhcpv4.MessageTypeAck))
 				defaultLeaseOptions(reply)
-				reply.YourIPAddr = m.RequestedIPAddress()
+				if m.RequestedIPAddress() != nil {
+					reply.YourIPAddr = m.RequestedIPAddress()
+				} else {
+					reply.YourIPAddr = m.ClientIPAddr
+				}
 			case dhcpv4.MessageTypeRelease, dhcpv4.MessageTypeDecline:
 				supervisor.Logger(ctx).Info("Ignoring Release/Decline")
 			}
@@ -264,19 +269,23 @@
 				panic(err)
 			}
 
-			dhcpClient := dhcp.New()
-			supervisor.Run(ctx, "dhcp-client", dhcpClient.Run(externalLink))
+			netIface := &net.Interface{
+				Name:         externalLink.Attrs().Name,
+				MTU:          externalLink.Attrs().MTU,
+				Index:        externalLink.Attrs().Index,
+				Flags:        externalLink.Attrs().Flags,
+				HardwareAddr: externalLink.Attrs().HardwareAddr,
+			}
+			dhcpClient, err := dhcp4c.NewClient(netIface)
+			if err != nil {
+				logger.Fatalf("Failed to create DHCP client: %v", err)
+			}
+			dhcpClient.RequestedOptions = []dhcpv4.OptionCode{dhcpv4.OptionRouter}
+			dhcpClient.LeaseCallback = dhcpcb.Compose(dhcpcb.ManageIP(externalLink), dhcpcb.ManageDefaultRoute(externalLink))
+			supervisor.Run(ctx, "dhcp-client", dhcpClient.Run)
 			if err := ioutil.WriteFile("/proc/sys/net/ipv4/ip_forward", []byte("1\n"), 0644); err != nil {
 				logger.Fatalf("Failed to write ip forwards: %v", err)
 			}
-			status, err := dhcpClient.Status(ctx, true)
-			if err != nil {
-				return err
-			}
-
-			if err := addNetworkRoutes(externalLink, status.Address, status.Gateway); err != nil {
-				return err
-			}
 		} else {
 			logger.Info("No upstream interface detected")
 		}
diff --git a/core/internal/network/BUILD.bazel b/core/internal/network/BUILD.bazel
index af82b8b..e0530d5 100644
--- a/core/internal/network/BUILD.bazel
+++ b/core/internal/network/BUILD.bazel
@@ -7,11 +7,13 @@
     visibility = ["//:__subpackages__"],
     deps = [
         "//core/internal/common/supervisor:go_default_library",
-        "//core/internal/network/dhcp:go_default_library",
         "//core/internal/network/dns:go_default_library",
+        "//core/pkg/dhcp4c:go_default_library",
+        "//core/pkg/dhcp4c/callback:go_default_library",
         "//core/pkg/logtree:go_default_library",
         "@com_github_google_nftables//:go_default_library",
         "@com_github_google_nftables//expr:go_default_library",
+        "@com_github_insomniacslk_dhcp//dhcpv4:go_default_library",
         "@com_github_vishvananda_netlink//:go_default_library",
         "@org_golang_x_sys//unix:go_default_library",
     ],
diff --git a/core/internal/network/dhcp/BUILD.bazel b/core/internal/network/dhcp/BUILD.bazel
deleted file mode 100644
index 8962e28..0000000
--- a/core/internal/network/dhcp/BUILD.bazel
+++ /dev/null
@@ -1,14 +0,0 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
-
-go_library(
-    name = "go_default_library",
-    srcs = ["dhcp.go"],
-    importpath = "git.monogon.dev/source/nexantic.git/core/internal/network/dhcp",
-    visibility = ["//core:__subpackages__"],
-    deps = [
-        "//core/internal/common/supervisor:go_default_library",
-        "@com_github_insomniacslk_dhcp//dhcpv4:go_default_library",
-        "@com_github_insomniacslk_dhcp//dhcpv4/nclient4:go_default_library",
-        "@com_github_vishvananda_netlink//:go_default_library",
-    ],
-)
diff --git a/core/internal/network/dhcp/dhcp.go b/core/internal/network/dhcp/dhcp.go
deleted file mode 100644
index 9a62c7c..0000000
--- a/core/internal/network/dhcp/dhcp.go
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright 2020 The Monogon Project Authors.
-//
-// SPDX-License-Identifier: Apache-2.0
-//
-// 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 dhcp
-
-import (
-	"context"
-	"fmt"
-	"net"
-
-	"git.monogon.dev/source/nexantic.git/core/internal/common/supervisor"
-
-	"github.com/insomniacslk/dhcp/dhcpv4"
-	"github.com/insomniacslk/dhcp/dhcpv4/nclient4"
-	"github.com/vishvananda/netlink"
-)
-
-type Client struct {
-	reqC chan *dhcpStatusReq
-}
-
-func New() *Client {
-	return &Client{
-		reqC: make(chan *dhcpStatusReq),
-	}
-}
-
-type dhcpStatusReq struct {
-	resC chan *Status
-	wait bool
-}
-
-func (r *dhcpStatusReq) fulfill(s *Status) {
-	go func() {
-		r.resC <- s
-	}()
-}
-
-// Status is the IPv4 configuration provisioned via DHCP for a given interface. It does not necessarily represent
-// a configuration that is active or even valid.
-type Status struct {
-	// Address is 'our' (the node's) IPv4 Address on the network.
-	Address net.IPNet
-	// Gateway is the default Gateway/router of this network, or 0.0.0.0 if none was given.
-	Gateway net.IP
-	// DNS is a list of IPv4 DNS servers to use.
-	DNS []net.IP
-}
-
-func (s *Status) String() string {
-	return fmt.Sprintf("Address: %s, Gateway: %s, DNS: %v", s.Address.String(), s.Gateway.String(), s.DNS)
-}
-
-func (c *Client) Run(iface netlink.Link) supervisor.Runnable {
-	return func(ctx context.Context) error {
-		logger := supervisor.Logger(ctx)
-
-		// Channel updated with Address once one gets assigned/updated
-		newC := make(chan *Status)
-		// Status requests waiting for configuration
-		waiters := []*dhcpStatusReq{}
-
-		// Start lease acquisition
-		// TODO(q3k): actually maintain the lease instead of hoping we never get
-		// kicked off.
-
-		client, err := nclient4.New(iface.Attrs().Name)
-		if err != nil {
-			return fmt.Errorf("nclient4.New: %w", err)
-		}
-
-		err = supervisor.Run(ctx, "client", func(ctx context.Context) error {
-			supervisor.Signal(ctx, supervisor.SignalHealthy)
-			lease, err := client.Request(ctx)
-			if err != nil {
-				// TODO(q3k): implement retry logic with full state machine
-				logger.Errorf("DHCP lease request failed: %v", err)
-				return err
-			}
-			newC <- parseAck(lease.ACK)
-			supervisor.Signal(ctx, supervisor.SignalDone)
-			return nil
-		})
-		if err != nil {
-			return err
-		}
-
-		supervisor.Signal(ctx, supervisor.SignalHealthy)
-
-		// State machine
-		// Two implicit states: WAITING -> ASSIGNED
-		// We start at WAITING, once we get a current config we move to ASSIGNED
-		// Once this becomes more complex (ie. has to handle link state changes)
-		// this should grow into a real state machine.
-		var current *Status
-		logger.Info("DHCP client WAITING")
-		for {
-			select {
-			case <-ctx.Done():
-				// TODO(q3k): don't leave waiters hanging
-				return err
-
-			case cfg := <-newC:
-				current = cfg
-				logger.Infof("DHCP client ASSIGNED IP %s", current.String())
-				for _, w := range waiters {
-					w.fulfill(current)
-				}
-				waiters = []*dhcpStatusReq{}
-
-			case r := <-c.reqC:
-				if current != nil || !r.wait {
-					r.fulfill(current)
-				} else {
-					waiters = append(waiters, r)
-				}
-			}
-		}
-	}
-}
-
-// parseAck turns an internal Status (from the dhcpv4 library) into a Status
-func parseAck(ack *dhcpv4.DHCPv4) *Status {
-	address := net.IPNet{IP: ack.YourIPAddr, Mask: ack.SubnetMask()}
-
-	// DHCP routers are optional - if none are provided, assume no router and set Gateway to 0.0.0.0
-	// (this makes Gateway.IsUnspecified() == true)
-	gateway, _, _ := net.ParseCIDR("0.0.0.0/0")
-	if routers := ack.Router(); len(routers) > 0 {
-		gateway = routers[0]
-	}
-	return &Status{
-		Address: address,
-		Gateway: gateway,
-		DNS:     ack.DNS(),
-	}
-}
-
-// Status returns the DHCP configuration requested from us by the local DHCP server.
-// If wait is true, this function will block until a DHCP configuration is available. Otherwise, a nil Status may be
-// returned to indicate that no configuration has been received yet.
-func (c *Client) Status(ctx context.Context, wait bool) (*Status, error) {
-	resC := make(chan *Status)
-	c.reqC <- &dhcpStatusReq{
-		resC: resC,
-		wait: wait,
-	}
-	select {
-	case <-ctx.Done():
-		return nil, ctx.Err()
-	case r := <-resC:
-		return r, nil
-	}
-}
diff --git a/core/internal/network/main.go b/core/internal/network/main.go
index 414d971..e0bac79 100644
--- a/core/internal/network/main.go
+++ b/core/internal/network/main.go
@@ -18,20 +18,24 @@
 
 import (
 	"context"
+	"errors"
 	"fmt"
 	"io/ioutil"
 	"net"
 	"os"
+	"sync"
+	"time"
 
 	"github.com/google/nftables"
 	"github.com/google/nftables/expr"
-
+	"github.com/insomniacslk/dhcp/dhcpv4"
 	"github.com/vishvananda/netlink"
 	"golang.org/x/sys/unix"
 
 	"git.monogon.dev/source/nexantic.git/core/internal/common/supervisor"
-	"git.monogon.dev/source/nexantic.git/core/internal/network/dhcp"
 	"git.monogon.dev/source/nexantic.git/core/internal/network/dns"
+	"git.monogon.dev/source/nexantic.git/core/pkg/dhcp4c"
+	dhcpcb "git.monogon.dev/source/nexantic.git/core/pkg/dhcp4c/callback"
 	"git.monogon.dev/source/nexantic.git/core/pkg/logtree"
 )
 
@@ -42,7 +46,16 @@
 
 type Service struct {
 	config Config
-	dhcp   *dhcp.Client
+	dhcp   *dhcp4c.Client
+
+	// nftConn is a shared file descriptor handle to nftables, automatically initialized on first use.
+	nftConn             nftables.Conn
+	natTable            *nftables.Table
+	natPostroutingChain *nftables.Chain
+
+	// These are a temporary hack pending the removal of the GetIP interface
+	ipLock       sync.Mutex
+	currentIPTmp net.IP
 
 	logger logtree.LeveledLogger
 }
@@ -54,7 +67,6 @@
 func New(config Config) *Service {
 	return &Service{
 		config: config,
-		dhcp:   dhcp.New(),
 	}
 }
 
@@ -81,27 +93,6 @@
 	return unix.Rename(resolvConfSwapPath, resolvConfPath)
 }
 
-func (s *Service) addNetworkRoutes(link netlink.Link, addr net.IPNet, gw net.IP) error {
-	if err := netlink.AddrReplace(link, &netlink.Addr{IPNet: &addr}); err != nil {
-		return fmt.Errorf("failed to add DHCP address to network interface \"%v\": %w", link.Attrs().Name, err)
-	}
-
-	if gw.IsUnspecified() {
-		s.logger.Infof("No default route set, only local network %s will be reachable", addr.String())
-		return nil
-	}
-
-	route := &netlink.Route{
-		Dst:   &net.IPNet{IP: net.IPv4(0, 0, 0, 0), Mask: net.IPv4Mask(0, 0, 0, 0)},
-		Gw:    gw,
-		Scope: netlink.SCOPE_UNIVERSE,
-	}
-	if err := netlink.RouteAdd(route); err != nil {
-		return fmt.Errorf("could not add default route: netlink.RouteAdd(%+v): %v", route, err)
-	}
-	return nil
-}
-
 // nfifname converts an interface name into 16 bytes padded with zeroes (for nftables)
 func nfifname(n string) []byte {
 	b := make([]byte, 16)
@@ -109,42 +100,48 @@
 	return b
 }
 
+func (s *Service) dhcpDNSCallback(old, new *dhcp4c.Lease) error {
+	oldServers := old.DNSServers()
+	newServers := new.DNSServers()
+	if newServers.Equal(oldServers) {
+		return nil // nothing to do
+	}
+	s.logger.Infof("Setting upstream DNS servers to %v", newServers)
+	s.config.CorednsRegistrationChan <- dns.NewUpstreamDirective(newServers)
+	return nil
+}
+
+// TODO(lorenz): Get rid of this once we have robust node resolution
+func (s *Service) getIPCallbackHack(old, new *dhcp4c.Lease) error {
+	if old == nil && new != nil {
+		s.ipLock.Lock()
+		s.currentIPTmp = new.AssignedIP
+		s.ipLock.Unlock()
+	}
+	return nil
+}
+
 func (s *Service) useInterface(ctx context.Context, iface netlink.Link) error {
-	err := supervisor.Run(ctx, "dhcp", s.dhcp.Run(iface))
+	netIface, err := net.InterfaceByIndex(iface.Attrs().Index)
+	if err != nil {
+		return fmt.Errorf("cannot create Go net.Interface from netlink.Link: %w", err)
+	}
+	s.dhcp, err = dhcp4c.NewClient(netIface)
+	if err != nil {
+		return fmt.Errorf("failed to create DHCP client on interface %v: %w", iface.Attrs().Name, err)
+	}
+	s.dhcp.VendorClassIdentifier = "com.nexantic.smalltown.v1"
+	s.dhcp.RequestedOptions = []dhcpv4.OptionCode{dhcpv4.OptionRouter, dhcpv4.OptionNameServer}
+	s.dhcp.LeaseCallback = dhcpcb.Compose(dhcpcb.ManageIP(iface), dhcpcb.ManageDefaultRoute(iface), s.dhcpDNSCallback, s.getIPCallbackHack)
+	err = supervisor.Run(ctx, "dhcp", s.dhcp.Run)
 	if err != nil {
 		return err
 	}
-	status, err := s.dhcp.Status(ctx, true)
-	if err != nil {
-		return fmt.Errorf("could not get DHCP Status: %w", err)
-	}
-
-	// We're currently never removing this directive just like we're not removing routes and IPs
-	s.config.CorednsRegistrationChan <- dns.NewUpstreamDirective(status.DNS)
-
-	if err := s.addNetworkRoutes(iface, status.Address, status.Gateway); err != nil {
-		s.logger.Warning("Failed to add routes: %v", err)
-	}
-
-	c := nftables.Conn{}
-
-	nat := c.AddTable(&nftables.Table{
-		Family: nftables.TableFamilyIPv4,
-		Name:   "nat",
-	})
-
-	postrouting := c.AddChain(&nftables.Chain{
-		Name:     "postrouting",
-		Hooknum:  nftables.ChainHookPostrouting,
-		Priority: nftables.ChainPriorityNATSource,
-		Table:    nat,
-		Type:     nftables.ChainTypeNAT,
-	})
 
 	// Masquerade/SNAT all traffic going out of the external interface
-	c.AddRule(&nftables.Rule{
-		Table: nat,
-		Chain: postrouting,
+	s.nftConn.AddRule(&nftables.Rule{
+		Table: s.natTable,
+		Chain: s.natPostroutingChain,
 		Exprs: []expr.Any{
 			&expr.Meta{Key: expr.MetaKeyOIFNAME, Register: 1},
 			&expr.Cmp{
@@ -156,7 +153,7 @@
 		},
 	})
 
-	if err := c.Flush(); err != nil {
+	if err := s.nftConn.Flush(); err != nil {
 		panic(err)
 	}
 
@@ -165,11 +162,24 @@
 
 // GetIP returns the current IP (and optionally waits for one to be assigned)
 func (s *Service) GetIP(ctx context.Context, wait bool) (*net.IP, error) {
-	status, err := s.dhcp.Status(ctx, wait)
-	if err != nil {
-		return nil, err
+	for {
+		var currentIP net.IP
+		s.ipLock.Lock()
+		currentIP = s.currentIPTmp
+		s.ipLock.Unlock()
+		if currentIP == nil {
+			if !wait {
+				return nil, errors.New("no IP available")
+			}
+			select {
+			case <-ctx.Done():
+				return nil, ctx.Err()
+			case <-time.After(1 * time.Second):
+				continue
+			}
+		}
+		return &currentIP, nil
 	}
-	return &status.Address.IP, nil
 }
 
 func (s *Service) Run(ctx context.Context) error {
@@ -178,6 +188,22 @@
 	supervisor.Run(ctx, "dns", dnsSvc.Run)
 	supervisor.Run(ctx, "interfaces", s.runInterfaces)
 
+	s.natTable = s.nftConn.AddTable(&nftables.Table{
+		Family: nftables.TableFamilyIPv4,
+		Name:   "nat",
+	})
+
+	s.natPostroutingChain = s.nftConn.AddChain(&nftables.Chain{
+		Name:     "postrouting",
+		Hooknum:  nftables.ChainHookPostrouting,
+		Priority: nftables.ChainPriorityNATSource,
+		Table:    s.natTable,
+		Type:     nftables.ChainTypeNAT,
+	})
+	if err := s.nftConn.Flush(); err != nil {
+		logger.Fatalf("Failed to set up nftables base chains: %v", err)
+	}
+
 	if err := ioutil.WriteFile("/proc/sys/net/ipv4/ip_forward", []byte("1\n"), 0644); err != nil {
 		logger.Fatalf("Failed to enable IPv4 forwarding: %v", err)
 	}
diff --git a/core/pkg/dhcp4c/BUILD.bazel b/core/pkg/dhcp4c/BUILD.bazel
index 6d79268..a3fcb2b 100644
--- a/core/pkg/dhcp4c/BUILD.bazel
+++ b/core/pkg/dhcp4c/BUILD.bazel
@@ -20,7 +20,10 @@
 
 go_test(
     name = "go_default_test",
-    srcs = ["dhcpc_test.go"],
+    srcs = [
+        "dhcpc_test.go",
+        "lease_test.go",
+    ],
     embed = [":go_default_library"],
     pure = "on",
     deps = [
diff --git a/core/pkg/dhcp4c/lease.go b/core/pkg/dhcp4c/lease.go
index ab6da40..c56270c 100644
--- a/core/pkg/dhcp4c/lease.go
+++ b/core/pkg/dhcp4c/lease.go
@@ -17,6 +17,7 @@
 package dhcp4c
 
 import (
+	"encoding/binary"
 	"net"
 	"time"
 
@@ -72,3 +73,52 @@
 	// No (valid) router found
 	return nil
 }
+
+// DNSServers represents an ordered collection of DNS servers
+type DNSServers []net.IP
+
+func (a DNSServers) Equal(b DNSServers) bool {
+	if len(a) == len(b) {
+		if len(a) == 0 {
+			return true // both are empty or nil
+		}
+		for i, aVal := range a {
+			if !aVal.Equal(b[i]) {
+				return false
+			}
+		}
+		return true
+	}
+	return false
+
+}
+
+func ip4toInt(ip net.IP) uint32 {
+	ip4 := ip.To4()
+	if ip4 == nil {
+		return 0
+	}
+	return binary.BigEndian.Uint32(ip4)
+}
+
+// DNSServers returns all unique valid DNS servers from the DHCP DomainNameServers options.
+// It returns nil if the lease is nil.
+func (l *Lease) DNSServers() DNSServers {
+	if l == nil {
+		return nil
+	}
+	rawServers := dhcpv4.GetIPs(dhcpv4.OptionDomainNameServer, l.Options)
+	var servers DNSServers
+	serversSeenMap := make(map[uint32]struct{})
+	for _, s := range rawServers {
+		ip4Num := ip4toInt(s)
+		if s.IsGlobalUnicast() || s.IsLinkLocalUnicast() || ip4Num != 0 {
+			if _, ok := serversSeenMap[ip4Num]; ok {
+				continue
+			}
+			serversSeenMap[ip4Num] = struct{}{}
+			servers = append(servers, s)
+		}
+	}
+	return servers
+}
diff --git a/core/pkg/dhcp4c/lease_test.go b/core/pkg/dhcp4c/lease_test.go
new file mode 100644
index 0000000..823656f
--- /dev/null
+++ b/core/pkg/dhcp4c/lease_test.go
@@ -0,0 +1,55 @@
+// Copyright 2020 The Monogon Project Authors.
+//
+// SPDX-License-Identifier: Apache-2.0
+//
+// 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 dhcp4c
+
+import (
+	"net"
+	"testing"
+
+	"github.com/insomniacslk/dhcp/dhcpv4"
+	"github.com/stretchr/testify/assert"
+)
+
+func TestLeaseDHCPServers(t *testing.T) {
+	var tests = []struct {
+		name     string
+		lease    *Lease
+		expected DNSServers
+	}{{
+		name:     "ReturnsNilWithNoLease",
+		lease:    nil,
+		expected: nil,
+	}, {
+		name: "DiscardsInvalidIPs",
+		lease: &Lease{
+			Options: dhcpv4.OptionsFromList(dhcpv4.OptDNS(net.IP{0, 0, 0, 0})),
+		},
+		expected: nil,
+	}, {
+		name: "DeduplicatesIPs",
+		lease: &Lease{
+			Options: dhcpv4.OptionsFromList(dhcpv4.OptDNS(net.IP{192, 0, 2, 1}, net.IP{192, 0, 2, 2}, net.IP{192, 0, 2, 1})),
+		},
+		expected: DNSServers{net.IP{192, 0, 2, 1}, net.IP{192, 0, 2, 2}},
+	}}
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			res := test.lease.DNSServers()
+			assert.Equal(t, test.expected, res)
+		})
+	}
+}
