diff --git a/INSTALL.md b/INSTALL.md
index a1f8a066438d9a286dcd00c927d7af66daefd7d5..f937d922f309cce5a875af8856fd19e5ced71e9d 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -177,9 +177,9 @@ Other Linux Flavors
 ===================
 
 Installation on other Linux flavors might be similar. On other deb-based system, the
-exact same instructions might apply (Ubuntu, Raspbian, Linux Mint, etc.). On rpm-based,
-setting up the systemd services might work the same, but installing software packages
-is one with a different command.
+exact same instructions might apply (Ubuntu, Raspbian, Linux Mint, etc.). On rpm-based
+systems, setting up the systemd services might work the same, but installing software
+packages is done with a different command.
 
 
 macOS / Windows
@@ -194,6 +194,7 @@ install:
   * osc
   * slip
 
+
 Firewall
 ========
 
diff --git a/protocol_specification.txt b/protocol_specification.txt
index 477fce862bfb140f61475ff5ebc62b6d3ffa161f..8e34e8953e79d828f1708ef09e764abf3407720f 100644
--- a/protocol_specification.txt
+++ b/protocol_specification.txt
@@ -58,7 +58,7 @@ protocol version mismatch.
 Once the procol version is agreed upon, the client registers its given name, which
 can be any string configured by the user:
 
-C: /s/tpf/register/name ZHdK
+C: /s/tpf/register/client <room> <nick>
 S: /s/tpf/register/done
 
 If the server responds with:
diff --git a/tpf-server.pd b/tpf-server.pd
index d0b6dc1be531121d754c0ebbe9addd676c5c0795..1b5bd3cd5f8dfef530a08fec6adce4c0fcd7baf8 100644
--- a/tpf-server.pd
+++ b/tpf-server.pd
@@ -1,18 +1,18 @@
-#N canvas 719 165 350 402 10;
+#N canvas 48 112 392 417 10;
 #X declare -path netpd-server/includes;
 #X declare -path osc;
-#N canvas 719 374 558 410 tpf.communication 0;
+#N canvas 519 214 830 401 tpf.communication 0;
 #X obj 7 8 r SERVER;
 #X obj 7 74 s \$0.from;
-#X obj 122 11 r SERVER;
-#X obj 122 32 route socket;
-#X obj 122 54 s \$0.client;
+#X obj 488 14 r SERVER;
+#X obj 488 35 route socket;
+#X obj 488 84 s \$0.client;
 #X obj 8 113 r \$0.to;
 #X obj 8 287 list trim;
 #X obj 8 308 s SERVER;
 #X obj 8 264 list prepend;
 #X msg 88 202 list to send \$1;
-#N canvas 318 263 213 161 tcp.prepare 0;
+#N canvas 308 288 213 161 tcp.prepare 0;
 #X obj 20 28 t b a;
 #X obj 20 98 list append;
 #X obj 52 55 s to.tcp.prepare;
@@ -33,10 +33,10 @@
 #X obj 7 28 route server;
 #X obj 8 221 packOSC;
 #X obj 8 200 list trim;
-#X obj 201 104 r \$0.broadcast;
-#X obj 201 276 list trim;
-#X obj 201 297 s SERVER;
-#N canvas 318 263 213 161 tcp.prepare 0;
+#X obj 396 137 r \$0.broadcast;
+#X obj 396 309 list trim;
+#X obj 396 330 s SERVER;
+#N canvas 278 363 213 161 tcp.prepare 0;
 #X obj 20 28 t b a;
 #X obj 20 98 list append;
 #X obj 52 55 s to.tcp.prepare;
@@ -48,16 +48,62 @@
 #X connect 1 0 5 0;
 #X connect 3 0 1 1;
 #X connect 4 0 0 0;
-#X restore 201 230 pd tcp.prepare;
-#X obj 201 126 list split 1;
-#X obj 201 169 list append;
-#X msg 201 149 symbol /s/tpf\$1;
-#X obj 201 210 packOSC;
-#X obj 201 189 list trim;
-#X obj 201 253 list prepend to broadcast;
-#X connect 0 0 16 0;
+#X restore 396 263 pd tcp.prepare;
+#X obj 396 159 list split 1;
+#X obj 396 202 list append;
+#X msg 396 182 symbol /s/tpf\$1;
+#X obj 396 243 packOSC;
+#X obj 396 222 list trim;
+#X obj 396 286 list prepend to broadcast;
+#X obj 566 93 text search \$0.clients 1;
+#X obj 623 165 text get \$0.clients;
+#X msg 623 143 \$1 0 1;
+#X obj 623 187 s \$0.room;
+#X obj 566 116 sel -1, f 10;
+#X obj 213 123 r \$0.to.room.members;
+#N canvas 0 106 406 346 find.room.members 0;
+#X obj 9 11 inlet;
+#X obj 9 65 text size \$0.clients;
+#X obj 9 111 until;
+#X obj 9 134 f;
+#X obj 9 157 t a a;
+#X obj 51 150 + 1;
+#X msg 48 112 0;
+#X obj 9 251 route dummy;
+#X obj 9 204 text get \$0.clients 0 2;
+#X obj 9 34 b;
+#X obj 9 274 outlet;
+#X obj 9 227 list trim;
+#X obj 94 252 r \$0.room;
+#X obj 9 88 t a b, f 7;
+#X connect 0 0 9 0;
+#X connect 1 0 13 0;
 #X connect 2 0 3 0;
 #X connect 3 0 4 0;
