diff --git a/substrate/client/network/src/protocol/generic_proto/handler.rs b/substrate/client/network/src/protocol/generic_proto/handler.rs
index c8a76c1cc9a4eae700a27ac142e6a88767648219..42cf02f1b77d796e9df7b9936f7e4395fccdcebe 100644
--- a/substrate/client/network/src/protocol/generic_proto/handler.rs
+++ b/substrate/client/network/src/protocol/generic_proto/handler.rs
@@ -971,6 +971,16 @@ impl ProtocolsHandler for NotifsHandler {
 						if let Some(pos) = self.out_protocols.iter().position(|(n, _)| *n == protocol_name) {
 							if let Some(substream) = out_substreams[pos].as_mut() {
 								let _ = substream.start_send_unpin(message);
+								// Calling `start_send_unpin` only queues the message. Actually
+								// emitting the message is done with `poll_flush`. In order to
+								// not introduce too much complexity, this flushing is done earlier
+								// in the body of this `poll()` method. As such, we schedule a task
+								// wake-up now in order to guarantee that `poll()` will be called
+								// again and the flush happening.
+								// At the time of the writing of this comment, a rewrite of this
+								// code is being planned. If you find this comment in the wild and
+								// the rewrite didn't happen, please consider a refactor.
+								cx.waker().wake_by_ref();
 								continue 'poll_notifs_sink;
 							}