gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnunet] branch master updated (8e8c3f1e1 -> b8672206e)


From: gnunet
Subject: [gnunet] branch master updated (8e8c3f1e1 -> b8672206e)
Date: Tue, 14 Nov 2023 17:59:13 +0100

This is an automated email from the git hooks/post-receive script.

thejackimonster pushed a change to branch master
in repository gnunet.

    from 8e8c3f1e1 Transport: Added missing dekrement when removing QueueEntry 
from DLL.
     new b56d5e12c MESSENGER: Separate peer and member signed messages
     new a37db0db7 MESSENGER: Fix remaining test failure
     new e60834efb MESSENGER: Uncrustify code
     new 3965ca965 -minor additional cleanup
     new 34587531b MESSENGER: Reduce priority of enqueued messages to start 
with initial join message
     new b8672206e Merge branch 'master' of ssh://git.gnunet.org/gnunet

The 6 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 po/POTFILES.in                                     |   6 +
 src/cli/messenger/Makefile.am                      |   1 +
 src/cli/messenger/gnunet-messenger.c               | 137 +++-
 src/cli/messenger/meson.build                      |   1 +
 src/include/gnunet_crypto_lib.h                    |  39 +-
 src/include/gnunet_identity_service.h              |  12 +-
 src/include/gnunet_messenger_service.h             | 104 ++-
 src/lib/util/crypto_ecc_setup.c                    |  35 +-
 src/plugin/messenger/plugin_gnsrecord_messenger.c  |  37 +-
 src/service/messenger/Makefile.am                  |  10 +-
 src/{cli => service}/messenger/gnunet-messenger.c  | 137 +++-
 src/service/messenger/gnunet-service-messenger.c   | 277 +++----
 src/service/messenger/gnunet-service-messenger.h   |   4 +-
 .../messenger/gnunet-service-messenger_basement.c  |   6 +-
 .../messenger/gnunet-service-messenger_ego_store.c | 215 +++---
 .../messenger/gnunet-service-messenger_handle.c    | 697 +++++++----------
 .../messenger/gnunet-service-messenger_handle.h    | 112 +--
 .../gnunet-service-messenger_list_handles.c        |  35 +-
 .../gnunet-service-messenger_list_messages.c       |  75 +-
 .../messenger/gnunet-service-messenger_member.c    | 174 +++--
 .../messenger/gnunet-service-messenger_member.h    |   4 +-
 .../gnunet-service-messenger_member_session.c      | 513 +++++++------
 .../gnunet-service-messenger_member_session.h      |  40 +-
 .../gnunet-service-messenger_member_store.c        | 102 ++-
 .../gnunet-service-messenger_member_store.h        |  14 +-
 .../gnunet-service-messenger_message_handle.c      | 115 +--
 .../gnunet-service-messenger_message_handle.h      |  39 +-
 .../gnunet-service-messenger_message_kind.c        | 185 +----
 .../gnunet-service-messenger_message_kind.h        | 105 +--
 .../gnunet-service-messenger_message_recv.c        | 135 ++--
 .../gnunet-service-messenger_message_recv.h        |   4 +-
 .../gnunet-service-messenger_message_send.c        | 148 +++-
 .../gnunet-service-messenger_message_send.h        |  19 +-
 .../gnunet-service-messenger_message_state.c       |  40 +-
 .../gnunet-service-messenger_message_state.h       |   5 +-
 .../gnunet-service-messenger_message_store.c       | 325 +++++---
 .../messenger/gnunet-service-messenger_operation.c | 112 +--
 .../messenger/gnunet-service-messenger_operation.h |   4 +-
 .../gnunet-service-messenger_operation_store.c     | 104 ++-
 .../messenger/gnunet-service-messenger_room.c      | 842 ++++++++++++---------
 .../messenger/gnunet-service-messenger_room.h      |  39 +-
 ...h => gnunet-service-messenger_sender_session.h} |  23 +-
 .../messenger/gnunet-service-messenger_service.c   | 134 ++--
 .../messenger/gnunet-service-messenger_service.h   |  26 +-
 .../messenger/gnunet-service-messenger_tunnel.c    | 160 ++--
 src/service/messenger/meson.build                  |   4 +-
 src/service/messenger/messenger_api.c              | 806 +++++++++++++-------
 src/service/messenger/messenger_api_contact.c      |  38 +-
 .../messenger/messenger_api_contact_store.c        |  73 +-
 .../messenger/messenger_api_contact_store.h        |   6 +-
 src/service/messenger/messenger_api_handle.c       | 143 +++-
 src/service/messenger/messenger_api_handle.h       |  37 +-
 src/service/messenger/messenger_api_list_tunnels.c | 130 ++--
 src/service/messenger/messenger_api_list_tunnels.h |  25 +-
 src/service/messenger/messenger_api_message.c      | 255 +++++--
 src/service/messenger/messenger_api_message.h      |  91 ++-
 src/service/messenger/messenger_api_message_kind.c | 190 +++++
 ...message_kind.h => messenger_api_message_kind.h} |  51 +-
 src/service/messenger/messenger_api_peer_store.c   | 197 +++++
 src/service/messenger/messenger_api_peer_store.h   |  93 +++
 .../messenger/messenger_api_queue_messages.c       | 108 +++
 .../messenger/messenger_api_queue_messages.h       |  89 +++
 src/service/messenger/messenger_api_room.c         | 277 +++++--
 src/service/messenger/messenger_api_room.h         |  53 +-
 src/service/messenger/messenger_api_util.c         |  56 +-
 src/service/messenger/messenger_api_util.h         |  26 +-
 .../messenger/plugin_gnsrecord_messenger.c         |  37 +-
 src/service/messenger/test_messenger.c             |  58 +-
 ...ng_messenger_setup.h => test_messenger_adapt.c} |  35 +-
 src/service/messenger/test_messenger_anonymous.c   |  45 +-
 ...enger_setup.h => test_messenger_async_client.c} |  35 +-
 ...essenger_setup.h => test_messenger_async_p2p.c} |  35 +-
 ...g_messenger_setup.h => test_messenger_growth.c} |  35 +-
 ...ing_messenger_setup.h => test_messenger_ring.c} |  35 +-
 ...g_messenger_setup.h => test_messenger_server.c} |  35 +-
 ...senger_setup.h => test_messenger_sync_client.c} |  35 +-
 ...messenger_setup.h => test_messenger_sync_p2p.c} |  35 +-
 ...enger_setup.h => test_messenger_worst_client.c} |  35 +-
 ...essenger_setup.h => test_messenger_worst_p2p.c} |  35 +-
 src/service/messenger/testing_messenger_barrier.c  |  52 +-
 src/service/messenger/testing_messenger_setup.c    | 197 +++--
 src/service/messenger/testing_messenger_setup.h    |   4 +-
 82 files changed, 5569 insertions(+), 3273 deletions(-)
 copy src/{cli => service}/messenger/gnunet-messenger.c (66%)
 copy src/service/messenger/{messenger_api_ego.h => 
gnunet-service-messenger_sender_session.h} (63%)
 create mode 100644 src/service/messenger/messenger_api_message_kind.c
 copy src/service/messenger/{gnunet-service-messenger_message_kind.h => 
messenger_api_message_kind.h} (71%)
 create mode 100644 src/service/messenger/messenger_api_peer_store.c
 create mode 100644 src/service/messenger/messenger_api_peer_store.h
 create mode 100644 src/service/messenger/messenger_api_queue_messages.c
 create mode 100644 src/service/messenger/messenger_api_queue_messages.h
 copy src/{plugin => service}/messenger/plugin_gnsrecord_messenger.c (89%)
 copy src/service/messenger/{testing_messenger_setup.h => 
test_messenger_adapt.c} (54%)
 copy src/service/messenger/{testing_messenger_setup.h => 
test_messenger_async_client.c} (57%)
 copy src/service/messenger/{testing_messenger_setup.h => 
test_messenger_async_p2p.c} (57%)
 copy src/service/messenger/{testing_messenger_setup.h => 
test_messenger_growth.c} (54%)
 copy src/service/messenger/{testing_messenger_setup.h => 
test_messenger_ring.c} (55%)
 copy src/service/messenger/{testing_messenger_setup.h => 
test_messenger_server.c} (54%)
 copy src/service/messenger/{testing_messenger_setup.h => 
test_messenger_sync_client.c} (57%)
 copy src/service/messenger/{testing_messenger_setup.h => 
test_messenger_sync_p2p.c} (57%)
 copy src/service/messenger/{testing_messenger_setup.h => 
test_messenger_worst_client.c} (57%)
 copy src/service/messenger/{testing_messenger_setup.h => 
test_messenger_worst_p2p.c} (57%)

diff --git a/po/POTFILES.in b/po/POTFILES.in
index 1357925d0..82fd70f3c 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -340,6 +340,7 @@ src/service/identity/gnunet-service-identity.c
 src/service/identity/identity_api.c
 src/service/identity/identity_api_lookup.c
 src/service/identity/identity_api_suffix_lookup.c
+src/service/messenger/gnunet-messenger.c
 src/service/messenger/gnunet-service-messenger.c
 src/service/messenger/gnunet-service-messenger_basement.c
 src/service/messenger/gnunet-service-messenger_ego_store.c
@@ -366,8 +367,12 @@ src/service/messenger/messenger_api_contact_store.c
 src/service/messenger/messenger_api_handle.c
 src/service/messenger/messenger_api_list_tunnels.c
 src/service/messenger/messenger_api_message.c
+src/service/messenger/messenger_api_message_kind.c
+src/service/messenger/messenger_api_peer_store.c
+src/service/messenger/messenger_api_queue_messages.c
 src/service/messenger/messenger_api_room.c
 src/service/messenger/messenger_api_util.c
+src/service/messenger/plugin_gnsrecord_messenger.c
 src/service/messenger/testing_messenger_barrier.c
 src/service/messenger/testing_messenger_setup.c
 src/service/namecache/gnunet-service-namecache.c
@@ -495,6 +500,7 @@ src/service/vpn/gnunet-helper-vpn.c
 src/service/vpn/gnunet-service-vpn.c
 src/service/vpn/vpn_api.c
 src/service/zonemaster/gnunet-service-zonemaster.c
+src/util/gnunet_error_codes.c
 src/include/gnunet_json_lib.h
 src/include/gnunet_pq_lib.h
 src/lib/pq/pq.h
diff --git a/src/cli/messenger/Makefile.am b/src/cli/messenger/Makefile.am
index bb5e9c388..741e2b7b9 100644
--- a/src/cli/messenger/Makefile.am
+++ b/src/cli/messenger/Makefile.am
@@ -19,6 +19,7 @@ gnunet_messenger_SOURCES = \
  gnunet-messenger.c
 gnunet_messenger_LDADD = \
  $(top_builddir)/src/service/messenger/libgnunetmessenger.la \
+ $(top_builddir)/src/service/identity/libgnunetidentity.la \
  $(top_builddir)/src/lib/util/libgnunetutil.la
 gnunet_messenger_LDFLAGS = \
   $(GN_LIBINTL)
diff --git a/src/cli/messenger/gnunet-messenger.c 
b/src/cli/messenger/gnunet-messenger.c
index 9444fa12d..6258ce712 100644
--- a/src/cli/messenger/gnunet-messenger.c
+++ b/src/cli/messenger/gnunet-messenger.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -29,6 +29,7 @@
 #include "gnunet_util_lib.h"
 #include "gnunet_messenger_service.h"
 
+const struct GNUNET_CONFIGURATION_Handle *config;
 struct GNUNET_MESSENGER_Handle *messenger;
 
 /**
@@ -51,10 +52,12 @@ on_message (void *cls,
 {
   const char *sender_name = GNUNET_MESSENGER_contact_get_name (sender);
 
-  if (!sender_name)
+  if (! sender_name)
     sender_name = "anonymous";
 
-  printf ("[%s] ", GNUNET_sh2s(&(message->header.sender_id)));
+  printf ("[%s ->", GNUNET_h2s (&(message->header.previous)));
+  printf (" %s]", GNUNET_h2s (hash));
+  printf ("[%s] ", GNUNET_sh2s (&(message->header.sender_id)));
 
   if (flags & GNUNET_MESSENGER_FLAG_PRIVATE)
     printf ("*");
@@ -68,7 +71,8 @@ on_message (void *cls,
     }
   case GNUNET_MESSENGER_KIND_NAME:
     {
-      printf ("* '%s' gets renamed to '%s'\n", sender_name, 
message->body.name.name);
+      printf ("* '%s' gets renamed to '%s'\n", sender_name,
+              message->body.name.name);
       break;
     }
   case GNUNET_MESSENGER_KIND_LEAVE:
@@ -78,7 +82,8 @@ on_message (void *cls,
     }
   case GNUNET_MESSENGER_KIND_PEER:
     {
-      printf ("* '%s' opened the room on: %s\n", sender_name, GNUNET_i2s_full 
(&(message->body.peer.peer)));
+      printf ("* '%s' opened the room on: %s\n", sender_name,
+              GNUNET_i2s_full (&(message->body.peer.peer)));
       break;
     }
   case GNUNET_MESSENGER_KIND_TEXT:
@@ -93,13 +98,33 @@ on_message (void *cls,
     }
   default:
     {
-      printf ("~ message: %s\n", 
GNUNET_MESSENGER_name_of_kind(message->header.kind));
+      printf ("~ message: %s\n",
+              GNUNET_MESSENGER_name_of_kind (message->header.kind));
       break;
     }
   }
+
+  if ((GNUNET_MESSENGER_KIND_JOIN == message->header.kind) &&
+      (flags & GNUNET_MESSENGER_FLAG_SENT))
+  {
+    const char *name = GNUNET_MESSENGER_get_name (messenger);
+
+    if (! name)
+      return;
+
+    struct GNUNET_MESSENGER_Message response;
+    response.header.kind = GNUNET_MESSENGER_KIND_NAME;
+    response.body.name.name = GNUNET_strdup (name);
+
+    GNUNET_MESSENGER_send_message (room, &response, NULL);
+
+    GNUNET_free (response.body.name.name);
+  }
 }
 
+
 struct GNUNET_SCHEDULER_Task *read_task;
+struct GNUNET_IDENTITY_EgoLookup *ego_lookup;
 
 /**
  * Task to shut down this application.
@@ -119,8 +144,12 @@ shutdown_hook (void *cls)
 
   if (messenger)
     GNUNET_MESSENGER_disconnect (messenger);
+
+  if (ego_lookup)
+    GNUNET_IDENTITY_ego_lookup_cancel (ego_lookup);
 }
 
+
 static void
 listen_stdio (void *cls);
 
@@ -133,12 +162,13 @@ iterate_send_private_message (void *cls,
 {
   struct GNUNET_MESSENGER_Message *message = cls;
 
-  if (GNUNET_MESSENGER_contact_get_key(contact))
+  if (GNUNET_MESSENGER_contact_get_key (contact))
     GNUNET_MESSENGER_send_message (room, message, contact);
 
   return GNUNET_YES;
 }
 
+
 int private_mode;
 
 /**
@@ -174,13 +204,15 @@ read_stdio (void *cls)
   message.body.text.text = buffer;
 
   if (GNUNET_YES == private_mode)
-    GNUNET_MESSENGER_iterate_members(room, iterate_send_private_message, 
&message);
+    GNUNET_MESSENGER_iterate_members (room, iterate_send_private_message,
+                                      &message);
   else
     GNUNET_MESSENGER_send_message (room, &message, NULL);
 
   read_task = GNUNET_SCHEDULER_add_now (listen_stdio, cls);
 }
 
+
 /**
  * Wait for input on STDIO and send it out over the #ch.
  *
@@ -202,6 +234,7 @@ listen_stdio (void *cls)
   GNUNET_NETWORK_fdset_destroy (rs);
 }
 
+
 /**
  * Initial task to startup application.
  *
@@ -217,6 +250,7 @@ idle (void *cls)
   read_task = GNUNET_SCHEDULER_add_now (listen_stdio, room);
 }
 
+
 char *door_id;
 char *ego_name;
 char *room_key;
@@ -243,12 +277,16 @@ on_identity (void *cls,
   struct GNUNET_PeerIdentity *door = NULL;
 
   if ((door_id) &&
-      (GNUNET_OK == GNUNET_CRYPTO_eddsa_public_key_from_string (door_id, 
strlen (door_id), &(door_peer.public_key))))
+      (GNUNET_OK == GNUNET_CRYPTO_eddsa_public_key_from_string (door_id,
+                                                                strlen (
+                                                                  door_id),
+                                                                &(door_peer.
+                                                                  
public_key))))
     door = &door_peer;
 
   const char *name = GNUNET_MESSENGER_get_name (handle);
 
-  if (!name)
+  if (! name)
     name = "anonymous";
 
   printf ("* Welcome to the messenger, '%s'!\n", name);
@@ -272,22 +310,34 @@ on_identity (void *cls,
 
   shutdown_task = GNUNET_SCHEDULER_add_shutdown (shutdown_hook, room);
 
-  if (!room)
+  if (! room)
     GNUNET_SCHEDULER_shutdown ();
   else
   {
-    struct GNUNET_MESSENGER_Message message;
-    message.header.kind = GNUNET_MESSENGER_KIND_NAME;
-    message.body.name.name = GNUNET_strdup(name);
+    GNUNET_SCHEDULER_add_delayed_with_priority (
+      GNUNET_TIME_relative_get_zero_ (),
+      GNUNET_SCHEDULER_PRIORITY_IDLE,
+      idle, room);
+  }
+}
 
-    GNUNET_MESSENGER_send_message (room, &message, NULL);
-    GNUNET_free(message.body.name.name);
 
-    GNUNET_SCHEDULER_add_delayed_with_priority (GNUNET_TIME_relative_get_zero_ 
(), GNUNET_SCHEDULER_PRIORITY_IDLE, idle,
-                                                room);
-  }
+static void
+on_ego_lookup (void *cls,
+               struct GNUNET_IDENTITY_Ego *ego)
+{
+  ego_lookup = NULL;
+
+  const struct GNUNET_CRYPTO_PrivateKey *key;
+  key = ego ? GNUNET_IDENTITY_ego_get_private_key (ego) : NULL;
+
+  messenger = GNUNET_MESSENGER_connect (config, ego_name, key, &on_message,
+                                        NULL);
+
+  on_identity (NULL, messenger);
 }
 
+
 /**
  * Main function that will be run by the scheduler.
  *
@@ -298,15 +348,31 @@ on_identity (void *cls,
  */
 static void
 run (void *cls,
-     char *const*args,
+     char *const *args,
      const char *cfgfile,
      const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
-  messenger = GNUNET_MESSENGER_connect (cfg, ego_name, &on_identity, NULL, 
&on_message, NULL);
+  config = cfg;
+
+  if (ego_name)
+  {
+    ego_lookup = GNUNET_IDENTITY_ego_lookup (cfg, ego_name, &on_ego_lookup,
+                                             NULL);
+    messenger = NULL;
+  }
+  else
+  {
+    ego_lookup = NULL;
+    messenger = GNUNET_MESSENGER_connect (cfg, NULL, NULL, &on_message, NULL);
+  }
 
   shutdown_task = GNUNET_SCHEDULER_add_shutdown (shutdown_hook, NULL);
+
+  if (messenger)
+    on_identity (NULL, messenger);
 }
 
+
 /**
  * The main function to obtain messenger information.
  *
@@ -318,17 +384,26 @@ int
 main (int argc,
       char **argv)
 {
-  const char *description = "Open and connect to rooms using the MESSENGER to 
chat.";
-
-  struct GNUNET_GETOPT_CommandLineOption options[] =
-  {
-    GNUNET_GETOPT_option_string ('d', "door", "PEERIDENTITY", "peer identity 
to entry into the room", &door_id),
-    GNUNET_GETOPT_option_string ('e', "ego", "IDENTITY", "identity to use for 
messaging", &ego_name),
-    GNUNET_GETOPT_option_string ('r', "room", "ROOMKEY", "key of the room to 
connect to", &room_key),
-    GNUNET_GETOPT_option_flag ('p', "private", "flag to enable private mode", 
&private_mode),
+  const char *description =
+    "Open and connect to rooms using the MESSENGER to chat.";
+
+  struct GNUNET_GETOPT_CommandLineOption options[] = {
+    GNUNET_GETOPT_option_string ('d', "door", "PEERIDENTITY",
+                                 "peer identity to entry into the room",
+                                 &door_id),
+    GNUNET_GETOPT_option_string ('e', "ego", "IDENTITY",
+                                 "identity to use for messaging",
+                                 &ego_name),
+    GNUNET_GETOPT_option_string ('r', "room", "ROOMKEY",
+                                 "key of the room to connect to",
+                                 &room_key),
+    GNUNET_GETOPT_option_flag ('p', "private", "flag to enable private mode",
+                               &private_mode),
     GNUNET_GETOPT_OPTION_END
   };
 
-  return (GNUNET_OK == GNUNET_PROGRAM_run (argc, argv, "gnunet-messenger\0", 
gettext_noop(description), options, &run,
-  NULL) ? EXIT_SUCCESS : EXIT_FAILURE);
+  return (GNUNET_OK == GNUNET_PROGRAM_run (argc, argv, "gnunet-messenger\0",
+                                           gettext_noop (description), options,
+                                           &run,
+                                           NULL) ? EXIT_SUCCESS : 
EXIT_FAILURE);
 }
diff --git a/src/cli/messenger/meson.build b/src/cli/messenger/meson.build
index 69bc6af75..3a3870c9d 100644
--- a/src/cli/messenger/meson.build
+++ b/src/cli/messenger/meson.build
@@ -1,6 +1,7 @@
 executable ('gnunet-messenger',
             'gnunet-messenger.c',
             dependencies: [libgnunetmessenger_dep,
+                           libgnunetidentity_dep,
                            libgnunetutil_dep],
             include_directories: [incdir, configuration_inc],
             install: true,
diff --git a/src/include/gnunet_crypto_lib.h b/src/include/gnunet_crypto_lib.h
index 6e9649410..f508d02f6 100644
--- a/src/include/gnunet_crypto_lib.h
+++ b/src/include/gnunet_crypto_lib.h
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     Copyright (C) 2001-2013 GNUnet e.V.
+     Copyright (C) 2001-2023 GNUnet e.V.
 
      GNUnet is free software: you can redistribute it and/or modify it
      under the terms of the GNU Affero General Public License as published
@@ -1759,6 +1759,43 @@ GNUNET_CRYPTO_get_peer_identity (const struct 
GNUNET_CONFIGURATION_Handle *cfg,
                                  struct GNUNET_PeerIdentity *dst);
 
 
+/**
+ * @ingroup crypto
+ * Sign a given block with a specific purpose using the host's peer identity.
+ *
+ * @param cfg configuration to use
+ * @param purpose what to sign (size, purpose)
+ * @param sig where to write the signature
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR if the identity
+ *         could not be retrieved
+ */
+enum GNUNET_GenericReturnValue
+GNUNET_CRYPTO_sign_by_peer_identity (const struct
+                                     GNUNET_CONFIGURATION_Handle *cfg,
+                                     const struct
+                                     GNUNET_CRYPTO_EccSignaturePurpose 
*purpose,
+                                     struct GNUNET_CRYPTO_EddsaSignature *sig);
+
+
+/**
+ * @ingroup crypto
+ * Verify a given signature with a peer's identity.
+ *
+ * @param purpose what is the purpose that the signature should have?
+ * @param validate block to validate (size, purpose, data)
+ * @param sig signature that is being validated
+ * @param identity the peer's identity to verify
+ * @return #GNUNET_OK if ok, #GNUNET_SYSERR if invalid
+ */
+enum GNUNET_GenericReturnValue
+GNUNET_CRYPTO_verify_peer_identity (uint32_t purpose,
+                                    const struct
+                                    GNUNET_CRYPTO_EccSignaturePurpose 
*validate,
+                                    const struct
+                                    GNUNET_CRYPTO_EddsaSignature *sig,
+                                    const struct GNUNET_PeerIdentity 
*identity);
+
+
 /**
  * Internal structure used to cache pre-calculated values for DLOG calculation.
  */
diff --git a/src/include/gnunet_identity_service.h 
b/src/include/gnunet_identity_service.h
index 4743dbf7e..270f4d26f 100644
--- a/src/include/gnunet_identity_service.h
+++ b/src/include/gnunet_identity_service.h
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     Copyright (C) 2013 GNUnet e.V.
+     Copyright (C) 2013--2023 GNUnet e.V.
 
      GNUnet is free software: you can redistribute it and/or modify it
      under the terms of the GNU Affero General Public License as published
@@ -109,6 +109,16 @@ GNUNET_IDENTITY_ego_get_public_key (struct 
GNUNET_IDENTITY_Ego *ego,
                                     struct GNUNET_CRYPTO_PublicKey *pk);
 
 
+/**
+ * Obtain the name associated with an ego.
+ *
+ * @param ego the ego
+ * @return associated name, valid as long as the ego is valid
+ */
+const char*
+GNUNET_IDENTITY_ego_get_name (const struct GNUNET_IDENTITY_Ego *ego);
+
+
 /**
  * Method called to inform about the egos of this peer.
  *
diff --git a/src/include/gnunet_messenger_service.h 
b/src/include/gnunet_messenger_service.h
index 90004826a..0388b7fb2 100644
--- a/src/include/gnunet_messenger_service.h
+++ b/src/include/gnunet_messenger_service.h
@@ -42,7 +42,6 @@ extern "C" {
 #include "gnunet_common.h"
 #include "gnunet_configuration_lib.h"
 #include "gnunet_identity_service.h"
-#include "gnunet_protocols.h"
 #include "gnunet_scheduler_lib.h"
 #include "gnunet_time_lib.h"
 #include "gnunet_util_lib.h"
@@ -50,9 +49,9 @@ extern "C" {
 /**
  * Version number of GNUnet Messenger API.
  *
- * Current version of the Messenger: 0.2
+ * Current version of the Messenger: 0.3
  */
-#define GNUNET_MESSENGER_VERSION 0x00000002
+#define GNUNET_MESSENGER_VERSION 0x00000003
 
 /**
  * Identifier of GNUnet MESSENGER Service.
@@ -95,7 +94,7 @@ struct GNUNET_MESSENGER_RoomEntryRecord
 
 GNUNET_NETWORK_STRUCT_END
 
-GNUNET_NETWORK_STRUCT_BEGIN
+  GNUNET_NETWORK_STRUCT_BEGIN
 
 /**
  * A room details record specifies a custom name for a given room and
@@ -106,7 +105,7 @@ struct GNUNET_MESSENGER_RoomDetailsRecord
   /**
    * The custom name for the room.
    */
-  char name [256];
+  char name[256];
 
   /**
    * The flags of the room.
@@ -255,11 +254,6 @@ struct GNUNET_MESSENGER_MessageHeader
  */
 struct GNUNET_MESSENGER_MessageInfo
 {
-  /**
-   * The senders key to verify its signatures.
-   */
-  struct GNUNET_CRYPTO_PublicKey host_key;
-
   /**
    * The version of GNUnet Messenger API.
    *
@@ -462,6 +456,10 @@ struct GNUNET_MESSENGER_MessageFile
  */
 struct GNUNET_MESSENGER_MessagePrivate
 {
+  /**
+   * The ECDH key to decrypt the message.
+   */
+  struct GNUNET_CRYPTO_EcdhePublicKey key;
 
   /**
    * The length of the encrypted message.
@@ -554,18 +552,12 @@ enum GNUNET_MESSENGER_MessageFlags
    * The private flag. The flag indicates that the message was privately 
encrypted.
    */
   GNUNET_MESSENGER_FLAG_PRIVATE = 2,
-};
 
-/**
- * Method called whenever the EGO of a <i>handle</i> changes or if the first 
connection fails
- * to load a valid EGO and the anonymous key pair will be used instead.
- *
- * @param[in/out] cls Closure from #GNUNET_MESSENGER_connect
- * @param[in/out] handle Messenger handle
- */
-typedef void
-(*GNUNET_MESSENGER_IdentityCallback) (void *cls,
-                                      struct GNUNET_MESSENGER_Handle *handle);
+  /**
+   * The peer flag. The flag indicates that the message was sent by a peer and 
not a member.
+   */
+  GNUNET_MESSENGER_FLAG_PEER = 4,
+};
 
 /**
  * Method called whenever a message is sent or received from a <i>room</i>.
@@ -583,8 +575,10 @@ typedef void
 typedef void
 (*GNUNET_MESSENGER_MessageCallback) (void *cls,
                                      struct GNUNET_MESSENGER_Room *room,
-                                     const struct GNUNET_MESSENGER_Contact 
*sender,
-                                     const struct GNUNET_MESSENGER_Message 
*message,
+                                     const struct
+                                     GNUNET_MESSENGER_Contact *sender,
+                                     const struct
+                                     GNUNET_MESSENGER_Message *message,
                                      const struct GNUNET_HashCode *hash,
                                      enum GNUNET_MESSENGER_MessageFlags flags);
 
@@ -597,18 +591,18 @@ typedef void
  * @param[in] contact Contact handle
  */
 typedef int
-(*GNUNET_MESSENGER_MemberCallback) (void* cls,
+(*GNUNET_MESSENGER_MemberCallback) (void *cls,
                                     struct GNUNET_MESSENGER_Room *room,
-                                    const struct GNUNET_MESSENGER_Contact 
*contact);
+                                    const struct
+                                    GNUNET_MESSENGER_Contact *contact);
 
 /**
- * Set up a handle for the messenger related functions and connects to all 
necessary services. It will look up the ego
- * key identified by its <i>name</i> and use it for signing all messages from 
the handle.
+ * Set up a handle for the messenger related functions and connects to all 
necessary services. It will use the
+ * a custom name in combination of a private key provided for signing all 
messages from the handle.
  *
  * @param[in] cfg Configuration to use
- * @param[in] name Name to look up an ego or NULL to stay anonymous
- * @param[in] identity_callback Function called when the EGO of the handle 
changes
- * @param[in,out] identity_cls Closure for the <i>identity_callback</i> handler
+ * @param[in] name Name or NULL
+ * @param[in] key Private key or NULL to stay anonymous
  * @param[in] msg_callback Function called when a new message is sent or 
received
  * @param[in,out] msg_cls Closure for the <i>msg_callback</i> handler
  * @return Messenger handle to use, NULL on error
@@ -616,25 +610,10 @@ typedef int
 struct GNUNET_MESSENGER_Handle*
 GNUNET_MESSENGER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
                           const char *name,
-                          GNUNET_MESSENGER_IdentityCallback identity_callback,
-                          void *identity_cls,
+                          const struct GNUNET_CRYPTO_PrivateKey *key,
                           GNUNET_MESSENGER_MessageCallback msg_callback,
                           void *msg_cls);
 
-/**
- * Update a handle of the messenger to use a different ego key and replace the 
old one with a newly generated one. All
- * participated rooms get informed about the key renewal. The handle requires 
a set name for this function to work and
- * it needs to be unused by other egos.
- *
- * Keep in mind that this will fully delete the old ego key (if any is used) 
even if any other service wants to use it
- * as default.
- *
- * @param[in,out] handle Messenger handle to use
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-int
-GNUNET_MESSENGER_update (struct GNUNET_MESSENGER_Handle *handle);
-
 /**
  * Disconnect all of the messengers used services and clears up its used 
memory.
  *
@@ -653,9 +632,8 @@ const char*
 GNUNET_MESSENGER_get_name (const struct GNUNET_MESSENGER_Handle *handle);
 
 /**
- * Set the name for the messenger. This will rename the currently used ego and 
move all stored files related to the current
- * name to its new directory. If anything fails during this process the 
function returns #GNUNET_NO and the name for
- * the messenger won't change as specified.
+ * Set the name for the messenger handle and sends messages renaming your 
contact in currently
+ * open rooms.
  *
  * @param[in,out] handle Messenger handle to use
  * @param[in] name Name for the messenger to change to
@@ -669,11 +647,24 @@ GNUNET_MESSENGER_set_name (struct GNUNET_MESSENGER_Handle 
*handle,
  * Get the public key used by the messenger or NULL if the anonymous key was 
used.
  *
  * @param[in] handle Messenger handle to use
- * @return Used ego's public key or NULL
+ * @return Used public key or NULL
  */
 const struct GNUNET_CRYPTO_PublicKey*
 GNUNET_MESSENGER_get_key (const struct GNUNET_MESSENGER_Handle *handle);
 
+/**
+ * Set the private key used by the messenger or NULL if the anonymous key 
should be
+ * used instead. The currently used key will be replaced and the change will 
get signed
+ * accordingly to be verified by all contacts.
+ *
+ * @param[in,out] handle Messenger handle to use
+ * @param[in] key Private key to change to or NULL
+ * @return #GNUNET_YES on success, #GNUNET_NO on failure and #GNUNET_SYSERR if 
<i>handle</i> is NULL
+ */
+int
+GNUNET_MESSENGER_set_key (struct GNUNET_MESSENGER_Handle *handle,
+                          const struct GNUNET_CRYPTO_PrivateKey *key);
+
 /**
  * Open a room to send and receive messages. The room will use the specified 
<i>key</i> as port for the underlying cadet
  * service. Opening a room results in opening the port for incoming 
connections as possible <b>door</b>.
@@ -775,13 +766,14 @@ GNUNET_MESSENGER_get_sender (const struct 
GNUNET_MESSENGER_Room *room,
  * @return Name of <i>contact</i> or NULL
  */
 const char*
-GNUNET_MESSENGER_contact_get_name (const struct GNUNET_MESSENGER_Contact 
*contact);
+GNUNET_MESSENGER_contact_get_name (const struct
+                                   GNUNET_MESSENGER_Contact *contact);
 
 /**
  * Get the public key used by the <i>contact</i> or NULL if the anonymous key 
was used.
  *
  * @param[in] contact Contact handle
- * @return Public key of the ego used by <i>contact</i> or NULL
+ * @return Public key used by <i>contact</i> or NULL
  */
 const struct GNUNET_CRYPTO_PublicKey*
 GNUNET_MESSENGER_contact_get_key (const struct GNUNET_MESSENGER_Contact 
*contact);
@@ -801,13 +793,13 @@ GNUNET_MESSENGER_contact_get_key (const struct 
GNUNET_MESSENGER_Contact *contact
  * Sending a message to all members in a given room can be done by providing 
NULL as contact.
  *
  * @param[in,out] room Room handle
- * @param[in] message New message to send
+ * @param[in,out] message New message to send
  * @param[in] contact Contact or NULL
  */
 void
 GNUNET_MESSENGER_send_message (struct GNUNET_MESSENGER_Room *room,
-                               const struct GNUNET_MESSENGER_Message *message,
-                               const struct GNUNET_MESSENGER_Contact* contact);
+                               struct GNUNET_MESSENGER_Message *message,
+                               const struct GNUNET_MESSENGER_Contact *contact);
 
 /**
  * Get the message in a <i>room</i> identified by its <i>hash</i>.
@@ -833,7 +825,7 @@ GNUNET_MESSENGER_get_message (const struct 
GNUNET_MESSENGER_Room *room,
 int
 GNUNET_MESSENGER_iterate_members (struct GNUNET_MESSENGER_Room *room,
                                   GNUNET_MESSENGER_MemberCallback callback,
-                                  void* cls);
+                                  void *cls);
 
 #if 0 /* keep Emacsens' auto-indent happy */
 {
diff --git a/src/lib/util/crypto_ecc_setup.c b/src/lib/util/crypto_ecc_setup.c
index e07d1e448..2ee9ed931 100644
--- a/src/lib/util/crypto_ecc_setup.c
+++ b/src/lib/util/crypto_ecc_setup.c
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     Copyright (C) 2012, 2013, 2015, 2020 GNUnet e.V.
+     Copyright (C) 2012, 2013, 2015, 2020, 2023 GNUnet e.V.
 
      GNUnet is free software: you can redistribute it and/or modify it
      under the terms of the GNU Affero General Public License as published
@@ -289,6 +289,39 @@ GNUNET_CRYPTO_get_peer_identity (const struct 
GNUNET_CONFIGURATION_Handle *cfg,
 }
 
 
+enum GNUNET_GenericReturnValue
+GNUNET_CRYPTO_sign_by_peer_identity (const struct
+                                     GNUNET_CONFIGURATION_Handle *cfg,
+                                     const struct
+                                     GNUNET_CRYPTO_EccSignaturePurpose 
*purpose,
+                                     struct GNUNET_CRYPTO_EddsaSignature *sig)
+{
+  struct GNUNET_CRYPTO_EddsaPrivateKey *priv;
+
+  if (NULL == (priv = GNUNET_CRYPTO_eddsa_key_create_from_configuration (cfg)))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                _ ("Could not load peer's private key\n"));
+    return GNUNET_SYSERR;
+  }
+
+  return GNUNET_CRYPTO_eddsa_sign_ (priv, purpose, sig);
+}
+
+
+enum GNUNET_GenericReturnValue
+GNUNET_CRYPTO_verify_peer_identity (uint32_t purpose,
+                                    const struct
+                                    GNUNET_CRYPTO_EccSignaturePurpose 
*validate,
+                                    const struct
+                                    GNUNET_CRYPTO_EddsaSignature *sig,
+                                    const struct GNUNET_PeerIdentity *identity)
+{
+  return GNUNET_CRYPTO_eddsa_verify_ (purpose, validate, sig,
+                                      &identity->public_key);
+}
+
+
 /**
  * Setup a key file for a peer given the name of the
  * configuration file (!).  This function is used so that
diff --git a/src/plugin/messenger/plugin_gnsrecord_messenger.c 
b/src/plugin/messenger/plugin_gnsrecord_messenger.c
index e09a0330d..ed675dd1d 100644
--- a/src/plugin/messenger/plugin_gnsrecord_messenger.c
+++ b/src/plugin/messenger/plugin_gnsrecord_messenger.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2021--2022 GNUnet e.V.
+   Copyright (C) 2021--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -59,8 +59,11 @@ messenger_value_to_string (void *cls,
 
       const struct GNUNET_MESSENGER_RoomEntryRecord *record = data;
 
-      char *door = GNUNET_CRYPTO_eddsa_public_key_to_string 
(&(record->door.public_key));
-      char *key = GNUNET_STRINGS_data_to_string_alloc (&(record->key), 
sizeof(struct GNUNET_HashCode));
+      char *door = GNUNET_CRYPTO_eddsa_public_key_to_string (
+        &(record->door.public_key));
+      char *key = GNUNET_STRINGS_data_to_string_alloc (&(record->key),
+                                                       sizeof(struct
+                                                              
GNUNET_HashCode));
 
       char *ret;
       GNUNET_asprintf (&ret, "%s-%s", key, door);
@@ -78,8 +81,9 @@ messenger_value_to_string (void *cls,
 
       const struct GNUNET_MESSENGER_RoomDetailsRecord *record = data;
 
-      char *name = GNUNET_strndup(record->name, 256);
-      char *flags = GNUNET_STRINGS_data_to_string_alloc (&(record->flags), 
sizeof(uint32_t));
+      char *name = GNUNET_strndup (record->name, 256);
+      char *flags = GNUNET_STRINGS_data_to_string_alloc (&(record->flags),
+                                                         sizeof(uint32_t));
 
       char *ret;
       GNUNET_asprintf (&ret, "%s-%s", flags, name);
@@ -122,15 +126,17 @@ messenger_string_to_value (void *cls,
   {
   case GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_ENTRY:
     {
-      char key [103];
+      char key[103];
       const char *dash;
       struct GNUNET_PeerIdentity door;
 
       if ((NULL == (dash = strchr (s, '-'))) ||
           (1 != sscanf (s, "%103s-", key)) ||
           (GNUNET_OK != GNUNET_CRYPTO_eddsa_public_key_from_string (dash + 1,
-                                                                    strlen 
(dash + 1),
-                                                                    
&(door.public_key))))
+                                                                    strlen (
+                                                                      dash + 
1),
+                                                                    &(door.
+                                                                      
public_key))))
       {
         GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                     _ ("Unable to parse MESSENGER_ROOM_ENTRY record `%s'\n"),
@@ -139,13 +145,14 @@ messenger_string_to_value (void *cls,
       }
 
       struct GNUNET_MESSENGER_RoomEntryRecord *record = GNUNET_new (
-          struct GNUNET_MESSENGER_RoomEntryRecord
-      );
+        struct GNUNET_MESSENGER_RoomEntryRecord
+        );
 
       if (GNUNET_OK != GNUNET_STRINGS_string_to_data (key,
                                                       strlen (key),
                                                       &(record->key),
-                                                      sizeof(struct 
GNUNET_HashCode)))
+                                                      sizeof(struct
+                                                             GNUNET_HashCode)))
       {
         GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                     _ ("Unable to parse MESSENGER_ROOM_ENTRY record `%s'\n"),
@@ -161,7 +168,7 @@ messenger_string_to_value (void *cls,
     }
   case GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_DETAILS:
     {
-      char flags [7];
+      char flags[7];
       const char *dash;
 
       if ((NULL == (dash = strchr (s, '-'))) ||
@@ -175,8 +182,8 @@ messenger_string_to_value (void *cls,
       }
 
       struct GNUNET_MESSENGER_RoomDetailsRecord *record = GNUNET_new (
-          struct GNUNET_MESSENGER_RoomDetailsRecord
-      );
+        struct GNUNET_MESSENGER_RoomDetailsRecord
+        );
 
       if (GNUNET_OK != GNUNET_STRINGS_string_to_data (flags,
                                                       strlen (flags),
@@ -190,7 +197,7 @@ messenger_string_to_value (void *cls,
         return GNUNET_SYSERR;
       }
 
-      GNUNET_memcpy(record->name, dash + 1, strlen(dash + 1));
+      GNUNET_memcpy (record->name, dash + 1, strlen (dash + 1));
 
       *data = record;
       *data_size = sizeof(struct GNUNET_MESSENGER_RoomDetailsRecord);
diff --git a/src/service/messenger/Makefile.am 
b/src/service/messenger/Makefile.am
index c2ae65a08..f169d8773 100644
--- a/src/service/messenger/Makefile.am
+++ b/src/service/messenger/Makefile.am
@@ -27,11 +27,13 @@ lib_LTLIBRARIES = \
 
 libgnunetmessenger_la_SOURCES = \
   messenger_api.c \
-  messenger_api_ego.h \
   messenger_api_contact.c messenger_api_contact.h \
   messenger_api_contact_store.c messenger_api_contact_store.h \
+  messenger_api_peer_store.c messenger_api_peer_store.h \
   messenger_api_message.c messenger_api_message.h \
+  messenger_api_message_kind.c messenger_api_message_kind.h \
   messenger_api_list_tunnels.c messenger_api_list_tunnels.h \
+  messenger_api_queue_messages.c messenger_api_queue_messages.h \
   messenger_api_util.c messenger_api_util.h \
   messenger_api_handle.c messenger_api_handle.h \
   messenger_api_room.c messenger_api_room.h
@@ -51,6 +53,7 @@ gnunet_service_messenger_SOURCES = \
   gnunet-service-messenger_list_handles.c 
gnunet-service-messenger_list_handles.h \
   gnunet-service-messenger_list_messages.c 
gnunet-service-messenger_list_messages.h \
   gnunet-service-messenger_member_session.c 
gnunet-service-messenger_member_session.h \
+  gnunet-service-messenger_sender_session.h \
   gnunet-service-messenger_member.c gnunet-service-messenger_member.h \
   gnunet-service-messenger_member_store.c 
gnunet-service-messenger_member_store.h \
   gnunet-service-messenger_message_handle.c 
gnunet-service-messenger_message_handle.h \
@@ -62,7 +65,6 @@ gnunet_service_messenger_SOURCES = \
   gnunet-service-messenger_operation_store.c 
gnunet-service-messenger_operation_store.h \
   gnunet-service-messenger_operation.c gnunet-service-messenger_operation.h \
   gnunet-service-messenger_basement.c gnunet-service-messenger_basement.h \
-  gnunet-service-messenger_ego_store.c gnunet-service-messenger_ego_store.h \
   gnunet-service-messenger_handle.c gnunet-service-messenger_handle.h \
   gnunet-service-messenger_room.c gnunet-service-messenger_room.h \
   gnunet-service-messenger_tunnel.c gnunet-service-messenger_tunnel.h
@@ -73,7 +75,9 @@ gnunet_service_messenger_LDADD = \
   $(top_builddir)/src/service/identity/libgnunetidentity.la \
   $(GN_LIBINTL)
 
-check_PROGRAMS = test_messenger_anonymous
+check_PROGRAMS = \
+  test_messenger_api \
+  test_messenger_anonymous
 
 if ENABLE_TEST_RUN
 AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export 
PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;unset XDG_DATA_HOME;unset 
XDG_CONFIG_HOME;
diff --git a/src/cli/messenger/gnunet-messenger.c 
b/src/service/messenger/gnunet-messenger.c
similarity index 66%
copy from src/cli/messenger/gnunet-messenger.c
copy to src/service/messenger/gnunet-messenger.c
index 9444fa12d..6258ce712 100644
--- a/src/cli/messenger/gnunet-messenger.c
+++ b/src/service/messenger/gnunet-messenger.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -29,6 +29,7 @@
 #include "gnunet_util_lib.h"
 #include "gnunet_messenger_service.h"
 
+const struct GNUNET_CONFIGURATION_Handle *config;
 struct GNUNET_MESSENGER_Handle *messenger;
 
 /**
@@ -51,10 +52,12 @@ on_message (void *cls,
 {
   const char *sender_name = GNUNET_MESSENGER_contact_get_name (sender);
 
-  if (!sender_name)
+  if (! sender_name)
     sender_name = "anonymous";
 
-  printf ("[%s] ", GNUNET_sh2s(&(message->header.sender_id)));
+  printf ("[%s ->", GNUNET_h2s (&(message->header.previous)));
+  printf (" %s]", GNUNET_h2s (hash));
+  printf ("[%s] ", GNUNET_sh2s (&(message->header.sender_id)));
 
   if (flags & GNUNET_MESSENGER_FLAG_PRIVATE)
     printf ("*");
@@ -68,7 +71,8 @@ on_message (void *cls,
     }
   case GNUNET_MESSENGER_KIND_NAME:
     {
-      printf ("* '%s' gets renamed to '%s'\n", sender_name, 
message->body.name.name);
+      printf ("* '%s' gets renamed to '%s'\n", sender_name,
+              message->body.name.name);
       break;
     }
   case GNUNET_MESSENGER_KIND_LEAVE:
@@ -78,7 +82,8 @@ on_message (void *cls,
     }
   case GNUNET_MESSENGER_KIND_PEER:
     {
-      printf ("* '%s' opened the room on: %s\n", sender_name, GNUNET_i2s_full 
(&(message->body.peer.peer)));
+      printf ("* '%s' opened the room on: %s\n", sender_name,
+              GNUNET_i2s_full (&(message->body.peer.peer)));
       break;
     }
   case GNUNET_MESSENGER_KIND_TEXT:
@@ -93,13 +98,33 @@ on_message (void *cls,
     }
   default:
     {
-      printf ("~ message: %s\n", 
GNUNET_MESSENGER_name_of_kind(message->header.kind));
+      printf ("~ message: %s\n",
+              GNUNET_MESSENGER_name_of_kind (message->header.kind));
       break;
     }
   }
+
+  if ((GNUNET_MESSENGER_KIND_JOIN == message->header.kind) &&
+      (flags & GNUNET_MESSENGER_FLAG_SENT))
+  {
+    const char *name = GNUNET_MESSENGER_get_name (messenger);
+
+    if (! name)
+      return;
+
+    struct GNUNET_MESSENGER_Message response;
+    response.header.kind = GNUNET_MESSENGER_KIND_NAME;
+    response.body.name.name = GNUNET_strdup (name);
+
+    GNUNET_MESSENGER_send_message (room, &response, NULL);
+
+    GNUNET_free (response.body.name.name);
+  }
 }
 
+
 struct GNUNET_SCHEDULER_Task *read_task;
+struct GNUNET_IDENTITY_EgoLookup *ego_lookup;
 
 /**
  * Task to shut down this application.
@@ -119,8 +144,12 @@ shutdown_hook (void *cls)
 
   if (messenger)
     GNUNET_MESSENGER_disconnect (messenger);
+
+  if (ego_lookup)
+    GNUNET_IDENTITY_ego_lookup_cancel (ego_lookup);
 }
 
+
 static void
 listen_stdio (void *cls);
 
@@ -133,12 +162,13 @@ iterate_send_private_message (void *cls,
 {
   struct GNUNET_MESSENGER_Message *message = cls;
 
-  if (GNUNET_MESSENGER_contact_get_key(contact))
+  if (GNUNET_MESSENGER_contact_get_key (contact))
     GNUNET_MESSENGER_send_message (room, message, contact);
 
   return GNUNET_YES;
 }
 
+
 int private_mode;
 
 /**
@@ -174,13 +204,15 @@ read_stdio (void *cls)
   message.body.text.text = buffer;
 
   if (GNUNET_YES == private_mode)
-    GNUNET_MESSENGER_iterate_members(room, iterate_send_private_message, 
&message);
+    GNUNET_MESSENGER_iterate_members (room, iterate_send_private_message,
+                                      &message);
   else
     GNUNET_MESSENGER_send_message (room, &message, NULL);
 
   read_task = GNUNET_SCHEDULER_add_now (listen_stdio, cls);
 }
 
+
 /**
  * Wait for input on STDIO and send it out over the #ch.
  *
@@ -202,6 +234,7 @@ listen_stdio (void *cls)
   GNUNET_NETWORK_fdset_destroy (rs);
 }
 
+
 /**
  * Initial task to startup application.
  *
@@ -217,6 +250,7 @@ idle (void *cls)
   read_task = GNUNET_SCHEDULER_add_now (listen_stdio, room);
 }
 
+
 char *door_id;
 char *ego_name;
 char *room_key;
@@ -243,12 +277,16 @@ on_identity (void *cls,
   struct GNUNET_PeerIdentity *door = NULL;
 
   if ((door_id) &&
-      (GNUNET_OK == GNUNET_CRYPTO_eddsa_public_key_from_string (door_id, 
strlen (door_id), &(door_peer.public_key))))
+      (GNUNET_OK == GNUNET_CRYPTO_eddsa_public_key_from_string (door_id,
+                                                                strlen (
+                                                                  door_id),
+                                                                &(door_peer.
+                                                                  
public_key))))
     door = &door_peer;
 
   const char *name = GNUNET_MESSENGER_get_name (handle);
 
-  if (!name)
+  if (! name)
     name = "anonymous";
 
   printf ("* Welcome to the messenger, '%s'!\n", name);
@@ -272,22 +310,34 @@ on_identity (void *cls,
 
   shutdown_task = GNUNET_SCHEDULER_add_shutdown (shutdown_hook, room);
 
-  if (!room)
+  if (! room)
     GNUNET_SCHEDULER_shutdown ();
   else
   {
-    struct GNUNET_MESSENGER_Message message;
-    message.header.kind = GNUNET_MESSENGER_KIND_NAME;
-    message.body.name.name = GNUNET_strdup(name);
+    GNUNET_SCHEDULER_add_delayed_with_priority (
+      GNUNET_TIME_relative_get_zero_ (),
+      GNUNET_SCHEDULER_PRIORITY_IDLE,
+      idle, room);
+  }
+}
 
-    GNUNET_MESSENGER_send_message (room, &message, NULL);
-    GNUNET_free(message.body.name.name);
 
-    GNUNET_SCHEDULER_add_delayed_with_priority (GNUNET_TIME_relative_get_zero_ 
(), GNUNET_SCHEDULER_PRIORITY_IDLE, idle,
-                                                room);
-  }
+static void
+on_ego_lookup (void *cls,
+               struct GNUNET_IDENTITY_Ego *ego)
+{
+  ego_lookup = NULL;
+
+  const struct GNUNET_CRYPTO_PrivateKey *key;
+  key = ego ? GNUNET_IDENTITY_ego_get_private_key (ego) : NULL;
+
+  messenger = GNUNET_MESSENGER_connect (config, ego_name, key, &on_message,
+                                        NULL);
+
+  on_identity (NULL, messenger);
 }
 
+
 /**
  * Main function that will be run by the scheduler.
  *
@@ -298,15 +348,31 @@ on_identity (void *cls,
  */
 static void
 run (void *cls,
-     char *const*args,
+     char *const *args,
      const char *cfgfile,
      const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
-  messenger = GNUNET_MESSENGER_connect (cfg, ego_name, &on_identity, NULL, 
&on_message, NULL);
+  config = cfg;
+
+  if (ego_name)
+  {
+    ego_lookup = GNUNET_IDENTITY_ego_lookup (cfg, ego_name, &on_ego_lookup,
+                                             NULL);
+    messenger = NULL;
+  }
+  else
+  {
+    ego_lookup = NULL;
+    messenger = GNUNET_MESSENGER_connect (cfg, NULL, NULL, &on_message, NULL);
+  }
 
   shutdown_task = GNUNET_SCHEDULER_add_shutdown (shutdown_hook, NULL);
+
+  if (messenger)
+    on_identity (NULL, messenger);
 }
 
+
 /**
  * The main function to obtain messenger information.
  *
@@ -318,17 +384,26 @@ int
 main (int argc,
       char **argv)
 {
-  const char *description = "Open and connect to rooms using the MESSENGER to 
chat.";
-
-  struct GNUNET_GETOPT_CommandLineOption options[] =
-  {
-    GNUNET_GETOPT_option_string ('d', "door", "PEERIDENTITY", "peer identity 
to entry into the room", &door_id),
-    GNUNET_GETOPT_option_string ('e', "ego", "IDENTITY", "identity to use for 
messaging", &ego_name),
-    GNUNET_GETOPT_option_string ('r', "room", "ROOMKEY", "key of the room to 
connect to", &room_key),
-    GNUNET_GETOPT_option_flag ('p', "private", "flag to enable private mode", 
&private_mode),
+  const char *description =
+    "Open and connect to rooms using the MESSENGER to chat.";
+
+  struct GNUNET_GETOPT_CommandLineOption options[] = {
+    GNUNET_GETOPT_option_string ('d', "door", "PEERIDENTITY",
+                                 "peer identity to entry into the room",
+                                 &door_id),
+    GNUNET_GETOPT_option_string ('e', "ego", "IDENTITY",
+                                 "identity to use for messaging",
+                                 &ego_name),
+    GNUNET_GETOPT_option_string ('r', "room", "ROOMKEY",
+                                 "key of the room to connect to",
+                                 &room_key),
+    GNUNET_GETOPT_option_flag ('p', "private", "flag to enable private mode",
+                               &private_mode),
     GNUNET_GETOPT_OPTION_END
   };
 
-  return (GNUNET_OK == GNUNET_PROGRAM_run (argc, argv, "gnunet-messenger\0", 
gettext_noop(description), options, &run,
-  NULL) ? EXIT_SUCCESS : EXIT_FAILURE);
+  return (GNUNET_OK == GNUNET_PROGRAM_run (argc, argv, "gnunet-messenger\0",
+                                           gettext_noop (description), options,
+                                           &run,
+                                           NULL) ? EXIT_SUCCESS : 
EXIT_FAILURE);
 }
diff --git a/src/service/messenger/gnunet-service-messenger.c 
b/src/service/messenger/gnunet-service-messenger.c
index fedaa2f60..a6bc41c78 100644
--- a/src/service/messenger/gnunet-service-messenger.c
+++ b/src/service/messenger/gnunet-service-messenger.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -27,9 +27,9 @@
 #include "gnunet-service-messenger.h"
 
 #include "gnunet-service-messenger_handle.h"
-#include "gnunet-service-messenger_message_kind.h"
 #include "gnunet-service-messenger_service.h"
 #include "messenger_api_message.h"
+#include "messenger_api_message_kind.h"
 
 struct GNUNET_MESSENGER_Client
 {
@@ -39,39 +39,17 @@ struct GNUNET_MESSENGER_Client
 
 struct GNUNET_MESSENGER_Service *messenger;
 
-static int
-check_create (void *cls,
-              const struct GNUNET_MESSENGER_CreateMessage *msg)
-{
-  GNUNET_MQ_check_zero_termination (msg);
-  return GNUNET_OK;
-}
-
 static void
 handle_create (void *cls,
                const struct GNUNET_MESSENGER_CreateMessage *msg)
 {
   struct GNUNET_MESSENGER_Client *msg_client = cls;
 
-  const char *name = ((const char*) msg) + sizeof(*msg);
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Handle created with name: %s\n", name);
-
-  setup_srv_handle_name (msg_client->handle, strlen (name) > 0 ? name : NULL);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Handle created\n");
 
   GNUNET_SERVICE_client_continue (msg_client->client);
 }
 
-static void
-handle_update (void *cls,
-               const struct GNUNET_MESSENGER_UpdateMessage *msg)
-{
-  struct GNUNET_MESSENGER_Client *msg_client = cls;
-
-  update_srv_handle (msg_client->handle);
-
-  GNUNET_SERVICE_client_continue (msg_client->client);
-}
 
 static void
 handle_destroy (void *cls,
@@ -79,38 +57,83 @@ handle_destroy (void *cls,
 {
   struct GNUNET_MESSENGER_Client *msg_client = cls;
 
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Handle destroyed\n");
+
   GNUNET_SERVICE_client_drop (msg_client->client);
 }
 
+
 static int
-check_set_name (void *cls,
-                const struct GNUNET_MESSENGER_NameMessage *msg)
+check_room_initial_key (const struct GNUNET_MESSENGER_RoomMessage *msg)
 {
-  GNUNET_MQ_check_zero_termination (msg);
-  return GNUNET_OK;
+  const uint16_t full_length = ntohs (msg->header.size);
+
+  if (full_length < sizeof(*msg))
+    return GNUNET_NO;
+
+  const uint16_t msg_length = full_length - sizeof(*msg);
+  const char *msg_buffer = ((const char*) msg) + sizeof(*msg);
+
+  if (0 == msg_length)
+    return GNUNET_OK;
+
+  struct GNUNET_CRYPTO_PublicKey key;
+  size_t key_len;
+
+  if (GNUNET_OK != GNUNET_CRYPTO_read_public_key_from_buffer (msg_buffer,
+                                                              msg_length,
+                                                              &key, &key_len))
+    return GNUNET_NO;
+
+  return key_len == msg_length ? GNUNET_OK : GNUNET_NO;
 }
 
+
 static void
-handle_set_name (void *cls,
-                 const struct GNUNET_MESSENGER_NameMessage *msg)
+initialize_handle_via_key (struct GNUNET_MESSENGER_SrvHandle *handle,
+                           const struct GNUNET_MESSENGER_RoomMessage *msg)
 {
-  struct GNUNET_MESSENGER_Client *msg_client = cls;
+  GNUNET_assert (handle);
 
-  const char *name = ((const char*) msg) + sizeof(*msg);
+  const uint16_t full_length = ntohs (msg->header.size);
+  const uint16_t msg_length = full_length - sizeof(*msg);
+  const char *msg_buffer = ((const char*) msg) + sizeof(*msg);
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Handles name is now: %s\n", name);
+  if (msg_length > 0)
+  {
+    struct GNUNET_CRYPTO_PublicKey key;
+    size_t key_len;
+
+    if (GNUNET_OK == GNUNET_CRYPTO_read_public_key_from_buffer (msg_buffer,
+                                                                msg_length,
+                                                                &key,
+                                                                &key_len))
+      set_srv_handle_key (handle, &key);
+    else
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                  "Initialization failed while reading invalid key!\n");
+  }
+  else
+    GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Initialization is missing key!\n");
+}
 
-  set_srv_handle_name (msg_client->handle, name);
 
-  GNUNET_SERVICE_client_continue (msg_client->client);
+static int
+check_room_open (void *cls,
+                 const struct GNUNET_MESSENGER_RoomMessage *msg)
+{
+  return check_room_initial_key (msg);
 }
 
+
 static void
 handle_room_open (void *cls,
                   const struct GNUNET_MESSENGER_RoomMessage *msg)
 {
   struct GNUNET_MESSENGER_Client *msg_client = cls;
 
+  initialize_handle_via_key (msg_client->handle, msg);
+
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Opening room: %s\n", GNUNET_h2s (
                 &(msg->key)));
 
@@ -136,12 +159,23 @@ handle_room_open (void *cls,
   GNUNET_SERVICE_client_continue (msg_client->client);
 }
 
+
+static int
+check_room_entry (void *cls,
+                  const struct GNUNET_MESSENGER_RoomMessage *msg)
+{
+  return check_room_initial_key (msg);
+}
+
+
 static void
 handle_room_entry (void *cls,
                    const struct GNUNET_MESSENGER_RoomMessage *msg)
 {
   struct GNUNET_MESSENGER_Client *msg_client = cls;
 
+  initialize_handle_via_key (msg_client->handle, msg);
+
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Entering room: %s, %s\n", GNUNET_h2s (
                 &(msg->key)), GNUNET_i2s (&(msg->door)));
 
@@ -170,6 +204,7 @@ handle_room_entry (void *cls,
   GNUNET_SERVICE_client_continue (msg_client->client);
 }
 
+
 static void
 handle_room_close (void *cls,
                    const struct GNUNET_MESSENGER_RoomMessage *msg)
@@ -198,6 +233,7 @@ handle_room_close (void *cls,
   GNUNET_SERVICE_client_continue (msg_client->client);
 }
 
+
 static int
 check_send_message (void *cls,
                     const struct GNUNET_MESSENGER_SendMessage *msg)
@@ -207,98 +243,56 @@ check_send_message (void *cls,
   if (full_length < sizeof(*msg))
     return GNUNET_NO;
 
-  const enum GNUNET_MESSENGER_MessageFlags flags = (
-    (enum GNUNET_MESSENGER_MessageFlags) (msg->flags)
-    );
-
-  const uint16_t length = full_length - sizeof(*msg);
-  const char *buffer = ((const char*) msg) + sizeof(*msg);
-  struct GNUNET_CRYPTO_PublicKey public_key;
-
-
-  size_t key_length = 0;
-
-  if ((flags & GNUNET_MESSENGER_FLAG_PRIVATE))
-    if (GNUNET_SYSERR ==
-        GNUNET_CRYPTO_read_public_key_from_buffer (buffer, length,
-                                                     &public_key,
-                                                     &key_length))
-      return GNUNET_NO;
-
-  const uint16_t msg_length = length - key_length;
-  const char *msg_buffer = buffer + key_length;
+  const uint16_t msg_length = full_length - sizeof(*msg);
+  const char *msg_buffer = ((const char*) msg) + sizeof(*msg);
 
   struct GNUNET_MESSENGER_Message message;
 
-  if (length < get_message_kind_size (GNUNET_MESSENGER_KIND_UNKNOWN, 
GNUNET_NO))
+  if (msg_length < get_message_kind_size (GNUNET_MESSENGER_KIND_UNKNOWN,
+                                          GNUNET_YES))
     return GNUNET_NO;
 
-  if (GNUNET_YES != decode_message (&message, msg_length, msg_buffer, 
GNUNET_NO,
+  if (GNUNET_YES != decode_message (&message, msg_length, msg_buffer,
+                                    GNUNET_YES,
                                     NULL))
     return GNUNET_NO;
 
   const int allowed = filter_message_sending (&message);
 
   cleanup_message (&message);
-  return GNUNET_YES == allowed? GNUNET_OK : GNUNET_NO;
+  return GNUNET_SYSERR != allowed? GNUNET_OK : GNUNET_NO;
 }
 
+
 static void
 handle_send_message (void *cls,
                      const struct GNUNET_MESSENGER_SendMessage *msg)
 {
   struct GNUNET_MESSENGER_Client *msg_client = cls;
 
-  const enum GNUNET_MESSENGER_MessageFlags flags = (
-    (enum GNUNET_MESSENGER_MessageFlags) (msg->flags)
-    );
-
   const struct GNUNET_HashCode *key = &(msg->key);
-  const char *buffer = ((const char*) msg) + sizeof(*msg);
-
-  const uint16_t length = ntohs (msg->header.size) - sizeof(*msg);
-  size_t key_length = 0;
-
-  struct GNUNET_CRYPTO_PublicKey public_key;
-
-  if (flags & GNUNET_MESSENGER_FLAG_PRIVATE)
-  {
-    GNUNET_assert (GNUNET_SYSERR !=
-                   GNUNET_CRYPTO_read_public_key_from_buffer (buffer,
-                                                                length,
-                                                                &public_key,
-                                                                &key_length));
-  }
-  const uint16_t msg_length = length - key_length;
-  const char*msg_buffer = buffer + key_length;
+  const char *msg_buffer = ((const char*) msg) + sizeof(*msg);
+  const uint16_t msg_length = ntohs (msg->header.size) - sizeof(*msg);
 
   struct GNUNET_MESSENGER_Message message;
-  decode_message (&message, msg_length, msg_buffer, GNUNET_NO, NULL);
+  decode_message (&message, msg_length, msg_buffer, GNUNET_YES, NULL);
 
-  if ((flags & GNUNET_MESSENGER_FLAG_PRIVATE) &&
-      (GNUNET_YES != encrypt_message (&message, &public_key)))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Encrypting message failed: Message got dropped!\n");
-
-    goto end_handling;
-  }
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending message: %s to %s\n",
-              GNUNET_MESSENGER_name_of_kind (message.header.kind), GNUNET_h2s (
-                key));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending message: %s to %s (by %s)\n",
+              GNUNET_MESSENGER_name_of_kind (message.header.kind),
+              GNUNET_h2s (key),
+              GNUNET_sh2s (&(message.header.sender_id)));
 
   if (GNUNET_YES != send_srv_handle_message (msg_client->handle, key, 
&message))
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Sending message failed: %s to %s\n",
                 GNUNET_MESSENGER_name_of_kind (message.header.kind),
                 GNUNET_h2s (key));
 
-  end_handling:
   cleanup_message (&message);
 
   GNUNET_SERVICE_client_continue (msg_client->client);
 }
 
+
 static void
 callback_found_message (void *cls,
                         struct GNUNET_MESSENGER_SrvRoom *room,
@@ -309,30 +303,53 @@ callback_found_message (void *cls,
 
   if (! message)
   {
-    send_srv_room_message (room, msg_client->handle, create_message_request (
-                             hash));
+    struct GNUNET_MESSENGER_GetMessage *response;
+    struct GNUNET_MQ_Envelope *env;
+
+    env = GNUNET_MQ_msg (response,
+                         GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_GET_MESSAGE);
+    GNUNET_memcpy (&(response->key), &(room->key), sizeof(room->key));
+    GNUNET_memcpy (&(response->hash), hash, sizeof(*hash));
+    GNUNET_MQ_send (msg_client->handle->mq, env);
     return;
   }
 
-  struct GNUNET_MESSENGER_MemberStore *store = get_srv_room_member_store 
(room);
+  struct GNUNET_MESSENGER_SenderSession session;
+
+  if (GNUNET_YES == is_peer_message (message))
+  {
+    struct GNUNET_MESSENGER_PeerStore *store = get_srv_room_peer_store (room);
 
-  struct GNUNET_MESSENGER_Member *member = get_store_member_of (store, 
message);
+    session.peer = get_store_peer_of (store, message, hash);
 
-  if (! member)
+    if (! session.peer)
+      return;
+  }
+  else
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Sender of message (%s) unknown!\n",
-                GNUNET_h2s (hash));
-    return;
+    struct GNUNET_MESSENGER_MemberStore *store = get_srv_room_member_store (
+      room);
+    struct GNUNET_MESSENGER_Member *member = get_store_member_of (store,
+                                                                  message);
+
+    if (! member)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Sender of message (%s) unknown!\n",
+                  GNUNET_h2s (hash));
+      return;
+    }
+
+    session.member = get_member_session_of (member, message, hash);
+
+    if (! session.member)
+      return;
   }
 
-  struct GNUNET_MESSENGER_MemberSession *session = get_member_session_of (
-    member, message, hash);
-
-  if (session)
-    notify_srv_handle_message (msg_client->handle, room, session, message,
-                               hash);
+  notify_srv_handle_message (msg_client->handle, room, &session, message,
+                             hash);
 }
 
+
 static void
 handle_get_message (void *cls,
                     const struct GNUNET_MESSENGER_GetMessage *msg)
@@ -369,13 +386,18 @@ handle_get_message (void *cls,
     goto end_handling;
   }
 
+  const struct GNUNET_CRYPTO_PublicKey *pubkey = get_srv_handle_key (
+    msg_client->handle);
+
+  if (! pubkey)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Handle needs to have a public key to request a message!\n");
+    goto end_handling;
+  }
+
   struct GNUNET_MESSENGER_MemberSession *session = get_member_session (member,
-                                                                       &(
-                                                                         
get_srv_handle_ego (
-                                                                           
msg_client
-                                                                           ->
-                                                                           
handle)
-                                                                         
->pub));
+                                                                       pubkey);
 
   if (! session)
   {
@@ -387,10 +409,11 @@ handle_get_message (void *cls,
   request_srv_room_message (room, &(msg->hash), session, 
callback_found_message,
                             msg_client);
 
-  end_handling:
+end_handling:
   GNUNET_SERVICE_client_continue (msg_client->client);
 }
 
+
 static void*
 callback_client_connect (void *cls,
                          struct GNUNET_SERVICE_Client *client,
@@ -405,6 +428,7 @@ callback_client_connect (void *cls,
   return msg_client;
 }
 
+
 static void
 callback_client_disconnect (void *cls,
                             struct GNUNET_SERVICE_Client *client,
@@ -417,6 +441,7 @@ callback_client_disconnect (void *cls,
   GNUNET_free (msg_client);
 }
 
+
 /**
  * Setup MESSENGER internals.
  *
@@ -435,6 +460,7 @@ run (void *cls,
     GNUNET_SCHEDULER_shutdown ();
 }
 
+
 /**
  * Define "main" method using service macro.
  */
@@ -445,25 +471,18 @@ GNUNET_SERVICE_MAIN (
   &callback_client_connect,
   &callback_client_disconnect,
   NULL,
-  GNUNET_MQ_hd_var_size (create,
-                         GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_CREATE, 
struct
-                         GNUNET_MESSENGER_CreateMessage, NULL),
-  GNUNET_MQ_hd_fixed_size (update,
-                           GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_UPDATE,
+  GNUNET_MQ_hd_fixed_size (create,
+                           GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_CREATE,
                            struct
-                           GNUNET_MESSENGER_UpdateMessage, NULL),
+                           GNUNET_MESSENGER_CreateMessage, NULL),
   GNUNET_MQ_hd_fixed_size (destroy,
                            GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_DESTROY,
                            struct
                            GNUNET_MESSENGER_DestroyMessage, NULL),
-  GNUNET_MQ_hd_var_size (set_name,
-                         GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_SET_NAME,
-                         struct
-                         GNUNET_MESSENGER_NameMessage, NULL),
-  GNUNET_MQ_hd_fixed_size (room_open, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN,
-                           struct GNUNET_MESSENGER_RoomMessage, NULL),
-  GNUNET_MQ_hd_fixed_size (room_entry, 
GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY,
-                           struct GNUNET_MESSENGER_RoomMessage, NULL),
+  GNUNET_MQ_hd_var_size (room_open, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN,
+                         struct GNUNET_MESSENGER_RoomMessage, NULL),
+  GNUNET_MQ_hd_var_size (room_entry, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY,
+                         struct GNUNET_MESSENGER_RoomMessage, NULL),
   GNUNET_MQ_hd_fixed_size (room_close, 
GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE,
                            struct GNUNET_MESSENGER_RoomMessage, NULL),
   GNUNET_MQ_hd_var_size (send_message,
diff --git a/src/service/messenger/gnunet-service-messenger.h 
b/src/service/messenger/gnunet-service-messenger.h
index 1db5c651c..a3e683ecd 100644
--- a/src/service/messenger/gnunet-service-messenger.h
+++ b/src/service/messenger/gnunet-service-messenger.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -92,6 +92,7 @@ struct GNUNET_MESSENGER_MemberMessage
 
   struct GNUNET_HashCode key;
   struct GNUNET_ShortHashCode id;
+  uint32_t reset;
 };
 
 /**
@@ -102,7 +103,6 @@ struct GNUNET_MESSENGER_SendMessage
   struct GNUNET_MessageHeader header;
 
   struct GNUNET_HashCode key;
-  uint32_t flags;
 };
 
 /**
diff --git a/src/service/messenger/gnunet-service-messenger_basement.c 
b/src/service/messenger/gnunet-service-messenger_basement.c
index ae0dcaa62..d4de28c4c 100644
--- a/src/service/messenger/gnunet-service-messenger_basement.c
+++ b/src/service/messenger/gnunet-service-messenger_basement.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -29,7 +29,7 @@
 size_t
 count_of_tunnels (const struct GNUNET_MESSENGER_ListTunnels *tunnels)
 {
-  GNUNET_assert(tunnels);
+  GNUNET_assert (tunnels);
 
   const struct GNUNET_MESSENGER_ListTunnel *element;
   size_t count = 0;
@@ -40,6 +40,7 @@ count_of_tunnels (const struct GNUNET_MESSENGER_ListTunnels 
*tunnels)
   return count;
 }
 
+
 int
 should_connect_tunnel_to (size_t count,
                           size_t src,
@@ -51,6 +52,7 @@ should_connect_tunnel_to (size_t count,
   return GNUNET_NO;
 }
 
+
 int
 required_connection_between (size_t count,
                              size_t src,
diff --git a/src/service/messenger/gnunet-service-messenger_ego_store.c 
b/src/service/messenger/gnunet-service-messenger_ego_store.c
index a1ffdddab..e7faa9eed 100644
--- a/src/service/messenger/gnunet-service-messenger_ego_store.c
+++ b/src/service/messenger/gnunet-service-messenger_ego_store.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2022 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -34,7 +34,7 @@ callback_update_ego (void *cls,
                      void **ctx,
                      const char *identifier)
 {
-  if ((!ctx) || (!identifier))
+  if ((! ctx) || (! identifier))
     return;
 
   struct GNUNET_MESSENGER_EgoStore *store = cls;
@@ -42,7 +42,8 @@ callback_update_ego (void *cls,
   if (ego)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "New ego in use: '%s'\n", identifier);
-    update_store_ego (store, identifier, GNUNET_IDENTITY_ego_get_private_key 
(ego));
+    update_store_ego (store, identifier,
+                      GNUNET_IDENTITY_ego_get_private_key (ego));
   }
   else
   {
@@ -51,14 +52,16 @@ callback_update_ego (void *cls,
   }
 }
 
+
 void
-init_ego_store(struct GNUNET_MESSENGER_EgoStore *store,
-               const struct GNUNET_CONFIGURATION_Handle *config)
+init_ego_store (struct GNUNET_MESSENGER_EgoStore *store,
+                const struct GNUNET_CONFIGURATION_Handle *config)
 {
   GNUNET_assert ((store) && (config));
 
   store->cfg = config;
-  store->identity = GNUNET_IDENTITY_connect (config, &callback_update_ego, 
store);
+  store->identity = GNUNET_IDENTITY_connect (config, &callback_update_ego,
+                                             store);
   store->egos = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
   store->handles = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
 
@@ -69,18 +72,20 @@ init_ego_store(struct GNUNET_MESSENGER_EgoStore *store,
   store->op_end = NULL;
 }
 
+
 static int
 iterate_destroy_egos (void *cls,
                       const struct GNUNET_HashCode *key,
                       void *value)
 {
   struct GNUNET_MESSENGER_Ego *ego = value;
-  GNUNET_free(ego);
+  GNUNET_free (ego);
   return GNUNET_YES;
 }
 
+
 void
-clear_ego_store(struct GNUNET_MESSENGER_EgoStore *store)
+clear_ego_store (struct GNUNET_MESSENGER_EgoStore *store)
 {
   GNUNET_assert (store);
 
@@ -105,18 +110,19 @@ clear_ego_store(struct GNUNET_MESSENGER_EgoStore *store)
   {
     lu = store->lu_start;
 
-    GNUNET_IDENTITY_ego_lookup_cancel(lu->lookup);
+    GNUNET_IDENTITY_ego_lookup_cancel (lu->lookup);
     GNUNET_CONTAINER_DLL_remove (store->lu_start, store->lu_end, lu);
 
     if (lu->identifier)
-      GNUNET_free(lu->identifier);
+      GNUNET_free (lu->identifier);
 
     GNUNET_free (lu);
   }
 
-  GNUNET_CONTAINER_multihashmap_iterate (store->egos, iterate_destroy_egos, 
NULL);
+  GNUNET_CONTAINER_multihashmap_iterate (store->egos,
+                                         iterate_destroy_egos,
+                                         NULL);
   GNUNET_CONTAINER_multihashmap_destroy (store->egos);
-
   GNUNET_CONTAINER_multihashmap_destroy (store->handles);
 
   if (store->identity)
@@ -127,6 +133,7 @@ clear_ego_store(struct GNUNET_MESSENGER_EgoStore *store)
   }
 }
 
+
 static int
 iterate_create_ego (void *cls,
                     const struct GNUNET_HashCode *key,
@@ -137,6 +144,7 @@ iterate_create_ego (void *cls,
   return GNUNET_YES;
 }
 
+
 static void
 callback_ego_create (void *cls,
                      const struct GNUNET_CRYPTO_PrivateKey *key,
@@ -156,12 +164,16 @@ callback_ego_create (void *cls,
 
   if (key)
   {
-    struct GNUNET_MESSENGER_Ego *msg_ego = update_store_ego (store, 
element->identifier, key);
+    struct GNUNET_MESSENGER_Ego *msg_ego = update_store_ego (store,
+                                                             
element->identifier,
+                                                             key);
 
     struct GNUNET_HashCode hash;
-    GNUNET_CRYPTO_hash (element->identifier, strlen (element->identifier), 
&hash);
+    GNUNET_CRYPTO_hash (element->identifier, strlen (element->identifier),
+                        &hash);
 
-    GNUNET_CONTAINER_multihashmap_get_multiple (store->handles, &hash, 
iterate_create_ego, msg_ego);
+    GNUNET_CONTAINER_multihashmap_get_multiple (store->handles, &hash,
+                                                iterate_create_ego, msg_ego);
   }
   else
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Creating ego failed!\n");
@@ -171,15 +183,17 @@ callback_ego_create (void *cls,
   GNUNET_free (element);
 }
 
+
 void
 create_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
                   const char *identifier)
 {
   GNUNET_assert ((store) && (identifier));
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Store create ego: %s\n", identifier);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Store create ego: %s\n", identifier);
 
-  struct GNUNET_MESSENGER_EgoOperation *element = GNUNET_new (struct 
GNUNET_MESSENGER_EgoOperation);
+  struct GNUNET_MESSENGER_EgoOperation *element = GNUNET_new (struct
+                                                              
GNUNET_MESSENGER_EgoOperation);
 
   element->store = store;
   element->cls = NULL;
@@ -187,17 +201,18 @@ create_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
   element->identifier = GNUNET_strdup (identifier);
 
   element->operation = GNUNET_IDENTITY_create (
-      store->identity,
-      identifier,
-      NULL,
-      GNUNET_PUBLIC_KEY_TYPE_ECDSA,
-      callback_ego_create,
-      element
-  );
+    store->identity,
+    identifier,
+    NULL,
+    GNUNET_PUBLIC_KEY_TYPE_ECDSA,
+    callback_ego_create,
+    element
+    );
 
   GNUNET_CONTAINER_DLL_insert (store->op_start, store->op_end, element);
 }
 
+
 void
 bind_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
                 const char *identifier,
@@ -205,19 +220,23 @@ bind_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
 {
   GNUNET_assert ((store) && (identifier) && (handle));
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Store bind ego: %s\n", identifier);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Store bind ego: %s\n", identifier);
 
   struct GNUNET_HashCode hash;
   GNUNET_CRYPTO_hash (identifier, strlen (identifier), &hash);
 
-  if (GNUNET_YES == 
GNUNET_CONTAINER_multihashmap_contains_value(store->handles, &hash, handle))
+  if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains_value (
+        store->handles, &hash, handle))
     return;
 
-  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(store->handles, &hash, 
handle,
-                                                     
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE))
-    GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Putting handle binding to ego store 
failed!\n");
+  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (store->handles, &hash,
+                                                      handle,
+                                                      
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE))
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Putting handle binding to ego store failed!\n");
 }
 
+
 void
 unbind_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
                   const char *identifier,
@@ -225,18 +244,22 @@ unbind_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
 {
   GNUNET_assert ((store) && (identifier) && (handle));
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Store unbind ego: %s\n", identifier);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Store unbind ego: %s\n", identifier);
 
   struct GNUNET_HashCode hash;
   GNUNET_CRYPTO_hash (identifier, strlen (identifier), &hash);
 
-  if (GNUNET_YES != 
GNUNET_CONTAINER_multihashmap_contains_value(store->handles, &hash, handle))
+  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_contains_value (
+        store->handles, &hash, handle))
     return;
 
-  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove(store->handles, 
&hash, handle))
-    GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Removing handle binding from ego 
store failed!\n");
+  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (store->handles, 
&hash,
+                                                          handle))
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Removing handle binding from ego store failed!\n");
 }
 
+
 static void
 callback_ego_lookup (void *cls,
                      struct GNUNET_IDENTITY_Ego *ego)
@@ -250,50 +273,55 @@ callback_ego_lookup (void *cls,
 
   if (ego)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "New ego looked up: '%s'\n", 
element->identifier);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "New ego looked up: '%s'\n",
+                element->identifier);
     msg_ego = update_store_ego (
-        store,
-        element->identifier,
-        GNUNET_IDENTITY_ego_get_private_key(ego)
-    );
+      store,
+      element->identifier,
+      GNUNET_IDENTITY_ego_get_private_key (ego)
+      );
   }
   else
   {
     struct GNUNET_HashCode hash;
-    GNUNET_CRYPTO_hash (element->identifier, strlen (element->identifier), 
&hash);
+    GNUNET_CRYPTO_hash (element->identifier, strlen (element->identifier),
+                        &hash);
 
     if (GNUNET_CONTAINER_multihashmap_get (store->egos, &hash))
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Looked up ego got deleted: 
'%s'\n", element->identifier);
-      delete_store_ego(store, element->identifier);
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Looked up ego got deleted: '%s'\n",
+                  element->identifier);
+      delete_store_ego (store, element->identifier);
     }
   }
 
   if (element->cb)
-    element->cb(element->cls, element->identifier, msg_ego);
+    element->cb (element->cls, element->identifier, msg_ego);
 
   GNUNET_CONTAINER_DLL_remove (store->lu_start, store->lu_end, element);
   GNUNET_free (element->identifier);
   GNUNET_free (element);
 }
 
+
 void
-lookup_store_ego(struct GNUNET_MESSENGER_EgoStore *store,
-                 const char *identifier,
-                 GNUNET_MESSENGER_EgoLookupCallback lookup,
-                 void *cls)
+lookup_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
+                  const char *identifier,
+                  GNUNET_MESSENGER_EgoLookupCallback lookup,
+                  void *cls)
 {
   GNUNET_assert (store);
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Store lookup ego: %s\n", identifier);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Store lookup ego: %s\n", identifier);
 
-  if (!identifier)
+  if (! identifier)
   {
-    lookup(cls, identifier, NULL);
+    lookup (cls, identifier, NULL);
     return;
   }
 
-  struct GNUNET_MESSENGER_EgoLookup *element = GNUNET_new (struct 
GNUNET_MESSENGER_EgoLookup);
+  struct GNUNET_MESSENGER_EgoLookup *element = GNUNET_new (struct
+                                                           
GNUNET_MESSENGER_EgoLookup);
 
   element->store = store;
 
@@ -302,11 +330,13 @@ lookup_store_ego(struct GNUNET_MESSENGER_EgoStore *store,
 
   element->identifier = GNUNET_strdup (identifier);
 
-  element->lookup = GNUNET_IDENTITY_ego_lookup(store->cfg, identifier, 
callback_ego_lookup, element);
+  element->lookup = GNUNET_IDENTITY_ego_lookup (store->cfg, identifier,
+                                                callback_ego_lookup, element);
 
   GNUNET_CONTAINER_DLL_insert (store->lu_start, store->lu_end, element);
 }
 
+
 struct GNUNET_MESSENGER_Ego*
 update_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
                   const char *identifier,
@@ -314,55 +344,62 @@ update_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
 {
   GNUNET_assert ((store) && (identifier) && (key));
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Store update ego: %s\n", identifier);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Store update ego: %s\n", identifier);
 
   struct GNUNET_HashCode hash;
   GNUNET_CRYPTO_hash (identifier, strlen (identifier), &hash);
 
-  struct GNUNET_MESSENGER_Ego *ego = GNUNET_CONTAINER_multihashmap_get 
(store->egos, &hash);
+  struct GNUNET_MESSENGER_Ego *ego = GNUNET_CONTAINER_multihashmap_get (
+    store->egos, &hash);
 
-  if (!ego)
+  if (! ego)
   {
-    ego = GNUNET_new(struct GNUNET_MESSENGER_Ego);
-    GNUNET_CONTAINER_multihashmap_put (store->egos, &hash, ego, 
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+    ego = GNUNET_new (struct GNUNET_MESSENGER_Ego);
+    GNUNET_CONTAINER_multihashmap_put (store->egos, &hash, ego,
+                                       
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
   }
 
-  GNUNET_memcpy(&(ego->priv), key, sizeof(*key));
+  GNUNET_memcpy (&(ego->priv), key, sizeof(*key));
 
   if (GNUNET_OK != GNUNET_CRYPTO_key_get_public (key, &(ego->pub)))
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Updating invalid ego key 
failed!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Updating invalid ego key failed!\n");
 
   return ego;
 }
 
+
 void
 delete_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
                   const char *identifier)
 {
   GNUNET_assert ((store) && (identifier));
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Store delete ego: %s\n", identifier);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Store delete ego: %s\n", identifier);
 
   struct GNUNET_HashCode hash;
   GNUNET_CRYPTO_hash (identifier, strlen (identifier), &hash);
 
-  struct GNUNET_MESSENGER_Ego *ego = GNUNET_CONTAINER_multihashmap_get 
(store->egos, &hash);
+  struct GNUNET_MESSENGER_Ego *ego = GNUNET_CONTAINER_multihashmap_get (
+    store->egos, &hash);
 
   if (ego)
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Ego is not stored!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Ego is not stored!\n");
     return;
   }
 
-  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (store->egos, &hash, 
ego))
+  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (store->egos, &hash,
+                                                          ego))
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Removing ego from store failed!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Removing ego from store failed!\n");
     return;
   }
 
-  GNUNET_free(ego);
+  GNUNET_free (ego);
 }
 
+
 static void
 callback_ego_rename (void *cls,
                      enum GNUNET_ErrorCode ec)
@@ -382,14 +419,16 @@ callback_ego_rename (void *cls,
   struct GNUNET_HashCode hash;
   GNUNET_CRYPTO_hash (element->identifier, strlen (element->identifier), 
&hash);
 
-  struct GNUNET_MESSENGER_Ego *ego = GNUNET_CONTAINER_multihashmap_get 
(store->egos, &hash);
+  struct GNUNET_MESSENGER_Ego *ego = GNUNET_CONTAINER_multihashmap_get (
+    store->egos, &hash);
 
-  if (!ego)
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Ego is not stored!\n");
+  if (! ego)
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Ego is not stored!\n");
 
   char *identifier = (char*) element->cls;
 
-  if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (store->egos, &hash, 
ego))
+  if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (store->egos, &hash,
+                                                          ego))
   {
     GNUNET_CRYPTO_hash (identifier, strlen (identifier), &hash);
 
@@ -397,7 +436,7 @@ callback_ego_rename (void *cls,
                                        
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
   }
   else
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Renaming ego failed!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Renaming ego failed!\n");
 
   GNUNET_free (identifier);
 
@@ -406,6 +445,7 @@ callback_ego_rename (void *cls,
   GNUNET_free (element);
 }
 
+
 void
 rename_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
                   const char *old_identifier,
@@ -413,9 +453,11 @@ rename_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
 {
   GNUNET_assert ((store) && (old_identifier) && (new_identifier));
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Store rename ego: %s -> %s\n", 
old_identifier, new_identifier);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Store rename ego: %s -> %s\n",
+              old_identifier, new_identifier);
 
-  struct GNUNET_MESSENGER_EgoOperation *element = GNUNET_new (struct 
GNUNET_MESSENGER_EgoOperation);
+  struct GNUNET_MESSENGER_EgoOperation *element = GNUNET_new (struct
+                                                              
GNUNET_MESSENGER_EgoOperation);
 
   element->store = store;
   element->cls = GNUNET_strdup (new_identifier);
@@ -423,16 +465,17 @@ rename_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
   element->identifier = GNUNET_strdup (old_identifier);
 
   element->operation = GNUNET_IDENTITY_rename (
-      store->identity,
-      old_identifier,
-      new_identifier,
-      callback_ego_rename,
-      element
-  );
+    store->identity,
+    old_identifier,
+    new_identifier,
+    callback_ego_rename,
+    element
+    );
 
   GNUNET_CONTAINER_DLL_insert (store->op_start, store->op_end, element);
 }
 
+
 static void
 callback_ego_delete (void *cls,
                      enum GNUNET_ErrorCode ec)
@@ -456,27 +499,29 @@ callback_ego_delete (void *cls,
   GNUNET_free (element);
 }
 
+
 void
 renew_store_ego (struct GNUNET_MESSENGER_EgoStore *store,
                  const char *identifier)
 {
   GNUNET_assert ((store) && (identifier));
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Store renew ego: %s\n", identifier);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Store renew ego: %s\n", identifier);
 
-  struct GNUNET_MESSENGER_EgoOperation *element = GNUNET_new (struct 
GNUNET_MESSENGER_EgoOperation);
+  struct GNUNET_MESSENGER_EgoOperation *element = GNUNET_new (struct
+                                                              
GNUNET_MESSENGER_EgoOperation);
 
   element->store = store;
   element->cls = NULL;
 
   element->identifier = GNUNET_strdup (identifier);
 
-  element->operation = GNUNET_IDENTITY_delete(
-      store->identity,
-      identifier,
-      callback_ego_delete,
-      element
-  );
+  element->operation = GNUNET_IDENTITY_delete (
+    store->identity,
+    identifier,
+    callback_ego_delete,
+    element
+    );
 
   GNUNET_CONTAINER_DLL_insert (store->op_start, store->op_end, element);
 }
diff --git a/src/service/messenger/gnunet-service-messenger_handle.c 
b/src/service/messenger/gnunet-service-messenger_handle.c
index 764331c4a..84b89f431 100644
--- a/src/service/messenger/gnunet-service-messenger_handle.c
+++ b/src/service/messenger/gnunet-service-messenger_handle.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2022 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -27,68 +27,101 @@
 #include "gnunet-service-messenger_handle.h"
 
 #include "gnunet-service-messenger.h"
-#include "gnunet-service-messenger_message_kind.h"
-
+#include "messenger_api_message_kind.h"
 #include "messenger_api_util.h"
 
+struct GNUNET_MESSENGER_NextMemberId
+{
+  struct GNUNET_ShortHashCode id;
+  enum GNUNET_GenericReturnValue reset;
+};
+
 struct GNUNET_MESSENGER_SrvHandle*
 create_srv_handle (struct GNUNET_MESSENGER_Service *service,
                    struct GNUNET_MQ_Handle *mq)
 {
-  GNUNET_assert((service) && (mq));
+  GNUNET_assert ((service) && (mq));
 
-  struct GNUNET_MESSENGER_SrvHandle *handle = GNUNET_new(struct 
GNUNET_MESSENGER_SrvHandle);
+  struct GNUNET_MESSENGER_SrvHandle *handle = GNUNET_new (struct
+                                                          
GNUNET_MESSENGER_SrvHandle);
 
   handle->service = service;
   handle->mq = mq;
 
-  handle->name = NULL;
-  handle->ego = NULL;
-
   handle->member_ids = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
+  handle->next_ids = GNUNET_CONTAINER_multihashmap_create (4, GNUNET_NO);
+
+  handle->notify = NULL;
 
   return handle;
 }
 
+
 int
 iterate_free_member_ids (void *cls,
                          const struct GNUNET_HashCode *key,
                          void *value)
 {
-  GNUNET_free(value);
+  GNUNET_free (value);
 
   return GNUNET_YES;
 }
 
+
 void
 destroy_srv_handle (struct GNUNET_MESSENGER_SrvHandle *handle)
 {
-  GNUNET_assert(handle);
+  GNUNET_assert (handle);
 
-  if (handle->service->dir)
-    save_srv_handle_configuration (handle);
+  if (handle->notify)
+    GNUNET_SCHEDULER_cancel (handle->notify);
 
-  if (handle->name)
-  {
-    struct GNUNET_MESSENGER_EgoStore *store = 
get_service_ego_store(handle->service);
+  GNUNET_CONTAINER_multihashmap_iterate (handle->next_ids,
+                                         iterate_free_member_ids, NULL);
+  GNUNET_CONTAINER_multihashmap_iterate (handle->member_ids,
+                                         iterate_free_member_ids, NULL);
+
+  GNUNET_CONTAINER_multihashmap_destroy (handle->next_ids);
+  GNUNET_CONTAINER_multihashmap_destroy (handle->member_ids);
+
+  GNUNET_free (handle);
+}
 
-    unbind_store_ego(store, handle->name, handle);
 
-    GNUNET_free(handle->name);
+void
+set_srv_handle_key (struct GNUNET_MESSENGER_SrvHandle *handle,
+                    const struct GNUNET_CRYPTO_PublicKey *key)
+{
+  GNUNET_assert (handle);
+
+  if ((handle->key) && (! key))
+  {
+    GNUNET_free (handle->key);
+    handle->key = NULL;
   }
+  else if (! handle->key)
+    handle->key = GNUNET_new (struct GNUNET_CRYPTO_PublicKey);
 
-  GNUNET_CONTAINER_multihashmap_iterate (handle->member_ids, 
iterate_free_member_ids, NULL);
-  GNUNET_CONTAINER_multihashmap_destroy (handle->member_ids);
+  if (key)
+    memcpy (handle->key, key, sizeof(struct GNUNET_CRYPTO_PublicKey));
+}
 
-  GNUNET_free(handle);
+
+const struct GNUNET_CRYPTO_PublicKey*
+get_srv_handle_key (const struct GNUNET_MESSENGER_SrvHandle *handle)
+{
+  GNUNET_assert (handle);
+
+  return handle->key;
 }
 
+
 void
 get_srv_handle_data_subdir (const struct GNUNET_MESSENGER_SrvHandle *handle,
                             const char *name,
                             char **dir)
 {
-  GNUNET_assert((handle) && (dir));
+  GNUNET_assert ((handle) && (dir));
 
   if (name)
     GNUNET_asprintf (dir, "%s%s%c%s%c", handle->service->dir, "identities",
@@ -98,615 +131,441 @@ get_srv_handle_data_subdir (const struct 
GNUNET_MESSENGER_SrvHandle *handle,
                      DIR_SEPARATOR);
 }
 
+
 static int
 create_handle_member_id (const struct GNUNET_MESSENGER_SrvHandle *handle,
                          const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((handle) && (key));
+  GNUNET_assert ((handle) && (key));
 
-  struct GNUNET_ShortHashCode *random_id = GNUNET_new(struct 
GNUNET_ShortHashCode);
+  struct GNUNET_ShortHashCode *random_id = GNUNET_new (struct
+                                                       GNUNET_ShortHashCode);
 
-  if (!random_id)
+  if (! random_id)
     return GNUNET_NO;
 
   generate_free_member_id (random_id, NULL);
 
-  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (handle->member_ids, key, 
random_id,
+  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (handle->member_ids, key,
+                                                      random_id,
                                                       
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
   {
-    GNUNET_free(random_id);
+    GNUNET_free (random_id);
     return GNUNET_NO;
   }
 
-  GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Created a new member id (%s) for room: 
%s\n", GNUNET_sh2s (random_id),
-             GNUNET_h2s (key));
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Created a new member id (%s) for room: %s\n", GNUNET_sh2s (
+                random_id),
+              GNUNET_h2s (key));
 
   return GNUNET_YES;
 }
 
+
 const struct GNUNET_ShortHashCode*
 get_srv_handle_member_id (const struct GNUNET_MESSENGER_SrvHandle *handle,
                           const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((handle) && (key));
+  GNUNET_assert ((handle) && (key));
 
   return GNUNET_CONTAINER_multihashmap_get (handle->member_ids, key);
 }
 
+
 int
 change_srv_handle_member_id (struct GNUNET_MESSENGER_SrvHandle *handle,
                              const struct GNUNET_HashCode *key,
                              const struct GNUNET_ShortHashCode *unique_id)
 {
-  GNUNET_assert((handle) && (key) && (unique_id));
+  GNUNET_assert ((handle) && (key) && (unique_id));
 
-  struct GNUNET_ShortHashCode *member_id = GNUNET_CONTAINER_multihashmap_get 
(handle->member_ids, key);
+  struct GNUNET_ShortHashCode *member_id = GNUNET_CONTAINER_multihashmap_get (
+    handle->member_ids, key);
 
-  if (!member_id)
+  if (! member_id)
   {
-    member_id = GNUNET_new(struct GNUNET_ShortHashCode);
-    GNUNET_memcpy(member_id, unique_id, sizeof(*member_id));
+    member_id = GNUNET_new (struct GNUNET_ShortHashCode);
+    GNUNET_memcpy (member_id, unique_id, sizeof(*member_id));
 
-    if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (handle->member_ids, 
key, member_id,
+    if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (handle->member_ids, 
key,
+                                                        member_id,
                                                         
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
     {
-      GNUNET_free(member_id);
+      GNUNET_free (member_id);
       return GNUNET_SYSERR;
     }
   }
 
-  if (0 == GNUNET_memcmp(unique_id, member_id))
-    goto send_message_to_client;
-
-  GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Change a member id (%s) for room 
(%s).\n", GNUNET_sh2s (member_id),
-             GNUNET_h2s (key));
-
-  GNUNET_memcpy(member_id, unique_id, sizeof(*unique_id));
-
-  GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Member id changed to (%s).\n", 
GNUNET_sh2s (unique_id));
-
-  struct GNUNET_MESSENGER_MemberMessage *msg;
-  struct GNUNET_MQ_Envelope *env;
-
-send_message_to_client:
+  if (0 == GNUNET_memcmp (unique_id, member_id))
+    return GNUNET_OK;
 
-  env = GNUNET_MQ_msg(msg, GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_MEMBER_ID);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Change a member id (%s) for room (%s).\n", GNUNET_sh2s (
+                member_id),
+              GNUNET_h2s (key));
 
-  GNUNET_memcpy(&(msg->key), key, sizeof(*key));
-  GNUNET_memcpy(&(msg->id), member_id, sizeof(*member_id));
+  GNUNET_memcpy (member_id, unique_id, sizeof(*unique_id));
 
-  GNUNET_MQ_send (handle->mq, env);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Member id changed to (%s).\n",
+              GNUNET_sh2s (unique_id));
   return GNUNET_OK;
 }
 
-static void
-change_handle_name (struct GNUNET_MESSENGER_SrvHandle *handle,
-                    const char *name)
-{
-  GNUNET_assert(handle);
-
-  if (handle->name)
-    GNUNET_free(handle->name);
 
-  handle->name = name ? GNUNET_strdup(name) : NULL;
-
-  const uint16_t name_len = handle->name ? strlen (handle->name) : 0;
-
-  struct GNUNET_MESSENGER_NameMessage *msg;
-  struct GNUNET_MQ_Envelope *env;
-
-  env = GNUNET_MQ_msg_extra(msg, name_len + 1, 
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_GET_NAME);
-
-  char *extra = ((char*) msg) + sizeof(*msg);
-
-  if (name_len)
-    GNUNET_memcpy(extra, handle->name, name_len);
-
-  extra[name_len] = '\0';
-
-  GNUNET_MQ_send (handle->mq, env);
-}
-
-static void
-change_handle_ego (struct GNUNET_MESSENGER_SrvHandle *handle,
-                   const struct GNUNET_MESSENGER_Ego *ego)
-{
-  GNUNET_assert(handle);
-
-  handle->ego = ego;
-
-  ego = get_srv_handle_ego (handle);
-
-  const uint16_t length = GNUNET_CRYPTO_public_key_get_length(&(ego->pub));
-
-  struct GNUNET_MESSENGER_KeyMessage *msg;
-  struct GNUNET_MQ_Envelope *env;
-
-  env = GNUNET_MQ_msg_extra(msg, length, 
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_GET_KEY);
-
-  char *extra = ((char*) msg) + sizeof(*msg);
-
-  if (GNUNET_CRYPTO_write_public_key_to_buffer(&(ego->pub), extra, length) < 0)
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Could not write key to buffer.\n");
-
-  GNUNET_MQ_send (handle->mq, env);
-}
-
-struct GNUNET_MESSENGER_MessageHandle
+struct RoomInitializationClosure
 {
   struct GNUNET_MESSENGER_SrvHandle *handle;
-  struct GNUNET_MESSENGER_Message *message;
+  const struct GNUNET_HashCode *key;
+  const struct GNUNET_CRYPTO_PublicKey *pubkey;
 };
 
 static int
-iterate_send_message (void *cls,
-                      const struct GNUNET_HashCode *key,
-                      void *value)
+find_member_session_in_room (void *cls,
+                             const struct GNUNET_CRYPTO_PublicKey *public_key,
+                             struct GNUNET_MESSENGER_MemberSession *session)
 {
-  struct GNUNET_MESSENGER_MessageHandle *msg_handle = cls;
+  struct RoomInitializationClosure *init = cls;
 
-  send_srv_handle_message (msg_handle->handle, key, msg_handle->message);
+  if (! public_key)
+    return GNUNET_YES;
 
-  return GNUNET_YES;
-}
+  const struct GNUNET_CRYPTO_PublicKey *pubkey = get_srv_handle_key (
+    init->handle);
 
-void
-set_srv_handle_ego (struct GNUNET_MESSENGER_SrvHandle *handle,
-                    const struct GNUNET_MESSENGER_Ego *ego)
-{
-  GNUNET_assert((handle) && (ego));
-
-  struct GNUNET_MESSENGER_MessageHandle msg_handle;
-
-  msg_handle.handle = handle;
-  msg_handle.message = create_message_key (&(ego->priv));
+  if (0 != GNUNET_memcmp (pubkey, public_key))
+    return GNUNET_YES;
 
-  GNUNET_CONTAINER_multihashmap_iterate (handle->member_ids, 
iterate_send_message, &msg_handle);
-
-  destroy_message (msg_handle.message);
-
-  change_handle_ego (handle, ego);
-}
+  const struct GNUNET_ShortHashCode *id = get_member_session_id (session);
 
-const struct GNUNET_MESSENGER_Ego*
-get_srv_handle_ego (const struct GNUNET_MESSENGER_SrvHandle *handle)
-{
-  GNUNET_assert(handle);
-
-  static struct GNUNET_MESSENGER_Ego anonymous;
-  static int read_keys = 0;
-
-  if (handle->ego)
-    return handle->ego;
-
-  if (!read_keys)
+  if (! id)
   {
-    struct GNUNET_IDENTITY_Ego *ego = GNUNET_IDENTITY_ego_get_anonymous ();
-    GNUNET_memcpy(&(anonymous.priv), GNUNET_IDENTITY_ego_get_private_key 
(ego), sizeof(anonymous.priv));
-    GNUNET_IDENTITY_ego_get_public_key (ego, &(anonymous.pub));
-    read_keys = 1;
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Initialitation: Missing member id!");
+    return GNUNET_NO;
   }
 
-  return &anonymous;
-}
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Initialitation: Matching member found (%s)!\n",
+              GNUNET_sh2s (id));
 
-static void
-callback_setup_handle_name (void *cls,
-                            const char *name,
-                            const struct GNUNET_MESSENGER_Ego *ego)
-{
-  struct GNUNET_MESSENGER_SrvHandle *handle = cls;
-
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Setting up handle...\n");
-
-  change_handle_name (handle, name);
-  change_handle_ego (handle, ego);
-
-  if (handle->service->dir)
-    load_srv_handle_configuration (handle);
+  change_srv_handle_member_id (init->handle, init->key, id);
+  return GNUNET_NO;
 }
 
-void
-setup_srv_handle_name (struct GNUNET_MESSENGER_SrvHandle *handle,
-                       const char *name)
-{
-  GNUNET_assert(handle);
-
-  struct GNUNET_MESSENGER_EgoStore *store = 
get_service_ego_store(handle->service);
-
-  lookup_store_ego (store, name, callback_setup_handle_name, handle);
-}
 
 static void
-callback_update_handle (void *cls,
-                        const char *name,
-                        const struct GNUNET_MESSENGER_Ego *ego)
-{
-  struct GNUNET_MESSENGER_SrvHandle *handle = cls;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Updating handle...\n");
-
-  struct GNUNET_MESSENGER_EgoStore *store = 
get_service_ego_store(handle->service);
-
-  bind_store_ego(store, handle->name, handle);
-
-  if (!ego)
-    create_store_ego (store, handle->name);
-  else
-    renew_store_ego (store, handle->name);
-}
-
-void
-update_srv_handle (struct GNUNET_MESSENGER_SrvHandle *handle)
+initialize_srv_handle_via_matching_member (struct
+                                           GNUNET_MESSENGER_SrvHandle *handle,
+                                           const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert (handle);
-
-  if (!handle->name)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Updating handle failed: Name is 
required!\n");
+  struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (handle->service,
+                                                            key);
+  if (! room)
     return;
-  }
 
-  struct GNUNET_MESSENGER_EgoStore *store = 
get_service_ego_store(handle->service);
-
-  lookup_store_ego (store, handle->name, callback_update_handle, handle);
-}
-
-static void
-callback_set_handle_name (void *cls,
-                          const char *name,
-                          const struct GNUNET_MESSENGER_Ego *ego)
-{
-  struct GNUNET_MESSENGER_SrvHandle *handle = cls;
-
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Renaming handle...\n");
-
-  if (ego)
-  {
-    GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Renaming handle failed: Name is 
occupied! (%s)\n", name);
+  struct GNUNET_MESSENGER_MemberStore *store = get_srv_room_member_store 
(room);
+  if (! store)
     return;
-  }
-
-  struct GNUNET_MESSENGER_EgoStore *store = 
get_service_ego_store(handle->service);
-
-  char *old_dir;
-  get_srv_handle_data_subdir (handle, handle->name, &old_dir);
-
-  char *new_dir;
-  get_srv_handle_data_subdir (handle, name, &new_dir);
-
-  if ((GNUNET_YES == GNUNET_DISK_directory_test (new_dir, GNUNET_NO)) &&
-      (GNUNET_OK != GNUNET_DISK_directory_remove(new_dir)))
-    goto free_dirs;
 
-  if (GNUNET_YES == GNUNET_DISK_directory_test (old_dir, GNUNET_YES))
-  {
-    GNUNET_DISK_directory_create_for_file (new_dir);
-
-    if (0 != rename (old_dir, new_dir))
-      goto free_dirs;
-  }
-
-  if (handle->ego)
-    rename_store_ego(store, handle->name, name);
+  const struct GNUNET_CRYPTO_PublicKey *pubkey = get_srv_handle_key (handle);
+  if ((! pubkey) || (0 == GNUNET_memcmp (pubkey, get_anonymous_public_key ())))
+    return;
 
-  struct GNUNET_MESSENGER_MessageHandle msg_handle;
-  msg_handle.handle = handle;
-  msg_handle.message = create_message_name (name);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Initialize member id of handle via matching member in room!\n");
 
-  GNUNET_CONTAINER_multihashmap_iterate (handle->member_ids, 
iterate_send_message, &msg_handle);
-  destroy_message (msg_handle.message);
-  change_handle_name (handle, name);
+  struct RoomInitializationClosure init;
+  init.handle = handle;
+  init.key = key;
+  init.pubkey = pubkey;
 
-free_dirs:
-  GNUNET_free(old_dir);
-  GNUNET_free(new_dir);
+  iterate_store_members (store, find_member_session_in_room, &init);
 }
 
-void
-set_srv_handle_name (struct GNUNET_MESSENGER_SrvHandle *handle,
-                     const char *name)
-{
-  GNUNET_assert(handle);
-
-  if (!name)
-  {
-    if (handle->ego)
-      GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Renaming handle failed: Name is 
required!\n");
-    else
-      change_handle_name (handle, name);
-
-    return;
-  }
-
-  struct GNUNET_MESSENGER_EgoStore *store = 
get_service_ego_store(handle->service);
-
-  lookup_store_ego (store, name, callback_set_handle_name, handle);
-}
 
 int
 open_srv_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle,
                       const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((handle) && (key));
+  GNUNET_assert ((handle) && (key));
 
-  if ((!get_srv_handle_member_id (handle, key)) && (GNUNET_YES != 
create_handle_member_id (handle, key)))
+  initialize_srv_handle_via_matching_member (handle, key);
+
+  if ((! get_srv_handle_member_id (handle, key)) && (GNUNET_YES !=
+                                                     create_handle_member_id (
+                                                       handle, key)))
     return GNUNET_NO;
 
   return open_service_room (handle->service, handle, key);
 }
 
+
 int
 entry_srv_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle,
                        const struct GNUNET_PeerIdentity *door,
                        const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((handle) && (door) && (key));
+  GNUNET_assert ((handle) && (door) && (key));
 
-  if ((!get_srv_handle_member_id (handle, key)) && (GNUNET_YES != 
create_handle_member_id (handle, key)))
+  initialize_srv_handle_via_matching_member (handle, key);
+
+  if ((! get_srv_handle_member_id (handle, key)) && (GNUNET_YES !=
+                                                     create_handle_member_id (
+                                                       handle, key)))
     return GNUNET_NO;
 
   return entry_service_room (handle->service, handle, door, key);
 }
 
+
 int
 close_srv_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle,
                        const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((handle) && (key));
+  GNUNET_assert ((handle) && (key));
+
+  GNUNET_CONTAINER_multihashmap_get_multiple (handle->next_ids, key,
+                                              iterate_free_member_ids, NULL);
+  GNUNET_CONTAINER_multihashmap_remove_all (handle->next_ids, key);
 
-  if (!get_srv_handle_member_id (handle, key))
+  if ((handle->notify) && (0 == GNUNET_CONTAINER_multihashmap_size (
+                             handle->next_ids)))
+  {
+    GNUNET_SCHEDULER_cancel (handle->notify);
+    handle->notify = NULL;
+  }
+
+  if (! get_srv_handle_member_id (handle, key))
     return GNUNET_NO;
 
   return close_service_room (handle->service, handle, key);
 }
 
+
 int
 send_srv_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle,
                          const struct GNUNET_HashCode *key,
                          const struct GNUNET_MESSENGER_Message *message)
 {
-  GNUNET_assert((handle) && (key) && (message));
+  GNUNET_assert ((handle) && (key) && (message));
 
-  const struct GNUNET_ShortHashCode *id = get_srv_handle_member_id (handle, 
key);
+  const struct GNUNET_ShortHashCode *id = get_srv_handle_member_id (handle,
+                                                                    key);
 
-  if (!id)
+  if (! id)
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "It is required to be a member of a 
room to send messages!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "It is required to be a member of a room to send messages!\n");
     return GNUNET_NO;
   }
 
-  struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (handle->service, 
key);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending message with member id: %s\n",
+              GNUNET_sh2s (id));
 
-  if (!room)
+  if (0 != GNUNET_memcmp (id, &(message->header.sender_id)))
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "The room (%s) is unknown!\n", 
GNUNET_h2s (key));
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Member id does not match with handle!\n");
     return GNUNET_NO;
   }
 
-  struct GNUNET_MESSENGER_Message *msg = copy_message(message);
+  struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (handle->service,
+                                                            key);
 
-  GNUNET_memcpy(&(msg->header.sender_id), id, sizeof(*id));
+  if (! room)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "The room (%s) is unknown!\n",
+                GNUNET_h2s (key));
+    return GNUNET_NO;
+  }
 
+  struct GNUNET_MESSENGER_Message *msg = copy_message (message);
   return send_srv_room_message (room, handle, msg);
 }
 
+
 static const struct GNUNET_HashCode*
-get_next_member_session_contect(const struct GNUNET_MESSENGER_MemberSession 
*session)
+get_next_member_session_context (const struct
+                                 GNUNET_MESSENGER_MemberSession *session)
 {
   if (session->next)
-    return get_next_member_session_contect (session->next);
+    return get_next_member_session_context (session->next);
   else
-    return get_member_session_context(session);
+    return get_member_session_context (session);
 }
 
+
 static const struct GNUNET_MESSENGER_MemberSession*
 get_handle_member_session (struct GNUNET_MESSENGER_SrvHandle *handle,
                            struct GNUNET_MESSENGER_SrvRoom *room,
                            const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((handle) && (room) && (key) && (handle->service));
+  GNUNET_assert ((handle) && (room) && (key) && (handle->service));
 
-  const struct GNUNET_ShortHashCode *id = get_srv_handle_member_id(handle, 
key);
+  const struct GNUNET_ShortHashCode *id = get_srv_handle_member_id (handle,
+                                                                    key);
 
-  if (!id)
+  if (! id)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Handle is missing a member id for its member session! (%s)\n",
+                GNUNET_h2s (key));
     return NULL;
+  }
 
-  struct GNUNET_MESSENGER_MemberStore *store = get_srv_room_member_store(room);
-  struct GNUNET_MESSENGER_Member *member = get_store_member(store, id);
+  struct GNUNET_MESSENGER_MemberStore *store = get_srv_room_member_store 
(room);
+  struct GNUNET_MESSENGER_Member *member = get_store_member (store, id);
 
-  const struct GNUNET_MESSENGER_Ego *ego = get_srv_handle_ego(handle);
+  const struct GNUNET_CRYPTO_PublicKey *pubkey = get_srv_handle_key (handle);
 
-  if (!ego)
+  if (! pubkey)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Handle is missing a public key for its member session! 
(%s)\n",
+                GNUNET_h2s (key));
     return NULL;
+  }
 
-  return get_member_session(member, &(ego->pub));
+  return get_member_session (member, pubkey);
 }
 
+
 void
 notify_srv_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle,
                            struct GNUNET_MESSENGER_SrvRoom *room,
-                           const struct GNUNET_MESSENGER_MemberSession 
*session,
+                           const struct GNUNET_MESSENGER_SenderSession 
*session,
                            const struct GNUNET_MESSENGER_Message *message,
                            const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((handle) && (room) && (session) && (message) && (hash));
+  GNUNET_assert ((handle) && (room) && (session) && (message) && (hash));
 
-  const struct GNUNET_HashCode *key = get_srv_room_key(room);
+  const struct GNUNET_HashCode *key = get_srv_room_key (room);
 
-  if ((!handle->mq) || (!get_srv_handle_member_id (handle, key)))
+  if ((! handle->mq) || (! get_srv_handle_member_id (handle, key)))
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Notifying client about message 
requires membership!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Notifying client about message requires membership!\n");
     return;
   }
 
-  const struct GNUNET_CRYPTO_PublicKey *pubkey = 
get_contact_key(session->contact);
-
   struct GNUNET_HashCode sender;
-  GNUNET_CRYPTO_hash(pubkey, sizeof(*pubkey), &sender);
-
-  const struct GNUNET_HashCode *context = get_next_member_session_contect 
(session);
+  const struct GNUNET_HashCode *context = NULL;
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Notifying client about message: %s\n", 
GNUNET_h2s (hash));
-
-  struct GNUNET_MESSENGER_Message *private_message = NULL;
+  if (GNUNET_YES == is_peer_message (message))
+  {
+    const struct GNUNET_PeerIdentity *identity = session->peer;
+    GNUNET_CRYPTO_hash (identity, sizeof(*identity), &sender);
 
-  if (GNUNET_MESSENGER_KIND_PRIVATE == message->header.kind)
+    context = &sender;
+  }
+  else
   {
-    private_message = copy_message(message);
+    const struct GNUNET_CRYPTO_PublicKey *pubkey = get_contact_key (
+      session->member->contact);
+    GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &sender);
 
-    if (GNUNET_YES != decrypt_message(private_message, 
&(get_srv_handle_ego(handle)->priv)))
-    {
-      destroy_message(private_message);
-      private_message = NULL;
-    }
-    else
-      message = private_message;
+    context = get_next_member_session_context (session->member);
   }
 
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Notifying client about message: %s\n",
+              GNUNET_h2s (hash));
+
   struct GNUNET_MESSENGER_RecvMessage *msg;
   struct GNUNET_MQ_Envelope *env;
 
   uint16_t length = get_message_size (message, GNUNET_YES);
 
-  env = GNUNET_MQ_msg_extra(msg, length, 
GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_RECV_MESSAGE);
+  env = GNUNET_MQ_msg_extra (msg, length,
+                             GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_RECV_MESSAGE);
 
-  GNUNET_memcpy(&(msg->key), key, sizeof(msg->key));
-  GNUNET_memcpy(&(msg->sender), &sender, sizeof(msg->sender));
-  GNUNET_memcpy(&(msg->context), context, sizeof(msg->context));
-  GNUNET_memcpy(&(msg->hash), hash, sizeof(msg->hash));
+  GNUNET_memcpy (&(msg->key), key, sizeof(msg->key));
+  GNUNET_memcpy (&(msg->sender), &sender, sizeof(msg->sender));
+  GNUNET_memcpy (&(msg->context), context, sizeof(msg->context));
+  GNUNET_memcpy (&(msg->hash), hash, sizeof(msg->hash));
 
   msg->flags = (uint32_t) GNUNET_MESSENGER_FLAG_NONE;
 
-  if (get_handle_member_session(handle, room, key) == session)
+  if (GNUNET_YES == is_peer_message (message))
+    msg->flags |= (uint32_t) GNUNET_MESSENGER_FLAG_PEER;
+  else if (get_handle_member_session (handle, room, key) == session->member)
     msg->flags |= (uint32_t) GNUNET_MESSENGER_FLAG_SENT;
 
-  if (private_message)
-    msg->flags |= (uint32_t) GNUNET_MESSENGER_FLAG_PRIVATE;
-
   char *buffer = ((char*) msg) + sizeof(*msg);
   encode_message (message, length, buffer, GNUNET_YES);
 
-  if (private_message)
-    destroy_message(private_message);
-
   GNUNET_MQ_send (handle->mq, env);
 }
 
+
 static int
-callback_scan_for_rooms (void *cls,
-                         const char *filename)
+iterate_next_member_ids (void *cls,
+                         const struct GNUNET_HashCode *key,
+                         void *value)
 {
   struct GNUNET_MESSENGER_SrvHandle *handle = cls;
+  struct GNUNET_MESSENGER_NextMemberId *next = value;
 
-  if ((strlen(filename) <= 4) || (0 != strcmp(filename + strlen(filename) - 4, 
".cfg")))
-    return GNUNET_OK;
-
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load room configuration of handle: 
%s\n", filename);
+  struct GNUNET_MESSENGER_MemberMessage *msg;
+  struct GNUNET_MQ_Envelope *env;
 
-  struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
+  env = GNUNET_MQ_msg (msg, 
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_MEMBER_ID);
 
-  if ((GNUNET_YES == GNUNET_DISK_file_test (filename)) && (GNUNET_OK == 
GNUNET_CONFIGURATION_parse (cfg, filename)))
-  {
-    struct GNUNET_HashCode key;
-    struct GNUNET_ShortHashCode member_id;
+  GNUNET_memcpy (&(msg->key), key, sizeof(*key));
+  GNUNET_memcpy (&(msg->id), &(next->id), sizeof(next->id));
+  msg->reset = (uint32_t) next->reset;
 
-    if ((GNUNET_OK == GNUNET_CONFIGURATION_get_data (cfg, "room", "key", &key, 
sizeof(key))) &&
-        (GNUNET_OK == GNUNET_CONFIGURATION_get_data (cfg, "room", "member_id", 
&member_id, sizeof(member_id))))
-      change_srv_handle_member_id (handle, &key, &member_id);
-  }
+  GNUNET_MQ_send (handle->mq, env);
 
-  GNUNET_CONFIGURATION_destroy (cfg);
-  return GNUNET_OK;
+  GNUNET_free (next);
+  return GNUNET_YES;
 }
 
-void
-load_srv_handle_configuration (struct GNUNET_MESSENGER_SrvHandle *handle)
-{
-  GNUNET_assert(handle);
-
-  char *id_dir;
-  get_srv_handle_data_subdir (handle, handle->name, &id_dir);
 
-  if (GNUNET_YES == GNUNET_DISK_directory_test (id_dir, GNUNET_YES))
-  {
-    char *scan_dir;
-    GNUNET_asprintf (&scan_dir, "%s%s%c", id_dir, "rooms", DIR_SEPARATOR);
-
-    if (GNUNET_OK == GNUNET_DISK_directory_test (scan_dir, GNUNET_YES))
-      GNUNET_DISK_directory_scan (scan_dir, callback_scan_for_rooms, handle);
-
-    GNUNET_free(scan_dir);
-  }
-
-  GNUNET_free(id_dir);
-}
-
-static int
-iterate_save_rooms (void *cls,
-                    const struct GNUNET_HashCode *key,
-                    void *value)
+static void
+task_notify_srv_handle_member_id (void *cls)
 {
   struct GNUNET_MESSENGER_SrvHandle *handle = cls;
-  struct GNUNET_ShortHashCode *member_id = value;
-
-  char *id_dir;
-  get_srv_handle_data_subdir (handle, handle->name, &id_dir);
-
-  char *filename;
-  GNUNET_asprintf (&filename, "%s%s%c%s.cfg", id_dir, "rooms", DIR_SEPARATOR, 
GNUNET_h2s (key));
-  GNUNET_free(id_dir);
-
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Save room configuration of handle: 
%s\n", filename);
-
-  struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
+  handle->notify = NULL;
 
-  char *key_data = GNUNET_STRINGS_data_to_string_alloc (key, sizeof(*key));
-
-  if (key_data)
-  {
-    GNUNET_CONFIGURATION_set_value_string (cfg, "room", "key", key_data);
+  GNUNET_CONTAINER_multihashmap_iterate (handle->next_ids,
+                                         iterate_next_member_ids, handle);
+  GNUNET_CONTAINER_multihashmap_clear (handle->next_ids);
+}
 
-    GNUNET_free(key_data);
-  }
 
-  char *member_id_data = GNUNET_STRINGS_data_to_string_alloc (member_id, 
sizeof(*member_id));
+void
+notify_srv_handle_member_id (struct GNUNET_MESSENGER_SrvHandle *handle,
+                             struct GNUNET_MESSENGER_SrvRoom *room,
+                             const struct GNUNET_ShortHashCode *member_id,
+                             enum GNUNET_GenericReturnValue reset)
+{
+  GNUNET_assert ((handle) && (room) && (member_id));
 
-  if (member_id_data)
+  struct GNUNET_MESSENGER_NextMemberId *next = GNUNET_new (struct
+                                                           
GNUNET_MESSENGER_NextMemberId);
+  if (! next)
   {
-    GNUNET_CONFIGURATION_set_value_string (cfg, "room", "member_id", 
member_id_data);
-
-    GNUNET_free(member_id_data);
+    return;
   }
 
-  GNUNET_CONFIGURATION_write (cfg, filename);
-  GNUNET_CONFIGURATION_destroy (cfg);
+  GNUNET_memcpy (&(next->id), member_id, sizeof(next->id));
+  next->reset = reset;
 
-  GNUNET_free(filename);
+  const struct GNUNET_HashCode *key = get_srv_room_key (room);
 
-  return GNUNET_YES;
-}
-
-void
-save_srv_handle_configuration (struct GNUNET_MESSENGER_SrvHandle *handle)
-{
-  GNUNET_assert(handle);
-
-  char *id_dir;
-  get_srv_handle_data_subdir (handle, handle->name, &id_dir);
-
-  if ((GNUNET_YES == GNUNET_DISK_directory_test (id_dir, GNUNET_NO)) || 
(GNUNET_OK
-      == GNUNET_DISK_directory_create (id_dir)))
+  struct GNUNET_MESSENGER_NextMemberId *prev =
+    GNUNET_CONTAINER_multihashmap_get (handle->next_ids, key);
+  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_put (handle->next_ids, key,
+                                                       next,
+                                                       
GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE))
   {
-    char *save_dir;
-    GNUNET_asprintf (&save_dir, "%s%s%c", id_dir, "rooms", DIR_SEPARATOR);
-
-    if ((GNUNET_YES == GNUNET_DISK_directory_test (save_dir, GNUNET_NO)) ||
-        (GNUNET_OK == GNUNET_DISK_directory_create (save_dir)))
-      GNUNET_CONTAINER_multihashmap_iterate (handle->member_ids, 
iterate_save_rooms, handle);
-
-    GNUNET_free(save_dir);
+    return;
   }
 
-  GNUNET_free(id_dir);
+  if (prev)
+    GNUNET_free (prev);
+
+  if (! handle->notify)
+    handle->notify = GNUNET_SCHEDULER_add_now 
(task_notify_srv_handle_member_id,
+                                               handle);
 }
diff --git a/src/service/messenger/gnunet-service-messenger_handle.h 
b/src/service/messenger/gnunet-service-messenger_handle.h
index edcd2ccd0..4963d9247 100644
--- a/src/service/messenger/gnunet-service-messenger_handle.h
+++ b/src/service/messenger/gnunet-service-messenger_handle.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2022 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -32,9 +32,8 @@
 #include "gnunet_identity_service.h"
 
 #include "gnunet-service-messenger_service.h"
-#include "gnunet-service-messenger_member_session.h"
+#include "gnunet-service-messenger_sender_session.h"
 
-#include "messenger_api_ego.h"
 #include "messenger_api_message.h"
 
 struct GNUNET_MESSENGER_SrvHandle
@@ -42,11 +41,12 @@ struct GNUNET_MESSENGER_SrvHandle
   struct GNUNET_MESSENGER_Service *service;
   struct GNUNET_MQ_Handle *mq;
 
-  char *name;
-
-  const struct GNUNET_MESSENGER_Ego *ego;
+  struct GNUNET_CRYPTO_PublicKey *key;
 
   struct GNUNET_CONTAINER_MultiHashMap *member_ids;
+  struct GNUNET_CONTAINER_MultiHashMap *next_ids;
+
+  struct GNUNET_SCHEDULER_Task *notify;
 };
 
 /**
@@ -68,6 +68,25 @@ create_srv_handle (struct GNUNET_MESSENGER_Service *service,
 void
 destroy_srv_handle (struct GNUNET_MESSENGER_SrvHandle *handle);
 
+/**
+ * Sets the public key from the EGO of a given <i>handle</i>.
+ *
+ * @param[out] handle Handle
+ * @param[in] key Public key of EGO
+ */
+void
+set_srv_handle_key (struct GNUNET_MESSENGER_SrvHandle *handle,
+                    const struct GNUNET_CRYPTO_PublicKey *key);
+
+/**
+ * Returns the public key from the EGO of a given <i>handle</i>.
+ *
+ * @param[in] handle Handle
+ * @return Public key of handles EGO
+ */
+const struct GNUNET_CRYPTO_PublicKey*
+get_srv_handle_key (const struct GNUNET_MESSENGER_SrvHandle *handle);
+
 /**
  * Writes the path of the directory for a given <i>handle</i> using a specific 
<i>name</i> to the parameter
  * <i>dir</i>. This directory will be used to store data regarding the handle 
and its messages.
@@ -78,8 +97,8 @@ destroy_srv_handle (struct GNUNET_MESSENGER_SrvHandle 
*handle);
  */
 void
 get_srv_handle_data_subdir (const struct GNUNET_MESSENGER_SrvHandle *handle,
-                        const char *name,
-                        char **dir);
+                            const char *name,
+                            char **dir);
 
 /**
  * Returns the member id of a given <i>handle</i> in a specific <i>room</i>.
@@ -110,57 +129,6 @@ change_srv_handle_member_id (struct 
GNUNET_MESSENGER_SrvHandle *handle,
                              const struct GNUNET_HashCode *key,
                              const struct GNUNET_ShortHashCode *unique_id);
 
-/**
- * Sets the EGO used by a given <i>handle</i>.
- *
- * @param[in,out] handle Handle
- * @param[in] ego EGO key pair
- */
-void
-set_srv_handle_ego (struct GNUNET_MESSENGER_SrvHandle *handle,
-                    const struct GNUNET_MESSENGER_Ego *ego);
-
-/**
- * Returns the EGO used by a given <i>handle</i>.
- *
- * @param[in] handle Handle
- * @return EGO key pair
- */
-const struct GNUNET_MESSENGER_Ego*
-get_srv_handle_ego (const struct GNUNET_MESSENGER_SrvHandle *handle);
-
-/**
- * Tries to set the name and EGO key of a <i>handle</i> initially by looking 
up a specific <i>name</i>.
- *
- * @param[in,out] handle Handle
- * @param[in] name Name (optionally: valid EGO name)
- */
-void
-setup_srv_handle_name (struct GNUNET_MESSENGER_SrvHandle *handle,
-                       const char *name);
-
-/**
- * Tries to change the key pair of an EGO of a <i>handle</i> under the same 
name and informs all rooms
- * about the change automatically.
- *
- * @param[in,out] handle Handle
- */
-void
-update_srv_handle (struct GNUNET_MESSENGER_SrvHandle *handle);
-
-/**
- * Tries to rename the handle which implies renaming the EGO its using and 
moving all related data into
- * the directory fitting to the changed <i>name</i>.
- *
- * The client connected to the <i>handle</i> will be informed afterwards 
automatically.
- *
- * @param[in,out] handle Handle
- * @param[in] name New name
- */
-void
-set_srv_handle_name (struct GNUNET_MESSENGER_SrvHandle *handle,
-                     const char *name);
-
 /**
  * Makes a given <i>handle</i> a member of the room using a specific 
<i>key</i> and opens the
  * room from the handles service.
@@ -217,33 +185,29 @@ send_srv_handle_message (struct 
GNUNET_MESSENGER_SrvHandle *handle,
  *
  * @param[in,out] handle Handle
  * @param[in] room Room of the message
- * @param[in] session Member session
+ * @param[in] session Sender session
  * @param[in] message Message
  * @param[in] hash Hash of message
  */
 void
 notify_srv_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle,
                            struct GNUNET_MESSENGER_SrvRoom *room,
-                           const struct GNUNET_MESSENGER_MemberSession 
*session,
+                           const struct GNUNET_MESSENGER_SenderSession 
*session,
                            const struct GNUNET_MESSENGER_Message *message,
                            const struct GNUNET_HashCode *hash);
 
 /**
- * Loads member ids and other potential configuration from a given 
<i>handle</i> which
- * depends on the given name the <i>handle</i> uses.
+ * Notifies the handle that a new member id needs to be used.
  *
- * @param[out] handle Handle
- */
-void
-load_srv_handle_configuration (struct GNUNET_MESSENGER_SrvHandle *handle);
-
-/**
- * Saves member ids and other potential configuration from a given 
<i>handle</i> which
- * depends on the given name the <i>handle</i> uses.
- *
- * @param[in] handle Handle
+ * @param[in,out] handle Handle
+ * @param[in] room Room of the member
+ * @param[in] member_id Member id
+ * @param[in] reset Reset member session with join message
  */
 void
-save_srv_handle_configuration (struct GNUNET_MESSENGER_SrvHandle *handle);
+notify_srv_handle_member_id (struct GNUNET_MESSENGER_SrvHandle *handle,
+                             struct GNUNET_MESSENGER_SrvRoom *room,
+                             const struct GNUNET_ShortHashCode *member_id,
+                             enum GNUNET_GenericReturnValue reset);
 
 #endif //GNUNET_SERVICE_MESSENGER_HANDLE_H
diff --git a/src/service/messenger/gnunet-service-messenger_list_handles.c 
b/src/service/messenger/gnunet-service-messenger_list_handles.c
index 0703c2de6..826e1f4ed 100644
--- a/src/service/messenger/gnunet-service-messenger_list_handles.c
+++ b/src/service/messenger/gnunet-service-messenger_list_handles.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2022 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -31,48 +31,52 @@
 void
 init_list_handles (struct GNUNET_MESSENGER_ListHandles *handles)
 {
-  GNUNET_assert(handles);
+  GNUNET_assert (handles);
 
   handles->head = NULL;
   handles->tail = NULL;
 }
 
+
 void
 clear_list_handles (struct GNUNET_MESSENGER_ListHandles *handles)
 {
-  GNUNET_assert(handles);
+  GNUNET_assert (handles);
 
   while (handles->head)
   {
     struct GNUNET_MESSENGER_ListHandle *element = handles->head;
 
-    GNUNET_CONTAINER_DLL_remove(handles->head, handles->tail, element);
+    GNUNET_CONTAINER_DLL_remove (handles->head, handles->tail, element);
     destroy_srv_handle (element->handle);
-    GNUNET_free(element);
+    GNUNET_free (element);
   }
 
   handles->head = NULL;
   handles->tail = NULL;
 }
 
+
 void
 add_list_handle (struct GNUNET_MESSENGER_ListHandles *handles,
                  struct GNUNET_MESSENGER_SrvHandle *handle)
 {
-  GNUNET_assert((handles) && (handle));
+  GNUNET_assert ((handles) && (handle));
 
-  struct GNUNET_MESSENGER_ListHandle *element = GNUNET_new(struct 
GNUNET_MESSENGER_ListHandle);
+  struct GNUNET_MESSENGER_ListHandle *element = GNUNET_new (struct
+                                                            
GNUNET_MESSENGER_ListHandle);
 
   element->handle = handle;
 
-  GNUNET_CONTAINER_DLL_insert_tail(handles->head, handles->tail, element);
+  GNUNET_CONTAINER_DLL_insert_tail (handles->head, handles->tail, element);
 }
 
+
 int
 remove_list_handle (struct GNUNET_MESSENGER_ListHandles *handles,
                     struct GNUNET_MESSENGER_SrvHandle *handle)
 {
-  GNUNET_assert((handles) && (handle));
+  GNUNET_assert ((handles) && (handle));
 
   struct GNUNET_MESSENGER_ListHandle *element;
 
@@ -80,25 +84,28 @@ remove_list_handle (struct GNUNET_MESSENGER_ListHandles 
*handles,
     if (element->handle == handle)
       break;
 
-  if (!element)
+  if (! element)
     return GNUNET_NO;
 
-  GNUNET_CONTAINER_DLL_remove(handles->head, handles->tail, element);
-  GNUNET_free(element);
+  GNUNET_CONTAINER_DLL_remove (handles->head, handles->tail, element);
+  GNUNET_free (element);
 
   return GNUNET_YES;
 }
 
+
 struct GNUNET_MESSENGER_SrvHandle*
 find_list_handle_by_member (const struct GNUNET_MESSENGER_ListHandles *handles,
                             const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((handles) && (key));
+  GNUNET_assert ((handles) && (key));
 
   struct GNUNET_MESSENGER_ListHandle *element;
 
   for (element = handles->head; element; element = element->next)
-    if (get_srv_handle_member_id ((struct GNUNET_MESSENGER_SrvHandle*) 
element->handle, key))
+    if (get_srv_handle_member_id ((struct
+                                   GNUNET_MESSENGER_SrvHandle*) 
element->handle,
+                                  key))
       return element->handle;
 
   return NULL;
diff --git a/src/service/messenger/gnunet-service-messenger_list_messages.c 
b/src/service/messenger/gnunet-service-messenger_list_messages.c
index 5bab52806..063e1ebfc 100644
--- a/src/service/messenger/gnunet-service-messenger_list_messages.c
+++ b/src/service/messenger/gnunet-service-messenger_list_messages.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -29,47 +29,51 @@
 void
 init_list_messages (struct GNUNET_MESSENGER_ListMessages *messages)
 {
-  GNUNET_assert(messages);
+  GNUNET_assert (messages);
 
   messages->head = NULL;
   messages->tail = NULL;
 }
 
+
 void
 clear_list_messages (struct GNUNET_MESSENGER_ListMessages *messages)
 {
-  GNUNET_assert(messages);
+  GNUNET_assert (messages);
 
   while (messages->head)
   {
     struct GNUNET_MESSENGER_ListMessage *element = messages->head;
 
-    GNUNET_CONTAINER_DLL_remove(messages->head, messages->tail, element);
-    GNUNET_free(element);
+    GNUNET_CONTAINER_DLL_remove (messages->head, messages->tail, element);
+    GNUNET_free (element);
   }
 
   messages->head = NULL;
   messages->tail = NULL;
 }
 
+
 void
 add_to_list_messages (struct GNUNET_MESSENGER_ListMessages *messages,
                       const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((messages) && (hash));
+  GNUNET_assert ((messages) && (hash));
 
-  struct GNUNET_MESSENGER_ListMessage *element = GNUNET_new(struct 
GNUNET_MESSENGER_ListMessage);
+  struct GNUNET_MESSENGER_ListMessage *element = GNUNET_new (struct
+                                                             
GNUNET_MESSENGER_ListMessage);
 
-  GNUNET_memcpy(&(element->hash), hash, sizeof(struct GNUNET_HashCode));
+  GNUNET_memcpy (&(element->hash), hash, sizeof(struct GNUNET_HashCode));
 
-  GNUNET_CONTAINER_DLL_insert_tail(messages->head, messages->tail, element);
+  GNUNET_CONTAINER_DLL_insert_tail (messages->head, messages->tail, element);
 }
 
+
 void
 copy_list_messages (struct GNUNET_MESSENGER_ListMessages *messages,
                     const struct GNUNET_MESSENGER_ListMessages *origin)
 {
-  GNUNET_assert((messages) && (origin));
+  GNUNET_assert ((messages) && (origin));
 
   struct GNUNET_MESSENGER_ListMessage *element;
 
@@ -77,80 +81,85 @@ copy_list_messages (struct GNUNET_MESSENGER_ListMessages 
*messages,
     add_to_list_messages (messages, &(element->hash));
 }
 
+
 void
 remove_from_list_messages (struct GNUNET_MESSENGER_ListMessages *messages,
                            const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((messages) && (hash));
+  GNUNET_assert ((messages) && (hash));
 
   struct GNUNET_MESSENGER_ListMessage *element;
 
   for (element = messages->head; element; element = element->next)
     if (0 == GNUNET_CRYPTO_hash_cmp (&(element->hash), hash))
     {
-      GNUNET_CONTAINER_DLL_remove(messages->head, messages->tail, element);
-      GNUNET_free(element);
+      GNUNET_CONTAINER_DLL_remove (messages->head, messages->tail, element);
+      GNUNET_free (element);
       break;
     }
 }
 
+
 void
 load_list_messages (struct GNUNET_MESSENGER_ListMessages *messages,
                     const char *path)
 {
-  GNUNET_assert((messages) && (path));
+  GNUNET_assert ((messages) && (path));
 
   if (GNUNET_YES != GNUNET_DISK_file_test (path))
     return;
 
-  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ 
| GNUNET_DISK_PERM_USER_WRITE);
+  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
+                                                   | 
GNUNET_DISK_PERM_USER_WRITE);
 
-  struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open(
-      path, GNUNET_DISK_OPEN_READ, permission
-  );
+  struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open (
+    path, GNUNET_DISK_OPEN_READ, permission
+    );
 
-  if (!handle)
+  if (! handle)
     return;
 
-  GNUNET_DISK_file_seek(handle, 0, GNUNET_DISK_SEEK_SET);
+  GNUNET_DISK_file_seek (handle, 0, GNUNET_DISK_SEEK_SET);
 
   struct GNUNET_HashCode hash;
   ssize_t len;
 
   do {
-    len = GNUNET_DISK_file_read(handle, &hash, sizeof(hash));
+    len = GNUNET_DISK_file_read (handle, &hash, sizeof(hash));
 
     if (len != sizeof(hash))
       break;
 
-    add_to_list_messages(messages, &hash);
+    add_to_list_messages (messages, &hash);
   } while (len == sizeof(hash));
 
-  GNUNET_DISK_file_close(handle);
+  GNUNET_DISK_file_close (handle);
 }
 
+
 void
 save_list_messages (const struct GNUNET_MESSENGER_ListMessages *messages,
                     const char *path)
 {
-  GNUNET_assert((messages) && (path));
+  GNUNET_assert ((messages) && (path));
 
-  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ 
| GNUNET_DISK_PERM_USER_WRITE);
+  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
+                                                   | 
GNUNET_DISK_PERM_USER_WRITE);
 
-  struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open(
-      path, GNUNET_DISK_OPEN_CREATE | GNUNET_DISK_OPEN_WRITE, permission
-  );
+  struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open (
+    path, GNUNET_DISK_OPEN_CREATE | GNUNET_DISK_OPEN_WRITE, permission
+    );
 
-  if (!handle)
+  if (! handle)
     return;
 
-  GNUNET_DISK_file_seek(handle, 0, GNUNET_DISK_SEEK_SET);
+  GNUNET_DISK_file_seek (handle, 0, GNUNET_DISK_SEEK_SET);
 
   struct GNUNET_MESSENGER_ListMessage *element;
 
   for (element = messages->head; element; element = element->next)
-    GNUNET_DISK_file_write(handle, &(element->hash), sizeof(element->hash));
+    GNUNET_DISK_file_write (handle, &(element->hash), sizeof(element->hash));
 
-  GNUNET_DISK_file_sync(handle);
-  GNUNET_DISK_file_close(handle);
+  GNUNET_DISK_file_sync (handle);
+  GNUNET_DISK_file_close (handle);
 }
diff --git a/src/service/messenger/gnunet-service-messenger_member.c 
b/src/service/messenger/gnunet-service-messenger_member.c
index 96b26cfb9..c57daa062 100644
--- a/src/service/messenger/gnunet-service-messenger_member.c
+++ b/src/service/messenger/gnunet-service-messenger_member.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -34,44 +34,50 @@ create_member (struct GNUNET_MESSENGER_MemberStore *store,
 {
   GNUNET_assert (store);
 
-  struct GNUNET_MESSENGER_Member *member = GNUNET_new(struct 
GNUNET_MESSENGER_Member);
+  struct GNUNET_MESSENGER_Member *member = GNUNET_new (struct
+                                                       
GNUNET_MESSENGER_Member);
 
   member->store = store;
 
   if (id)
-    GNUNET_memcpy(&(member->id), id, sizeof(member->id));
-  else if (GNUNET_YES != generate_free_member_id(&(member->id), 
store->members))
+    GNUNET_memcpy (&(member->id), id, sizeof(member->id));
+  else if (GNUNET_YES != generate_free_member_id (&(member->id),
+                                                  store->members))
   {
     GNUNET_free (member);
     return NULL;
   }
 
-  member->sessions = GNUNET_CONTAINER_multihashmap_create(2, GNUNET_NO);
+  member->sessions = GNUNET_CONTAINER_multihashmap_create (2, GNUNET_NO);
 
   return member;
 }
 
+
 static int
 iterate_destroy_session (void *cls,
                          const struct GNUNET_HashCode *key,
                          void *value)
 {
   struct GNUNET_MESSENGER_MemberSession *session = value;
-  destroy_member_session(session);
+  destroy_member_session (session);
   return GNUNET_YES;
 }
 
+
 void
 destroy_member (struct GNUNET_MESSENGER_Member *member)
 {
-  GNUNET_assert((member) && (member->sessions));
+  GNUNET_assert ((member) && (member->sessions));
 
-  GNUNET_CONTAINER_multihashmap_iterate (member->sessions, 
iterate_destroy_session, NULL);
+  GNUNET_CONTAINER_multihashmap_iterate (member->sessions,
+                                         iterate_destroy_session, NULL);
   GNUNET_CONTAINER_multihashmap_destroy (member->sessions);
 
   GNUNET_free (member);
 }
 
+
 const struct GNUNET_ShortHashCode*
 get_member_id (const struct GNUNET_MESSENGER_Member *member)
 {
@@ -80,6 +86,7 @@ get_member_id (const struct GNUNET_MESSENGER_Member *member)
   return &(member->id);
 }
 
+
 static int
 callback_scan_for_sessions (void *cls,
                             const char *filename)
@@ -92,13 +99,14 @@ callback_scan_for_sessions (void *cls,
 
     GNUNET_asprintf (&directory, "%s%c", filename, DIR_SEPARATOR);
 
-    load_member_session(member, directory);
+    load_member_session (member, directory);
     GNUNET_free (directory);
   }
 
   return GNUNET_OK;
 }
 
+
 void
 load_member (struct GNUNET_MESSENGER_MemberStore *store,
              const char *directory)
@@ -113,7 +121,8 @@ load_member (struct GNUNET_MESSENGER_MemberStore *store,
   if (GNUNET_YES != GNUNET_DISK_file_test (config_file))
     goto free_config;
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load member configuration: %s\n", 
config_file);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Load member configuration: %s\n",
+              config_file);
 
   struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
 
@@ -121,10 +130,11 @@ load_member (struct GNUNET_MESSENGER_MemberStore *store,
   {
     struct GNUNET_ShortHashCode id;
 
-    if (GNUNET_OK != GNUNET_CONFIGURATION_get_data (cfg, "member", "id", &id, 
sizeof(id)))
+    if (GNUNET_OK != GNUNET_CONFIGURATION_get_data (cfg, "member", "id", &id,
+                                                    sizeof(id)))
       goto destroy_config;
 
-    member = add_store_member(store, &id);
+    member = add_store_member (store, &id);
   }
 
 destroy_config:
@@ -132,9 +142,9 @@ destroy_config:
   GNUNET_CONFIGURATION_destroy (cfg);
 
 free_config:
-  GNUNET_free(config_file);
+  GNUNET_free (config_file);
 
-  if (!member)
+  if (! member)
     return;
 
   char *scan_dir;
@@ -143,18 +153,20 @@ free_config:
   if (GNUNET_OK == GNUNET_DISK_directory_test (scan_dir, GNUNET_YES))
     GNUNET_DISK_directory_scan (scan_dir, callback_scan_for_sessions, member);
 
-  GNUNET_free(scan_dir);
+  GNUNET_free (scan_dir);
 }
 
+
 static int
 iterate_load_next_session (void *cls,
                            const struct GNUNET_HashCode *key,
                            void *value)
 {
-  const char* sessions_directory = cls;
+  const char *sessions_directory = cls;
 
-  char* load_dir;
-  GNUNET_asprintf (&load_dir, "%s%s%c", sessions_directory, GNUNET_h2s(key), 
DIR_SEPARATOR);
+  char *load_dir;
+  GNUNET_asprintf (&load_dir, "%s%s%c", sessions_directory, GNUNET_h2s (key),
+                   DIR_SEPARATOR);
 
   struct GNUNET_MESSENGER_MemberSession *session = value;
 
@@ -165,29 +177,33 @@ iterate_load_next_session (void *cls,
   return GNUNET_YES;
 }
 
+
 void
 load_member_next_sessions (const struct GNUNET_MESSENGER_Member *member,
                            const char *directory)
 {
   GNUNET_assert ((member) && (directory));
 
-  char* load_dir;
+  char *load_dir;
   GNUNET_asprintf (&load_dir, "%s%s%c", directory, "sessions", DIR_SEPARATOR);
 
-  GNUNET_CONTAINER_multihashmap_iterate (member->sessions, 
iterate_load_next_session, load_dir);
+  GNUNET_CONTAINER_multihashmap_iterate (member->sessions,
+                                         iterate_load_next_session, load_dir);
 
-  GNUNET_free(load_dir);
+  GNUNET_free (load_dir);
 }
 
+
 static int
 iterate_save_session (void *cls,
                       const struct GNUNET_HashCode *key,
                       void *value)
 {
-  const char* sessions_directory = cls;
+  const char *sessions_directory = cls;
 
-  char* save_dir;
-  GNUNET_asprintf (&save_dir, "%s%s%c", sessions_directory, GNUNET_h2s(key), 
DIR_SEPARATOR);
+  char *save_dir;
+  GNUNET_asprintf (&save_dir, "%s%s%c", sessions_directory, GNUNET_h2s (key),
+                   DIR_SEPARATOR);
 
   struct GNUNET_MESSENGER_MemberSession *session = value;
 
@@ -199,6 +215,7 @@ iterate_save_session (void *cls,
   return GNUNET_YES;
 }
 
+
 void
 save_member (struct GNUNET_MESSENGER_Member *member,
              const char *directory)
@@ -208,39 +225,43 @@ save_member (struct GNUNET_MESSENGER_Member *member,
   char *config_file;
   GNUNET_asprintf (&config_file, "%s%s", directory, "member.cfg");
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Save member configuration: %s\n", 
config_file);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Save member configuration: %s\n",
+              config_file);
 
   struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
 
-  char *id_data = GNUNET_STRINGS_data_to_string_alloc (&(member->id), 
sizeof(member->id));
+  char *id_data = GNUNET_STRINGS_data_to_string_alloc (&(member->id),
+                                                       sizeof(member->id));
 
   if (id_data)
   {
     GNUNET_CONFIGURATION_set_value_string (cfg, "member", "id", id_data);
 
-    GNUNET_free(id_data);
+    GNUNET_free (id_data);
   }
 
   GNUNET_CONFIGURATION_write (cfg, config_file);
   GNUNET_CONFIGURATION_destroy (cfg);
 
-  GNUNET_free(config_file);
+  GNUNET_free (config_file);
 
-  char* save_dir;
+  char *save_dir;
   GNUNET_asprintf (&save_dir, "%s%s%c", directory, "sessions", DIR_SEPARATOR);
 
   if ((GNUNET_YES == GNUNET_DISK_directory_test (save_dir, GNUNET_NO)) ||
       (GNUNET_OK == GNUNET_DISK_directory_create (save_dir)))
-    GNUNET_CONTAINER_multihashmap_iterate (member->sessions, 
iterate_save_session, save_dir);
+    GNUNET_CONTAINER_multihashmap_iterate (member->sessions,
+                                           iterate_save_session, save_dir);
 
-  GNUNET_free(save_dir);
+  GNUNET_free (save_dir);
 }
 
+
 static void
 sync_session_contact_from_next (struct GNUNET_MESSENGER_MemberSession *session,
                                 struct GNUNET_MESSENGER_MemberSession *next)
 {
-  GNUNET_assert((session) && (next));
+  GNUNET_assert ((session) && (next));
 
   if (session == next)
     return;
@@ -251,6 +272,7 @@ sync_session_contact_from_next (struct 
GNUNET_MESSENGER_MemberSession *session,
     session->contact = next->contact;
 }
 
+
 static int
 iterate_sync_session_contact (void *cls,
                               const struct GNUNET_HashCode *key,
@@ -264,14 +286,17 @@ iterate_sync_session_contact (void *cls,
   return GNUNET_YES;
 }
 
+
 void
 sync_member_contacts (struct GNUNET_MESSENGER_Member *member)
 {
   GNUNET_assert ((member) && (member->sessions));
 
-  GNUNET_CONTAINER_multihashmap_iterate (member->sessions, 
iterate_sync_session_contact, NULL);
+  GNUNET_CONTAINER_multihashmap_iterate (member->sessions,
+                                         iterate_sync_session_contact, NULL);
 }
 
+
 struct GNUNET_MESSENGER_MemberSession*
 get_member_session (const struct GNUNET_MESSENGER_Member *member,
                     const struct GNUNET_CRYPTO_PublicKey *public_key)
@@ -279,12 +304,14 @@ get_member_session (const struct GNUNET_MESSENGER_Member 
*member,
   GNUNET_assert ((member) && (public_key));
 
   struct GNUNET_HashCode hash;
-  GNUNET_CRYPTO_hash(public_key, sizeof(*public_key), &hash);
+  GNUNET_CRYPTO_hash (public_key, sizeof(*public_key), &hash);
 
-  return GNUNET_CONTAINER_multihashmap_get(member->sessions, &hash);
+  return GNUNET_CONTAINER_multihashmap_get (member->sessions, &hash);
 }
 
-struct GNUNET_MESSENGER_ClosureSearchSession {
+
+struct GNUNET_MESSENGER_ClosureSearchSession
+{
   const struct GNUNET_MESSENGER_Message *message;
   const struct GNUNET_HashCode *hash;
 
@@ -296,45 +323,48 @@ iterate_search_session (void *cls,
                         const struct GNUNET_HashCode *key,
                         void *value)
 {
-  struct GNUNET_MESSENGER_ClosureSearchSession* search = cls;
+  struct GNUNET_MESSENGER_ClosureSearchSession *search = cls;
   struct GNUNET_MESSENGER_MemberSession *session = value;
 
-  if (GNUNET_OK != verify_member_session_as_sender(session, search->message, 
search->hash))
+  if (GNUNET_OK != verify_member_session_as_sender (session, search->message,
+                                                    search->hash))
     return GNUNET_YES;
 
   search->match = session;
   return GNUNET_NO;
 }
 
+
 static struct GNUNET_MESSENGER_MemberSession*
 try_member_session (struct GNUNET_MESSENGER_Member *member,
                     const struct GNUNET_CRYPTO_PublicKey *public_key)
 {
-  struct GNUNET_MESSENGER_MemberSession* session = get_member_session(member, 
public_key);
+  struct GNUNET_MESSENGER_MemberSession *session = get_member_session (member,
+                                                                       
public_key);
 
   if (session)
     return session;
 
-  session = create_member_session(member, public_key);
+  session = create_member_session (member, public_key);
 
   if (session)
-    add_member_session(member, session);
+    add_member_session (member, session);
 
   return session;
 }
 
+
 struct GNUNET_MESSENGER_MemberSession*
 get_member_session_of (struct GNUNET_MESSENGER_Member *member,
                        const struct GNUNET_MESSENGER_Message *message,
                        const struct GNUNET_HashCode *hash)
 {
   GNUNET_assert ((member) && (message) && (hash) &&
-                 (0 == GNUNET_memcmp(&(member->id), 
&(message->header.sender_id))));
+                 (0 == GNUNET_memcmp (&(member->id),
+                                      &(message->header.sender_id))));
 
-  if (GNUNET_MESSENGER_KIND_INFO == message->header.kind)
-    return try_member_session(member, &(message->body.info.host_key));
-  else if (GNUNET_MESSENGER_KIND_JOIN == message->header.kind)
-    return try_member_session(member, &(message->body.join.key));
+  if (GNUNET_MESSENGER_KIND_JOIN == message->header.kind)
+    return try_member_session (member, &(message->body.join.key));
 
   struct GNUNET_MESSENGER_ClosureSearchSession search;
 
@@ -342,49 +372,59 @@ get_member_session_of (struct GNUNET_MESSENGER_Member 
*member,
   search.hash = hash;
 
   search.match = NULL;
-  GNUNET_CONTAINER_multihashmap_iterate(member->sessions, 
iterate_search_session, &search);
+  GNUNET_CONTAINER_multihashmap_iterate (member->sessions,
+                                         iterate_search_session, &search);
 
   return search.match;
 }
 
+
 void
 add_member_session (struct GNUNET_MESSENGER_Member *member,
                     struct GNUNET_MESSENGER_MemberSession *session)
 {
-  if (!session)
+  if (! session)
     return;
 
-  GNUNET_assert((member) && (session->member == member));
+  GNUNET_assert ((member) && (session->member == member));
 
-  const struct GNUNET_CRYPTO_PublicKey *public_key = 
get_member_session_public_key(session);
+  const struct GNUNET_CRYPTO_PublicKey *public_key =
+    get_member_session_public_key (session);
 
   struct GNUNET_HashCode hash;
-  GNUNET_CRYPTO_hash(public_key, sizeof(*public_key), &hash);
-
-  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(
-      member->sessions, &hash, session,
-      GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Adding a member session failed: 
%s\n",
-               GNUNET_h2s(&hash));
+  GNUNET_CRYPTO_hash (public_key, sizeof(*public_key), &hash);
+
+  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (
+        member->sessions, &hash, session,
+        GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Adding a member session failed: %s\n",
+                GNUNET_h2s (&hash));
 }
 
+
 void
 remove_member_session (struct GNUNET_MESSENGER_Member *member,
                        struct GNUNET_MESSENGER_MemberSession *session)
 {
   GNUNET_assert ((member) && (session) && (session->member == member));
 
-  const struct GNUNET_CRYPTO_PublicKey *public_key = 
get_member_session_public_key(session);
+  const struct GNUNET_CRYPTO_PublicKey *public_key =
+    get_member_session_public_key (session);
 
   struct GNUNET_HashCode hash;
-  GNUNET_CRYPTO_hash(public_key, sizeof(*public_key), &hash);
+  GNUNET_CRYPTO_hash (public_key, sizeof(*public_key), &hash);
 
-  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove(member->sessions, 
&hash, session))
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Removing a member session failed: 
%s\n",
-               GNUNET_h2s(&hash));
+  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (member->sessions,
+                                                          &hash, session))
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Removing a member session failed: %s\n",
+                GNUNET_h2s (&hash));
 }
 
-struct GNUNET_MESSENGER_ClosureIterateSessions {
+
+struct GNUNET_MESSENGER_ClosureIterateSessions
+{
   GNUNET_MESSENGER_MemberIteratorCallback it;
   void *cls;
 };
@@ -397,9 +437,11 @@ iterate_member_sessions_it (void *cls,
   struct GNUNET_MESSENGER_ClosureIterateSessions *iterate = cls;
   struct GNUNET_MESSENGER_MemberSession *session = value;
 
-  return iterate->it (iterate->cls, get_member_session_public_key(session), 
session);
+  return iterate->it (iterate->cls, get_member_session_public_key (session),
+                      session);
 }
 
+
 int
 iterate_member_sessions (struct GNUNET_MESSENGER_Member *member,
                          GNUNET_MESSENGER_MemberIteratorCallback it,
@@ -412,5 +454,7 @@ iterate_member_sessions (struct GNUNET_MESSENGER_Member 
*member,
   iterate.it = it;
   iterate.cls = cls;
 
-  return GNUNET_CONTAINER_multihashmap_iterate(member->sessions, 
iterate_member_sessions_it, &iterate);
+  return GNUNET_CONTAINER_multihashmap_iterate (member->sessions,
+                                                iterate_member_sessions_it,
+                                                &iterate);
 }
diff --git a/src/service/messenger/gnunet-service-messenger_member.h 
b/src/service/messenger/gnunet-service-messenger_member.h
index c06be1df7..e456554a6 100644
--- a/src/service/messenger/gnunet-service-messenger_member.h
+++ b/src/service/messenger/gnunet-service-messenger_member.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -175,6 +175,6 @@ remove_member_session (struct GNUNET_MESSENGER_Member 
*member,
 int
 iterate_member_sessions (struct GNUNET_MESSENGER_Member *member,
                          GNUNET_MESSENGER_MemberIteratorCallback it,
-                         void* cls);
+                         void *cls);
 
 #endif //GNUNET_SERVICE_MESSENGER_MEMBER_H
diff --git a/src/service/messenger/gnunet-service-messenger_member_session.c 
b/src/service/messenger/gnunet-service-messenger_member_session.c
index 8ae1244c4..8b369d2c4 100644
--- a/src/service/messenger/gnunet-service-messenger_member_session.c
+++ b/src/service/messenger/gnunet-service-messenger_member_session.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2021--2022 GNUnet e.V.
+   Copyright (C) 2021--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -35,44 +35,46 @@ struct GNUNET_MESSENGER_MemberSession*
 create_member_session (struct GNUNET_MESSENGER_Member *member,
                        const struct GNUNET_CRYPTO_PublicKey *pubkey)
 {
-  if ((!member) || (!pubkey) || (!(member->store)))
+  if ((! member) || (! pubkey) || (! (member->store)))
     return NULL;
 
-  struct GNUNET_MESSENGER_MemberSession *session = GNUNET_new(struct 
GNUNET_MESSENGER_MemberSession);
+  struct GNUNET_MESSENGER_MemberSession *session = GNUNET_new (struct
+                                                               
GNUNET_MESSENGER_MemberSession);
   session->member = member;
 
-  GNUNET_memcpy(&(session->public_key), pubkey, sizeof(session->public_key));
+  GNUNET_memcpy (&(session->public_key), pubkey, sizeof(session->public_key));
 
   get_context_from_member (
-      get_member_session_key (session),
-      get_member_session_id (session),
-      &(session->context)
-  );
+    get_member_session_key (session),
+    get_member_session_id (session),
+    &(session->context)
+    );
 
-  struct GNUNET_MESSENGER_ContactStore *store = 
get_member_contact_store(session->member->store);
+  struct GNUNET_MESSENGER_ContactStore *store = get_member_contact_store (
+    session->member->store);
 
-  session->contact = get_store_contact(
-      store,
-      get_member_session_context (session),
-      get_member_session_public_key (session)
-  );
+  session->contact = get_store_contact (
+    store,
+    get_member_session_context (session),
+    get_member_session_public_key (session)
+    );
 
-  if (!(session->contact))
+  if (! (session->contact))
   {
-    GNUNET_free(session);
+    GNUNET_free (session);
     return NULL;
   }
 
   increase_contact_rc (session->contact);
 
-  session->history = GNUNET_CONTAINER_multihashmap_create(8, GNUNET_NO);
+  session->history = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
 
-  init_list_messages(&(session->messages));
+  init_list_messages (&(session->messages));
 
   session->prev = NULL;
   session->next = NULL;
 
-  session->start = GNUNET_TIME_absolute_get();
+  session->start = GNUNET_TIME_absolute_get ();
 
   session->closed = GNUNET_NO;
   session->completed = GNUNET_NO;
@@ -80,32 +82,35 @@ create_member_session (struct GNUNET_MESSENGER_Member 
*member,
   return session;
 }
 
+
 static void
 check_member_session_completion (struct GNUNET_MESSENGER_MemberSession 
*session)
 {
   GNUNET_assert (session);
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Check session history (%s) for 
completion.\n",
-             GNUNET_sh2s(get_member_session_id(session)));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Check session history (%s) for completion.\n",
+              GNUNET_sh2s (get_member_session_id (session)));
 
-  if (!session->messages.tail)
+  if (! session->messages.tail)
   {
     session->completed = GNUNET_YES;
     goto completion;
   }
 
-  const struct GNUNET_HashCode* start = &(session->messages.head->hash);
-  const struct GNUNET_HashCode* end = &(session->messages.tail->hash);
+  const struct GNUNET_HashCode *start = &(session->messages.head->hash);
+  const struct GNUNET_HashCode *end = &(session->messages.tail->hash);
 
   struct GNUNET_MESSENGER_ListMessages level;
-  init_list_messages(&level);
+  init_list_messages (&level);
 
-  add_to_list_messages(&level, end);
+  add_to_list_messages (&level, end);
 
-  struct GNUNET_MESSENGER_MessageStore *store = 
get_srv_room_message_store(session->member->store->room);
+  struct GNUNET_MESSENGER_MessageStore *store = get_srv_room_message_store (
+    session->member->store->room);
 
   struct GNUNET_MESSENGER_ListMessages list;
-  init_list_messages(&list);
+  init_list_messages (&list);
 
   while (level.head)
   {
@@ -113,57 +118,61 @@ check_member_session_completion (struct 
GNUNET_MESSENGER_MemberSession *session)
 
     for (element = level.head; element; element = element->next)
     {
-      const struct GNUNET_MESSENGER_MessageLink *link = get_store_message_link(
-          store, &(element->hash), GNUNET_NO
-      );
+      const struct GNUNET_MESSENGER_MessageLink *link = get_store_message_link 
(
+        store, &(element->hash), GNUNET_NO
+        );
 
-      if (!link)
+      if (! link)
         continue;
 
-      add_to_list_messages(&list, &(link->first));
+      add_to_list_messages (&list, &(link->first));
 
       if (GNUNET_YES == link->multiple)
-        add_to_list_messages(&list, &(link->second));
+        add_to_list_messages (&list, &(link->second));
     }
 
-    clear_list_messages(&level);
+    clear_list_messages (&level);
 
     for (element = list.head; element; element = element->next)
-      if (GNUNET_YES == check_member_session_history(session, 
&(element->hash), GNUNET_YES))
+      if (GNUNET_YES == check_member_session_history (session, 
&(element->hash),
+                                                      GNUNET_YES))
         break;
 
     if (element)
-      if (0 != GNUNET_CRYPTO_hash_cmp(&(element->hash), start))
-        add_to_list_messages(&level, &(element->hash));
+      if (0 != GNUNET_CRYPTO_hash_cmp (&(element->hash), start))
+        add_to_list_messages (&level, &(element->hash));
       else
         session->completed = GNUNET_YES;
     else
-      copy_list_messages(&level, &list);
+      copy_list_messages (&level, &list);
 
-    clear_list_messages(&list);
+    clear_list_messages (&list);
   }
 
 completion:
-  if (GNUNET_YES == is_member_session_completed(session))
+  if (GNUNET_YES == is_member_session_completed (session))
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Completed session history (%s)\n",
-               GNUNET_sh2s(get_member_session_id(session)));
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Completed session history (%s)\n",
+                GNUNET_sh2s (get_member_session_id (session)));
 
     GNUNET_CONTAINER_multihashmap_clear (session->history);
 
-    struct GNUNET_MESSENGER_ContactStore *store = 
get_member_contact_store(session->member->store);
+    struct GNUNET_MESSENGER_ContactStore *store = get_member_contact_store (
+      session->member->store);
 
-    if ((session->contact) && (GNUNET_YES == decrease_contact_rc 
(session->contact)))
+    if ((session->contact) && (GNUNET_YES == decrease_contact_rc (
+                                 session->contact)))
       remove_store_contact (
-          store,
-          session->contact,
-          get_member_session_context(session)
-      );
+        store,
+        session->contact,
+        get_member_session_context (session)
+        );
 
     session->contact = NULL;
   }
 }
 
+
 static int
 iterate_copy_history (void *cls,
                       const struct GNUNET_HashCode *key,
@@ -171,73 +180,79 @@ iterate_copy_history (void *cls,
 {
   struct GNUNET_MESSENGER_MemberSession *next = cls;
 
-  GNUNET_CONTAINER_multihashmap_put(next->history, key, (value? next : NULL),
-                                    
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+  GNUNET_CONTAINER_multihashmap_put (next->history, key, (value? next : NULL),
+                                     
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
 
   return GNUNET_YES;
 }
 
+
 struct GNUNET_MESSENGER_MemberSession*
 switch_member_session (struct GNUNET_MESSENGER_MemberSession *session,
                        const struct GNUNET_MESSENGER_Message *message,
                        const struct GNUNET_HashCode *hash)
 {
-  if ((!session) || (!message) || (!hash))
+  if ((! session) || (! message) || (! hash))
     return NULL;
 
-  GNUNET_assert((GNUNET_MESSENGER_KIND_ID == message->header.kind) ||
-                (GNUNET_MESSENGER_KIND_KEY == message->header.kind));
+  GNUNET_assert ((GNUNET_MESSENGER_KIND_ID == message->header.kind) ||
+                 (GNUNET_MESSENGER_KIND_KEY == message->header.kind));
 
-  struct GNUNET_MESSENGER_MemberSession *next = GNUNET_new(struct 
GNUNET_MESSENGER_MemberSession);
+  struct GNUNET_MESSENGER_MemberSession *next = GNUNET_new (struct
+                                                            
GNUNET_MESSENGER_MemberSession);
 
   if (GNUNET_MESSENGER_KIND_ID == message->header.kind)
-    next->member = add_store_member(session->member->store, 
&(message->body.id.id));
+    next->member = add_store_member (session->member->store,
+                                     &(message->body.id.id));
   else
     next->member = session->member;
 
   if (GNUNET_MESSENGER_KIND_KEY == message->header.kind)
-    GNUNET_memcpy(&(next->public_key), &(message->body.key.key), 
sizeof(next->public_key));
+    GNUNET_memcpy (&(next->public_key), &(message->body.key.key),
+                   sizeof(next->public_key));
   else
-    GNUNET_memcpy(&(next->public_key), get_member_session_public_key(session), 
sizeof(next->public_key));
+    GNUNET_memcpy (&(next->public_key), get_member_session_public_key 
(session),
+                   sizeof(next->public_key));
 
   get_context_from_member (
-      get_member_session_key (next),
-      get_member_session_id (next),
-      &(next->context)
-  );
-
-  update_store_contact(
-      get_member_contact_store(next->member->store),
-      get_member_session_contact(session),
-      get_member_session_context(session),
-      get_member_session_context(next),
-      get_member_session_public_key(next)
-  );
-
-  next->contact = get_member_session_contact(session);
-
-  if (!(next->contact))
+    get_member_session_key (next),
+    get_member_session_id (next),
+    &(next->context)
+    );
+
+  update_store_contact (
+    get_member_contact_store (next->member->store),
+    get_member_session_contact (session),
+    get_member_session_context (session),
+    get_member_session_context (next),
+    get_member_session_public_key (next)
+    );
+
+  next->contact = get_member_session_contact (session);
+
+  if (! (next->contact))
   {
-    GNUNET_free(next);
+    GNUNET_free (next);
     return NULL;
   }
 
   increase_contact_rc (next->contact);
 
-  next->history = GNUNET_CONTAINER_multihashmap_create(
-      GNUNET_CONTAINER_multihashmap_size(session->history), GNUNET_NO
-  );
+  next->history = GNUNET_CONTAINER_multihashmap_create (
+    GNUNET_CONTAINER_multihashmap_size (session->history), GNUNET_NO
+    );
 
-  GNUNET_CONTAINER_multihashmap_iterate(session->history, 
iterate_copy_history, next);
+  GNUNET_CONTAINER_multihashmap_iterate (session->history, 
iterate_copy_history,
+                                         next);
 
-  init_list_messages(&(next->messages));
-  copy_list_messages(&(next->messages), &(session->messages));
+  init_list_messages (&(next->messages));
+  copy_list_messages (&(next->messages), &(session->messages));
 
   session->next = next;
   next->prev = session;
   next->next = NULL;
 
-  next->start = GNUNET_TIME_absolute_get();
+  next->start = GNUNET_TIME_absolute_get ();
 
   session->closed = GNUNET_YES;
   next->closed = GNUNET_NO;
@@ -248,8 +263,9 @@ switch_member_session (struct 
GNUNET_MESSENGER_MemberSession *session,
   return next;
 }
 
+
 void
-destroy_member_session(struct GNUNET_MESSENGER_MemberSession* session)
+destroy_member_session (struct GNUNET_MESSENGER_MemberSession *session)
 {
   GNUNET_assert (session);
 
@@ -257,32 +273,35 @@ destroy_member_session(struct 
GNUNET_MESSENGER_MemberSession* session)
 
   clear_list_messages (&(session->messages));
 
-  struct GNUNET_MESSENGER_Contact *contact = get_member_session_contact 
(session);
+  struct GNUNET_MESSENGER_Contact *contact = get_member_session_contact (
+    session);
 
   if ((contact) && (GNUNET_YES == decrease_contact_rc (contact)))
     remove_store_contact (
-        get_member_contact_store(session->member->store),
-        contact,
-        get_member_session_context(session)
-    );
+      get_member_contact_store (session->member->store),
+      contact,
+      get_member_session_context (session)
+      );
 
-  GNUNET_free(session);
+  GNUNET_free (session);
 }
 
+
 int
-reset_member_session (struct GNUNET_MESSENGER_MemberSession* session,
+reset_member_session (struct GNUNET_MESSENGER_MemberSession *session,
                       const struct GNUNET_HashCode *hash)
 {
   GNUNET_assert ((session) && (hash));
 
-  struct GNUNET_MESSENGER_ContactStore *store = 
get_member_contact_store(session->member->store);
-  struct GNUNET_MESSENGER_Contact *contact = get_store_contact(
-      store,
-      get_member_session_context (session),
-      get_member_session_public_key (session)
-  );
+  struct GNUNET_MESSENGER_ContactStore *store = get_member_contact_store (
+    session->member->store);
+  struct GNUNET_MESSENGER_Contact *contact = get_store_contact (
+    store,
+    get_member_session_context (session),
+    get_member_session_public_key (session)
+    );
 
-  if (!contact)
+  if (! contact)
     return GNUNET_SYSERR;
 
   if (contact == session->contact)
@@ -292,8 +311,8 @@ reset_member_session (struct 
GNUNET_MESSENGER_MemberSession* session,
   increase_contact_rc (session->contact);
 
 clear_messages:
-  clear_list_messages(&(session->messages));
-  add_to_list_messages(&(session->messages), hash);
+  clear_list_messages (&(session->messages));
+  add_to_list_messages (&(session->messages), hash);
 
   session->next = NULL;
   session->closed = GNUNET_NO;
@@ -302,8 +321,9 @@ clear_messages:
   return GNUNET_OK;
 }
 
+
 void
-close_member_session (struct GNUNET_MESSENGER_MemberSession* session)
+close_member_session (struct GNUNET_MESSENGER_MemberSession *session)
 {
   GNUNET_assert (session);
 
@@ -311,128 +331,158 @@ close_member_session (struct 
GNUNET_MESSENGER_MemberSession* session)
   check_member_session_completion (session);
 }
 
+
 int
-is_member_session_closed (const struct GNUNET_MESSENGER_MemberSession* session)
+is_member_session_closed (const struct GNUNET_MESSENGER_MemberSession *session)
 {
-  GNUNET_assert(session);
+  GNUNET_assert (session);
 
   return session->closed;
 }
 
+
 int
-is_member_session_completed (const struct GNUNET_MESSENGER_MemberSession* 
session)
+is_member_session_completed (const struct
+                             GNUNET_MESSENGER_MemberSession *session)
 {
-  GNUNET_assert(session);
+  GNUNET_assert (session);
 
   return session->completed;
 }
 
+
 struct GNUNET_TIME_Absolute
-get_member_session_start (const struct GNUNET_MESSENGER_MemberSession* session)
+get_member_session_start (const struct GNUNET_MESSENGER_MemberSession *session)
 {
-  GNUNET_assert(session);
+  GNUNET_assert (session);
 
   if (session->prev)
-    return get_member_session_start(session->prev);
+    return get_member_session_start (session->prev);
 
   return session->start;
 }
 
+
 const struct GNUNET_HashCode*
-get_member_session_key (const struct GNUNET_MESSENGER_MemberSession* session)
+get_member_session_key (const struct GNUNET_MESSENGER_MemberSession *session)
 {
-  GNUNET_assert((session) && (session->member));
+  GNUNET_assert ((session) && (session->member));
 
-  return get_member_store_key(session->member->store);
+  return get_member_store_key (session->member->store);
 }
 
+
 const struct GNUNET_ShortHashCode*
-get_member_session_id (const struct GNUNET_MESSENGER_MemberSession* session)
+get_member_session_id (const struct GNUNET_MESSENGER_MemberSession *session)
 {
-  GNUNET_assert(session);
+  GNUNET_assert (session);
 
-  return get_member_id(session->member);
+  return get_member_id (session->member);
 }
 
+
 const struct GNUNET_CRYPTO_PublicKey*
-get_member_session_public_key (const struct GNUNET_MESSENGER_MemberSession* 
session)
+get_member_session_public_key (const struct
+                               GNUNET_MESSENGER_MemberSession *session)
 {
-  GNUNET_assert(session);
+  GNUNET_assert (session);
 
   return &(session->public_key);
 }
 
+
 const struct GNUNET_HashCode*
-get_member_session_context (const struct GNUNET_MESSENGER_MemberSession* 
session)
+get_member_session_context (const struct
+                            GNUNET_MESSENGER_MemberSession *session)
 {
-  GNUNET_assert(session);
+  GNUNET_assert (session);
 
   return &(session->context);
 }
 
+
 struct GNUNET_MESSENGER_Contact*
-get_member_session_contact (struct GNUNET_MESSENGER_MemberSession* session)
+get_member_session_contact (struct GNUNET_MESSENGER_MemberSession *session)
 {
   GNUNET_assert (session);
 
   return session->contact;
 }
 
-int verify_member_session_as_sender (const struct 
GNUNET_MESSENGER_MemberSession *session,
-                                     const struct GNUNET_MESSENGER_Message 
*message,
-                                     const struct GNUNET_HashCode *hash)
+
+int
+verify_member_session_as_sender (const struct
+                                 GNUNET_MESSENGER_MemberSession *session,
+                                 const struct GNUNET_MESSENGER_Message 
*message,
+                                 const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((session) && (message) && (hash));
+  GNUNET_assert ((session) && (message) && (hash));
 
-  if (GNUNET_YES == is_member_session_completed(session))
+  if (GNUNET_YES == is_member_session_completed (session))
     return GNUNET_SYSERR;
 
-  if (0 != GNUNET_memcmp(get_member_session_id(session), 
&(message->header.sender_id)))
+  if (0 != GNUNET_memcmp (get_member_session_id (session),
+                          &(message->header.sender_id)))
     return GNUNET_SYSERR;
 
-  return verify_message(message, hash, get_member_session_public_key(session));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Check message (%s) using key: %s\n",
+              GNUNET_h2s (hash),
+              GNUNET_CRYPTO_public_key_to_string (
+                get_member_session_public_key (session)));
+
+  return verify_message (message, hash, get_member_session_public_key (
+                           session));
 }
 
+
 int
-check_member_session_history (const struct GNUNET_MESSENGER_MemberSession 
*session,
+check_member_session_history (const struct
+                              GNUNET_MESSENGER_MemberSession *session,
                               const struct GNUNET_HashCode *hash, int 
ownership)
 {
-  GNUNET_assert((session) && (hash));
+  GNUNET_assert ((session) && (hash));
 
   if (GNUNET_YES == ownership)
-    return (NULL != GNUNET_CONTAINER_multihashmap_get(session->history, hash)? 
GNUNET_YES : GNUNET_NO);
+    return (NULL != GNUNET_CONTAINER_multihashmap_get (session->history, hash)?
+            GNUNET_YES : GNUNET_NO);
   else
-    return GNUNET_CONTAINER_multihashmap_contains(session->history, hash);
+    return GNUNET_CONTAINER_multihashmap_contains (session->history, hash);
 }
 
+
 static void
 update_member_chain_history (struct GNUNET_MESSENGER_MemberSession *session,
                              const struct GNUNET_HashCode *hash, int ownership)
 {
   GNUNET_assert ((session) && (hash));
 
-  if ((GNUNET_OK == GNUNET_CONTAINER_multihashmap_put(session->history, hash, 
(GNUNET_YES == ownership? session : NULL),
-                                                      
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)) && (session->next))
+  if ((GNUNET_OK == GNUNET_CONTAINER_multihashmap_put (session->history, hash,
+                                                       (GNUNET_YES == 
ownership?
+                                                        session : NULL),
+                                                       
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+      && (session->next))
     update_member_chain_history (session->next, hash, ownership);
 }
 
+
 void
 update_member_session_history (struct GNUNET_MESSENGER_MemberSession *session,
                                const struct GNUNET_MESSENGER_Message *message,
                                const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((session) && (message) && (hash));
+  GNUNET_assert ((session) && (message) && (hash));
 
-  if (GNUNET_YES == is_member_session_completed(session))
+  if (GNUNET_YES == is_member_session_completed (session))
     return;
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Updating sessions history (%s) += 
(%s)\n",
-             GNUNET_sh2s(get_member_session_id(session)), GNUNET_h2s(hash));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Updating sessions history (%s) += (%s)\n",
+              GNUNET_sh2s (get_member_session_id (session)), GNUNET_h2s 
(hash));
 
   if (GNUNET_OK == verify_member_session_as_sender (session, message, hash))
   {
     if (GNUNET_YES == is_message_session_bound (message))
-      add_to_list_messages(&(session->messages), hash);
+      add_to_list_messages (&(session->messages), hash);
 
     update_member_chain_history (session, hash, GNUNET_YES);
   }
@@ -440,28 +490,32 @@ update_member_session_history (struct 
GNUNET_MESSENGER_MemberSession *session,
     update_member_chain_history (session, hash, GNUNET_NO);
 
   if (GNUNET_YES == session->closed)
-    check_member_session_completion(session);
+    check_member_session_completion (session);
 }
 
+
 static void
 clear_member_chain_history (struct GNUNET_MESSENGER_MemberSession *session,
                             const struct GNUNET_HashCode *hash)
 {
   GNUNET_assert ((session) && (hash));
 
-  if ((0 < GNUNET_CONTAINER_multihashmap_remove_all(session->history, hash)) 
&& (session->next))
-    clear_member_session_history(session->next, hash);
+  if ((0 < GNUNET_CONTAINER_multihashmap_remove_all (session->history, hash)) 
&&
+      (session->next))
+    clear_member_session_history (session->next, hash);
 }
 
+
 void
 clear_member_session_history (struct GNUNET_MESSENGER_MemberSession *session,
                               const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((session) && (hash));
+  GNUNET_assert ((session) && (hash));
 
   clear_member_chain_history (session, hash);
 }
 
+
 struct GNUNET_MESSENGER_MemberSessionHistoryEntry
 {
   struct GNUNET_HashCode hash;
@@ -472,21 +526,22 @@ static void
 load_member_session_history (struct GNUNET_MESSENGER_MemberSession *session,
                              const char *path)
 {
-  GNUNET_assert((session) && (path));
+  GNUNET_assert ((session) && (path));
 
   if (GNUNET_YES != GNUNET_DISK_file_test (path))
     return;
 
-  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ 
| GNUNET_DISK_PERM_USER_WRITE);
+  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
+                                                   | 
GNUNET_DISK_PERM_USER_WRITE);
 
-  struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open(
-      path, GNUNET_DISK_OPEN_READ, permission
-  );
+  struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open (
+    path, GNUNET_DISK_OPEN_READ, permission
+    );
 
-  if (!handle)
+  if (! handle)
     return;
 
-  GNUNET_DISK_file_seek(handle, 0, GNUNET_DISK_SEEK_SET);
+  GNUNET_DISK_file_seek (handle, 0, GNUNET_DISK_SEEK_SET);
 
   struct GNUNET_MESSENGER_MemberSessionHistoryEntry entry;
   ssize_t len;
@@ -494,23 +549,27 @@ load_member_session_history (struct 
GNUNET_MESSENGER_MemberSession *session,
   int status;
 
   do {
-    len = GNUNET_DISK_file_read(handle, &(entry.hash), sizeof(entry.hash));
+    len = GNUNET_DISK_file_read (handle, &(entry.hash), sizeof(entry.hash));
 
     if (len != sizeof(entry.hash))
       break;
 
-    len = GNUNET_DISK_file_read(handle, &(entry.ownership), 
sizeof(entry.ownership));
+    len = GNUNET_DISK_file_read (handle, &(entry.ownership),
+                                 sizeof(entry.ownership));
 
     if (len != sizeof(entry.ownership))
       break;
 
-    status = GNUNET_CONTAINER_multihashmap_put(session->history, 
&(entry.hash), (entry.ownership? session : NULL),
-                                               
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+    status = GNUNET_CONTAINER_multihashmap_put (session->history, 
&(entry.hash),
+                                                (entry.ownership? session :
+                                                 NULL),
+                                                
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
   } while (status == GNUNET_OK);
 
-  GNUNET_DISK_file_close(handle);
+  GNUNET_DISK_file_close (handle);
 }
 
+
 void
 load_member_session (struct GNUNET_MESSENGER_Member *member,
                      const char *directory)
@@ -525,7 +584,8 @@ load_member_session (struct GNUNET_MESSENGER_Member *member,
   if (GNUNET_YES != GNUNET_DISK_file_test (config_file))
     goto free_config;
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load session configuration of member: 
%s\n", config_file);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Load session configuration of member: %s\n", config_file);
 
   struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
 
@@ -533,61 +593,71 @@ load_member_session (struct GNUNET_MESSENGER_Member 
*member,
   {
     char *key_data;
 
-    if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(cfg, "session", 
"key", &key_data))
+    if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (cfg, "session",
+                                                            "key", &key_data))
       goto destroy_config;
 
     struct GNUNET_CRYPTO_PublicKey key;
 
-    enum GNUNET_GenericReturnValue key_return = 
GNUNET_CRYPTO_public_key_from_string(key_data, &key);
+    enum GNUNET_GenericReturnValue key_return =
+      GNUNET_CRYPTO_public_key_from_string (key_data, &key);
 
-    GNUNET_free(key_data);
+    GNUNET_free (key_data);
 
     if (GNUNET_OK != key_return)
       goto destroy_config;
 
-    session = create_member_session(member, &key);
+    session = create_member_session (member, &key);
 
     unsigned long long numeric_value;
 
-    if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number(cfg, "session", 
"start", &numeric_value))
+    if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (cfg, "session",
+                                                            "start",
+                                                            &numeric_value))
       session->start.abs_value_us = numeric_value;
 
-    if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number(cfg, "session", 
"closed", &numeric_value))
+    if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (cfg, "session",
+                                                            "closed",
+                                                            &numeric_value))
       session->closed = (GNUNET_YES == numeric_value? GNUNET_YES : GNUNET_NO);
 
-    if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number(cfg, "session", 
"completed", &numeric_value))
-      session->completed = (GNUNET_YES == numeric_value? GNUNET_YES : 
GNUNET_NO);
+    if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (cfg, "session",
+                                                            "completed",
+                                                            &numeric_value))
+      session->completed = (GNUNET_YES == numeric_value? GNUNET_YES :
+                            GNUNET_NO);
   }
 
 destroy_config:
   GNUNET_CONFIGURATION_destroy (cfg);
 
 free_config:
-  GNUNET_free(config_file);
+  GNUNET_free (config_file);
 
-  if (!session)
+  if (! session)
     return;
 
   char *history_file;
   GNUNET_asprintf (&history_file, "%s%s", directory, "history.map");
 
   load_member_session_history (session, history_file);
-  GNUNET_free(history_file);
+  GNUNET_free (history_file);
 
   char *messages_file;
   GNUNET_asprintf (&messages_file, "%s%s", directory, "messages.list");
 
-  load_list_messages(&(session->messages), messages_file);
-  GNUNET_free(messages_file);
+  load_list_messages (&(session->messages), messages_file);
+  GNUNET_free (messages_file);
 
-  add_member_session(member, session);
+  add_member_session (member, session);
 }
 
+
 static struct GNUNET_MESSENGER_MemberSession*
 get_cycle_safe_next_session (struct GNUNET_MESSENGER_MemberSession *session,
                              struct GNUNET_MESSENGER_MemberSession *next)
 {
-  if (!next)
+  if (! next)
     return NULL;
 
   struct GNUNET_MESSENGER_MemberSession *check = next;
@@ -602,6 +672,7 @@ get_cycle_safe_next_session (struct 
GNUNET_MESSENGER_MemberSession *session,
   return next;
 }
 
+
 void
 load_member_session_next (struct GNUNET_MESSENGER_MemberSession *session,
                           const char *directory)
@@ -614,7 +685,8 @@ load_member_session_next (struct 
GNUNET_MESSENGER_MemberSession *session,
   if (GNUNET_YES != GNUNET_DISK_file_test (config_file))
     goto free_config;
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load next session configuration of 
member: %s\n", config_file);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Load next session configuration of member: %s\n", config_file);
 
   struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
 
@@ -622,28 +694,33 @@ load_member_session_next (struct 
GNUNET_MESSENGER_MemberSession *session,
   {
     char *key_data;
 
-    if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(cfg, "session", 
"next_key", &key_data))
+    if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (cfg, "session",
+                                                            "next_key",
+                                                            &key_data))
       goto destroy_config;
 
     struct GNUNET_CRYPTO_PublicKey next_key;
 
-    enum GNUNET_GenericReturnValue key_return = 
GNUNET_CRYPTO_public_key_from_string(key_data, &next_key);
+    enum GNUNET_GenericReturnValue key_return =
+      GNUNET_CRYPTO_public_key_from_string (key_data, &next_key);
 
-    GNUNET_free(key_data);
+    GNUNET_free (key_data);
 
     if (GNUNET_OK != key_return)
       goto destroy_config;
 
     struct GNUNET_ShortHashCode next_id;
 
-    if (GNUNET_OK != GNUNET_CONFIGURATION_get_data (cfg, "session", "next_id", 
&next_id, sizeof(next_id)))
+    if (GNUNET_OK != GNUNET_CONFIGURATION_get_data (cfg, "session", "next_id",
+                                                    &next_id, sizeof(next_id)))
       goto destroy_config;
 
-    struct GNUNET_MESSENGER_Member *member = 
get_store_member(session->member->store, &next_id);
+    struct GNUNET_MESSENGER_Member *member = get_store_member (
+      session->member->store, &next_id);
 
-    session->next = get_cycle_safe_next_session(
-        session, member? get_member_session (member, &next_key) : NULL
-    );
+    session->next = get_cycle_safe_next_session (
+      session, member? get_member_session (member, &next_key) : NULL
+      );
 
     if (session->next)
       session->next->prev = session;
@@ -653,9 +730,10 @@ destroy_config:
   GNUNET_CONFIGURATION_destroy (cfg);
 
 free_config:
-  GNUNET_free(config_file);
+  GNUNET_free (config_file);
 }
 
+
 static int
 iterate_save_member_session_history_hentries (void *cls,
                                               const struct GNUNET_HashCode 
*key,
@@ -664,39 +742,42 @@ iterate_save_member_session_history_hentries (void *cls,
   struct GNUNET_DISK_FileHandle *handle = cls;
   unsigned char ownership = value? GNUNET_YES : GNUNET_NO;
 
-  GNUNET_DISK_file_write(handle, key, sizeof(*key));
-  GNUNET_DISK_file_write(handle, &ownership, sizeof(ownership));
+  GNUNET_DISK_file_write (handle, key, sizeof(*key));
+  GNUNET_DISK_file_write (handle, &ownership, sizeof(ownership));
 
   return GNUNET_YES;
 }
 
+
 static void
 save_member_session_history (struct GNUNET_MESSENGER_MemberSession *session,
                              const char *path)
 {
-  GNUNET_assert((session) && (path));
+  GNUNET_assert ((session) && (path));
 
-  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ 
| GNUNET_DISK_PERM_USER_WRITE);
+  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
+                                                   | 
GNUNET_DISK_PERM_USER_WRITE);
 
-  struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open(
-      path, GNUNET_DISK_OPEN_CREATE | GNUNET_DISK_OPEN_WRITE, permission
-  );
+  struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open (
+    path, GNUNET_DISK_OPEN_CREATE | GNUNET_DISK_OPEN_WRITE, permission
+    );
 
-  if (!handle)
+  if (! handle)
     return;
 
-  GNUNET_DISK_file_seek(handle, 0, GNUNET_DISK_SEEK_SET);
+  GNUNET_DISK_file_seek (handle, 0, GNUNET_DISK_SEEK_SET);
 
-  GNUNET_CONTAINER_multihashmap_iterate(
-      session->history,
-      iterate_save_member_session_history_hentries,
-      handle
-  );
+  GNUNET_CONTAINER_multihashmap_iterate (
+    session->history,
+    iterate_save_member_session_history_hentries,
+    handle
+    );
 
-  GNUNET_DISK_file_sync(handle);
-  GNUNET_DISK_file_close(handle);
+  GNUNET_DISK_file_sync (handle);
+  GNUNET_DISK_file_close (handle);
 }
 
+
 void
 save_member_session (struct GNUNET_MESSENGER_MemberSession *session,
                      const char *directory)
@@ -706,61 +787,71 @@ save_member_session (struct 
GNUNET_MESSENGER_MemberSession *session,
   char *config_file;
   GNUNET_asprintf (&config_file, "%s%s", directory, "session.cfg");
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Save session configuration of member: 
%s\n", config_file);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Save session configuration of member: %s\n", config_file);
 
   struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
 
-  char *key_data = 
GNUNET_CRYPTO_public_key_to_string(get_member_session_public_key(session));
+  char *key_data = GNUNET_CRYPTO_public_key_to_string (
+    get_member_session_public_key (session));
 
   if (key_data)
   {
     GNUNET_CONFIGURATION_set_value_string (cfg, "session", "key", key_data);
 
-    GNUNET_free(key_data);
+    GNUNET_free (key_data);
   }
 
   if (session->next)
   {
-    const struct GNUNET_ShortHashCode *next_id = 
get_member_session_id(session->next);
+    const struct GNUNET_ShortHashCode *next_id = get_member_session_id (
+      session->next);
 
-    char *next_id_data = GNUNET_STRINGS_data_to_string_alloc (next_id, 
sizeof(*next_id));
+    char *next_id_data = GNUNET_STRINGS_data_to_string_alloc (next_id,
+                                                              
sizeof(*next_id));
 
     if (next_id_data)
     {
-      GNUNET_CONFIGURATION_set_value_string (cfg, "session", "next_id", 
next_id_data);
+      GNUNET_CONFIGURATION_set_value_string (cfg, "session", "next_id",
+                                             next_id_data);
 
-      GNUNET_free(next_id_data);
+      GNUNET_free (next_id_data);
     }
 
-    key_data = 
GNUNET_CRYPTO_public_key_to_string(get_member_session_public_key(session->next));
+    key_data = GNUNET_CRYPTO_public_key_to_string (
+      get_member_session_public_key (session->next));
 
     if (key_data)
     {
-      GNUNET_CONFIGURATION_set_value_string (cfg, "session", "next_key", 
key_data);
+      GNUNET_CONFIGURATION_set_value_string (cfg, "session", "next_key",
+                                             key_data);
 
-      GNUNET_free(key_data);
+      GNUNET_free (key_data);
     }
   }
 
-  GNUNET_CONFIGURATION_set_value_number(cfg, "session", "start", 
session->start.abs_value_us);
+  GNUNET_CONFIGURATION_set_value_number (cfg, "session", "start",
+                                         session->start.abs_value_us);
 
-  GNUNET_CONFIGURATION_set_value_number (cfg, "session", "closed", 
session->closed);
-  GNUNET_CONFIGURATION_set_value_number (cfg, "session", "completed", 
session->completed);
+  GNUNET_CONFIGURATION_set_value_number (cfg, "session", "closed",
+                                         session->closed);
+  GNUNET_CONFIGURATION_set_value_number (cfg, "session", "completed",
+                                         session->completed);
 
   GNUNET_CONFIGURATION_write (cfg, config_file);
   GNUNET_CONFIGURATION_destroy (cfg);
 
-  GNUNET_free(config_file);
+  GNUNET_free (config_file);
 
   char *history_file;
   GNUNET_asprintf (&history_file, "%s%s", directory, "history.map");
 
   save_member_session_history (session, history_file);
-  GNUNET_free(history_file);
+  GNUNET_free (history_file);
 
   char *messages_file;
   GNUNET_asprintf (&messages_file, "%s%s", directory, "messages.list");
 
-  save_list_messages(&(session->messages), messages_file);
-  GNUNET_free(messages_file);
+  save_list_messages (&(session->messages), messages_file);
+  GNUNET_free (messages_file);
 }
diff --git a/src/service/messenger/gnunet-service-messenger_member_session.h 
b/src/service/messenger/gnunet-service-messenger_member_session.h
index fad1ab041..a039cc781 100644
--- a/src/service/messenger/gnunet-service-messenger_member_session.h
+++ b/src/service/messenger/gnunet-service-messenger_member_session.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2021 GNUnet e.V.
+   Copyright (C) 2021, 2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -35,7 +35,8 @@
 
 #include "messenger_api_contact.h"
 
-struct GNUNET_MESSENGER_MemberSession {
+struct GNUNET_MESSENGER_MemberSession
+{
   struct GNUNET_MESSENGER_Member *member;
 
   struct GNUNET_CRYPTO_PublicKey public_key;
@@ -46,8 +47,8 @@ struct GNUNET_MESSENGER_MemberSession {
   struct GNUNET_CONTAINER_MultiHashMap *history;
   struct GNUNET_MESSENGER_ListMessages messages;
 
-  struct GNUNET_MESSENGER_MemberSession* prev;
-  struct GNUNET_MESSENGER_MemberSession* next;
+  struct GNUNET_MESSENGER_MemberSession *prev;
+  struct GNUNET_MESSENGER_MemberSession *next;
 
   struct GNUNET_TIME_Absolute start;
 
@@ -92,7 +93,7 @@ switch_member_session (struct GNUNET_MESSENGER_MemberSession 
*session,
  * @param[in,out] session Member session
  */
 void
-destroy_member_session(struct GNUNET_MESSENGER_MemberSession* session);
+destroy_member_session (struct GNUNET_MESSENGER_MemberSession *session);
 
 /**
  * Resets a given member <i>session</i> which re-opens a member
@@ -105,7 +106,7 @@ destroy_member_session(struct 
GNUNET_MESSENGER_MemberSession* session);
  * @return #GNUNET_OK on success, #GNUNET_SYSERR otherwise
  */
 int
-reset_member_session (struct GNUNET_MESSENGER_MemberSession* session,
+reset_member_session (struct GNUNET_MESSENGER_MemberSession *session,
                       const struct GNUNET_HashCode *hash);
 
 /**
@@ -118,7 +119,7 @@ reset_member_session (struct 
GNUNET_MESSENGER_MemberSession* session,
  * @param[in,out] session Member session
  */
 void
-close_member_session (struct GNUNET_MESSENGER_MemberSession* session);
+close_member_session (struct GNUNET_MESSENGER_MemberSession *session);
 
 /**
  * Returns if the given member <i>session</i> has been closed.
@@ -127,7 +128,7 @@ close_member_session (struct 
GNUNET_MESSENGER_MemberSession* session);
  * @return #GNUNET_YES or #GNUNET_NO
  */
 int
-is_member_session_closed (const struct GNUNET_MESSENGER_MemberSession* 
session);
+is_member_session_closed (const struct GNUNET_MESSENGER_MemberSession 
*session);
 
 /**
  * Returns if the given member <i>session</i> has been completed.
@@ -139,7 +140,8 @@ is_member_session_closed (const struct 
GNUNET_MESSENGER_MemberSession* session);
  * @return #GNUNET_YES or #GNUNET_NO
  */
 int
-is_member_session_completed (const struct GNUNET_MESSENGER_MemberSession* 
session);
+is_member_session_completed (const struct
+                             GNUNET_MESSENGER_MemberSession *session);
 
 /**
  * Returns the timestamp of the member <i>session</i>'s start.
@@ -148,7 +150,7 @@ is_member_session_completed (const struct 
GNUNET_MESSENGER_MemberSession* sessio
  * @return Absolute timestamp
  */
 struct GNUNET_TIME_Absolute
-get_member_session_start (const struct GNUNET_MESSENGER_MemberSession* 
session);
+get_member_session_start (const struct GNUNET_MESSENGER_MemberSession 
*session);
 
 /**
  * Returns the key of the room a given member <i>session</i> belongs to.
@@ -157,7 +159,7 @@ get_member_session_start (const struct 
GNUNET_MESSENGER_MemberSession* session);
  * @return Key of room
  */
 const struct GNUNET_HashCode*
-get_member_session_key (const struct GNUNET_MESSENGER_MemberSession* session);
+get_member_session_key (const struct GNUNET_MESSENGER_MemberSession *session);
 
 /**
  * Returns the member id of a given member <i>session</i>.
@@ -166,7 +168,7 @@ get_member_session_key (const struct 
GNUNET_MESSENGER_MemberSession* session);
  * @return Member id
  */
 const struct GNUNET_ShortHashCode*
-get_member_session_id (const struct GNUNET_MESSENGER_MemberSession* session);
+get_member_session_id (const struct GNUNET_MESSENGER_MemberSession *session);
 
 /**
  * Returns the public key from an EGO of a given member <i>session</i>.
@@ -175,7 +177,8 @@ get_member_session_id (const struct 
GNUNET_MESSENGER_MemberSession* session);
  * @return Public key of EGO
  */
 const struct GNUNET_CRYPTO_PublicKey*
-get_member_session_public_key (const struct GNUNET_MESSENGER_MemberSession* 
session);
+get_member_session_public_key (const struct
+                               GNUNET_MESSENGER_MemberSession *session);
 
 /**
  * Returns the member context of a given member <i>session</i>.
@@ -184,7 +187,8 @@ get_member_session_public_key (const struct 
GNUNET_MESSENGER_MemberSession* sess
  * @return Member context as hash
  */
 const struct GNUNET_HashCode*
-get_member_session_context (const struct GNUNET_MESSENGER_MemberSession* 
session);
+get_member_session_context (const struct
+                            GNUNET_MESSENGER_MemberSession *session);
 
 /**
  * Returns the contact which is connected to a given member <i>session</i>.
@@ -193,7 +197,7 @@ get_member_session_context (const struct 
GNUNET_MESSENGER_MemberSession* session
  * @return Contact
  */
 struct GNUNET_MESSENGER_Contact*
-get_member_session_contact (struct GNUNET_MESSENGER_MemberSession* session);
+get_member_session_contact (struct GNUNET_MESSENGER_MemberSession *session);
 
 /**
  * Verifies a given member <i>session</i> as sender of a selected 
<i>message</i> and
@@ -208,7 +212,8 @@ get_member_session_contact (struct 
GNUNET_MESSENGER_MemberSession* session);
  * @return #GNUNET_OK on success, otherwise #GNUNET_SYSERR
  */
 int
-verify_member_session_as_sender (const struct GNUNET_MESSENGER_MemberSession 
*session,
+verify_member_session_as_sender (const struct
+                                 GNUNET_MESSENGER_MemberSession *session,
                                  const struct GNUNET_MESSENGER_Message 
*message,
                                  const struct GNUNET_HashCode *hash);
 
@@ -223,7 +228,8 @@ verify_member_session_as_sender (const struct 
GNUNET_MESSENGER_MemberSession *se
  * @return #GNUNET_YES if found, otherwise #GNUNET_NO
  */
 int
-check_member_session_history (const struct GNUNET_MESSENGER_MemberSession 
*session,
+check_member_session_history (const struct
+                              GNUNET_MESSENGER_MemberSession *session,
                               const struct GNUNET_HashCode *hash,
                               int ownership);
 
diff --git a/src/service/messenger/gnunet-service-messenger_member_store.c 
b/src/service/messenger/gnunet-service-messenger_member_store.c
index fc28babc4..e7876b382 100644
--- a/src/service/messenger/gnunet-service-messenger_member_store.c
+++ b/src/service/messenger/gnunet-service-messenger_member_store.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2022 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -37,25 +37,28 @@ init_member_store (struct GNUNET_MESSENGER_MemberStore 
*store,
   GNUNET_assert ((store) && (room));
 
   store->room = room;
-  store->members = GNUNET_CONTAINER_multishortmap_create(8, GNUNET_NO);
+  store->members = GNUNET_CONTAINER_multishortmap_create (8, GNUNET_NO);
 }
 
+
 static int
 iterate_destroy_members (void *cls,
                          const struct GNUNET_ShortHashCode *key,
                          void *value)
 {
   struct GNUNET_MESSENGER_Member *member = value;
-  destroy_member(member);
+  destroy_member (member);
   return GNUNET_YES;
 }
 
+
 void
 clear_member_store (struct GNUNET_MESSENGER_MemberStore *store)
 {
   GNUNET_assert ((store) && (store->members));
 
-  GNUNET_CONTAINER_multishortmap_iterate (store->members, 
iterate_destroy_members, NULL);
+  GNUNET_CONTAINER_multishortmap_iterate (store->members,
+                                          iterate_destroy_members, NULL);
   GNUNET_CONTAINER_multishortmap_destroy (store->members);
 }
 
@@ -67,17 +70,20 @@ get_member_contact_store (struct 
GNUNET_MESSENGER_MemberStore *store)
 
   struct GNUNET_MESSENGER_SrvRoom *room = store->room;
 
-  return get_service_contact_store(room->service);
+  return get_service_contact_store (room->service);
 }
 
+
 const struct GNUNET_HashCode*
 get_member_store_key (const struct GNUNET_MESSENGER_MemberStore *store)
 {
   GNUNET_assert (store);
 
-  return get_srv_room_key((const struct GNUNET_MESSENGER_SrvRoom*) 
store->room);
+  return get_srv_room_key ((const struct
+                            GNUNET_MESSENGER_SrvRoom*) store->room);
 }
 
+
 static int
 callback_scan_for_members (void *cls,
                            const char *filename)
@@ -90,14 +96,15 @@ callback_scan_for_members (void *cls,
 
     GNUNET_asprintf (&directory, "%s%c", filename, DIR_SEPARATOR);
 
-    load_member(store, directory);
+    load_member (store, directory);
 
-    GNUNET_free(directory);
+    GNUNET_free (directory);
   }
 
   return GNUNET_OK;
 }
 
+
 static int
 iterate_load_next_member_sessions (void *cls,
                                    const struct GNUNET_ShortHashCode *id,
@@ -107,19 +114,21 @@ iterate_load_next_member_sessions (void *cls,
 
   struct GNUNET_MESSENGER_Member *member = value;
 
-  if (!member)
+  if (! member)
     return GNUNET_YES;
 
   char *member_dir;
-  GNUNET_asprintf (&member_dir, "%s%s%c", sync_dir, GNUNET_sh2s(id), 
DIR_SEPARATOR);
+  GNUNET_asprintf (&member_dir, "%s%s%c", sync_dir, GNUNET_sh2s (id),
+                   DIR_SEPARATOR);
 
   if (GNUNET_YES == GNUNET_DISK_directory_test (member_dir, GNUNET_YES))
     load_member_next_sessions (member, member_dir);
 
-  GNUNET_free(member_dir);
+  GNUNET_free (member_dir);
   return GNUNET_YES;
 }
 
+
 static int
 iterate_sync_member_contacts (void *cls,
                               const struct GNUNET_ShortHashCode *id,
@@ -127,13 +136,14 @@ iterate_sync_member_contacts (void *cls,
 {
   struct GNUNET_MESSENGER_Member *member = value;
 
-  if (!member)
+  if (! member)
     return GNUNET_YES;
 
   sync_member_contacts (member);
   return GNUNET_YES;
 }
 
+
 void
 load_member_store (struct GNUNET_MESSENGER_MemberStore *store,
                    const char *directory)
@@ -146,12 +156,16 @@ load_member_store (struct GNUNET_MESSENGER_MemberStore 
*store,
   if (GNUNET_OK == GNUNET_DISK_directory_test (scan_dir, GNUNET_YES))
     GNUNET_DISK_directory_scan (scan_dir, callback_scan_for_members, store);
 
-  GNUNET_CONTAINER_multishortmap_iterate(store->members, 
iterate_load_next_member_sessions, scan_dir);
-  GNUNET_CONTAINER_multishortmap_iterate(store->members, 
iterate_sync_member_contacts, NULL);
+  GNUNET_CONTAINER_multishortmap_iterate (store->members,
+                                          iterate_load_next_member_sessions,
+                                          scan_dir);
+  GNUNET_CONTAINER_multishortmap_iterate (store->members,
+                                          iterate_sync_member_contacts, NULL);
 
-  GNUNET_free(scan_dir);
+  GNUNET_free (scan_dir);
 }
 
+
 static int
 iterate_save_members (void *cls,
                       const struct GNUNET_ShortHashCode *id,
@@ -161,36 +175,40 @@ iterate_save_members (void *cls,
 
   struct GNUNET_MESSENGER_Member *member = value;
 
-  if (!member)
+  if (! member)
     return GNUNET_YES;
 
   char *member_dir;
-  GNUNET_asprintf (&member_dir, "%s%s%c", save_dir, GNUNET_sh2s(id), 
DIR_SEPARATOR);
+  GNUNET_asprintf (&member_dir, "%s%s%c", save_dir, GNUNET_sh2s (id),
+                   DIR_SEPARATOR);
 
   if ((GNUNET_YES == GNUNET_DISK_directory_test (member_dir, GNUNET_NO)) ||
       (GNUNET_OK == GNUNET_DISK_directory_create (member_dir)))
-    save_member(member, member_dir);
+    save_member (member, member_dir);
 
-  GNUNET_free(member_dir);
+  GNUNET_free (member_dir);
   return GNUNET_YES;
 }
 
+
 void
 save_member_store (struct GNUNET_MESSENGER_MemberStore *store,
                    const char *directory)
 {
   GNUNET_assert ((store) && (directory));
 
-  char* save_dir;
+  char *save_dir;
   GNUNET_asprintf (&save_dir, "%s%s%c", directory, "members", DIR_SEPARATOR);
 
   if ((GNUNET_YES == GNUNET_DISK_directory_test (save_dir, GNUNET_NO)) ||
       (GNUNET_OK == GNUNET_DISK_directory_create (save_dir)))
-    GNUNET_CONTAINER_multishortmap_iterate(store->members, 
iterate_save_members, save_dir);
+    GNUNET_CONTAINER_multishortmap_iterate (store->members,
+                                            iterate_save_members, save_dir);
 
-  GNUNET_free(save_dir);
+  GNUNET_free (save_dir);
 }
 
+
 struct GNUNET_MESSENGER_Member*
 get_store_member (const struct GNUNET_MESSENGER_MemberStore *store,
                   const struct GNUNET_ShortHashCode *id)
@@ -200,44 +218,55 @@ get_store_member (const struct 
GNUNET_MESSENGER_MemberStore *store,
   return GNUNET_CONTAINER_multishortmap_get (store->members, id);
 }
 
+
 struct GNUNET_MESSENGER_Member*
 get_store_member_of (struct GNUNET_MESSENGER_MemberStore *store,
                      const struct GNUNET_MESSENGER_Message *message)
 {
-  if ((GNUNET_MESSENGER_KIND_INFO == message->header.kind) ||
-      (GNUNET_MESSENGER_KIND_JOIN == message->header.kind))
-    return add_store_member(store, &(message->header.sender_id));
+  GNUNET_assert ((store) && (message));
+
+  if (GNUNET_YES == is_peer_message (message))
+    return NULL;
+
+  if (GNUNET_MESSENGER_KIND_JOIN == message->header.kind)
+    return add_store_member (store, &(message->header.sender_id));
   else
-    return get_store_member(store, &(message->header.sender_id));
+    return get_store_member (store, &(message->header.sender_id));
 }
 
+
 struct GNUNET_MESSENGER_Member*
 add_store_member (struct GNUNET_MESSENGER_MemberStore *store,
                   const struct GNUNET_ShortHashCode *id)
 {
   GNUNET_assert ((store) && (store->members));
 
-  struct GNUNET_MESSENGER_Member *member = id? get_store_member(store, id) : 
NULL;
+  struct GNUNET_MESSENGER_Member *member = id? get_store_member (store, id) :
+                                           NULL;
 
   if (member)
     return member;
 
-  member = create_member(store, id);
+  member = create_member (store, id);
 
-  if (!member)
+  if (! member)
     return NULL;
 
-  if (GNUNET_OK != GNUNET_CONTAINER_multishortmap_put (store->members, 
get_member_id(member), member,
+  if (GNUNET_OK != GNUNET_CONTAINER_multishortmap_put (store->members,
+                                                       get_member_id (member),
+                                                       member,
                                                        
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
   {
-    destroy_member(member);
+    destroy_member (member);
     return NULL;
   }
 
   return member;
 }
 
-struct GNUNET_MESSENGER_ClosureIterateMembers {
+
+struct GNUNET_MESSENGER_ClosureIterateMembers
+{
   GNUNET_MESSENGER_MemberIteratorCallback it;
   void *cls;
 };
@@ -250,13 +279,14 @@ iterate_store_members_it (void *cls,
   struct GNUNET_MESSENGER_ClosureIterateMembers *iterate = cls;
   struct GNUNET_MESSENGER_Member *member = value;
 
-  return iterate_member_sessions(member, iterate->it, iterate->cls);
+  return iterate_member_sessions (member, iterate->it, iterate->cls);
 }
 
+
 int
 iterate_store_members (struct GNUNET_MESSENGER_MemberStore *store,
                        GNUNET_MESSENGER_MemberIteratorCallback it,
-                       void* cls)
+                       void *cls)
 {
   GNUNET_assert ((store) && (store->members) && (it));
 
@@ -265,5 +295,7 @@ iterate_store_members (struct GNUNET_MESSENGER_MemberStore 
*store,
   iterate.it = it;
   iterate.cls = cls;
 
-  return GNUNET_CONTAINER_multishortmap_iterate(store->members, 
iterate_store_members_it, &iterate);
+  return GNUNET_CONTAINER_multishortmap_iterate (store->members,
+                                                 iterate_store_members_it,
+                                                 &iterate);
 }
diff --git a/src/service/messenger/gnunet-service-messenger_member_store.h 
b/src/service/messenger/gnunet-service-messenger_member_store.h
index 337ddcf78..0acb8ef9c 100644
--- a/src/service/messenger/gnunet-service-messenger_member_store.h
+++ b/src/service/messenger/gnunet-service-messenger_member_store.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -44,9 +44,9 @@ struct GNUNET_MESSENGER_MemberStore
 };
 
 typedef int (*GNUNET_MESSENGER_MemberIteratorCallback) (
-    void *cls,
-    const struct GNUNET_CRYPTO_PublicKey *public_key,
-    struct GNUNET_MESSENGER_MemberSession *session);
+  void *cls,
+  const struct GNUNET_CRYPTO_PublicKey *public_key,
+  struct GNUNET_MESSENGER_MemberSession *session);
 
 /**
  * Initializes a member <i>store</i> as fully empty connected to a <i>room</i>.
@@ -118,7 +118,9 @@ get_store_member (const struct GNUNET_MESSENGER_MemberStore 
*store,
 
 /**
  * Returns the member of a <i>store</i> using a sender id of a given 
<i>message</i>.
- * If the member does not provide a matching session, NULL gets returned.
+ *
+ * If the message is a peer message or the member does not provide a matching 
session,
+ * NULL gets returned.
  *
  * @param[in,out] store Member store
  * @param[in] message Message
@@ -152,6 +154,6 @@ add_store_member (struct GNUNET_MESSENGER_MemberStore 
*store,
 int
 iterate_store_members (struct GNUNET_MESSENGER_MemberStore *store,
                        GNUNET_MESSENGER_MemberIteratorCallback it,
-                       void* cls);
+                       void *cls);
 
 #endif //GNUNET_SERVICE_MESSENGER_MEMBER_STORE_H
diff --git a/src/service/messenger/gnunet-service-messenger_message_handle.c 
b/src/service/messenger/gnunet-service-messenger_message_handle.c
index 06b987657..77466b599 100644
--- a/src/service/messenger/gnunet-service-messenger_message_handle.c
+++ b/src/service/messenger/gnunet-service-messenger_message_handle.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2022 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -27,109 +27,133 @@
 #include "gnunet-service-messenger_message_handle.h"
 
 static void
-handle_session_switch (struct GNUNET_MESSENGER_MemberSession *session,
-                       const struct GNUNET_MESSENGER_Message *message,
-                       const struct GNUNET_HashCode *hash)
+handle_member_session_switch (struct GNUNET_MESSENGER_MemberSession *session,
+                              const struct GNUNET_MESSENGER_Message *message,
+                              const struct GNUNET_HashCode *hash)
 {
-  struct GNUNET_MESSENGER_MemberSession *next = switch_member_session(session, 
message, hash);
+  struct GNUNET_MESSENGER_MemberSession *next = switch_member_session (session,
+                                                                       message,
+                                                                       hash);
 
   if (next != session)
-    add_member_session(next->member, next);
+    add_member_session (next->member, next);
 }
 
+
 void
 handle_message_join (struct GNUNET_MESSENGER_SrvRoom *room,
-                     struct GNUNET_MESSENGER_MemberSession *session,
+                     struct GNUNET_MESSENGER_SenderSession *session,
                      const struct GNUNET_MESSENGER_Message *message,
                      const struct GNUNET_HashCode *hash)
 {
-  GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Member (%s) joins room (%s).\n",
-             GNUNET_sh2s (&(message->header.sender_id)), 
GNUNET_h2s(get_srv_room_key(room)));
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Member (%s) joins room (%s).\n",
+              GNUNET_sh2s (&(message->header.sender_id)), GNUNET_h2s (
+                get_srv_room_key (room)));
 
-  if (GNUNET_OK != reset_member_session(session, hash))
-    GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Resetting member session failed!\n");
+  if (GNUNET_OK != reset_member_session (session->member, hash))
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Resetting member session failed!\n");
 
   solve_srv_room_member_collisions (
-      room,
-      &(message->body.join.key),
-      &(message->header.sender_id),
-      GNUNET_TIME_absolute_ntoh(message->header.timestamp)
-  );
+    room,
+    &(message->body.join.key),
+    &(message->header.sender_id),
+    GNUNET_TIME_absolute_ntoh (message->header.timestamp)
+    );
 }
 
+
 void
 handle_message_leave (struct GNUNET_MESSENGER_SrvRoom *room,
-                      struct GNUNET_MESSENGER_MemberSession *session,
+                      struct GNUNET_MESSENGER_SenderSession *session,
                       const struct GNUNET_MESSENGER_Message *message,
                       const struct GNUNET_HashCode *hash)
 {
-  GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Member (%s) leaves room (%s).\n",
-             GNUNET_sh2s (&(message->header.sender_id)), 
GNUNET_h2s(get_srv_room_key(room)));
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Member (%s) leaves room (%s).\n",
+              GNUNET_sh2s (&(message->header.sender_id)), GNUNET_h2s (
+                get_srv_room_key (room)));
 
-  close_member_session(session);
+  close_member_session (session->member);
 }
 
+
 void
 handle_message_name (struct GNUNET_MESSENGER_SrvRoom *room,
-                     struct GNUNET_MESSENGER_MemberSession *session,
+                     struct GNUNET_MESSENGER_SenderSession *session,
                      const struct GNUNET_MESSENGER_Message *message,
                      const struct GNUNET_HashCode *hash)
 {
-  struct GNUNET_MESSENGER_Contact *contact = 
get_member_session_contact(session);
+  struct GNUNET_MESSENGER_Contact *contact = get_member_session_contact (
+    session->member);
 
-  if (!contact)
+  if (! contact)
     return;
 
   set_contact_name (contact, message->body.name.name);
 }
 
+
 void
 handle_message_key (struct GNUNET_MESSENGER_SrvRoom *room,
-                    struct GNUNET_MESSENGER_MemberSession *session,
+                    struct GNUNET_MESSENGER_SenderSession *session,
                     const struct GNUNET_MESSENGER_Message *message,
                     const struct GNUNET_HashCode *hash)
 {
-  handle_session_switch (session, message, hash);
+  handle_member_session_switch (session->member, message, hash);
 }
 
+
 void
 handle_message_peer (struct GNUNET_MESSENGER_SrvRoom *room,
-                     struct GNUNET_MESSENGER_MemberSession *session,
+                     struct GNUNET_MESSENGER_SenderSession *session,
                      const struct GNUNET_MESSENGER_Message *message,
                      const struct GNUNET_HashCode *hash)
 {
-  if (GNUNET_NO == contains_list_tunnels (&(room->basement), 
&(message->body.peer.peer)))
-    add_to_list_tunnels (&(room->basement), &(message->body.peer.peer));
+  struct GNUNET_MESSENGER_PeerStore *store = get_srv_room_peer_store (room);
+
+  if (0 == GNUNET_memcmp (session->peer, &(message->body.peer.peer)))
+    update_store_peer (store, &(message->body.peer.peer));
+
+  if (GNUNET_NO == contains_list_tunnels (&(room->basement),
+                                          &(message->body.peer.peer)))
+    add_to_list_tunnels (&(room->basement), &(message->body.peer.peer), hash);
 
   if (room->peer_message)
     rebuild_srv_room_basement_structure (room);
 }
 
+
 void
 handle_message_id (struct GNUNET_MESSENGER_SrvRoom *room,
-                   struct GNUNET_MESSENGER_MemberSession *session,
+                   struct GNUNET_MESSENGER_SenderSession *session,
                    const struct GNUNET_MESSENGER_Message *message,
                    const struct GNUNET_HashCode *hash)
 {
-  handle_session_switch (session, message, hash);
+  handle_member_session_switch (session->member, message, hash);
 
   solve_srv_room_member_collisions (
-      room,
-      get_member_session_public_key(session),
-      &(message->body.id.id),
-      GNUNET_TIME_absolute_ntoh(message->header.timestamp)
-  );
+    room,
+    get_member_session_public_key (session->member),
+    &(message->body.id.id),
+    GNUNET_TIME_absolute_ntoh (message->header.timestamp)
+    );
 }
 
+
 void
 handle_message_miss (struct GNUNET_MESSENGER_SrvRoom *room,
-                     struct GNUNET_MESSENGER_MemberSession *session,
+                     struct GNUNET_MESSENGER_SenderSession *session,
                      const struct GNUNET_MESSENGER_Message *message,
                      const struct GNUNET_HashCode *hash)
 {
-  struct GNUNET_MESSENGER_ListTunnel *element = find_list_tunnels 
(&(room->basement), &(message->body.peer.peer), NULL);
+  struct GNUNET_MESSENGER_PeerStore *store = get_srv_room_peer_store (room);
 
-  if (!element)
+  if (0 == GNUNET_memcmp (session->peer, &(message->body.miss.peer)))
+    remove_store_peer (store, &(message->body.miss.peer));
+
+  struct GNUNET_MESSENGER_ListTunnel *element = find_list_tunnels (
+    &(room->basement), &(message->body.miss.peer), NULL);
+
+  if (! element)
     return;
 
   remove_from_list_tunnels (&(room->basement), element);
@@ -138,17 +162,22 @@ handle_message_miss (struct GNUNET_MESSENGER_SrvRoom 
*room,
     rebuild_srv_room_basement_structure (room);
 }
 
+
 void
 handle_message_delete (struct GNUNET_MESSENGER_SrvRoom *room,
-                       struct GNUNET_MESSENGER_MemberSession *session,
+                       struct GNUNET_MESSENGER_SenderSession *session,
                        const struct GNUNET_MESSENGER_Message *message,
                        const struct GNUNET_HashCode *hash)
 {
-  struct GNUNET_TIME_Relative delay = GNUNET_TIME_relative_ntoh 
(message->body.deletion.delay);
-  struct GNUNET_TIME_Absolute action = GNUNET_TIME_absolute_ntoh 
(message->header.timestamp);
+  struct GNUNET_TIME_Relative delay = GNUNET_TIME_relative_ntoh (
+    message->body.deletion.delay);
+  struct GNUNET_TIME_Absolute action = GNUNET_TIME_absolute_ntoh (
+    message->header.timestamp);
 
   action = GNUNET_TIME_absolute_add (action, delay);
-  delay = GNUNET_TIME_absolute_get_difference (GNUNET_TIME_absolute_get (), 
action);
+  delay = GNUNET_TIME_absolute_get_difference (GNUNET_TIME_absolute_get (),
+                                               action);
 
-  delete_srv_room_message (room, session, &(message->body.deletion.hash), 
delay);
+  delete_srv_room_message (room, session->member,
+                           &(message->body.deletion.hash), delay);
 }
diff --git a/src/service/messenger/gnunet-service-messenger_message_handle.h 
b/src/service/messenger/gnunet-service-messenger_message_handle.h
index 0a97cd840..228b129c7 100644
--- a/src/service/messenger/gnunet-service-messenger_message_handle.h
+++ b/src/service/messenger/gnunet-service-messenger_message_handle.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -29,24 +29,23 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 
-#include "gnunet-service-messenger_message_kind.h"
-
-#include "gnunet-service-messenger_member_session.h"
+#include "gnunet-service-messenger_sender_session.h"
 #include "gnunet-service-messenger_tunnel.h"
 #include "messenger_api_message.h"
+#include "messenger_api_message_kind.h"
 
 /**
  * Handles a received or sent join message to make changes of current member 
information.
  * (add matching member and clear member info)
  *
  * @param[in,out] room Room of the message
- * @param[in,out] session Member session
+ * @param[in,out] session Sender session
  * @param[in] message JOIN-Message
  * @param[in] hash Hash of the message
  */
 void
 handle_message_join (struct GNUNET_MESSENGER_SrvRoom *room,
-                     struct GNUNET_MESSENGER_MemberSession *session,
+                     struct GNUNET_MESSENGER_SenderSession *session,
                      const struct GNUNET_MESSENGER_Message *message,
                      const struct GNUNET_HashCode *hash);
 
@@ -55,13 +54,13 @@ handle_message_join (struct GNUNET_MESSENGER_SrvRoom *room,
  * (remove matching member and clear member info)
  *
  * @param[in,out] room Room of the message
- * @param[in,out] session Member session
+ * @param[in,out] session Sender session
  * @param[in] message LEAVE-Message
  * @param[in] hash Hash of the message
  */
 void
 handle_message_leave (struct GNUNET_MESSENGER_SrvRoom *room,
-                      struct GNUNET_MESSENGER_MemberSession *session,
+                      struct GNUNET_MESSENGER_SenderSession *session,
                       const struct GNUNET_MESSENGER_Message *message,
                       const struct GNUNET_HashCode *hash);
 
@@ -70,13 +69,13 @@ handle_message_leave (struct GNUNET_MESSENGER_SrvRoom *room,
  * (change name of matching member)
  *
  * @param[in,out] room Room of the message
- * @param[in,out] session Member session
+ * @param[in,out] session Sender session
  * @param[in] message NAME-Message
  * @param[in] hash Hash of the message
  */
 void
 handle_message_name (struct GNUNET_MESSENGER_SrvRoom *room,
-                     struct GNUNET_MESSENGER_MemberSession *session,
+                     struct GNUNET_MESSENGER_SenderSession *session,
                      const struct GNUNET_MESSENGER_Message *message,
                      const struct GNUNET_HashCode *hash);
 
@@ -85,13 +84,13 @@ handle_message_name (struct GNUNET_MESSENGER_SrvRoom *room,
  * (move the member in the contacts and change its key)
  *
  * @param[in,out] room Room of the message
- * @param[in,out] session Member session
+ * @param[in,out] session Sender session
  * @param[in] message KEY-Message
  * @param[in] hash Hash of the message
  */
 void
 handle_message_key (struct GNUNET_MESSENGER_SrvRoom *room,
-                    struct GNUNET_MESSENGER_MemberSession *session,
+                    struct GNUNET_MESSENGER_SenderSession *session,
                     const struct GNUNET_MESSENGER_Message *message,
                     const struct GNUNET_HashCode *hash);
 
@@ -100,13 +99,13 @@ handle_message_key (struct GNUNET_MESSENGER_SrvRoom *room,
  * (add a new peer to the basement and restructure connections based on 
updated list of peers)
  *
  * @param[in,out] room Room of the message
- * @param[in,out] session Member session
+ * @param[in,out] session Sender session
  * @param[in] message PEER-Message
  * @param[in] hash Hash of the message
  */
 void
 handle_message_peer (struct GNUNET_MESSENGER_SrvRoom *room,
-                     struct GNUNET_MESSENGER_MemberSession *session,
+                     struct GNUNET_MESSENGER_SenderSession *session,
                      const struct GNUNET_MESSENGER_Message *message,
                      const struct GNUNET_HashCode *hash);
 
@@ -115,13 +114,13 @@ handle_message_peer (struct GNUNET_MESSENGER_SrvRoom 
*room,
  * (change id of matching member)
  *
  * @param[in,out] room Room of the message
- * @param[in,out] session Member session
+ * @param[in,out] session Sender session
  * @param[in] message ID-Message
  * @param[in] hash Hash of the message
  */
 void
 handle_message_id (struct GNUNET_MESSENGER_SrvRoom *room,
-                   struct GNUNET_MESSENGER_MemberSession *session,
+                   struct GNUNET_MESSENGER_SenderSession *session,
                    const struct GNUNET_MESSENGER_Message *message,
                    const struct GNUNET_HashCode *hash);
 
@@ -130,13 +129,13 @@ handle_message_id (struct GNUNET_MESSENGER_SrvRoom *room,
  * (remove a peer from the basement and restructure connections based on 
updated list of peers)
  *
  * @param[in,out] room Room of the message
- * @param[in,out] session Member session
+ * @param[in,out] session Sender session
  * @param[in] message MISS-Message
  * @param[in] hash Hash of the message
  */
 void
 handle_message_miss (struct GNUNET_MESSENGER_SrvRoom *room,
-                     struct GNUNET_MESSENGER_MemberSession *session,
+                     struct GNUNET_MESSENGER_SenderSession *session,
                      const struct GNUNET_MESSENGER_Message *message,
                      const struct GNUNET_HashCode *hash);
 
@@ -145,13 +144,13 @@ handle_message_miss (struct GNUNET_MESSENGER_SrvRoom 
*room,
  * (remove a message from the store of a room under a given delay)
  *
  * @param[in,out] room Room of the message
- * @param[in,out] session Member session
+ * @param[in,out] session Sender session
  * @param[in] message DELETE-Message
  * @param[in] hash Hash of the message
  */
 void
 handle_message_delete (struct GNUNET_MESSENGER_SrvRoom *room,
-                       struct GNUNET_MESSENGER_MemberSession *session,
+                       struct GNUNET_MESSENGER_SenderSession *session,
                        const struct GNUNET_MESSENGER_Message *message,
                        const struct GNUNET_HashCode *hash);
 
diff --git a/src/service/messenger/gnunet-service-messenger_message_kind.c 
b/src/service/messenger/gnunet-service-messenger_message_kind.c
index d2923a5e3..0cc3afeaf 100644
--- a/src/service/messenger/gnunet-service-messenger_message_kind.c
+++ b/src/service/messenger/gnunet-service-messenger_message_kind.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -29,87 +29,37 @@
 #include "messenger_api_util.h"
 
 struct GNUNET_MESSENGER_Message*
-create_message_info (const struct GNUNET_MESSENGER_Ego *ego)
+create_message_info (struct GNUNET_MESSENGER_Service *service)
 {
-  if (!ego)
+  if (! service)
     return NULL;
 
-  struct GNUNET_MESSENGER_Message *message = create_message 
(GNUNET_MESSENGER_KIND_INFO);
+  struct GNUNET_MESSENGER_Message *message = create_message (
+    GNUNET_MESSENGER_KIND_INFO);
 
-  if (!message)
+  if (! message)
     return NULL;
 
-  GNUNET_memcpy(&(message->body.info.host_key), &(ego->pub), sizeof(ego->pub));
-
   message->body.info.messenger_version = GNUNET_MESSENGER_VERSION;
 
   return message;
 }
 
-struct GNUNET_MESSENGER_Message*
-create_message_join (const struct GNUNET_MESSENGER_Ego *ego)
-{
-  if (!ego)
-    return NULL;
-
-  struct GNUNET_MESSENGER_Message *message = create_message 
(GNUNET_MESSENGER_KIND_JOIN);
-
-  if (!message)
-    return NULL;
-
-  GNUNET_memcpy(&(message->body.join.key), &(ego->pub), sizeof(ego->pub));
-
-  return message;
-}
-
-struct GNUNET_MESSENGER_Message*
-create_message_leave ()
-{
-  return create_message (GNUNET_MESSENGER_KIND_LEAVE);
-}
-
-struct GNUNET_MESSENGER_Message*
-create_message_name (const char *name)
-{
-  if (!name)
-    return NULL;
-
-  struct GNUNET_MESSENGER_Message *message = create_message 
(GNUNET_MESSENGER_KIND_NAME);
-
-  if (!message)
-    return NULL;
-
-  message->body.name.name = GNUNET_strdup(name);
-  return message;
-}
-
-struct GNUNET_MESSENGER_Message*
-create_message_key (const struct GNUNET_CRYPTO_PrivateKey *key)
-{
-  if (!key)
-    return NULL;
-
-  struct GNUNET_MESSENGER_Message *message = create_message 
(GNUNET_MESSENGER_KIND_KEY);
-
-  if (!message)
-    return NULL;
-
-  GNUNET_CRYPTO_key_get_public (key, &(message->body.key.key));
-  return message;
-}
 
 struct GNUNET_MESSENGER_Message*
-create_message_peer (const struct GNUNET_MESSENGER_Service *service)
+create_message_peer (struct GNUNET_MESSENGER_Service *service)
 {
-  if (!service)
+  if (! service)
     return NULL;
 
-  struct GNUNET_MESSENGER_Message *message = create_message 
(GNUNET_MESSENGER_KIND_PEER);
+  struct GNUNET_MESSENGER_Message *message = create_message (
+    GNUNET_MESSENGER_KIND_PEER);
 
-  if (!message)
+  if (! message)
     return NULL;
 
-  if (GNUNET_OK == get_service_peer_identity (service, 
&(message->body.peer.peer)))
+  if (GNUNET_OK == get_service_peer_identity (service,
+                                              &(message->body.peer.peer)))
     return message;
   else
   {
@@ -118,125 +68,42 @@ create_message_peer (const struct 
GNUNET_MESSENGER_Service *service)
   }
 }
 
-struct GNUNET_MESSENGER_Message*
-create_message_id (const struct GNUNET_ShortHashCode *unique_id)
-{
-  if (!unique_id)
-    return NULL;
-
-  struct GNUNET_MESSENGER_Message *message = create_message 
(GNUNET_MESSENGER_KIND_ID);
-
-  if (!message)
-    return NULL;
-
-  GNUNET_memcpy(&(message->body.id.id), unique_id, sizeof(struct 
GNUNET_ShortHashCode));
-
-  return message;
-}
 
 struct GNUNET_MESSENGER_Message*
 create_message_miss (const struct GNUNET_PeerIdentity *peer)
 {
-  if (!peer)
+  if (! peer)
     return NULL;
 
-  struct GNUNET_MESSENGER_Message *message = create_message 
(GNUNET_MESSENGER_KIND_MISS);
+  struct GNUNET_MESSENGER_Message *message = create_message (
+    GNUNET_MESSENGER_KIND_MISS);
 
-  if (!message)
+  if (! message)
   {
     return NULL;
   }
 
-  GNUNET_memcpy(&(message->body.miss.peer), peer, sizeof(struct 
GNUNET_PeerIdentity));
-
-  return message;
-}
-
-struct GNUNET_MESSENGER_Message*
-create_message_merge (const struct GNUNET_HashCode *previous)
-{
-  if (!previous)
-    return NULL;
-
-  struct GNUNET_MESSENGER_Message *message = create_message 
(GNUNET_MESSENGER_KIND_MERGE);
-
-  if (!message)
-    return NULL;
-
-  GNUNET_memcpy(&(message->body.merge.previous), previous, sizeof(struct 
GNUNET_HashCode));
-
-  return message;
-}
-
-struct GNUNET_MESSENGER_Message*
-create_message_request (const struct GNUNET_HashCode *hash)
-{
-  if (!hash)
-    return NULL;
-
-  struct GNUNET_HashCode zero;
-  memset (&zero, 0, sizeof(zero));
-
-  if (0 == GNUNET_CRYPTO_hash_cmp (hash, &zero))
-    return NULL;
-
-  struct GNUNET_MESSENGER_Message *message = create_message 
(GNUNET_MESSENGER_KIND_REQUEST);
-
-  if (!message)
-    return NULL;
-
-  GNUNET_memcpy(&(message->body.request.hash), hash, sizeof(struct 
GNUNET_HashCode));
+  GNUNET_memcpy (&(message->body.miss.peer), peer, sizeof(struct
+                                                          
GNUNET_PeerIdentity));
 
   return message;
 }
 
-struct GNUNET_MESSENGER_Message*
-create_message_invite (const struct GNUNET_PeerIdentity *door,
-                       const struct GNUNET_HashCode *key)
-{
-  if ((!door) || (!key))
-    return NULL;
-
-  struct GNUNET_MESSENGER_Message *message = create_message 
(GNUNET_MESSENGER_KIND_INVITE);
-
-  if (!message)
-    return NULL;
-
-  GNUNET_memcpy(&(message->body.invite.door), door, sizeof(struct 
GNUNET_PeerIdentity));
-  GNUNET_memcpy(&(message->body.invite.key), key, sizeof(struct 
GNUNET_HashCode));
-
-  return message;
-}
 
 struct GNUNET_MESSENGER_Message*
-create_message_text (const char *text)
-{
-  if (!text)
-    return NULL;
-
-  struct GNUNET_MESSENGER_Message *message = create_message 
(GNUNET_MESSENGER_KIND_TEXT);
-
-  if (!message)
-    return NULL;
-
-  message->body.text.text = GNUNET_strdup(text);
-  return message;
-}
-
-struct GNUNET_MESSENGER_Message*
-create_message_delete (const struct GNUNET_HashCode *hash,
-                       const struct GNUNET_TIME_Relative delay)
+create_message_merge (const struct GNUNET_HashCode *previous)
 {
-  if (!hash)
+  if (! previous)
     return NULL;
 
-  struct GNUNET_MESSENGER_Message *message = create_message 
(GNUNET_MESSENGER_KIND_DELETE);
+  struct GNUNET_MESSENGER_Message *message = create_message (
+    GNUNET_MESSENGER_KIND_MERGE);
 
-  if (!message)
+  if (! message)
     return NULL;
 
-  GNUNET_memcpy(&(message->body.deletion.hash), hash, sizeof(struct 
GNUNET_HashCode));
-  message->body.deletion.delay = GNUNET_TIME_relative_hton (delay);
+  GNUNET_memcpy (&(message->body.merge.previous), previous, sizeof(struct
+                                                                   
GNUNET_HashCode));
 
   return message;
 }
diff --git a/src/service/messenger/gnunet-service-messenger_message_kind.h 
b/src/service/messenger/gnunet-service-messenger_message_kind.h
index d50317844..2e13e7710 100644
--- a/src/service/messenger/gnunet-service-messenger_message_kind.h
+++ b/src/service/messenger/gnunet-service-messenger_message_kind.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -36,73 +36,24 @@
 #include "messenger_api_ego.h"
 
 /**
- * Creates and allocates a new info message containing the hosts EGO public 
key and a newly generated unique member id.
+ * Creates and allocates a new info message containing the hosts service peer 
identity and version.
  * (all values are stored as copy)
  *
- * @param[in] ego EGO of the host
- * @param[in] members Map of all assigned member ids
+ * @param[in,out] service Service
  * @return New message
  */
 struct GNUNET_MESSENGER_Message*
-create_message_info (const struct GNUNET_MESSENGER_Ego *ego);
-
-/**
- * Creates and allocates a new join message containing the clients EGO public 
key.
- * (all values are stored as copy)
- *
- * @param[in] ego EGO of the client
- * @return New message
- */
-struct GNUNET_MESSENGER_Message*
-create_message_join (const struct GNUNET_MESSENGER_Ego *ego);
-
-/**
- * Creates and allocates a new leave message.
- *
- * @return New message
- */
-struct GNUNET_MESSENGER_Message*
-create_message_leave ();
-
-/**
- * Creates and allocates a new name message containing the <i>name</i> to 
change to.
- * (all values are stored as copy)
- *
- * @param[in] name New name
- * @return New message
- */
-struct GNUNET_MESSENGER_Message*
-create_message_name (const char *name);
-
-/**
- * Creates and allocates a new key message containing the public <i>key</i> to 
change to derived
- * from its private counterpart. (all values are stored as copy)
- *
- * @param[in] key Private key of EGO
- * @return New message
- */
-struct GNUNET_MESSENGER_Message*
-create_message_key (const struct GNUNET_CRYPTO_PrivateKey *key);
+create_message_info (struct GNUNET_MESSENGER_Service *service);
 
 /**
  * Creates and allocates a new peer message containing a services peer 
identity.
  * (all values are stored as copy)
  *
- * @param[in] service Service
- * @return New message
- */
-struct GNUNET_MESSENGER_Message*
-create_message_peer (const struct GNUNET_MESSENGER_Service *service);
-
-/**
- * Creates and allocates a new id message containing the unique member id to 
change to.
- * (all values are stored as copy)
- *
- * @param[in] unique_id Unique member id
+ * @param[in,out] service Service
  * @return New message
  */
 struct GNUNET_MESSENGER_Message*
-create_message_id (const struct GNUNET_ShortHashCode *unique_id);
+create_message_peer (struct GNUNET_MESSENGER_Service *service);
 
 /**
  * Creates and allocates a new miss message containing the missing <i>peer</i> 
identity.
@@ -125,49 +76,5 @@ create_message_miss (const struct GNUNET_PeerIdentity 
*peer);
 struct GNUNET_MESSENGER_Message*
 create_message_merge (const struct GNUNET_HashCode *previous);
 
-/**
- * Creates and allocates a new request message containing the <i>hash</i> of a 
missing message.
- * (all values are stored as copy)
- *
- * @param[in] hash Hash of message
- * @return New message
- */
-struct GNUNET_MESSENGER_Message*
-create_message_request (const struct GNUNET_HashCode *hash);
-
-/**
- * Creates and allocates a new invite message containing the peer identity of 
an entrance peer
- * to a room using a given <i>key</i> as shared secret for communication.
- * (all values are stored as copy)
- *
- * @param[in] door Peer identity
- * @param[in] key Shared secret of a room
- * @return New message
- */
-struct GNUNET_MESSENGER_Message*
-create_message_invite (const struct GNUNET_PeerIdentity *door,
-                       const struct GNUNET_HashCode *key);
-
-/**
- * Creates and allocates a new <i>text</i> message containing a string 
representing text.
- * (all values are stored as copy)
- *
- * @param[in] text Text
- * @return New message
- */
-struct GNUNET_MESSENGER_Message*
-create_message_text (const char *text);
-
-/**
- * Creates and allocates a new delete message containing the <i>hash</i> of a 
message to delete after a specific <i>delay</i>.
- * (all values are stored as copy)
- *
- * @param[in] hash Hash of message
- * @param[in] delay Delay of deletion
- * @return New message
- */
-struct GNUNET_MESSENGER_Message*
-create_message_delete (const struct GNUNET_HashCode *hash,
-                       const struct GNUNET_TIME_Relative delay);
 
 #endif //GNUNET_SERVICE_MESSENGER_MESSAGE_KIND_H
diff --git a/src/service/messenger/gnunet-service-messenger_message_recv.c 
b/src/service/messenger/gnunet-service-messenger_message_recv.c
index d660d0115..9c4a69acd 100644
--- a/src/service/messenger/gnunet-service-messenger_message_recv.c
+++ b/src/service/messenger/gnunet-service-messenger_message_recv.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2022 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -26,6 +26,7 @@
 #include "platform.h"
 #include "gnunet-service-messenger_message_recv.h"
 
+#include "gnunet-service-messenger_message_kind.h"
 #include "gnunet-service-messenger_operation.h"
 
 static void
@@ -37,25 +38,31 @@ forward_about_members (struct GNUNET_MESSENGER_SrvRoom 
*room,
   if (session->prev)
     forward_about_members (room, tunnel, session->prev, map);
 
-  struct GNUNET_MESSENGER_MessageStore *message_store = 
get_srv_room_message_store(room);
+  struct GNUNET_MESSENGER_MessageStore *message_store =
+    get_srv_room_message_store (room);
   struct GNUNET_MESSENGER_ListMessage *element;
 
   for (element = session->messages.head; element; element = element->next)
   {
-    if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(map, 
&(element->hash)))
+    if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (map,
+                                                              
&(element->hash)))
       continue;
 
-    if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(map, &(element->hash), 
NULL,
-                                                       
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
-      GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Forwarding of session message 
could be duplicated!\n");
+    if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (map, &(element->hash),
+                                                        NULL,
+                                                        
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "Forwarding of session message could be duplicated!\n");
 
-    const struct GNUNET_MESSENGER_Message *message = 
get_store_message(message_store, &(element->hash));
+    const struct GNUNET_MESSENGER_Message *message = get_store_message (
+      message_store, &(element->hash));
 
     if (message)
-      forward_tunnel_message(tunnel, message, &(element->hash));
+      forward_tunnel_message (tunnel, message, &(element->hash));
   }
 }
 
+
 static int
 iterate_forward_members (void *cls,
                          const struct GNUNET_CRYPTO_PublicKey *public_key,
@@ -63,56 +70,77 @@ iterate_forward_members (void *cls,
 {
   struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls;
 
-  if (GNUNET_YES == is_member_session_completed(session))
+  if (GNUNET_YES == is_member_session_completed (session))
     return GNUNET_YES;
 
-  struct GNUNET_CONTAINER_MultiHashMap *map = 
GNUNET_CONTAINER_multihashmap_create(4, GNUNET_NO);
+  struct GNUNET_CONTAINER_MultiHashMap *map =
+    GNUNET_CONTAINER_multihashmap_create (4, GNUNET_NO);
 
   forward_about_members (tunnel->room, tunnel, session, map);
 
-  GNUNET_CONTAINER_multihashmap_destroy(map);
+  GNUNET_CONTAINER_multihashmap_destroy (map);
   return GNUNET_YES;
 }
 
+
 int
 recv_message_info (struct GNUNET_MESSENGER_SrvRoom *room,
                    struct GNUNET_MESSENGER_SrvTunnel *tunnel,
                    const struct GNUNET_MESSENGER_Message *message,
                    const struct GNUNET_HashCode *hash)
 {
-  const uint32_t version = get_tunnel_messenger_version(tunnel);
+  const uint32_t version = get_tunnel_messenger_version (tunnel);
 
-  if (GNUNET_OK != update_tunnel_messenger_version(tunnel, 
message->body.info.messenger_version))
+  if (GNUNET_OK != update_tunnel_messenger_version (tunnel,
+                                                    message->body.info.
+                                                    messenger_version))
   {
-    disconnect_tunnel(tunnel);
+    disconnect_tunnel (tunnel);
     return GNUNET_NO;
   }
 
-  if (version == get_tunnel_messenger_version(tunnel))
+  if (version == get_tunnel_messenger_version (tunnel))
     return GNUNET_NO;
 
   if (room->host)
-  {
-    const struct GNUNET_MESSENGER_Ego *ego = get_srv_handle_ego(room->host);
-
-    send_tunnel_message (tunnel, room->host, create_message_info(ego));
-  }
+    send_tunnel_message (tunnel, room->host, create_message_info (
+                           room->service));
 
   struct GNUNET_PeerIdentity peer;
-  get_tunnel_peer_identity(tunnel, &peer);
+  get_tunnel_peer_identity (tunnel, &peer);
 
-  if (GNUNET_YES != contains_list_tunnels(&(room->basement), &peer))
+  if (GNUNET_YES != contains_list_tunnels (&(room->basement), &peer))
   {
-    struct GNUNET_MESSENGER_MemberStore *member_store = 
get_srv_room_member_store(room);
+    struct GNUNET_MESSENGER_MessageStore *message_store =
+      get_srv_room_message_store (room);
+
+    struct GNUNET_MESSENGER_ListTunnel *element;
+    for (element = room->basement.head; element; element = element->next)
+    {
+      if (! element->hash)
+        continue;
+
+      const struct GNUNET_MESSENGER_Message *message = get_store_message (
+        message_store, element->hash);
 
-    iterate_store_members(member_store, iterate_forward_members, tunnel);
+      if (message)
+        forward_tunnel_message (tunnel, message, element->hash);
+    }
   }
 
-  check_srv_room_peer_status(room, tunnel);
+  if (GNUNET_YES != contains_list_tunnels (&(room->basement), &peer))
+  {
+    struct GNUNET_MESSENGER_MemberStore *member_store =
+      get_srv_room_member_store (room);
+
+    iterate_store_members (member_store, iterate_forward_members, tunnel);
+  }
 
+  check_srv_room_peer_status (room, tunnel);
   return GNUNET_NO;
 }
 
+
 int
 recv_message_peer (struct GNUNET_MESSENGER_SrvRoom *room,
                    struct GNUNET_MESSENGER_SrvTunnel *tunnel,
@@ -122,40 +150,44 @@ recv_message_peer (struct GNUNET_MESSENGER_SrvRoom *room,
   struct GNUNET_PeerIdentity peer;
   GNUNET_PEER_resolve (tunnel->peer, &peer);
 
-  if (0 == GNUNET_memcmp(&peer, &(message->body.peer.peer)))
+  if (0 == GNUNET_memcmp (&peer, &(message->body.peer.peer)))
   {
-    if (!tunnel->peer_message)
-      tunnel->peer_message = GNUNET_new(struct GNUNET_HashCode);
+    if (! tunnel->peer_message)
+      tunnel->peer_message = GNUNET_new (struct GNUNET_HashCode);
 
-    GNUNET_memcpy(tunnel->peer_message, &hash, sizeof(hash));
+    GNUNET_memcpy (tunnel->peer_message, &hash, sizeof(hash));
   }
 
+  update_to_list_tunnels (&(room->basement), &(message->body.peer.peer), hash);
   return GNUNET_YES;
 }
 
+
 static void
 callback_found_message (void *cls,
                         struct GNUNET_MESSENGER_SrvRoom *room,
                         const struct GNUNET_MESSENGER_Message *message,
                         const struct GNUNET_HashCode *hash)
 {
-  struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls;
+  struct GNUNET_MESSENGER_SrvTunnel *tunnel = tunnel;
 
-  if (!message)
+  if (! message)
   {
-    struct GNUNET_MESSENGER_OperationStore *operation_store = 
get_srv_room_operation_store(room);
-
-    use_store_operation(
-        operation_store,
-        hash,
-        GNUNET_MESSENGER_OP_REQUEST,
-        GNUNET_MESSENGER_REQUEST_DELAY
-    );
+    struct GNUNET_MESSENGER_OperationStore *operation_store =
+      get_srv_room_operation_store (room);
+
+    use_store_operation (
+      operation_store,
+      hash,
+      GNUNET_MESSENGER_OP_REQUEST,
+      GNUNET_MESSENGER_REQUEST_DELAY
+      );
   }
   else
     forward_tunnel_message (tunnel, message, hash);
 }
 
+
 /*
  * Function returns GNUNET_NO to drop forwarding the request.
  * It will only be forwarded if it can't be answered!
@@ -166,20 +198,31 @@ recv_message_request (struct GNUNET_MESSENGER_SrvRoom 
*room,
                       const struct GNUNET_MESSENGER_Message *message,
                       const struct GNUNET_HashCode *hash)
 {
-  struct GNUNET_MESSENGER_MemberStore *member_store = 
get_srv_room_member_store(room);
-  struct GNUNET_MESSENGER_Member *member = get_store_member_of(member_store, 
message);
+  struct GNUNET_MESSENGER_MemberStore *member_store =
+    get_srv_room_member_store (room);
+  struct GNUNET_MESSENGER_Member *member = get_store_member_of (member_store,
+                                                                message);
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Request for message (%s)\n", GNUNET_h2s 
(hash));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Request for message (%s)\n",
+              GNUNET_h2s (hash));
 
-  if (!member)
+  if (! member)
     return GNUNET_NO;
 
-  struct GNUNET_MESSENGER_MemberSession *session = 
get_member_session_of(member, message, hash);
+  struct GNUNET_MESSENGER_MemberSession *session = get_member_session_of (
+    member, message, hash);
 
-  if ((!session) || (GNUNET_YES != check_member_session_history(session, hash, 
GNUNET_NO)))
+  if ((! session) || (GNUNET_YES != check_member_session_history (session,
+                                                                  &(message->
+                                                                    
body.request
+                                                                    .hash),
+                                                                  GNUNET_NO)))
     return GNUNET_NO;
 
-  if (GNUNET_NO == request_srv_room_message(room, 
&(message->body.request.hash), session, callback_found_message, tunnel))
+  if (GNUNET_NO == request_srv_room_message (room,
+                                             &(message->body.request.hash),
+                                             session, callback_found_message,
+                                             tunnel))
     return GNUNET_YES;
 
   return GNUNET_NO;
diff --git a/src/service/messenger/gnunet-service-messenger_message_recv.h 
b/src/service/messenger/gnunet-service-messenger_message_recv.h
index 8e5b02504..104d62ba0 100644
--- a/src/service/messenger/gnunet-service-messenger_message_recv.h
+++ b/src/service/messenger/gnunet-service-messenger_message_recv.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -29,8 +29,6 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 
-#include "gnunet-service-messenger_message_kind.h"
-
 #include "gnunet-service-messenger_member_session.h"
 #include "gnunet-service-messenger_tunnel.h"
 #include "messenger_api_message.h"
diff --git a/src/service/messenger/gnunet-service-messenger_message_send.c 
b/src/service/messenger/gnunet-service-messenger_message_send.c
index 09039758b..a616355eb 100644
--- a/src/service/messenger/gnunet-service-messenger_message_send.c
+++ b/src/service/messenger/gnunet-service-messenger_message_send.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2022 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -26,9 +26,86 @@
 #include "platform.h"
 #include "gnunet-service-messenger_message_send.h"
 
+#include "gnunet-service-messenger_handle.h"
 #include "gnunet-service-messenger_member.h"
 #include "gnunet-service-messenger_member_session.h"
 #include "gnunet-service-messenger_operation.h"
+#include "gnunet-service-messenger_room.h"
+
+struct GNUNET_MESSENGER_MemberNotify
+{
+  struct GNUNET_MESSENGER_SrvRoom *room;
+  struct GNUNET_MESSENGER_SrvHandle *handle;
+  struct GNUNET_MESSENGER_MemberSession *session;
+};
+
+static void
+notify_about_members (struct GNUNET_MESSENGER_MemberNotify *notify,
+                      struct GNUNET_MESSENGER_MemberSession *session,
+                      struct GNUNET_CONTAINER_MultiHashMap *map,
+                      int check_permission)
+{
+  if (session->prev)
+    notify_about_members (notify, session->prev, map, GNUNET_YES);
+
+  struct GNUNET_MESSENGER_MessageStore *message_store =
+    get_srv_room_message_store (notify->room);
+  struct GNUNET_MESSENGER_ListMessage *element;
+
+  for (element = session->messages.head; element; element = element->next)
+  {
+    if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (map,
+                                                              
&(element->hash)))
+      continue;
+
+    if ((GNUNET_YES == check_permission) &&
+        (GNUNET_YES != check_member_session_history (notify->session,
+                                                     &(element->hash),
+                                                     GNUNET_NO)))
+      continue;
+
+    if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (map, &(element->hash),
+                                                        NULL,
+                                                        
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "Notification of session message could be duplicated!\n");
+
+    const struct GNUNET_MESSENGER_Message *message = get_store_message (
+      message_store, &(element->hash));
+
+    if ((! message) || (GNUNET_YES == is_peer_message (message)))
+      continue;
+
+    struct GNUNET_MESSENGER_SenderSession sender;
+    sender.member = session;
+
+    notify_srv_handle_message (notify->handle, notify->room, &sender, message,
+                               &(element->hash));
+  }
+}
+
+
+static int
+iterate_notify_about_members (void *cls,
+                              const struct
+                              GNUNET_CRYPTO_PublicKey *public_key,
+                              struct GNUNET_MESSENGER_MemberSession *session)
+{
+  struct GNUNET_MESSENGER_MemberNotify *notify = cls;
+
+  if ((notify->session == session) || (GNUNET_YES ==
+                                       is_member_session_completed (session)))
+    return GNUNET_YES;
+
+  struct GNUNET_CONTAINER_MultiHashMap *map =
+    GNUNET_CONTAINER_multihashmap_create (4, GNUNET_NO);
+
+  notify_about_members (notify, session, map, GNUNET_NO);
+
+  GNUNET_CONTAINER_multihashmap_destroy (map);
+  return GNUNET_YES;
+}
+
 
 void
 send_message_join (struct GNUNET_MESSENGER_SrvRoom *room,
@@ -36,42 +113,85 @@ send_message_join (struct GNUNET_MESSENGER_SrvRoom *room,
                    const struct GNUNET_MESSENGER_Message *message,
                    const struct GNUNET_HashCode *hash)
 {
-  check_srv_room_peer_status(room, NULL);
+  set_srv_handle_key (handle, &(message->body.join.key));
+
+  struct GNUNET_MESSENGER_MemberStore *member_store =
+    get_srv_room_member_store (room);
+  struct GNUNET_MESSENGER_Member *member = add_store_member (member_store,
+                                                             &(message->header.
+                                                               sender_id));
+
+  struct GNUNET_MESSENGER_MemberSession *session = get_member_session_of (
+    member, message, hash);
+
+  if (! session)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "A valid session is required to join a room!\n");
+    goto skip_member_notification;
+  }
+
+  struct GNUNET_MESSENGER_MemberNotify notify;
+
+  notify.room = room;
+  notify.handle = handle;
+  notify.session = session;
+
+  iterate_store_members (get_srv_room_member_store (room),
+                         iterate_notify_about_members, &notify);
+
+skip_member_notification:
+  check_srv_room_peer_status (room, NULL);
 }
 
+
+void
+send_message_key (struct GNUNET_MESSENGER_SrvRoom *room,
+                  struct GNUNET_MESSENGER_SrvHandle *handle,
+                  const struct GNUNET_MESSENGER_Message *message,
+                  const struct GNUNET_HashCode *hash)
+{
+  set_srv_handle_key (handle, &(message->body.key.key));
+}
+
+
 void
 send_message_peer (struct GNUNET_MESSENGER_SrvRoom *room,
                    struct GNUNET_MESSENGER_SrvHandle *handle,
                    const struct GNUNET_MESSENGER_Message *message,
                    const struct GNUNET_HashCode *hash)
 {
-  if (!room->peer_message)
-    room->peer_message = GNUNET_new(struct GNUNET_HashCode);
+  if (! room->peer_message)
+    room->peer_message = GNUNET_new (struct GNUNET_HashCode);
 
-  GNUNET_memcpy(room->peer_message, hash, sizeof(struct GNUNET_HashCode));
+  GNUNET_memcpy (room->peer_message, hash, sizeof(struct GNUNET_HashCode));
 }
 
+
 void
 send_message_id (struct GNUNET_MESSENGER_SrvRoom *room,
                  struct GNUNET_MESSENGER_SrvHandle *handle,
                  const struct GNUNET_MESSENGER_Message *message,
                  const struct GNUNET_HashCode *hash)
 {
-  change_srv_handle_member_id (handle, get_srv_room_key(room), 
&(message->body.id.id));
+  change_srv_handle_member_id (handle, get_srv_room_key (room),
+                               &(message->body.id.id));
 }
 
+
 void
 send_message_request (struct GNUNET_MESSENGER_SrvRoom *room,
                       struct GNUNET_MESSENGER_SrvHandle *handle,
                       const struct GNUNET_MESSENGER_Message *message,
                       const struct GNUNET_HashCode *hash)
 {
-  struct GNUNET_MESSENGER_OperationStore *operation_store = 
get_srv_room_operation_store(room);
-
-  use_store_operation(
-      operation_store,
-      &(message->body.request.hash),
-      GNUNET_MESSENGER_OP_REQUEST,
-      GNUNET_MESSENGER_REQUEST_DELAY
-  );
+  struct GNUNET_MESSENGER_OperationStore *operation_store =
+    get_srv_room_operation_store (room);
+
+  use_store_operation (
+    operation_store,
+    &(message->body.request.hash),
+    GNUNET_MESSENGER_OP_REQUEST,
+    GNUNET_MESSENGER_REQUEST_DELAY
+    );
 }
diff --git a/src/service/messenger/gnunet-service-messenger_message_send.h 
b/src/service/messenger/gnunet-service-messenger_message_send.h
index 4f4c6cfc2..4c25c0913 100644
--- a/src/service/messenger/gnunet-service-messenger_message_send.h
+++ b/src/service/messenger/gnunet-service-messenger_message_send.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -29,10 +29,9 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 
-#include "gnunet-service-messenger_message_kind.h"
-
 #include "gnunet-service-messenger_tunnel.h"
 #include "messenger_api_message.h"
+#include "messenger_api_message_kind.h"
 
 /**
  * Handles a sent join message to ensure growth of the decentralized room 
structure.
@@ -49,6 +48,20 @@ send_message_join (struct GNUNET_MESSENGER_SrvRoom *room,
                    const struct GNUNET_MESSENGER_Message *message,
                    const struct GNUNET_HashCode *hash);
 
+/**
+ * Handles a sent key message to ensure changes to the public key of the 
sending handle.
+ *
+ * @param[in,out] room Room of the message
+ * @param[in,out] handle Sending handle
+ * @param[in] message KEY-Message
+ * @param[in] hash Hash of the message
+ */
+void
+send_message_key (struct GNUNET_MESSENGER_SrvRoom *room,
+                  struct GNUNET_MESSENGER_SrvHandle *handle,
+                  const struct GNUNET_MESSENGER_Message *message,
+                  const struct GNUNET_HashCode *hash);
+
 /**
  * Handles a sent peer message to update the rooms peer message of this 
service.
  * (a set peer message indicates this service being a part of the 
decentralized room structure)
diff --git a/src/service/messenger/gnunet-service-messenger_message_state.c 
b/src/service/messenger/gnunet-service-messenger_message_state.c
index b2328588e..112f03032 100644
--- a/src/service/messenger/gnunet-service-messenger_message_state.c
+++ b/src/service/messenger/gnunet-service-messenger_message_state.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -29,35 +29,38 @@
 void
 init_message_state (struct GNUNET_MESSENGER_MessageState *state)
 {
-  GNUNET_assert(state);
+  GNUNET_assert (state);
 
   init_list_messages (&(state->last_messages));
 }
 
+
 void
 clear_message_state (struct GNUNET_MESSENGER_MessageState *state)
 {
-  GNUNET_assert(state);
+  GNUNET_assert (state);
 
   clear_list_messages (&(state->last_messages));
 }
 
+
 void
 get_message_state_chain_hash (const struct GNUNET_MESSENGER_MessageState 
*state,
                               struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((state) && (hash));
+  GNUNET_assert ((state) && (hash));
 
   if (state->last_messages.head)
-    GNUNET_memcpy(hash, &(state->last_messages.head->hash), sizeof(*hash));
+    GNUNET_memcpy (hash, &(state->last_messages.head->hash), sizeof(*hash));
   else
     memset (hash, 0, sizeof(*hash));
 }
 
+
 const struct GNUNET_HashCode*
 get_message_state_merge_hash (const struct GNUNET_MESSENGER_MessageState 
*state)
 {
-  GNUNET_assert(state);
+  GNUNET_assert (state);
 
   if (state->last_messages.head == state->last_messages.tail)
     return NULL;
@@ -65,13 +68,14 @@ get_message_state_merge_hash (const struct 
GNUNET_MESSENGER_MessageState *state)
   return &(state->last_messages.tail->hash);
 }
 
+
 void
 update_message_state (struct GNUNET_MESSENGER_MessageState *state,
                       int requested,
                       const struct GNUNET_MESSENGER_Message *message,
                       const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((state) && (message) && (hash));
+  GNUNET_assert ((state) && (message) && (hash));
 
   if ((GNUNET_YES == requested) ||
       (GNUNET_MESSENGER_KIND_INFO == message->header.kind) ||
@@ -79,36 +83,38 @@ update_message_state (struct GNUNET_MESSENGER_MessageState 
*state,
     return;
 
   if (GNUNET_MESSENGER_KIND_MERGE == message->header.kind)
-    remove_from_list_messages(&(state->last_messages), 
&(message->body.merge.previous));
-  remove_from_list_messages(&(state->last_messages), 
&(message->header.previous));
+    remove_from_list_messages (&(state->last_messages),
+                               &(message->body.merge.previous));
+  remove_from_list_messages (&(state->last_messages),
+                             &(message->header.previous));
 
   add_to_list_messages (&(state->last_messages), hash);
 }
 
+
 void
 load_message_state (struct GNUNET_MESSENGER_MessageState *state,
                     const char *path)
 {
-  GNUNET_assert((state) && (path));
+  GNUNET_assert ((state) && (path));
 
   char *last_messages_file;
   GNUNET_asprintf (&last_messages_file, "%s%s", path, "last_messages.list");
 
-  load_list_messages(&(state->last_messages), last_messages_file);
-  GNUNET_free(last_messages_file);
+  load_list_messages (&(state->last_messages), last_messages_file);
+  GNUNET_free (last_messages_file);
 }
 
+
 void
 save_message_state (const struct GNUNET_MESSENGER_MessageState *state,
                     const char *path)
 {
-  GNUNET_assert((state) && (path));
+  GNUNET_assert ((state) && (path));
 
   char *last_messages_file;
   GNUNET_asprintf (&last_messages_file, "%s%s", path, "last_messages.list");
 
-  save_list_messages(&(state->last_messages), last_messages_file);
-  GNUNET_free(last_messages_file);
+  save_list_messages (&(state->last_messages), last_messages_file);
+  GNUNET_free (last_messages_file);
 }
-
-
diff --git a/src/service/messenger/gnunet-service-messenger_message_state.h 
b/src/service/messenger/gnunet-service-messenger_message_state.h
index 10e6a2c46..f6a1a41b9 100644
--- a/src/service/messenger/gnunet-service-messenger_message_state.h
+++ b/src/service/messenger/gnunet-service-messenger_message_state.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -48,7 +48,8 @@ get_message_state_chain_hash (const struct 
GNUNET_MESSENGER_MessageState *state,
                               struct GNUNET_HashCode *hash);
 
 const struct GNUNET_HashCode*
-get_message_state_merge_hash (const struct GNUNET_MESSENGER_MessageState 
*state);
+get_message_state_merge_hash (const struct
+                              GNUNET_MESSENGER_MessageState *state);
 
 void
 update_message_state (struct GNUNET_MESSENGER_MessageState *state,
diff --git a/src/service/messenger/gnunet-service-messenger_message_store.c 
b/src/service/messenger/gnunet-service-messenger_message_store.c
index 1f77de9ca..d4bccca5c 100644
--- a/src/service/messenger/gnunet-service-messenger_message_store.c
+++ b/src/service/messenger/gnunet-service-messenger_message_store.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -30,7 +30,7 @@
 void
 init_message_store (struct GNUNET_MESSENGER_MessageStore *store)
 {
-  GNUNET_assert(store);
+  GNUNET_assert (store);
 
   store->storage_messages = NULL;
 
@@ -42,6 +42,7 @@ init_message_store (struct GNUNET_MESSENGER_MessageStore 
*store)
   store->write_links = GNUNET_NO;
 }
 
+
 static int
 iterate_destroy_entries (void *cls,
                          const struct GNUNET_HashCode *key,
@@ -49,11 +50,12 @@ iterate_destroy_entries (void *cls,
 {
   struct GNUNET_MESSENGER_MessageEntry *entry = value;
 
-  GNUNET_free(entry);
+  GNUNET_free (entry);
 
   return GNUNET_YES;
 }
 
+
 static int
 iterate_destroy_messages (void *cls,
                           const struct GNUNET_HashCode *key,
@@ -66,6 +68,7 @@ iterate_destroy_messages (void *cls,
   return GNUNET_YES;
 }
 
+
 static int
 iterate_destroy_links (void *cls,
                        const struct GNUNET_HashCode *key,
@@ -73,15 +76,16 @@ iterate_destroy_links (void *cls,
 {
   struct GNUNET_HashCode *previous = value;
 
-  GNUNET_free(previous);
+  GNUNET_free (previous);
 
   return GNUNET_YES;
 }
 
+
 void
 clear_message_store (struct GNUNET_MESSENGER_MessageStore *store)
 {
-  GNUNET_assert(store);
+  GNUNET_assert (store);
 
   if (store->storage_messages)
   {
@@ -90,15 +94,19 @@ clear_message_store (struct GNUNET_MESSENGER_MessageStore 
*store)
     store->storage_messages = NULL;
   }
 
-  GNUNET_CONTAINER_multihashmap_iterate (store->entries, 
iterate_destroy_entries, NULL);
-  GNUNET_CONTAINER_multihashmap_iterate (store->messages, 
iterate_destroy_messages, NULL);
-  GNUNET_CONTAINER_multihashmap_iterate (store->links, iterate_destroy_links, 
NULL);
+  GNUNET_CONTAINER_multihashmap_iterate (store->entries,
+                                         iterate_destroy_entries, NULL);
+  GNUNET_CONTAINER_multihashmap_iterate (store->messages,
+                                         iterate_destroy_messages, NULL);
+  GNUNET_CONTAINER_multihashmap_iterate (store->links, iterate_destroy_links,
+                                         NULL);
 
   GNUNET_CONTAINER_multihashmap_destroy (store->entries);
   GNUNET_CONTAINER_multihashmap_destroy (store->messages);
   GNUNET_CONTAINER_multihashmap_destroy (store->links);
 }
 
+
 struct GNUNET_MESSENGER_MessageEntryStorage
 {
   struct GNUNET_HashCode hash;
@@ -106,10 +114,12 @@ struct GNUNET_MESSENGER_MessageEntryStorage
 };
 
 #define load_message_store_attribute_failed(file, attribute) \
-  sizeof(attribute) != GNUNET_DISK_file_read(file, &(attribute), 
sizeof(attribute))
+        sizeof(attribute) != GNUNET_DISK_file_read (file, &(attribute), \
+                                                    sizeof(attribute))
 
 #define save_message_store_attribute_failed(file, attribute) \
-  sizeof(attribute) != GNUNET_DISK_file_write(file, &(attribute), 
sizeof(attribute))
+        sizeof(attribute) != GNUNET_DISK_file_write (file, &(attribute), \
+                                                     sizeof(attribute))
 
 static void
 load_message_store_entries (struct GNUNET_MESSENGER_MessageStore *store,
@@ -117,31 +127,36 @@ load_message_store_entries (struct 
GNUNET_MESSENGER_MessageStore *store,
 {
   enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ);
 
-  struct GNUNET_DISK_FileHandle *entries = GNUNET_DISK_file_open (filename, 
GNUNET_DISK_OPEN_READ, permission);
+  struct GNUNET_DISK_FileHandle *entries = GNUNET_DISK_file_open (filename,
+                                                                  
GNUNET_DISK_OPEN_READ,
+                                                                  permission);
 
-  if (!entries)
+  if (! entries)
     return;
 
   struct GNUNET_MESSENGER_MessageEntryStorage storage;
   struct GNUNET_MESSENGER_MessageEntry *entry;
 
-  memset(&storage, 0, sizeof(storage));
+  memset (&storage, 0, sizeof(storage));
 
   do
   {
     entry = NULL;
 
-    if ((load_message_store_attribute_failed(entries, storage.hash)) ||
-        (load_message_store_attribute_failed(entries, storage.entry.offset)) ||
-        (load_message_store_attribute_failed(entries, storage.entry.length)))
+    if ((load_message_store_attribute_failed (entries, storage.hash)) ||
+        (load_message_store_attribute_failed (entries, storage.entry.offset)) 
||
+        (load_message_store_attribute_failed (entries, storage.entry.length)))
       break;
 
-    entry = GNUNET_new(struct GNUNET_MESSENGER_MessageEntry);
+    entry = GNUNET_new (struct GNUNET_MESSENGER_MessageEntry);
 
-    GNUNET_memcpy(entry, &(storage.entry), sizeof(*entry));
+    GNUNET_memcpy (entry, &(storage.entry), sizeof(*entry));
 
-    if ((GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (store->entries, 
&(storage.hash))) ||
-        (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (store->entries, 
&(storage.hash), entry,
+    if ((GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (store->entries,
+                                                               
&(storage.hash)))
+        ||
+        (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (store->entries,
+                                                         &(storage.hash), 
entry,
                                                          
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)))
     {
       store->rewrite_entries = GNUNET_YES;
@@ -151,11 +166,12 @@ load_message_store_entries (struct 
GNUNET_MESSENGER_MessageStore *store,
   while (entry);
 
   if (entry)
-    GNUNET_free(entry);
+    GNUNET_free (entry);
 
   GNUNET_DISK_file_close (entries);
 }
 
+
 struct GNUNET_MESSENGER_MessageLinkStorage
 {
   struct GNUNET_HashCode hash;
@@ -168,51 +184,59 @@ load_message_store_links (struct 
GNUNET_MESSENGER_MessageStore *store,
 {
   enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ);
 
-  struct GNUNET_DISK_FileHandle *entries = GNUNET_DISK_file_open (filename, 
GNUNET_DISK_OPEN_READ, permission);
+  struct GNUNET_DISK_FileHandle *entries = GNUNET_DISK_file_open (filename,
+                                                                  
GNUNET_DISK_OPEN_READ,
+                                                                  permission);
 
-  if (!entries)
+  if (! entries)
     return;
 
   struct GNUNET_MESSENGER_MessageLinkStorage storage;
   struct GNUNET_MESSENGER_MessageLink *link;
 
-  memset(&storage, 0, sizeof(storage));
+  memset (&storage, 0, sizeof(storage));
 
   do
   {
     link = NULL;
 
-    if ((load_message_store_attribute_failed(entries, storage.hash)) ||
-        (load_message_store_attribute_failed(entries, storage.link.multiple)) 
||
-        (load_message_store_attribute_failed(entries, storage.link.first)) ||
+    if ((load_message_store_attribute_failed (entries, storage.hash)) ||
+        (load_message_store_attribute_failed (entries,
+                                              storage.link.multiple)) ||
+        (load_message_store_attribute_failed (entries, storage.link.first)) ||
         ((GNUNET_YES == storage.link.multiple) &&
-         (load_message_store_attribute_failed(entries, storage.link.second))))
+         (load_message_store_attribute_failed (entries, storage.link.second))))
       break;
 
-    link = GNUNET_new(struct GNUNET_MESSENGER_MessageLink);
+    link = GNUNET_new (struct GNUNET_MESSENGER_MessageLink);
 
-    GNUNET_memcpy(link, &(storage.link), sizeof(*link));
+    GNUNET_memcpy (link, &(storage.link), sizeof(*link));
 
-    if ((GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (store->links, 
&(storage.hash))) ||
-        (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (store->links, 
&(storage.hash), link,
+    if ((GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (store->links,
+                                                               
&(storage.hash)))
+        ||
+        (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (store->links,
+                                                         &(storage.hash), link,
                                                          
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)))
       break;
   }
   while (link);
 
   if (link)
-    GNUNET_free(link);
+    GNUNET_free (link);
 
   GNUNET_DISK_file_close (entries);
 }
 
+
 void
 load_message_store (struct GNUNET_MESSENGER_MessageStore *store,
                     const char *directory)
 {
-  GNUNET_assert((store) && (directory));
+  GNUNET_assert ((store) && (directory));
 
-  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ 
| GNUNET_DISK_PERM_USER_WRITE);
+  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
+                                                   | 
GNUNET_DISK_PERM_USER_WRITE);
 
   if (store->storage_messages)
     GNUNET_DISK_file_close (store->storage_messages);
@@ -221,30 +245,33 @@ load_message_store (struct GNUNET_MESSENGER_MessageStore 
*store,
   GNUNET_asprintf (&filename, "%s%s", directory, "messages.store");
 
   if (GNUNET_YES == GNUNET_DISK_file_test (filename))
-    store->storage_messages = GNUNET_DISK_file_open (filename, 
GNUNET_DISK_OPEN_READWRITE, permission);
+    store->storage_messages = GNUNET_DISK_file_open (filename,
+                                                     
GNUNET_DISK_OPEN_READWRITE,
+                                                     permission);
   else
     store->storage_messages = NULL;
 
-  GNUNET_free(filename);
+  GNUNET_free (filename);
 
-  if (!store->storage_messages)
+  if (! store->storage_messages)
     return;
 
   GNUNET_asprintf (&filename, "%s%s", directory, "entries.store");
 
   if (GNUNET_YES == GNUNET_DISK_file_test (filename))
-    load_message_store_entries(store, filename);
+    load_message_store_entries (store, filename);
 
-  GNUNET_free(filename);
+  GNUNET_free (filename);
 
   GNUNET_asprintf (&filename, "%s%s", directory, "links.store");
 
   if (GNUNET_YES == GNUNET_DISK_file_test (filename))
-    load_message_store_links(store, filename);
+    load_message_store_links (store, filename);
 
-  GNUNET_free(filename);
+  GNUNET_free (filename);
 }
 
+
 struct GNUNET_MESSENGER_ClosureMessageSave
 {
   struct GNUNET_MESSENGER_MessageStore *store;
@@ -261,12 +288,15 @@ iterate_save_entries (void *cls,
   struct GNUNET_MESSENGER_MessageEntry *entry = value;
 
   GNUNET_DISK_file_write (save->storage, key, sizeof(*key));
-  GNUNET_DISK_file_write (save->storage, &(entry->offset), 
sizeof(entry->offset));
-  GNUNET_DISK_file_write (save->storage, &(entry->length), 
sizeof(entry->length));
+  GNUNET_DISK_file_write (save->storage, &(entry->offset),
+                          sizeof(entry->offset));
+  GNUNET_DISK_file_write (save->storage, &(entry->length),
+                          sizeof(entry->length));
 
   return GNUNET_YES;
 }
 
+
 static int
 iterate_save_messages (void *cls,
                        const struct GNUNET_HashCode *key,
@@ -274,33 +304,42 @@ iterate_save_messages (void *cls,
 {
   struct GNUNET_MESSENGER_ClosureMessageSave *save = cls;
 
-  if (GNUNET_NO != GNUNET_CONTAINER_multihashmap_contains 
(save->store->entries, key))
+  if (GNUNET_NO != GNUNET_CONTAINER_multihashmap_contains 
(save->store->entries,
+                                                           key))
     return GNUNET_YES;
 
   struct GNUNET_MESSENGER_Message *message = value;
   struct GNUNET_MESSENGER_MessageEntryStorage storage;
 
-  GNUNET_memcpy(&(storage.hash), key, sizeof(storage.hash));
+  GNUNET_memcpy (&(storage.hash), key, sizeof(storage.hash));
 
   storage.entry.length = get_message_size (message, GNUNET_YES);
-  storage.entry.offset = GNUNET_DISK_file_seek (save->store->storage_messages, 
0, GNUNET_DISK_SEEK_END);
+  storage.entry.offset = GNUNET_DISK_file_seek (save->store->storage_messages,
+                                                0, GNUNET_DISK_SEEK_END);
 
   if ((GNUNET_SYSERR == storage.entry.offset) ||
-      (save_message_store_attribute_failed(save->storage, storage.hash)) ||
-      (save_message_store_attribute_failed(save->storage, 
storage.entry.offset)) ||
-      (save_message_store_attribute_failed(save->storage, 
storage.entry.length)))
+      (save_message_store_attribute_failed (save->storage, storage.hash)) ||
+      (save_message_store_attribute_failed (save->storage,
+                                            storage.entry.offset)) ||
+      (save_message_store_attribute_failed (save->storage,
+                                            storage.entry.length)))
     return GNUNET_YES;
 
-  char *buffer = GNUNET_malloc(storage.entry.length);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Storing message with hash: %s\n",
+              GNUNET_h2s (&(storage.hash)));
+
+  char *buffer = GNUNET_malloc (storage.entry.length);
 
   encode_message (message, storage.entry.length, buffer, GNUNET_YES);
 
-  GNUNET_DISK_file_write (save->store->storage_messages, buffer, 
storage.entry.length);
+  GNUNET_DISK_file_write (save->store->storage_messages, buffer,
+                          storage.entry.length);
 
-  GNUNET_free(buffer);
+  GNUNET_free (buffer);
   return GNUNET_YES;
 }
 
+
 static int
 iterate_save_links (void *cls,
                     const struct GNUNET_HashCode *key,
@@ -310,24 +349,28 @@ iterate_save_links (void *cls,
   struct GNUNET_MESSENGER_MessageLink *link = value;
 
   GNUNET_DISK_file_write (save->storage, key, sizeof(*key));
-  GNUNET_DISK_file_write (save->storage, &(link->multiple), 
sizeof(link->multiple));
+  GNUNET_DISK_file_write (save->storage, &(link->multiple),
+                          sizeof(link->multiple));
   GNUNET_DISK_file_write (save->storage, &(link->first), sizeof(link->first));
 
   if (GNUNET_YES == link->multiple)
-    GNUNET_DISK_file_write (save->storage, &(link->second), 
sizeof(link->second));
+    GNUNET_DISK_file_write (save->storage, &(link->second),
+                            sizeof(link->second));
 
   return GNUNET_YES;
 }
 
+
 void
 save_message_store (struct GNUNET_MESSENGER_MessageStore *store,
                     const char *directory)
 {
-  GNUNET_assert((store) && (directory));
+  GNUNET_assert ((store) && (directory));
 
   struct GNUNET_MESSENGER_ClosureMessageSave save;
 
-  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ 
| GNUNET_DISK_PERM_USER_WRITE);
+  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
+                                                   | 
GNUNET_DISK_PERM_USER_WRITE);
 
   char *filename;
 
@@ -337,17 +380,20 @@ save_message_store (struct GNUNET_MESSENGER_MessageStore 
*store,
   GNUNET_asprintf (&filename, "%s%s", directory, "links.store");
 
   save.store = store;
-  save.storage = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_WRITE | 
GNUNET_DISK_OPEN_CREATE, permission);
+  save.storage = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_WRITE
+                                        | GNUNET_DISK_OPEN_CREATE, permission);
 
-  GNUNET_free(filename);
+  GNUNET_free (filename);
 
-  if (!save.storage)
+  if (! save.storage)
     goto save_entries;
 
-  if (GNUNET_SYSERR == GNUNET_DISK_file_seek (save.storage, 0, 
GNUNET_DISK_SEEK_SET))
+  if (GNUNET_SYSERR == GNUNET_DISK_file_seek (save.storage, 0,
+                                              GNUNET_DISK_SEEK_SET))
     goto close_links;
 
-  GNUNET_CONTAINER_multihashmap_iterate (store->links, iterate_save_links, 
&save);
+  GNUNET_CONTAINER_multihashmap_iterate (store->links, iterate_save_links,
+                                         &save);
   store->write_links = GNUNET_NO;
 
 close_links:
@@ -357,22 +403,26 @@ save_entries:
   GNUNET_asprintf (&filename, "%s%s", directory, "entries.store");
 
   save.store = store;
-  save.storage = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_WRITE | 
GNUNET_DISK_OPEN_CREATE, permission);
+  save.storage = GNUNET_DISK_file_open (filename, GNUNET_DISK_OPEN_WRITE
+                                        | GNUNET_DISK_OPEN_CREATE, permission);
 
-  GNUNET_free(filename);
+  GNUNET_free (filename);
 
-  if (!save.storage)
+  if (! save.storage)
     return;
 
   if (GNUNET_YES == store->rewrite_entries)
   {
-    if (GNUNET_SYSERR == GNUNET_DISK_file_seek (save.storage, 0, 
GNUNET_DISK_SEEK_SET))
+    if (GNUNET_SYSERR == GNUNET_DISK_file_seek (save.storage, 0,
+                                                GNUNET_DISK_SEEK_SET))
       goto close_entries;
 
-    GNUNET_CONTAINER_multihashmap_iterate (store->entries, 
iterate_save_entries, &save);
+    GNUNET_CONTAINER_multihashmap_iterate (store->entries, 
iterate_save_entries,
+                                           &save);
     store->rewrite_entries = GNUNET_NO;
   }
-  else if (GNUNET_SYSERR == GNUNET_DISK_file_seek (save.storage, 0, 
GNUNET_DISK_SEEK_END))
+  else if (GNUNET_SYSERR == GNUNET_DISK_file_seek (save.storage, 0,
+                                                   GNUNET_DISK_SEEK_END))
     goto close_entries;
 
   if (store->storage_messages)
@@ -380,14 +430,17 @@ save_entries:
 
   GNUNET_asprintf (&filename, "%s%s", directory, "messages.store");
 
-  store->storage_messages = GNUNET_DISK_file_open (filename, 
GNUNET_DISK_OPEN_READWRITE | GNUNET_DISK_OPEN_CREATE,
+  store->storage_messages = GNUNET_DISK_file_open (filename,
+                                                   GNUNET_DISK_OPEN_READWRITE
+                                                   | GNUNET_DISK_OPEN_CREATE,
                                                    permission);
 
-  GNUNET_free(filename);
+  GNUNET_free (filename);
 
   if (store->storage_messages)
   {
-    GNUNET_CONTAINER_multihashmap_iterate (store->messages, 
iterate_save_messages, &save);
+    GNUNET_CONTAINER_multihashmap_iterate (store->messages,
+                                           iterate_save_messages, &save);
 
     GNUNET_DISK_file_sync (store->storage_messages);
     GNUNET_DISK_file_sync (save.storage);
@@ -397,80 +450,94 @@ close_entries:
   GNUNET_DISK_file_close (save.storage);
 }
 
+
 int
 contains_store_message (const struct GNUNET_MESSENGER_MessageStore *store,
                         const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((store) && (hash));
+  GNUNET_assert ((store) && (hash));
 
-  if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (store->messages, 
hash))
+  if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (store->messages,
+                                                            hash))
     return GNUNET_YES;
 
   return GNUNET_CONTAINER_multihashmap_contains (store->entries, hash);
 }
 
+
 const struct GNUNET_MESSENGER_Message*
 get_store_message (struct GNUNET_MESSENGER_MessageStore *store,
                    const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((store) && (hash));
+  GNUNET_assert ((store) && (hash));
 
-  struct GNUNET_MESSENGER_Message *message = GNUNET_CONTAINER_multihashmap_get 
(store->messages, hash);
+  struct GNUNET_MESSENGER_Message *message = GNUNET_CONTAINER_multihashmap_get 
(
+    store->messages, hash);
 
   if (message)
     return message;
 
-  if (!store->storage_messages)
+  if (! store->storage_messages)
     return NULL;
 
-  const struct GNUNET_MESSENGER_MessageEntry *entry = 
GNUNET_CONTAINER_multihashmap_get (store->entries, hash);
+  const struct GNUNET_MESSENGER_MessageEntry *entry =
+    GNUNET_CONTAINER_multihashmap_get (store->entries, hash);
 
-  if (!entry)
+  if (! entry)
     return NULL;
 
-  if (entry->offset != GNUNET_DISK_file_seek (store->storage_messages, 
entry->offset, GNUNET_DISK_SEEK_SET))
+  if (entry->offset != GNUNET_DISK_file_seek (store->storage_messages,
+                                              entry->offset,
+                                              GNUNET_DISK_SEEK_SET))
     return message;
 
-  char *buffer = GNUNET_malloc(entry->length);
+  char *buffer = GNUNET_malloc (entry->length);
 
-  if (!buffer)
+  if (! buffer)
     return NULL;
 
-  if ((GNUNET_DISK_file_read (store->storage_messages, buffer, entry->length) 
!= entry->length) ||
-      (entry->length < get_message_kind_size(GNUNET_MESSENGER_KIND_UNKNOWN, 
GNUNET_YES)))
+  if ((GNUNET_DISK_file_read (store->storage_messages, buffer, entry->length) 
!=
+       entry->length) ||
+      (entry->length < get_message_kind_size (GNUNET_MESSENGER_KIND_UNKNOWN,
+                                              GNUNET_YES)))
     goto free_buffer;
 
   message = create_message (GNUNET_MESSENGER_KIND_UNKNOWN);
 
-  const int decoding = decode_message (message, entry->length, buffer, 
GNUNET_YES, NULL);
+  const int decoding = decode_message (message, entry->length, buffer,
+                                       GNUNET_YES, NULL);
 
   struct GNUNET_HashCode check;
   hash_message (message, entry->length, buffer, &check);
 
   if ((GNUNET_YES != decoding) || (GNUNET_CRYPTO_hash_cmp (hash, &check) != 0))
   {
-    if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (store->entries, 
hash, entry))
-      GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Corrupted entry could not be 
removed from store: %s\n",
-                 GNUNET_h2s(hash));
+    if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (store->entries,
+                                                            hash, entry))
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "Corrupted entry could not be removed from store: %s\n",
+                  GNUNET_h2s (hash));
 
     store->rewrite_entries = GNUNET_YES;
 
     goto free_message;
   }
 
-  if (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put (store->messages, hash, 
message,
+  if (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put (store->messages, hash,
+                                                      message,
                                                       
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
     goto free_buffer;
 
-free_message: destroy_message (message);
+  free_message : destroy_message (message);
   message = NULL;
 
 free_buffer:
-  GNUNET_free(buffer);
+  GNUNET_free (buffer);
 
   return message;
 }
 
+
 const struct GNUNET_MESSENGER_MessageLink*
 get_store_message_link (struct GNUNET_MESSENGER_MessageStore *store,
                         const struct GNUNET_HashCode *hash,
@@ -479,21 +546,26 @@ get_store_message_link (struct 
GNUNET_MESSENGER_MessageStore *store,
   if (deleted_only)
     goto get_link;
 
-  const struct GNUNET_MESSENGER_Message *message = get_store_message(store, 
hash);
+  const struct GNUNET_MESSENGER_Message *message = get_store_message (store,
+                                                                      hash);
 
-  if (!message)
+  if (! message)
     goto get_link;
 
   static struct GNUNET_MESSENGER_MessageLink link;
 
-  GNUNET_memcpy(&(link.first), &(message->header.previous), 
sizeof(link.first));
+  GNUNET_memcpy (&(link.first), &(message->header.previous),
+                 sizeof(link.first));
 
-  link.multiple = GNUNET_MESSENGER_KIND_MERGE == message->header.kind? 
GNUNET_YES : GNUNET_NO;
+  link.multiple = GNUNET_MESSENGER_KIND_MERGE == message->header.kind?
+                  GNUNET_YES : GNUNET_NO;
 
   if (GNUNET_YES == link.multiple)
-    GNUNET_memcpy(&(link.second), &(message->body.merge.previous), 
sizeof(link.second));
+    GNUNET_memcpy (&(link.second), &(message->body.merge.previous),
+                   sizeof(link.second));
   else
-    GNUNET_memcpy(&(link.second), &(message->header.previous), 
sizeof(link.second));
+    GNUNET_memcpy (&(link.second), &(message->header.previous),
+                   sizeof(link.second));
 
   return &link;
 
@@ -501,78 +573,95 @@ get_link:
   return GNUNET_CONTAINER_multihashmap_get (store->links, hash);
 }
 
+
 int
 put_store_message (struct GNUNET_MESSENGER_MessageStore *store,
                    const struct GNUNET_HashCode *hash,
                    struct GNUNET_MESSENGER_Message *message)
 {
-  GNUNET_assert((store) && (hash) && (message));
+  GNUNET_assert ((store) && (hash) && (message));
 
   return GNUNET_CONTAINER_multihashmap_put (store->messages, hash, message,
                                             
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
 }
 
+
 static void
 add_link (struct GNUNET_MESSENGER_MessageStore *store,
           const struct GNUNET_HashCode *hash,
           const struct GNUNET_MESSENGER_Message *message)
 {
-  struct GNUNET_MESSENGER_MessageLink *link = GNUNET_new(struct 
GNUNET_MESSENGER_MessageLink);
+  struct GNUNET_MESSENGER_MessageLink *link = GNUNET_new (struct
+                                                          
GNUNET_MESSENGER_MessageLink);
 
-  GNUNET_memcpy(&(link->first), &(message->header.previous), 
sizeof(link->first));
+  GNUNET_memcpy (&(link->first), &(message->header.previous),
+                 sizeof(link->first));
 
-  link->multiple = GNUNET_MESSENGER_KIND_MERGE == message->header.kind? 
GNUNET_YES : GNUNET_NO;
+  link->multiple = GNUNET_MESSENGER_KIND_MERGE == message->header.kind?
+                   GNUNET_YES : GNUNET_NO;
 
   if (GNUNET_YES == link->multiple)
-    GNUNET_memcpy(&(link->second), &(message->body.merge.previous), 
sizeof(link->second));
+    GNUNET_memcpy (&(link->second), &(message->body.merge.previous),
+                   sizeof(link->second));
   else
-    GNUNET_memcpy(&(link->second), &(message->header.previous), 
sizeof(link->second));
+    GNUNET_memcpy (&(link->second), &(message->header.previous),
+                   sizeof(link->second));
 
-  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(store->links, hash, link,
-                                                     
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
-    GNUNET_free(link);
+  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (store->links, hash, link,
+                                                      
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+    GNUNET_free (link);
 }
 
+
 int
 delete_store_message (struct GNUNET_MESSENGER_MessageStore *store,
                       const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((store) && (hash));
+  GNUNET_assert ((store) && (hash));
 
-  const struct GNUNET_MESSENGER_MessageEntry *entry = 
GNUNET_CONTAINER_multihashmap_get (store->entries, hash);
+  const struct GNUNET_MESSENGER_MessageEntry *entry =
+    GNUNET_CONTAINER_multihashmap_get (store->entries, hash);
 
-  if (!entry)
+  if (! entry)
     goto clear_memory;
 
-  const struct GNUNET_MESSENGER_Message *message = get_store_message(store, 
hash);
+  const struct GNUNET_MESSENGER_Message *message = get_store_message (store,
+                                                                      hash);
 
   if (message)
     add_link (store, hash, message);
 
-  if (!store->storage_messages)
+  if (! store->storage_messages)
     goto clear_entry;
 
-  if (entry->offset != GNUNET_DISK_file_seek (store->storage_messages, 
entry->offset, GNUNET_DISK_SEEK_SET))
+  if (entry->offset != GNUNET_DISK_file_seek (store->storage_messages,
+                                              entry->offset,
+                                              GNUNET_DISK_SEEK_SET))
     return GNUNET_SYSERR;
 
-  char *clear_buffer = GNUNET_malloc(entry->length);
+  char *clear_buffer = GNUNET_malloc (entry->length);
 
-  if (!clear_buffer)
+  if (! clear_buffer)
     return GNUNET_SYSERR;
 
   GNUNET_CRYPTO_zero_keys (clear_buffer, entry->length);
 
-  if ((entry->length != GNUNET_DISK_file_write (store->storage_messages, 
clear_buffer, entry->length)) || (GNUNET_OK
-      != GNUNET_DISK_file_sync (store->storage_messages)))
+  if ((entry->length != GNUNET_DISK_file_write (store->storage_messages,
+                                                clear_buffer, entry->length)) 
||
+      (GNUNET_OK
+       !=
+       GNUNET_DISK_file_sync (
+         store->storage_messages)))
   {
-    GNUNET_free(clear_buffer);
+    GNUNET_free (clear_buffer);
     return GNUNET_SYSERR;
   }
 
-  GNUNET_free(clear_buffer);
+  GNUNET_free (clear_buffer);
 
 clear_entry:
-  if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (store->entries, 
hash, entry))
+  if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (store->entries, hash,
+                                                          entry))
     store->rewrite_entries = GNUNET_YES;
 
 clear_memory:
diff --git a/src/service/messenger/gnunet-service-messenger_operation.c 
b/src/service/messenger/gnunet-service-messenger_operation.c
index 9c4201fdf..f13db7de0 100644
--- a/src/service/messenger/gnunet-service-messenger_operation.c
+++ b/src/service/messenger/gnunet-service-messenger_operation.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2021 GNUnet e.V.
+   Copyright (C) 2021, 2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -31,30 +31,33 @@
 struct GNUNET_MESSENGER_Operation*
 create_operation (const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert(hash);
+  GNUNET_assert (hash);
 
-  struct GNUNET_MESSENGER_Operation *op = GNUNET_new(struct 
GNUNET_MESSENGER_Operation);
+  struct GNUNET_MESSENGER_Operation *op = GNUNET_new (struct
+                                                      
GNUNET_MESSENGER_Operation);
 
   op->type = GNUNET_MESSENGER_OP_UNKNOWN;
-  GNUNET_memcpy(&(op->hash), hash, sizeof(*hash));
-  op->timestamp = GNUNET_TIME_absolute_get_zero_();
+  GNUNET_memcpy (&(op->hash), hash, sizeof(*hash));
+  op->timestamp = GNUNET_TIME_absolute_get_zero_ ();
   op->store = NULL;
   op->task = NULL;
 
   return op;
 }
 
+
 void
 destroy_operation (struct GNUNET_MESSENGER_Operation *op)
 {
-  GNUNET_assert(op);
+  GNUNET_assert (op);
 
   if (op->task)
-    GNUNET_SCHEDULER_cancel(op->task);
+    GNUNET_SCHEDULER_cancel (op->task);
 
-  GNUNET_free(op);
+  GNUNET_free (op);
 }
 
+
 static void
 callback_operation (void *cls);
 
@@ -62,25 +65,28 @@ struct GNUNET_MESSENGER_Operation*
 load_operation (struct GNUNET_MESSENGER_OperationStore *store,
                 const char *path)
 {
-  GNUNET_assert((store) && (path));
+  GNUNET_assert ((store) && (path));
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load operation configuration: %s\n", 
path);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Load operation configuration: %s\n",
+              path);
 
   struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
-  struct GNUNET_MESSENGER_Operation* op = NULL;
+  struct GNUNET_MESSENGER_Operation *op = NULL;
 
-  if (GNUNET_OK != GNUNET_CONFIGURATION_parse(cfg, path))
+  if (GNUNET_OK != GNUNET_CONFIGURATION_parse (cfg, path))
     goto destroy_config;
 
   struct GNUNET_HashCode hash;
 
-  if (GNUNET_OK != GNUNET_CONFIGURATION_get_data (cfg, "operation", "hash", 
&hash, sizeof(hash)))
+  if (GNUNET_OK != GNUNET_CONFIGURATION_get_data (cfg, "operation", "hash",
+                                                  &hash, sizeof(hash)))
     goto destroy_config;
 
-  op = create_operation(&hash);
+  op = create_operation (&hash);
 
   unsigned long long type_number;
-  if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(cfg, "operation", 
"type", &type_number))
+  if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (cfg, "operation",
+                                                          "type", 
&type_number))
     switch (type_number)
     {
     case GNUNET_MESSENGER_OP_REQUEST:
@@ -97,21 +103,25 @@ load_operation (struct GNUNET_MESSENGER_OperationStore 
*store,
     }
 
   if ((GNUNET_MESSENGER_OP_UNKNOWN == op->type) ||
-      (GNUNET_OK != GNUNET_CONFIGURATION_get_data (cfg, "operation", 
"timestamp", &(op->timestamp), sizeof(op->timestamp))))
+      (GNUNET_OK != GNUNET_CONFIGURATION_get_data (cfg, "operation",
+                                                   "timestamp",
+                                                   &(op->timestamp),
+                                                   sizeof(op->timestamp))))
   {
-    destroy_operation(op);
+    destroy_operation (op);
     op = NULL;
     goto destroy_config;
   }
 
-  const struct GNUNET_TIME_Relative delay = 
GNUNET_TIME_absolute_get_remaining(op->timestamp);
+  const struct GNUNET_TIME_Relative delay = GNUNET_TIME_absolute_get_remaining 
(
+    op->timestamp);
 
-  op->task = GNUNET_SCHEDULER_add_delayed_with_priority(
-      delay,
-      GNUNET_SCHEDULER_PRIORITY_BACKGROUND,
-      callback_operation,
-      op
-  );
+  op->task = GNUNET_SCHEDULER_add_delayed_with_priority (
+    delay,
+    GNUNET_SCHEDULER_PRIORITY_BACKGROUND,
+    callback_operation,
+    op
+    );
 
   op->store = store;
 
@@ -121,42 +131,48 @@ destroy_config:
   return op;
 }
 
+
 void
 save_operation (const struct GNUNET_MESSENGER_Operation *op,
                 const char *path)
 {
-  GNUNET_assert((path) && (op));
+  GNUNET_assert ((path) && (op));
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Save operation configuration: %s\n", 
path);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Save operation configuration: %s\n",
+              path);
 
   struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
 
   char *hash_data;
-  hash_data = GNUNET_STRINGS_data_to_string_alloc (&(op->hash), 
sizeof(op->hash));
+  hash_data = GNUNET_STRINGS_data_to_string_alloc (&(op->hash),
+                                                   sizeof(op->hash));
 
   if (hash_data)
   {
     GNUNET_CONFIGURATION_set_value_string (cfg, "operation", "hash", 
hash_data);
 
-    GNUNET_free(hash_data);
+    GNUNET_free (hash_data);
   }
 
-  GNUNET_CONFIGURATION_set_value_number(cfg, "operation", "type", op->type);
+  GNUNET_CONFIGURATION_set_value_number (cfg, "operation", "type", op->type);
 
   char *timestamp_data;
-  timestamp_data = GNUNET_STRINGS_data_to_string_alloc (&(op->timestamp), 
sizeof(op->timestamp));
+  timestamp_data = GNUNET_STRINGS_data_to_string_alloc (&(op->timestamp),
+                                                        sizeof(op->timestamp));
 
   if (timestamp_data)
   {
-    GNUNET_CONFIGURATION_set_value_string (cfg, "operation", "timestamp", 
timestamp_data);
+    GNUNET_CONFIGURATION_set_value_string (cfg, "operation", "timestamp",
+                                           timestamp_data);
 
-    GNUNET_free(timestamp_data);
+    GNUNET_free (timestamp_data);
   }
 
   GNUNET_CONFIGURATION_write (cfg, path);
   GNUNET_CONFIGURATION_destroy (cfg);
 }
 
+
 extern void
 callback_store_operation (struct GNUNET_MESSENGER_OperationStore *store,
                           enum GNUNET_MESSENGER_OperationType type,
@@ -172,28 +188,29 @@ callback_operation (void *cls)
   callback_store_operation (op->store, op->type, &(op->hash));
 }
 
+
 int
 start_operation (struct GNUNET_MESSENGER_Operation *op,
                  enum GNUNET_MESSENGER_OperationType type,
                  struct GNUNET_MESSENGER_OperationStore *store,
                  struct GNUNET_TIME_Relative delay)
 {
-  GNUNET_assert((op) && (store));
+  GNUNET_assert ((op) && (store));
 
   if (op->task)
     return GNUNET_SYSERR;
 
-  const struct GNUNET_TIME_Absolute timestamp = GNUNET_TIME_absolute_add(
-      GNUNET_TIME_absolute_get(),
-      delay
-  );
+  const struct GNUNET_TIME_Absolute timestamp = GNUNET_TIME_absolute_add (
+    GNUNET_TIME_absolute_get (),
+    delay
+    );
 
-  op->task = GNUNET_SCHEDULER_add_delayed_with_priority(
-      delay,
-      GNUNET_SCHEDULER_PRIORITY_BACKGROUND,
-      callback_operation,
-      op
-  );
+  op->task = GNUNET_SCHEDULER_add_delayed_with_priority (
+    delay,
+    GNUNET_SCHEDULER_PRIORITY_BACKGROUND,
+    callback_operation,
+    op
+    );
 
   op->type = type;
   op->timestamp = timestamp;
@@ -202,19 +219,20 @@ start_operation (struct GNUNET_MESSENGER_Operation *op,
   return GNUNET_OK;
 }
 
+
 int
 stop_operation (struct GNUNET_MESSENGER_Operation *op)
 {
-  GNUNET_assert(op);
+  GNUNET_assert (op);
 
-  if (!op->task)
+  if (! op->task)
     return GNUNET_SYSERR;
 
-  GNUNET_SCHEDULER_cancel(op->task);
+  GNUNET_SCHEDULER_cancel (op->task);
   op->task = NULL;
 
   op->type = GNUNET_MESSENGER_OP_UNKNOWN;
-  op->timestamp = GNUNET_TIME_absolute_get_zero_();
+  op->timestamp = GNUNET_TIME_absolute_get_zero_ ();
   op->store = NULL;
 
   return GNUNET_OK;
diff --git a/src/service/messenger/gnunet-service-messenger_operation.h 
b/src/service/messenger/gnunet-service-messenger_operation.h
index b93282d24..6631693cf 100644
--- a/src/service/messenger/gnunet-service-messenger_operation.h
+++ b/src/service/messenger/gnunet-service-messenger_operation.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2021 GNUnet e.V.
+   Copyright (C) 2021, 2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -51,7 +51,7 @@ struct GNUNET_MESSENGER_Operation
   struct GNUNET_TIME_Absolute timestamp;
 
   struct GNUNET_MESSENGER_OperationStore *store;
-  struct GNUNET_SCHEDULER_Task* task;
+  struct GNUNET_SCHEDULER_Task *task;
 };
 
 /**
diff --git a/src/service/messenger/gnunet-service-messenger_operation_store.c 
b/src/service/messenger/gnunet-service-messenger_operation_store.c
index 6a639d69e..670d5cdf5 100644
--- a/src/service/messenger/gnunet-service-messenger_operation_store.c
+++ b/src/service/messenger/gnunet-service-messenger_operation_store.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2021 GNUnet e.V.
+   Copyright (C) 2021, 2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -33,12 +33,13 @@ void
 init_operation_store (struct GNUNET_MESSENGER_OperationStore *store,
                       struct GNUNET_MESSENGER_SrvRoom *room)
 {
-  GNUNET_assert((store) && (room));
+  GNUNET_assert ((store) && (room));
 
   store->room = room;
-  store->operations = GNUNET_CONTAINER_multihashmap_create(8, GNUNET_NO);
+  store->operations = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
 }
 
+
 static int
 iterate_destroy_operations (void *cls,
                             const struct GNUNET_HashCode *key,
@@ -46,20 +47,23 @@ iterate_destroy_operations (void *cls,
 {
   struct GNUNET_MESSENGER_Operation *op = value;
 
-  destroy_operation(op);
+  destroy_operation (op);
 
   return GNUNET_YES;
 }
 
+
 void
 clear_operation_store (struct GNUNET_MESSENGER_OperationStore *store)
 {
-  GNUNET_assert(store);
+  GNUNET_assert (store);
 
-  GNUNET_CONTAINER_multihashmap_iterate (store->operations, 
iterate_destroy_operations, NULL);
-  GNUNET_CONTAINER_multihashmap_destroy(store->operations);
+  GNUNET_CONTAINER_multihashmap_iterate (store->operations,
+                                         iterate_destroy_operations, NULL);
+  GNUNET_CONTAINER_multihashmap_destroy (store->operations);
 }
 
+
 static int
 callback_scan_for_operations (void *cls,
                               const char *filename)
@@ -69,37 +73,40 @@ callback_scan_for_operations (void *cls,
   if (GNUNET_YES != GNUNET_DISK_file_test (filename))
     return GNUNET_OK;
 
-  if ((strlen(filename) <= 4) || (0 != strcmp(filename + strlen(filename) - 4, 
".cfg")))
+  if ((strlen (filename) <= 4) || (0 != strcmp (filename + strlen (filename)
+                                                - 4, ".cfg")))
     return GNUNET_OK;
 
-  struct GNUNET_MESSENGER_Operation *op = load_operation(store, filename);
+  struct GNUNET_MESSENGER_Operation *op = load_operation (store, filename);
 
-  if ((op) && (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(
-      store->operations,
-      &(op->hash), op,
-      GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)))
+  if ((op) && (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (
+                 store->operations,
+                 &(op->hash), op,
+                 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)))
   {
-    destroy_operation(op);
+    destroy_operation (op);
   }
 
   return GNUNET_OK;
 }
 
+
 void
 load_operation_store (struct GNUNET_MESSENGER_OperationStore *store,
                       const char *directory)
 {
   GNUNET_assert ((store) && (directory));
 
-  char* load_dir;
+  char *load_dir;
   GNUNET_asprintf (&load_dir, "%s%s%c", directory, "operations", 
DIR_SEPARATOR);
 
   if (GNUNET_OK == GNUNET_DISK_directory_test (load_dir, GNUNET_YES))
     GNUNET_DISK_directory_scan (load_dir, callback_scan_for_operations, store);
 
-  GNUNET_free(load_dir);
+  GNUNET_free (load_dir);
 }
 
+
 static int
 iterate_save_operations (void *cls,
                          const struct GNUNET_HashCode *key,
@@ -109,65 +116,73 @@ iterate_save_operations (void *cls,
 
   struct GNUNET_MESSENGER_Operation *op = value;
 
-  if (!op)
+  if (! op)
     return GNUNET_YES;
 
   char *op_dir;
-  GNUNET_asprintf (&op_dir, "%s%s.cfg", save_dir, GNUNET_h2s(key));
-  save_operation(op, op_dir);
+  GNUNET_asprintf (&op_dir, "%s%s.cfg", save_dir, GNUNET_h2s (key));
+  save_operation (op, op_dir);
 
-  GNUNET_free(op_dir);
+  GNUNET_free (op_dir);
   return GNUNET_YES;
 }
 
+
 void
 save_operation_store (const struct GNUNET_MESSENGER_OperationStore *store,
                       const char *directory)
 {
   GNUNET_assert ((store) && (directory));
 
-  char* save_dir;
+  char *save_dir;
   GNUNET_asprintf (&save_dir, "%s%s%c", directory, "operations", 
DIR_SEPARATOR);
 
   if ((GNUNET_YES == GNUNET_DISK_directory_test (save_dir, GNUNET_NO)) ||
       (GNUNET_OK == GNUNET_DISK_directory_create (save_dir)))
-    GNUNET_CONTAINER_multihashmap_iterate (store->operations, 
iterate_save_operations, save_dir);
+    GNUNET_CONTAINER_multihashmap_iterate (store->operations,
+                                           iterate_save_operations, save_dir);
 
-  GNUNET_free(save_dir);
+  GNUNET_free (save_dir);
 }
 
+
 enum GNUNET_MESSENGER_OperationType
 get_store_operation_type (const struct GNUNET_MESSENGER_OperationStore *store,
                           const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((store) && (hash));
+  GNUNET_assert ((store) && (hash));
 
-  struct GNUNET_MESSENGER_Operation *op = 
GNUNET_CONTAINER_multihashmap_get(store->operations, hash);
+  struct GNUNET_MESSENGER_Operation *op = GNUNET_CONTAINER_multihashmap_get (
+    store->operations, hash);
 
-  if (!op)
+  if (! op)
     return GNUNET_MESSENGER_OP_UNKNOWN;
 
   return op->type;
 }
 
+
 int
 use_store_operation (struct GNUNET_MESSENGER_OperationStore *store,
                      const struct GNUNET_HashCode *hash,
                      enum GNUNET_MESSENGER_OperationType type,
                      struct GNUNET_TIME_Relative delay)
 {
-  GNUNET_assert((store) && (hash));
+  GNUNET_assert ((store) && (hash));
 
-  struct GNUNET_MESSENGER_Operation *op = 
GNUNET_CONTAINER_multihashmap_get(store->operations, hash);
+  struct GNUNET_MESSENGER_Operation *op = GNUNET_CONTAINER_multihashmap_get (
+    store->operations, hash);
 
   if (op)
     goto use_op;
 
-  op = create_operation(hash);
+  op = create_operation (hash);
 
-  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(store->operations, hash, 
op, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
+  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (store->operations, hash,
+                                                      op,
+                                                      
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
   {
-    destroy_operation(op);
+    destroy_operation (op);
 
     return GNUNET_SYSERR;
   }
@@ -177,29 +192,34 @@ use_op:
       (type == GNUNET_MESSENGER_OP_DELETE))
     stop_operation (op);
 
-  return start_operation(op, type, store, delay);
+  return start_operation (op, type, store, delay);
 }
 
+
 void
 cancel_store_operation (struct GNUNET_MESSENGER_OperationStore *store,
                         const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((store) && (hash));
+  GNUNET_assert ((store) && (hash));
 
-  struct GNUNET_MESSENGER_Operation *op = 
GNUNET_CONTAINER_multihashmap_get(store->operations, hash);
+  struct GNUNET_MESSENGER_Operation *op = GNUNET_CONTAINER_multihashmap_get (
+    store->operations, hash);
 
-  if (!op)
+  if (! op)
     return;
 
-  stop_operation(op);
+  stop_operation (op);
 
-  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove(store->operations, 
hash, op))
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Canceled operation could not be 
removed: %s\n",
-               GNUNET_h2s(hash));
+  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (store->operations,
+                                                          hash, op))
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Canceled operation could not be removed: %s\n",
+                GNUNET_h2s (hash));
 
-  destroy_operation(op);
+  destroy_operation (op);
 }
 
+
 extern void
 callback_room_deletion (struct GNUNET_MESSENGER_SrvRoom *room,
                         const struct GNUNET_HashCode *hash);
@@ -213,10 +233,10 @@ callback_store_operation (struct 
GNUNET_MESSENGER_OperationStore *store,
                           enum GNUNET_MESSENGER_OperationType type,
                           const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((store) && (hash));
+  GNUNET_assert ((store) && (hash));
 
   struct GNUNET_HashCode op_hash;
-  GNUNET_memcpy(&op_hash, hash, sizeof(op_hash));
+  GNUNET_memcpy (&op_hash, hash, sizeof(op_hash));
   cancel_store_operation (store, &op_hash);
 
   struct GNUNET_MESSENGER_SrvRoom *room = store->room;
diff --git a/src/service/messenger/gnunet-service-messenger_room.c 
b/src/service/messenger/gnunet-service-messenger_room.c
index f2f841c20..f08bfb402 100644
--- a/src/service/messenger/gnunet-service-messenger_room.c
+++ b/src/service/messenger/gnunet-service-messenger_room.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2022 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -27,7 +27,7 @@
 #include "gnunet-service-messenger_room.h"
 
 #include "gnunet-service-messenger_member.h"
-#include "gnunet-service-messenger_member_session.h"
+#include "gnunet-service-messenger_sender_session.h"
 
 #include "gnunet-service-messenger_message_kind.h"
 #include "gnunet-service-messenger_message_handle.h"
@@ -38,6 +38,8 @@
 #include "gnunet-service-messenger.h"
 #include "gnunet-service-messenger_service.h"
 #include "gnunet-service-messenger_tunnel.h"
+
+#include "messenger_api_message.h"
 #include "messenger_api_util.h"
 
 static void
@@ -47,24 +49,26 @@ struct GNUNET_MESSENGER_SrvRoom*
 create_srv_room (struct GNUNET_MESSENGER_SrvHandle *handle,
                  const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((handle) && (key));
+  GNUNET_assert ((handle) && (key));
 
-  struct GNUNET_MESSENGER_SrvRoom *room = GNUNET_new(struct 
GNUNET_MESSENGER_SrvRoom);
+  struct GNUNET_MESSENGER_SrvRoom *room = GNUNET_new (struct
+                                                      
GNUNET_MESSENGER_SrvRoom);
 
   room->service = handle->service;
   room->host = handle;
   room->port = NULL;
 
-  GNUNET_memcpy(&(room->key), key, sizeof(struct GNUNET_HashCode));
+  GNUNET_memcpy (&(room->key), key, sizeof(struct GNUNET_HashCode));
 
   room->tunnels = GNUNET_CONTAINER_multipeermap_create (8, GNUNET_NO);
 
-  init_member_store(get_srv_room_member_store(room), room);
-  init_message_store (get_srv_room_message_store(room));
-  init_operation_store(get_srv_room_operation_store(room), room);
+  init_peer_store (get_srv_room_peer_store (room));
+  init_member_store (get_srv_room_member_store (room), room);
+  init_message_store (get_srv_room_message_store (room));
+  init_operation_store (get_srv_room_operation_store (room), room);
 
   init_list_tunnels (&(room->basement));
-  init_message_state(&(room->state));
+  init_message_state (&(room->state));
 
   room->peer_message = NULL;
 
@@ -74,11 +78,13 @@ create_srv_room (struct GNUNET_MESSENGER_SrvHandle *handle,
   if (room->service->dir)
     load_srv_room (room);
 
-  room->idle = GNUNET_SCHEDULER_add_with_priority 
(GNUNET_SCHEDULER_PRIORITY_IDLE, idle_request_room_messages, room);
+  room->idle = GNUNET_SCHEDULER_add_with_priority (
+    GNUNET_SCHEDULER_PRIORITY_IDLE, idle_request_room_messages, room);
 
   return room;
 }
 
+
 static int
 iterate_destroy_tunnels (void *cls,
                          const struct GNUNET_PeerIdentity *key,
@@ -89,6 +95,7 @@ iterate_destroy_tunnels (void *cls,
   return GNUNET_YES;
 }
 
+
 static void
 handle_room_messages (struct GNUNET_MESSENGER_SrvRoom *room);
 
@@ -96,7 +103,7 @@ void
 destroy_srv_room (struct GNUNET_MESSENGER_SrvRoom *room,
                   int deletion)
 {
-  GNUNET_assert(room);
+  GNUNET_assert (room);
 
   if (room->idle)
   {
@@ -107,10 +114,11 @@ destroy_srv_room (struct GNUNET_MESSENGER_SrvRoom *room,
   if (room->port)
     GNUNET_CADET_close_port (room->port);
 
-  GNUNET_CONTAINER_multipeermap_iterate (room->tunnels, 
iterate_destroy_tunnels, NULL);
+  GNUNET_CONTAINER_multipeermap_iterate (room->tunnels, 
iterate_destroy_tunnels,
+                                         NULL);
   handle_room_messages (room);
 
-  if (!(room->service->dir))
+  if (! (room->service->dir))
     goto skip_saving;
 
   if (GNUNET_YES == deletion)
@@ -119,55 +127,71 @@ destroy_srv_room (struct GNUNET_MESSENGER_SrvRoom *room,
     save_srv_room (room);
 
 skip_saving:
-  clear_member_store (get_srv_room_member_store(room));
-  clear_message_store (get_srv_room_message_store(room));
-  clear_operation_store(get_srv_room_operation_store(room));
+  clear_peer_store (get_srv_room_peer_store (room));
+  clear_member_store (get_srv_room_member_store (room));
+  clear_message_store (get_srv_room_message_store (room));
+  clear_operation_store (get_srv_room_operation_store (room));
 
   GNUNET_CONTAINER_multipeermap_destroy (room->tunnels);
   clear_list_tunnels (&(room->basement));
-  clear_message_state(&(room->state));
+  clear_message_state (&(room->state));
 
   if (room->peer_message)
-    GNUNET_free(room->peer_message);
+    GNUNET_free (room->peer_message);
+
+  GNUNET_free (room);
+}
 
-  GNUNET_free(room);
+
+struct GNUNET_MESSENGER_PeerStore*
+get_srv_room_peer_store (struct GNUNET_MESSENGER_SrvRoom *room)
+{
+  GNUNET_assert (room);
+
+  return &(room->peer_store);
 }
 
+
 struct GNUNET_MESSENGER_MemberStore*
 get_srv_room_member_store (struct GNUNET_MESSENGER_SrvRoom *room)
 {
-  GNUNET_assert(room);
+  GNUNET_assert (room);
 
   return &(room->member_store);
 }
 
+
 struct GNUNET_MESSENGER_MessageStore*
 get_srv_room_message_store (struct GNUNET_MESSENGER_SrvRoom *room)
 {
-  GNUNET_assert(room);
+  GNUNET_assert (room);
 
   return &(room->message_store);
 }
 
+
 struct GNUNET_MESSENGER_OperationStore*
 get_srv_room_operation_store (struct GNUNET_MESSENGER_SrvRoom *room)
 {
-  GNUNET_assert(room);
+  GNUNET_assert (room);
 
   return &(room->operation_store);
 }
 
+
 static int
 send_room_info (struct GNUNET_MESSENGER_SrvRoom *room,
                 struct GNUNET_MESSENGER_SrvHandle *handle,
                 struct GNUNET_MESSENGER_SrvTunnel *tunnel)
 {
-  if ((!handle) || (!is_tunnel_connected (tunnel)))
+  if ((! handle) || (! is_tunnel_connected (tunnel)))
     return GNUNET_NO;
 
-  return send_tunnel_message (tunnel, handle, create_message_info 
(get_srv_handle_ego (handle)));
+  return send_tunnel_message (tunnel, handle, create_message_info (
+                                room->service));
 }
 
+
 static void*
 callback_room_connect (void *cls,
                        struct GNUNET_CADET_Channel *channel,
@@ -178,152 +202,80 @@ callback_room_connect (void *cls,
   struct GNUNET_MESSENGER_SrvTunnel *tunnel = create_tunnel (room, source);
 
   if ((tunnel) &&
-      (GNUNET_OK != GNUNET_CONTAINER_multipeermap_put (room->tunnels, source, 
tunnel,
+      (GNUNET_OK != GNUNET_CONTAINER_multipeermap_put (room->tunnels, source,
+                                                       tunnel,
                                                        
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)))
   {
     destroy_tunnel (tunnel);
     tunnel = NULL;
   }
 
-  if (!tunnel)
+  if (! tunnel)
   {
     delayed_disconnect_channel (channel);
     return NULL;
   }
 
-  bind_tunnel(tunnel, channel);
+  bind_tunnel (tunnel, channel);
 
-  GNUNET_log(GNUNET_ERROR_TYPE_INFO, "New tunnel in room (%s) established to 
peer: %s\n",
-             GNUNET_h2s(get_srv_room_key(room)), GNUNET_i2s (source));
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "New tunnel in room (%s) established to peer: %s\n",
+              GNUNET_h2s (get_srv_room_key (room)), GNUNET_i2s (source));
 
   if (GNUNET_YES == send_room_info (room, room->host, tunnel))
     return tunnel;
 
   disconnect_tunnel (tunnel);
 
-  if (GNUNET_YES == GNUNET_CONTAINER_multipeermap_remove (room->tunnels, 
source, tunnel))
+  if (GNUNET_YES == GNUNET_CONTAINER_multipeermap_remove (room->tunnels, 
source,
+                                                          tunnel))
     destroy_tunnel (tunnel);
 
   return NULL;
 }
 
+
 static int
 join_room (struct GNUNET_MESSENGER_SrvRoom *room,
            struct GNUNET_MESSENGER_SrvHandle *handle,
            struct GNUNET_MESSENGER_Member *member)
 {
-  GNUNET_assert((room) && (handle) && (member));
-
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Joining room: %s (%s)\n", GNUNET_h2s 
(get_srv_room_key (room)),
-             GNUNET_sh2s (get_member_id(member)));
+  GNUNET_assert ((room) && (handle) && (member));
 
-  const struct GNUNET_ShortHashCode *member_id = get_member_id(member);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Joining room: %s (%s)\n", GNUNET_h2s (
+                get_srv_room_key (room)),
+              GNUNET_sh2s (get_member_id (member)));
 
-  if (GNUNET_OK != change_srv_handle_member_id (handle, 
get_srv_room_key(room), member_id))
-    return GNUNET_NO;
-
-  struct GNUNET_MESSENGER_Message *message = create_message_join 
(get_srv_handle_ego (handle));
-
-  if (!message)
-  {
-    GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Your join message could not be 
created!\n");
+  const struct GNUNET_ShortHashCode *member_id = get_member_id (member);
 
+  if (GNUNET_OK != change_srv_handle_member_id (handle, get_srv_room_key 
(room),
+                                                member_id))
     return GNUNET_NO;
-  }
-
-  GNUNET_memcpy(&(message->header.sender_id), member_id, sizeof(*member_id));
-  return send_srv_room_message (room, handle, message);
-}
-
-struct GNUNET_MESSENGER_MemberNotify
-{
-  struct GNUNET_MESSENGER_SrvRoom *room;
-  struct GNUNET_MESSENGER_SrvHandle *handle;
-  struct GNUNET_MESSENGER_MemberSession *session;
-};
-
-static void
-notify_about_members (struct GNUNET_MESSENGER_MemberNotify *notify,
-                      struct GNUNET_MESSENGER_MemberSession *session,
-                      struct GNUNET_CONTAINER_MultiHashMap *map,
-                      int check_permission)
-{
-  if (session->prev)
-    notify_about_members (notify, session->prev, map, GNUNET_YES);
-
-  struct GNUNET_MESSENGER_MessageStore *message_store = 
get_srv_room_message_store(notify->room);
-  struct GNUNET_MESSENGER_ListMessage *element;
-
-  for (element = session->messages.head; element; element = element->next)
-  {
-    if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(map, 
&(element->hash)))
-      continue;
-
-    if ((GNUNET_YES == check_permission) &&
-        (GNUNET_YES != check_member_session_history(notify->session, 
&(element->hash), GNUNET_NO)))
-      continue;
 
-    if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(map, &(element->hash), 
NULL,
-                                                       
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
-      GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Notification of session message 
could be duplicated!\n");
-
-    const struct GNUNET_MESSENGER_Message *message = 
get_store_message(message_store, &(element->hash));
-
-    if (message)
-      notify_srv_handle_message (notify->handle, notify->room, session, 
message, &(element->hash));
-  }
-}
-
-static int
-iterate_notify_about_members (void *cls,
-                              const struct GNUNET_CRYPTO_PublicKey *public_key,
-                              struct GNUNET_MESSENGER_MemberSession *session)
-{
-  struct GNUNET_MESSENGER_MemberNotify *notify = cls;
-
-  if ((notify->session == session) || (GNUNET_YES == 
is_member_session_completed(session)))
-    return GNUNET_YES;
-
-  struct GNUNET_CONTAINER_MultiHashMap *map = 
GNUNET_CONTAINER_multihashmap_create(4, GNUNET_NO);
-
-  notify_about_members (notify, session, map, GNUNET_NO);
-
-  GNUNET_CONTAINER_multihashmap_destroy(map);
+  notify_srv_handle_member_id (handle, room, member_id, GNUNET_YES);
   return GNUNET_YES;
 }
 
+
 static int
 join_room_locally (struct GNUNET_MESSENGER_SrvRoom *room,
                    struct GNUNET_MESSENGER_SrvHandle *handle)
 {
-  const struct GNUNET_ShortHashCode *member_id = get_srv_handle_member_id 
(handle, get_srv_room_key(room));
+  const struct GNUNET_ShortHashCode *member_id = get_srv_handle_member_id (
+    handle, get_srv_room_key (room));
 
-  struct GNUNET_MESSENGER_MemberStore *member_store = 
get_srv_room_member_store(room);
-  struct GNUNET_MESSENGER_Member *member = add_store_member(member_store, 
member_id);
+  struct GNUNET_MESSENGER_MemberStore *member_store =
+    get_srv_room_member_store (room);
+  struct GNUNET_MESSENGER_Member *member = add_store_member (member_store,
+                                                             member_id);
 
   if (GNUNET_NO == join_room (room, handle, member))
     return GNUNET_NO;
 
-  const struct GNUNET_MESSENGER_Ego *ego = get_srv_handle_ego(handle);
-  struct GNUNET_MESSENGER_MemberSession *session = get_member_session (member, 
&(ego->pub));
-
-  if (!session)
-  {
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "A valid session is required to join 
a room!\n");
-    return GNUNET_NO;
-  }
-
-  struct GNUNET_MESSENGER_MemberNotify notify;
-
-  notify.room = room;
-  notify.handle = handle;
-  notify.session = session;
-
-  iterate_store_members(get_srv_room_member_store(room), 
iterate_notify_about_members, &notify);
-
   return GNUNET_YES;
 }
 
+
 extern int
 check_tunnel_message (void *cls,
                       const struct GNUNET_MessageHeader *header);
@@ -340,7 +292,7 @@ int
 open_srv_room (struct GNUNET_MESSENGER_SrvRoom *room,
                struct GNUNET_MESSENGER_SrvHandle *handle)
 {
-  GNUNET_assert((room) && (handle));
+  GNUNET_assert ((room) && (handle));
 
   if (room->port)
     return join_room_locally (room, handle);
@@ -348,30 +300,39 @@ open_srv_room (struct GNUNET_MESSENGER_SrvRoom *room,
   struct GNUNET_CADET_Handle *cadet = get_srv_room_cadet (room);
   const struct GNUNET_HashCode *key = get_srv_room_key (room);
 
-  struct GNUNET_MQ_MessageHandler handlers[] = { 
GNUNET_MQ_hd_var_size(tunnel_message, GNUNET_MESSAGE_TYPE_CADET_CLI,
-                                                                       struct 
GNUNET_MessageHeader, NULL),
-                                                 GNUNET_MQ_handler_end() };
+  struct GNUNET_MQ_MessageHandler handlers[] = { GNUNET_MQ_hd_var_size (
+                                                   tunnel_message,
+                                                   
GNUNET_MESSAGE_TYPE_CADET_CLI,
+                                                   struct
+                                                   GNUNET_MessageHeader, NULL),
+                                                 GNUNET_MQ_handler_end () };
 
   struct GNUNET_HashCode port;
-  convert_messenger_key_to_port(key, &port);
-  room->port = GNUNET_CADET_open_port (cadet, &port, callback_room_connect, 
room, NULL, callback_tunnel_disconnect,
+  convert_messenger_key_to_port (key, &port);
+  room->port = GNUNET_CADET_open_port (cadet, &port, callback_room_connect,
+                                       room, NULL, callback_tunnel_disconnect,
                                        handlers);
 
   if (room->port)
-    GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Port of room (%s) was opened!\n",
-               GNUNET_h2s(get_srv_room_key(room)));
+    GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Port of room (%s) was opened!\n",
+                GNUNET_h2s (get_srv_room_key (room)));
   else
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Port of room (%s) could not be 
opened!\n",
-               GNUNET_h2s(get_srv_room_key(room)));
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Port of room (%s) could not be opened!\n",
+                GNUNET_h2s (get_srv_room_key (room)));
 
-  const struct GNUNET_ShortHashCode *member_id = get_srv_handle_member_id 
(handle, get_srv_room_key(room));
+  const struct GNUNET_ShortHashCode *member_id = get_srv_handle_member_id (
+    handle, get_srv_room_key (room));
 
-  struct GNUNET_MESSENGER_MemberStore *member_store = 
get_srv_room_member_store(room);
-  struct GNUNET_MESSENGER_Member *member = add_store_member(member_store, 
member_id);
+  struct GNUNET_MESSENGER_MemberStore *member_store =
+    get_srv_room_member_store (room);
+  struct GNUNET_MESSENGER_Member *member = add_store_member (member_store,
+                                                             member_id);
 
   if ((GNUNET_NO == join_room (room, handle, member)) && (room->port))
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "You could not join the room, 
therefore it keeps closed!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "You could not join the room, therefore it keeps closed!\n");
 
     GNUNET_CADET_close_port (room->port);
     room->port = NULL;
@@ -379,34 +340,40 @@ open_srv_room (struct GNUNET_MESSENGER_SrvRoom *room,
     return GNUNET_NO;
   }
 
-  struct GNUNET_MESSENGER_Message *peer_msg = create_message_peer 
(room->service);
-  GNUNET_memcpy(&(peer_msg->header.sender_id), member_id, sizeof(*member_id));
-  return (room->port ? send_srv_room_message (room, handle, peer_msg) : 
GNUNET_NO);
+  if (! room->port)
+    return GNUNET_NO;
+
+  return send_srv_room_message (room, handle, create_message_peer (
+                                  room->service));
 }
 
+
 int
 enter_srv_room_at (struct GNUNET_MESSENGER_SrvRoom *room,
                    struct GNUNET_MESSENGER_SrvHandle *handle,
                    const struct GNUNET_PeerIdentity *door)
 {
-  GNUNET_assert((room) && (handle) && (door));
+  GNUNET_assert ((room) && (handle) && (door));
 
   struct GNUNET_PeerIdentity peer;
 
   if ((GNUNET_OK == get_service_peer_identity (room->service, &peer)) &&
-      (0 == GNUNET_memcmp(&peer, door)))
+      (0 == GNUNET_memcmp (&peer, door)))
     return join_room_locally (room, handle);
 
-  struct GNUNET_MESSENGER_SrvTunnel *tunnel = 
GNUNET_CONTAINER_multipeermap_get (room->tunnels, door);
+  struct GNUNET_MESSENGER_SrvTunnel *tunnel =
+    GNUNET_CONTAINER_multipeermap_get (room->tunnels, door);
 
-  if (!tunnel)
+  if (! tunnel)
   {
     tunnel = create_tunnel (room, door);
 
-    if (GNUNET_OK != GNUNET_CONTAINER_multipeermap_put (room->tunnels, door, 
tunnel,
+    if (GNUNET_OK != GNUNET_CONTAINER_multipeermap_put (room->tunnels, door,
+                                                        tunnel,
                                                         
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE))
     {
-      GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "You could not connect to that 
door!\n");
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "You could not connect to that door!\n");
       destroy_tunnel (tunnel);
       return GNUNET_NO;
     }
@@ -414,7 +381,8 @@ enter_srv_room_at (struct GNUNET_MESSENGER_SrvRoom *room,
 
   if (GNUNET_SYSERR == connect_tunnel (tunnel))
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Connection failure during 
entrance!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Connection failure during entrance!\n");
     GNUNET_CONTAINER_multipeermap_remove (room->tunnels, door, tunnel);
     destroy_tunnel (tunnel);
     return GNUNET_NO;
@@ -423,6 +391,22 @@ enter_srv_room_at (struct GNUNET_MESSENGER_SrvRoom *room,
   return join_room_locally (room, handle);
 }
 
+
+static void
+sign_srv_room_message_by_peer (const void *cls,
+                               struct GNUNET_MESSENGER_Message *message,
+                               uint16_t length,
+                               char *buffer,
+                               const struct GNUNET_HashCode *hash)
+{
+  const struct GNUNET_MESSENGER_SrvHandle *handle = cls;
+
+  GNUNET_assert ((handle) && (handle->service));
+
+  sign_message_by_peer (message, length, buffer, hash, 
handle->service->config);
+}
+
+
 struct GNUNET_MQ_Envelope*
 pack_srv_room_message (const struct GNUNET_MESSENGER_SrvRoom *room,
                        const struct GNUNET_MESSENGER_SrvHandle *handle,
@@ -430,20 +414,31 @@ pack_srv_room_message (const struct 
GNUNET_MESSENGER_SrvRoom *room,
                        struct GNUNET_HashCode *hash,
                        int mode)
 {
-  GNUNET_assert((room) && (handle) && (message) && (hash));
+  GNUNET_assert ((room) && (handle) && (message) && (hash));
 
-  message->header.timestamp = GNUNET_TIME_absolute_hton 
(GNUNET_TIME_absolute_get ());
+  if (GNUNET_YES != is_peer_message (message))
+    return pack_message (message, hash, NULL, mode, NULL);
 
-  const struct GNUNET_ShortHashCode *id = get_srv_handle_member_id (handle, 
get_srv_room_key(room));
+  message->header.timestamp = GNUNET_TIME_absolute_hton (
+    GNUNET_TIME_absolute_get ());
 
-  GNUNET_assert(id);
+  struct GNUNET_PeerIdentity peer;
+  if (GNUNET_OK != get_service_peer_identity (handle->service, &peer))
+    return NULL;
 
-  GNUNET_memcpy(&(message->header.sender_id), id, sizeof(struct 
GNUNET_ShortHashCode));
+  convert_peer_identity_to_id (&peer, &(message->header.sender_id));
   get_message_state_chain_hash (&(room->state), &(message->header.previous));
 
-  return pack_message (message, hash, get_srv_handle_ego (handle), mode);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Packing message with peer signature: %s\n",
+              GNUNET_sh2s (&(message->header.sender_id)));
+
+  message->header.signature.type = htonl (GNUNET_PUBLIC_KEY_TYPE_EDDSA);
+  return pack_message (message, hash, sign_srv_room_message_by_peer, mode,
+                       handle);
 }
 
+
 struct GNUNET_MESSENGER_ClosureSendRoom
 {
   struct GNUNET_MESSENGER_SrvRoom *room;
@@ -461,8 +456,8 @@ iterate_send_room_message (void *cls,
 {
   struct GNUNET_MESSENGER_SrvTunnel *tunnel = value;
 
-  if ((!is_tunnel_connected (tunnel)) ||
-      (get_tunnel_messenger_version(tunnel) < GNUNET_MESSENGER_VERSION))
+  if ((! is_tunnel_connected (tunnel)) ||
+      (get_tunnel_messenger_version (tunnel) < GNUNET_MESSENGER_VERSION))
     return GNUNET_YES;
 
   struct GNUNET_MESSENGER_ClosureSendRoom *closure = cls;
@@ -474,14 +469,16 @@ iterate_send_room_message (void *cls,
 
   if (closure->packed == GNUNET_NO)
   {
-    env = pack_srv_room_message (closure->room, closure->handle, 
closure->message, closure->hash,
-    GNUNET_MESSENGER_PACK_MODE_ENVELOPE);
+    env = pack_srv_room_message (closure->room, closure->handle,
+                                 closure->message, closure->hash,
+                                 GNUNET_MESSENGER_PACK_MODE_ENVELOPE);
 
     if (env)
       closure->packed = GNUNET_YES;
   }
   else
-    env = pack_message (closure->message, NULL, NULL, 
GNUNET_MESSENGER_PACK_MODE_ENVELOPE);
+    env = pack_message (closure->message, NULL, NULL,
+                        GNUNET_MESSENGER_PACK_MODE_ENVELOPE, NULL);
 
   if (env)
     send_tunnel_envelope (tunnel, env, closure->hash);
@@ -489,6 +486,7 @@ iterate_send_room_message (void *cls,
   return GNUNET_YES;
 }
 
+
 int
 update_room_message (struct GNUNET_MESSENGER_SrvRoom *room,
                      struct GNUNET_MESSENGER_Message *message,
@@ -496,7 +494,6 @@ update_room_message (struct GNUNET_MESSENGER_SrvRoom *room,
 
 void
 callback_room_handle_message (struct GNUNET_MESSENGER_SrvRoom *room,
-                              struct GNUNET_MESSENGER_SrvHandle *handle,
                               const struct GNUNET_MESSENGER_Message *message,
                               const struct GNUNET_HashCode *hash);
 
@@ -505,16 +502,19 @@ send_srv_room_message (struct GNUNET_MESSENGER_SrvRoom 
*room,
                        struct GNUNET_MESSENGER_SrvHandle *handle,
                        struct GNUNET_MESSENGER_Message *message)
 {
-  GNUNET_assert((room) && (handle));
+  GNUNET_assert ((room) && (handle));
 
-  if (!message)
+  if (! message)
     return GNUNET_NO;
 
-  if (GNUNET_YES == is_message_session_bound(message))
-    merge_srv_room_last_messages(room, handle);
+  if (GNUNET_YES == is_message_session_bound (message))
+    merge_srv_room_last_messages (room, handle);
+
 
-  GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Sending message from handle with member 
id: %s\n",
-             GNUNET_sh2s(get_srv_handle_member_id(handle, 
get_srv_room_key(room))));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Sending message from handle in room: %s (%s)\n",
+              GNUNET_h2s (&(room->key)),
+              GNUNET_MESSENGER_name_of_kind (message->header.kind));
 
   struct GNUNET_HashCode hash;
   struct GNUNET_MESSENGER_ClosureSendRoom closure;
@@ -526,10 +526,12 @@ send_srv_room_message (struct GNUNET_MESSENGER_SrvRoom 
*room,
   closure.hash = &hash;
   closure.packed = GNUNET_NO;
 
-  GNUNET_CONTAINER_multipeermap_iterate (room->tunnels, 
iterate_send_room_message, &closure);
+  GNUNET_CONTAINER_multipeermap_iterate (room->tunnels,
+                                         iterate_send_room_message, &closure);
 
   if (GNUNET_NO == closure.packed)
-    pack_srv_room_message (room, handle, message, &hash, 
GNUNET_MESSENGER_PACK_MODE_UNKNOWN);
+    pack_srv_room_message (room, handle, message, &hash,
+                           GNUNET_MESSENGER_PACK_MODE_UNKNOWN);
 
   const int new_message = update_room_message (room, message, &hash);
 
@@ -541,6 +543,9 @@ send_srv_room_message (struct GNUNET_MESSENGER_SrvRoom 
*room,
   case GNUNET_MESSENGER_KIND_JOIN:
     send_message_join (room, handle, message, &hash);
     break;
+  case GNUNET_MESSENGER_KIND_KEY:
+    send_message_key (room, handle, message, &hash);
+    break;
   case GNUNET_MESSENGER_KIND_PEER:
     send_message_peer (room, handle, message, &hash);
     break;
@@ -554,25 +559,26 @@ send_srv_room_message (struct GNUNET_MESSENGER_SrvRoom 
*room,
     break;
   }
 
-  callback_room_handle_message (room, handle, message, &hash);
+  callback_room_handle_message (room, message, &hash);
   return GNUNET_YES;
 }
 
+
 void
 forward_srv_room_message (struct GNUNET_MESSENGER_SrvRoom *room,
                           struct GNUNET_MESSENGER_SrvTunnel *tunnel,
                           struct GNUNET_MESSENGER_Message *message,
                           const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((room) && (tunnel));
+  GNUNET_assert ((room) && (tunnel));
 
-  if (!message)
+  if (! message)
     return;
 
   struct GNUNET_MESSENGER_ClosureSendRoom closure;
   struct GNUNET_HashCode message_hash;
 
-  GNUNET_memcpy(&message_hash, hash, sizeof(struct GNUNET_HashCode));
+  GNUNET_memcpy (&message_hash, hash, sizeof(struct GNUNET_HashCode));
 
   closure.room = room;
   closure.handle = NULL;
@@ -581,55 +587,43 @@ forward_srv_room_message (struct GNUNET_MESSENGER_SrvRoom 
*room,
   closure.hash = &message_hash;
   closure.packed = GNUNET_YES;
 
-  GNUNET_CONTAINER_multipeermap_iterate (room->tunnels, 
iterate_send_room_message, &closure);
+  GNUNET_CONTAINER_multipeermap_iterate (room->tunnels,
+                                         iterate_send_room_message, &closure);
 }
 
+
 void
 check_srv_room_peer_status (struct GNUNET_MESSENGER_SrvRoom *room,
                             struct GNUNET_MESSENGER_SrvTunnel *tunnel)
 {
-  if (!room->peer_message)
+  if (! room->peer_message)
     return;
 
-  struct GNUNET_MESSENGER_MessageStore *message_store = 
get_srv_room_message_store(room);
+  struct GNUNET_MESSENGER_MessageStore *message_store =
+    get_srv_room_message_store (room);
 
-  const struct GNUNET_MESSENGER_Message *message = 
get_store_message(message_store, room->peer_message);
+  const struct GNUNET_MESSENGER_Message *message = get_store_message (
+    message_store, room->peer_message);
 
-  if (!message)
+  if (! message)
   {
-    GNUNET_free(room->peer_message);
+    GNUNET_free (room->peer_message);
     room->peer_message = NULL;
     return;
   }
 
-  struct GNUNET_MESSENGER_MemberStore *member_store = 
get_srv_room_member_store(room);
-  struct GNUNET_MESSENGER_Member *member = get_store_member_of(member_store, 
message);
-
-  if (!member)
-    goto resend_peer_message;
-
-  struct GNUNET_MESSENGER_MemberSession *session = 
get_member_session_of(member, message, room->peer_message);
-
-  if (GNUNET_YES == is_member_session_closed(session))
-    goto resend_peer_message;
-
   if (tunnel)
-    forward_tunnel_message(tunnel, message, room->peer_message);
-
-  return;
-
-resend_peer_message:
-  if (room->host)
-    send_srv_room_message (room, room->host, create_message_peer 
(room->service));
+    forward_tunnel_message (tunnel, message, room->peer_message);
 }
 
+
 void
 merge_srv_room_last_messages (struct GNUNET_MESSENGER_SrvRoom *room,
                               struct GNUNET_MESSENGER_SrvHandle *handle)
 {
-  GNUNET_assert(room);
+  GNUNET_assert (room);
 
-  if (!handle)
+  if (! handle)
     return;
 
   const struct GNUNET_HashCode *hash;
@@ -637,132 +631,154 @@ merge_srv_room_last_messages (struct 
GNUNET_MESSENGER_SrvRoom *room,
 merge_next:
   hash = get_message_state_merge_hash (&(room->state));
 
-  if (!hash)
+  if (! hash)
     return;
 
   send_srv_room_message (room, handle, create_message_merge (hash));
   goto merge_next;
 }
 
+
 void
 callback_room_deletion (struct GNUNET_MESSENGER_SrvRoom *room,
                         const struct GNUNET_HashCode *hash)
 {
-  if (GNUNET_OK != delete_store_message (get_srv_room_message_store(room), 
hash))
+  if (GNUNET_OK != delete_store_message (get_srv_room_message_store (room),
+                                         hash))
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Deletion of message failed! 
(%s)\n", GNUNET_h2s(hash));
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Deletion of message failed! 
(%s)\n",
+                GNUNET_h2s (hash));
     return;
   }
 }
 
+
 void
 callback_room_merge (struct GNUNET_MESSENGER_SrvRoom *room,
                      const struct GNUNET_HashCode *hash)
 {
-  if (!room->host)
+  if (! room->host)
     return;
 
   send_srv_room_message (room, room->host, create_message_merge (hash));
 }
 
+
 int
 delete_srv_room_message (struct GNUNET_MESSENGER_SrvRoom *room,
                          struct GNUNET_MESSENGER_MemberSession *session,
                          const struct GNUNET_HashCode *hash,
                          const struct GNUNET_TIME_Relative delay)
 {
-  GNUNET_assert((room) && (session) && (hash));
+  GNUNET_assert ((room) && (session) && (hash));
 
-  const struct GNUNET_TIME_Relative forever = 
GNUNET_TIME_relative_get_forever_ ();
+  const struct GNUNET_TIME_Relative forever =
+    GNUNET_TIME_relative_get_forever_ ();
 
-  if (0 == GNUNET_memcmp(&forever, &delay))
+  if (0 == GNUNET_memcmp (&forever, &delay))
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Deletion is delayed forever: operation 
is impossible!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+                "Deletion is delayed forever: operation is impossible!\n");
     return GNUNET_SYSERR;
   }
 
-  struct GNUNET_MESSENGER_MessageStore *message_store = 
get_srv_room_message_store(room);
+  struct GNUNET_MESSENGER_MessageStore *message_store =
+    get_srv_room_message_store (room);
 
-  const struct GNUNET_MESSENGER_Message *message = 
get_store_message(message_store, hash);
+  const struct GNUNET_MESSENGER_Message *message = get_store_message (
+    message_store, hash);
 
-  if (!message)
+  if (! message)
     return GNUNET_YES;
 
-  if (GNUNET_YES != check_member_session_history(session, hash, GNUNET_YES))
+  if (GNUNET_YES != check_member_session_history (session, hash, GNUNET_YES))
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Unpermitted request for deletion by 
member (%s) of message (%s)!\n",
-               GNUNET_sh2s(get_member_session_id(session)), GNUNET_h2s(hash));
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Unpermitted request for deletion by member (%s) of message 
(%s)!\n",
+                GNUNET_sh2s (get_member_session_id (session)), GNUNET_h2s (
+                  hash));
 
     return GNUNET_NO;
   }
 
-  struct GNUNET_MESSENGER_OperationStore *operation_store = 
get_srv_room_operation_store(room);
+  struct GNUNET_MESSENGER_OperationStore *operation_store =
+    get_srv_room_operation_store (room);
 
-  if (GNUNET_OK != use_store_operation(operation_store, hash, 
GNUNET_MESSENGER_OP_DELETE, delay))
+  if (GNUNET_OK != use_store_operation (operation_store, hash,
+                                        GNUNET_MESSENGER_OP_DELETE, delay))
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Deletion has failed: operation 
denied!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Deletion has failed: operation denied!\n");
     return GNUNET_SYSERR;
   }
 
   return GNUNET_YES;
 }
 
+
 struct GNUNET_CADET_Handle*
 get_srv_room_cadet (struct GNUNET_MESSENGER_SrvRoom *room)
 {
-  GNUNET_assert(room);
+  GNUNET_assert (room);
 
   return room->service->cadet;
 }
 
+
 const struct GNUNET_HashCode*
 get_srv_room_key (const struct GNUNET_MESSENGER_SrvRoom *room)
 {
-  GNUNET_assert(room);
+  GNUNET_assert (room);
 
   return &(room->key);
 }
 
+
 const struct GNUNET_MESSENGER_SrvTunnel*
 get_srv_room_tunnel (const struct GNUNET_MESSENGER_SrvRoom *room,
                      const struct GNUNET_PeerIdentity *peer)
 {
-  GNUNET_assert((room) && (peer));
+  GNUNET_assert ((room) && (peer));
 
   return GNUNET_CONTAINER_multipeermap_get (room->tunnels, peer);
 }
 
+
 static int
 request_room_message_step (struct GNUNET_MESSENGER_SrvRoom *room,
                            const struct GNUNET_HashCode *hash,
                            const struct GNUNET_MESSENGER_MemberSession 
*session,
                            GNUNET_MESSENGER_MessageRequestCallback callback,
-                           void* cls)
+                           void *cls)
 {
-  struct GNUNET_MESSENGER_MessageStore *message_store = 
get_srv_room_message_store(room);
+  struct GNUNET_MESSENGER_MessageStore *message_store =
+    get_srv_room_message_store (room);
 
-  const struct GNUNET_MESSENGER_MessageLink *link = get_store_message_link(
-      message_store, hash, GNUNET_YES
-  );
+  const struct GNUNET_MESSENGER_MessageLink *link = get_store_message_link (
+    message_store, hash, GNUNET_YES
+    );
 
-  if (!link)
+  if (! link)
     goto forward;
 
-  int result = request_room_message_step(room, &(link->first), session, 
callback, cls);
+  int result = request_room_message_step (room, &(link->first), session,
+                                          callback, cls);
 
   if ((GNUNET_YES == link->multiple) &&
-      (GNUNET_YES == request_room_message_step(room, &(link->second), session, 
callback, cls)))
+      (GNUNET_YES == request_room_message_step (room, &(link->second), session,
+                                                callback, cls)))
     return GNUNET_YES;
   else
     return result;
 
 forward:
-  if (GNUNET_YES != check_member_session_history(session, hash, GNUNET_NO))
+  if (GNUNET_YES != check_member_session_history (session, hash, GNUNET_NO))
     return GNUNET_YES;
 
-  const struct GNUNET_MESSENGER_Message *message = 
get_store_message(message_store, hash);
+  const struct GNUNET_MESSENGER_Message *message = get_store_message (
+    message_store, hash);
 
-  if (!message)
+  if (! message)
     return GNUNET_NO;
 
   if (callback)
@@ -771,14 +787,15 @@ forward:
   return GNUNET_YES;
 }
 
+
 int
 request_srv_room_message (struct GNUNET_MESSENGER_SrvRoom *room,
                           const struct GNUNET_HashCode *hash,
                           const struct GNUNET_MESSENGER_MemberSession *session,
                           GNUNET_MESSENGER_MessageRequestCallback callback,
-                          void* cls)
+                          void *cls)
 {
-  GNUNET_assert((room) && (hash));
+  GNUNET_assert ((room) && (hash));
 
   int result = request_room_message_step (room, hash, session, callback, cls);
 
@@ -788,26 +805,31 @@ request_srv_room_message (struct GNUNET_MESSENGER_SrvRoom 
*room,
   return result;
 }
 
+
 void
 callback_room_disconnect (struct GNUNET_MESSENGER_SrvRoom *room,
                           void *cls)
 {
   struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls;
 
-  if (!room->host)
+  if (! room->host)
     return;
 
   struct GNUNET_PeerIdentity identity;
-  get_tunnel_peer_identity(tunnel, &identity);
+  get_tunnel_peer_identity (tunnel, &identity);
 
-  if ((GNUNET_YES != GNUNET_CONTAINER_multipeermap_remove (room->tunnels, 
&identity, tunnel)) ||
-      (GNUNET_YES == GNUNET_CONTAINER_multipeermap_contains(room->tunnels, 
&identity)))
+  if ((GNUNET_YES != GNUNET_CONTAINER_multipeermap_remove (room->tunnels,
+                                                           &identity,
+                                                           tunnel)) ||
+      (GNUNET_YES == GNUNET_CONTAINER_multipeermap_contains (room->tunnels,
+                                                             &identity)))
     return;
 
   if (GNUNET_YES == contains_list_tunnels (&(room->basement), &identity))
     send_srv_room_message (room, room->host, create_message_miss (&identity));
 }
 
+
 int
 callback_verify_room_message (struct GNUNET_MESSENGER_SrvRoom *room,
                               void *cls,
@@ -816,33 +838,40 @@ callback_verify_room_message (struct 
GNUNET_MESSENGER_SrvRoom *room,
 {
   if (GNUNET_MESSENGER_KIND_UNKNOWN == message->header.kind)
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Message error: Kind is unknown! 
(%d)\n", message->header.kind);
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Message error: Kind is unknown! (%d)\n", 
message->header.kind);
     return GNUNET_SYSERR;
   }
 
-  struct GNUNET_MESSENGER_MessageStore *message_store = 
get_srv_room_message_store(room);
+  struct GNUNET_MESSENGER_MessageStore *message_store =
+    get_srv_room_message_store (room);
 
-  const struct GNUNET_MESSENGER_Message *previous = 
get_store_message(message_store, &(message->header.previous));
+  const struct GNUNET_MESSENGER_Message *previous = get_store_message (
+    message_store, &(message->header.previous));
 
-  if (!previous)
+  if (! previous)
     goto skip_time_comparison;
 
-  struct GNUNET_TIME_Absolute timestamp = 
GNUNET_TIME_absolute_ntoh(message->header.timestamp);
-  struct GNUNET_TIME_Absolute last = 
GNUNET_TIME_absolute_ntoh(previous->header.timestamp);
+  struct GNUNET_TIME_Absolute timestamp = GNUNET_TIME_absolute_ntoh (
+    message->header.timestamp);
+  struct GNUNET_TIME_Absolute last = GNUNET_TIME_absolute_ntoh (
+    previous->header.timestamp);
 
-  if (GNUNET_TIME_relative_get_zero_().rel_value_us != 
GNUNET_TIME_absolute_get_difference(timestamp, last).rel_value_us)
+  if (GNUNET_TIME_relative_get_zero_ ().rel_value_us !=
+      GNUNET_TIME_absolute_get_difference (timestamp, last).rel_value_us)
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Message error: Timestamp does not 
check out!\n");
-    return GNUNET_SYSERR;
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Message warning: Timestamp does not check out!\n");
   }
 
 skip_time_comparison:
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Receiving message of kind: %s!\n",
-             GNUNET_MESSENGER_name_of_kind(message->header.kind));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Receiving message of kind: %s!\n",
+              GNUNET_MESSENGER_name_of_kind (message->header.kind));
 
   return GNUNET_OK;
 }
 
+
 static void
 idle_request_room_messages (void *cls)
 {
@@ -850,78 +879,94 @@ idle_request_room_messages (void *cls)
 
   room->idle = NULL;
 
-  struct GNUNET_MESSENGER_OperationStore *operation_store = 
get_srv_room_operation_store(room);
-  const struct GNUNET_HashCode *hash = 
get_message_state_merge_hash(&(room->state));
+  struct GNUNET_MESSENGER_OperationStore *operation_store =
+    get_srv_room_operation_store (room);
+  const struct GNUNET_HashCode *hash = get_message_state_merge_hash (
+    &(room->state));
 
   if ((hash) &&
-      (GNUNET_MESSENGER_OP_UNKNOWN == 
get_store_operation_type(operation_store, hash)))
-    use_store_operation(
-        operation_store,
-        hash,
-        GNUNET_MESSENGER_OP_MERGE,
-        GNUNET_MESSENGER_MERGE_DELAY
-    );
+      (GNUNET_MESSENGER_OP_UNKNOWN == get_store_operation_type 
(operation_store,
+                                                                hash)))
+    use_store_operation (
+      operation_store,
+      hash,
+      GNUNET_MESSENGER_OP_MERGE,
+      GNUNET_MESSENGER_MERGE_DELAY
+      );
 
   room->idle = GNUNET_SCHEDULER_add_delayed_with_priority (
-      GNUNET_MESSENGER_IDLE_DELAY,
-      GNUNET_SCHEDULER_PRIORITY_IDLE,
-      idle_request_room_messages,
-      cls
-  );
+    GNUNET_MESSENGER_IDLE_DELAY,
+    GNUNET_SCHEDULER_PRIORITY_IDLE,
+    idle_request_room_messages,
+    cls
+    );
 }
 
+
 void
 solve_srv_room_member_collisions (struct GNUNET_MESSENGER_SrvRoom *room,
-                                  const struct GNUNET_CRYPTO_PublicKey 
*public_key,
+                                  const struct
+                                  GNUNET_CRYPTO_PublicKey *public_key,
                                   const struct GNUNET_ShortHashCode *member_id,
                                   struct GNUNET_TIME_Absolute timestamp)
 {
   GNUNET_assert ((room) && (public_key) && (member_id));
 
-  struct GNUNET_MESSENGER_MemberStore *member_store = 
get_srv_room_member_store(room);
-  struct GNUNET_MESSENGER_Member *member = get_store_member(member_store, 
member_id);
+  struct GNUNET_MESSENGER_MemberStore *member_store =
+    get_srv_room_member_store (room);
+  struct GNUNET_MESSENGER_Member *member = get_store_member (member_store,
+                                                             member_id);
 
-  if ((!member) || (1 >= GNUNET_CONTAINER_multihashmap_size(member->sessions)))
+  if ((! member) || (1 >= GNUNET_CONTAINER_multihashmap_size (
+                       member->sessions)))
     return;
 
   struct GNUNET_MESSENGER_ListHandles *handles = &(room->service->handles);
-  struct GNUNET_MESSENGER_ListHandle* element;
+  struct GNUNET_MESSENGER_ListHandle *element;
+
+  const struct GNUNET_CRYPTO_PublicKey *pubkey;
 
   for (element = handles->head; element; element = element->next)
   {
-    if (0 != GNUNET_memcmp(member_id, 
get_srv_handle_member_id(element->handle, get_srv_room_key(room))))
+    if (0 != GNUNET_memcmp (member_id, get_srv_handle_member_id (
+                              element->handle, get_srv_room_key (room))))
       continue;
 
-    if (0 == GNUNET_memcmp(public_key, 
&(get_srv_handle_ego(element->handle)->pub)))
+    pubkey = get_srv_handle_key (element->handle);
+
+    if (0 == GNUNET_memcmp (public_key, pubkey))
       continue;
 
-    struct GNUNET_MESSENGER_MemberSession *session = 
get_member_session(member, &(get_srv_handle_ego(element->handle)->pub));
+    struct GNUNET_MESSENGER_MemberSession *session = get_member_session 
(member,
+                                                                         
pubkey);
 
-    if (!session)
+    if (! session)
       continue;
 
-    struct GNUNET_TIME_Absolute start = get_member_session_start(session);
+    struct GNUNET_TIME_Absolute start = get_member_session_start (session);
 
-    if (GNUNET_TIME_relative_get_zero_().rel_value_us != 
GNUNET_TIME_absolute_get_difference(start, timestamp).rel_value_us)
+    if (GNUNET_TIME_relative_get_zero_ ().rel_value_us !=
+        GNUNET_TIME_absolute_get_difference (start, timestamp).rel_value_us)
       continue;
 
     struct GNUNET_ShortHashCode random_id;
     generate_free_member_id (&random_id, member_store->members);
 
-    send_srv_room_message(room, element->handle, 
create_message_id(&random_id));
+    notify_srv_handle_member_id (element->handle, room, &random_id, GNUNET_NO);
   }
 }
 
+
 void
 rebuild_srv_room_basement_structure (struct GNUNET_MESSENGER_SrvRoom *room)
 {
-  GNUNET_assert(room);
+  GNUNET_assert (room);
 
   struct GNUNET_PeerIdentity peer;
   size_t src;
 
   if ((GNUNET_OK != get_service_peer_identity (room->service, &peer)) ||
-      (!find_list_tunnels (&(room->basement), &peer, &src)))
+      (! find_list_tunnels (&(room->basement), &peer, &src)))
     return;
 
   size_t count = count_of_tunnels (&(room->basement));
@@ -937,7 +982,7 @@ rebuild_srv_room_basement_structure (struct 
GNUNET_MESSENGER_SrvRoom *room)
 
     tunnel = GNUNET_CONTAINER_multipeermap_get (room->tunnels, &peer);
 
-    if (!tunnel)
+    if (! tunnel)
     {
       element = remove_from_list_tunnels (&(room->basement), element);
       continue;
@@ -959,69 +1004,100 @@ rebuild_srv_room_basement_structure (struct 
GNUNET_MESSENGER_SrvRoom *room)
   }
 }
 
+
 static void
 handle_room_messages (struct GNUNET_MESSENGER_SrvRoom *room)
 {
-  struct GNUNET_MESSENGER_MessageStore *message_store = 
get_srv_room_message_store(room);
-  struct GNUNET_MESSENGER_MemberStore *member_store = 
get_srv_room_member_store(room);
+  struct GNUNET_MESSENGER_MessageStore *message_store =
+    get_srv_room_message_store (room);
+  struct GNUNET_MESSENGER_MemberStore *member_store =
+    get_srv_room_member_store (room);
+  struct GNUNET_MESSENGER_PeerStore *peer_store = get_srv_room_peer_store (
+    room);
 
   while (room->handling.head)
   {
     struct GNUNET_MESSENGER_ListMessage *element = room->handling.head;
 
-    const struct GNUNET_MESSENGER_Message *message = get_store_message 
(message_store, &(element->hash));
+    const struct GNUNET_MESSENGER_Message *message = get_store_message (
+      message_store, &(element->hash));
 
-    if (!message)
+    if (! message)
       goto finish_handling;
 
-    struct GNUNET_MESSENGER_Member *member = get_store_member_of(member_store, 
message);
+    struct GNUNET_MESSENGER_SenderSession session;
 
-    if (!member)
-      goto finish_handling;
+    if (GNUNET_YES == is_peer_message (message))
+    {
+      session.peer = get_store_peer_of (peer_store, message, &(element->hash));
 
-    struct GNUNET_MESSENGER_MemberSession *session = 
get_member_session_of(member, message, &(element->hash));
+      if (! session.peer)
+        goto finish_handling;
+    }
+    else
+    {
+      struct GNUNET_MESSENGER_Member *member = get_store_member_of (
+        member_store, message);
 
-    if (session)
-      handle_service_message (room->service, room, session, message, 
&(element->hash));
+      if (! member)
+        goto finish_handling;
+
+      session.member = get_member_session_of (member, message,
+                                              &(element->hash));
+
+      if (! session.member)
+        goto finish_handling;
+    }
+
+    handle_service_message (room->service, room, &session, message,
+                            &(element->hash));
 
 finish_handling:
-    GNUNET_CONTAINER_DLL_remove(room->handling.head, room->handling.tail, 
element);
-    GNUNET_free(element);
+    GNUNET_CONTAINER_DLL_remove (room->handling.head, room->handling.tail,
+                                 element);
+    GNUNET_free (element);
   }
 }
 
+
 int
 update_room_message (struct GNUNET_MESSENGER_SrvRoom *room,
                      struct GNUNET_MESSENGER_Message *message,
                      const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((room) && (message) && (hash));
+  GNUNET_assert ((room) && (message) && (hash));
 
-  struct GNUNET_MESSENGER_OperationStore *operation_store = 
get_srv_room_operation_store(room);
+  struct GNUNET_MESSENGER_OperationStore *operation_store =
+    get_srv_room_operation_store (room);
 
-  const int requested = (GNUNET_MESSENGER_OP_REQUEST == 
get_store_operation_type(operation_store, hash)?
-      GNUNET_YES : GNUNET_NO
-  );
+  const int requested = (GNUNET_MESSENGER_OP_REQUEST ==
+                         get_store_operation_type (operation_store, hash)?
+                         GNUNET_YES : GNUNET_NO
+                         );
 
   if (GNUNET_YES == requested)
-    cancel_store_operation(operation_store, hash);
+    cancel_store_operation (operation_store, hash);
 
-  struct GNUNET_MESSENGER_MessageStore *message_store = 
get_srv_room_message_store(room);
+  struct GNUNET_MESSENGER_MessageStore *message_store =
+    get_srv_room_message_store (room);
 
-  const struct GNUNET_MESSENGER_Message *old_message = get_store_message 
(message_store, hash);
+  const struct GNUNET_MESSENGER_Message *old_message = get_store_message (
+    message_store, hash);
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Handle a message in room (%s).\n", 
GNUNET_h2s (get_srv_room_key(room)));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Handle a message in room (%s).\n",
+              GNUNET_h2s (get_srv_room_key (room)));
 
-  if ((old_message) || (GNUNET_OK != put_store_message (message_store, hash, 
message)))
+  if ((old_message) || (GNUNET_OK != put_store_message (message_store, hash,
+                                                        message)))
   {
     if (old_message != message)
-      destroy_message(message);
+      destroy_message (message);
 
-    GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Duplicate message got dropped!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Duplicate message got dropped!\n");
     return GNUNET_NO;
   }
 
-  update_message_state(&(room->state), requested, message, hash);
+  update_message_state (&(room->state), requested, message, hash);
 
   if ((GNUNET_YES == requested) ||
       (GNUNET_MESSENGER_KIND_INFO == message->header.kind) ||
@@ -1029,15 +1105,20 @@ update_room_message (struct GNUNET_MESSENGER_SrvRoom 
*room,
     return GNUNET_YES;
 
   if ((GNUNET_MESSENGER_KIND_MERGE == message->header.kind) &&
-      (GNUNET_MESSENGER_OP_MERGE == get_store_operation_type(operation_store, 
&(message->body.merge.previous))))
-    cancel_store_operation(operation_store, &(message->body.merge.previous));
+      (GNUNET_MESSENGER_OP_MERGE == get_store_operation_type (operation_store,
+                                                              &(message->body.
+                                                                
merge.previous))))
+    cancel_store_operation (operation_store, &(message->body.merge.previous));
 
-  if (GNUNET_MESSENGER_OP_MERGE == get_store_operation_type(operation_store, 
&(message->header.previous)))
-    cancel_store_operation(operation_store, &(message->header.previous));
+  if (GNUNET_MESSENGER_OP_MERGE == get_store_operation_type (operation_store,
+                                                             &(message->header.
+                                                               previous)))
+    cancel_store_operation (operation_store, &(message->header.previous));
 
   return GNUNET_YES;
 }
 
+
 struct GNUNET_MESSENGER_MemberSessionCompletion
 {
   struct GNUNET_MESSENGER_MemberSessionCompletion *prev;
@@ -1057,54 +1138,81 @@ struct GNUNET_MESSENGER_MemberUpdate
 
 static int
 iterate_update_member_sessions (void *cls,
-                                const struct GNUNET_CRYPTO_PublicKey 
*public_key,
+                                const struct
+                                GNUNET_CRYPTO_PublicKey *public_key,
                                 struct GNUNET_MESSENGER_MemberSession *session)
 {
   struct GNUNET_MESSENGER_MemberUpdate *update = cls;
 
-  update_member_session_history(session, update->message, update->hash);
+  update_member_session_history (session, update->message, update->hash);
 
-  if (GNUNET_YES == is_member_session_completed(session))
+  if (GNUNET_YES == is_member_session_completed (session))
   {
-    struct GNUNET_MESSENGER_MemberSessionCompletion *element = GNUNET_new(
-        struct GNUNET_MESSENGER_MemberSessionCompletion
-    );
+    struct GNUNET_MESSENGER_MemberSessionCompletion *element = GNUNET_new (
+      struct GNUNET_MESSENGER_MemberSessionCompletion
+      );
 
     element->session = session;
 
-    GNUNET_CONTAINER_DLL_insert_tail(update->head, update->tail, element);
+    GNUNET_CONTAINER_DLL_insert_tail (update->head, update->tail, element);
   }
 
   return GNUNET_YES;
 }
 
+
 static void
 remove_room_member_session (struct GNUNET_MESSENGER_SrvRoom *room,
                             struct GNUNET_MESSENGER_MemberSession *session);
 
 void
 callback_room_handle_message (struct GNUNET_MESSENGER_SrvRoom *room,
-                              struct GNUNET_MESSENGER_SrvHandle *handle,
                               const struct GNUNET_MESSENGER_Message *message,
                               const struct GNUNET_HashCode *hash)
 {
-  struct GNUNET_MESSENGER_MemberStore *member_store = 
get_srv_room_member_store(room);
-  struct GNUNET_MESSENGER_Member *member = get_store_member_of(member_store, 
message);
+  GNUNET_assert ((room) && (message) && (hash));
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Callback for message (%s)\n", 
GNUNET_h2s (hash));
+  struct GNUNET_MESSENGER_PeerStore *peer_store = get_srv_room_peer_store (
+    room);
+  struct GNUNET_MESSENGER_MemberStore *member_store =
+    get_srv_room_member_store (room);
 
-  if (!member)
+  struct GNUNET_MESSENGER_SenderSession session;
+
+  if (GNUNET_YES == is_peer_message (message))
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Message handling dropped: Member is 
missing!\n");
-    return;
+    session.peer = get_store_peer_of (peer_store, message, hash);
+
+    if (! session.peer)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "Message handling dropped: Peer is missing!\n");
+      return;
+    }
   }
+  else
+  {
+    struct GNUNET_MESSENGER_Member *member = get_store_member_of (member_store,
+                                                                  message);
 
-  struct GNUNET_MESSENGER_MemberSession *session = 
get_member_session_of(member, message, hash);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Callback for message (%s)\n",
+                GNUNET_h2s (hash));
 
-  if (!session)
-  {
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Message handling dropped: Session 
is missing!\n");
-    return;
+    if (! member)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "Message handling dropped: Member is missing!\n");
+      return;
+    }
+
+    session.member = get_member_session_of (member, message, hash);
+
+    if (! session.member)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "Message handling dropped: Session is missing!\n");
+      return;
+    }
   }
 
   struct GNUNET_MESSENGER_MemberUpdate update;
@@ -1114,7 +1222,7 @@ callback_room_handle_message (struct 
GNUNET_MESSENGER_SrvRoom *room,
   update.head = NULL;
   update.tail = NULL;
 
-  iterate_store_members(member_store, iterate_update_member_sessions, &update);
+  iterate_store_members (member_store, iterate_update_member_sessions, 
&update);
 
   while (update.head)
   {
@@ -1122,7 +1230,7 @@ callback_room_handle_message (struct 
GNUNET_MESSENGER_SrvRoom *room,
 
     remove_room_member_session (room, element->session);
 
-    GNUNET_CONTAINER_DLL_remove(update.head, update.tail, element);
+    GNUNET_CONTAINER_DLL_remove (update.head, update.tail, element);
     GNUNET_free (element);
   }
 
@@ -1133,28 +1241,28 @@ callback_room_handle_message (struct 
GNUNET_MESSENGER_SrvRoom *room,
   switch (message->header.kind)
   {
   case GNUNET_MESSENGER_KIND_JOIN:
-    handle_message_join (room, session, message, hash);
+    handle_message_join (room, &session, message, hash);
     break;
   case GNUNET_MESSENGER_KIND_LEAVE:
-    handle_message_leave (room, session, message, hash);
+    handle_message_leave (room, &session, message, hash);
     break;
   case GNUNET_MESSENGER_KIND_NAME:
-    handle_message_name (room, session, message, hash);
+    handle_message_name (room, &session, message, hash);
     break;
   case GNUNET_MESSENGER_KIND_KEY:
-    handle_message_key (room, session, message, hash);
+    handle_message_key (room, &session, message, hash);
     break;
   case GNUNET_MESSENGER_KIND_PEER:
-    handle_message_peer (room, session, message, hash);
+    handle_message_peer (room, &session, message, hash);
     break;
   case GNUNET_MESSENGER_KIND_ID:
-    handle_message_id (room, session, message, hash);
+    handle_message_id (room, &session, message, hash);
     break;
   case GNUNET_MESSENGER_KIND_MISS:
-    handle_message_miss (room, session, message, hash);
+    handle_message_miss (room, &session, message, hash);
     break;
   case GNUNET_MESSENGER_KIND_DELETE:
-    handle_message_delete (room, session, message, hash);
+    handle_message_delete (room, &session, message, hash);
     break;
   default:
     break;
@@ -1164,45 +1272,50 @@ callback_room_handle_message (struct 
GNUNET_MESSENGER_SrvRoom *room,
     handle_room_messages (room);
 }
 
+
 static void
 get_room_data_subdir (struct GNUNET_MESSENGER_SrvRoom *room,
                       char **dir)
 {
-  GNUNET_assert((room) && (dir));
+  GNUNET_assert ((room) && (dir));
 
-  GNUNET_asprintf (dir, "%s%s%c%s%c", room->service->dir, "rooms", 
DIR_SEPARATOR, GNUNET_h2s (get_srv_room_key(room)), DIR_SEPARATOR);
+  GNUNET_asprintf (dir, "%s%s%c%s%c", room->service->dir, "rooms",
+                   DIR_SEPARATOR, GNUNET_h2s (get_srv_room_key (room)),
+                   DIR_SEPARATOR);
 }
 
+
 void
 load_srv_room (struct GNUNET_MESSENGER_SrvRoom *room)
 {
-  GNUNET_assert(room);
+  GNUNET_assert (room);
 
   char *room_dir;
   get_room_data_subdir (room, &room_dir);
 
   if (GNUNET_YES == GNUNET_DISK_directory_test (room_dir, GNUNET_YES))
   {
-    load_member_store (get_srv_room_member_store(room), room_dir);
-    load_message_store (get_srv_room_message_store(room), room_dir);
-    load_operation_store(get_srv_room_operation_store(room), room_dir);
+    load_member_store (get_srv_room_member_store (room), room_dir);
+    load_message_store (get_srv_room_message_store (room), room_dir);
+    load_operation_store (get_srv_room_operation_store (room), room_dir);
 
     char *basement_file;
     GNUNET_asprintf (&basement_file, "%s%s", room_dir, "basement.list");
 
-    load_list_tunnels(&(room->basement), basement_file);
-    GNUNET_free(basement_file);
+    load_list_tunnels (&(room->basement), basement_file);
+    GNUNET_free (basement_file);
 
-    load_message_state(&(room->state), room_dir);
+    load_message_state (&(room->state), room_dir);
   }
 
-  GNUNET_free(room_dir);
+  GNUNET_free (room_dir);
 }
 
+
 void
 save_srv_room (struct GNUNET_MESSENGER_SrvRoom *room)
 {
-  GNUNET_assert(room);
+  GNUNET_assert (room);
 
   char *room_dir;
   get_room_data_subdir (room, &room_dir);
@@ -1210,36 +1323,38 @@ save_srv_room (struct GNUNET_MESSENGER_SrvRoom *room)
   if ((GNUNET_YES == GNUNET_DISK_directory_test (room_dir, GNUNET_NO)) ||
       (GNUNET_OK == GNUNET_DISK_directory_create (room_dir)))
   {
-    save_member_store(get_srv_room_member_store(room), room_dir);
-    save_message_store (get_srv_room_message_store(room), room_dir);
-    save_operation_store(get_srv_room_operation_store(room), room_dir);
+    save_member_store (get_srv_room_member_store (room), room_dir);
+    save_message_store (get_srv_room_message_store (room), room_dir);
+    save_operation_store (get_srv_room_operation_store (room), room_dir);
 
     char *basement_file;
     GNUNET_asprintf (&basement_file, "%s%s", room_dir, "basement.list");
 
-    save_list_tunnels(&(room->basement), basement_file);
-    GNUNET_free(basement_file);
+    save_list_tunnels (&(room->basement), basement_file);
+    GNUNET_free (basement_file);
 
-    save_message_state(&(room->state), room_dir);
+    save_message_state (&(room->state), room_dir);
   }
 
-  GNUNET_free(room_dir);
+  GNUNET_free (room_dir);
 }
 
+
 void
 remove_srv_room (struct GNUNET_MESSENGER_SrvRoom *room)
 {
-  GNUNET_assert(room);
+  GNUNET_assert (room);
 
   char *room_dir;
   get_room_data_subdir (room, &room_dir);
 
   if (GNUNET_YES == GNUNET_DISK_directory_test (room_dir, GNUNET_YES))
-    GNUNET_DISK_directory_remove(room_dir);
+    GNUNET_DISK_directory_remove (room_dir);
 
-  GNUNET_free(room_dir);
+  GNUNET_free (room_dir);
 }
 
+
 static void
 remove_room_member_session (struct GNUNET_MESSENGER_SrvRoom *room,
                             struct GNUNET_MESSENGER_MemberSession *session)
@@ -1248,27 +1363,28 @@ remove_room_member_session (struct 
GNUNET_MESSENGER_SrvRoom *room,
 
   remove_member_session (session->member, session);
 
-  const struct GNUNET_CRYPTO_PublicKey *public_key = 
get_member_session_public_key(session);
+  const struct GNUNET_CRYPTO_PublicKey *public_key =
+    get_member_session_public_key (session);
 
   struct GNUNET_HashCode hash;
-  GNUNET_CRYPTO_hash(public_key, sizeof(*public_key), &hash);
+  GNUNET_CRYPTO_hash (public_key, sizeof(*public_key), &hash);
 
   char *room_dir;
   get_room_data_subdir (room, &room_dir);
 
-  char* session_dir;
+  char *session_dir;
   GNUNET_asprintf (
-      &session_dir, "%s%s%c%s%c%s%c%s%c", room_dir,
-      "members", DIR_SEPARATOR,
-      GNUNET_sh2s(get_member_session_id(session)), DIR_SEPARATOR,
-      "sessions", DIR_SEPARATOR,
-      GNUNET_h2s(&hash), DIR_SEPARATOR
-  );
+    &session_dir, "%s%s%c%s%c%s%c%s%c", room_dir,
+    "members", DIR_SEPARATOR,
+    GNUNET_sh2s (get_member_session_id (session)), DIR_SEPARATOR,
+    "sessions", DIR_SEPARATOR,
+    GNUNET_h2s (&hash), DIR_SEPARATOR
+    );
 
   GNUNET_free (room_dir);
 
-  GNUNET_DISK_directory_remove(session_dir);
+  GNUNET_DISK_directory_remove (session_dir);
   GNUNET_free (session_dir);
 
-  destroy_member_session(session);
+  destroy_member_session (session);
 }
diff --git a/src/service/messenger/gnunet-service-messenger_room.h 
b/src/service/messenger/gnunet-service-messenger_room.h
index fb2a88aea..e3e561d8b 100644
--- a/src/service/messenger/gnunet-service-messenger_room.h
+++ b/src/service/messenger/gnunet-service-messenger_room.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2022 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -38,20 +38,20 @@
 #include "gnunet-service-messenger_list_messages.h"
 
 #include "messenger_api_list_tunnels.h"
+#include "messenger_api_peer_store.h"
 
 #include "gnunet-service-messenger_member_store.h"
 #include "gnunet-service-messenger_message_store.h"
 #include "gnunet-service-messenger_operation_store.h"
-#include "messenger_api_ego.h"
 
 #define GNUNET_MESSENGER_IDLE_DELAY GNUNET_TIME_relative_multiply \
-  (GNUNET_TIME_relative_get_second_ (), 5)
+          (GNUNET_TIME_relative_get_second_ (), 5)
 
 #define GNUNET_MESSENGER_REQUEST_DELAY GNUNET_TIME_relative_multiply \
-  (GNUNET_TIME_relative_get_minute_ (), 5)
+          (GNUNET_TIME_relative_get_minute_ (), 5)
 
 #define GNUNET_MESSENGER_MERGE_DELAY GNUNET_TIME_relative_multiply \
-  (GNUNET_TIME_relative_get_second_ (), 30)
+          (GNUNET_TIME_relative_get_second_ (), 30)
 
 struct GNUNET_MESSENGER_SrvTunnel;
 struct GNUNET_MESSENGER_MemberSession;
@@ -66,6 +66,7 @@ struct GNUNET_MESSENGER_SrvRoom
 
   struct GNUNET_CONTAINER_MultiPeerMap *tunnels;
 
+  struct GNUNET_MESSENGER_PeerStore peer_store;
   struct GNUNET_MESSENGER_MemberStore member_store;
   struct GNUNET_MESSENGER_MessageStore message_store;
   struct GNUNET_MESSENGER_OperationStore operation_store;
@@ -88,7 +89,7 @@ struct GNUNET_MESSENGER_SrvRoom
  */
 struct GNUNET_MESSENGER_SrvRoom*
 create_srv_room (struct GNUNET_MESSENGER_SrvHandle *handle,
-             const struct GNUNET_HashCode *key);
+                 const struct GNUNET_HashCode *key);
 
 /**
  * Destroys a room and frees its memory fully.
@@ -101,7 +102,16 @@ create_srv_room (struct GNUNET_MESSENGER_SrvHandle *handle,
  */
 void
 destroy_srv_room (struct GNUNET_MESSENGER_SrvRoom *room,
-              int deletion);
+                  int deletion);
+
+/**
+ * Returns the used peer store of a given <i>room</i>.
+ *
+ * @param[in,out] room Room
+ * @return Peer store
+ */
+struct GNUNET_MESSENGER_PeerStore*
+get_srv_room_peer_store (struct GNUNET_MESSENGER_SrvRoom *room);
 
 /**
  * Returns the used member store of a given <i>room</i>.
@@ -297,11 +307,11 @@ get_srv_room_tunnel (const struct 
GNUNET_MESSENGER_SrvRoom *room,
  * @param[in] hash Hash of message
  */
 typedef void (GNUNET_MESSENGER_MessageRequestCallback) (
-    void *cls,
-    struct GNUNET_MESSENGER_SrvRoom *room,
-    const struct GNUNET_MESSENGER_Message *message,
-    const struct GNUNET_HashCode *hash
-);
+  void *cls,
+  struct GNUNET_MESSENGER_SrvRoom *room,
+  const struct GNUNET_MESSENGER_Message *message,
+  const struct GNUNET_HashCode *hash
+  );
 
 /**
  * Requests a message from a <i>room</i> identified by a given <i>hash</i>. If 
the message is found,
@@ -323,7 +333,7 @@ request_srv_room_message (struct GNUNET_MESSENGER_SrvRoom 
*room,
                           const struct GNUNET_HashCode *hash,
                           const struct GNUNET_MESSENGER_MemberSession *session,
                           GNUNET_MESSENGER_MessageRequestCallback callback,
-                          void* cls);
+                          void *cls);
 
 /**
  * Checks for potential collisions with member ids and solves them changing 
active handles ids if they
@@ -336,7 +346,8 @@ request_srv_room_message (struct GNUNET_MESSENGER_SrvRoom 
*room,
  */
 void
 solve_srv_room_member_collisions (struct GNUNET_MESSENGER_SrvRoom *room,
-                                  const struct GNUNET_CRYPTO_PublicKey 
*public_key,
+                                  const struct
+                                  GNUNET_CRYPTO_PublicKey *public_key,
                                   const struct GNUNET_ShortHashCode *member_id,
                                   struct GNUNET_TIME_Absolute timestamp);
 
diff --git a/src/service/messenger/messenger_api_ego.h 
b/src/service/messenger/gnunet-service-messenger_sender_session.h
similarity index 63%
copy from src/service/messenger/messenger_api_ego.h
copy to src/service/messenger/gnunet-service-messenger_sender_session.h
index 1d84c524f..6eb287607 100644
--- a/src/service/messenger/messenger_api_ego.h
+++ b/src/service/messenger/gnunet-service-messenger_sender_session.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -19,20 +19,25 @@
  */
 /**
  * @author Tobias Frisch
- * @file src/messenger/messenger_api_ego.h
+ * @file src/messenger/gnunet-service-messenger_sender_session.h
  * @brief GNUnet MESSENGER service
  */
 
-#ifndef GNUNET_MESSENGER_API_EGO_H
-#define GNUNET_MESSENGER_API_EGO_H
+#ifndef GNUNET_SERVICE_MESSENGER_SENDER_SESSION_H
+#define GNUNET_SERVICE_MESSENGER_SENDER_SESSION_H
 
 #include "platform.h"
-#include "gnunet_identity_service.h"
+#include "gnunet_util_lib.h"
 
-struct GNUNET_MESSENGER_Ego
+#include "gnunet-service-messenger_member_session.h"
+
+struct GNUNET_MESSENGER_SenderSession
 {
-  struct GNUNET_CRYPTO_PrivateKey priv;
-  struct GNUNET_CRYPTO_PublicKey pub;
+  union
+  {
+    struct GNUNET_MESSENGER_MemberSession *member;
+    struct GNUNET_PeerIdentity *peer;
+  };
 };
 
-#endif //GNUNET_MESSENGER_API_EGO_H
+#endif /* GNUNET_SERVICE_MESSENGER_SENDER_SESSION_H */
diff --git a/src/service/messenger/gnunet-service-messenger_service.c 
b/src/service/messenger/gnunet-service-messenger_service.c
index 8dfc258c1..b72bbd201 100644
--- a/src/service/messenger/gnunet-service-messenger_service.c
+++ b/src/service/messenger/gnunet-service-messenger_service.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2022 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -25,8 +25,8 @@
 
 #include "platform.h"
 #include "gnunet-service-messenger_service.h"
-#include "gnunet-service-messenger_message_kind.h"
 #include "gnunet-service-messenger.h"
+#include "messenger_api_message_kind.h"
 
 static void
 callback_shutdown_service (void *cls)
@@ -41,36 +41,43 @@ callback_shutdown_service (void *cls)
   }
 }
 
+
 struct GNUNET_MESSENGER_Service*
 create_service (const struct GNUNET_CONFIGURATION_Handle *config,
                 struct GNUNET_SERVICE_Handle *service_handle)
 {
-  GNUNET_assert((config) && (service_handle));
+  GNUNET_assert ((config) && (service_handle));
 
-  struct GNUNET_MESSENGER_Service *service = GNUNET_new(struct 
GNUNET_MESSENGER_Service);
+  struct GNUNET_MESSENGER_Service *service = GNUNET_new (struct
+                                                         
GNUNET_MESSENGER_Service);
 
   service->config = config;
   service->service = service_handle;
 
-  service->shutdown = GNUNET_SCHEDULER_add_shutdown 
(&callback_shutdown_service, service);
+  service->shutdown = GNUNET_SCHEDULER_add_shutdown 
(&callback_shutdown_service,
+                                                     service);
 
+  service->peer = NULL;
   service->dir = NULL;
 
   if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (service->config,
-  GNUNET_MESSENGER_SERVICE_NAME,
-                                                            "MESSENGER_DIR", 
&(service->dir)))
+                                                            
GNUNET_MESSENGER_SERVICE_NAME,
+                                                            "MESSENGER_DIR",
+                                                            &(service->dir)))
   {
     if (service->dir)
-      GNUNET_free(service->dir);
+      GNUNET_free (service->dir);
 
     service->dir = NULL;
   }
   else
   {
-    if ((GNUNET_YES != GNUNET_DISK_directory_test (service->dir, GNUNET_YES)) 
&& (GNUNET_OK
-        != GNUNET_DISK_directory_create (service->dir)))
+    if ((GNUNET_YES != GNUNET_DISK_directory_test (service->dir, GNUNET_YES)) 
&&
+        (GNUNET_OK
+         !=
+         GNUNET_DISK_directory_create (service->dir)))
     {
-      GNUNET_free(service->dir);
+      GNUNET_free (service->dir);
 
       service->dir = NULL;
     }
@@ -78,17 +85,16 @@ create_service (const struct GNUNET_CONFIGURATION_Handle 
*config,
 
   service->cadet = GNUNET_CADET_connect (service->config);
 
-  init_ego_store(get_service_ego_store(service), service->config);
-
   init_list_handles (&(service->handles));
 
   service->rooms = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
 
-  init_contact_store(get_service_contact_store(service));
+  init_contact_store (get_service_contact_store (service));
 
   return service;
 }
 
+
 static int
 iterate_destroy_rooms (void *cls,
                        const struct GNUNET_HashCode *key,
@@ -99,10 +105,11 @@ iterate_destroy_rooms (void *cls,
   return GNUNET_YES;
 }
 
+
 void
 destroy_service (struct GNUNET_MESSENGER_Service *service)
 {
-  GNUNET_assert(service);
+  GNUNET_assert (service);
 
   if (service->shutdown)
   {
@@ -111,13 +118,13 @@ destroy_service (struct GNUNET_MESSENGER_Service *service)
     service->shutdown = NULL;
   }
 
-  clear_ego_store(get_service_ego_store(service));
   clear_list_handles (&(service->handles));
 
-  GNUNET_CONTAINER_multihashmap_iterate (service->rooms, 
iterate_destroy_rooms, NULL);
+  GNUNET_CONTAINER_multihashmap_iterate (service->rooms, iterate_destroy_rooms,
+                                         NULL);
   GNUNET_CONTAINER_multihashmap_destroy (service->rooms);
 
-  clear_contact_store(get_service_contact_store(service));
+  clear_contact_store (get_service_contact_store (service));
 
   if (service->cadet)
   {
@@ -128,37 +135,38 @@ destroy_service (struct GNUNET_MESSENGER_Service *service)
 
   if (service->dir)
   {
-    GNUNET_free(service->dir);
+    GNUNET_free (service->dir);
 
     service->dir = NULL;
   }
 
-  GNUNET_SERVICE_shutdown (service->service);
+  if (service->peer)
+  {
+    GNUNET_free (service->peer);
 
-  GNUNET_free(service);
-}
+    service->peer = NULL;
+  }
 
-struct GNUNET_MESSENGER_EgoStore*
-get_service_ego_store (struct GNUNET_MESSENGER_Service *service)
-{
-  GNUNET_assert(service);
+  GNUNET_SERVICE_shutdown (service->service);
 
-  return &(service->ego_store);
+  GNUNET_free (service);
 }
 
+
 struct GNUNET_MESSENGER_ContactStore*
 get_service_contact_store (struct GNUNET_MESSENGER_Service *service)
 {
-  GNUNET_assert(service);
+  GNUNET_assert (service);
 
   return &(service->contact_store);
 }
 
+
 struct GNUNET_MESSENGER_SrvHandle*
 add_service_handle (struct GNUNET_MESSENGER_Service *service,
                     struct GNUNET_MQ_Handle *mq)
 {
-  GNUNET_assert((service) && (mq));
+  GNUNET_assert ((service) && (mq));
 
   struct GNUNET_MESSENGER_SrvHandle *handle = create_srv_handle (service, mq);
 
@@ -170,43 +178,62 @@ add_service_handle (struct GNUNET_MESSENGER_Service 
*service,
   return handle;
 }
 
+
 void
 remove_service_handle (struct GNUNET_MESSENGER_Service *service,
                        struct GNUNET_MESSENGER_SrvHandle *handle)
 {
-  GNUNET_assert((service) && (handle));
+  GNUNET_assert ((service) && (handle));
 
-  if (!handle)
+  if (! handle)
     return;
 
   if (GNUNET_YES == remove_list_handle (&(service->handles), handle))
     destroy_srv_handle (handle);
 }
 
+
 int
-get_service_peer_identity (const struct GNUNET_MESSENGER_Service *service,
+get_service_peer_identity (struct GNUNET_MESSENGER_Service *service,
                            struct GNUNET_PeerIdentity *peer)
 {
-  GNUNET_assert((service) && (peer));
+  GNUNET_assert ((service) && (peer));
+
+  if (service->peer)
+  {
+    GNUNET_memcpy (peer, service->peer, sizeof(struct GNUNET_PeerIdentity));
+    return GNUNET_OK;
+  }
+
+  int result = GNUNET_CRYPTO_get_peer_identity (service->config, peer);
+
+  if (GNUNET_OK != result)
+    return result;
+
+  if (! service->peer)
+    service->peer = GNUNET_new (struct GNUNET_PeerIdentity);
 
-  return GNUNET_CRYPTO_get_peer_identity (service->config, peer);
+  GNUNET_memcpy (service->peer, peer, sizeof(struct GNUNET_PeerIdentity));
+  return result;
 }
 
+
 struct GNUNET_MESSENGER_SrvRoom*
 get_service_room (const struct GNUNET_MESSENGER_Service *service,
                   const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((service) && (key));
+  GNUNET_assert ((service) && (key));
 
   return GNUNET_CONTAINER_multihashmap_get (service->rooms, key);
 }
 
+
 int
 open_service_room (struct GNUNET_MESSENGER_Service *service,
                    struct GNUNET_MESSENGER_SrvHandle *handle,
                    const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((service) && (handle) && (key));
+  GNUNET_assert ((service) && (handle) && (key));
 
   struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (service, key);
 
@@ -225,13 +252,14 @@ open_service_room (struct GNUNET_MESSENGER_Service 
*service,
   return GNUNET_NO;
 }
 
+
 int
 entry_service_room (struct GNUNET_MESSENGER_Service *service,
                     struct GNUNET_MESSENGER_SrvHandle *handle,
                     const struct GNUNET_PeerIdentity *door,
                     const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((service) && (handle) && (door) && (key));
+  GNUNET_assert ((service) && (handle) && (door) && (key));
 
   struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (service, key);
 
@@ -260,33 +288,38 @@ entry_service_room (struct GNUNET_MESSENGER_Service 
*service,
 
 }
 
+
 int
 close_service_room (struct GNUNET_MESSENGER_Service *service,
                     struct GNUNET_MESSENGER_SrvHandle *handle,
                     const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((service) && (handle) && (key));
+  GNUNET_assert ((service) && (handle) && (key));
 
   struct GNUNET_MESSENGER_SrvRoom *room = get_service_room (service, key);
 
-  if (!room)
+  if (! room)
     return GNUNET_NO;
 
-  send_srv_room_message (room, handle, create_message_leave ());
-
-  const struct GNUNET_ShortHashCode *id = get_srv_handle_member_id (handle, 
key);
+  const struct GNUNET_ShortHashCode *id = get_srv_handle_member_id (handle,
+                                                                    key);
 
-  GNUNET_assert(id);
+  GNUNET_assert (id);
 
-  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (handle->member_ids, 
key, id))
+  if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (handle->member_ids,
+                                                          key, id))
     return GNUNET_NO;
 
-  struct GNUNET_MESSENGER_SrvHandle *member_handle = (struct 
GNUNET_MESSENGER_SrvHandle*) find_list_handle_by_member (
-      &(service->handles), key);
+  struct GNUNET_MESSENGER_SrvHandle *member_handle = (struct
+                                                      
GNUNET_MESSENGER_SrvHandle
+                                                      *)
+                                                     
find_list_handle_by_member (
+    &(service->handles), key);
 
-  if (!member_handle)
+  if (! member_handle)
   {
-    if (GNUNET_OK == GNUNET_CONTAINER_multihashmap_remove (service->rooms, 
key, room))
+    if (GNUNET_OK == GNUNET_CONTAINER_multihashmap_remove (service->rooms, key,
+                                                           room))
     {
       destroy_srv_room (room, GNUNET_YES);
       return GNUNET_YES;
@@ -301,14 +334,15 @@ close_service_room (struct GNUNET_MESSENGER_Service 
*service,
   return GNUNET_YES;
 }
 
+
 void
 handle_service_message (struct GNUNET_MESSENGER_Service *service,
                         struct GNUNET_MESSENGER_SrvRoom *room,
-                        const struct GNUNET_MESSENGER_MemberSession *session,
+                        const struct GNUNET_MESSENGER_SenderSession *session,
                         const struct GNUNET_MESSENGER_Message *message,
                         const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((service) && (room) && (session) && (message) && (hash));
+  GNUNET_assert ((service) && (room) && (session) && (message) && (hash));
 
   struct GNUNET_MESSENGER_ListHandle *element = service->handles.head;
 
diff --git a/src/service/messenger/gnunet-service-messenger_service.h 
b/src/service/messenger/gnunet-service-messenger_service.h
index 36df81141..69486b415 100644
--- a/src/service/messenger/gnunet-service-messenger_service.h
+++ b/src/service/messenger/gnunet-service-messenger_service.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -31,13 +31,12 @@
 #include "gnunet_util_lib.h"
 #include "gnunet_identity_service.h"
 
-#include "gnunet-service-messenger_ego_store.h"
 #include "gnunet-service-messenger_list_handles.h"
 
 #include "messenger_api_contact_store.h"
-#include "gnunet-service-messenger_room.h"
 
-#include "gnunet-service-messenger_member_session.h"
+#include "gnunet-service-messenger_room.h"
+#include "gnunet-service-messenger_sender_session.h"
 
 struct GNUNET_MESSENGER_Service
 {
@@ -46,11 +45,11 @@ struct GNUNET_MESSENGER_Service
 
   struct GNUNET_SCHEDULER_Task *shutdown;
 
+  struct GNUNET_PeerIdentity *peer;
   char *dir;
 
   struct GNUNET_CADET_Handle *cadet;
 
-  struct GNUNET_MESSENGER_EgoStore ego_store;
   struct GNUNET_MESSENGER_ContactStore contact_store;
 
   struct GNUNET_MESSENGER_ListHandles handles;
@@ -77,15 +76,6 @@ create_service (const struct GNUNET_CONFIGURATION_Handle 
*config,
 void
 destroy_service (struct GNUNET_MESSENGER_Service *service);
 
-/**
- * Returns the used EGO-store of a given <i>service</i>.
- *
- * @param[in,out] service Service
- * @return EGO-store
- */
-struct GNUNET_MESSENGER_EgoStore*
-get_service_ego_store (struct GNUNET_MESSENGER_Service *service);
-
 /**
  * Returns the used contact store of a given <i>service</i>.
  *
@@ -120,12 +110,12 @@ remove_service_handle (struct GNUNET_MESSENGER_Service 
*service,
  * Tries to write the peer identity of the peer running a <i>service</i> on to 
the <i>peer</i>
  * parameter. The functions returns #GNUNET_OK on success, otherwise 
#GNUNET_SYSERR.
  *
- * @param[in] service Service
+ * @param[in,out] service Service
  * @param[out] peer Peer identity
  * @return #GNUNET_OK on success, otherwise #GNUNET_SYSERR
  */
 int
-get_service_peer_identity (const struct GNUNET_MESSENGER_Service *service,
+get_service_peer_identity (struct GNUNET_MESSENGER_Service *service,
                            struct GNUNET_PeerIdentity *peer);
 
 /**
@@ -196,14 +186,14 @@ close_service_room (struct GNUNET_MESSENGER_Service 
*service,
  *
  * @param[in,out] service Service
  * @param[in,out] room Room
- * @param[in] session Member session
+ * @param[in] session Sender session
  * @param[in] message Message
  * @param[in] hash Hash of message
  */
 void
 handle_service_message (struct GNUNET_MESSENGER_Service *service,
                         struct GNUNET_MESSENGER_SrvRoom *room,
-                        const struct GNUNET_MESSENGER_MemberSession *session,
+                        const struct GNUNET_MESSENGER_SenderSession *session,
                         const struct GNUNET_MESSENGER_Message *message,
                         const struct GNUNET_HashCode *hash);
 
diff --git a/src/service/messenger/gnunet-service-messenger_tunnel.c 
b/src/service/messenger/gnunet-service-messenger_tunnel.c
index 8ad7fff1c..5262ba79b 100644
--- a/src/service/messenger/gnunet-service-messenger_tunnel.c
+++ b/src/service/messenger/gnunet-service-messenger_tunnel.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2022 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -37,9 +37,10 @@ struct GNUNET_MESSENGER_SrvTunnel*
 create_tunnel (struct GNUNET_MESSENGER_SrvRoom *room,
                const struct GNUNET_PeerIdentity *door)
 {
-  GNUNET_assert((room) && (door));
+  GNUNET_assert ((room) && (door));
 
-  struct GNUNET_MESSENGER_SrvTunnel *tunnel = GNUNET_new(struct 
GNUNET_MESSENGER_SrvTunnel);
+  struct GNUNET_MESSENGER_SrvTunnel *tunnel = GNUNET_new (struct
+                                                          
GNUNET_MESSENGER_SrvTunnel);
 
   tunnel->room = room;
   tunnel->channel = NULL;
@@ -50,15 +51,16 @@ create_tunnel (struct GNUNET_MESSENGER_SrvRoom *room,
 
   tunnel->peer_message = NULL;
 
-  init_message_state(&(tunnel->state));
+  init_message_state (&(tunnel->state));
 
   return tunnel;
 }
 
+
 void
 destroy_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel)
 {
-  GNUNET_assert(tunnel);
+  GNUNET_assert (tunnel);
 
   if (tunnel->channel)
     GNUNET_CADET_channel_destroy (tunnel->channel);
@@ -66,18 +68,19 @@ destroy_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel)
   GNUNET_PEER_change_rc (tunnel->peer, -1);
 
   if (tunnel->peer_message)
-    GNUNET_free(tunnel->peer_message);
+    GNUNET_free (tunnel->peer_message);
 
-  clear_message_state(&(tunnel->state));
+  clear_message_state (&(tunnel->state));
 
-  GNUNET_free(tunnel);
+  GNUNET_free (tunnel);
 }
 
+
 void
 bind_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel,
              struct GNUNET_CADET_Channel *channel)
 {
-  GNUNET_assert(tunnel);
+  GNUNET_assert (tunnel);
 
   if (tunnel->channel)
     delayed_disconnect_channel (tunnel->channel);
@@ -85,6 +88,7 @@ bind_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel,
   tunnel->channel = channel;
 }
 
+
 extern void
 callback_room_disconnect (struct GNUNET_MESSENGER_SrvRoom *room,
                           void *cls);
@@ -103,6 +107,7 @@ callback_tunnel_disconnect (void *cls,
   }
 }
 
+
 extern int
 callback_verify_room_message (struct GNUNET_MESSENGER_SrvRoom *room,
                               void *cls,
@@ -115,7 +120,7 @@ check_tunnel_message (void *cls,
 {
   struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls;
 
-  if (!tunnel)
+  if (! tunnel)
     return GNUNET_SYSERR;
 
   const uint16_t length = ntohs (header->size) - sizeof(*header);
@@ -123,17 +128,20 @@ check_tunnel_message (void *cls,
 
   struct GNUNET_MESSENGER_Message message;
 
-  if (length < get_message_kind_size(GNUNET_MESSENGER_KIND_UNKNOWN, 
GNUNET_YES))
+  if (length < get_message_kind_size (GNUNET_MESSENGER_KIND_UNKNOWN,
+                                      GNUNET_YES))
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Tunnel error: Message too short! 
(%d)\n", length);
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Tunnel error: Message too short! (%d)\n", length);
     return GNUNET_SYSERR;
   }
 
   uint16_t padding = 0;
 
-  if (GNUNET_YES != decode_message (&message, length, buffer, GNUNET_YES, 
&padding))
+  if (GNUNET_YES != decode_message (&message, length, buffer, GNUNET_YES,
+                                    &padding))
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Tunnel error: Decoding failed!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Tunnel error: Decoding failed!\n");
     return GNUNET_SYSERR;
   }
 
@@ -143,6 +151,7 @@ check_tunnel_message (void *cls,
   return callback_verify_room_message (tunnel->room, cls, &message, &hash);
 }
 
+
 extern int
 update_room_message (struct GNUNET_MESSENGER_SrvRoom *room,
                      struct GNUNET_MESSENGER_Message *message,
@@ -150,7 +159,6 @@ update_room_message (struct GNUNET_MESSENGER_SrvRoom *room,
 
 extern void
 callback_room_handle_message (struct GNUNET_MESSENGER_SrvRoom *room,
-                              struct GNUNET_MESSENGER_SrvHandle *handle,
                               const struct GNUNET_MESSENGER_Message *message,
                               const struct GNUNET_HashCode *hash);
 
@@ -158,26 +166,31 @@ static void
 update_tunnel_last_message (struct GNUNET_MESSENGER_SrvTunnel *tunnel,
                             const struct GNUNET_HashCode *hash)
 {
-  struct GNUNET_MESSENGER_OperationStore *operation_store = 
get_srv_room_operation_store(tunnel->room);
+  struct GNUNET_MESSENGER_OperationStore *operation_store =
+    get_srv_room_operation_store (tunnel->room);
 
-  const int requested = (GNUNET_MESSENGER_OP_REQUEST == 
get_store_operation_type(operation_store, hash)?
-      GNUNET_YES : GNUNET_NO
-  );
+  const int requested = (GNUNET_MESSENGER_OP_REQUEST ==
+                         get_store_operation_type (operation_store, hash)?
+                         GNUNET_YES : GNUNET_NO
+                         );
 
-  struct GNUNET_MESSENGER_MessageStore *message_store = 
get_srv_room_message_store(tunnel->room);
+  struct GNUNET_MESSENGER_MessageStore *message_store =
+    get_srv_room_message_store (tunnel->room);
 
-  const struct GNUNET_MESSENGER_Message *message = 
get_store_message(message_store, hash);
+  const struct GNUNET_MESSENGER_Message *message = get_store_message (
+    message_store, hash);
 
   if (message)
-    update_message_state(&(tunnel->state), requested, message, hash);
+    update_message_state (&(tunnel->state), requested, message, hash);
 }
 
+
 void
 handle_tunnel_message (void *cls, const struct GNUNET_MessageHeader *header)
 {
   struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls;
 
-  if (!tunnel)
+  if (! tunnel)
     return;
 
   const uint16_t length = ntohs (header->size) - sizeof(*header);
@@ -191,12 +204,12 @@ handle_tunnel_message (void *cls, const struct 
GNUNET_MessageHeader *header)
   decode_message (&message, length, buffer, GNUNET_YES, &padding);
   hash_message (&message, length - padding, buffer, &hash);
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Got message of kind: %s!\n",
-             GNUNET_MESSENGER_name_of_kind(message.header.kind));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Got message of kind: %s!\n",
+              GNUNET_MESSENGER_name_of_kind (message.header.kind));
 
   const int new_message = update_room_message (
-      tunnel->room, copy_message (&message), &hash
-  );
+    tunnel->room, copy_message (&message), &hash
+    );
 
   if (GNUNET_YES != new_message)
     goto receive_done;
@@ -214,7 +227,8 @@ handle_tunnel_message (void *cls, const struct 
GNUNET_MessageHeader *header)
     forward_message = recv_message_peer (tunnel->room, tunnel, &message, 
&hash);
     break;
   case GNUNET_MESSENGER_KIND_REQUEST:
-    forward_message = recv_message_request (tunnel->room, tunnel, &message, 
&hash);
+    forward_message = recv_message_request (tunnel->room, tunnel, &message,
+                                            &hash);
     break;
   default:
     break;
@@ -223,19 +237,20 @@ handle_tunnel_message (void *cls, const struct 
GNUNET_MessageHeader *header)
   if (GNUNET_YES == forward_message)
   {
     forward_srv_room_message (tunnel->room, tunnel, &message, &hash);
-    callback_room_handle_message (tunnel->room, NULL, &message, &hash);
+    callback_room_handle_message (tunnel->room, &message, &hash);
   }
 
 receive_done:
-  cleanup_message(&message);
+  cleanup_message (&message);
 
   GNUNET_CADET_receive_done (tunnel->channel);
 }
 
+
 int
 connect_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel)
 {
-  GNUNET_assert(tunnel);
+  GNUNET_assert (tunnel);
 
   if (tunnel->channel)
     return GNUNET_NO;
@@ -245,21 +260,28 @@ connect_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel)
   struct GNUNET_CADET_Handle *cadet = get_srv_room_cadet (tunnel->room);
   const struct GNUNET_HashCode *key = get_srv_room_key (tunnel->room);
 
-  struct GNUNET_MQ_MessageHandler handlers[] = { 
GNUNET_MQ_hd_var_size(tunnel_message, GNUNET_MESSAGE_TYPE_CADET_CLI,
-                                                                       struct 
GNUNET_MessageHeader, NULL),
-                                                 GNUNET_MQ_handler_end() };
+  struct GNUNET_MQ_MessageHandler handlers[] = { GNUNET_MQ_hd_var_size (
+                                                   tunnel_message,
+                                                   
GNUNET_MESSAGE_TYPE_CADET_CLI,
+                                                   struct
+                                                   GNUNET_MessageHeader, NULL),
+                                                 GNUNET_MQ_handler_end () };
 
   struct GNUNET_HashCode port;
-  convert_messenger_key_to_port(key, &port);
-  tunnel->channel = GNUNET_CADET_channel_create (cadet, tunnel, door, &port, 
NULL, callback_tunnel_disconnect, handlers);
+  convert_messenger_key_to_port (key, &port);
+  tunnel->channel = GNUNET_CADET_channel_create (cadet, tunnel, door, &port,
+                                                 NULL,
+                                                 callback_tunnel_disconnect,
+                                                 handlers);
 
   return GNUNET_YES;
 }
 
+
 void
 disconnect_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel)
 {
-  GNUNET_assert(tunnel);
+  GNUNET_assert (tunnel);
 
   if (tunnel->channel)
   {
@@ -269,14 +291,16 @@ disconnect_tunnel (struct GNUNET_MESSENGER_SrvTunnel 
*tunnel)
   }
 }
 
+
 int
 is_tunnel_connected (const struct GNUNET_MESSENGER_SrvTunnel *tunnel)
 {
-  GNUNET_assert(tunnel);
+  GNUNET_assert (tunnel);
 
   return (tunnel->channel ? GNUNET_YES : GNUNET_NO);
 }
 
+
 struct GNUNET_MESSENGER_MessageSent
 {
   struct GNUNET_MESSENGER_SrvTunnel *tunnel;
@@ -291,21 +315,23 @@ callback_tunnel_sent (void *cls)
   if (sent->tunnel)
     update_tunnel_last_message (sent->tunnel, &(sent->hash));
 
-  GNUNET_free(sent);
+  GNUNET_free (sent);
 }
 
+
 void
 send_tunnel_envelope (struct GNUNET_MESSENGER_SrvTunnel *tunnel,
                       struct GNUNET_MQ_Envelope *env,
                       const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((tunnel) && (env) && (hash));
+  GNUNET_assert ((tunnel) && (env) && (hash));
 
   struct GNUNET_MQ_Handle *mq = GNUNET_CADET_get_mq (tunnel->channel);
 
-  struct GNUNET_MESSENGER_MessageSent *sent = GNUNET_new(struct 
GNUNET_MESSENGER_MessageSent);
+  struct GNUNET_MESSENGER_MessageSent *sent = GNUNET_new (struct
+                                                          
GNUNET_MESSENGER_MessageSent);
 
-  GNUNET_memcpy(&(sent->hash), hash, sizeof(struct GNUNET_HashCode));
+  GNUNET_memcpy (&(sent->hash), hash, sizeof(struct GNUNET_HashCode));
 
   sent->tunnel = tunnel;
 
@@ -313,85 +339,93 @@ send_tunnel_envelope (struct GNUNET_MESSENGER_SrvTunnel 
*tunnel,
   GNUNET_MQ_send (mq, env);
 }
 
+
 int
 send_tunnel_message (struct GNUNET_MESSENGER_SrvTunnel *tunnel,
                      void *handle,
                      struct GNUNET_MESSENGER_Message *message)
 {
-  GNUNET_assert((tunnel) && (handle));
+  GNUNET_assert ((tunnel) && (handle));
 
-  if (!message)
+  if (! message)
     return GNUNET_NO;
 
   struct GNUNET_HashCode hash;
   struct GNUNET_MQ_Envelope *env = pack_srv_room_message (
-      tunnel->room, (struct GNUNET_MESSENGER_SrvHandle*) handle,
-      message, &hash, GNUNET_MESSENGER_PACK_MODE_ENVELOPE
-  );
+    tunnel->room, (struct GNUNET_MESSENGER_SrvHandle*) handle,
+    message, &hash, GNUNET_MESSENGER_PACK_MODE_ENVELOPE
+    );
 
-  destroy_message(message);
+  destroy_message (message);
 
-  if (!env)
+  if (! env)
     return GNUNET_NO;
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Sending tunnel message: %s\n",
-             GNUNET_h2s(&hash));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending tunnel message: %s\n",
+              GNUNET_h2s (&hash));
 
   send_tunnel_envelope (tunnel, env, &hash);
   return GNUNET_YES;
 }
 
+
 void
 forward_tunnel_message (struct GNUNET_MESSENGER_SrvTunnel *tunnel,
                         const struct GNUNET_MESSENGER_Message *message,
                         const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((tunnel) && (message) && (hash));
+  GNUNET_assert ((tunnel) && (message) && (hash));
 
-  struct GNUNET_MESSENGER_Message *copy = copy_message(message);
-  struct GNUNET_MQ_Envelope *env = pack_message (copy, NULL, NULL, 
GNUNET_MESSENGER_PACK_MODE_ENVELOPE);
+  struct GNUNET_MESSENGER_Message *copy = copy_message (message);
+  struct GNUNET_MQ_Envelope *env = pack_message (copy, NULL, NULL,
+                                                 
GNUNET_MESSENGER_PACK_MODE_ENVELOPE,
+                                                 NULL);
 
-  destroy_message(copy);
+  destroy_message (copy);
 
-  if (!env)
+  if (! env)
     return;
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Forwarding tunnel message: %s\n",
-             GNUNET_h2s(hash));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Forwarding tunnel message: %s\n",
+              GNUNET_h2s (hash));
 
   send_tunnel_envelope (tunnel, env, hash);
 }
 
+
 const struct GNUNET_HashCode*
 get_tunnel_peer_message (const struct GNUNET_MESSENGER_SrvTunnel *tunnel)
 {
-  GNUNET_assert(tunnel);
+  GNUNET_assert (tunnel);
 
   return tunnel->peer_message;
 }
 
+
 void
 get_tunnel_peer_identity (const struct GNUNET_MESSENGER_SrvTunnel *tunnel,
                           struct GNUNET_PeerIdentity *peer)
 {
-  GNUNET_assert(tunnel);
+  GNUNET_assert (tunnel);
 
-  GNUNET_PEER_resolve(tunnel->peer, peer);
+  GNUNET_PEER_resolve (tunnel->peer, peer);
 }
 
+
 uint32_t
 get_tunnel_messenger_version (const struct GNUNET_MESSENGER_SrvTunnel *tunnel)
 {
-  GNUNET_assert(tunnel);
+  GNUNET_assert (tunnel);
 
   return tunnel->messenger_version;
 }
 
+
 int
 update_tunnel_messenger_version (struct GNUNET_MESSENGER_SrvTunnel *tunnel,
                                  uint32_t version)
 {
-  GNUNET_assert(tunnel);
+  GNUNET_assert (tunnel);
 
   if (version != GNUNET_MESSENGER_VERSION)
     return GNUNET_SYSERR;
diff --git a/src/service/messenger/meson.build 
b/src/service/messenger/meson.build
index 3c05d7760..f6d63bc6c 100644
--- a/src/service/messenger/meson.build
+++ b/src/service/messenger/meson.build
@@ -1,8 +1,11 @@
 libgnunetmessenger_src = ['messenger_api.c',
                           'messenger_api_contact.c',
                           'messenger_api_contact_store.c',
+                          'messenger_api_peer_store.c',
                           'messenger_api_message.c',
+                          'messenger_api_message_kind.c',
                           'messenger_api_list_tunnels.c',
+                          'messenger_api_queue_messages.c',
                           'messenger_api_util.c',
                           'messenger_api_handle.c',
                           'messenger_api_room.c']
@@ -23,7 +26,6 @@ gnunetservicemessenger_src = ['gnunet-service-messenger.c',
                               'gnunet-service-messenger_operation_store.c',
                               'gnunet-service-messenger_operation.c',
                               'gnunet-service-messenger_basement.c',
-                              'gnunet-service-messenger_ego_store.c',
                               'gnunet-service-messenger_handle.c',
                               'gnunet-service-messenger_room.c',
                               'gnunet-service-messenger_tunnel.c']
diff --git a/src/service/messenger/messenger_api.c 
b/src/service/messenger/messenger_api.c
index 3604d0569..a5b2d7687 100644
--- a/src/service/messenger/messenger_api.c
+++ b/src/service/messenger/messenger_api.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -24,12 +24,15 @@
  */
 
 #include "platform.h"
+#include "gnunet_identity_service.h"
 #include "gnunet_messenger_service.h"
 
 #include "gnunet-service-messenger.h"
 
 #include "messenger_api_handle.h"
 #include "messenger_api_message.h"
+#include "messenger_api_message_kind.h"
+#include "messenger_api_room.h"
 #include "messenger_api_util.h"
 
 const char*
@@ -72,137 +75,116 @@ GNUNET_MESSENGER_name_of_kind (enum 
GNUNET_MESSENGER_MessageKind kind)
   }
 }
 
-static int
-check_get_name (void *cls,
-                const struct GNUNET_MESSENGER_NameMessage *msg)
-{
-  GNUNET_MQ_check_zero_termination(msg);
-  return GNUNET_OK;
-}
+
+static enum GNUNET_GenericReturnValue
+dequeue_messages_from_room (struct GNUNET_MESSENGER_Room *room);
 
 static void
-handle_get_name (void *cls,
-                 const struct GNUNET_MESSENGER_NameMessage *msg)
+handle_room_open (void *cls,
+                  const struct GNUNET_MESSENGER_RoomMessage *msg)
 {
   struct GNUNET_MESSENGER_Handle *handle = cls;
 
-  const char *name = ((const char*) msg) + sizeof(*msg);
-
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Set name of handle: %s\n", name);
-
-  set_handle_name (handle, strlen (name) > 0 ? name : NULL);
-}
-
-static int
-check_get_key (void *cls,
-               const struct GNUNET_MESSENGER_KeyMessage *msg)
-{
-  const uint16_t full_length = ntohs (msg->header.size);
+  const struct GNUNET_HashCode *key = &(msg->key);
 
-  if (full_length < sizeof(*msg))
-    return GNUNET_NO;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Opened room: %s\n", GNUNET_h2s (key));
 
-  const uint16_t length = full_length - sizeof(*msg);
-  const char *buffer = ((const char*) msg) + sizeof(*msg);
+  open_handle_room (handle, key);
 
-  struct GNUNET_CRYPTO_PublicKey pubkey;
-  size_t read;
-  if (GNUNET_SYSERR ==
-      GNUNET_CRYPTO_read_public_key_from_buffer(buffer, length,
-                                                  &pubkey, &read))
-    return GNUNET_NO;
+  struct GNUNET_MESSENGER_Room *room = get_handle_room (handle, key);
 
-  return GNUNET_OK;
+  if (room)
+    dequeue_messages_from_room (room);
 }
 
+
 static void
-handle_get_key (void *cls,
-                const struct GNUNET_MESSENGER_KeyMessage *msg)
+handle_room_entry (void *cls,
+                   const struct GNUNET_MESSENGER_RoomMessage *msg)
 {
   struct GNUNET_MESSENGER_Handle *handle = cls;
 
-  const uint16_t length = ntohs (msg->header.size) - sizeof(*msg);
-  const char *buffer = ((const char*) msg) + sizeof(*msg);
+  const struct GNUNET_PeerIdentity *door = &(msg->door);
+  const struct GNUNET_HashCode *key = &(msg->key);
 
-  struct GNUNET_CRYPTO_PublicKey pubkey;
-  size_t read;
-  if (GNUNET_SYSERR ==
-      GNUNET_CRYPTO_read_public_key_from_buffer(buffer, length,
-                                                  &pubkey, &read))
-    return;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Entered room: %s\n", GNUNET_h2s (key));
 
-  char* str = GNUNET_CRYPTO_public_key_to_string (&pubkey);
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Set key of handle: %s\n", str);
-  GNUNET_free(str);
+  entry_handle_room_at (handle, door, key);
 
-  set_handle_key (handle, &pubkey);
+  struct GNUNET_MESSENGER_Room *room = get_handle_room (handle, key);
 
-  if (handle->identity_callback)
-    handle->identity_callback (handle->identity_cls, handle);
+  if (room)
+    dequeue_messages_from_room (room);
 }
 
+
 static void
-handle_member_id (void *cls,
-                  const struct GNUNET_MESSENGER_MemberMessage *msg)
+handle_room_close (void *cls,
+                   const struct GNUNET_MESSENGER_RoomMessage *msg)
 {
   struct GNUNET_MESSENGER_Handle *handle = cls;
 
   const struct GNUNET_HashCode *key = &(msg->key);
-  const struct GNUNET_ShortHashCode *id = &(msg->id);
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Set id of handle in room: %s\n", 
GNUNET_h2s (key));
-
-  struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get 
(handle->rooms, key);
+  struct GNUNET_MESSENGER_Room *room = get_handle_room (handle, key);
 
   if (room)
-  {
-    if (!room->contact_id)
-      room->contact_id = GNUNET_new(struct GNUNET_ShortHashCode);
-
-    GNUNET_memcpy(room->contact_id, id, sizeof(*id));
-  }
-}
+    dequeue_messages_from_room (room);
 
-static void
-handle_room_open (void *cls,
-                  const struct GNUNET_MESSENGER_RoomMessage *msg)
-{
-  struct GNUNET_MESSENGER_Handle *handle = cls;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Closed room: %s\n", GNUNET_h2s (key));
 
-  const struct GNUNET_HashCode *key = &(msg->key);
+  close_handle_room (handle, key);
+}
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Opened room: %s\n", GNUNET_h2s (key));
 
-  open_handle_room (handle, key);
-}
+static void
+enqueue_message_to_room (struct GNUNET_MESSENGER_Room *room,
+                         struct GNUNET_MESSENGER_Message *message);
 
 static void
-handle_room_entry (void *cls,
-                   const struct GNUNET_MESSENGER_RoomMessage *msg)
+handle_member_id (void *cls,
+                  const struct GNUNET_MESSENGER_MemberMessage *msg)
 {
   struct GNUNET_MESSENGER_Handle *handle = cls;
 
-  const struct GNUNET_PeerIdentity *door = &(msg->door);
   const struct GNUNET_HashCode *key = &(msg->key);
+  const struct GNUNET_ShortHashCode *id = &(msg->id);
+  const uint32_t reset = msg->reset;
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Entered room: %s\n", GNUNET_h2s (key));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Changed member id in room: %s\n",
+              GNUNET_h2s (key));
 
-  entry_handle_room_at (handle, door, key);
-}
+  struct GNUNET_MESSENGER_Room *room = get_handle_room (handle, key);
 
-static void
-handle_room_close (void *cls,
-                   const struct GNUNET_MESSENGER_RoomMessage *msg)
-{
-  struct GNUNET_MESSENGER_Handle *handle = cls;
+  if (! room)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Room is unknown to handle: %s\n",
+                GNUNET_h2s (key));
+    return;
+  }
 
-  const struct GNUNET_HashCode *key = &(msg->key);
+  struct GNUNET_MESSENGER_Message *message;
+  switch (reset)
+  {
+  case GNUNET_YES:
+    set_room_sender_id (room, id);
+    message = create_message_join (get_handle_key (handle));
+    break;
+  case GNUNET_NO:
+    message = create_message_id (id);
+    break;
+  default:
+    break;
+  }
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Closed room: %s\n", GNUNET_h2s (key));
+  if (! message)
+    return;
 
-  close_handle_room (handle, key);
+  enqueue_message_to_room (room, message);
+  destroy_message (message);
 }
 
+
 static int
 check_recv_message (void *cls,
                     const struct GNUNET_MESSENGER_RecvMessage *msg)
@@ -210,23 +192,37 @@ check_recv_message (void *cls,
   const uint16_t full_length = ntohs (msg->header.size);
 
   if (full_length < sizeof(*msg))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Receiving failed: Message invalid!\n");
     return GNUNET_NO;
+  }
 
   const uint16_t length = full_length - sizeof(*msg);
   const char *buffer = ((const char*) msg) + sizeof(*msg);
 
   struct GNUNET_MESSENGER_Message message;
 
-  if (length < get_message_kind_size(GNUNET_MESSENGER_KIND_UNKNOWN, 
GNUNET_YES))
+  if (length < get_message_kind_size (GNUNET_MESSENGER_KIND_UNKNOWN,
+                                      GNUNET_YES))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Receiving failed: Message too short!\n");
     return GNUNET_NO;
+  }
 
   if (GNUNET_YES != decode_message (&message, length, buffer, GNUNET_YES, 
NULL))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Receiving failed: Message decoding failed!\n");
     return GNUNET_NO;
+  }
 
-  cleanup_message(&message);
+  cleanup_message (&message);
   return GNUNET_OK;
 }
 
+
 static void
 handle_recv_message (void *cls,
                      const struct GNUNET_MESSENGER_RecvMessage *msg)
@@ -237,9 +233,10 @@ handle_recv_message (void *cls,
   const struct GNUNET_HashCode *sender = &(msg->sender);
   const struct GNUNET_HashCode *context = &(msg->context);
   const struct GNUNET_HashCode *hash = &(msg->hash);
-  const enum GNUNET_MESSENGER_MessageFlags flags = (
-      (enum GNUNET_MESSENGER_MessageFlags) (msg->flags)
-  );
+
+  enum GNUNET_MESSENGER_MessageFlags flags = (
+    (enum GNUNET_MESSENGER_MessageFlags) (msg->flags)
+    );
 
   const uint16_t length = ntohs (msg->header.size) - sizeof(*msg);
   const char *buffer = ((const char*) msg) + sizeof(*msg);
@@ -247,34 +244,96 @@ handle_recv_message (void *cls,
   struct GNUNET_MESSENGER_Message message;
   decode_message (&message, length, buffer, GNUNET_YES, NULL);
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Receiving message: %s\n", 
GNUNET_MESSENGER_name_of_kind (message.header.kind));
+  struct GNUNET_MESSENGER_Message *private_message = NULL;
+  if (GNUNET_MESSENGER_KIND_PRIVATE == message.header.kind)
+  {
+    private_message = copy_message (&message);
+
+    if (GNUNET_YES != decrypt_message (private_message, get_handle_key (
+                                         handle)))
+    {
+      destroy_message (private_message);
+      private_message = NULL;
+    }
+  }
 
-  struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get 
(handle->rooms, key);
+  if (private_message)
+    flags |= GNUNET_MESSENGER_FLAG_PRIVATE;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Receiving message: %s\n",
+              GNUNET_MESSENGER_name_of_kind (private_message ?
+                                             private_message->header.kind :
+                                             message.header.kind));
+
+  struct GNUNET_MESSENGER_Room *room = get_handle_room (handle, key);
 
   if (room)
   {
-    struct GNUNET_MESSENGER_ContactStore *store = 
get_handle_contact_store(handle);
+    struct GNUNET_MESSENGER_ContactStore *store = get_handle_contact_store (
+      handle);
 
-    GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Raw contact from sender and context: 
(%s : %s)\n",
-               GNUNET_h2s(sender), GNUNET_h2s_full(context));
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Raw contact from sender and context: (%s : %s)\n",
+                GNUNET_h2s (sender), GNUNET_h2s_full (context));
 
-    struct GNUNET_MESSENGER_Contact *contact = get_store_contact_raw(
-        store, context, sender
-    );
+    struct GNUNET_MESSENGER_Contact *contact = get_store_contact_raw (
+      store, context, sender
+      );
 
-    contact = handle_room_message (room, contact, &message, hash);
+    contact = handle_room_message (room, contact, private_message ?
+                                   private_message : &message, hash, flags);
 
-    const struct GNUNET_MESSENGER_Message *stored_message = 
get_room_message(room, hash);
+    const struct GNUNET_MESSENGER_Message *stored_message = get_room_message (
+      room, hash);
 
     if (handle->msg_callback)
-      handle->msg_callback (handle->msg_cls, room, contact, stored_message, 
hash, flags);
+      handle->msg_callback (handle->msg_cls, room, contact, stored_message,
+                            hash, flags);
   }
   else
-    GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Unknown room for this client: %s\n", 
GNUNET_h2s (key));
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Unknown room for this client: %s\n",
+                GNUNET_h2s (key));
+
+  cleanup_message (&message);
+
+  if (private_message)
+    destroy_message (private_message);
+}
+
+
+static void
+handle_miss_message (void *cls,
+                     const struct GNUNET_MESSENGER_GetMessage *msg)
+{
+  struct GNUNET_MESSENGER_Handle *handle = cls;
+
+  const struct GNUNET_HashCode *key = &(msg->key);
+  const struct GNUNET_HashCode *hash = &(msg->hash);
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Missing message in room: %s\n",
+              GNUNET_h2s (hash));
+
+  struct GNUNET_MESSENGER_Room *room = get_handle_room (handle, key);
+
+  if (! room)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Miss in unknown room for this client: %s\n", GNUNET_h2s 
(key));
+    return;
+  }
+
+  if (! get_room_sender_id (room))
+    return;
 
-  cleanup_message(&message);
+  struct GNUNET_MESSENGER_Message *message = create_message_request (hash);
+  if (! message)
+    return;
+
+  enqueue_message_to_room (room, message);
+  destroy_message (message);
 }
 
+
 static void
 reconnect (struct GNUNET_MESSENGER_Handle *handle);
 
@@ -282,28 +341,62 @@ static void
 send_open_room (struct GNUNET_MESSENGER_Handle *handle,
                 struct GNUNET_MESSENGER_Room *room)
 {
+  const struct GNUNET_CRYPTO_PublicKey *key = get_handle_pubkey (handle);
+
   struct GNUNET_MESSENGER_RoomMessage *msg;
   struct GNUNET_MQ_Envelope *env;
 
-  env = GNUNET_MQ_msg(msg, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN);
-  GNUNET_memcpy(&(msg->key), &(room->key), sizeof(msg->key));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Open room (%s) by member using key: %s\n",
+              GNUNET_h2s (&(room->key)),
+              GNUNET_CRYPTO_public_key_to_string (key));
+
+  const ssize_t len = GNUNET_CRYPTO_public_key_get_length (key);
+
+  env = GNUNET_MQ_msg_extra (msg, len > 0 ? len : 0,
+                             GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN);
+  GNUNET_memcpy (&(msg->key), &(room->key), sizeof(msg->key));
+
+  char *msg_buffer = ((char*) msg) + sizeof(*msg);
+
+  if (len > 0)
+    GNUNET_CRYPTO_write_public_key_to_buffer (key, msg_buffer, len);
+
   GNUNET_MQ_send (handle->mq, env);
 }
 
+
 static void
 send_enter_room (struct GNUNET_MESSENGER_Handle *handle,
                  struct GNUNET_MESSENGER_Room *room,
                  const struct GNUNET_PeerIdentity *door)
 {
+  const struct GNUNET_CRYPTO_PublicKey *key = get_handle_pubkey (handle);
+
   struct GNUNET_MESSENGER_RoomMessage *msg;
   struct GNUNET_MQ_Envelope *env;
 
-  env = GNUNET_MQ_msg(msg, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY);
-  GNUNET_memcpy(&(msg->door), door, sizeof(*door));
-  GNUNET_memcpy(&(msg->key), &(room->key), sizeof(msg->key));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Enter room (%s) via door: %s (%s)\n",
+              GNUNET_h2s (&(room->key)),
+              GNUNET_i2s (door),
+              GNUNET_CRYPTO_public_key_to_string (key));
+
+  const ssize_t len = GNUNET_CRYPTO_public_key_get_length (key);
+
+  env = GNUNET_MQ_msg_extra (msg, len > 0 ? len : 0,
+                             GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY);
+  GNUNET_memcpy (&(msg->door), door, sizeof(*door));
+  GNUNET_memcpy (&(msg->key), &(room->key), sizeof(msg->key));
+
+  char *msg_buffer = ((char*) msg) + sizeof(*msg);
+
+  if (len > 0)
+    GNUNET_CRYPTO_write_public_key_to_buffer (key, msg_buffer, len);
+
   GNUNET_MQ_send (handle->mq, env);
 }
 
+
 static void
 send_close_room (struct GNUNET_MESSENGER_Handle *handle,
                  struct GNUNET_MESSENGER_Room *room)
@@ -311,11 +404,15 @@ send_close_room (struct GNUNET_MESSENGER_Handle *handle,
   struct GNUNET_MESSENGER_RoomMessage *msg;
   struct GNUNET_MQ_Envelope *env;
 
-  env = GNUNET_MQ_msg(msg, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE);
-  GNUNET_memcpy(&(msg->key), &(room->key), sizeof(msg->key));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Close room (%s)!\n",
+              GNUNET_h2s (&(room->key)));
+
+  env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE);
+  GNUNET_memcpy (&(msg->key), &(room->key), sizeof(msg->key));
   GNUNET_MQ_send (handle->mq, env);
 }
 
+
 static int
 iterate_reset_room (void *cls,
                     const struct GNUNET_HashCode *key,
@@ -343,20 +440,24 @@ iterate_reset_room (void *cls,
   return GNUNET_YES;
 }
 
+
 static void
 callback_reconnect (void *cls)
 {
   struct GNUNET_MESSENGER_Handle *handle = cls;
 
   handle->reconnect_task = NULL;
-  handle->reconnect_time = GNUNET_TIME_STD_BACKOFF(handle->reconnect_time)
-  ;
+  handle->reconnect_time = GNUNET_TIME_STD_BACKOFF (handle->reconnect_time);
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Reconnect messenger!\n");
 
   reconnect (handle);
 
-  GNUNET_CONTAINER_multihashmap_iterate (handle->rooms, iterate_reset_room, 
handle);
+  GNUNET_CONTAINER_multihashmap_iterate (handle->rooms, iterate_reset_room,
+                                         handle);
 }
 
+
 static int
 iterate_close_room (void *cls,
                     const struct GNUNET_HashCode *key,
@@ -370,15 +471,17 @@ iterate_close_room (void *cls,
   return GNUNET_YES;
 }
 
+
 static void
 callback_mq_error (void *cls,
                    enum GNUNET_MQ_Error error)
 {
   struct GNUNET_MESSENGER_Handle *handle = cls;
 
-  GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "MQ_Error: %u\n", error);
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "MQ_Error: %u\n", error);
 
-  GNUNET_CONTAINER_multihashmap_iterate (handle->rooms, iterate_close_room, 
handle);
+  GNUNET_CONTAINER_multihashmap_iterate (handle->rooms, iterate_close_room,
+                                         handle);
 
   if (handle->mq)
   {
@@ -386,81 +489,78 @@ callback_mq_error (void *cls,
     handle->mq = NULL;
   }
 
-  handle->reconnect_task = GNUNET_SCHEDULER_add_delayed 
(handle->reconnect_time, &callback_reconnect, handle);
+  handle->reconnect_task = GNUNET_SCHEDULER_add_delayed 
(handle->reconnect_time,
+                                                         &callback_reconnect,
+                                                         handle);
 }
 
+
 static void
 reconnect (struct GNUNET_MESSENGER_Handle *handle)
 {
-  const struct GNUNET_MQ_MessageHandler handlers[] =
-  {
-   GNUNET_MQ_hd_var_size(
-        get_name, GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_GET_NAME,
-        struct GNUNET_MESSENGER_NameMessage, handle
-   ),
-   GNUNET_MQ_hd_var_size(
-       get_key, GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_GET_KEY,
-       struct GNUNET_MESSENGER_KeyMessage, handle
-   ),
-   GNUNET_MQ_hd_fixed_size(
-       member_id,
-       GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_MEMBER_ID,
-       struct GNUNET_MESSENGER_MemberMessage, handle
-   ),
-   GNUNET_MQ_hd_fixed_size(
-       room_open,
-       GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN,
-       struct GNUNET_MESSENGER_RoomMessage, handle
-   ),
-   GNUNET_MQ_hd_fixed_size(
-       room_entry,
-       GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY,
-       struct GNUNET_MESSENGER_RoomMessage, handle
-   ),
-   GNUNET_MQ_hd_fixed_size(
-       room_close,
-       GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE,
-       struct GNUNET_MESSENGER_RoomMessage, handle
-   ),
-   GNUNET_MQ_hd_var_size(
-       recv_message,
-       GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_RECV_MESSAGE,
-       struct GNUNET_MESSENGER_RecvMessage, handle
-   ),
-   GNUNET_MQ_handler_end()
+  const struct GNUNET_MQ_MessageHandler handlers[] = {
+    GNUNET_MQ_hd_fixed_size (
+      member_id,
+      GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_MEMBER_ID,
+      struct GNUNET_MESSENGER_MemberMessage, handle
+      ),
+    GNUNET_MQ_hd_fixed_size (
+      room_open,
+      GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN,
+      struct GNUNET_MESSENGER_RoomMessage, handle
+      ),
+    GNUNET_MQ_hd_fixed_size (
+      room_entry,
+      GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY,
+      struct GNUNET_MESSENGER_RoomMessage, handle
+      ),
+    GNUNET_MQ_hd_fixed_size (
+      room_close,
+      GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE,
+      struct GNUNET_MESSENGER_RoomMessage, handle
+      ),
+    GNUNET_MQ_hd_var_size (
+      recv_message,
+      GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_RECV_MESSAGE,
+      struct GNUNET_MESSENGER_RecvMessage, handle
+      ),
+    GNUNET_MQ_hd_fixed_size (
+      miss_message,
+      GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_GET_MESSAGE,
+      struct GNUNET_MESSENGER_GetMessage, handle
+      ),
+    GNUNET_MQ_handler_end ()
   };
 
-  handle->mq = GNUNET_CLIENT_connect (handle->cfg, 
GNUNET_MESSENGER_SERVICE_NAME, handlers, &callback_mq_error, handle);
+  handle->mq = GNUNET_CLIENT_connect (handle->cfg,
+                                      GNUNET_MESSENGER_SERVICE_NAME, handlers,
+                                      &callback_mq_error, handle);
 }
 
+
 struct GNUNET_MESSENGER_Handle*
 GNUNET_MESSENGER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
                           const char *name,
-                          GNUNET_MESSENGER_IdentityCallback identity_callback,
-                          void *identity_cls,
+                          const struct GNUNET_CRYPTO_PrivateKey *key,
                           GNUNET_MESSENGER_MessageCallback msg_callback,
                           void *msg_cls)
 {
-  struct GNUNET_MESSENGER_Handle *handle = create_handle (cfg, 
identity_callback, identity_cls, msg_callback, msg_cls);
+  struct GNUNET_MESSENGER_Handle *handle = create_handle (cfg, msg_callback,
+                                                          msg_cls);
 
   reconnect (handle);
 
   if (handle->mq)
   {
-    const uint16_t name_len = name ? strlen (name) : 0;
+    set_handle_name (handle, name);
+
+    if ((! key) || (0 < GNUNET_CRYPTO_private_key_get_length (key)))
+      set_handle_key (handle, key);
 
     struct GNUNET_MESSENGER_CreateMessage *msg;
     struct GNUNET_MQ_Envelope *env;
 
-    env = GNUNET_MQ_msg_extra(msg, name_len + 1, 
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_CREATE);
-
-    char *extra = ((char*) msg) + sizeof(*msg);
-
-    if (name_len)
-      GNUNET_memcpy(extra, name, name_len);
-
-    extra[name_len] = '\0';
-
+    env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_CREATE);
     GNUNET_MQ_send (handle->mq, env);
     return handle;
   }
@@ -471,101 +571,233 @@ GNUNET_MESSENGER_connect (const struct 
GNUNET_CONFIGURATION_Handle *cfg,
   }
 }
 
-int
-GNUNET_MESSENGER_update (struct GNUNET_MESSENGER_Handle *handle)
-{
-  if ((!handle) || (!get_handle_name (handle)))
-    return GNUNET_SYSERR;
-
-  struct GNUNET_MESSENGER_UpdateMessage *msg;
-  struct GNUNET_MQ_Envelope *env;
-
-  env = GNUNET_MQ_msg(msg, GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_UPDATE);
-  GNUNET_MQ_send (handle->mq, env);
-  return GNUNET_OK;
-}
 
 void
 GNUNET_MESSENGER_disconnect (struct GNUNET_MESSENGER_Handle *handle)
 {
-  if (!handle)
+  if (! handle)
     return;
 
   struct GNUNET_MESSENGER_DestroyMessage *msg;
   struct GNUNET_MQ_Envelope *env;
 
-  env = GNUNET_MQ_msg(msg, GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_DESTROY);
+  env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_DESTROY);
   GNUNET_MQ_send (handle->mq, env);
 
   destroy_handle (handle);
 }
 
+
+static void
+send_message_to_room (struct GNUNET_MESSENGER_Room *room,
+                      struct GNUNET_MESSENGER_Message *message,
+                      const struct GNUNET_CRYPTO_PrivateKey *key)
+{
+  const struct GNUNET_ShortHashCode *sender_id = get_room_sender_id (room);
+
+  message->header.timestamp = GNUNET_TIME_absolute_hton (
+    GNUNET_TIME_absolute_get ());
+
+  GNUNET_memcpy (&(message->header.sender_id), sender_id,
+                 sizeof(message->header.sender_id));
+  GNUNET_memcpy (&(message->header.previous), &(room->last_message),
+                 sizeof(message->header.previous));
+
+  message->header.signature.type = key->type;
+
+  const uint16_t msg_length = get_message_size (message, GNUNET_YES);
+
+  struct GNUNET_MESSENGER_SendMessage *msg;
+  struct GNUNET_MQ_Envelope *env;
+
+  env = GNUNET_MQ_msg_extra (
+    msg, msg_length,
+    GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SEND_MESSAGE
+    );
+
+  GNUNET_memcpy (&(msg->key), &(room->key), sizeof(msg->key));
+
+  char *msg_buffer = ((char*) msg) + sizeof(*msg);
+  encode_message (message, msg_length, msg_buffer, GNUNET_YES);
+
+  struct GNUNET_HashCode hash;
+  hash_message (message, msg_length, msg_buffer, &hash);
+  sign_message (message, msg_length, msg_buffer, &hash, key);
+
+  GNUNET_memcpy (&(room->last_message), &hash, sizeof(room->last_message));
+
+  GNUNET_MQ_send (room->handle->mq, env);
+}
+
+
+static void
+enqueue_message_to_room (struct GNUNET_MESSENGER_Room *room,
+                         struct GNUNET_MESSENGER_Message *message)
+{
+  const struct GNUNET_CRYPTO_PrivateKey *key = get_handle_key (room->handle);
+
+  if (GNUNET_YES == is_room_available (room))
+  {
+    send_message_to_room (room, message, key);
+    dequeue_messages_from_room (room);
+  }
+  else
+    enqueue_to_messages (&(room->queue), key, message);
+}
+
+
+static enum GNUNET_GenericReturnValue
+dequeue_messages_from_room (struct GNUNET_MESSENGER_Room *room)
+{
+  struct GNUNET_MESSENGER_Message *message = NULL;
+  struct GNUNET_CRYPTO_PrivateKey key;
+
+  if (GNUNET_YES != is_room_available (room))
+    return room->queue.head ? GNUNET_NO : GNUNET_YES;
+
+  do {
+    if (message)
+      destroy_message (message);
+
+    message = dequeue_from_messages (&(room->queue), &key);
+
+    if (message)
+      send_message_to_room (room, message, &key);
+  } while (message);
+
+  return GNUNET_YES;
+}
+
+
 const char*
 GNUNET_MESSENGER_get_name (const struct GNUNET_MESSENGER_Handle *handle)
 {
-  if (!handle)
+  if (! handle)
     return NULL;
 
   return get_handle_name (handle);
 }
 
-int
-GNUNET_MESSENGER_set_name (struct GNUNET_MESSENGER_Handle *handle,
-                           const char *name)
+
+static int
+iterate_send_name_to_room (void *cls,
+                           struct GNUNET_MESSENGER_Room *room,
+                           const struct GNUNET_MESSENGER_Contact *contact)
 {
-  if (!handle)
-    return GNUNET_SYSERR;
+  const struct GNUNET_MESSENGER_Handle *handle = cls;
 
-  const uint16_t name_len = name ? strlen (name) : 0;
+  if (GNUNET_YES != room->use_handle_name)
+    return GNUNET_YES;
 
-  struct GNUNET_MESSENGER_NameMessage *msg;
-  struct GNUNET_MQ_Envelope *env;
+  const char *name = get_handle_name (handle);
 
-  env = GNUNET_MQ_msg_extra(msg, name_len + 1, 
GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_SET_NAME);
+  if (! name)
+    return GNUNET_YES;
 
-  char *extra = ((char*) msg) + sizeof(*msg);
+  struct GNUNET_MESSENGER_Message *message = create_message_name (name);
 
-  if (name_len)
-    GNUNET_memcpy(extra, name, name_len);
+  if (! message)
+    return GNUNET_NO;
 
-  extra[name_len] = '\0';
+  enqueue_message_to_room (room, message);
+  destroy_message (message);
+  return GNUNET_YES;
+}
 
-  GNUNET_MQ_send (handle->mq, env);
+
+int
+GNUNET_MESSENGER_set_name (struct GNUNET_MESSENGER_Handle *handle,
+                           const char *name)
+{
+  if (! handle)
+    return GNUNET_SYSERR;
+
+  set_handle_name (handle, strlen (name) > 0 ? name : NULL);
+  GNUNET_MESSENGER_find_rooms (handle, NULL, iterate_send_name_to_room, 
handle);
   return GNUNET_YES;
 }
 
+
 static const struct GNUNET_CRYPTO_PublicKey*
-get_non_anonymous_key (const struct GNUNET_CRYPTO_PublicKey* public_key)
+get_non_anonymous_key (const struct GNUNET_CRYPTO_PublicKey *public_key)
 {
-  if (0 == GNUNET_memcmp(public_key, get_anonymous_public_key()))
+  if (0 == GNUNET_memcmp (public_key, get_anonymous_public_key ()))
     return NULL;
 
   return public_key;
 }
 
+
 const struct GNUNET_CRYPTO_PublicKey*
 GNUNET_MESSENGER_get_key (const struct GNUNET_MESSENGER_Handle *handle)
 {
-  if (!handle)
+  if (! handle)
     return NULL;
 
-  return get_non_anonymous_key (get_handle_key (handle));
+  return get_non_anonymous_key (get_handle_pubkey (handle));
 }
 
+
+static int
+iterate_send_key_to_room (void *cls,
+                          struct GNUNET_MESSENGER_Room *room,
+                          const struct GNUNET_MESSENGER_Contact *contact)
+{
+  const struct GNUNET_CRYPTO_PrivateKey *key = cls;
+
+  struct GNUNET_MESSENGER_Message *message = create_message_key (key);
+
+  if (! message)
+    return GNUNET_NO;
+
+  enqueue_message_to_room (room, message);
+  destroy_message (message);
+  return GNUNET_YES;
+}
+
+
+int
+GNUNET_MESSENGER_set_key (struct GNUNET_MESSENGER_Handle *handle,
+                          const struct GNUNET_CRYPTO_PrivateKey *key)
+{
+  if (! handle)
+    return GNUNET_SYSERR;
+
+  if (! key)
+  {
+    GNUNET_MESSENGER_find_rooms (handle, NULL, iterate_send_key_to_room, NULL);
+    set_handle_key (handle, NULL);
+    return GNUNET_YES;
+  }
+
+  if (0 >= GNUNET_CRYPTO_private_key_get_length (key))
+    return GNUNET_SYSERR;
+
+  struct GNUNET_CRYPTO_PrivateKey priv;
+  GNUNET_memcpy (&priv, key, sizeof (priv));
+
+  GNUNET_MESSENGER_find_rooms (handle, NULL, iterate_send_key_to_room, &priv);
+  set_handle_key (handle, &priv);
+  return GNUNET_YES;
+}
+
+
 struct GNUNET_MESSENGER_Room*
 GNUNET_MESSENGER_open_room (struct GNUNET_MESSENGER_Handle *handle,
                             const struct GNUNET_HashCode *key)
 {
-  if ((!handle) || (!key))
+  if ((! handle) || (! key))
     return NULL;
 
-  struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get 
(handle->rooms, key);
+  struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get (
+    handle->rooms, key);
 
-  if (!room)
+  if (! room)
   {
     room = create_room (handle, key);
 
-    if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (handle->rooms, key, 
room,
+    if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (handle->rooms, key,
+                                                        room,
                                                         
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
     {
       destroy_room (room);
@@ -577,21 +809,24 @@ GNUNET_MESSENGER_open_room (struct 
GNUNET_MESSENGER_Handle *handle,
   return room;
 }
 
+
 struct GNUNET_MESSENGER_Room*
 GNUNET_MESSENGER_enter_room (struct GNUNET_MESSENGER_Handle *handle,
                              const struct GNUNET_PeerIdentity *door,
                              const struct GNUNET_HashCode *key)
 {
-  if ((!handle) || (!door) || (!key))
+  if ((! handle) || (! door) || (! key))
     return NULL;
 
-  struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get 
(handle->rooms, key);
+  struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get (
+    handle->rooms, key);
 
-  if (!room)
+  if (! room)
   {
     room = create_room (handle, key);
 
-    if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (handle->rooms, key, 
room,
+    if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (handle->rooms, key,
+                                                        room,
                                                         
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
     {
       destroy_room (room);
@@ -603,15 +838,25 @@ GNUNET_MESSENGER_enter_room (struct 
GNUNET_MESSENGER_Handle *handle,
   return room;
 }
 
+
 void
 GNUNET_MESSENGER_close_room (struct GNUNET_MESSENGER_Room *room)
 {
-  if (!room)
+  if (! room)
     return;
 
+  struct GNUNET_MESSENGER_Message *message = create_message_leave ();
+
+  if (message)
+  {
+    enqueue_message_to_room (room, message);
+    destroy_message (message);
+  }
+
   send_close_room (room->handle, room);
 }
 
+
 struct GNUNET_MESSENGER_RoomFind
 {
   const struct GNUNET_MESSENGER_Contact *contact;
@@ -621,33 +866,37 @@ struct GNUNET_MESSENGER_RoomFind
 };
 
 static int
-iterate_find_room (void* cls,
+iterate_find_room (void *cls,
                    const struct GNUNET_HashCode *key,
                    void *value)
 {
   struct GNUNET_MESSENGER_RoomFind *find = cls;
   struct GNUNET_MESSENGER_Room *room = value;
 
-  if ((find->counter > 0) && ((!find->contact) || (GNUNET_YES == 
find_room_member(room, find->contact))))
+  if ((find->counter > 0) && ((! find->contact) || (GNUNET_YES ==
+                                                    find_room_member (room,
+                                                                      find->
+                                                                      
contact))))
   {
     find->counter--;
 
-    if (!find->callback)
+    if (! find->callback)
       return GNUNET_YES;
 
-    return find->callback(find->cls, room, find->contact);
+    return find->callback (find->cls, room, find->contact);
   }
   else
     return GNUNET_NO;
 }
 
+
 int
 GNUNET_MESSENGER_find_rooms (const struct GNUNET_MESSENGER_Handle *handle,
                              const struct GNUNET_MESSENGER_Contact *contact,
                              GNUNET_MESSENGER_MemberCallback callback,
                              void *cls)
 {
-  if (!handle)
+  if (! handle)
     return GNUNET_SYSERR;
 
   struct GNUNET_MESSENGER_RoomFind find;
@@ -657,145 +906,170 @@ GNUNET_MESSENGER_find_rooms (const struct 
GNUNET_MESSENGER_Handle *handle,
   find.counter = (contact? contact->rc : SIZE_MAX);
   find.cls = cls;
 
-  return GNUNET_CONTAINER_multihashmap_iterate(handle->rooms, 
iterate_find_room, &find);
+  return GNUNET_CONTAINER_multihashmap_iterate (handle->rooms,
+                                                iterate_find_room, &find);
 }
 
+
 const struct GNUNET_HashCode*
 GNUNET_MESSENGER_room_get_key (const struct GNUNET_MESSENGER_Room *room)
 {
-  if (!room)
+  if (! room)
     return NULL;
 
   return &(room->key);
 }
 
+
 const struct GNUNET_MESSENGER_Contact*
 GNUNET_MESSENGER_get_sender (const struct GNUNET_MESSENGER_Room *room,
                              const struct GNUNET_HashCode *hash)
 {
-  if ((!room) || (!hash))
+  if ((! room) || (! hash))
     return NULL;
 
-  return get_room_sender(room, hash);
+  return get_room_sender (room, hash);
 }
 
+
 const char*
-GNUNET_MESSENGER_contact_get_name (const struct GNUNET_MESSENGER_Contact 
*contact)
+GNUNET_MESSENGER_contact_get_name (const struct
+                                   GNUNET_MESSENGER_Contact *contact)
 {
-  if (!contact)
+  if (! contact)
     return NULL;
 
   return get_contact_name (contact);
 }
 
+
 const struct GNUNET_CRYPTO_PublicKey*
-GNUNET_MESSENGER_contact_get_key (const struct GNUNET_MESSENGER_Contact 
*contact)
+GNUNET_MESSENGER_contact_get_key (const struct
+                                  GNUNET_MESSENGER_Contact *contact)
 {
-  if (!contact)
+  if (! contact)
     return NULL;
 
   return get_non_anonymous_key (get_contact_key (contact));
 }
 
+
 void
 GNUNET_MESSENGER_send_message (struct GNUNET_MESSENGER_Room *room,
-                               const struct GNUNET_MESSENGER_Message *message,
+                               struct GNUNET_MESSENGER_Message *message,
                                const struct GNUNET_MESSENGER_Contact *contact)
 {
-  if ((!room) || (!message))
+  if ((! room) || (! message))
     return;
 
   switch (filter_message_sending (message))
   {
   case GNUNET_SYSERR:
-    GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Sending message aborted: This kind of 
message is reserved for the service!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Sending message aborted: This kind of message is reserved for 
the service!\n");
     return;
   case GNUNET_NO:
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Sending message aborted: This kind 
of message could cause issues!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Sending message aborted: This kind of message could cause 
issues!\n");
     return;
   default:
     break;
   }
 
-  ssize_t key_length = 0;
+  char *original_name;
+  char *changed_name = NULL;
 
-  if (contact)
-  {
-    const struct GNUNET_CRYPTO_PublicKey *public_key = get_non_anonymous_key (
-        get_contact_key(contact)
-    );
+  if (GNUNET_MESSENGER_KIND_NAME != message->header.kind)
+    goto skip_naming;
 
-    if (public_key)
-      key_length = GNUNET_CRYPTO_public_key_get_length(public_key);
-    else
-      key_length = -1;
-  }
+  original_name = message->body.name.name;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Apply rule for using handle name in room: %s\n", GNUNET_h2s (
+                &(room->key)));
+
+  const char *handle_name = get_handle_name (room->handle);
 
-  if (key_length < 0)
+  if ((handle_name) && (GNUNET_YES == room->use_handle_name) &&
+      ((! original_name) || (0 == strlen (original_name))))
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Sending message aborted: Invalid 
key!\n");
-    return;
+    changed_name = GNUNET_strdup (handle_name);
+    message->body.name.name = changed_name;
   }
 
-  const uint16_t msg_length = get_message_size (message, GNUNET_NO);
+skip_naming:
+  if (contact)
+  {
+    const struct GNUNET_CRYPTO_PublicKey *public_key = get_non_anonymous_key (
+      get_contact_key (contact)
+      );
 
-  struct GNUNET_MESSENGER_SendMessage *msg;
-  struct GNUNET_MQ_Envelope *env;
+    if (! public_key)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "Sending message aborted: Invalid key!\n");
+      goto reset_naming;
+    }
 
-  const uint16_t length = (uint16_t) key_length + msg_length;
+    struct GNUNET_MESSENGER_Message *original = message;
+    message = copy_message (original);
 
-  env = GNUNET_MQ_msg_extra(
-      msg, length,
-      GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SEND_MESSAGE
-  );
+    if (GNUNET_YES != encrypt_message (message, public_key))
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                  "Sending message aborted: Encryption failed!\n");
 
-  GNUNET_memcpy(&(msg->key), &(room->key), sizeof(msg->key));
+      destroy_message (message);
+      message = original;
 
-  msg->flags = (uint32_t) (
-      contact? GNUNET_MESSENGER_FLAG_PRIVATE : GNUNET_MESSENGER_FLAG_NONE
-  );
+      goto reset_naming;
+    }
+  }
 
-  char *buffer = ((char*) msg) + sizeof(*msg);
-  char *msg_buffer = buffer + key_length;
+  enqueue_message_to_room (room, message);
 
-  if (key_length > 0)
-    GNUNET_CRYPTO_write_public_key_to_buffer(get_contact_key(contact), buffer, 
key_length);
+reset_naming:
+  if (changed_name)
+    GNUNET_free (changed_name);
 
-  encode_message (message, msg_length, msg_buffer, GNUNET_NO);
+  if (GNUNET_MESSENGER_KIND_NAME != message->header.kind)
+    return;
 
-  GNUNET_MQ_send (room->handle->mq, env);
+  message->body.name.name = original_name;
 }
 
+
 const struct GNUNET_MESSENGER_Message*
 GNUNET_MESSENGER_get_message (const struct GNUNET_MESSENGER_Room *room,
                               const struct GNUNET_HashCode *hash)
 {
-  if ((!room) || (!hash))
+  if ((! room) || (! hash))
     return NULL;
 
-  const struct GNUNET_MESSENGER_Message *message = get_room_message (room, 
hash);
+  const struct GNUNET_MESSENGER_Message *message = get_room_message (room,
+                                                                     hash);
 
-  if (!message)
+  if (! message)
   {
     struct GNUNET_MESSENGER_GetMessage *msg;
     struct GNUNET_MQ_Envelope *env;
 
-    env = GNUNET_MQ_msg(msg, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_GET_MESSAGE);
-    GNUNET_memcpy(&(msg->key), &(room->key), sizeof(msg->key));
-    GNUNET_memcpy(&(msg->hash), hash, sizeof(*hash));
+    env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_GET_MESSAGE);
+    GNUNET_memcpy (&(msg->key), &(room->key), sizeof(msg->key));
+    GNUNET_memcpy (&(msg->hash), hash, sizeof(*hash));
     GNUNET_MQ_send (room->handle->mq, env);
   }
 
   return message;
 }
 
+
 int
 GNUNET_MESSENGER_iterate_members (struct GNUNET_MESSENGER_Room *room,
                                   GNUNET_MESSENGER_MemberCallback callback,
                                   void *cls)
 {
-  if (!room)
+  if (! room)
     return GNUNET_SYSERR;
 
-  return iterate_room_members(room, callback, cls);
+  return iterate_room_members (room, callback, cls);
 }
diff --git a/src/service/messenger/messenger_api_contact.c 
b/src/service/messenger/messenger_api_contact.c
index a11190c2c..848a27b8f 100644
--- a/src/service/messenger/messenger_api_contact.c
+++ b/src/service/messenger/messenger_api_contact.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -29,69 +29,76 @@
 struct GNUNET_MESSENGER_Contact*
 create_contact (const struct GNUNET_CRYPTO_PublicKey *key)
 {
-  GNUNET_assert(key);
+  GNUNET_assert (key);
 
-  struct GNUNET_MESSENGER_Contact *contact = GNUNET_new(struct 
GNUNET_MESSENGER_Contact);
+  struct GNUNET_MESSENGER_Contact *contact = GNUNET_new (struct
+                                                         
GNUNET_MESSENGER_Contact);
 
   contact->name = NULL;
   contact->rc = 0;
 
-  GNUNET_memcpy(&(contact->public_key), key, sizeof(contact->public_key));
+  GNUNET_memcpy (&(contact->public_key), key, sizeof(contact->public_key));
 
   return contact;
 }
 
+
 void
 destroy_contact (struct GNUNET_MESSENGER_Contact *contact)
 {
-  GNUNET_assert(contact);
+  GNUNET_assert (contact);
 
   if (contact->name)
-    GNUNET_free(contact->name);
+    GNUNET_free (contact->name);
 
-  GNUNET_free(contact);
+  GNUNET_free (contact);
 }
 
+
 const char*
 get_contact_name (const struct GNUNET_MESSENGER_Contact *contact)
 {
-  GNUNET_assert(contact);
+  GNUNET_assert (contact);
 
   return contact->name;
 }
 
+
 void
 set_contact_name (struct GNUNET_MESSENGER_Contact *contact,
                   const char *name)
 {
-  GNUNET_assert(contact);
+  GNUNET_assert (contact);
 
   if (contact->name)
-    GNUNET_free(contact->name);
+    GNUNET_free (contact->name);
 
-  contact->name = name ? GNUNET_strdup(name) : NULL;
+  contact->name = name ? GNUNET_strdup (name) : NULL;
 }
 
+
 const struct GNUNET_CRYPTO_PublicKey*
 get_contact_key (const struct GNUNET_MESSENGER_Contact *contact)
 {
-  GNUNET_assert(contact);
+  GNUNET_assert (contact);
 
   return &(contact->public_key);
 }
 
+
 void
 increase_contact_rc (struct GNUNET_MESSENGER_Contact *contact)
 {
-  GNUNET_assert(contact);
+  GNUNET_assert (contact);
 
   contact->rc++;
 }
 
+
 int
 decrease_contact_rc (struct GNUNET_MESSENGER_Contact *contact)
 {
-  GNUNET_assert(contact);
+  GNUNET_assert (contact);
 
   if (contact->rc > 0)
     contact->rc--;
@@ -99,12 +106,13 @@ decrease_contact_rc (struct GNUNET_MESSENGER_Contact 
*contact)
   return contact->rc ? GNUNET_NO : GNUNET_YES;
 }
 
+
 void
 get_context_from_member (const struct GNUNET_HashCode *key,
                          const struct GNUNET_ShortHashCode *id,
                          struct GNUNET_HashCode *context)
 {
-  GNUNET_assert((key) && (id) && (context));
+  GNUNET_assert ((key) && (id) && (context));
 
   GNUNET_CRYPTO_hash (id, sizeof(*id), context);
   GNUNET_CRYPTO_hash_xor (key, context, context);
diff --git a/src/service/messenger/messenger_api_contact_store.c 
b/src/service/messenger/messenger_api_contact_store.c
index b0e0d026b..8bcfb24ff 100644
--- a/src/service/messenger/messenger_api_contact_store.c
+++ b/src/service/messenger/messenger_api_contact_store.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -38,6 +38,7 @@ init_contact_store (struct GNUNET_MESSENGER_ContactStore 
*store)
   store->contacts = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
 }
 
+
 static int
 iterate_destroy_contacts (void *cls,
                           const struct GNUNET_HashCode *key,
@@ -48,37 +49,43 @@ iterate_destroy_contacts (void *cls,
   return GNUNET_YES;
 }
 
+
 void
 clear_contact_store (struct GNUNET_MESSENGER_ContactStore *store)
 {
   GNUNET_assert ((store) && (store->contacts));
 
-  GNUNET_CONTAINER_multihashmap_iterate (store->anonymous, 
iterate_destroy_contacts, NULL);
-  GNUNET_CONTAINER_multihashmap_iterate (store->contacts, 
iterate_destroy_contacts, NULL);
+  GNUNET_CONTAINER_multihashmap_iterate (store->anonymous,
+                                         iterate_destroy_contacts, NULL);
+  GNUNET_CONTAINER_multihashmap_iterate (store->contacts,
+                                         iterate_destroy_contacts, NULL);
 
   GNUNET_CONTAINER_multihashmap_destroy (store->anonymous);
   GNUNET_CONTAINER_multihashmap_destroy (store->contacts);
 }
 
+
 static struct GNUNET_CONTAINER_MultiHashMap*
 select_store_contact_map (struct GNUNET_MESSENGER_ContactStore *store,
                           const struct GNUNET_HashCode *context,
                           struct GNUNET_HashCode *hash)
 {
-  const struct GNUNET_CRYPTO_PublicKey *anonymous = get_anonymous_public_key 
();
+  const struct GNUNET_CRYPTO_PublicKey *anonymous =
+    get_anonymous_public_key ();
 
   struct GNUNET_HashCode anonHash;
   GNUNET_CRYPTO_hash (anonymous, sizeof(*anonymous), &anonHash);
 
-  if ((context) && (0 == GNUNET_CRYPTO_hash_cmp(hash, &anonHash)))
+  if ((context) && (0 == GNUNET_CRYPTO_hash_cmp (hash, &anonHash)))
   {
-    GNUNET_memcpy(hash, context, sizeof(*context));
+    GNUNET_memcpy (hash, context, sizeof(*context));
     return store->anonymous;
   }
   else
     return store->contacts;
 }
 
+
 struct GNUNET_MESSENGER_Contact*
 get_store_contact_raw (struct GNUNET_MESSENGER_ContactStore *store,
                        const struct GNUNET_HashCode *context,
@@ -87,15 +94,16 @@ get_store_contact_raw (struct GNUNET_MESSENGER_ContactStore 
*store,
   GNUNET_assert ((store) && (store->contacts) && (context) && (key_hash));
 
   struct GNUNET_HashCode hash;
-  GNUNET_memcpy(&hash, key_hash, sizeof(*key_hash));
+  GNUNET_memcpy (&hash, key_hash, sizeof(*key_hash));
 
   struct GNUNET_CONTAINER_MultiHashMap *map = select_store_contact_map (
-      store, context, &hash
-  );
+    store, context, &hash
+    );
 
   return GNUNET_CONTAINER_multihashmap_get (map, &hash);
 }
 
+
 struct GNUNET_MESSENGER_Contact*
 get_store_contact (struct GNUNET_MESSENGER_ContactStore *store,
                    const struct GNUNET_HashCode *context,
@@ -107,17 +115,20 @@ get_store_contact (struct GNUNET_MESSENGER_ContactStore 
*store,
   GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &hash);
 
   struct GNUNET_CONTAINER_MultiHashMap *map = select_store_contact_map (
-      store, context, &hash
-  );
+    store, context, &hash
+    );
 
-  struct GNUNET_MESSENGER_Contact *contact = GNUNET_CONTAINER_multihashmap_get 
(map, &hash);
+  struct GNUNET_MESSENGER_Contact *contact = GNUNET_CONTAINER_multihashmap_get 
(
+    map, &hash);
 
   if (contact)
   {
-    if (0 != GNUNET_memcmp(pubkey, get_contact_key(contact)))
+    if (0 != GNUNET_memcmp (pubkey, get_contact_key (contact)))
     {
-      char* str = GNUNET_CRYPTO_public_key_to_string 
(get_contact_key(contact));
-      GNUNET_log (GNUNET_ERROR_TYPE_INVALID, "Contact in store uses wrong key: 
%s\n", str);
+      char *str = GNUNET_CRYPTO_public_key_to_string (get_contact_key (
+                                                          contact));
+      GNUNET_log (GNUNET_ERROR_TYPE_INVALID,
+                  "Contact in store uses wrong key: %s\n", str);
       GNUNET_free (str);
       return NULL;
     }
@@ -135,60 +146,62 @@ get_store_contact (struct GNUNET_MESSENGER_ContactStore 
*store,
   return NULL;
 }
 
+
 void
 update_store_contact (struct GNUNET_MESSENGER_ContactStore *store,
-                      struct GNUNET_MESSENGER_Contact* contact,
+                      struct GNUNET_MESSENGER_Contact *contact,
                       const struct GNUNET_HashCode *context,
                       const struct GNUNET_HashCode *next_context,
                       const struct GNUNET_CRYPTO_PublicKey *pubkey)
 {
   GNUNET_assert ((store) && (store->contacts) && (contact) && (pubkey));
 
-  const struct GNUNET_CRYPTO_PublicKey* oldkey = get_contact_key (contact);
+  const struct GNUNET_CRYPTO_PublicKey *oldkey = get_contact_key (contact);
 
   struct GNUNET_HashCode hash;
   GNUNET_CRYPTO_hash (oldkey, sizeof(*oldkey), &hash);
 
   struct GNUNET_CONTAINER_MultiHashMap *map = select_store_contact_map (
-      store, context, &hash
-  );
+    store, context, &hash
+    );
 
   if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (map, &hash, contact))
   {
-    GNUNET_memcpy(&(contact->public_key), pubkey, sizeof(*pubkey));
+    GNUNET_memcpy (&(contact->public_key), pubkey, sizeof(*pubkey));
 
     GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &hash);
 
     map = select_store_contact_map (
-        store, next_context, &hash
-    );
+      store, next_context, &hash
+      );
 
     if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (map, &hash, contact,
                                                         
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
-      GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Updating a contact failed: %s\n",
-                 GNUNET_h2s(&hash));
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Updating a contact failed: %s\n",
+                  GNUNET_h2s (&hash));
   }
 }
 
+
 void
 remove_store_contact (struct GNUNET_MESSENGER_ContactStore *store,
-                      struct GNUNET_MESSENGER_Contact* contact,
+                      struct GNUNET_MESSENGER_Contact *contact,
                       const struct GNUNET_HashCode *context)
 {
   GNUNET_assert ((store) && (store->contacts) && (contact));
 
-  const struct GNUNET_CRYPTO_PublicKey* pubkey = get_contact_key(contact);
+  const struct GNUNET_CRYPTO_PublicKey *pubkey = get_contact_key (contact);
 
   struct GNUNET_HashCode hash;
   GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &hash);
 
   struct GNUNET_CONTAINER_MultiHashMap *map = select_store_contact_map (
-      store, context, &hash
-  );
+    store, context, &hash
+    );
 
   if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (map, &hash, contact))
-    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Removing a contact failed: %s\n",
-               GNUNET_h2s(&hash));
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Removing a contact failed: %s\n",
+                GNUNET_h2s (&hash));
 
   destroy_contact (contact);
 }
diff --git a/src/service/messenger/messenger_api_contact_store.h 
b/src/service/messenger/messenger_api_contact_store.h
index e012e42c1..03912e985 100644
--- a/src/service/messenger/messenger_api_contact_store.h
+++ b/src/service/messenger/messenger_api_contact_store.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -105,7 +105,7 @@ get_store_contact (struct GNUNET_MESSENGER_ContactStore 
*store,
  */
 void
 update_store_contact (struct GNUNET_MESSENGER_ContactStore *store,
-                      struct GNUNET_MESSENGER_Contact* contact,
+                      struct GNUNET_MESSENGER_Contact *contact,
                       const struct GNUNET_HashCode *context,
                       const struct GNUNET_HashCode *next_context,
                       const struct GNUNET_CRYPTO_PublicKey *pubkey);
@@ -120,7 +120,7 @@ update_store_contact (struct GNUNET_MESSENGER_ContactStore 
*store,
  */
 void
 remove_store_contact (struct GNUNET_MESSENGER_ContactStore *store,
-                      struct GNUNET_MESSENGER_Contact* contact,
+                      struct GNUNET_MESSENGER_Contact *contact,
                       const struct GNUNET_HashCode *context);
 
 #endif //GNUNET_MESSENGER_API_CONTACT_STORE_H
diff --git a/src/service/messenger/messenger_api_handle.c 
b/src/service/messenger/messenger_api_handle.c
index fddf73ad5..816153e42 100644
--- a/src/service/messenger/messenger_api_handle.c
+++ b/src/service/messenger/messenger_api_handle.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -26,29 +26,27 @@
 #include "platform.h"
 #include "messenger_api_handle.h"
 
+#include "messenger_api_room.h"
 #include "messenger_api_util.h"
 
 struct GNUNET_MESSENGER_Handle*
 create_handle (const struct GNUNET_CONFIGURATION_Handle *cfg,
-               GNUNET_MESSENGER_IdentityCallback identity_callback,
-               void *identity_cls,
                GNUNET_MESSENGER_MessageCallback msg_callback,
                void *msg_cls)
 {
-  GNUNET_assert(cfg);
+  GNUNET_assert (cfg);
 
-  struct GNUNET_MESSENGER_Handle *handle = GNUNET_new(struct 
GNUNET_MESSENGER_Handle);
+  struct GNUNET_MESSENGER_Handle *handle = GNUNET_new (struct
+                                                       
GNUNET_MESSENGER_Handle);
 
   handle->cfg = cfg;
   handle->mq = NULL;
 
-  handle->identity_callback = identity_callback;
-  handle->identity_cls = identity_cls;
-
   handle->msg_callback = msg_callback;
   handle->msg_cls = msg_cls;
 
   handle->name = NULL;
+  handle->key = NULL;
   handle->pubkey = NULL;
 
   handle->reconnect_time = GNUNET_TIME_relative_get_zero_ ();
@@ -56,11 +54,12 @@ create_handle (const struct GNUNET_CONFIGURATION_Handle 
*cfg,
 
   handle->rooms = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
 
-  init_contact_store(get_handle_contact_store(handle));
+  init_contact_store (get_handle_contact_store (handle));
 
   return handle;
 }
 
+
 static int
 iterate_destroy_room (void *cls,
                       const struct GNUNET_HashCode *key,
@@ -73,10 +72,11 @@ iterate_destroy_room (void *cls,
   return GNUNET_YES;
 }
 
+
 void
 destroy_handle (struct GNUNET_MESSENGER_Handle *handle)
 {
-  GNUNET_assert(handle);
+  GNUNET_assert (handle);
 
   if (handle->reconnect_task)
     GNUNET_SCHEDULER_cancel (handle->reconnect_task);
@@ -85,59 +85,96 @@ destroy_handle (struct GNUNET_MESSENGER_Handle *handle)
     GNUNET_MQ_destroy (handle->mq);
 
   if (handle->name)
-    GNUNET_free(handle->name);
+    GNUNET_free (handle->name);
+
+  if (handle->key)
+    GNUNET_free (handle->key);
 
   if (handle->pubkey)
-    GNUNET_free(handle->pubkey);
+    GNUNET_free (handle->pubkey);
 
   if (handle->rooms)
   {
-    GNUNET_CONTAINER_multihashmap_iterate (handle->rooms, 
iterate_destroy_room, NULL);
+    GNUNET_CONTAINER_multihashmap_iterate (handle->rooms, iterate_destroy_room,
+                                           NULL);
 
     GNUNET_CONTAINER_multihashmap_destroy (handle->rooms);
   }
 
-  clear_contact_store(get_handle_contact_store(handle));
+  clear_contact_store (get_handle_contact_store (handle));
 
-  GNUNET_free(handle);
+  GNUNET_free (handle);
 }
 
+
 void
 set_handle_name (struct GNUNET_MESSENGER_Handle *handle,
                  const char *name)
 {
-  GNUNET_assert(handle);
+  GNUNET_assert (handle);
 
   if (handle->name)
-    GNUNET_free(handle->name);
+    GNUNET_free (handle->name);
 
-  handle->name = name ? GNUNET_strdup(name) : NULL;
+  handle->name = name ? GNUNET_strdup (name) : NULL;
 }
 
+
 const char*
 get_handle_name (const struct GNUNET_MESSENGER_Handle *handle)
 {
-  GNUNET_assert(handle);
+  GNUNET_assert (handle);
 
   return handle->name;
 }
 
+
 void
 set_handle_key (struct GNUNET_MESSENGER_Handle *handle,
-                const struct GNUNET_CRYPTO_PublicKey *pubkey)
+                const struct GNUNET_CRYPTO_PrivateKey *key)
 {
-  GNUNET_assert(handle);
+  GNUNET_assert (handle);
+
+  if (! key)
+  {
+    if (handle->key)
+      GNUNET_free (handle->key);
 
-  if (!handle->pubkey)
-    handle->pubkey = GNUNET_new(struct GNUNET_CRYPTO_PublicKey);
+    if (handle->pubkey)
+      GNUNET_free (handle->pubkey);
 
-  GNUNET_memcpy(handle->pubkey, pubkey, sizeof(*pubkey));
+    handle->key = NULL;
+    handle->pubkey = NULL;
+    return;
+  }
+
+  if (! handle->key)
+    handle->key = GNUNET_new (struct GNUNET_CRYPTO_PrivateKey);
+
+  if (! handle->pubkey)
+    handle->pubkey = GNUNET_new (struct GNUNET_CRYPTO_PublicKey);
+
+  GNUNET_memcpy (handle->key, key, sizeof(*key));
+  GNUNET_CRYPTO_key_get_public (key, handle->pubkey);
 }
 
-const struct GNUNET_CRYPTO_PublicKey*
+
+const struct GNUNET_CRYPTO_PrivateKey*
 get_handle_key (const struct GNUNET_MESSENGER_Handle *handle)
 {
-  GNUNET_assert(handle);
+  GNUNET_assert (handle);
+
+  if (handle->key)
+    return handle->key;
+
+  return get_anonymous_private_key ();
+}
+
+
+const struct GNUNET_CRYPTO_PublicKey*
+get_handle_pubkey (const struct GNUNET_MESSENGER_Handle *handle)
+{
+  GNUNET_assert (handle);
 
   if (handle->pubkey)
     return handle->pubkey;
@@ -145,64 +182,90 @@ get_handle_key (const struct GNUNET_MESSENGER_Handle 
*handle)
   return get_anonymous_public_key ();
 }
 
+
 struct GNUNET_MESSENGER_ContactStore*
 get_handle_contact_store (struct GNUNET_MESSENGER_Handle *handle)
 {
-  GNUNET_assert(handle);
+  GNUNET_assert (handle);
 
   return &(handle->contact_store);
 }
 
+
 struct GNUNET_MESSENGER_Contact*
 get_handle_contact (struct GNUNET_MESSENGER_Handle *handle,
                     const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((handle) && (key));
+  GNUNET_assert ((handle) && (key));
+
+  struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get (
+    handle->rooms, key);
+
+  if (! room)
+    return NULL;
 
-  struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get 
(handle->rooms, key);
+  const struct GNUNET_ShortHashCode *contact_id = get_room_sender_id (room);
 
-  if ((!room) || (!(room->contact_id)))
+  if (! contact_id)
     return NULL;
 
   struct GNUNET_HashCode context;
-  get_context_from_member (key, room->contact_id, &context);
+  get_context_from_member (key, contact_id, &context);
 
-  return get_store_contact(get_handle_contact_store(handle), &context, 
get_handle_key(handle));
+  return get_store_contact (get_handle_contact_store (handle), &context,
+                            get_handle_pubkey (handle));
 }
 
+
 void
 open_handle_room (struct GNUNET_MESSENGER_Handle *handle,
                   const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((handle) && (key));
+  GNUNET_assert ((handle) && (key));
 
-  struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get 
(handle->rooms, key);
+  struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get (
+    handle->rooms, key);
 
   if (room)
     room->opened = GNUNET_YES;
 }
 
+
 void
 entry_handle_room_at (struct GNUNET_MESSENGER_Handle *handle,
                       const struct GNUNET_PeerIdentity *door,
                       const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((handle) && (door) && (key));
+  GNUNET_assert ((handle) && (door) && (key));
 
-  struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get 
(handle->rooms, key);
+  struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get (
+    handle->rooms, key);
 
   if (room)
-    add_to_list_tunnels (&(room->entries), door);
+    add_to_list_tunnels (&(room->entries), door, NULL);
 }
 
+
 void
 close_handle_room (struct GNUNET_MESSENGER_Handle *handle,
                    const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((handle) && (key));
+  GNUNET_assert ((handle) && (key));
 
-  struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get 
(handle->rooms, key);
+  struct GNUNET_MESSENGER_Room *room = GNUNET_CONTAINER_multihashmap_get (
+    handle->rooms, key);
 
-  if ((room) && (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove 
(handle->rooms, key, room)))
+  if ((room) && (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (
+                   handle->rooms, key, room)))
     destroy_room (room);
 }
+
+
+struct GNUNET_MESSENGER_Room*
+get_handle_room (struct GNUNET_MESSENGER_Handle *handle,
+                 const struct GNUNET_HashCode *key)
+{
+  GNUNET_assert ((handle) && (key));
+
+  return GNUNET_CONTAINER_multihashmap_get (handle->rooms, key);
+}
diff --git a/src/service/messenger/messenger_api_handle.h 
b/src/service/messenger/messenger_api_handle.h
index 09f44be8a..fb4e4c580 100644
--- a/src/service/messenger/messenger_api_handle.h
+++ b/src/service/messenger/messenger_api_handle.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -34,7 +34,6 @@
 #include "gnunet_messenger_service.h"
 
 #include "messenger_api_contact_store.h"
-#include "messenger_api_room.h"
 
 struct GNUNET_MESSENGER_Handle
 {
@@ -42,13 +41,11 @@ struct GNUNET_MESSENGER_Handle
 
   struct GNUNET_MQ_Handle *mq;
 
-  GNUNET_MESSENGER_IdentityCallback identity_callback;
-  void *identity_cls;
-
   GNUNET_MESSENGER_MessageCallback msg_callback;
   void *msg_cls;
 
   char *name;
+  struct GNUNET_CRYPTO_PrivateKey *key;
   struct GNUNET_CRYPTO_PublicKey *pubkey;
 
   struct GNUNET_TIME_Relative reconnect_time;
@@ -70,8 +67,6 @@ struct GNUNET_MESSENGER_Handle
  */
 struct GNUNET_MESSENGER_Handle*
 create_handle (const struct GNUNET_CONFIGURATION_Handle *cfg,
-               GNUNET_MESSENGER_IdentityCallback identity_callback,
-               void *identity_cls,
                GNUNET_MESSENGER_MessageCallback msg_callback,
                void *msg_cls);
 
@@ -103,14 +98,23 @@ const char*
 get_handle_name (const struct GNUNET_MESSENGER_Handle *handle);
 
 /**
- * Sets the public key of a given <i>handle</i> to a specific public key.
+ * Sets the keypair of a given <i>handle</i> to the keypair of a specific 
private <i>key</i>.
  *
  * @param[in,out] handle Handle
- * @param[in] pubkey Public key
+ * @param[in] key Private key or NULL
  */
 void
 set_handle_key (struct GNUNET_MESSENGER_Handle *handle,
-                const struct GNUNET_CRYPTO_PublicKey *pubkey);
+                const struct GNUNET_CRYPTO_PrivateKey *key);
+
+/**
+ * Returns the private key of a given <i>handle</i>.
+ *
+ * @param[in] handle Handle
+ * @return Private key of the handle
+ */
+const struct GNUNET_CRYPTO_PrivateKey*
+get_handle_key (const struct GNUNET_MESSENGER_Handle *handle);
 
 /**
  * Returns the public key of a given <i>handle</i>.
@@ -119,7 +123,7 @@ set_handle_key (struct GNUNET_MESSENGER_Handle *handle,
  * @return Public key of the handle
  */
 const struct GNUNET_CRYPTO_PublicKey*
-get_handle_key (const struct GNUNET_MESSENGER_Handle *handle);
+get_handle_pubkey (const struct GNUNET_MESSENGER_Handle *handle);
 
 /**
  * Returns the used contact store of a given <i>handle</i>.
@@ -175,4 +179,15 @@ void
 close_handle_room (struct GNUNET_MESSENGER_Handle *handle,
                    const struct GNUNET_HashCode *key);
 
+/**
+ * Returns the room known to a <i>handle</i> identified by a given <i>key</i>.
+ *
+ * @param[in,out] handle handle Handle
+ * @param[in] key Key of room
+ * @return Room or NULL
+ */
+struct GNUNET_MESSENGER_Room*
+get_handle_room (struct GNUNET_MESSENGER_Handle *handle,
+                 const struct GNUNET_HashCode *key);
+
 #endif //GNUNET_MESSENGER_API_HANDLE_H
diff --git a/src/service/messenger/messenger_api_list_tunnels.c 
b/src/service/messenger/messenger_api_list_tunnels.c
index a4126c286..b2513370c 100644
--- a/src/service/messenger/messenger_api_list_tunnels.c
+++ b/src/service/messenger/messenger_api_list_tunnels.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -29,30 +29,27 @@
 void
 init_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels)
 {
-  GNUNET_assert(tunnels);
+  GNUNET_assert (tunnels);
 
   tunnels->head = NULL;
   tunnels->tail = NULL;
 }
 
+
 void
 clear_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels)
 {
-  GNUNET_assert(tunnels);
+  GNUNET_assert (tunnels);
 
   struct GNUNET_MESSENGER_ListTunnel *element;
+  for (element = tunnels->head; element; element = remove_from_list_tunnels (
+         tunnels, element))
 
-  for (element = tunnels->head; element; element = tunnels->head)
-  {
-    GNUNET_CONTAINER_DLL_remove(tunnels->head, tunnels->tail, element);
-    GNUNET_PEER_change_rc (element->peer, -1);
-    GNUNET_free(element);
-  }
-
-  tunnels->head = NULL;
+    tunnels->head = NULL;
   tunnels->tail = NULL;
 }
 
+
 static int
 compare_list_tunnels (void *cls,
                       struct GNUNET_MESSENGER_ListTunnel *element0,
@@ -61,26 +58,33 @@ compare_list_tunnels (void *cls,
   return ((int) element0->peer) - ((int) element1->peer);
 }
 
+
 void
 add_to_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
-                     const struct GNUNET_PeerIdentity *peer)
+                     const struct GNUNET_PeerIdentity *peer,
+                     const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((tunnels) && (peer));
+  GNUNET_assert ((tunnels) && (peer));
 
-  struct GNUNET_MESSENGER_ListTunnel *element = GNUNET_new(struct 
GNUNET_MESSENGER_ListTunnel);
+  struct GNUNET_MESSENGER_ListTunnel *element = GNUNET_new (struct
+                                                            
GNUNET_MESSENGER_ListTunnel);
 
   element->peer = GNUNET_PEER_intern (peer);
+  element->hash = hash ? GNUNET_memdup (hash, sizeof(struct GNUNET_HashCode)) :
+                  NULL;
 
-  GNUNET_CONTAINER_DLL_insert_sorted(struct GNUNET_MESSENGER_ListTunnel, 
compare_list_tunnels, NULL, tunnels->head,
-                                     tunnels->tail, element);
+  GNUNET_CONTAINER_DLL_insert_sorted (struct GNUNET_MESSENGER_ListTunnel,
+                                      compare_list_tunnels, NULL, 
tunnels->head,
+                                      tunnels->tail, element);
 }
 
+
 struct GNUNET_MESSENGER_ListTunnel*
 find_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
                    const struct GNUNET_PeerIdentity *peer,
                    size_t *index)
 {
-  GNUNET_assert((tunnels) && (peer));
+  GNUNET_assert ((tunnels) && (peer));
 
   struct GNUNET_MESSENGER_ListTunnel *element;
   struct GNUNET_PeerIdentity pid;
@@ -92,7 +96,7 @@ find_list_tunnels (struct GNUNET_MESSENGER_ListTunnels 
*tunnels,
   {
     GNUNET_PEER_resolve (element->peer, &pid);
 
-    if (0 == GNUNET_memcmp(&pid, peer))
+    if (0 == GNUNET_memcmp (&pid, peer))
       return element;
 
     if (index)
@@ -102,81 +106,121 @@ find_list_tunnels (struct GNUNET_MESSENGER_ListTunnels 
*tunnels,
   return NULL;
 }
 
+
+void
+update_to_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
+                        const struct GNUNET_PeerIdentity *peer,
+                        const struct GNUNET_HashCode *hash)
+{
+  GNUNET_assert ((tunnels) && (peer));
+
+  struct GNUNET_MESSENGER_ListTunnel *element = find_list_tunnels (tunnels,
+                                                                   peer,
+                                                                   NULL);
+  if (! element)
+    return;
+
+  if (element->hash)
+  {
+    if (hash)
+      GNUNET_memcpy (element->hash, hash, sizeof(struct GNUNET_HashCode));
+    else
+    {
+      GNUNET_free (element->hash);
+      element->hash = NULL;
+    }
+  }
+  else if (hash)
+    element->hash = GNUNET_memdup (hash, sizeof(struct GNUNET_HashCode));
+}
+
+
 int
 contains_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
                        const struct GNUNET_PeerIdentity *peer)
 {
-  GNUNET_assert((tunnels) && (peer));
+  GNUNET_assert ((tunnels) && (peer));
 
-  return find_list_tunnels (tunnels, peer, NULL) != NULL ? GNUNET_YES : 
GNUNET_NO;
+  return find_list_tunnels (tunnels, peer, NULL) != NULL ? GNUNET_YES :
+         GNUNET_NO;
 }
 
+
 struct GNUNET_MESSENGER_ListTunnel*
 remove_from_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
                           struct GNUNET_MESSENGER_ListTunnel *element)
 {
-  GNUNET_assert((tunnels) && (element));
+  GNUNET_assert ((tunnels) && (element));
 
   struct GNUNET_MESSENGER_ListTunnel *next = element->next;
 
-  GNUNET_CONTAINER_DLL_remove(tunnels->head, tunnels->tail, element);
+  if ((tunnels->head) && (tunnels->tail))
+    GNUNET_CONTAINER_DLL_remove (tunnels->head, tunnels->tail, element);
+
+  if (element->hash)
+    GNUNET_free (element->hash);
+
   GNUNET_PEER_change_rc (element->peer, -1);
-  GNUNET_free(element);
+  GNUNET_free (element);
 
   return next;
 }
 
+
 void
 load_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
                    const char *path)
 {
-  GNUNET_assert((tunnels) && (path));
+  GNUNET_assert ((tunnels) && (path));
 
   if (GNUNET_YES != GNUNET_DISK_file_test (path))
     return;
 
-  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ 
| GNUNET_DISK_PERM_USER_WRITE);
+  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
+                                                   | 
GNUNET_DISK_PERM_USER_WRITE);
 
-  struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open(
-      path, GNUNET_DISK_OPEN_READ, permission
-  );
+  struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open (
+    path, GNUNET_DISK_OPEN_READ, permission
+    );
 
-  if (!handle)
+  if (! handle)
     return;
 
-  GNUNET_DISK_file_seek(handle, 0, GNUNET_DISK_SEEK_SET);
+  GNUNET_DISK_file_seek (handle, 0, GNUNET_DISK_SEEK_SET);
 
   struct GNUNET_PeerIdentity peer;
   ssize_t len;
 
   do {
-    len = GNUNET_DISK_file_read(handle, &peer, sizeof(peer));
+    len = GNUNET_DISK_file_read (handle, &peer, sizeof(peer));
 
     if (len != sizeof(peer))
       break;
 
-    add_to_list_tunnels(tunnels, &peer);
+    add_to_list_tunnels (tunnels, &peer, NULL);
   } while (len == sizeof(peer));
 
-  GNUNET_DISK_file_close(handle);
+  GNUNET_DISK_file_close (handle);
 }
 
+
 void
 save_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
                    const char *path)
 {
-  GNUNET_assert((tunnels) && (path));
+  GNUNET_assert ((tunnels) && (path));
 
-  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ 
| GNUNET_DISK_PERM_USER_WRITE);
+  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
+                                                   | 
GNUNET_DISK_PERM_USER_WRITE);
 
-  struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open(
-      path, GNUNET_DISK_OPEN_CREATE | GNUNET_DISK_OPEN_WRITE, permission
-  );
+  struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open (
+    path, GNUNET_DISK_OPEN_CREATE | GNUNET_DISK_OPEN_WRITE, permission
+    );
 
-  if (!handle)
+  if (! handle)
     return;
 
-  GNUNET_DISK_file_seek(handle, 0, GNUNET_DISK_SEEK_SET);
+  GNUNET_DISK_file_seek (handle, 0, GNUNET_DISK_SEEK_SET);
 
   struct GNUNET_MESSENGER_ListTunnel *element;
   struct GNUNET_PeerIdentity pid;
@@ -185,9 +229,9 @@ save_list_tunnels (struct GNUNET_MESSENGER_ListTunnels 
*tunnels,
   {
     GNUNET_PEER_resolve (element->peer, &pid);
 
-    GNUNET_DISK_file_write(handle, &pid, sizeof(pid));
+    GNUNET_DISK_file_write (handle, &pid, sizeof(pid));
   }
 
-  GNUNET_DISK_file_sync(handle);
-  GNUNET_DISK_file_close(handle);
+  GNUNET_DISK_file_sync (handle);
+  GNUNET_DISK_file_close (handle);
 }
diff --git a/src/service/messenger/messenger_api_list_tunnels.h 
b/src/service/messenger/messenger_api_list_tunnels.h
index d2ceeafc2..212f2ae21 100644
--- a/src/service/messenger/messenger_api_list_tunnels.h
+++ b/src/service/messenger/messenger_api_list_tunnels.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -35,6 +35,7 @@ struct GNUNET_MESSENGER_ListTunnel
   struct GNUNET_MESSENGER_ListTunnel *next;
 
   GNUNET_PEER_Id peer;
+  struct GNUNET_HashCode *hash;
 };
 
 struct GNUNET_MESSENGER_ListTunnels
@@ -62,12 +63,16 @@ clear_list_tunnels (struct GNUNET_MESSENGER_ListTunnels 
*tunnels);
 /**
  * Adds a specific <i>peer</i> from a tunnel to the end of the list.
  *
+ * Optionally adds the <i>hash</i> of the peer message from the specific 
<i>peer</i>.
+ *
  * @param[in,out] tunnels List of peer identities
  * @param[in] peer Peer identity of tunnel
+ * @param[in] hash Hash of peer message or NULL
  */
 void
 add_to_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
-                     const struct GNUNET_PeerIdentity *peer);
+                     const struct GNUNET_PeerIdentity *peer,
+                     const struct GNUNET_HashCode *hash);
 
 /**
  * Searches linearly through the list of tunnels peer identities for matching a
@@ -89,6 +94,22 @@ find_list_tunnels (struct GNUNET_MESSENGER_ListTunnels 
*tunnels,
                    const struct GNUNET_PeerIdentity *peer,
                    size_t *index);
 
+/**
+ * Updates a specific <i>peer</i> from a tunnel in the list.
+ *
+ * This function exists to add the <i>hash</i> of a newer peer message
+ * from the specific <i>peer</i> to the list element. It can also remove
+ * the hash when NULL is provided as new <i>hash</i> value.
+ *
+ * @param[in,out] tunnels List of peer identities
+ * @param[in] peer Peer identity of tunnel
+ * @param[in] hash Hash of peer message or NULL
+ */
+void
+update_to_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
+                        const struct GNUNET_PeerIdentity *peer,
+                        const struct GNUNET_HashCode *hash);
+
 /**
  * Tests linearly if the list of tunnels peer identities contains a specific
  * <i>peer</i> identity and returns #GNUNET_YES on success, otherwise 
#GNUNET_NO.
diff --git a/src/service/messenger/messenger_api_message.c 
b/src/service/messenger/messenger_api_message.c
index 1f7e8dbf2..f77d171f6 100644
--- a/src/service/messenger/messenger_api_message.c
+++ b/src/service/messenger/messenger_api_message.c
@@ -233,6 +233,9 @@ get_message_body_kind_size (enum 
GNUNET_MESSENGER_MessageKind kind)
     length += member_size (struct GNUNET_MESSENGER_Message, body.file.hash);
     length += member_size (struct GNUNET_MESSENGER_Message, body.file.name);
     break;
+  case GNUNET_MESSENGER_KIND_PRIVATE:
+    length += member_size (struct GNUNET_MESSENGER_Message, body.privacy.key);
+    break;
   case GNUNET_MESSENGER_KIND_DELETE:
     length += member_size (struct GNUNET_MESSENGER_Message, 
body.deletion.hash);
     length += member_size (struct GNUNET_MESSENGER_Message,
@@ -275,9 +278,6 @@ get_message_body_size (enum GNUNET_MESSENGER_MessageKind 
kind,
 
   switch (kind)
   {
-  case GNUNET_MESSENGER_KIND_INFO:
-    length += GNUNET_CRYPTO_public_key_get_length (&(body->info.host_key));
-    break;
   case GNUNET_MESSENGER_KIND_JOIN:
     length += GNUNET_CRYPTO_public_key_get_length (&(body->join.key));
     break;
@@ -390,34 +390,34 @@ calc_padded_length (uint16_t length)
 #define min(x, y) (x < y? x : y)
 
 #define encode_step_ext(dst, offset, src, size) do { \
-    GNUNET_memcpy (dst + offset, src, size);            \
-    offset += size;                                    \
-} while (0)
-
-#define encode_step(dst, offset, src) do {         \
-    encode_step_ext (dst, offset, src, sizeof(*src)); \
+  GNUNET_memcpy (dst + offset, src, size);           \
+  offset += size;                                    \
 } while (0)
 
-#define encode_step_key(dst, offset, src, length) do {  \
-    ssize_t result = GNUNET_CRYPTO_write_public_key_to_buffer ( \
-      src, dst + offset, length - offset                \
-      );                                                    \
-    if (result < 0)                                       \
-    GNUNET_break (0);                                   \
-    else                                                  \
-    offset += result;                                   \
+#define encode_step(dst, offset, src) do {          \
+  encode_step_ext (dst, offset, src, sizeof(*src)); \
 } while (0)
 
-#define encode_step_signature(dst, offset, src, length) do {  \
-    ssize_t result = GNUNET_CRYPTO_write_signature_to_buffer ( \
-      src, dst + offset, length - offset                      \
-      );                                                          \
-    if (result < 0)                                             \
+#define encode_step_key(dst, offset, src, length) do {        \
+  ssize_t result = GNUNET_CRYPTO_write_public_key_to_buffer ( \
+    src, dst + offset, length - offset                        \
+  );                                                          \
+  if (result < 0)                                             \
     GNUNET_break (0);                                         \
-    else                                                        \
+  else                                                        \
     offset += result;                                         \
 } while (0)
 
+#define encode_step_signature(dst, offset, src, length) do { \
+  ssize_t result = GNUNET_CRYPTO_write_signature_to_buffer ( \
+    src, dst + offset, length - offset                       \
+  );                                                         \
+  if (result < 0)                                            \
+    GNUNET_break (0);                                        \
+  else                                                       \
+    offset += result;                                        \
+} while (0)
+
 static void
 encode_message_body (enum GNUNET_MESSENGER_MessageKind kind,
                      const struct GNUNET_MESSENGER_MessageBody *body,
@@ -431,7 +431,6 @@ encode_message_body (enum GNUNET_MESSENGER_MessageKind kind,
   case GNUNET_MESSENGER_KIND_INFO:
     version = GNUNET_htobe32 (body->info.messenger_version);
 
-    encode_step_key (buffer, offset, &(body->info.host_key), length);
     encode_step (buffer, offset, &version);
     break;
   case GNUNET_MESSENGER_KIND_JOIN:
@@ -479,6 +478,7 @@ encode_message_body (enum GNUNET_MESSENGER_MessageKind kind,
                                                             body->file.uri)));
     break;
   case GNUNET_MESSENGER_KIND_PRIVATE:
+    encode_step (buffer, offset, &(body->privacy.key));
     encode_step_ext (buffer, offset, body->privacy.data, min (length - offset,
                                                               body->privacy.
                                                               length));
@@ -564,30 +564,30 @@ encode_short_message (const struct 
GNUNET_MESSENGER_ShortMessage *message,
 
 
 #define decode_step_ext(src, offset, dst, size) do { \
-    GNUNET_memcpy (dst, src + offset, size);            \
-    offset += size;                                    \
+  GNUNET_memcpy (dst, src + offset, size);           \
+  offset += size;                                    \
 } while (0)
 
-#define decode_step(src, offset, dst) do {         \
-    decode_step_ext (src, offset, dst, sizeof(*dst)); \
+#define decode_step(src, offset, dst) do {          \
+  decode_step_ext (src, offset, dst, sizeof(*dst)); \
 } while (0)
 
 #define decode_step_malloc(src, offset, dst, size, zero) do { \
-    dst = GNUNET_malloc (size + zero);                           \
-    if (zero) dst[size] = 0;                                    \
-    decode_step_ext (src, offset, dst, size);                    \
+  dst = GNUNET_malloc (size + zero);                          \
+  if (zero) dst[size] = 0;                                    \
+    decode_step_ext (src, offset, dst, size);                 \
 } while (0)
 
 #define decode_step_key(src, offset, dst, length) do {   \
-    enum GNUNET_GenericReturnValue result;                 \
-    size_t read;                                           \
-    result = GNUNET_CRYPTO_read_public_key_from_buffer (  \
-      src + offset, length - offset, dst, &read            \
-      );                                                     \
-    if (GNUNET_SYSERR == result)                                        \
-    GNUNET_break (0);                                     \
-    else                                                   \
-    offset += read;                                    \
+  enum GNUNET_GenericReturnValue result;                 \
+  size_t read;                                           \
+  result = GNUNET_CRYPTO_read_public_key_from_buffer (   \
+    src + offset, length - offset, dst, &read            \
+  );                                                     \
+  if (GNUNET_SYSERR == result)                           \
+    GNUNET_break (0);                                    \
+  else                                                   \
+    offset += read;                                      \
 } while (0)
 
 static uint16_t
@@ -615,7 +615,6 @@ decode_message_body (enum GNUNET_MESSENGER_MessageKind 
*kind,
   switch (*kind)
   {
   case GNUNET_MESSENGER_KIND_INFO: {
-      decode_step_key (buffer, offset, &(body->info.host_key), length);
       decode_step (buffer, offset, &version);
 
       body->info.messenger_version = GNUNET_be32toh (version);
@@ -661,6 +660,8 @@ decode_message_body (enum GNUNET_MESSENGER_MessageKind 
*kind,
     decode_step_malloc (buffer, offset, body->file.uri, length - offset, 1);
     break;
   case GNUNET_MESSENGER_KIND_PRIVATE:
+    decode_step (buffer, offset, &(body->privacy.key));
+
     body->privacy.length = (length - offset);
     decode_step_malloc (buffer, offset, body->privacy.data, length - offset, 
0);
     break;
@@ -697,7 +698,7 @@ decode_message (struct GNUNET_MESSENGER_Message *message,
   {
     ssize_t result = GNUNET_CRYPTO_read_signature_from_buffer (
       &(message->header.signature), buffer, length - offset
-      );
+    );
 
     if (result < 0)
       return GNUNET_NO;
@@ -801,9 +802,39 @@ sign_message (struct GNUNET_MESSENGER_Message *message,
               uint16_t length,
               char *buffer,
               const struct GNUNET_HashCode *hash,
-              const struct GNUNET_MESSENGER_Ego *ego)
+              const struct GNUNET_CRYPTO_PrivateKey *key)
+{
+  GNUNET_assert ((message) && (buffer) && (hash) && (key));
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sign message by member: %s\n",
+              GNUNET_h2s (hash));
+
+  struct GNUNET_MESSENGER_MessageSignature signature;
+
+  signature.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CHAT_MESSAGE);
+  signature.purpose.size = htonl (sizeof(signature));
+
+  GNUNET_memcpy (&(signature.hash), hash, sizeof(struct GNUNET_HashCode));
+  GNUNET_CRYPTO_sign (key, &signature, &(message->header.signature));
+
+  message->header.signature.type = key->type;
+
+  uint16_t offset = 0;
+  encode_step_signature (buffer, offset, &(message->header.signature), length);
+}
+
+
+void
+sign_message_by_peer (struct GNUNET_MESSENGER_Message *message,
+                      uint16_t length,
+                      char *buffer,
+                      const struct GNUNET_HashCode *hash,
+                      const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
-  GNUNET_assert ((message) && (buffer) && (hash) && (ego));
+  GNUNET_assert ((message) && (buffer) && (hash) && (cfg));
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sign message by peer: %s\n",
+              GNUNET_h2s (hash));
 
   struct GNUNET_MESSENGER_MessageSignature signature;
 
@@ -811,7 +842,11 @@ sign_message (struct GNUNET_MESSENGER_Message *message,
   signature.purpose.size = htonl (sizeof(signature));
 
   GNUNET_memcpy (&(signature.hash), hash, sizeof(struct GNUNET_HashCode));
-  GNUNET_CRYPTO_sign (&(ego->priv), &signature, &(message->header.signature));
+  GNUNET_CRYPTO_sign_by_peer_identity (cfg, &signature.purpose,
+                                       &(message->header.signature.
+                                         eddsa_signature));
+
+  message->header.signature.type = htonl (GNUNET_PUBLIC_KEY_TYPE_EDDSA);
 
   uint16_t offset = 0;
   encode_step_signature (buffer, offset, &(message->header.signature), length);
@@ -825,7 +860,7 @@ verify_message (const struct GNUNET_MESSENGER_Message 
*message,
 {
   GNUNET_assert ((message) && (hash) && (key));
 
-  if (ntohl (key->type) != ntohl (message->header.signature.type))
+  if (key->type != message->header.signature.type)
     return GNUNET_SYSERR;
 
   struct GNUNET_MESSENGER_MessageSignature signature;
@@ -841,12 +876,39 @@ verify_message (const struct GNUNET_MESSENGER_Message 
*message,
 }
 
 
+int
+verify_message_by_peer (const struct GNUNET_MESSENGER_Message *message,
+                        const struct GNUNET_HashCode *hash,
+                        const struct GNUNET_PeerIdentity *identity)
+{
+  GNUNET_assert ((message) && (hash) && (identity));
+
+  if (ntohl (GNUNET_PUBLIC_KEY_TYPE_EDDSA) != message->header.signature.type)
+    return GNUNET_SYSERR;
+
+  struct GNUNET_MESSENGER_MessageSignature signature;
+
+  signature.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CHAT_MESSAGE);
+  signature.purpose.size = htonl (sizeof(signature));
+
+  GNUNET_memcpy (&(signature.hash), hash, sizeof(struct GNUNET_HashCode));
+
+  return GNUNET_CRYPTO_verify_peer_identity (
+    GNUNET_SIGNATURE_PURPOSE_CHAT_MESSAGE, &signature.purpose,
+    &(message->header.signature.
+      eddsa_signature), identity);
+}
+
+
 int
 encrypt_message (struct GNUNET_MESSENGER_Message *message,
                  const struct GNUNET_CRYPTO_PublicKey *key)
 {
   GNUNET_assert ((message) && (key));
 
+  if (GNUNET_YES == is_service_message (message))
+    return GNUNET_NO;
+
   struct GNUNET_MESSENGER_ShortMessage shortened;
 
   fold_short_message (message, &shortened);
@@ -867,10 +929,10 @@ encrypt_message (struct GNUNET_MESSENGER_Message *message,
   encode_short_message (&shortened, encoded_length, 
message->body.privacy.data);
 
   if (GNUNET_OK != GNUNET_CRYPTO_encrypt (message->body.privacy.data,
-                                            encoded_length,
-                                            key,
-                                            message->body.privacy.data,
-                                            padded_length))
+                                          encoded_length,
+                                          key,
+                                          message->body.privacy.data,
+                                          padded_length))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Encrypting message failed!\n");
 
@@ -904,10 +966,10 @@ decrypt_message (struct GNUNET_MESSENGER_Message *message,
     );
 
   if (GNUNET_OK != GNUNET_CRYPTO_decrypt (message->body.privacy.data,
-                                            padded_length,
-                                            key,
-                                            message->body.privacy.data,
-                                            encoded_length))
+                                          padded_length,
+                                          key,
+                                          message->body.privacy.data,
+                                          encoded_length))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Decrypting message failed!\n");
 
@@ -934,15 +996,13 @@ decrypt_message (struct GNUNET_MESSENGER_Message *message,
 struct GNUNET_MQ_Envelope*
 pack_message (struct GNUNET_MESSENGER_Message *message,
               struct GNUNET_HashCode *hash,
-              const struct GNUNET_MESSENGER_Ego *ego,
-              int mode)
+              const GNUNET_MESSENGER_SignFunction sign,
+              int mode,
+              const void *cls)
 {
   GNUNET_assert (message);
 
-  if (ego)
-    message->header.signature.type = ego->priv.type;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               "Packing message kind=%u and sender: %s\n",
               message->header.kind, GNUNET_sh2s 
(&(message->header.sender_id)));
 
@@ -974,8 +1034,8 @@ pack_message (struct GNUNET_MESSENGER_Message *message,
   {
     hash_message (message, length, buffer, hash);
 
-    if (ego)
-      sign_message (message, length, buffer, hash, ego);
+    if (sign)
+      sign (cls, message, length, buffer, hash);
   }
 
   if (GNUNET_MESSENGER_PACK_MODE_ENVELOPE != mode)
@@ -985,9 +1045,72 @@ pack_message (struct GNUNET_MESSENGER_Message *message,
 }
 
 
+int
+is_peer_message (const struct GNUNET_MESSENGER_Message *message)
+{
+  switch (message->header.kind)
+  {
+  case GNUNET_MESSENGER_KIND_INFO:
+  case GNUNET_MESSENGER_KIND_PEER:
+  case GNUNET_MESSENGER_KIND_MISS:
+  case GNUNET_MESSENGER_KIND_MERGE:
+    return GNUNET_YES;
+  default:
+    return GNUNET_NO;
+  }
+}
+
+
+int
+is_service_message (const struct GNUNET_MESSENGER_Message *message)
+{
+  if (GNUNET_YES == is_peer_message (message))
+    return GNUNET_YES;
+
+  switch (message->header.kind)
+  {
+  case GNUNET_MESSENGER_KIND_INFO:
+    return GNUNET_YES; // Reserved for connection handling only!
+  case GNUNET_MESSENGER_KIND_JOIN:
+    return GNUNET_YES; // Reserved for member handling only!
+  case GNUNET_MESSENGER_KIND_LEAVE:
+    return GNUNET_YES; // Reserved for member handling only!
+  case GNUNET_MESSENGER_KIND_NAME:
+    return GNUNET_YES; // Reserved for member name handling only!
+  case GNUNET_MESSENGER_KIND_KEY:
+    return GNUNET_YES; // Reserved for member key handling only!
+  case GNUNET_MESSENGER_KIND_PEER:
+    return GNUNET_YES; // Reserved for connection handling only!
+  case GNUNET_MESSENGER_KIND_ID:
+    return GNUNET_YES; // Reserved for member id handling only!
+  case GNUNET_MESSENGER_KIND_MISS:
+    return GNUNET_YES; // Reserved for connection handling only!
+  case GNUNET_MESSENGER_KIND_MERGE:
+    return GNUNET_YES; // Reserved for peers only!
+  case GNUNET_MESSENGER_KIND_REQUEST:
+    return GNUNET_YES; // Requests should not apply individually! (inefficieny)
+  case GNUNET_MESSENGER_KIND_INVITE:
+    return GNUNET_NO;
+  case GNUNET_MESSENGER_KIND_TEXT:
+    return GNUNET_NO;
+  case GNUNET_MESSENGER_KIND_FILE:
+    return GNUNET_NO;
+  case GNUNET_MESSENGER_KIND_PRIVATE:
+    return GNUNET_YES; // Prevent duplicate encryption breaking all access!
+  case GNUNET_MESSENGER_KIND_DELETE:
+    return GNUNET_YES; // Deletion should not apply individually! (inefficieny)
+  default:
+    return GNUNET_SYSERR;
+  }
+}
+
+
 int
 filter_message_sending (const struct GNUNET_MESSENGER_Message *message)
 {
+  if (GNUNET_YES == is_peer_message (message))
+    return GNUNET_SYSERR; // Requires signature of peer rather than ego!
+
   switch (message->header.kind)
   {
   case GNUNET_MESSENGER_KIND_INFO:
@@ -999,15 +1122,15 @@ filter_message_sending (const struct 
GNUNET_MESSENGER_Message *message)
   case GNUNET_MESSENGER_KIND_NAME:
     return GNUNET_YES;
   case GNUNET_MESSENGER_KIND_KEY:
-    return GNUNET_NO; // Use #GNUNET_MESSENGER_update(...) instead!
+    return GNUNET_NO; // Use #GNUNET_MESSENGER_set_key_by_ego(...) instead!
   case GNUNET_MESSENGER_KIND_PEER:
-    return GNUNET_NO; // Use #GNUNET_MESSENGER_open_room(...) instead!
+    return GNUNET_SYSERR; // Use #GNUNET_MESSENGER_open_room(...) instead!
   case GNUNET_MESSENGER_KIND_ID:
-    return GNUNET_SYSERR; // Reserved for member id handling only!
+    return GNUNET_NO; // Reserved for member id handling only!
   case GNUNET_MESSENGER_KIND_MISS:
     return GNUNET_SYSERR; // Reserved for connection handling only!
   case GNUNET_MESSENGER_KIND_MERGE:
-    return GNUNET_YES;
+    return GNUNET_SYSERR; // Reserved for peers only!
   case GNUNET_MESSENGER_KIND_REQUEST:
     return GNUNET_YES;
   case GNUNET_MESSENGER_KIND_INVITE:
diff --git a/src/service/messenger/messenger_api_message.h 
b/src/service/messenger/messenger_api_message.h
index 0c2d4acf2..ca507f8c9 100644
--- a/src/service/messenger/messenger_api_message.h
+++ b/src/service/messenger/messenger_api_message.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -33,9 +33,8 @@
 
 #include "gnunet_messenger_service.h"
 
-#include "messenger_api_ego.h"
-
-#define GNUNET_MESSENGER_MAX_MESSAGE_SIZE (GNUNET_MAX_MESSAGE_SIZE - 
GNUNET_MIN_MESSAGE_SIZE)
+#define GNUNET_MESSENGER_MAX_MESSAGE_SIZE (GNUNET_MAX_MESSAGE_SIZE \
+                                           - GNUNET_MIN_MESSAGE_SIZE)
 
 #define GNUNET_MESSENGER_PADDING_MIN (sizeof(uint16_t) + sizeof(char))
 #define GNUNET_MESSENGER_PADDING_LEVEL0 (512)
@@ -166,14 +165,31 @@ hash_message (const struct GNUNET_MESSENGER_Message 
*message,
  * @param[in] length Length of buffer
  * @param[out] buffer Buffer
  * @param[in] hash Hash of message
- * @param[in] ego EGO
+ * @param[in] key Private key of EGO
  */
 void
 sign_message (struct GNUNET_MESSENGER_Message *message,
               uint16_t length,
               char *buffer,
               const struct GNUNET_HashCode *hash,
-              const struct GNUNET_MESSENGER_Ego *ego);
+              const struct GNUNET_CRYPTO_PrivateKey *key);
+
+/**
+ * Signs the <i>hash</i> of a <i>message</i> with the peer identity of a given 
<i>config</i>
+ * and writes the signature into the <i>buffer</i> as well.
+ *
+ * @param[in,out] message Message
+ * @param[in] length Length of buffer
+ * @param[out] buffer Buffer
+ * @param[in] hash Hash of message
+ * @param[in] cfg Peer configuration
+ */
+void
+sign_message_by_peer (struct GNUNET_MESSENGER_Message *message,
+                      uint16_t length,
+                      char *buffer,
+                      const struct GNUNET_HashCode *hash,
+                      const struct GNUNET_CONFIGURATION_Handle *cfg);
 
 /**
  * Verifies the signature of a given <i>message</i> and its <i>hash</i> with a 
specific
@@ -190,6 +206,21 @@ verify_message (const struct GNUNET_MESSENGER_Message 
*message,
                 const struct GNUNET_HashCode *hash,
                 const struct GNUNET_CRYPTO_PublicKey *key);
 
+/**
+ * Verifies the signature of a given <i>message</i> and its <i>hash</i> with a 
specific
+ * peer's <i>identity</i>. The function returns #GNUNET_OK if the signature 
was valid,
+ * otherwise #GNUNET_SYSERR.
+ *
+ * @param[in] message Message
+ * @param[in] hash Hash of message
+ * @param[in] identity Peer identity
+ * @return #GNUNET_OK on success, otherwise #GNUNET_SYSERR
+ */
+int
+verify_message_by_peer (const struct GNUNET_MESSENGER_Message *message,
+                        const struct GNUNET_HashCode *hash,
+                        const struct GNUNET_PeerIdentity *identity);
+
 /**
  * Encrypts a <i>message</i> using a given public <i>key</i> and replaces its 
body
  * and kind with the now private encrypted <i>message</i>. The function returns
@@ -216,33 +247,69 @@ int
 decrypt_message (struct GNUNET_MESSENGER_Message *message,
                  const struct GNUNET_CRYPTO_PrivateKey *key);
 
+typedef void (*GNUNET_MESSENGER_SignFunction)(
+  const void *cls,
+  struct GNUNET_MESSENGER_Message *message,
+  uint16_t length,
+  char *buffer,
+  const struct GNUNET_HashCode *hash
+  );
+
 #define GNUNET_MESSENGER_PACK_MODE_ENVELOPE 0x1
 #define GNUNET_MESSENGER_PACK_MODE_UNKNOWN 0x0
 
 /**
  * Encodes the <i>message</i> to pack it into a newly allocated envelope if 
<i>mode</i>
  * is equal to #GNUNET_MESSENGER_PACK_MODE_ENVELOPE. Independent of the mode 
the message
- * will be hashed if <i>hash</i> is not NULL and it will be signed if the 
<i>ego</i> is
- * not NULL.
+ * will be hashed if <i>hash</i> is not NULL and it will be signed if the 
<i>sign</i>
+ * function is not NULL.
  *
  * @param[out] message Message
  * @param[out] hash Hash of message
- * @param[in] ego EGO to sign
+ * @param[in] sign Function to sign
  * @param[in] mode Mode of packing
+ * @param[in,out] cls Closure for signing
  * @return Envelope or NULL
  */
 struct GNUNET_MQ_Envelope*
 pack_message (struct GNUNET_MESSENGER_Message *message,
               struct GNUNET_HashCode *hash,
-              const struct GNUNET_MESSENGER_Ego *ego,
-              int mode);
+              const GNUNET_MESSENGER_SignFunction sign,
+              int mode,
+              const void *cls);
+
+/**
+ * Returns whether a specific kind of message can be sent by the service 
without usage of a
+ * clients EGO. The function returns #GNUNET_YES if the kind of message can be 
signed
+ * via a peer's identity, otherwise #GNUNET_NO.
+ *
+ * @param[in] message Message
+ * @return #GNUNET_YES if sending is allowed, #GNUNET_NO otherwise
+ */
+int
+is_peer_message (const struct GNUNET_MESSENGER_Message *message);
+
+/**
+ * Returns whether a specific kind of message contains service critical 
information. That kind
+ * of information should not be encrypted via private messages for example to 
guarantee the
+ * service to work properly. The function returns #GNUNET_YES if the kind of 
message needs to
+ * be transferred accessible to all peers and their running service. It 
returns #GNUNET_NO
+ * if the message can be encrypted to specific subgroups of members without 
issues. If the kind
+ * of message is unknown it returns #GNUNET_SYSERR.
+ *
+ * @param[in] message Message
+ * @return #GNUNET_YES if encrypting is disallowed, #GNUNET_NO or 
#GNUNET_SYSERR otherwise
+ */
+int
+is_service_message (const struct GNUNET_MESSENGER_Message *message);
 
 /**
- * Returns if a specific kind of message should be sent by a client. The 
function returns
+ * Returns whether a specific kind of message should be sent by a client. The 
function returns
  * #GNUNET_YES or #GNUNET_NO for recommendations and #GNUNET_SYSERR for 
specific kinds
  * of messages which should not be sent manually at all.
  *
  * @param[in] message Message
+ * @return #GNUNET_YES if sending is allowed, #GNUNET_NO or #GNUNET_SYSERR 
otherwise
  */
 int
 filter_message_sending (const struct GNUNET_MESSENGER_Message *message);
diff --git a/src/service/messenger/messenger_api_message_kind.c 
b/src/service/messenger/messenger_api_message_kind.c
new file mode 100644
index 000000000..d2c11bbc5
--- /dev/null
+++ b/src/service/messenger/messenger_api_message_kind.c
@@ -0,0 +1,190 @@
+/*
+   This file is part of GNUnet.
+   Copyright (C) 2020--2023 GNUnet e.V.
+
+   GNUnet is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Affero General Public License as published
+   by the Free Software Foundation, either version 3 of the License,
+   or (at your option) any later version.
+
+   GNUnet is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Affero General Public License for more details.
+
+   You should have received a copy of the GNU Affero General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/gnunet-service-messenger_message_kind.c
+ * @brief GNUnet MESSENGER service
+ */
+
+#include "messenger_api_message_kind.h"
+
+#include "platform.h"
+#include "messenger_api_util.h"
+
+struct GNUNET_MESSENGER_Message*
+create_message_join (const struct GNUNET_CRYPTO_PrivateKey *key)
+{
+  if (! key)
+    return NULL;
+
+  struct GNUNET_MESSENGER_Message *message = create_message (
+    GNUNET_MESSENGER_KIND_JOIN);
+
+  if (! message)
+    return NULL;
+
+  GNUNET_CRYPTO_key_get_public (key, &(message->body.join.key));
+  return message;
+}
+
+
+struct GNUNET_MESSENGER_Message*
+create_message_leave ()
+{
+  return create_message (GNUNET_MESSENGER_KIND_LEAVE);
+}
+
+
+struct GNUNET_MESSENGER_Message*
+create_message_name (const char *name)
+{
+  if (! name)
+    return NULL;
+
+  struct GNUNET_MESSENGER_Message *message = create_message (
+    GNUNET_MESSENGER_KIND_NAME);
+
+  if (! message)
+    return NULL;
+
+  message->body.name.name = GNUNET_strdup (name);
+  return message;
+}
+
+
+struct GNUNET_MESSENGER_Message*
+create_message_key (const struct GNUNET_CRYPTO_PrivateKey *key)
+{
+  if (! key)
+    return NULL;
+
+  struct GNUNET_MESSENGER_Message *message = create_message (
+    GNUNET_MESSENGER_KIND_KEY);
+
+  if (! message)
+    return NULL;
+
+  GNUNET_CRYPTO_key_get_public (key, &(message->body.key.key));
+  return message;
+}
+
+
+struct GNUNET_MESSENGER_Message*
+create_message_id (const struct GNUNET_ShortHashCode *unique_id)
+{
+  if (! unique_id)
+    return NULL;
+
+  struct GNUNET_MESSENGER_Message *message = create_message (
+    GNUNET_MESSENGER_KIND_ID);
+
+  if (! message)
+    return NULL;
+
+  GNUNET_memcpy (&(message->body.id.id), unique_id, sizeof(struct
+                                                           
GNUNET_ShortHashCode));
+
+  return message;
+}
+
+
+struct GNUNET_MESSENGER_Message*
+create_message_request (const struct GNUNET_HashCode *hash)
+{
+  if (! hash)
+    return NULL;
+
+  struct GNUNET_HashCode zero;
+  memset (&zero, 0, sizeof(zero));
+
+  if (0 == GNUNET_CRYPTO_hash_cmp (hash, &zero))
+    return NULL;
+
+  struct GNUNET_MESSENGER_Message *message = create_message (
+    GNUNET_MESSENGER_KIND_REQUEST);
+
+  if (! message)
+    return NULL;
+
+  GNUNET_memcpy (&(message->body.request.hash), hash, sizeof(struct
+                                                             GNUNET_HashCode));
+
+  return message;
+}
+
+
+struct GNUNET_MESSENGER_Message*
+create_message_invite (const struct GNUNET_PeerIdentity *door,
+                       const struct GNUNET_HashCode *key)
+{
+  if ((! door) || (! key))
+    return NULL;
+
+  struct GNUNET_MESSENGER_Message *message = create_message (
+    GNUNET_MESSENGER_KIND_INVITE);
+
+  if (! message)
+    return NULL;
+
+  GNUNET_memcpy (&(message->body.invite.door), door, sizeof(struct
+                                                            
GNUNET_PeerIdentity));
+  GNUNET_memcpy (&(message->body.invite.key), key, sizeof(struct
+                                                          GNUNET_HashCode));
+
+  return message;
+}
+
+
+struct GNUNET_MESSENGER_Message*
+create_message_text (const char *text)
+{
+  if (! text)
+    return NULL;
+
+  struct GNUNET_MESSENGER_Message *message = create_message (
+    GNUNET_MESSENGER_KIND_TEXT);
+
+  if (! message)
+    return NULL;
+
+  message->body.text.text = GNUNET_strdup (text);
+  return message;
+}
+
+
+struct GNUNET_MESSENGER_Message*
+create_message_delete (const struct GNUNET_HashCode *hash,
+                       const struct GNUNET_TIME_Relative delay)
+{
+  if (! hash)
+    return NULL;
+
+  struct GNUNET_MESSENGER_Message *message = create_message (
+    GNUNET_MESSENGER_KIND_DELETE);
+
+  if (! message)
+    return NULL;
+
+  GNUNET_memcpy (&(message->body.deletion.hash), hash, sizeof(struct
+                                                              
GNUNET_HashCode));
+  message->body.deletion.delay = GNUNET_TIME_relative_hton (delay);
+
+  return message;
+}
diff --git a/src/service/messenger/gnunet-service-messenger_message_kind.h 
b/src/service/messenger/messenger_api_message_kind.h
similarity index 71%
copy from src/service/messenger/gnunet-service-messenger_message_kind.h
copy to src/service/messenger/messenger_api_message_kind.h
index d50317844..5a544a41b 100644
--- a/src/service/messenger/gnunet-service-messenger_message_kind.h
+++ b/src/service/messenger/messenger_api_message_kind.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -33,28 +33,16 @@
 
 #include "messenger_api_message.h"
 #include "gnunet-service-messenger_service.h"
-#include "messenger_api_ego.h"
 
 /**
- * Creates and allocates a new info message containing the hosts EGO public 
key and a newly generated unique member id.
+ * Creates and allocates a new join message containing the clients EGO public 
<i>key</i>.
  * (all values are stored as copy)
  *
- * @param[in] ego EGO of the host
- * @param[in] members Map of all assigned member ids
- * @return New message
- */
-struct GNUNET_MESSENGER_Message*
-create_message_info (const struct GNUNET_MESSENGER_Ego *ego);
-
-/**
- * Creates and allocates a new join message containing the clients EGO public 
key.
- * (all values are stored as copy)
- *
- * @param[in] ego EGO of the client
+ * @param[in] key Private key of EGO
  * @return New message
  */
 struct GNUNET_MESSENGER_Message*
-create_message_join (const struct GNUNET_MESSENGER_Ego *ego);
+create_message_join (const struct GNUNET_CRYPTO_PrivateKey *key);
 
 /**
  * Creates and allocates a new leave message.
@@ -84,16 +72,6 @@ create_message_name (const char *name);
 struct GNUNET_MESSENGER_Message*
 create_message_key (const struct GNUNET_CRYPTO_PrivateKey *key);
 
-/**
- * Creates and allocates a new peer message containing a services peer 
identity.
- * (all values are stored as copy)
- *
- * @param[in] service Service
- * @return New message
- */
-struct GNUNET_MESSENGER_Message*
-create_message_peer (const struct GNUNET_MESSENGER_Service *service);
-
 /**
  * Creates and allocates a new id message containing the unique member id to 
change to.
  * (all values are stored as copy)
@@ -104,27 +82,6 @@ create_message_peer (const struct GNUNET_MESSENGER_Service 
*service);
 struct GNUNET_MESSENGER_Message*
 create_message_id (const struct GNUNET_ShortHashCode *unique_id);
 
-/**
- * Creates and allocates a new miss message containing the missing <i>peer</i> 
identity.
- * (all values are stored as copy)
- *
- * @param[in] peer Missing peer identity
- * @return New message
- */
-struct GNUNET_MESSENGER_Message*
-create_message_miss (const struct GNUNET_PeerIdentity *peer);
-
-/**
- * Creates and allocates a new merge message containing the hash of a second 
<i>previous</i> message
- * besides the regular previous message mentioned in a messages header.
- * (all values are stored as copy)
- *
- * @param[in] previous Hash of message
- * @return New message
- */
-struct GNUNET_MESSENGER_Message*
-create_message_merge (const struct GNUNET_HashCode *previous);
-
 /**
  * Creates and allocates a new request message containing the <i>hash</i> of a 
missing message.
  * (all values are stored as copy)
diff --git a/src/service/messenger/messenger_api_peer_store.c 
b/src/service/messenger/messenger_api_peer_store.c
new file mode 100644
index 000000000..949510960
--- /dev/null
+++ b/src/service/messenger/messenger_api_peer_store.c
@@ -0,0 +1,197 @@
+/*
+   This file is part of GNUnet.
+   Copyright (C) 2023 GNUnet e.V.
+
+   GNUnet is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Affero General Public License as published
+   by the Free Software Foundation, either version 3 of the License,
+   or (at your option) any later version.
+
+   GNUnet is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Affero General Public License for more details.
+
+   You should have received a copy of the GNU Affero General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_peer_store.c
+ * @brief messenger api: client implementation of GNUnet MESSENGER service
+ */
+
+#include "platform.h"
+#include "messenger_api_peer_store.h"
+
+#include "messenger_api_message.h"
+#include "messenger_api_util.h"
+
+void
+init_peer_store (struct GNUNET_MESSENGER_PeerStore *store)
+{
+  GNUNET_assert (store);
+
+  store->peers = GNUNET_CONTAINER_multishortmap_create (4, GNUNET_NO);
+}
+
+
+static enum GNUNET_GenericReturnValue
+iterate_destroy_peers (void *cls, const struct GNUNET_ShortHashCode *id,
+                       void *value)
+{
+  struct GNUNET_PeerIdentity *peer = value;
+  GNUNET_free (peer);
+  return GNUNET_YES;
+}
+
+
+void
+clear_peer_store (struct GNUNET_MESSENGER_PeerStore *store)
+{
+  GNUNET_assert ((store) && (store->peers));
+
+  GNUNET_CONTAINER_multishortmap_iterate (store->peers, iterate_destroy_peers,
+                                          NULL);
+  GNUNET_CONTAINER_multishortmap_destroy (store->peers);
+
+  store->peers = NULL;
+}
+
+
+struct GNUNET_MESSENGER_ClosureVerifyPeer
+{
+  const struct GNUNET_MESSENGER_Message *message;
+  const struct GNUNET_HashCode *hash;
+  struct GNUNET_PeerIdentity *sender;
+};
+
+static enum GNUNET_GenericReturnValue
+verify_store_peer (void *cls, const struct GNUNET_ShortHashCode *id,
+                   void *value)
+{
+  struct GNUNET_MESSENGER_ClosureVerifyPeer *verify = cls;
+  struct GNUNET_PeerIdentity *peer = value;
+
+  if ((peer) && (GNUNET_OK == verify_message_by_peer (verify->message,
+                                                      verify->hash, peer)))
+  {
+    verify->sender = peer;
+    return GNUNET_NO;
+  }
+
+  return GNUNET_YES;
+}
+
+
+struct GNUNET_PeerIdentity*
+get_store_peer_of (struct GNUNET_MESSENGER_PeerStore *store,
+                   const struct GNUNET_MESSENGER_Message *message,
+                   const struct GNUNET_HashCode *hash)
+{
+  GNUNET_assert ((store) && (store->peers) && (message) && (hash));
+
+  if (GNUNET_YES != is_peer_message (message))
+    return NULL;
+
+  if ((GNUNET_MESSENGER_KIND_PEER == message->header.kind) &&
+      (GNUNET_OK == verify_message_by_peer (message, hash,
+                                            &(message->body.peer.peer))))
+  {
+    struct GNUNET_ShortHashCode peer_id;
+    convert_peer_identity_to_id (&(message->body.peer.peer), &peer_id);
+
+    if (0 == GNUNET_memcmp (&peer_id, &(message->header.sender_id)))
+      update_store_peer (store, &(message->body.peer.peer));
+    else
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "Sender id does not match peer identity\n");
+  }
+
+  struct GNUNET_MESSENGER_ClosureVerifyPeer verify;
+  verify.message = message;
+  verify.hash = hash;
+  verify.sender = NULL;
+
+  GNUNET_CONTAINER_multishortmap_get_multiple (store->peers,
+                                               &(message->header.sender_id),
+                                               verify_store_peer, &verify);
+
+  return verify.sender;
+}
+
+
+struct GNUNET_MESSENGER_ClosureFindPeer
+{
+  const struct GNUNET_PeerIdentity *requested;
+  struct GNUNET_PeerIdentity *match;
+};
+
+static enum GNUNET_GenericReturnValue
+find_store_peer (void *cls, const struct GNUNET_ShortHashCode *id, void *value)
+{
+  struct GNUNET_MESSENGER_ClosureFindPeer *find = cls;
+  struct GNUNET_PeerIdentity *peer = value;
+
+  if ((peer) && (0 == GNUNET_memcmp (find->requested, peer)))
+  {
+    find->match = peer;
+    return GNUNET_NO;
+  }
+
+  return GNUNET_YES;
+}
+
+
+void
+update_store_peer (struct GNUNET_MESSENGER_PeerStore *store,
+                   const struct GNUNET_PeerIdentity *peer)
+{
+  GNUNET_assert ((store) && (store->peers) && (peer));
+
+  struct GNUNET_ShortHashCode peer_id;
+  convert_peer_identity_to_id (peer, &peer_id);
+
+  struct GNUNET_MESSENGER_ClosureFindPeer find;
+  find.requested = peer;
+  find.match = NULL;
+
+  GNUNET_CONTAINER_multishortmap_get_multiple (store->peers, &peer_id,
+                                               find_store_peer, &find);
+
+  if (find.match)
+    return;
+
+  struct GNUNET_PeerIdentity *copy = GNUNET_memdup (peer, sizeof (struct
+                                                                  
GNUNET_PeerIdentity));
+  GNUNET_CONTAINER_multishortmap_put (store->peers, &peer_id, copy,
+                                      
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+}
+
+
+void
+remove_store_peer (struct GNUNET_MESSENGER_PeerStore *store,
+                   const struct GNUNET_PeerIdentity *peer)
+{
+  GNUNET_assert ((store) && (store->peers) && (peer));
+
+  struct GNUNET_ShortHashCode peer_id;
+  convert_peer_identity_to_id (peer, &peer_id);
+
+  struct GNUNET_MESSENGER_ClosureFindPeer find;
+  find.requested = peer;
+  find.match = NULL;
+
+  GNUNET_CONTAINER_multishortmap_get_multiple (store->peers, &peer_id,
+                                               find_store_peer, &find);
+
+  if (! find.match)
+    return;
+
+  if (GNUNET_YES == GNUNET_CONTAINER_multishortmap_remove (store->peers,
+                                                           &peer_id,
+                                                           find.match))
+    GNUNET_free (find.match);
+}
diff --git a/src/service/messenger/messenger_api_peer_store.h 
b/src/service/messenger/messenger_api_peer_store.h
new file mode 100644
index 000000000..f4f948cb9
--- /dev/null
+++ b/src/service/messenger/messenger_api_peer_store.h
@@ -0,0 +1,93 @@
+/*
+   This file is part of GNUnet.
+   Copyright (C) 2023 GNUnet e.V.
+
+   GNUnet is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Affero General Public License as published
+   by the Free Software Foundation, either version 3 of the License,
+   or (at your option) any later version.
+
+   GNUnet is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Affero General Public License for more details.
+
+   You should have received a copy of the GNU Affero General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_peer_store.h
+ * @brief messenger api: client implementation of GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_MESSENGER_API_PEER_STORE_H
+#define GNUNET_MESSENGER_API_PEER_STORE_H
+
+#include "platform.h"
+#include "gnunet_util_lib.h"
+
+struct GNUNET_MESSENGER_Message;
+
+struct GNUNET_MESSENGER_PeerStore
+{
+  struct GNUNET_CONTAINER_MultiShortmap *peers;
+};
+
+/**
+ * Initializes a peer store as fully empty.
+ *
+ * @param[out] store Peer store
+ */
+void
+init_peer_store (struct GNUNET_MESSENGER_PeerStore *store);
+
+/**
+ * Clears a peer store, wipes its content and deallocates its memory.
+ *
+ * @param[in,out] store Peer store
+ */
+void
+clear_peer_store (struct GNUNET_MESSENGER_PeerStore *store);
+
+/**
+ * Returns the peer identity inside the <i>store</i> which verifies the
+ * signature of a given <i>message</i> as valid. The specific peer identity
+ * has to be added to the <i>store</i> previously. Otherwise the function
+ * returns NULL.
+ *
+ * @param[in,out] store Peer store
+ * @param[in] message Message
+ * @param[in] hash Hash of message
+ * @return Peer identity or NULL
+ */
+struct GNUNET_PeerIdentity*
+get_store_peer_of (struct GNUNET_MESSENGER_PeerStore *store,
+                   const struct GNUNET_MESSENGER_Message *message,
+                   const struct GNUNET_HashCode *hash);
+
+/**
+ * Adds a <i>peer</i> identity to the <i>store</i> if necessary. It ensures
+ * that the given <i>peer</i> can be verified as sender of a message
+ * afterwards by the <i>store</i>.
+ *
+ * @param[in,out] store Peer store
+ * @param[in] peer Peer identity
+ */
+void
+update_store_peer (struct GNUNET_MESSENGER_PeerStore *store,
+                   const struct GNUNET_PeerIdentity *peer);
+
+/**
+ * Removes a <i>peer</i> identity from the <i>store</i> entirely.
+ *
+ * @param[in,out] store Peer store
+ * @param[in] peer Peer identity
+ */
+void
+remove_store_peer (struct GNUNET_MESSENGER_PeerStore *store,
+                   const struct GNUNET_PeerIdentity *peer);
+
+#endif //GNUNET_MESSENGER_API_PEER_STORE_H
diff --git a/src/service/messenger/messenger_api_queue_messages.c 
b/src/service/messenger/messenger_api_queue_messages.c
new file mode 100644
index 000000000..f6a69366c
--- /dev/null
+++ b/src/service/messenger/messenger_api_queue_messages.c
@@ -0,0 +1,108 @@
+/*
+   This file is part of GNUnet.
+   Copyright (C) 2023 GNUnet e.V.
+
+   GNUnet is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Affero General Public License as published
+   by the Free Software Foundation, either version 3 of the License,
+   or (at your option) any later version.
+
+   GNUnet is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Affero General Public License for more details.
+
+   You should have received a copy of the GNU Affero General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_queue_messages.c
+ * @brief messenger api: client implementation of GNUnet MESSENGER service
+ */
+
+#include "messenger_api_queue_messages.h"
+
+void
+init_queue_messages (struct GNUNET_MESSENGER_QueueMessages *messages)
+{
+  GNUNET_assert (messages);
+
+  messages->head = NULL;
+  messages->tail = NULL;
+}
+
+
+void
+clear_queue_messages (struct GNUNET_MESSENGER_QueueMessages *messages)
+{
+  GNUNET_assert (messages);
+
+  while (messages->head)
+  {
+    struct GNUNET_MESSENGER_QueueMessage *element = messages->head;
+
+    GNUNET_CONTAINER_DLL_remove (messages->head, messages->tail, element);
+
+    if (element->message)
+      destroy_message (element->message);
+
+    GNUNET_free (element);
+  }
+
+  messages->head = NULL;
+  messages->tail = NULL;
+}
+
+
+void
+enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
+                     const struct GNUNET_CRYPTO_PrivateKey *sender,
+                     const struct GNUNET_MESSENGER_Message *message)
+{
+  GNUNET_assert ((messages) && (message));
+
+  struct GNUNET_MESSENGER_QueueMessage *element = GNUNET_new (struct
+                                                              
GNUNET_MESSENGER_QueueMessage);
+
+  if (! element)
+    return;
+
+  element->message = copy_message (message);
+
+  if (sender)
+    GNUNET_memcpy (&(element->sender), sender, sizeof (element->sender));
+
+  if (! element->message)
+  {
+    GNUNET_free (element);
+    return;
+  }
+
+  GNUNET_CONTAINER_DLL_insert_tail (messages->head, messages->tail, element);
+}
+
+
+struct GNUNET_MESSENGER_Message*
+dequeue_from_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
+                       struct GNUNET_CRYPTO_PrivateKey *sender)
+{
+  GNUNET_assert (messages);
+
+  struct GNUNET_MESSENGER_QueueMessage *element = messages->head;
+
+  if (! element)
+    return NULL;
+
+  struct GNUNET_MESSENGER_Message *message = element->message;
+
+  GNUNET_CONTAINER_DLL_remove (messages->head, messages->tail, element);
+
+  if (sender)
+    GNUNET_memcpy (sender, &(element->sender), sizeof (*sender));
+
+  GNUNET_free (element);
+  return message;
+}
diff --git a/src/service/messenger/messenger_api_queue_messages.h 
b/src/service/messenger/messenger_api_queue_messages.h
new file mode 100644
index 000000000..e0b6010fa
--- /dev/null
+++ b/src/service/messenger/messenger_api_queue_messages.h
@@ -0,0 +1,89 @@
+/*
+   This file is part of GNUnet.
+   Copyright (C) 2023 GNUnet e.V.
+
+   GNUnet is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Affero General Public License as published
+   by the Free Software Foundation, either version 3 of the License,
+   or (at your option) any later version.
+
+   GNUnet is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Affero General Public License for more details.
+
+   You should have received a copy of the GNU Affero General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Tobias Frisch
+ * @file src/messenger/messenger_api_queue_messages.h
+ * @brief messenger api: client implementation of GNUnet MESSENGER service
+ */
+
+#ifndef GNUNET_MESSENGER_API_QUEUE_MESSAGES_H
+#define GNUNET_MESSENGER_API_QUEUE_MESSAGES_H
+
+#include "platform.h"
+#include "gnunet_identity_service.h"
+#include "gnunet_util_lib.h"
+
+#include "messenger_api_message.h"
+
+struct GNUNET_MESSENGER_QueueMessage
+{
+  struct GNUNET_MESSENGER_QueueMessage *prev;
+  struct GNUNET_MESSENGER_QueueMessage *next;
+
+  struct GNUNET_CRYPTO_PrivateKey sender;
+  struct GNUNET_MESSENGER_Message *message;
+};
+
+struct GNUNET_MESSENGER_QueueMessages
+{
+  struct GNUNET_MESSENGER_QueueMessage *head;
+  struct GNUNET_MESSENGER_QueueMessage *tail;
+};
+
+/**
+ * Initializes queue of messages as empty queue.
+ *
+ * @param[out] messages Queue of messages
+ */
+void
+init_queue_messages (struct GNUNET_MESSENGER_QueueMessages *messages);
+
+/**
+ * Clears the queue of messages.
+ *
+ * @param[in,out] messages Queue of messages
+ */
+void
+clear_queue_messages (struct GNUNET_MESSENGER_QueueMessages *messages);
+
+/**
+ * Adds a specific <i>message</i> to the end of the queue.
+ *
+ * @param[in,out] messages Queue of messages
+ * @param[in] sender Private sender key
+ * @param[in] message Message
+ */
+void
+enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
+                     const struct GNUNET_CRYPTO_PrivateKey *sender,
+                     const struct GNUNET_MESSENGER_Message *message);
+
+/**
+ * Remove the message from the front of the queue and returns it.
+ *
+ * @param[in,out] messages Queue of messages
+ * @param[out] sender Private sender key
+ * @return Message from front or NULL
+ */
+struct GNUNET_MESSENGER_Message*
+dequeue_from_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
+                       struct GNUNET_CRYPTO_PrivateKey *sender);
+
+#endif //GNUNET_MESSENGER_API_QUEUE_MESSAGES_H
diff --git a/src/service/messenger/messenger_api_room.c 
b/src/service/messenger/messenger_api_room.c
index c3e8bc957..2c8b27bf8 100644
--- a/src/service/messenger/messenger_api_room.c
+++ b/src/service/messenger/messenger_api_room.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -32,24 +32,31 @@ struct GNUNET_MESSENGER_Room*
 create_room (struct GNUNET_MESSENGER_Handle *handle,
              const struct GNUNET_HashCode *key)
 {
-  GNUNET_assert((handle) && (key));
+  GNUNET_assert ((handle) && (key));
 
-  struct GNUNET_MESSENGER_Room *room = GNUNET_new(struct 
GNUNET_MESSENGER_Room);
+  struct GNUNET_MESSENGER_Room *room = GNUNET_new (struct
+                                                   GNUNET_MESSENGER_Room);
 
   room->handle = handle;
-  GNUNET_memcpy(&(room->key), key, sizeof(*key));
+  GNUNET_memcpy (&(room->key), key, sizeof(*key));
+
+  memset (&(room->last_message), 0, sizeof(room->last_message));
 
   room->opened = GNUNET_NO;
-  room->contact_id = NULL;
+  room->use_handle_name = GNUNET_YES;
+  room->sender_id = NULL;
 
   init_list_tunnels (&(room->entries));
 
   room->messages = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
   room->members = GNUNET_CONTAINER_multishortmap_create (8, GNUNET_NO);
 
+  init_queue_messages (&(room->queue));
+
   return room;
 }
 
+
 static int
 iterate_destroy_message (void *cls,
                          const struct GNUNET_HashCode *key,
@@ -58,21 +65,24 @@ iterate_destroy_message (void *cls,
   struct GNUNET_MESSENGER_RoomMessageEntry *entry = value;
 
   destroy_message (entry->message);
-  GNUNET_free(entry);
+  GNUNET_free (entry);
 
   return GNUNET_YES;
 }
 
+
 void
 destroy_room (struct GNUNET_MESSENGER_Room *room)
 {
-  GNUNET_assert(room);
+  GNUNET_assert (room);
 
+  clear_queue_messages (&(room->queue));
   clear_list_tunnels (&(room->entries));
 
   if (room->messages)
   {
-    GNUNET_CONTAINER_multihashmap_iterate (room->messages, 
iterate_destroy_message, NULL);
+    GNUNET_CONTAINER_multihashmap_iterate (room->messages,
+                                           iterate_destroy_message, NULL);
 
     GNUNET_CONTAINER_multihashmap_destroy (room->messages);
   }
@@ -80,169 +90,274 @@ destroy_room (struct GNUNET_MESSENGER_Room *room)
   if (room->members)
     GNUNET_CONTAINER_multishortmap_destroy (room->members);
 
-  if (room->contact_id)
-    GNUNET_free(room->contact_id);
+  if (room->sender_id)
+    GNUNET_free (room->sender_id);
+
+  GNUNET_free (room);
+}
+
+
+enum GNUNET_GenericReturnValue
+is_room_available (const struct GNUNET_MESSENGER_Room *room)
+{
+  GNUNET_assert (room);
+
+  if (! get_room_sender_id (room))
+    return GNUNET_NO;
+
+  if ((GNUNET_YES == room->opened) || (room->entries.head))
+    return GNUNET_YES;
+  else
+    return GNUNET_NO;
+}
+
+
+const struct GNUNET_ShortHashCode*
+get_room_sender_id (const struct GNUNET_MESSENGER_Room *room)
+{
+  GNUNET_assert (room);
 
-  GNUNET_free(room);
+  return room->sender_id;
 }
 
+
+void
+set_room_sender_id (struct GNUNET_MESSENGER_Room *room,
+                    const struct GNUNET_ShortHashCode *id)
+{
+  GNUNET_assert (room);
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Set member id for room: %s\n",
+              GNUNET_h2s (&(room->key)));
+
+  if (! id)
+  {
+    if (room->sender_id)
+      GNUNET_free (room->sender_id);
+
+    room->sender_id = NULL;
+    return;
+  }
+
+  if (! room->sender_id)
+    room->sender_id = GNUNET_new (struct GNUNET_ShortHashCode);
+
+  GNUNET_memcpy (room->sender_id, id, sizeof(struct GNUNET_ShortHashCode));
+}
+
+
 const struct GNUNET_MESSENGER_Message*
 get_room_message (const struct GNUNET_MESSENGER_Room *room,
                   const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((room) && (hash));
+  GNUNET_assert ((room) && (hash));
 
-  struct GNUNET_MESSENGER_RoomMessageEntry *entry = 
GNUNET_CONTAINER_multihashmap_get (
+  struct GNUNET_MESSENGER_RoomMessageEntry *entry =
+    GNUNET_CONTAINER_multihashmap_get (
       room->messages, hash
-  );
+      );
 
   return (entry? entry->message : NULL);
 }
 
+
 struct GNUNET_MESSENGER_Contact*
 get_room_sender (const struct GNUNET_MESSENGER_Room *room,
                  const struct GNUNET_HashCode *hash)
 {
-  GNUNET_assert((room) && (hash));
+  GNUNET_assert ((room) && (hash));
 
-  struct GNUNET_MESSENGER_RoomMessageEntry *entry = 
GNUNET_CONTAINER_multihashmap_get (
+  struct GNUNET_MESSENGER_RoomMessageEntry *entry =
+    GNUNET_CONTAINER_multihashmap_get (
       room->messages, hash
-  );
+      );
 
   return (entry? entry->sender : NULL);
 }
 
+
 static struct GNUNET_MESSENGER_Contact*
 handle_join_message (struct GNUNET_MESSENGER_Room *room,
                      struct GNUNET_MESSENGER_Contact *sender,
                      const struct GNUNET_MESSENGER_Message *message,
                      const struct GNUNET_HashCode *hash)
 {
-  if (!sender)
+  if (! sender)
   {
-    struct GNUNET_MESSENGER_ContactStore *store = 
get_handle_contact_store(room->handle);
+    struct GNUNET_MESSENGER_ContactStore *store = get_handle_contact_store (
+      room->handle);
     struct GNUNET_HashCode context;
 
-    get_context_from_member(&(room->key), &(message->header.sender_id), 
&context);
+    get_context_from_member (&(room->key), &(message->header.sender_id),
+                             &context);
 
-    sender = get_store_contact(store, &context, &(message->body.join.key));
+    sender = get_store_contact (store, &context, &(message->body.join.key));
   }
 
-  if ((GNUNET_YES != 
GNUNET_CONTAINER_multishortmap_contains_value(room->members, 
&(message->header.sender_id), sender)) &&
-      (GNUNET_OK == GNUNET_CONTAINER_multishortmap_put(room->members, 
&(message->header.sender_id), sender,
-                                                       
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)))
-    increase_contact_rc(sender);
+  if ((GNUNET_YES != GNUNET_CONTAINER_multishortmap_contains_value (
+         room->members, &(message->header.sender_id), sender)) &&
+      (GNUNET_OK == GNUNET_CONTAINER_multishortmap_put (room->members,
+                                                        &(message->header.
+                                                          sender_id), sender,
+                                                        
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)))
+    increase_contact_rc (sender);
 
   return sender;
 }
 
+
 static void
 handle_leave_message (struct GNUNET_MESSENGER_Room *room,
                       struct GNUNET_MESSENGER_Contact *sender,
                       const struct GNUNET_MESSENGER_Message *message,
                       const struct GNUNET_HashCode *hash)
 {
-  if ((!sender) ||
-      (GNUNET_YES != GNUNET_CONTAINER_multishortmap_remove(room->members, 
&(message->header.sender_id), sender)))
+  if ((! sender) ||
+      (GNUNET_YES != GNUNET_CONTAINER_multishortmap_remove (room->members,
+                                                            &(message->header.
+                                                              sender_id),
+                                                            sender)))
     return;
 
-  struct GNUNET_HashCode context;
-  get_context_from_member(&(room->key), &(message->header.sender_id), 
&context);
-
-  if (GNUNET_YES == decrease_contact_rc(sender))
-    GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "A contact does not share any room 
with you anymore!\n");
+  if (GNUNET_YES == decrease_contact_rc (sender))
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "A contact does not share any room with you anymore!\n");
 }
 
+
 static void
 handle_name_message (struct GNUNET_MESSENGER_Room *room,
                      struct GNUNET_MESSENGER_Contact *sender,
                      const struct GNUNET_MESSENGER_Message *message,
-                     const struct GNUNET_HashCode *hash)
+                     const struct GNUNET_HashCode *hash,
+                     enum GNUNET_MESSENGER_MessageFlags flags)
 {
-  if (!sender)
+  if (GNUNET_MESSENGER_FLAG_SENT & flags)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Set rule for using handle name in room: %s\n",
+                GNUNET_h2s (&(room->key)));
+
+    const char *handle_name = get_handle_name (room->handle);
+
+    if ((handle_name) && (0 == strcmp (handle_name, message->body.name.name)))
+      room->use_handle_name = GNUNET_YES;
+  }
+
+  if (! sender)
     return;
 
   set_contact_name (sender, message->body.name.name);
 }
 
+
 static void
 handle_key_message (struct GNUNET_MESSENGER_Room *room,
                     struct GNUNET_MESSENGER_Contact *sender,
                     const struct GNUNET_MESSENGER_Message *message,
                     const struct GNUNET_HashCode *hash)
 {
-  if (!sender)
+  if (! sender)
     return;
 
   struct GNUNET_HashCode context;
-  get_context_from_member(&(room->key), &(message->header.sender_id), 
&context);
+  get_context_from_member (&(room->key), &(message->header.sender_id),
+                           &context);
 
-  struct GNUNET_MESSENGER_ContactStore *store = 
get_handle_contact_store(room->handle);
+  struct GNUNET_MESSENGER_ContactStore *store = get_handle_contact_store (
+    room->handle);
 
-  update_store_contact(store, sender, &context, &context, 
&(message->body.key.key));
+  update_store_contact (store, sender, &context, &context,
+                        &(message->body.key.key));
 }
 
+
 static void
 handle_id_message (struct GNUNET_MESSENGER_Room *room,
                    struct GNUNET_MESSENGER_Contact *sender,
                    const struct GNUNET_MESSENGER_Message *message,
-                   const struct GNUNET_HashCode *hash)
+                   const struct GNUNET_HashCode *hash,
+                   enum GNUNET_MESSENGER_MessageFlags flags)
 {
-  if ((!sender) ||
-      (GNUNET_YES != GNUNET_CONTAINER_multishortmap_remove(room->members, 
&(message->header.sender_id), sender)) ||
-      (GNUNET_OK != GNUNET_CONTAINER_multishortmap_put(room->members, 
&(message->body.id.id), sender,
-                                                       
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)))
+  if (GNUNET_MESSENGER_FLAG_SENT & flags)
+    set_room_sender_id (room, &(message->body.id.id));
+
+  if ((! sender) ||
+      (GNUNET_YES != GNUNET_CONTAINER_multishortmap_remove (room->members,
+                                                            &(message->header.
+                                                              sender_id),
+                                                            sender)) ||
+      (GNUNET_OK != GNUNET_CONTAINER_multishortmap_put (room->members,
+                                                        &(message->body.id.id),
+                                                        sender,
+                                                        
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)))
     return;
 
   struct GNUNET_HashCode context, next_context;
-  get_context_from_member(&(room->key), &(message->header.sender_id), 
&context);
-  get_context_from_member(&(room->key), &(message->body.id.id), &next_context);
+  get_context_from_member (&(room->key), &(message->header.sender_id),
+                           &context);
+  get_context_from_member (&(room->key), &(message->body.id.id), 
&next_context);
 
-  struct GNUNET_MESSENGER_ContactStore *store = 
get_handle_contact_store(room->handle);
+  struct GNUNET_MESSENGER_ContactStore *store = get_handle_contact_store (
+    room->handle);
 
-  update_store_contact(store, sender, &context, &next_context, 
get_contact_key(sender));
+  update_store_contact (store, sender, &context, &next_context,
+                        get_contact_key (sender));
 }
 
+
 static void
 handle_miss_message (struct GNUNET_MESSENGER_Room *room,
                      struct GNUNET_MESSENGER_Contact *sender,
                      const struct GNUNET_MESSENGER_Message *message,
-                     const struct GNUNET_HashCode *hash)
+                     const struct GNUNET_HashCode *hash,
+                     enum GNUNET_MESSENGER_MessageFlags flags)
 {
-  if ((room->contact_id) && (0 == GNUNET_memcmp(&(message->header.sender_id), 
room->contact_id)))
+  if (GNUNET_MESSENGER_FLAG_SENT & flags)
   {
-    struct GNUNET_MESSENGER_ListTunnel *match = find_list_tunnels 
(&(room->entries), &(message->body.miss.peer), NULL);
+    struct GNUNET_MESSENGER_ListTunnel *match = find_list_tunnels (
+      &(room->entries), &(message->body.miss.peer), NULL);
 
     if (match)
       remove_from_list_tunnels (&(room->entries), match);
   }
 }
 
+
 static void
 handle_delete_message (struct GNUNET_MESSENGER_Room *room,
                        struct GNUNET_MESSENGER_Contact *sender,
                        const struct GNUNET_MESSENGER_Message *message,
                        const struct GNUNET_HashCode *hash)
 {
-  struct GNUNET_MESSENGER_RoomMessageEntry *entry = 
GNUNET_CONTAINER_multihashmap_get (
+  struct GNUNET_MESSENGER_RoomMessageEntry *entry =
+    GNUNET_CONTAINER_multihashmap_get (
       room->messages, &(message->body.deletion.hash)
-  );
-
-  if ((entry) && ((entry->sender == sender) || (get_handle_contact 
(room->handle, &(room->key)) == sender)) &&
-      (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (room->messages, 
&(message->body.deletion.hash), entry)))
+      );
+
+  if ((entry) && ((entry->sender == sender) || (get_handle_contact (
+                                                  room->handle, &(room->key)) 
==
+                                                sender)) &&
+      (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (room->messages,
+                                                           &(message->body.
+                                                             deletion.hash),
+                                                           entry)))
   {
     destroy_message (entry->message);
-    GNUNET_free(entry);
+    GNUNET_free (entry);
   }
 }
 
+
 struct GNUNET_MESSENGER_Contact*
 handle_room_message (struct GNUNET_MESSENGER_Room *room,
                      struct GNUNET_MESSENGER_Contact *sender,
                      const struct GNUNET_MESSENGER_Message *message,
-                     const struct GNUNET_HashCode *hash)
+                     const struct GNUNET_HashCode *hash,
+                     enum GNUNET_MESSENGER_MessageFlags flags)
 {
-  if (GNUNET_NO != GNUNET_CONTAINER_multihashmap_contains (room->messages, 
hash))
+  if (GNUNET_NO != GNUNET_CONTAINER_multihashmap_contains (room->messages,
+                                                           hash))
     return sender;
 
   switch (message->header.kind)
@@ -254,16 +369,16 @@ handle_room_message (struct GNUNET_MESSENGER_Room *room,
     handle_leave_message (room, sender, message, hash);
     break;
   case GNUNET_MESSENGER_KIND_NAME:
-    handle_name_message (room, sender, message, hash);
+    handle_name_message (room, sender, message, hash, flags);
     break;
   case GNUNET_MESSENGER_KIND_KEY:
     handle_key_message (room, sender, message, hash);
     break;
   case GNUNET_MESSENGER_KIND_ID:
-    handle_id_message (room, sender, message, hash);
+    handle_id_message (room, sender, message, hash, flags);
     break;
   case GNUNET_MESSENGER_KIND_MISS:
-    handle_miss_message (room, sender, message, hash);
+    handle_miss_message (room, sender, message, hash, flags);
     break;
   case GNUNET_MESSENGER_KIND_DELETE:
     handle_delete_message (room, sender, message, hash);
@@ -272,24 +387,28 @@ handle_room_message (struct GNUNET_MESSENGER_Room *room,
     break;
   }
 
-  struct GNUNET_MESSENGER_RoomMessageEntry *entry = GNUNET_new(struct 
GNUNET_MESSENGER_RoomMessageEntry);
+  struct GNUNET_MESSENGER_RoomMessageEntry *entry = GNUNET_new (struct
+                                                                
GNUNET_MESSENGER_RoomMessageEntry);
 
-  if (!entry)
+  if (! entry)
     return sender;
 
   entry->sender = sender;
   entry->message = copy_message (message);
 
-  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (room->messages, hash, 
entry,
+  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (room->messages, hash,
+                                                      entry,
                                                       
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
   {
     destroy_message (entry->message);
-    GNUNET_free(entry);
+    GNUNET_free (entry);
   }
 
+  GNUNET_memcpy (&(room->last_message), hash, sizeof(room->last_message));
   return sender;
 }
 
+
 struct GNUNET_MESSENGER_MemberCall
 {
   struct GNUNET_MESSENGER_Room *room;
@@ -298,25 +417,26 @@ struct GNUNET_MESSENGER_MemberCall
 };
 
 static int
-iterate_local_members (void* cls,
+iterate_local_members (void *cls,
                        const struct GNUNET_ShortHashCode *key,
                        void *value)
 {
   struct GNUNET_MESSENGER_MemberCall *call = cls;
   struct GNUNET_MESSENGER_Contact *contact = value;
 
-  return call->callback(call->cls, call->room, contact);
+  return call->callback (call->cls, call->room, contact);
 }
 
+
 int
 iterate_room_members (struct GNUNET_MESSENGER_Room *room,
                       GNUNET_MESSENGER_MemberCallback callback,
-                      void* cls)
+                      void *cls)
 {
-  GNUNET_assert(room);
+  GNUNET_assert (room);
 
-  if (!callback)
-    return GNUNET_CONTAINER_multishortmap_iterate(room->members, NULL, NULL);
+  if (! callback)
+    return GNUNET_CONTAINER_multishortmap_iterate (room->members, NULL, NULL);
 
   struct GNUNET_MESSENGER_MemberCall call;
 
@@ -324,11 +444,14 @@ iterate_room_members (struct GNUNET_MESSENGER_Room *room,
   call.callback = callback;
   call.cls = cls;
 
-  GNUNET_assert(callback);
+  GNUNET_assert (callback);
 
-  return GNUNET_CONTAINER_multishortmap_iterate(room->members, 
iterate_local_members, &call);
+  return GNUNET_CONTAINER_multishortmap_iterate (room->members,
+                                                 iterate_local_members,
+                                                 &call);
 }
 
+
 struct GNUNET_MESSENGER_MemberFind
 {
   const struct GNUNET_MESSENGER_Contact *contact;
@@ -336,7 +459,7 @@ struct GNUNET_MESSENGER_MemberFind
 };
 
 static int
-iterate_find_member (void* cls,
+iterate_find_member (void *cls,
                      const struct GNUNET_ShortHashCode *key,
                      void *value)
 {
@@ -352,18 +475,20 @@ iterate_find_member (void* cls,
   return GNUNET_YES;
 }
 
+
 int
 find_room_member (const struct GNUNET_MESSENGER_Room *room,
                   const struct GNUNET_MESSENGER_Contact *contact)
 {
-  GNUNET_assert(room);
+  GNUNET_assert (room);
 
   struct GNUNET_MESSENGER_MemberFind find;
 
   find.contact = contact;
   find.result = GNUNET_NO;
 
-  GNUNET_CONTAINER_multishortmap_iterate(room->members, iterate_find_member, 
&find);
+  GNUNET_CONTAINER_multishortmap_iterate (room->members, iterate_find_member,
+                                          &find);
 
   return find.result;
 }
diff --git a/src/service/messenger/messenger_api_room.h 
b/src/service/messenger/messenger_api_room.h
index d5ffc5c4b..c9d36a410 100644
--- a/src/service/messenger/messenger_api_room.h
+++ b/src/service/messenger/messenger_api_room.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -34,10 +34,12 @@
 #include "messenger_api_list_tunnels.h"
 #include "messenger_api_contact.h"
 #include "messenger_api_message.h"
+#include "messenger_api_queue_messages.h"
 
-struct GNUNET_MESSENGER_RoomMessageEntry {
-  struct GNUNET_MESSENGER_Contact* sender;
-  struct GNUNET_MESSENGER_Message* message;
+struct GNUNET_MESSENGER_RoomMessageEntry
+{
+  struct GNUNET_MESSENGER_Contact *sender;
+  struct GNUNET_MESSENGER_Message *message;
 };
 
 struct GNUNET_MESSENGER_Room
@@ -45,14 +47,19 @@ struct GNUNET_MESSENGER_Room
   struct GNUNET_MESSENGER_Handle *handle;
   struct GNUNET_HashCode key;
 
-  int opened;
+  struct GNUNET_HashCode last_message;
+
+  enum GNUNET_GenericReturnValue opened;
+  enum GNUNET_GenericReturnValue use_handle_name;
 
-  struct GNUNET_ShortHashCode *contact_id;
+  struct GNUNET_ShortHashCode *sender_id;
 
   struct GNUNET_MESSENGER_ListTunnels entries;
 
   struct GNUNET_CONTAINER_MultiHashMap *messages;
   struct GNUNET_CONTAINER_MultiShortmap *members;
+
+  struct GNUNET_MESSENGER_QueueMessages queue;
 };
 
 /**
@@ -74,6 +81,34 @@ create_room (struct GNUNET_MESSENGER_Handle *handle,
 void
 destroy_room (struct GNUNET_MESSENGER_Room *room);
 
+/**
+ * Checks whether a room is available to send messages.
+ *
+ * @param[in] room Room
+ * @return GNUNET_YES if the room is available, otherwise GNUNET_NO
+ */
+enum GNUNET_GenericReturnValue
+is_room_available (const struct GNUNET_MESSENGER_Room *room);
+
+/**
+ * Returns the member id of the <i>room</i>'s sender.
+ *
+ * @param[in] room Room
+ * @return Member id or NULL
+ */
+const struct GNUNET_ShortHashCode*
+get_room_sender_id (const struct GNUNET_MESSENGER_Room *room);
+
+/**
+ * Sets the member id of the <i>room</i>'s sender to a specific <i>id</i> or 
NULL.
+ *
+ * @param[in,out] room Room
+ * @param[in] id Member id or NULL
+ */
+void
+set_room_sender_id (struct GNUNET_MESSENGER_Room *room,
+                    const struct GNUNET_ShortHashCode *id);
+
 /**
  * Returns a message locally stored from a map for a given <i>hash</i> in a 
<i>room</i>. If no matching
  * message is found, NULL gets returned.
@@ -109,13 +144,15 @@ get_room_sender (const struct GNUNET_MESSENGER_Room *room,
  * @param[in,out] sender Contact of sender
  * @param[in] message Message
  * @param[in] hash Hash of message
+ * @param[in] flags Flags of message
  * @return Contact of sender
  */
 struct GNUNET_MESSENGER_Contact*
 handle_room_message (struct GNUNET_MESSENGER_Room *room,
                      struct GNUNET_MESSENGER_Contact *sender,
                      const struct GNUNET_MESSENGER_Message *message,
-                     const struct GNUNET_HashCode *hash);
+                     const struct GNUNET_HashCode *hash,
+                     enum GNUNET_MESSENGER_MessageFlags flags);
 
 /**
  * Iterates through all members of a given <i>room</i> to forward each of them 
to a selected
@@ -129,7 +166,7 @@ handle_room_message (struct GNUNET_MESSENGER_Room *room,
 int
 iterate_room_members (struct GNUNET_MESSENGER_Room *room,
                       GNUNET_MESSENGER_MemberCallback callback,
-                      void* cls);
+                      void *cls);
 
 /**
  * Checks through all members of a given <i>room</i> if a specific 
<i>contact</i> is found and
diff --git a/src/service/messenger/messenger_api_util.c 
b/src/service/messenger/messenger_api_util.c
index 9d23e2262..c098ae3d9 100644
--- a/src/service/messenger/messenger_api_util.c
+++ b/src/service/messenger/messenger_api_util.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -35,29 +35,34 @@ callback_close_channel (void *cls)
     GNUNET_CADET_channel_destroy (channel);
 }
 
+
 void
 delayed_disconnect_channel (struct GNUNET_CADET_Channel *channel)
 {
-  GNUNET_assert(channel);
+  GNUNET_assert (channel);
 
   GNUNET_SCHEDULER_add_delayed_with_priority (GNUNET_TIME_relative_get_zero_ 
(),
                                               GNUNET_SCHEDULER_PRIORITY_URGENT,
                                               callback_close_channel, channel);
 }
 
+
 int
 generate_free_member_id (struct GNUNET_ShortHashCode *id,
                          const struct GNUNET_CONTAINER_MultiShortmap *members)
 {
-  GNUNET_assert(id);
+  GNUNET_assert (id);
 
-  size_t counter = 1 + (members ? GNUNET_CONTAINER_multishortmap_size 
(members) : 0);
+  size_t counter = 1 + (members ? GNUNET_CONTAINER_multishortmap_size (
+                          members) : 0);
 
   do
   {
-    GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG, id, 
sizeof(struct GNUNET_ShortHashCode));
+    GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG, id, sizeof(struct
+                                                                         
GNUNET_ShortHashCode));
 
-    if ((members) && (GNUNET_YES == GNUNET_CONTAINER_multishortmap_contains 
(members, id)))
+    if ((members) && (GNUNET_YES == GNUNET_CONTAINER_multishortmap_contains (
+                        members, id)))
       counter--;
     else
       break;
@@ -70,34 +75,53 @@ generate_free_member_id (struct GNUNET_ShortHashCode *id,
   return GNUNET_NO;
 }
 
+
+const struct GNUNET_CRYPTO_PrivateKey*
+get_anonymous_private_key ()
+{
+  const struct GNUNET_IDENTITY_Ego *ego = GNUNET_IDENTITY_ego_get_anonymous ();
+  return GNUNET_IDENTITY_ego_get_private_key (ego);
+}
+
+
 const struct GNUNET_CRYPTO_PublicKey*
 get_anonymous_public_key ()
 {
   static struct GNUNET_CRYPTO_PublicKey public_key;
-  static struct GNUNET_IDENTITY_Ego* ego = NULL;
+  static struct GNUNET_IDENTITY_Ego *ego = NULL;
 
-  if (!ego)
+  if (! ego)
   {
-    ego = GNUNET_IDENTITY_ego_get_anonymous();
-    GNUNET_IDENTITY_ego_get_public_key(ego, &public_key);
+    ego = GNUNET_IDENTITY_ego_get_anonymous ();
+    GNUNET_IDENTITY_ego_get_public_key (ego, &public_key);
   }
 
   return &public_key;
 }
 
+
 void
-convert_messenger_key_to_port(const struct GNUNET_HashCode *key,
-                              struct GNUNET_HashCode *port)
+convert_messenger_key_to_port (const struct GNUNET_HashCode *key,
+                               struct GNUNET_HashCode *port)
 {
   static uint32_t version_value = 0;
   static struct GNUNET_HashCode version;
 
-  if (!version_value) {
+  if (! version_value)
+  {
     version_value = (uint32_t) (GNUNET_MESSENGER_VERSION);
     version_value = ((version_value >> 16) & 0xFFFF);
-    version_value = GNUNET_htole32(version_value);
-    GNUNET_CRYPTO_hash(&version_value, sizeof(version_value), &version);
+    version_value = GNUNET_htole32 (version_value);
+    GNUNET_CRYPTO_hash (&version_value, sizeof(version_value), &version);
   }
 
-  GNUNET_CRYPTO_hash_sum(key, &version, port);
+  GNUNET_CRYPTO_hash_sum (key, &version, port);
+}
+
+
+void
+convert_peer_identity_to_id (const struct GNUNET_PeerIdentity *identity,
+                             struct GNUNET_ShortHashCode *id)
+{
+  GNUNET_memcpy (id, identity, sizeof(struct GNUNET_ShortHashCode));
 }
diff --git a/src/service/messenger/messenger_api_util.h 
b/src/service/messenger/messenger_api_util.h
index bad001da3..a85a12686 100644
--- a/src/service/messenger/messenger_api_util.h
+++ b/src/service/messenger/messenger_api_util.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -52,6 +52,15 @@ int
 generate_free_member_id (struct GNUNET_ShortHashCode *id,
                          const struct GNUNET_CONTAINER_MultiShortmap *members);
 
+/**
+ * Returns the private identity key of #GNUNET_IDENTITY_ego_get_anonymous() 
without
+ * recalculating it every time.
+ *
+ * @return anonymous private key
+ */
+const struct GNUNET_CRYPTO_PrivateKey*
+get_anonymous_private_key ();
+
 /**
  * Returns the public identity key of #GNUNET_IDENTITY_ego_get_anonymous() 
without
  * recalculating it every time.
@@ -72,7 +81,18 @@ get_anonymous_public_key ();
  * @param[out] port CADET service port
  */
 void
-convert_messenger_key_to_port(const struct GNUNET_HashCode *key,
-                              struct GNUNET_HashCode *port);
+convert_messenger_key_to_port (const struct GNUNET_HashCode *key,
+                               struct GNUNET_HashCode *port);
+
+/**
+ * Converts a peers identity to a short hash code which can be used
+ * as id to refer to a peer via sender id as attached in messages.
+ *
+ * @param[in] identity Peer identity
+ * @param[out] id Short peer id
+ */
+void
+convert_peer_identity_to_id (const struct GNUNET_PeerIdentity *identity,
+                             struct GNUNET_ShortHashCode *id);
 
 #endif //GNUNET_SERVICE_MESSENGER_UTIL_H
diff --git a/src/plugin/messenger/plugin_gnsrecord_messenger.c 
b/src/service/messenger/plugin_gnsrecord_messenger.c
similarity index 89%
copy from src/plugin/messenger/plugin_gnsrecord_messenger.c
copy to src/service/messenger/plugin_gnsrecord_messenger.c
index e09a0330d..ed675dd1d 100644
--- a/src/plugin/messenger/plugin_gnsrecord_messenger.c
+++ b/src/service/messenger/plugin_gnsrecord_messenger.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2021--2022 GNUnet e.V.
+   Copyright (C) 2021--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -59,8 +59,11 @@ messenger_value_to_string (void *cls,
 
       const struct GNUNET_MESSENGER_RoomEntryRecord *record = data;
 
-      char *door = GNUNET_CRYPTO_eddsa_public_key_to_string 
(&(record->door.public_key));
-      char *key = GNUNET_STRINGS_data_to_string_alloc (&(record->key), 
sizeof(struct GNUNET_HashCode));
+      char *door = GNUNET_CRYPTO_eddsa_public_key_to_string (
+        &(record->door.public_key));
+      char *key = GNUNET_STRINGS_data_to_string_alloc (&(record->key),
+                                                       sizeof(struct
+                                                              
GNUNET_HashCode));
 
       char *ret;
       GNUNET_asprintf (&ret, "%s-%s", key, door);
@@ -78,8 +81,9 @@ messenger_value_to_string (void *cls,
 
       const struct GNUNET_MESSENGER_RoomDetailsRecord *record = data;
 
-      char *name = GNUNET_strndup(record->name, 256);
-      char *flags = GNUNET_STRINGS_data_to_string_alloc (&(record->flags), 
sizeof(uint32_t));
+      char *name = GNUNET_strndup (record->name, 256);
+      char *flags = GNUNET_STRINGS_data_to_string_alloc (&(record->flags),
+                                                         sizeof(uint32_t));
 
       char *ret;
       GNUNET_asprintf (&ret, "%s-%s", flags, name);
@@ -122,15 +126,17 @@ messenger_string_to_value (void *cls,
   {
   case GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_ENTRY:
     {
-      char key [103];
+      char key[103];
       const char *dash;
       struct GNUNET_PeerIdentity door;
 
       if ((NULL == (dash = strchr (s, '-'))) ||
           (1 != sscanf (s, "%103s-", key)) ||
           (GNUNET_OK != GNUNET_CRYPTO_eddsa_public_key_from_string (dash + 1,
-                                                                    strlen 
(dash + 1),
-                                                                    
&(door.public_key))))
+                                                                    strlen (
+                                                                      dash + 
1),
+                                                                    &(door.
+                                                                      
public_key))))
       {
         GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                     _ ("Unable to parse MESSENGER_ROOM_ENTRY record `%s'\n"),
@@ -139,13 +145,14 @@ messenger_string_to_value (void *cls,
       }
 
       struct GNUNET_MESSENGER_RoomEntryRecord *record = GNUNET_new (
-          struct GNUNET_MESSENGER_RoomEntryRecord
-      );
+        struct GNUNET_MESSENGER_RoomEntryRecord
+        );
 
       if (GNUNET_OK != GNUNET_STRINGS_string_to_data (key,
                                                       strlen (key),
                                                       &(record->key),
-                                                      sizeof(struct 
GNUNET_HashCode)))
+                                                      sizeof(struct
+                                                             GNUNET_HashCode)))
       {
         GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                     _ ("Unable to parse MESSENGER_ROOM_ENTRY record `%s'\n"),
@@ -161,7 +168,7 @@ messenger_string_to_value (void *cls,
     }
   case GNUNET_GNSRECORD_TYPE_MESSENGER_ROOM_DETAILS:
     {
-      char flags [7];
+      char flags[7];
       const char *dash;
 
       if ((NULL == (dash = strchr (s, '-'))) ||
@@ -175,8 +182,8 @@ messenger_string_to_value (void *cls,
       }
 
       struct GNUNET_MESSENGER_RoomDetailsRecord *record = GNUNET_new (
-          struct GNUNET_MESSENGER_RoomDetailsRecord
-      );
+        struct GNUNET_MESSENGER_RoomDetailsRecord
+        );
 
       if (GNUNET_OK != GNUNET_STRINGS_string_to_data (flags,
                                                       strlen (flags),
@@ -190,7 +197,7 @@ messenger_string_to_value (void *cls,
         return GNUNET_SYSERR;
       }
 
-      GNUNET_memcpy(record->name, dash + 1, strlen(dash + 1));
+      GNUNET_memcpy (record->name, dash + 1, strlen (dash + 1));
 
       *data = record;
       *data_size = sizeof(struct GNUNET_MESSENGER_RoomDetailsRecord);
diff --git a/src/service/messenger/test_messenger.c 
b/src/service/messenger/test_messenger.c
index 660e6473c..4d85e984f 100644
--- a/src/service/messenger/test_messenger.c
+++ b/src/service/messenger/test_messenger.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -45,14 +45,23 @@ static int status = 1;
 
 static struct GNUNET_SCHEDULER_Task *die_task = NULL;
 static struct GNUNET_SCHEDULER_Task *op_task = NULL;
+static struct GNUNET_SCHEDULER_Task *it_task = NULL;
 
 struct GNUNET_MESSENGER_Handle *messenger = NULL;
 
+static struct GNUNET_CRYPTO_PrivateKey identity;
+
 static void
 end (void *cls)
 {
   die_task = NULL;
 
+  if (it_task)
+  {
+    GNUNET_SCHEDULER_cancel (it_task);
+    it_task = NULL;
+  }
+
   if (op_task)
   {
     GNUNET_SCHEDULER_cancel (op_task);
@@ -68,6 +77,7 @@ end (void *cls)
   status = 0;
 }
 
+
 static void
 end_badly (void *cls)
 {
@@ -77,12 +87,15 @@ end_badly (void *cls)
   status = 1;
 }
 
+
 static void
 end_operation (void *cls)
 {
   op_task = NULL;
 
-  fprintf (stderr, "Testcase failed (operation: '%s').\n", cls ? (const char*) 
cls : "unknown");
+  fprintf (stderr, "Testcase failed (operation: '%s').\n", cls ? (const
+                                                                  char*) cls :
+           "unknown");
 
   if (die_task)
     GNUNET_SCHEDULER_cancel (die_task);
@@ -91,6 +104,7 @@ end_operation (void *cls)
   status = 1;
 }
 
+
 static int identity_counter = 0;
 
 /**
@@ -100,9 +114,11 @@ static int identity_counter = 0;
  * @param handle Handle of messenger service
  */
 static void
-on_identity (void *cls,
-             struct GNUNET_MESSENGER_Handle *handle)
+on_iteration (void *cls)
 {
+  struct GNUNET_MESSENGER_Handle *handle = cls;
+  it_task = NULL;
+
   if (op_task)
   {
     GNUNET_SCHEDULER_cancel (op_task);
@@ -111,15 +127,23 @@ on_identity (void *cls,
 
   const char *name = GNUNET_MESSENGER_get_name (handle);
 
-  if (0 != strcmp (name, TESTER_NAME))
+  if ((! name) || (0 != strcmp (name, TESTER_NAME)))
   {
     op_task = GNUNET_SCHEDULER_add_now (&end_operation, "name");
     return;
   }
 
-  const struct GNUNET_CRYPTO_PublicKey *key = GNUNET_MESSENGER_get_key 
(handle);
+  const struct GNUNET_CRYPTO_PublicKey *key = GNUNET_MESSENGER_get_key (
+    handle);
 
-  if (((!identity_counter) && (key)) || ((identity_counter) && (!key)))
+  struct GNUNET_CRYPTO_PublicKey pubkey;
+  GNUNET_CRYPTO_key_get_public (&identity, &pubkey);
+
+  if (((! identity_counter) && (key)) || ((identity_counter) && ((! key) ||
+                                                                 (0 !=
+                                                                  
GNUNET_memcmp (
+                                                                    key,
+                                                                    
&pubkey)))))
   {
     op_task = GNUNET_SCHEDULER_add_now (&end_operation, "key");
     return;
@@ -139,10 +163,13 @@ on_identity (void *cls,
     return;
   }
 
-  GNUNET_MESSENGER_update (messenger);
+  GNUNET_MESSENGER_set_key (handle, &identity);
   identity_counter++;
+
+  it_task = GNUNET_SCHEDULER_add_now (&on_iteration, handle);
 }
 
+
 /**
  * Main function for testcase.
  *
@@ -159,10 +186,18 @@ run (void *cls,
 
   identity_counter = 0;
 
-  op_task = GNUNET_SCHEDULER_add_delayed (BASE_TIMEOUT, &end_operation, 
"connect");
-  messenger = GNUNET_MESSENGER_connect (cfg, TESTER_NAME, &on_identity, NULL, 
NULL, NULL);
+  op_task = GNUNET_SCHEDULER_add_delayed (BASE_TIMEOUT, &end_operation,
+                                          "connect");
+  messenger = GNUNET_MESSENGER_connect (cfg, TESTER_NAME, NULL, NULL, NULL);
+
+  identity.type = htonl (GNUNET_PUBLIC_KEY_TYPE_ECDSA);
+  GNUNET_CRYPTO_ecdsa_key_create (&(identity.ecdsa_key));
+
+  if (messenger)
+    it_task = GNUNET_SCHEDULER_add_now (&on_iteration, messenger);
 }
 
+
 /**
  * The main function.
  *
@@ -174,7 +209,8 @@ int
 main (int argc,
       char **argv)
 {
-  if (0 != GNUNET_TESTING_peer_run ("test-messenger", 
"test_messenger_api.conf", &run, NULL))
+  if (0 != GNUNET_TESTING_peer_run ("test-messenger", 
"test_messenger_api.conf",
+                                    &run, NULL))
     return 1;
 
   return status;
diff --git a/src/service/messenger/testing_messenger_setup.h 
b/src/service/messenger/test_messenger_adapt.c
similarity index 54%
copy from src/service/messenger/testing_messenger_setup.h
copy to src/service/messenger/test_messenger_adapt.c
index e5ae0c151..b19634152 100644
--- a/src/service/messenger/testing_messenger_setup.h
+++ b/src/service/messenger/test_messenger_adapt.c
@@ -18,23 +18,32 @@
    SPDX-License-Identifier: AGPL3.0-or-later
  */
 /**
- * @file messenger/testing_messenger_setup.h
+ * @file messenger/test_messenger_adapt.c
  * @author Tobias Frisch
- * @brief A simple test-case setup for the messenger service
+ * @brief Test for the messenger service using cadet API.
  */
 
-#ifndef GNUNET_TESTING_MESSENGER_SETUP_H_
-#define GNUNET_TESTING_MESSENGER_SETUP_H_
+#include "platform.h"
+#include "testing_messenger_setup.h"
 
-struct test_configuration
+/**
+ * The main function.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, 1 on error
+ */
+int
+main (int argc,
+      char **argv)
 {
-  unsigned int count;
-  unsigned int *doors;
-  unsigned int *stages;
-};
+  unsigned int doors  [] = {    5,    1,    2,    3,    6,    7,    8,    4 };
+  unsigned int stages [] = { 0x21, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x21 };
 
-int
-GNUNET_run_messenger_setup (const char* test_name,
-                            const struct test_configuration *cfg);
+  struct test_configuration cfg;
+  cfg.count = 8;
+  cfg.doors = doors;
+  cfg.stages = stages;
 
-#endif /* GNUNET_TESTING_MESSENGER_SETUP_H_ */
+  return GNUNET_run_messenger_setup ("test_messenger_adapt", &cfg);
+}
diff --git a/src/service/messenger/test_messenger_anonymous.c 
b/src/service/messenger/test_messenger_anonymous.c
index 367d1c3b7..d3dadf2c5 100644
--- a/src/service/messenger/test_messenger_anonymous.c
+++ b/src/service/messenger/test_messenger_anonymous.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -43,6 +43,7 @@ static int status = 1;
 
 static struct GNUNET_SCHEDULER_Task *die_task = NULL;
 static struct GNUNET_SCHEDULER_Task *op_task = NULL;
+static struct GNUNET_SCHEDULER_Task *it_task = NULL;
 
 struct GNUNET_MESSENGER_Handle *messenger = NULL;
 
@@ -51,6 +52,12 @@ end (void *cls)
 {
   die_task = NULL;
 
+  if (it_task)
+  {
+    GNUNET_SCHEDULER_cancel (it_task);
+    it_task = NULL;
+  }
+
   if (op_task)
   {
     GNUNET_SCHEDULER_cancel (op_task);
@@ -66,6 +73,7 @@ end (void *cls)
   status = 0;
 }
 
+
 static void
 end_badly (void *cls)
 {
@@ -75,12 +83,15 @@ end_badly (void *cls)
   status = 1;
 }
 
+
 static void
 end_operation (void *cls)
 {
   op_task = NULL;
 
-  fprintf (stderr, "Testcase failed (operation: '%s').\n", cls ? (const char*) 
cls : "unknown");
+  fprintf (stderr, "Testcase failed (operation: '%s').\n", cls ? (const
+                                                                  char*) cls :
+           "unknown");
 
   if (die_task)
     GNUNET_SCHEDULER_cancel (die_task);
@@ -89,6 +100,7 @@ end_operation (void *cls)
   status = 1;
 }
 
+
 /**
  * Function called when an identity is retrieved.
  *
@@ -96,9 +108,12 @@ end_operation (void *cls)
  * @param handle Handle of messenger service
  */
 static void
-on_identity (void *cls,
-             struct GNUNET_MESSENGER_Handle *handle)
+on_iteration (void *cls)
 {
+  struct GNUNET_MESSENGER_Handle *handle = cls;
+
+  it_task = NULL;
+
   if (op_task)
   {
     GNUNET_SCHEDULER_cancel (op_task);
@@ -113,13 +128,8 @@ on_identity (void *cls,
     return;
   }
 
-  if (GNUNET_SYSERR != GNUNET_MESSENGER_update (handle))
-  {
-    op_task = GNUNET_SCHEDULER_add_now (&end_operation, "update-fail");
-    return;
-  }
-
-  const struct GNUNET_CRYPTO_PublicKey *key = GNUNET_MESSENGER_get_key 
(handle);
+  const struct GNUNET_CRYPTO_PublicKey *key = GNUNET_MESSENGER_get_key (
+    handle);
 
   if (key)
   {
@@ -137,6 +147,7 @@ on_identity (void *cls,
   die_task = GNUNET_SCHEDULER_add_now (&end, NULL);
 }
 
+
 /**
  * Main function for testcase.
  *
@@ -151,10 +162,15 @@ run (void *cls,
 {
   die_task = GNUNET_SCHEDULER_add_delayed (TOTAL_TIMEOUT, &end_badly, NULL);
 
-  op_task = GNUNET_SCHEDULER_add_delayed (BASE_TIMEOUT, &end_operation, 
"connect");
-  messenger = GNUNET_MESSENGER_connect (cfg, NULL, &on_identity, NULL, NULL, 
NULL);
+  op_task = GNUNET_SCHEDULER_add_delayed (BASE_TIMEOUT, &end_operation,
+                                          "connect");
+  messenger = GNUNET_MESSENGER_connect (cfg, NULL, NULL, NULL, NULL);
+
+  if (messenger)
+    it_task = GNUNET_SCHEDULER_add_now (&on_iteration, messenger);
 }
 
+
 /**
  * The main function.
  *
@@ -166,7 +182,8 @@ int
 main (int argc,
       char **argv)
 {
-  if (0 != GNUNET_TESTING_peer_run ("test-messenger", 
"test_messenger_api.conf", &run, NULL))
+  if (0 != GNUNET_TESTING_peer_run ("test-messenger", 
"test_messenger_api.conf",
+                                    &run, NULL))
     return 1;
 
   return status;
diff --git a/src/service/messenger/testing_messenger_setup.h 
b/src/service/messenger/test_messenger_async_client.c
similarity index 57%
copy from src/service/messenger/testing_messenger_setup.h
copy to src/service/messenger/test_messenger_async_client.c
index e5ae0c151..580fc1ecb 100644
--- a/src/service/messenger/testing_messenger_setup.h
+++ b/src/service/messenger/test_messenger_async_client.c
@@ -18,23 +18,32 @@
    SPDX-License-Identifier: AGPL3.0-or-later
  */
 /**
- * @file messenger/testing_messenger_setup.h
+ * @file messenger/test_messenger_async_client.c
  * @author Tobias Frisch
- * @brief A simple test-case setup for the messenger service
+ * @brief Test for the messenger service using cadet API.
  */
 
-#ifndef GNUNET_TESTING_MESSENGER_SETUP_H_
-#define GNUNET_TESTING_MESSENGER_SETUP_H_
+#include "platform.h"
+#include "testing_messenger_setup.h"
 
-struct test_configuration
+/**
+ * The main function.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, 1 on error
+ */
+int
+main (int argc,
+      char **argv)
 {
-  unsigned int count;
-  unsigned int *doors;
-  unsigned int *stages;
-};
+  unsigned int doors  [] = {    0,    1 };
+  unsigned int stages [] = { 0x10, 0x20 };
 
-int
-GNUNET_run_messenger_setup (const char* test_name,
-                            const struct test_configuration *cfg);
+  struct test_configuration cfg;
+  cfg.count = 2;
+  cfg.doors = doors;
+  cfg.stages = stages;
 
-#endif /* GNUNET_TESTING_MESSENGER_SETUP_H_ */
+  return GNUNET_run_messenger_setup ("test_messenger_async_client", &cfg);
+}
diff --git a/src/service/messenger/testing_messenger_setup.h 
b/src/service/messenger/test_messenger_async_p2p.c
similarity index 57%
copy from src/service/messenger/testing_messenger_setup.h
copy to src/service/messenger/test_messenger_async_p2p.c
index e5ae0c151..762be9d49 100644
--- a/src/service/messenger/testing_messenger_setup.h
+++ b/src/service/messenger/test_messenger_async_p2p.c
@@ -18,23 +18,32 @@
    SPDX-License-Identifier: AGPL3.0-or-later
  */
 /**
- * @file messenger/testing_messenger_setup.h
+ * @file messenger/test_messenger_async_p2p.c
  * @author Tobias Frisch
- * @brief A simple test-case setup for the messenger service
+ * @brief Test for the messenger service using cadet API.
  */
 
-#ifndef GNUNET_TESTING_MESSENGER_SETUP_H_
-#define GNUNET_TESTING_MESSENGER_SETUP_H_
+#include "platform.h"
+#include "testing_messenger_setup.h"
 
-struct test_configuration
+/**
+ * The main function.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, 1 on error
+ */
+int
+main (int argc,
+      char **argv)
 {
-  unsigned int count;
-  unsigned int *doors;
-  unsigned int *stages;
-};
+  unsigned int doors  [] = {    2,    1 };
+  unsigned int stages [] = { 0x30, 0x30 };
 
-int
-GNUNET_run_messenger_setup (const char* test_name,
-                            const struct test_configuration *cfg);
+  struct test_configuration cfg;
+  cfg.count = 2;
+  cfg.doors = doors;
+  cfg.stages = stages;
 
-#endif /* GNUNET_TESTING_MESSENGER_SETUP_H_ */
+  return GNUNET_run_messenger_setup ("test_messenger_async_p2p", &cfg);
+}
diff --git a/src/service/messenger/testing_messenger_setup.h 
b/src/service/messenger/test_messenger_growth.c
similarity index 54%
copy from src/service/messenger/testing_messenger_setup.h
copy to src/service/messenger/test_messenger_growth.c
index e5ae0c151..4a73e559d 100644
--- a/src/service/messenger/testing_messenger_setup.h
+++ b/src/service/messenger/test_messenger_growth.c
@@ -18,23 +18,32 @@
    SPDX-License-Identifier: AGPL3.0-or-later
  */
 /**
- * @file messenger/testing_messenger_setup.h
+ * @file messenger/test_messenger_growth.c
  * @author Tobias Frisch
- * @brief A simple test-case setup for the messenger service
+ * @brief Test for the messenger service using cadet API.
  */
 
-#ifndef GNUNET_TESTING_MESSENGER_SETUP_H_
-#define GNUNET_TESTING_MESSENGER_SETUP_H_
+#include "platform.h"
+#include "testing_messenger_setup.h"
 
-struct test_configuration
+/**
+ * The main function.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, 1 on error
+ */
+int
+main (int argc,
+      char **argv)
 {
-  unsigned int count;
-  unsigned int *doors;
-  unsigned int *stages;
-};
+  unsigned int doors  [] = {    0,    1,    1,    1,    1,    1,    1,    1 };
+  unsigned int stages [] = { 0x01, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21 };
 
-int
-GNUNET_run_messenger_setup (const char* test_name,
-                            const struct test_configuration *cfg);
+  struct test_configuration cfg;
+  cfg.count = 8;
+  cfg.doors = doors;
+  cfg.stages = stages;
 
-#endif /* GNUNET_TESTING_MESSENGER_SETUP_H_ */
+  return GNUNET_run_messenger_setup ("test_messenger_growth", &cfg);
+}
diff --git a/src/service/messenger/testing_messenger_setup.h 
b/src/service/messenger/test_messenger_ring.c
similarity index 55%
copy from src/service/messenger/testing_messenger_setup.h
copy to src/service/messenger/test_messenger_ring.c
index e5ae0c151..c6b17861e 100644
--- a/src/service/messenger/testing_messenger_setup.h
+++ b/src/service/messenger/test_messenger_ring.c
@@ -18,23 +18,32 @@
    SPDX-License-Identifier: AGPL3.0-or-later
  */
 /**
- * @file messenger/testing_messenger_setup.h
+ * @file messenger/test_messenger_ring.c
  * @author Tobias Frisch
- * @brief A simple test-case setup for the messenger service
+ * @brief Test for the messenger service using cadet API.
  */
 
-#ifndef GNUNET_TESTING_MESSENGER_SETUP_H_
-#define GNUNET_TESTING_MESSENGER_SETUP_H_
+#include "platform.h"
+#include "testing_messenger_setup.h"
 
-struct test_configuration
+/**
+ * The main function.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, 1 on error
+ */
+int
+main (int argc,
+      char **argv)
 {
-  unsigned int count;
-  unsigned int *doors;
-  unsigned int *stages;
-};
+  unsigned int doors  [] = {    8,    1,    2,    3,    4,    5,    6,    7 };
+  unsigned int stages [] = { 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21 };
 
-int
-GNUNET_run_messenger_setup (const char* test_name,
-                            const struct test_configuration *cfg);
+  struct test_configuration cfg;
+  cfg.count = 8;
+  cfg.doors = doors;
+  cfg.stages = stages;
 
-#endif /* GNUNET_TESTING_MESSENGER_SETUP_H_ */
+  return GNUNET_run_messenger_setup ("test_messenger_ring", &cfg);
+}
diff --git a/src/service/messenger/testing_messenger_setup.h 
b/src/service/messenger/test_messenger_server.c
similarity index 54%
copy from src/service/messenger/testing_messenger_setup.h
copy to src/service/messenger/test_messenger_server.c
index e5ae0c151..fdd9a3684 100644
--- a/src/service/messenger/testing_messenger_setup.h
+++ b/src/service/messenger/test_messenger_server.c
@@ -18,23 +18,32 @@
    SPDX-License-Identifier: AGPL3.0-or-later
  */
 /**
- * @file messenger/testing_messenger_setup.h
+ * @file messenger/test_messenger_server.c
  * @author Tobias Frisch
- * @brief A simple test-case setup for the messenger service
+ * @brief Test for the messenger service using cadet API.
  */
 
-#ifndef GNUNET_TESTING_MESSENGER_SETUP_H_
-#define GNUNET_TESTING_MESSENGER_SETUP_H_
+#include "platform.h"
+#include "testing_messenger_setup.h"
 
-struct test_configuration
+/**
+ * The main function.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, 1 on error
+ */
+int
+main (int argc,
+      char **argv)
 {
-  unsigned int count;
-  unsigned int *doors;
-  unsigned int *stages;
-};
+  unsigned int doors  [] = {    0,    1,    1,    1,    1,    1,    1,    1 };
+  unsigned int stages [] = { 0x01, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
 
-int
-GNUNET_run_messenger_setup (const char* test_name,
-                            const struct test_configuration *cfg);
+  struct test_configuration cfg;
+  cfg.count = 8;
+  cfg.doors = doors;
+  cfg.stages = stages;
 
-#endif /* GNUNET_TESTING_MESSENGER_SETUP_H_ */
+  return GNUNET_run_messenger_setup ("test_messenger_server", &cfg);
+}
diff --git a/src/service/messenger/testing_messenger_setup.h 
b/src/service/messenger/test_messenger_sync_client.c
similarity index 57%
copy from src/service/messenger/testing_messenger_setup.h
copy to src/service/messenger/test_messenger_sync_client.c
index e5ae0c151..74c9548bc 100644
--- a/src/service/messenger/testing_messenger_setup.h
+++ b/src/service/messenger/test_messenger_sync_client.c
@@ -18,23 +18,32 @@
    SPDX-License-Identifier: AGPL3.0-or-later
  */
 /**
- * @file messenger/testing_messenger_setup.h
+ * @file messenger/test_messenger_sync_client.c
  * @author Tobias Frisch
- * @brief A simple test-case setup for the messenger service
+ * @brief Test for the messenger service using cadet API.
  */
 
-#ifndef GNUNET_TESTING_MESSENGER_SETUP_H_
-#define GNUNET_TESTING_MESSENGER_SETUP_H_
+#include "platform.h"
+#include "testing_messenger_setup.h"
 
-struct test_configuration
+/**
+ * The main function.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, 1 on error
+ */
+int
+main (int argc,
+      char **argv)
 {
-  unsigned int count;
-  unsigned int *doors;
-  unsigned int *stages;
-};
+  unsigned int doors  [] = {    0,    1 };
+  unsigned int stages [] = { 0x01, 0x20 };
 
-int
-GNUNET_run_messenger_setup (const char* test_name,
-                            const struct test_configuration *cfg);
+  struct test_configuration cfg;
+  cfg.count = 2;
+  cfg.doors = doors;
+  cfg.stages = stages;
 
-#endif /* GNUNET_TESTING_MESSENGER_SETUP_H_ */
+  return GNUNET_run_messenger_setup ("test_messenger_sync_client", &cfg);
+}
diff --git a/src/service/messenger/testing_messenger_setup.h 
b/src/service/messenger/test_messenger_sync_p2p.c
similarity index 57%
copy from src/service/messenger/testing_messenger_setup.h
copy to src/service/messenger/test_messenger_sync_p2p.c
index e5ae0c151..299d5ff68 100644
--- a/src/service/messenger/testing_messenger_setup.h
+++ b/src/service/messenger/test_messenger_sync_p2p.c
@@ -18,23 +18,32 @@
    SPDX-License-Identifier: AGPL3.0-or-later
  */
 /**
- * @file messenger/testing_messenger_setup.h
+ * @file messenger/test_messenger_sync_p2p.c
  * @author Tobias Frisch
- * @brief A simple test-case setup for the messenger service
+ * @brief Test for the messenger service using cadet API.
  */
 
-#ifndef GNUNET_TESTING_MESSENGER_SETUP_H_
-#define GNUNET_TESTING_MESSENGER_SETUP_H_
+#include "platform.h"
+#include "testing_messenger_setup.h"
 
-struct test_configuration
+/**
+ * The main function.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, 1 on error
+ */
+int
+main (int argc,
+      char **argv)
 {
-  unsigned int count;
-  unsigned int *doors;
-  unsigned int *stages;
-};
+  unsigned int doors  [] = {    2,    1 };
+  unsigned int stages [] = { 0x21, 0x21 };
 
-int
-GNUNET_run_messenger_setup (const char* test_name,
-                            const struct test_configuration *cfg);
+  struct test_configuration cfg;
+  cfg.count = 2;
+  cfg.doors = doors;
+  cfg.stages = stages;
 
-#endif /* GNUNET_TESTING_MESSENGER_SETUP_H_ */
+  return GNUNET_run_messenger_setup ("test_messenger_sync_p2p", &cfg);
+}
diff --git a/src/service/messenger/testing_messenger_setup.h 
b/src/service/messenger/test_messenger_worst_client.c
similarity index 57%
copy from src/service/messenger/testing_messenger_setup.h
copy to src/service/messenger/test_messenger_worst_client.c
index e5ae0c151..ab535b876 100644
--- a/src/service/messenger/testing_messenger_setup.h
+++ b/src/service/messenger/test_messenger_worst_client.c
@@ -18,23 +18,32 @@
    SPDX-License-Identifier: AGPL3.0-or-later
  */
 /**
- * @file messenger/testing_messenger_setup.h
+ * @file messenger/test_messenger_worst_client.c
  * @author Tobias Frisch
- * @brief A simple test-case setup for the messenger service
+ * @brief Test for the messenger service using cadet API.
  */
 
-#ifndef GNUNET_TESTING_MESSENGER_SETUP_H_
-#define GNUNET_TESTING_MESSENGER_SETUP_H_
+#include "platform.h"
+#include "testing_messenger_setup.h"
 
-struct test_configuration
+/**
+ * The main function.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, 1 on error
+ */
+int
+main (int argc,
+      char **argv)
 {
-  unsigned int count;
-  unsigned int *doors;
-  unsigned int *stages;
-};
+  unsigned int doors  [] = {    0,    1 };
+  unsigned int stages [] = { 0x10, 0x02 };
 
-int
-GNUNET_run_messenger_setup (const char* test_name,
-                            const struct test_configuration *cfg);
+  struct test_configuration cfg;
+  cfg.count = 2;
+  cfg.doors = doors;
+  cfg.stages = stages;
 
-#endif /* GNUNET_TESTING_MESSENGER_SETUP_H_ */
+  return GNUNET_run_messenger_setup ("test_messenger_worst_client", &cfg);
+}
diff --git a/src/service/messenger/testing_messenger_setup.h 
b/src/service/messenger/test_messenger_worst_p2p.c
similarity index 57%
copy from src/service/messenger/testing_messenger_setup.h
copy to src/service/messenger/test_messenger_worst_p2p.c
index e5ae0c151..0af9489a4 100644
--- a/src/service/messenger/testing_messenger_setup.h
+++ b/src/service/messenger/test_messenger_worst_p2p.c
@@ -18,23 +18,32 @@
    SPDX-License-Identifier: AGPL3.0-or-later
  */
 /**
- * @file messenger/testing_messenger_setup.h
+ * @file messenger/test_messenger_worst_p2p.c
  * @author Tobias Frisch
- * @brief A simple test-case setup for the messenger service
+ * @brief Test for the messenger service using cadet API.
  */
 
-#ifndef GNUNET_TESTING_MESSENGER_SETUP_H_
-#define GNUNET_TESTING_MESSENGER_SETUP_H_
+#include "platform.h"
+#include "testing_messenger_setup.h"
 
-struct test_configuration
+/**
+ * The main function.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, 1 on error
+ */
+int
+main (int argc,
+      char **argv)
 {
-  unsigned int count;
-  unsigned int *doors;
-  unsigned int *stages;
-};
+  unsigned int doors  [] = {    2,    1 };
+  unsigned int stages [] = { 0x12, 0x12 };
 
-int
-GNUNET_run_messenger_setup (const char* test_name,
-                            const struct test_configuration *cfg);
+  struct test_configuration cfg;
+  cfg.count = 2;
+  cfg.doors = doors;
+  cfg.stages = stages;
 
-#endif /* GNUNET_TESTING_MESSENGER_SETUP_H_ */
+  return GNUNET_run_messenger_setup ("test_messenger_worst_p2p", &cfg);
+}
diff --git a/src/service/messenger/testing_messenger_barrier.c 
b/src/service/messenger/testing_messenger_barrier.c
index 60d1fc0fe..ecebe1582 100644
--- a/src/service/messenger/testing_messenger_barrier.c
+++ b/src/service/messenger/testing_messenger_barrier.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2021 GNUnet e.V.
+   Copyright (C) 2021, 2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -35,7 +35,7 @@ struct GNUNET_BarrierHandle
   struct GNUNET_BarrierWaitHandle *head;
   struct GNUNET_BarrierWaitHandle *tail;
 
-  struct GNUNET_SCHEDULER_Task* task;
+  struct GNUNET_SCHEDULER_Task *task;
 };
 
 struct GNUNET_BarrierHandle*
@@ -46,9 +46,10 @@ GNUNET_init_barrier (unsigned int requirement,
   if (0 == requirement)
     return NULL;
 
-  struct GNUNET_BarrierHandle *barrier = GNUNET_new(struct 
GNUNET_BarrierHandle);
+  struct GNUNET_BarrierHandle *barrier = GNUNET_new (struct
+                                                     GNUNET_BarrierHandle);
 
-  if (!barrier)
+  if (! barrier)
     return NULL;
 
   barrier->requirement = requirement;
@@ -61,6 +62,7 @@ GNUNET_init_barrier (unsigned int requirement,
   return barrier;
 }
 
+
 static void
 exit_status (struct GNUNET_BarrierHandle *barrier,
              int status);
@@ -71,21 +73,24 @@ cancel_barrier (void *cls)
   exit_status ((struct GNUNET_BarrierHandle*) cls, GNUNET_SYSERR);
 }
 
+
 static void
 complete_barrier (void *cls)
 {
   exit_status ((struct GNUNET_BarrierHandle*) cls, GNUNET_OK);
 }
 
+
 void
 GNUNET_cancel_barrier (struct GNUNET_BarrierHandle *barrier)
 {
-  if ((!barrier) || (barrier->task))
+  if ((! barrier) || (barrier->task))
     return;
 
-  barrier->task = GNUNET_SCHEDULER_add_now(cancel_barrier, barrier);
+  barrier->task = GNUNET_SCHEDULER_add_now (cancel_barrier, barrier);
 }
 
+
 struct GNUNET_BarrierWaitHandle
 {
   GNUNET_BarrierWaitStatusCallback cb;
@@ -107,31 +112,33 @@ exit_status (struct GNUNET_BarrierHandle *barrier,
     struct GNUNET_BarrierWaitHandle *current = waiting;
 
     if (current->cb)
-      current->cb(current->cls, current, status);
+      current->cb (current->cls, current, status);
 
     waiting = waiting->next;
 
-    GNUNET_CONTAINER_DLL_remove(barrier->head, barrier->tail, current);
-    GNUNET_free(current);
+    GNUNET_CONTAINER_DLL_remove (barrier->head, barrier->tail, current);
+    GNUNET_free (current);
   }
 
   if (barrier->cb)
-    barrier->cb(barrier->cls, barrier, status);
+    barrier->cb (barrier->cls, barrier, status);
 
-  GNUNET_free(barrier);
+  GNUNET_free (barrier);
 }
 
+
 struct GNUNET_BarrierWaitHandle*
 GNUNET_wait_barrier (struct GNUNET_BarrierHandle *barrier,
                      GNUNET_BarrierWaitStatusCallback cb,
                      void *cb_cls)
 {
-  if ((!barrier) || (0 == barrier->requirement))
+  if ((! barrier) || (0 == barrier->requirement))
     return NULL;
 
-  struct GNUNET_BarrierWaitHandle *waiting = GNUNET_new(struct 
GNUNET_BarrierWaitHandle);
+  struct GNUNET_BarrierWaitHandle *waiting = GNUNET_new (struct
+                                                         
GNUNET_BarrierWaitHandle);
 
-  if (!waiting)
+  if (! waiting)
     return NULL;
 
   waiting->cb = cb;
@@ -140,34 +147,35 @@ GNUNET_wait_barrier (struct GNUNET_BarrierHandle *barrier,
   waiting->next = NULL;
   waiting->barrier = barrier;
 
-  GNUNET_CONTAINER_DLL_insert_tail(barrier->head, barrier->tail, waiting);
+  GNUNET_CONTAINER_DLL_insert_tail (barrier->head, barrier->tail, waiting);
   barrier->requirement--;
 
-  if ((barrier->requirement == 0) && (!barrier->task))
-    barrier->task = GNUNET_SCHEDULER_add_now(complete_barrier, barrier);
+  if ((barrier->requirement == 0) && (! barrier->task))
+    barrier->task = GNUNET_SCHEDULER_add_now (complete_barrier, barrier);
 
   return waiting;
 }
 
+
 void
 GNUNET_cancel_wait_barrier (struct GNUNET_BarrierWaitHandle *waiting)
 {
-  if (!waiting)
+  if (! waiting)
     return;
 
   struct GNUNET_BarrierHandle *barrier = waiting->barrier;
 
-  if (!barrier)
+  if (! barrier)
     return;
 
   if ((barrier->requirement == 0) && (barrier->task))
   {
-    GNUNET_SCHEDULER_cancel(barrier->task);
+    GNUNET_SCHEDULER_cancel (barrier->task);
     barrier->task = NULL;
   }
 
   barrier->requirement++;
-  GNUNET_CONTAINER_DLL_remove(barrier->head, barrier->tail, waiting);
+  GNUNET_CONTAINER_DLL_remove (barrier->head, barrier->tail, waiting);
 
-  GNUNET_free(waiting);
+  GNUNET_free (waiting);
 }
diff --git a/src/service/messenger/testing_messenger_setup.c 
b/src/service/messenger/testing_messenger_setup.c
index 65cf12e73..e4dfa203f 100644
--- a/src/service/messenger/testing_messenger_setup.c
+++ b/src/service/messenger/testing_messenger_setup.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 GNUnet e.V.
+   Copyright (C) 2020--2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -39,7 +39,8 @@
 
 struct test_properties;
 
-struct test_peer {
+struct test_peer
+{
   struct test_properties *props;
   unsigned int num;
 
@@ -53,12 +54,13 @@ struct test_peer {
   struct GNUNET_MESSENGER_Handle *handle;
   struct GNUNET_MESSENGER_Room *room;
 
-  unsigned int peer_messages;
+  struct GNUNET_CONTAINER_MultiPeerMap *map;
 
   const char *message;
 };
 
-struct test_properties {
+struct test_properties
+{
   const struct test_configuration *cfg;
 
   unsigned int num_hosts;
@@ -79,15 +81,14 @@ shutdown_cb (void *cls)
 {
   struct test_properties *properties = cls;
 
-
   for (unsigned int i = 0; i < properties->num_peer; i++)
   {
     struct test_peer *peer = &properties->peers[i];
 
-    GNUNET_assert(peer != NULL);
+    GNUNET_assert (peer != NULL);
 
     if (peer->op_task)
-      GNUNET_SCHEDULER_cancel(peer->op_task);
+      GNUNET_SCHEDULER_cancel (peer->op_task);
 
     peer->op_task = NULL;
 
@@ -97,7 +98,7 @@ shutdown_cb (void *cls)
     peer->op = NULL;
 
     if (peer->wait)
-      GNUNET_cancel_wait_barrier(peer->wait);
+      GNUNET_cancel_wait_barrier (peer->wait);
 
     peer->wait = NULL;
 
@@ -109,29 +110,31 @@ shutdown_cb (void *cls)
     if (peer->handle)
       GNUNET_MESSENGER_disconnect (peer->handle);
 
+    if (peer->map)
+      GNUNET_CONTAINER_multipeermap_destroy (peer->map);
+
     peer->handle = NULL;
   }
 
   if (properties->die_task)
-    GNUNET_SCHEDULER_cancel(properties->die_task);
+    GNUNET_SCHEDULER_cancel (properties->die_task);
 
   properties->die_task = NULL;
   properties->end_task = NULL;
 
   if (properties->barrier)
-    GNUNET_cancel_barrier(properties->barrier);
+    GNUNET_cancel_barrier (properties->barrier);
 
   properties->barrier = NULL;
 }
 
 
-
 static void
 end_cb (void *cls)
 {
   struct test_properties *properties = cls;
 
-  GNUNET_assert(properties != NULL);
+  GNUNET_assert (properties != NULL);
 
   properties->die_task = NULL;
 
@@ -141,15 +144,17 @@ end_cb (void *cls)
   {
     struct test_peer *peer = &properties->peers[i];
 
-    GNUNET_assert(peer != NULL);
+    GNUNET_assert (peer != NULL);
 
-    const int members = GNUNET_MESSENGER_iterate_members(peer->room, NULL, 
NULL);
+    const int members = GNUNET_MESSENGER_iterate_members (peer->room, NULL,
+                                                          NULL);
 
     GNUNET_assert (members >= 0);
 
     if (peer->props->num_peer != (unsigned int) members)
     {
-      fprintf (stderr, "Testcase failed (members: %d/%u).\n", members, 
peer->props->num_peer);
+      fprintf (stderr, "Testcase failed (members: %d/%u).\n", members,
+               peer->props->num_peer);
       status = 1;
       break;
     }
@@ -160,12 +165,13 @@ end_cb (void *cls)
   properties->status = status;
 }
 
+
 static void
 end_badly_cb (void *cls)
 {
   struct test_properties *properties = cls;
 
-  GNUNET_assert(properties != NULL);
+  GNUNET_assert (properties != NULL);
 
   fprintf (stderr, "Testcase failed (timeout).\n");
 
@@ -174,12 +180,13 @@ end_badly_cb (void *cls)
   properties->status = 1;
 }
 
+
 static void
 end_operation_cb (void *cls)
 {
   struct test_peer *peer = cls;
 
-  GNUNET_assert(peer != NULL);
+  GNUNET_assert (peer != NULL);
 
   peer->op_task = NULL;
 
@@ -188,12 +195,13 @@ end_operation_cb (void *cls)
   GNUNET_SCHEDULER_shutdown ();
 }
 
+
 static void
 end_error_cb (void *cls)
 {
   struct test_peer *peer = cls;
 
-  GNUNET_assert(peer != NULL);
+  GNUNET_assert (peer != NULL);
 
   peer->op_task = NULL;
 
@@ -203,6 +211,7 @@ end_error_cb (void *cls)
   GNUNET_SCHEDULER_shutdown ();
 }
 
+
 static void
 barrier2_wait_cb (void *cls,
                   struct GNUNET_BarrierWaitHandle *waiting,
@@ -210,12 +219,13 @@ barrier2_wait_cb (void *cls,
 {
   struct test_peer *peer = cls;
 
-  GNUNET_assert(peer != NULL);
+  GNUNET_assert (peer != NULL);
 
   if (peer->wait == waiting)
     peer->wait = NULL;
 }
 
+
 static void
 barrier_wait_cb (void *cls,
                  struct GNUNET_BarrierWaitHandle *waiting,
@@ -223,7 +233,7 @@ barrier_wait_cb (void *cls,
 {
   struct test_peer *peer = cls;
 
-  GNUNET_assert(peer != NULL);
+  GNUNET_assert (peer != NULL);
 
   if (peer->wait == waiting)
     peer->wait = NULL;
@@ -233,7 +243,8 @@ barrier_wait_cb (void *cls,
     unsigned int door = peer->props->cfg->doors[peer->num - 1];
 
     if (door == 0)
-      door = GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK, 
peer->props->cfg->count);
+      door = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
+                                       peer->props->cfg->count);
     else
       door = door - 1;
 
@@ -241,17 +252,20 @@ barrier_wait_cb (void *cls,
     GNUNET_CRYPTO_hash (TEST_ROOM, sizeof(TEST_ROOM), &hash);
 
     struct GNUNET_MESSENGER_Room *room;
-    room = GNUNET_MESSENGER_enter_room(peer->handle, 
&(peer->props->peers[door].peer_id), &hash);
+    room = GNUNET_MESSENGER_enter_room (peer->handle,
+                                        &(peer->props->peers[door].peer_id),
+                                        &hash);
 
     if (peer->room)
-      GNUNET_assert(room == peer->room);
+      GNUNET_assert (room == peer->room);
     else
-      GNUNET_assert(room != NULL);
+      GNUNET_assert (room != NULL);
 
     peer->room = room;
   }
 }
 
+
 /**
  * Function called whenever a message is received or sent.
  *
@@ -272,40 +286,48 @@ on_message (void *cls,
 {
   struct test_peer *peer = cls;
 
-  GNUNET_assert(peer != NULL);
+  GNUNET_assert (peer != NULL);
 
   fprintf (stderr, "Peer: %s; [%s] Message: %s (%s)\n",
-           GNUNET_i2s(&(peer->peer_id)),
-           GNUNET_sh2s(&(message->header.sender_id)),
-           GNUNET_MESSENGER_name_of_kind(message->header.kind),
-           GNUNET_h2s(hash));
+           GNUNET_i2s (&(peer->peer_id)),
+           GNUNET_sh2s (&(message->header.sender_id)),
+           GNUNET_MESSENGER_name_of_kind (message->header.kind),
+           GNUNET_h2s (hash));
 
   if (GNUNET_MESSENGER_KIND_PEER == message->header.kind)
-    peer->peer_messages++;
-
-  if (peer->props->num_hosts == peer->peer_messages)
-    peer->wait = GNUNET_wait_barrier (peer->props->barrier, &barrier2_wait_cb, 
peer);
-  else if (peer->props->num_hosts < peer->peer_messages)
+    GNUNET_CONTAINER_multipeermap_put (peer->map, &(message->body.peer.peer),
+                                       NULL,
+                                       
GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE);
+
+  const int members = GNUNET_MESSENGER_iterate_members (peer->room, NULL, 
NULL);
+
+  const uint32_t num_peers = GNUNET_CONTAINER_multipeermap_size (peer->map);
+  if ((members == peer->props->num_peer) && (peer->props->num_hosts ==
+                                             num_peers))
+    peer->wait = GNUNET_wait_barrier (peer->props->barrier, &barrier2_wait_cb,
+                                      peer);
+  else if (peer->props->num_hosts < num_peers)
   {
     if (peer->wait)
-      GNUNET_cancel_wait_barrier(peer->wait);
+      GNUNET_cancel_wait_barrier (peer->wait);
 
     peer->wait = NULL;
 
     if (peer->op_task)
-      GNUNET_SCHEDULER_cancel(peer->op_task);
+      GNUNET_SCHEDULER_cancel (peer->op_task);
 
     peer->message = "peer";
     peer->op_task = GNUNET_SCHEDULER_add_now (&end_operation_cb, peer);
   }
 }
 
+
 static void
 second_stage (void *cls)
 {
   struct test_peer *peer = cls;
 
-  GNUNET_assert(peer != NULL);
+  GNUNET_assert (peer != NULL);
 
   peer->op_task = NULL;
 
@@ -318,9 +340,9 @@ second_stage (void *cls)
     room = GNUNET_MESSENGER_open_room (peer->handle, &hash);
 
     if (peer->room)
-      GNUNET_assert(room == peer->room);
+      GNUNET_assert (room == peer->room);
     else
-      GNUNET_assert(room != NULL);
+      GNUNET_assert (room != NULL);
 
     peer->room = room;
   }
@@ -330,22 +352,26 @@ second_stage (void *cls)
     unsigned int door = peer->props->cfg->doors[peer->num - 1];
 
     if (door == 0)
-      door = GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK, 
peer->props->cfg->count);
+      door = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
+                                       peer->props->cfg->count);
     else
       door = door - 1;
 
     struct GNUNET_MESSENGER_Room *room;
-    room = GNUNET_MESSENGER_enter_room(peer->handle, 
&(peer->props->peers[door].peer_id), &hash);
+    room = GNUNET_MESSENGER_enter_room (peer->handle,
+                                        &(peer->props->peers[door].peer_id),
+                                        &hash);
 
     if (peer->room)
-      GNUNET_assert(room == peer->room);
+      GNUNET_assert (room == peer->room);
     else
-      GNUNET_assert(room != NULL);
+      GNUNET_assert (room != NULL);
 
     peer->room = room;
   }
 }
 
+
 static void
 on_peer (void *cb_cls,
          struct GNUNET_TESTBED_Operation *op,
@@ -354,16 +380,16 @@ on_peer (void *cb_cls,
 {
   struct test_peer *peer = cb_cls;
 
-  GNUNET_assert(peer != NULL);
+  GNUNET_assert (peer != NULL);
 
   if (emsg)
   {
-    peer->message = GNUNET_strdup(emsg);
+    peer->message = GNUNET_strdup (emsg);
     peer->op_task = GNUNET_SCHEDULER_add_now (&end_error_cb, peer);
     return;
   }
 
-  if (!pinfo)
+  if (! pinfo)
   {
     peer->message = "info";
     peer->op_task = GNUNET_SCHEDULER_add_now (&end_operation_cb, peer);
@@ -377,11 +403,12 @@ on_peer (void *cb_cls,
     return;
   }
 
-  peer->handle = GNUNET_MESSENGER_connect (pinfo->result.cfg, TEST_NAME, NULL, 
NULL, &on_message, peer);
+  peer->handle = GNUNET_MESSENGER_connect (pinfo->result.cfg, TEST_NAME, NULL,
+                                           &on_message, peer);
 
-  GNUNET_assert(GNUNET_OK == GNUNET_CRYPTO_get_peer_identity(
-      pinfo->result.cfg, &(peer->peer_id)
-  ));
+  GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_get_peer_identity (
+                   pinfo->result.cfg, &(peer->peer_id)
+                   ));
 
   if (0 != (peer->props->cfg->stages[peer->num - 1] & 0x01))
   {
@@ -390,14 +417,16 @@ on_peer (void *cb_cls,
 
     peer->room = GNUNET_MESSENGER_open_room (peer->handle, &hash);
 
-    GNUNET_assert(peer->room != NULL);
+    GNUNET_assert (peer->room != NULL);
   }
   else
     peer->room = NULL;
 
-  peer->wait = GNUNET_wait_barrier (peer->props->barrier, &barrier_wait_cb, 
peer);
+  peer->wait = GNUNET_wait_barrier (peer->props->barrier, &barrier_wait_cb,
+                                    peer);
 }
 
+
 /**
  * Main function for a peer of the testcase.
  *
@@ -410,7 +439,7 @@ run (void *cls,
 {
   struct test_properties *properties = cls;
 
-  GNUNET_assert(properties != NULL);
+  GNUNET_assert (properties != NULL);
 
   if (GNUNET_TESTBED_ET_PEER_START != event->type)
   {
@@ -426,9 +455,15 @@ run (void *cls,
   peer->num = properties->num_peer;
 
   peer->peer = event->details.peer_start.peer;
-  peer->op = GNUNET_TESTBED_peer_get_information (peer->peer, 
GNUNET_TESTBED_PIT_CONFIGURATION, on_peer, peer);
+  peer->op = GNUNET_TESTBED_peer_get_information (peer->peer,
+                                                  
GNUNET_TESTBED_PIT_CONFIGURATION,
+                                                  on_peer, peer);
+
+  peer->map = GNUNET_CONTAINER_multipeermap_create (peer->props->num_hosts,
+                                                    GNUNET_NO);
 }
 
+
 static void
 barrier2_cb (void *cls,
              struct GNUNET_BarrierHandle *barrier,
@@ -436,7 +471,7 @@ barrier2_cb (void *cls,
 {
   struct test_properties *properties = cls;
 
-  GNUNET_assert(properties != NULL);
+  GNUNET_assert (properties != NULL);
 
   if (properties->barrier == barrier)
     properties->barrier = NULL;
@@ -451,15 +486,17 @@ barrier2_cb (void *cls,
   else if (GNUNET_OK == status)
   {
     if (properties->die_task)
-      GNUNET_SCHEDULER_cancel(properties->die_task);
+      GNUNET_SCHEDULER_cancel (properties->die_task);
 
     properties->die_task = GNUNET_SCHEDULER_add_delayed (
-        GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 
properties->cfg->count),
-        &end_cb, properties
-    );
+      GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
+                                     properties->cfg->count),
+      &end_cb, properties
+      );
   }
 }
 
+
 static void
 barrier_cb (void *cls,
             struct GNUNET_BarrierHandle *barrier,
@@ -467,11 +504,11 @@ barrier_cb (void *cls,
 {
   struct test_properties *properties = cls;
 
-  GNUNET_assert(properties != NULL);
+  GNUNET_assert (properties != NULL);
 
   if (properties->barrier == barrier)
     properties->barrier = NULL;
-  else if (!properties->barrier)
+  else if (! properties->barrier)
     return;
 
   if (properties->num_peer != properties->cfg->count)
@@ -491,13 +528,17 @@ barrier_cb (void *cls,
   }
   else if (GNUNET_OK == status)
   {
-    properties->barrier = GNUNET_init_barrier (properties->num_peer, 
&barrier2_cb, properties);
+    properties->barrier = GNUNET_init_barrier (properties->num_peer,
+                                               &barrier2_cb, properties);
 
     for (unsigned int i = 0; i < properties->num_peer; i++)
-      properties->peers[i].op_task = GNUNET_SCHEDULER_add_now (&second_stage, 
&(properties->peers[i]));
+      properties->peers[i].op_task = GNUNET_SCHEDULER_add_now (&second_stage,
+                                                               &(properties->
+                                                                 peers[i]));
   }
 }
 
+
 static void
 init (void *cls,
       struct GNUNET_TESTBED_RunHandle *h,
@@ -508,40 +549,46 @@ init (void *cls,
 {
   struct test_properties *properties = cls;
 
-  GNUNET_assert(properties != NULL);
+  GNUNET_assert (properties != NULL);
 
-  properties->end_task = GNUNET_SCHEDULER_add_shutdown(&shutdown_cb, 
properties);
+  properties->end_task = GNUNET_SCHEDULER_add_shutdown (&shutdown_cb,
+                                                        properties);
   properties->die_task = GNUNET_SCHEDULER_add_delayed (
-      GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 
properties->cfg->count * 5),
-      &end_badly_cb, properties
-  );
+    GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
+                                   properties->cfg->count * 5),
+    &end_badly_cb, properties
+    );
 }
 
+
 int
-GNUNET_run_messenger_setup (const char* test_name,
+GNUNET_run_messenger_setup (const char *test_name,
                             const struct test_configuration *cfg)
 {
   struct test_properties properties;
-  memset(&properties, 0, sizeof(properties));
+  memset (&properties, 0, sizeof(properties));
 
   properties.cfg = cfg;
-  properties.peers = GNUNET_new_array(cfg->count, struct test_peer);
+  properties.peers = GNUNET_new_array (cfg->count, struct test_peer);
 
   for (unsigned int i = 0; i < cfg->count; i++)
     if (0 != (cfg->stages[i] & 0x11))
       properties.num_hosts++;
 
   properties.status = 1;
-  properties.barrier = GNUNET_init_barrier (cfg->count, &barrier_cb, 
&properties);
+  properties.barrier = GNUNET_init_barrier (cfg->count, &barrier_cb,
+                                            &properties);
 
-  if (GNUNET_OK != GNUNET_TESTBED_test_run (test_name, 
"test_messenger_api.conf",
+  if (GNUNET_OK != GNUNET_TESTBED_test_run (test_name,
+                                            "test_messenger_api.conf",
                                             cfg->count,
-                                            (1LL << 
GNUNET_TESTBED_ET_PEER_START),
+                                            (1LL <<
+                                             GNUNET_TESTBED_ET_PEER_START),
                                             &run, &properties,
                                             &init, &properties))
     return 1;
 
-  GNUNET_free(properties.peers);
+  GNUNET_free (properties.peers);
 
   return properties.status;
 }
diff --git a/src/service/messenger/testing_messenger_setup.h 
b/src/service/messenger/testing_messenger_setup.h
index e5ae0c151..d2e72b51f 100644
--- a/src/service/messenger/testing_messenger_setup.h
+++ b/src/service/messenger/testing_messenger_setup.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2021 GNUnet e.V.
+   Copyright (C) 2021, 2023 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -34,7 +34,7 @@ struct test_configuration
 };
 
 int
-GNUNET_run_messenger_setup (const char* test_name,
+GNUNET_run_messenger_setup (const char *test_name,
                             const struct test_configuration *cfg);
 
 #endif /* GNUNET_TESTING_MESSENGER_SETUP_H_ */

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]