+#X connect 4 0 8 0;
+#X connect 4 1 5 0;
+#X connect 5 0 3 1;
+#X connect 6 0 3 1;
+#X connect 7 0 10 0;
+#X connect 8 0 11 0;
+#X connect 9 0 1 0;
+#X connect 11 0 7 0;
+#X connect 12 0 7 1;
+#X connect 13 0 2 0;
+#X connect 13 1 6 0;
+#X restore 213 209 pd find.room.members;
+#X obj 213 146 t b a;
+#X obj 213 232 list append;
+#X obj 213 255 t a a, f 7;
+#X msg 252 277 \$1;
+#X obj 252 301 s \$0.to.client;
+#X obj 116 159 r \$0.to.client;
+#X obj 213 325 list split 1;
+#X obj 247 350 s \$0.to;
+#X obj 488 58 t a a;
+#X connect 0 0 16 0;
+#X connect 2 0 3 0;
+#X connect 3 0 44 0;
 #X connect 5 0 12 0;
 #X connect 6 0 7 0;
 #X connect 8 0 6 0;
@@ -82,114 +128,184 @@
 #X connect 26 0 22 0;
 #X connect 27 0 26 0;
 #X connect 28 0 20 0;
-#X restore 13 132 pd tpf.communication;
-#N canvas 902 132 375 575 register/name 0;
-#X obj 130 391 s \$0.to;
+#X connect 29 0 33 0;
+#X connect 30 0 32 0;
+#X connect 31 0 30 0;
+#X connect 33 1 31 0;
+#X connect 34 0 36 0;
+#X connect 35 0 37 0;
+#X connect 36 0 35 0;
+#X connect 36 1 37 1;
+#X connect 37 0 38 0;
+#X connect 38 0 42 0;
+#X connect 38 1 39 0;
+#X connect 39 0 40 0;
+#X connect 41 0 9 0;
+#X connect 42 1 43 0;
+#X connect 44 0 4 0;
+#X connect 44 1 29 0;
+#X restore 13 112 pd tpf.communication;
+#N canvas 662 138 664 550 register/name 0;
+#X obj 147 425 s \$0.to;
 #X obj 7 11 r \$0.from;
-#X obj 7 31 routeOSC /register/name;
-#X msg 49 370 /register/done;
-#X obj 7 52 list prepend;
-#X obj 87 52 r \$0.client;
-#N canvas 0 50 333 404 prevent_duplicates 0;
-#X obj 80 81 text search \$0.clients 1;
-#X obj 80 101 == -1;
-#X obj 23 62 unpack f s;
-#X obj 23 174 == -1;
-#X obj 23 154 text search \$0.clients 0;
-#X obj 23 214 &&;
-#X obj 23 234 sel 1;
-#X text 66 233 bang if neither id nor name is found;
-#X obj 23 194 t a a;
-#X obj 91 255 sel 0;
-#X msg 91 275 id already in use;
-#X obj 80 124 t a a;
-#X msg 176 201 name already in use;
-#X obj 176 183 sel 0;
-#X obj 23 14 inlet;
-#X obj 23 359 outlet;
-#X obj 91 307 outlet;
-#X connect 0 0 1 0;
-#X connect 1 0 11 0;
-#X connect 2 0 4 0;
-#X connect 2 1 0 0;
-#X connect 3 0 8 0;
-#X connect 4 0 3 0;
-#X connect 5 0 6 0;
-#X connect 6 0 15 0;
+#X msg 147 403 /register/done;
+#X obj 7 112 list prepend;
+#X obj 87 112 r \$0.client;
+#X obj 270 334 loadbang;
+#X obj 233 377 text set \$0.clients;
+#X msg 270 354 1e+06;
+#X msg 120 453 /updated/clients;
+#X obj 120 383 t b b;
+#X obj 296 239 r SERVER;
+#X obj 296 259 route ip;
+#X obj 233 305 list append;
+#X msg 296 279 symbol \$1.\$2.\$3.\$4;
+#X obj 7 31 routeOSC /register/client;
+#X msg 7 135 list \$2 \$1 \$3;
+#X text 313 308 <room> <id> <nick> <ip>;
+#X text 102 137 <room> <id> <nick>;
+#X text 158 112 <id>;
+#N canvas 771 446 251 224 first.in.room 0;
+#X obj 10 11 inlet;
+#X obj 10 180 outlet;
+#X obj 73 107 sel -1;
+#X msg 73 132 1;
+#X msg 106 133 0;
+#X obj 73 84 text search \$0.clients 0;
+#X obj 10 156 list append;
+#X obj 10 34 t a a;
+#X msg 73 57 symbol \$1;
+#X connect 0 0 7 0;
+#X connect 2 0 3 0;
+#X connect 2 1 4 0;
+#X connect 3 0 6 1;
+#X connect 4 0 6 1;
+#X connect 5 0 2 0;
+#X connect 6 0 1 0;
+#X connect 7 0 6 0;
+#X connect 7 1 8 0;
 #X connect 8 0 5 0;
