diff --git a/src/Listen.cxx b/src/Listen.cxx
index 1dc97af2a..3b1893b4f 100644
--- a/src/Listen.cxx
+++ b/src/Listen.cxx
@@ -24,6 +24,7 @@
 #include "config/Data.hxx"
 #include "config/Option.hxx"
 #include "config/Net.hxx"
+#include "net/UniqueSocketDescriptor.hxx"
 #include "system/Error.hxx"
 #include "util/RuntimeError.hxx"
 #include "fs/AllocatedPath.hxx"
@@ -66,7 +67,7 @@ listen_systemd_activation(ClientListener &listener)
 
 	for (int i = SD_LISTEN_FDS_START, end = SD_LISTEN_FDS_START + n;
 	     i != end; ++i)
-		listener.AddFD(i);
+		listener.AddFD(UniqueSocketDescriptor(i));
 
 	return true;
 }
diff --git a/src/event/ServerSocket.cxx b/src/event/ServerSocket.cxx
index 55b154f44..db4679cf0 100644
--- a/src/event/ServerSocket.cxx
+++ b/src/event/ServerSocket.cxx
@@ -107,8 +107,8 @@ public:
 		return ::ToString(address);
 	}
 
-	void SetFD(SocketDescriptor _fd) noexcept {
-		SocketMonitor::Open(_fd);
+	void SetFD(UniqueSocketDescriptor _fd) noexcept {
+		SocketMonitor::Open(_fd.Release());
 		SocketMonitor::ScheduleRead();
 	}
 
@@ -194,7 +194,7 @@ OneServerSocket::Open()
 
 	/* register in the EventLoop */	
 
-	SetFD(_fd.Release());
+	SetFD(std::move(_fd));
 }
 
 ServerSocket::ServerSocket(EventLoop &_loop) noexcept
@@ -291,18 +291,16 @@ ServerSocket::AddAddress(AllocatedSocketAddress &&address) noexcept
 }
 
 void
-ServerSocket::AddFD(int _fd)
+ServerSocket::AddFD(UniqueSocketDescriptor fd)
 {
-	assert(_fd >= 0);
-
-	SocketDescriptor fd(_fd);
+	assert(fd.IsDefined());
 
 	StaticSocketAddress address = fd.GetLocalAddress();
 	if (!address.IsDefined())
 		throw MakeSocketError("Failed to get socket address");
 
 	OneServerSocket &s = AddAddress(address);
-	s.SetFD(fd);
+	s.SetFD(std::move(fd));
 }
 
 #ifdef HAVE_TCP
diff --git a/src/event/ServerSocket.hxx b/src/event/ServerSocket.hxx
index fc1ff7510..201d0ae2f 100644
--- a/src/event/ServerSocket.hxx
+++ b/src/event/ServerSocket.hxx
@@ -107,7 +107,7 @@ public:
 	 *
 	 * Throws #std::runtime_error on error.
 	 */
-	void AddFD(int fd);
+	void AddFD(UniqueSocketDescriptor fd);
 
 	bool IsEmpty() const noexcept {
 		return sockets.empty();