@dataclass
-class _IrcConnection(BaseIrcConnection, _ClientIdMixin):
+class IrcConnection(BaseIrcConnection, _ClientIdMixin):
+    'Parent extended to work with Client.'
     hostname: InitVar[str]  # needed by BaseIrcConnection, but not desired as
     port: InitVar[int]      # dataclass fields, only for __post_init__ call
 
         return False
 
 
-_ClientConnClass = TypeVar('_ClientConnClass', bound=_IrcConnection)
-
-
-class Client(ABC, ClientQueueMixin, Generic[_ClientConnClass]):
+class Client(ABC, ClientQueueMixin):
     'Abstracts socket connection, loop over it, and handling messages from it.'
+    conn: Optional[IrcConnection] = None
     _caps: _CapsManager
-    conn: Optional[_IrcConnection] = None
-    _cls_conn: _ClientConnClass
+    _cls_conn: type[IrcConnection] = IrcConnection
 
     def __init__(self, conn_setup: IrcConnSetup, **kwargs) -> None:
         self.client_id = conn_setup.hostname
 
 
 
 class ClientKnowingTui(Client):
+    'Adapted to communicate with ClientTui.'
 
     def _client_tui_trigger(self, todo: str, **kwargs) -> None:
         self._put(TuiEvent.affector('for_client_do').kw(
 
 from queue import SimpleQueue, Empty as QueueEmpty
 from typing import Generator, Iterator, Optional
 from ircplom.events import Event, Loop, QueueMixin
-from ircplom.client import _IrcConnection, IrcConnSetup
+from ircplom.client import IrcConnection, IrcConnSetup
 from ircplom.client_tui import ClientKnowingTui, ClientTui
 from ircplom.irc_conn import IrcMessage
 from ircplom.tui_base import TerminalInterface, TuiEvent
                                     ).kw(typed_in=to_yield)
 
 
-class _FakeIrcConnection(_IrcConnection):
+class _FakeIrcConnection(IrcConnection):
 
     def __init__(self, **kwargs) -> None:
         self._q_server_msgs: SimpleQueue = SimpleQueue()