-#X connect 8 1 9 0;
+#X restore 233 214 pd first.in.room;
+#X obj 120 478 s \$0.to.room.members;
+#X obj 7 160 t a b a a, f 57;
+#X msg 346 187 symbol \$1;
+#X obj 346 210 s \$0.room;
+#X text 410 207 tell room upon new client connection;
+#N canvas 737 204 510 321 sanitize_room 0;
+#X obj 37 7 inlet;
+#X obj 37 244 outlet;
+#X obj 37 30 t a a;
+#X obj 154 93 list;
+#X msg 154 117 symbol \$1;
+#X obj 37 221 spigot 0;
+#X obj 228 129 loadbang;
+#X msg 228 152 symbol;
+#X obj 154 148 sel bla;
+#X obj 154 173 t b b;
+#X msg 154 196 0;
+#X msg 193 199 1;
+#X obj 181 261 s \$0.to;
+#X msg 181 239 /register/error empty\ room\ name\ is\ not\ allowed
+;
+#X connect 0 0 2 0;
+#X connect 2 0 5 0;
+#X connect 2 1 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 8 0;
+#X connect 5 0 1 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 1;
+#X connect 8 0 9 0;
+#X connect 8 1 11 0;
 #X connect 9 0 10 0;
-#X connect 10 0 16 0;
+#X connect 9 1 13 0;
+#X connect 10 0 5 1;
 #X connect 11 0 5 1;
-#X connect 11 1 13 0;
-#X connect 12 0 16 0;
 #X connect 13 0 12 0;
-#X connect 14 0 2 0;
-#X restore 7 123 pd prevent_duplicates;
-#X obj 130 148 list prepend /register/error;
-#X obj 130 168 list trim;
-#X obj 7 96 t a a;
-#X obj 7 143 list append;
-#X obj 91 291 loadbang;
-#X obj 54 332 text set \$0.clients;
-#X msg 91 311 1e+06;
-#X obj 7 513 s \$0.add.connection;
-#X obj 7 492 f;
-#X msg 22 473 \$1;
-#X obj 7 163 t b b a a b;
-#X obj 54 252 list append;
-#X obj 70 188 text size \$0.clients;
-#X obj 70 208 == 0;
-#X msg 45 429 /updated/clients;
-#X obj 45 449 s \$0.broadcast;
-#X obj 22 350 t b b;
-#X obj 139 217 r SERVER;
-#X obj 139 237 route ip;
-#X obj 54 272 list append;
-#X msg 139 257 symbol \$1.\$2.\$3.\$4;
-#X connect 1 0 2 0;
-#X connect 2 0 4 0;
-#X connect 3 0 0 0;
-#X connect 4 0 9 0;
-#X connect 5 0 4 1;
-#X connect 6 0 10 0;
-#X connect 6 1 7 0;
-#X connect 7 0 8 0;
-#X connect 8 0 0 0;
-#X connect 9 0 6 0;
-#X connect 9 1 10 1;
-#X connect 10 0 17 0;
+#X restore 7 54 pd sanitize_room;
+#N canvas 682 218 562 388 sanitize_nick 0;
+#X obj 37 7 inlet;
+#X obj 37 260 outlet;
+#X obj 154 43 list;
+#X obj 228 62 loadbang;
+#X msg 228 85 symbol;
+#X obj 154 118 sel bla;
+#X obj 154 153 t b b;
+#X msg 154 206 0;
+#X msg 373 83 1;
+#X obj 37 30 t a a;
+#X obj 37 233 spigot 0;
+#X msg 154 67 symbol \$2;
+#X obj 181 338 s \$0.to;
+#X obj 373 31 text search \$0.clients 2;
+#X obj 373 60 sel -1;
+#X obj 406 141 t b b;
+#X obj 373 6 t a a;
+#X obj 433 164 symbol;
+#X msg 181 236 symbol empty\ name\ is\ not\ allowed;
+#X msg 181 316 /register/error \$1;
+#X msg 304 260 symbol name\\\ '\$1'\\\ is\\\ already\\\ used;
+#X connect 0 0 9 0;
+#X connect 2 0 11 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 1;
+#X connect 5 0 6 0;
+#X connect 5 1 16 0;
+#X connect 6 0 7 0;
+#X connect 6 1 18 0;
+#X connect 7 0 10 1;
+#X connect 8 0 10 1;
+#X connect 9 0 10 0;
+#X connect 9 1 2 0;
+#X connect 10 0 1 0;
+#X connect 11 0 5 0;
+#X connect 13 0 14 0;
+#X connect 14 0 8 0;
+#X connect 14 1 15 0;
+#X connect 15 0 7 0;
+#X connect 15 1 17 0;
+#X connect 16 0 13 0;
+#X connect 16 1 17 1;
+#X connect 17 0 20 0;
+#X connect 18 0 19 0;
+#X connect 19 0 12 0;
+#X connect 20 0 19 0;
+#X restore 7 80 pd sanitize_nick;
+#X text 166 30 <room> <nick>;
+#X connect 1 0 14 0;
+#X connect 2 0 0 0;
+#X connect 3 0 15 0;
+#X connect 4 0 3 1;
+#X connect 5 0 7 0;
+#X connect 7 0 6 1;
+#X connect 8 0 20 0;
+#X connect 9 0 8 0;
+#X connect 9 1 2 0;
+#X connect 10 0 11 0;
 #X connect 11 0 13 0;
