diff --git a/src/openvpn/forward.h b/src/openvpn/forward.h
index 375635b..2b29f69 100644
--- a/src/openvpn/forward.h
+++ b/src/openvpn/forward.h
@@ -73,8 +73,7 @@
  * Evaluates the current I/O state (`flags`) and context mode to determine
  * which READ or WRITE events to register in the event loop.
  *
- * @note This function gets called from client instances from @c io_wait()
- * and from p2mp (Point-to-multipoint) instances in @c multi_io_wait().
+ * @note This function gets called from @c io_wait().
  *
  * @param c      Pointer to the core context.
  * @param es     The event set where descriptors are registered.
diff --git a/src/openvpn/multi_io.c b/src/openvpn/multi_io.c
index 50c95b5..2a88356d 100644
--- a/src/openvpn/multi_io.c
+++ b/src/openvpn/multi_io.c
@@ -136,7 +136,6 @@
 multi_io_wait(struct multi_context *m)
 {
     int status;
-    unsigned int *persistent = &m->multi_io->tun_rwflags;
 
     for (int i = 0; i < m->top.c1.link_sockets_num; i++)
     {
@@ -144,7 +143,7 @@
 
         if (proto_is_dgram(sock->info.proto))
         {
-            multi_io_process_flags(&m->top, m->multi_io->es, sock, IOW_READ | IOW_WAIT_SIGNAL);
+            socket_set(sock, m->multi_io->es, EVENT_READ, &sock->ev_arg, &sock->rwflags_persistent);
         }
         else if (!tuntap_is_dco_win(m->top.c1.tuntap))
         {
@@ -152,7 +151,7 @@
         }
     }
 
-    tun_set(m->top.c1.tuntap, m->multi_io->es, EVENT_READ, MULTI_IO_TUN, persistent);
+    tun_set(m->top.c1.tuntap, m->multi_io->es, EVENT_READ, MULTI_IO_TUN, &m->multi_io->tun_rwflags);
 #if defined(ENABLE_DCO)
     dco_event_set(&m->top.c1.tuntap->dco, m->multi_io->es, MULTI_IO_DCO);
 #endif
@@ -167,7 +166,11 @@
 
 #ifdef ENABLE_ASYNC_PUSH
     /* arm inotify watcher */
-    event_ctl(m->multi_io->es, m->top.c2.inotify_fd, EVENT_READ, MULTI_IO_FILE_CLOSE_WRITE);
+    if (!m->multi_io->inotify_set)
+    {
+        event_ctl(m->multi_io->es, m->top.c2.inotify_fd, EVENT_READ, MULTI_IO_FILE_CLOSE_WRITE);
+        m->multi_io->inotify_set = true;
+    }
 #endif
 
     status =
diff --git a/src/openvpn/multi_io.h b/src/openvpn/multi_io.h
index e178240..6c7fd11 100644
--- a/src/openvpn/multi_io.h
+++ b/src/openvpn/multi_io.h
@@ -55,6 +55,7 @@
     int n_esr;
     int maxevents;
     unsigned int tun_rwflags;
+    bool inotify_set;
 #ifdef ENABLE_MANAGEMENT
     unsigned int management_persist_flags;
 #endif
diff --git a/src/openvpn/socket.h b/src/openvpn/socket.h
index 52e09c9..e320ff3 100644
--- a/src/openvpn/socket.h
+++ b/src/openvpn/socket.h
@@ -177,6 +177,9 @@
     /* used for long-term queueing of pre-accepted socket listen */
     bool listen_persistent_queued;
 
+    /* last rwflags set on the shared server-side UDP socket */
+    unsigned int rwflags_persistent;
+
     const char *remote_host;
     const char *remote_port;
     const char *local_host;
