diff --git a/device.go b/device.go
index c041987..22e0990 100644
--- a/device.go
+++ b/device.go
@@ -1,7 +1,6 @@
 package main
 
 import (
-	"github.com/sasha-s/go-deadlock"
 	"runtime"
 	"sync"
 	"sync/atomic"
@@ -16,31 +15,31 @@ type Device struct {
 	// synchronized resources (locks acquired in order)
 
 	state struct {
-		mutex    deadlock.Mutex
+		mutex    sync.Mutex
 		changing AtomicBool
 		current  bool
 	}
 
 	net struct {
-		mutex  deadlock.RWMutex
+		mutex  sync.RWMutex
 		bind   Bind   // bind interface
 		port   uint16 // listening port
 		fwmark uint32 // mark value (0 = disabled)
 	}
 
 	noise struct {
-		mutex      deadlock.RWMutex
+		mutex      sync.RWMutex
 		privateKey NoisePrivateKey
 		publicKey  NoisePublicKey
 	}
 
 	routing struct {
-		mutex deadlock.RWMutex
+		mutex sync.RWMutex
 		table RoutingTable
 	}
 
 	peers struct {
-		mutex  deadlock.RWMutex
+		mutex  sync.RWMutex
 		keyMap map[NoisePublicKey]*Peer
 	}
 
@@ -101,53 +100,46 @@ func deviceUpdateState(device *Device) {
 		return
 	}
 
-	func() {
+	// compare to current state of device
 
-		// compare to current state of device
+	device.state.mutex.Lock()
 
-		device.state.mutex.Lock()
-		defer device.state.mutex.Unlock()
+	newIsUp := device.isUp.Get()
 
-		newIsUp := device.isUp.Get()
-
-		if newIsUp == device.state.current {
-			device.state.changing.Set(false)
-			return
-		}
-
-		// change state of device
-
-		switch newIsUp {
-		case true:
-			if err := device.BindUpdate(); err != nil {
-				device.isUp.Set(false)
-				break
-			}
-
-			device.peers.mutex.Lock()
-			defer device.peers.mutex.Unlock()
-
-			for _, peer := range device.peers.keyMap {
-				peer.Start()
-			}
-
-		case false:
-			device.BindClose()
-
-			device.peers.mutex.Lock()
-			defer device.peers.mutex.Unlock()
-
-			for _, peer := range device.peers.keyMap {
-				println("stopping peer")
-				peer.Stop()
-			}
-		}
-
-		// update state variables
-
-		device.state.current = newIsUp
+	if newIsUp == device.state.current {
 		device.state.changing.Set(false)
-	}()
+		device.state.mutex.Unlock()
+		return
+	}
+
+	// change state of device
+
+	switch newIsUp {
+	case true:
+		if err := device.BindUpdate(); err != nil {
+			device.isUp.Set(false)
+			break
+		}
+		device.peers.mutex.Lock()
+		for _, peer := range device.peers.keyMap {
+			peer.Start()
+		}
+		device.peers.mutex.Unlock()
+
+	case false:
+		device.BindClose()
+		device.peers.mutex.Lock()
+		for _, peer := range device.peers.keyMap {
+			peer.Stop()
+		}
+		device.peers.mutex.Unlock()
+	}
+
+	// update state variables
+
+	device.state.current = newIsUp
+	device.state.changing.Set(false)
+	device.state.mutex.Unlock()
 
 	// check for state change in the mean time
 
diff --git a/peer.go b/peer.go
index dc04811..d8bb2bf 100644
--- a/peer.go
+++ b/peer.go
@@ -4,7 +4,6 @@ import (
 	"encoding/base64"
 	"errors"
 	"fmt"
-	"github.com/sasha-s/go-deadlock"
 	"sync"
 	"time"
 )
@@ -15,7 +14,7 @@ const (
 
 type Peer struct {
 	isRunning                   AtomicBool
-	mutex                       deadlock.RWMutex
+	mutex                       sync.RWMutex
 	persistentKeepaliveInterval uint64
 	keyPairs                    KeyPairs
 	handshake                   Handshake
@@ -29,7 +28,7 @@ type Peer struct {
 	}
 
 	time struct {
-		mutex         deadlock.RWMutex
+		mutex         sync.RWMutex
 		lastSend      time.Time // last send message
 		lastHandshake time.Time // last completed handshake
 		nextKeepalive time.Time
@@ -66,7 +65,7 @@ type Peer struct {
 	}
 
 	routines struct {
-		mutex    deadlock.Mutex // held when stopping / starting routines
+		mutex    sync.Mutex     // held when stopping / starting routines
 		starting sync.WaitGroup // routines pending start
 		stopping sync.WaitGroup // routines pending stop
 		stop     Signal         // size 0, stop all go-routines in peer