+#X connect 12 0 6 0;
 #X connect 13 0 12 1;
-#X connect 15 0 14 0;
-#X connect 16 0 15 1;
-#X connect 17 0 15 0;
-#X connect 17 1 23 0;
-#X connect 17 2 16 0;
-#X connect 17 3 18 0;
-#X connect 17 4 19 0;
-#X connect 18 0 26 0;
-#X connect 19 0 20 0;
-#X connect 20 0 18 1;
-#X connect 21 0 22 0;
-#X connect 23 0 21 0;
-#X connect 23 1 3 0;
-#X connect 24 0 25 0;
-#X connect 25 0 27 0;
-#X connect 26 0 12 0;
-#X connect 27 0 26 1;
-#X restore 13 172 pd register/name;
-#N canvas 595 213 337 132 protol/version 0;
+#X connect 14 0 25 0;
+#X connect 15 0 21 0;
+#X connect 19 0 12 0;
+#X connect 21 1 9 0;
+#X connect 21 2 19 0;
+#X connect 21 3 22 0;
+#X connect 22 0 23 0;
+#X connect 25 0 26 0;
+#X connect 26 0 3 0;
+#X restore 13 154 pd register/name;
+#N canvas 575 494 337 132 protol/version 0;
 #X obj 17 15 r \$0.from;
 #X obj 17 75 s \$0.to;
 #X obj 17 35 routeOSC /protocol/version;
-#X msg 17 55 /protocol/version 1 0;
+#X msg 17 55 /protocol/version 1 1;
 #X connect 0 0 2 0;
 #X connect 2 0 3 0;
 #X connect 3 0 1 0;
-#X restore 13 152 pd protol/version;
+#X restore 13 133 pd protol/version;
 #X obj 13 50 text define \$0.clients;
-#N canvas 699 381 494 446 unregister/name 0;
+#N canvas 506 230 494 528 unregister/name 0;
 #X text 11 9 We want disconnceting clients to automatically unregister
 by IP and port.;
 #X obj 14 50 r SERVER;
@@ -198,197 +314,66 @@ by IP and port.;
 #X obj 15 135 sel -1;
 #X text 68 136 <- detects a disconnecting client;
 #X obj 15 163 list append;
-#X obj 99 272 text delete \$0.clients;
-#X obj 15 228 sel -1;
+#X obj 183 300 text delete \$0.clients;
+#X obj 15 248 sel -1;
 #X obj 14 71 route num_of_clients socket;
-#X obj 15 202 text search \$0.clients 0;
-#X obj 15 183 t a a;
-#X obj 48 401 f;
-#X obj 48 422 s \$0.del.connection;
-#X obj 82 335 text set \$0.clients;
-#X obj 119 293 loadbang;
-#X msg 119 313 0;
-#X msg 156 313 2;
-#X msg 82 313 1;
-#X msg 65 360 /updated/clients;
-#X obj 65 380 s \$0.broadcast;
-#X obj 48 253 t b b b a;
+#X msg 93 387 /updated/clients;
+#X obj 15 222 text search \$0.clients 1;
+#N canvas 257 106 450 233 reassign.leader 0;
+#X obj 10 11 inlet;
+#X obj 10 88 text search \$0.clients 0;
+#X obj 10 111 sel -1;
+#X obj 43 182 text set \$0.clients 0 3;
+#X obj 43 135 t b a;
+#X msg 43 158 1;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 1 4 0;
+#X connect 4 0 5 0;
+#X connect 4 1 3 1;
+#X connect 5 0 3 0;
+#X restore 138 359 pd reassign.leader;
+#X obj 138 332 symbol;
+#X obj 93 412 s \$0.to.room.members;
+#X obj 193 332 r \$0.room;
+#X obj 48 273 t b b b a, f 23;
 #X connect 1 0 9 0;
 #X connect 2 0 3 1;
 #X connect 2 1 3 0;
 #X connect 3 0 4 0;
 #X connect 4 0 6 0;
 #X connect 6 0 11 0;
-#X connect 8 1 21 0;
+#X connect 8 1 16 0;
 #X connect 9 0 2 0;
 #X connect 9 1 6 1;
