Index: src/hu/varadiistvan/scpl/io/_posix/LocalAcceptor.h
===================================================================
--- src/hu/varadiistvan/scpl/io/_posix/LocalAcceptor.h	(revision 8)
+++ src/hu/varadiistvan/scpl/io/_posix/LocalAcceptor.h	(revision 32)
@@ -31,5 +31,5 @@
 //------------------------------------------------------------------------------
 
-#include "Acceptor.h"
+#include "SocketAcceptor.h"
 
 #include "LocalSocket.h"
@@ -42,69 +42,13 @@
 
 /**
- * An acceptor that provides a LocalSocket for each accepted
- * connection.
+ * An acceptor that provides a LocalSocket for each accepted connection
  */
-class LocalAcceptor : public Acceptor
+class LocalAcceptor : public SocketAcceptor<LocalSocket>
 {
 private:
-    /**
-     * Construct the acceptor.
-     *
-     * @param addressLength the length of the buffer for the peer
-     * address. If 0, not buffer will be created.
-     */
-    LocalAcceptor(ServerSocket* socket);
-
-public:
-    /**
-     * Get the local socket accepted last. If no socket was accepted,
-     * return 0. The local socket's waiter will be the given one
-     * (which can be 0).
-     */
-    LocalSocket* getSocket(Waiter* waiter,
-                           size_t readingCapacity = LocalSocket::DEFAULT_CAPACITY,
-                           size_t writingCapacity = LocalSocket::DEFAULT_CAPACITY);
-    /**
-     * Get the local socket accepted last. If no socket was accepted,
-     * return 0. The local socket's waiter will be the same as that of
-     * the associated server socket.
-     */
-    LocalSocket* getSocket(size_t readingCapacity = LocalSocket::DEFAULT_CAPACITY,
-                           size_t writingCapacity = LocalSocket::DEFAULT_CAPACITY);
-
+    using SocketAcceptor<LocalSocket>::SocketAcceptor;
 
     friend class LocalServerSocket;
 };
-
-//------------------------------------------------------------------------------
-// Inline definitions
-//------------------------------------------------------------------------------
-
-inline LocalAcceptor::LocalAcceptor(ServerSocket* socket) :
-    Acceptor(socket)
-{
-}
-
-//------------------------------------------------------------------------------
-
-inline LocalSocket* LocalAcceptor::getSocket(Waiter* waiter,
-                                             size_t readingCapacity,
-                                             size_t writingCapacity)
-{
-    if (acceptedFD<0) return 0;
-
-    LocalSocket* socket = new LocalSocket(acceptedFD, waiter,
-                                          readingCapacity, writingCapacity);
-    connectionProcessed();
-    return socket;
-}
-
-//------------------------------------------------------------------------------
-
-inline LocalSocket* LocalAcceptor::getSocket(size_t readingCapacity,
-                                             size_t writingCapacity)
-{
-    return getSocket(socket.getWaiter(), readingCapacity, writingCapacity);
-}
 
 //------------------------------------------------------------------------------
Index: src/hu/varadiistvan/scpl/io/_posix/LocalSocket.h
===================================================================
--- src/hu/varadiistvan/scpl/io/_posix/LocalSocket.h	(revision 8)
+++ src/hu/varadiistvan/scpl/io/_posix/LocalSocket.h	(revision 32)
@@ -52,5 +52,5 @@
                 size_t writingCapacity = DEFAULT_CAPACITY);
 
-    friend class LocalAcceptor;
+    friend class SocketAcceptor<LocalSocket>;
 };
 
Index: src/hu/varadiistvan/scpl/io/_posix/Makefile.am
===================================================================
--- src/hu/varadiistvan/scpl/io/_posix/Makefile.am	(revision 25)
+++ src/hu/varadiistvan/scpl/io/_posix/Makefile.am	(revision 32)
@@ -18,4 +18,5 @@
         LocalClientSocket.cc    \
         Acceptor.cc             \
+	SocketAcceptor.h	\
         ServerSocket.cc         \
         LocalServerSocket.cc
