diff --git a/src/event/ServerSocket.cxx b/src/event/ServerSocket.cxx
index 552efb0a3..b1cffcfda 100644
--- a/src/event/ServerSocket.cxx
+++ b/src/event/ServerSocket.cxx
@@ -20,6 +20,7 @@
 #include "config.h"
 #include "ServerSocket.hxx"
 #include "net/StaticSocketAddress.hxx"
+#include "net/AllocatedSocketAddress.hxx"
 #include "net/SocketAddress.hxx"
 #include "net/SocketUtil.hxx"
 #include "net/SocketError.hxx"
@@ -64,31 +65,26 @@ class OneServerSocket final : private SocketMonitor {
 	AllocatedPath path;
 #endif
 
-	SocketAddress address;
+	const AllocatedSocketAddress address;
 
 public:
+	template<typename A>
 	OneServerSocket(EventLoop &_loop, ServerSocket &_parent,
 			unsigned _serial,
-			SocketAddress _address)
+			A &&_address)
 		:SocketMonitor(_loop),
 		 parent(_parent), serial(_serial),
 #ifdef HAVE_UN
 		 path(AllocatedPath::Null()),
 #endif
-		 address((sockaddr *)xmemdup(_address.GetAddress(),
-					     _address.GetSize()),
-			 _address.GetSize())
+		 address(std::forward<A>(_address))
 	{
-		assert(!_address.IsNull());
-		assert(_address.GetSize() > 0);
 	}
 
 	OneServerSocket(const OneServerSocket &other) = delete;
 	OneServerSocket &operator=(const OneServerSocket &other) = delete;
 
 	~OneServerSocket() {
-		free(const_cast<struct sockaddr *>(address.GetAddress()));
-
 		if (IsDefined())
 			Close();
 	}
@@ -299,6 +295,15 @@ ServerSocket::AddAddress(SocketAddress address)
 	return sockets.back();
 }
 
+OneServerSocket &
+ServerSocket::AddAddress(AllocatedSocketAddress &&address)
+{
+	sockets.emplace_back(loop, *this, next_serial,
+			     std::move(address));
+
+	return sockets.back();
+}
+
 bool
 ServerSocket::AddFD(int fd, Error &error)
 {
diff --git a/src/event/ServerSocket.hxx b/src/event/ServerSocket.hxx
index ec91dc3fb..a59ac3f2a 100644
--- a/src/event/ServerSocket.hxx
+++ b/src/event/ServerSocket.hxx
@@ -25,6 +25,7 @@
 #include <stddef.h>
 
 class SocketAddress;
+class AllocatedSocketAddress;
 class EventLoop;
 class Error;
 class AllocatedPath;
@@ -52,6 +53,7 @@ public:
 
 private:
 	OneServerSocket &AddAddress(SocketAddress address);
+	OneServerSocket &AddAddress(AllocatedSocketAddress &&address);
 
 	/**
 	 * Add a listener on a port on all IPv4 interfaces.