-#X connect 10 0 8 0;
-#X connect 11 0 10 0;
-#X connect 11 1 12 1;
-#X connect 12 0 13 0;
-#X connect 15 0 16 0;
-#X connect 15 0 17 0;
-#X connect 16 0 14 1;
-#X connect 17 0 14 2;
-#X connect 18 0 14 0;
-#X connect 19 0 20 0;
-#X connect 21 0 12 0;
-#X connect 21 1 19 0;
-#X connect 21 2 18 0;
-#X connect 21 3 7 0;
-#X restore 13 191 pd unregister/name;
-#X obj 13 71 text define \$0.connections;
-#N canvas 764 216 666 598 manage.connections 0;
-#X obj 25 21 r \$0.add.connection;
-#X obj 52 273 text get \$0.clients;
-#X obj 89 212 loadbang;
-#X obj 89 232 t b b;
-#X msg 89 252 0;
-#X msg 118 252 1;
-#X obj 52 85 text size \$0.clients;
-#X obj 52 61 t b a;
-#X obj 52 105 - 1;
-#X obj 52 125 t a b;
-#X obj 52 145 until;
-#X obj 52 165 f;
-#X obj 52 185 t a a;
-#X obj 95 176 + 1;
-#X msg 92 147 0;
-#X obj 52 298 pack f f;
-#X obj 170 175 t a;
-#X obj 52 428 text set \$0.connections;
-#X obj 97 387 loadbang;
-#X msg 97 407 8e+06;
-#X obj 311 65 t b a;
-#X obj 311 128 until;
-#X obj 311 148 f;
-#X obj 311 215 text get \$0.connections;
-#X msg 311 257 \$1;
-#X msg 343 257 \$2;
-#X obj 311 291 sel;
-#X obj 343 291 sel;
-#X obj 311 189 t a a a;
-#X obj 311 332 f;
-#X obj 382 292 t a;
-#X obj 457 197 t a;
-#X obj 311 356 text delete \$0.connections;
-#X obj 311 108 t a a;
-#X obj 311 168 - 1;
-#X obj 311 88 text size \$0.connections;
-#X obj 311 235 t a a;
-#N canvas 764 541 286 245 find.free.port 0;
-#X obj 40 26 inlet;
-#X obj 40 46 t b b;
-#X obj 40 66 until;
-#X obj 40 86 f;
-#X msg 81 65 0;
-#X obj 40 127 text search \$0.connections 2;
-#X obj 40 147 sel -1;
-#X obj 96 97 + 1;
-#X obj 40 106 t a a a;
-#X obj 40 167 t b b;
-#X obj 40 187 f;
-#X obj 150 96 t b;
-#X obj 40 207 outlet;
-#X connect 0 0 1 0;
-#X connect 1 0 2 0;
-#X connect 1 1 4 0;
-#X connect 2 0 3 0;
-#X connect 3 0 8 0;
-#X connect 4 0 3 1;
-#X connect 5 0 6 0;
-#X connect 6 0 9 0;
-#X connect 7 0 3 1;
-#X connect 8 0 5 0;
-#X connect 8 1 10 1;
-#X connect 8 2 7 0;
-#X connect 9 0 10 0;
-#X connect 9 1 11 0;
-#X connect 10 0 12 0;
-#X connect 11 0 2 1;
-#X restore 115 343 pd find.free.port;
-#X obj 52 318 t a b;
-#X obj 52 363 list append;
-#X obj 284 25 r \$0.del.connection;
-#X obj 284 426 b;
-#X obj 25 41 t b a;
-#X obj 284 45 t b a;
-#X msg 25 510 /updated/mylinks;
-#X obj 25 530 s \$0.broadcast;
-#X connect 0 0 42 0;
-#X connect 1 0 15 0;
-#X connect 2 0 3 0;
-#X connect 3 0 4 0;
-#X connect 3 1 5 0;
-#X connect 4 0 1 1;
-#X connect 5 0 1 2;
-#X connect 6 0 8 0;
-#X connect 7 0 6 0;
-#X connect 7 1 16 0;
-#X connect 8 0 9 0;
-#X connect 9 0 10 0;
-#X connect 9 1 14 0;
-#X connect 10 0 11 0;
-#X connect 11 0 12 0;
-#X connect 12 0 1 0;
-#X connect 12 1 13 0;
-#X connect 13 0 11 1;
-#X connect 14 0 11 1;
-#X connect 15 0 38 0;
-#X connect 16 0 15 1;
-#X connect 18 0 19 0;
-#X connect 19 0 17 1;
-#X connect 20 0 35 0;
-#X connect 20 1 31 0;
-#X connect 21 0 22 0;
-#X connect 22 0 34 0;
-#X connect 23 0 36 0;
-#X connect 24 0 26 0;
-#X connect 25 0 27 0;
-#X connect 26 0 29 0;
-#X connect 27 0 29 0;
-#X connect 28 0 23 0;
-#X connect 28 1 30 0;
-#X connect 28 2 22 1;
-#X connect 29 0 32 0;
-#X connect 30 0 29 1;
-#X connect 31 0 27 1;
-#X connect 31 0 26 1;
-#X connect 33 0 21 0;
-#X connect 33 1 22 1;
-#X connect 34 0 28 0;
-#X connect 35 0 33 0;
-#X connect 36 0 24 0;
-#X connect 36 1 25 0;
-#X connect 37 0 39 1;
-#X connect 38 0 39 0;
-#X connect 38 1 37 0;
-#X connect 39 0 17 0;
-#X connect 40 0 43 0;
-#X connect 41 0 44 0;
-#X connect 42 0 44 0;
-#X connect 42 1 7 0;
-#X connect 43 0 41 0;
-#X connect 43 1 20 0;
-#X connect 44 0 45 0;
-#X restore 13 210 pd manage.connections;
-#N canvas 520 75 483 394 client.list 0;
-#X obj 12 33 r \$0.from;
-#X obj 12 53 routeOSC /refresh/clients;
-#X obj 31 103 text size \$0.clients;
-#X obj 31 143 until;
-#X obj 31 163 f;
-#X obj 31 183 t a a;
-#X obj 74 177 + 1;
-#X msg 74 147 0;
-#X obj 31 206 text get \$0.clients;
-#X obj 12 73 t b b b;
-#X obj 31 249 list trim;
-#X obj 12 296 s \$0.to;
-#X obj 31 229 list prepend /clients;
-#X msg 12 270 /clients/end;
-#X msg 114 268 /clients/begin;
-#X obj 31 123 t a b;
+#X connect 10 0 14 0;
+#X connect 11 0 8 0;
+#X connect 13 0 12 0;
+#X connect 15 0 13 1;
+#X connect 16 1 10 0;
+#X connect 16 2 13 0;
+#X connect 16 3 7 0;
+#X restore 13 175 pd unregister/name;
+#N canvas 470 106 395 439 client.list 0;
+#X obj 12 22 r \$0.from;
+#X obj 12 47 routeOSC /refresh/clients;
+#X obj 64 95 text size \$0.clients;
+#X obj 64 140 until;
+#X obj 64 162 f;
+#X obj 64 183 t a a;
+#X obj 107 177 + 1;
+#X msg 105 140 0;
+#X obj 64 206 text get \$0.clients;
+#X obj 12 73 t b b b, f 18;
+#X obj 64 324 list trim;
+#X obj 12 396 s \$0.to;
+#X obj 64 299 list prepend /clients;
+#X msg 12 358 /clients/end;
+#X msg 117 358 /clients/begin;
+#X obj 64 117 t a b;
+#X obj 64 239 list trim;
+#X obj 64 270 route dummy;
+#X obj 127 238 r \$0.room;
 #X connect 0 0 1 0;
 #X connect 1 0 9 0;
 #X connect 2 0 15 0;
