from getpass import getuser
 from threading import Thread
 from typing import Callable, Optional
-from uuid import UUID, uuid4
 # ourselves
 from ircplom.events import (AffectiveEvent, ExceptionEvent, Logger,
                             PayloadMixin, QueueMixin)
 from ircplom.irc_conn import (BaseIrcConnection, IrcConnAbortException,
                               IrcMessage, PORT_SSL)
 
-ClientsDb = dict[UUID, 'Client']
+ClientsDb = dict[str, 'Client']
 CHAT_GLOB = '*'
 
 _LOG_PREFIX_PRIVMSG = ''
 @dataclass
 class ClientIdMixin:
     'Collects a Client\'s ID at .client_id.'
-    client_id: UUID
+    client_id: str
 
 
 @dataclass
 
 class _IrcConnection(BaseIrcConnection):
 
-    def __init__(self, client_id: UUID, **kwargs) -> None:
+    def __init__(self, client_id: str, **kwargs) -> None:
         # TODO: find out why I can't just ClientIdMixin here
         self.client_id = client_id
         super().__init__(**kwargs)
         self.conn_setup = conn_setup
         if self.conn_setup.port <= 0:
             self.conn_setup.port = PORT_SSL
-        self.id_ = uuid4()
+        self.id_ = self.conn_setup.hostname
         self.log = Logger(self._log)
         self.update_login(nick_confirmed=False,
                           nickname=self.conn_setup.nickname)
 
 'TUI adaptions to Client.'
 # built-ins
 from dataclasses import dataclass
-from uuid import UUID
 # ourselves
 from ircplom.events import PayloadMixin
 from ircplom.tui_base import (BaseTui, PromptWidget, TuiEvent, Window,
     client_id_name = 'client_id'
     prompt: _ClientPromptWidget
 
-    def __init__(self, client_id: UUID, chat: str = '', **kwargs) -> None:
+    def __init__(self, client_id: str, chat: str = '', **kwargs) -> None:
         self.client_id = client_id
         self.chat = chat
         super().__init__(**kwargs)
 class ClientTui(BaseTui):
     'TUI expanded towards Client features.'
 
-    def _new_client_window(self, client_id: UUID, chat: str = ''
+    def _new_client_window(self, client_id: str, chat: str = ''
                            ) -> _ClientWindow:
         new_idx = len(self.windows)
         win_class = (_PrivmsgWindow if (chat and chat[0].isalpha())
         self._switch_window(new_idx)
         return win
 
-    def client_wins(self, client_id: UUID) -> list[_ClientWindow]:
+    @property
+    def _all_client_wins(self) -> list[_ClientWindow]:
+        return [win for win in self.windows if isinstance(win, _ClientWindow)]
+
+    def client_wins(self, client_id: str = '') -> list[_ClientWindow]:
         'All _ClientWindows matching client_id; if none, create one.'
-        wins = [win for win in self.windows
-                if isinstance(win, _ClientWindow)
-                and win.client_id == client_id]  # pylint: disable=no-member
+        wins = [w for w in self._all_client_wins if client_id == w.client_id]
         if not wins:
             wins = [self._new_client_window(client_id=client_id)]
         return wins
 
-    def client_win(self, client_id: UUID, chat: str = '') -> _ClientWindow:
+    def client_win(self, client_id: str, chat: str = '') -> _ClientWindow:
         '''That _ClientWindow matching client_id and chat; create if none.
 
         In case of creation, copy prompt prefix from client's first window.
         'Create Client and pass it via NewClientEvent.'
         split = host_port.split(':', maxsplit=1)
         hostname = split[0]
+        if hostname in [win.client_id for win in self._all_client_wins]:
+            self.log.alert(f'already set up connection to {hostname}')
+            return
         port = -1
         if len(split) > 1:
             to_int = split[1]