diff --git a/pkg/mesh/config.go b/pkg/mesh/config.go
index a784748..bd628cd 100644
--- a/pkg/mesh/config.go
+++ b/pkg/mesh/config.go
@@ -3,6 +3,7 @@ package mesh
 import (
 	"fmt"
 	"net"
+	"slices"
 	"time"
 
 	"github.com/tim-beatham/wgmesh/pkg/conf"
@@ -25,7 +26,7 @@ type WgMeshConfigApplyer struct {
 	routeInstaller route.RouteInstaller
 }
 
-func (m *WgMeshConfigApplyer) convertMeshNode(node MeshNode, peerToClients map[string][]net.IPNet) (*wgtypes.PeerConfig, error) {
+func (m *WgMeshConfigApplyer) convertMeshNode(node MeshNode, device *wgtypes.Device, peerToClients map[string][]net.IPNet) (*wgtypes.PeerConfig, error) {
 	endpoint, err := net.ResolveUDPAddr("udp", node.GetWgEndpoint())
 
 	if err != nil {
@@ -54,6 +55,15 @@ func (m *WgMeshConfigApplyer) convertMeshNode(node MeshNode, peerToClients map[s
 
 	keepAlive := time.Duration(m.config.KeepAliveWg) * time.Second
 
+	existing := slices.IndexFunc(device.Peers, func(p wgtypes.Peer) bool {
+		pubKey, _ := node.GetPublicKey()
+		return p.PublicKey.String() == pubKey.String()
+	})
+
+	if existing != -1 {
+		endpoint = device.Peers[existing].Endpoint
+	}
+
 	peerConfig := wgtypes.PeerConfig{
 		PublicKey:                   pubKey,
 		Endpoint:                    endpoint,
@@ -130,7 +140,9 @@ func (m *WgMeshConfigApplyer) updateWgConf(mesh MeshProvider) error {
 			continue
 		}
 
-		peer, err := m.convertMeshNode(n, peerToClients)
+		dev, _ := mesh.GetDevice()
+
+		peer, err := m.convertMeshNode(n, dev, peerToClients)
 
 		if err != nil {
 			return err
@@ -180,7 +192,7 @@ func (m *WgMeshConfigApplyer) RemovePeers(meshId string) error {
 
 	m.meshManager.GetClient().ConfigureDevice(dev.Name, wgtypes.Config{
 		ReplacePeers: true,
-		Peers:        make([]wgtypes.PeerConfig, 1),
+		Peers:        make([]wgtypes.PeerConfig, 0),
 	})
 
 	return nil