@@ -398,7 +383,7 @@ by IP and port.;
 #X connect 5 1 6 0;
 #X connect 6 0 4 1;
 #X connect 7 0 4 1;
-#X connect 8 0 12 0;
+#X connect 8 0 16 0;
 #X connect 9 0 13 0;
 #X connect 9 1 2 0;
 #X connect 9 2 14 0;
@@ -408,75 +393,34 @@ by IP and port.;
 #X connect 14 0 11 0;
 #X connect 15 0 3 0;
 #X connect 15 1 7 0;
-#X restore 13 229 pd client.list;
-#N canvas 520 75 432 493 mylink.list 0;
-#X obj 12 13 r \$0.from;
-#X obj 31 123 until;
-#X obj 31 143 f;
-#X obj 31 163 t a a;
-#X obj 74 157 + 1;
-#X msg 74 127 0;
-#X obj 12 53 t b b b;
-#X obj 31 379 list trim;
-#X obj 12 426 s \$0.to;
-#X obj 12 33 routeOSC /refresh/mylinks;
-#X obj 31 83 text size \$0.connections;
-#X obj 31 186 text get \$0.connections;
-#X obj 31 359 list prepend /mylinks;
-#X msg 12 398 /mylinks/end;
-#X msg 114 398 /mylinks/begin;
-#X obj 214 251 r \$0.client;
-#X obj 31 206 t a a a;
-#X msg 31 231 \$1 \$2;
-#X obj 31 251 unpack f f;
-#X obj 31 281 sel;
-#X obj 31 301 f;
-#X obj 97 251 unpack f f;
-#X obj 97 281 sel;
-#X obj 97 301 f;
-#X msg 97 231 \$2 \$1;
-#X msg 321 248 \$3;
-#X obj 31 328 pack f f, f 48;
-#X obj 31 103 t a b;
-#X connect 0 0 9 0;
-#X connect 1 0 2 0;
-#X connect 2 0 3 0;
-#X connect 3 0 11 0;
-#X connect 3 1 4 0;
-#X connect 4 0 2 1;
-#X connect 5 0 2 1;
-#X connect 6 0 13 0;
-#X connect 6 1 10 0;
-#X connect 6 2 14 0;
-#X connect 7 0 8 0;
-#X connect 9 0 6 0;
-#X connect 10 0 27 0;
-#X connect 11 0 16 0;
-#X connect 12 0 7 0;
-#X connect 13 0 8 0;
-#X connect 14 0 8 0;
-#X connect 15 0 22 1;
-#X connect 15 0 19 1;
 #X connect 16 0 17 0;