@@ -36,4 +37,5 @@
         LocalClientSocket.h     \
         Acceptor.h              \
+        SocketAcceptor.h        \
         ServerSocket.h          \
         LocalSocket.h           \
Index: src/hu/varadiistvan/scpl/io/_posix/SocketAcceptor.h
===================================================================
--- src/hu/varadiistvan/scpl/io/_posix/SocketAcceptor.h	(revision 32)
+++ src/hu/varadiistvan/scpl/io/_posix/SocketAcceptor.h	(revision 32)
@@ -0,0 +1,132 @@
+// Copyright (c) 2022 by István Váradi
+
+// This file is part of VSCPL, a simple cross-platform utility library
+
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// The views and conclusions contained in the software and documentation are those
+// of the authors and should not be interpreted as representing official policies,
+// either expressed or implied, of the FreeBSD Project.
+
+#pragma once
+
+//------------------------------------------------------------------------------
+
+#include "Acceptor.h"
+
+//------------------------------------------------------------------------------
+
+namespace hu { namespace varadiistvan { namespace scpl { namespace io {
+
+//------------------------------------------------------------------------------
+
+/**
+ * Socket acceptor template for a certain kind of client sockets.
+ */
+template <class Socket>
+class SocketAcceptor : public Acceptor
+{
+protected:
+    /**
+     * Construct the acceptor.
+     */
+    SocketAcceptor(ServerSocket* socket);
+
+public:
+    /**
+     * Get the socket accepted last. If no socket was accepted,
+     * return 0. The socket's waiter will be the given one
+     * (which can be 0).
+     */
+    Socket* getSocket(Waiter* waiter,
+                      size_t readingCapacity = Socket::DEFAULT_CAPACITY,
+                      size_t writingCapacity = Socket::DEFAULT_CAPACITY);
+    /**
+     * Get the socket accepted last. If no socket was accepted,
+     * return 0. The socket's waiter will be the same as that of
+     * the associated server socket.
+     */
+    Socket* getSocket(size_t readingCapacity = Socket::DEFAULT_CAPACITY,
+                      size_t writingCapacity = Socket::DEFAULT_CAPACITY);
+
+    /**
+     * Get the last accepted socket as a buffered stream with the given waiter,
+     * if any.
+     */
+    BufferedStream* getAcceptedBufferedStream(Waiter* waiter = nullptr) override;
+};
+
+//------------------------------------------------------------------------------
+// Template definitions
+//------------------------------------------------------------------------------
+
+template <class Socket>
+inline SocketAcceptor<Socket>::SocketAcceptor(ServerSocket* socket) :
+    Acceptor(socket)
+{
+}
+
+//------------------------------------------------------------------------------
+
+template <class Socket>
+inline Socket*
+SocketAcceptor<Socket>::getSocket(Waiter* waiter,
+                                  size_t readingCapacity,
+                                  size_t writingCapacity)
+{
+    if (acceptedFD<0) return 0;
+
+    Socket* socket = new Socket(acceptedFD, waiter,
+                                readingCapacity, writingCapacity);
+    connectionProcessed();
+    return socket;
+}
+
+//------------------------------------------------------------------------------
+
+template <class Socket>
+inline Socket*
+SocketAcceptor<Socket>::getSocket(size_t readingCapacity,
+                                  size_t writingCapacity)
+{
+    return getSocket(socket.getWaiter(), readingCapacity, writingCapacity);
+}
+
+//------------------------------------------------------------------------------
+
+template <class Socket>
+BufferedStream* SocketAcceptor<Socket>::
+getAcceptedBufferedStream(Waiter* waiter)
+{
+    return (waiter==nullptr) ? getSocket() : getSocket(waiter);
+}
+
+//------------------------------------------------------------------------------
+
+} /* namespace hu::varadiistvan::scpl::io */ } /* namespace hu::varadiistvan::scpl */ } /* namespace hu::varadiistvan */ } /* namespace hu */
+
+//------------------------------------------------------------------------------
+
+// Local Variables:
+// mode: C++
+// c-basic-offset: 4
+// indent-tabs-mode: nil
+// End:
