private <ReplyType extends ResponseMessage> void submit(
      InetSocketAddress address,
      RequestMessage<ReplyType> message,
      DispatchType type,
      Consumer<ReplyType> consumer) {
    MessageIdentifier identifier = new MessageIdentifier(unique);
    message.setIdentifier(identifier);
    message.setResponseListenerAddress(udpListener.getListeningAddress());
    responsesWaiters.put(
        identifier,
        responseMessage -> {
          try {
            //noinspection unchecked
            ReplyType casted = (ReplyType) responseMessage;
            consumer.accept(casted);
          } catch (ClassCastException e) {
            logger.warn("Accepted message of wrong type", e);
          }
        });

    forwardSingle(address, message, type);
  }