-#X connect 16 1 24 0;
-#X connect 16 2 25 0;
-#X connect 17 0 18 0;
-#X connect 18 0 19 0;
-#X connect 18 1 20 1;
-#X connect 19 0 20 0;
-#X connect 20 0 26 0;
-#X connect 21 0 22 0;
-#X connect 21 1 23 1;
-#X connect 22 0 23 0;
-#X connect 23 0 26 0;
-#X connect 24 0 21 0;
-#X connect 25 0 26 1;
-#X connect 26 0 12 0;
-#X connect 27 0 1 0;
-#X connect 27 1 5 0;
-#X restore 13 248 pd mylink.list;
-#X obj 13 91 text define \$0.params;
-#N canvas 101 124 599 378 params 0;
+#X connect 17 0 12 0;
+#X connect 18 0 17 1;
+#X restore 13 197 pd client.list;
+#X obj 13 71 text define \$0.params;
+#N canvas 918 595 355 291 reset/all 0;
+#X obj 29 21 r \$0.from;
+#X obj 83 134 text delete \$0.clients;
+#X obj 56 190 text delete \$0.params;
+#X obj 29 61 t b b;
+#X msg 56 81 -1;
+#X msg 29 226 /register/again;
+#X obj 29 246 s \$0.broadcast;
+#X obj 29 41 routeOSC /reset/clients;
+#X obj 56 101 t a a;
+#X connect 0 0 7 0;
+#X connect 3 0 5 0;
+#X connect 3 1 4 0;
+#X connect 4 0 8 0;
+#X connect 5 0 6 0;
+#X connect 7 0 3 0;
+#X connect 8 0 2 0;
+#X connect 8 1 1 0;
+#X restore 13 239 pd reset/all;
+#X obj 13 341 netpd-server/netpd-server;
+#X obj 13 363 declare -path netpd-server/includes;
+#X obj 13 13 declare -path osc;
+#N canvas 0 106 690 442 param.list 0;
 #X obj 12 13 r \$0.from;
 #X obj 12 33 routeOSC /params;
 #X obj 12 53 routeOSC /end /begin;
@@ -484,7 +428,6 @@ by IP and port.;
 #X msg 39 93 0;
 #X obj 12 73 t b b;
 #X obj 129 129 spigot;
-#X obj 12 239 s \$0.broadcast;
 #X msg 12 214 /updated/params;
 #X obj 351 18 r \$0.from;
 #X obj 351 40 routeOSC /refresh/params;
@@ -496,47 +439,55 @@ by IP and port.;
 #X obj 370 165 f;
 #X msg 410 145 0;
 #X obj 370 215 text get \$0.params;
-#X obj 370 239 list prepend /params;
-#X obj 370 259 list trim;
-#X msg 389 296 /params/begin;
-#X msg 351 320 /params/end;
-#X obj 351 353 s \$0.to;
+#X obj 370 306 list prepend /params;
+#X obj 370 326 list trim;
+#X msg 389 351 /params/begin;
+#X msg 351 375 /params/end;
 #X obj 370 185 t a a;
 #X obj 421 178 + 1;
-#N canvas 173 124 359 338 update.params 0;
-#X obj 17 287 text set \$0.params;
-#X obj 17 264 list;
-#X obj 52 242 loadbang;
-#X msg 52 262 8e+06;
+#N canvas 173 289 359 441 update.params 0;
+#X obj 17 327 text set \$0.params;
+#X obj 17 304 list;
+#X obj 52 282 loadbang;
+#X msg 52 302 8e+06;
 #X obj 17 17 inlet;
-#X obj 17 100 text search \$0.params 0;
-#X obj 17 58 t a a;
+#X obj 17 88 t a a;
 #X obj 17 37 list;
-#X obj 17 80 list split 1;
-#X obj 17 121 sel -1;
-#X obj 50 222 text set \$0.params;
-#X obj 120 181 loadbang;
-#X msg 120 201 1;
-#X obj 50 144 t b a;
-#X obj 50 164 list append;
+#X obj 17 161 sel -1;
+#X obj 50 262 text set \$0.params;
+#X obj 120 221 loadbang;
+#X obj 50 184 t b a;
+#X obj 50 204 list append;
+#X obj 17 61 list prepend;
+#X obj 86 35 r \$0.room;
+#X obj 17 110 list split 2;
+#X obj 17 140 text search \$0.params 0 1;
+#X msg 120 241 2;
 #X connect 1 0 0 0;
 #X connect 2 0 3 0;
 #X connect 3 0 0 1;
-#X connect 4 0 7 0;
-#X connect 5 0 9 0;
-#X connect 6 0 8 0;
-#X connect 6 1 1 1;
-#X connect 7 0 6 0;
-#X connect 8 0 5 0;
-#X connect 8 1 14 1;
-#X connect 9 0 1 0;
-#X connect 9 1 13 0;
-#X connect 11 0 12 0;
-#X connect 12 0 10 2;
-#X connect 13 0 14 0;
-#X connect 13 1 10 1;
-#X connect 14 0 10 0;
+#X connect 4 0 6 0;
+#X connect 5 0 14 0;
+#X connect 5 1 1 1;
+#X connect 6 0 12 0;
+#X connect 7 0 1 0;
+#X connect 7 1 10 0;
+#X connect 9 0 16 0;
+#X connect 10 0 11 0;
+#X connect 10 1 8 1;
+#X connect 11 0 8 0;
+#X connect 12 0 5 0;
+#X connect 13 0 12 1;
+#X connect 14 0 15 0;
+#X connect 14 1 11 1;
+#X connect 15 0 7 0;
+#X connect 16 0 8 2;
 #X restore 129 172 pd update.params;
+#X obj 370 284 route dummy;
+#X obj 370 262 list trim;
+#X obj 351 408 s \$0.to;
+#X obj 12 238 s \$0.to.room.members;
+#X obj 433 259 r \$0.room;
 #X connect 0 0 1 0;
 #X connect 1 0 2 0;
 #X connect 2 0 5 0;
@@ -544,51 +495,59 @@ by IP and port.;
 #X connect 2 2 6 0;
 #X connect 3 0 6 1;
 #X connect 4 0 6 1;
-#X connect 5 0 8 0;
+#X connect 5 0 7 0;
 #X connect 5 1 4 0;
-#X connect 6 0 26 0;
-#X connect 8 0 7 0;
+#X connect 6 0 24 0;
+#X connect 7 0 28 0;
+#X connect 8 0 9 0;
 #X connect 9 0 10 0;
 #X connect 10 0 11 0;
 #X connect 11 0 12 0;
-#X connect 12 0 13 0;
-#X connect 13 0 22 0;
-#X connect 13 1 14 0;
-#X connect 13 2 21 0;
+#X connect 12 0 21 0;
+#X connect 12 1 13 0;
+#X connect 12 2 20 0;
+#X connect 13 0 14 0;
+#X connect 13 1 16 0;
 #X connect 14 0 15 0;
-#X connect 14 1 17 0;
-#X connect 15 0 16 0;
-#X connect 16 0 24 0;
-#X connect 17 0 16 1;
+#X connect 15 0 22 0;
+#X connect 16 0 15 1;
+#X connect 17 0 26 0;
 #X connect 18 0 19 0;
-#X connect 19 0 20 0;
-#X connect 20 0 23 0;
-#X connect 21 0 23 0;
-#X connect 22 0 23 0;
-#X connect 24 0 18 0;
-#X connect 24 1 25 0;
-#X connect 25 0 16 1;
-#X restore 13 267 pd params;
-#N canvas 938 512 355 291 reset/all 0;
-#X obj 29 21 r \$0.from;
-#X obj 95 164 text delete \$0.clients;
-#X obj 75 182 text delete \$0.connections;
-#X obj 56 200 text delete \$0.params;
-#X obj 29 61 t b b;
-#X msg 56 81 -1;
-#X obj 56 101 t a a a;
-#X msg 29 226 /register/again;
-#X obj 29 246 s \$0.broadcast;
-#X obj 29 41 routeOSC /reset/clients;
-#X connect 0 0 9 0;
-#X connect 4 0 7 0;
-#X connect 4 1 5 0;
-#X connect 5 0 6 0;
-#X connect 6 1 2 0;
-#X connect 6 2 1 0;
-#X connect 7 0 8 0;
-#X connect 9 0 4 0;
-#X restore 13 285 pd reset/all;
-#X obj 13 341 netpd-server/netpd-server;
-#X obj 13 363 declare -path netpd-server/includes;
-#X obj 12 13 declare -path osc;
+#X connect 19 0 27 0;
+#X connect 20 0 27 0;
+#X connect 21 0 27 0;
+#X connect 22 0 17 0;
+#X connect 22 1 23 0;
+#X connect 23 0 15 1;
+#X connect 25 0 18 0;
+#X connect 26 0 25 0;
+#X connect 29 0 25 1;
+#X restore 13 218 pd param.list;
+#N canvas 0 106 429 282 DEBUG 0;
+#X obj 17 15 r \$0.from;
+#X obj 17 91 print FROM;
+#X obj 23 124 r \$0.to;
+#X obj 89 45 r \$0.client;
+#X obj 17 68 list prepend;
+#X obj 92 155 r \$0.client;
+#X obj 23 178 list prepend;
+#X obj 23 203 print TO__;
+#X obj 17 38 spigot 0;
+#X obj 23 147 spigot 0;
+#X obj 204 13 inlet;
+#X obj 170 155 r \$0.to.client;
+#X connect 0 0 8 0;
+#X connect 2 0 9 0;
+#X connect 3 0 4 1;
+#X connect 4 0 1 0;
+#X connect 5 0 6 1;
+#X connect 6 0 7 0;
+#X connect 8 0 4 0;
+#X connect 9 0 6 0;
+#X connect 10 0 9 1;
+#X connect 10 0 8 1;
+#X connect 11 0 6 1;
+#X restore 275 285 pd DEBUG;
+#X obj 275 258 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
+1;
+#X connect 13 0 12 0;