diff --git a/examples/udp_echo_server/Makefile b/examples/udp_echo_server/Makefile
new file mode 100644
index 00000000..87a88cdf
--- /dev/null
+++ b/examples/udp_echo_server/Makefile
@@ -0,0 +1,2 @@
+PROG = echo_server
+include ../examples.mk
diff --git a/examples/udp_echo_server/echo_server.c b/examples/udp_echo_server/echo_server.c
new file mode 100644
index 00000000..ddbdd424
--- /dev/null
+++ b/examples/udp_echo_server/echo_server.c
@@ -0,0 +1,55 @@
+// Copyright (c) 2016 Cesanta Software Limited
+// All rights reserved
+//
+// This software is dual-licensed: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2 as
+// published by the Free Software Foundation. For the terms of this
+// license, see .
+//
+// You are free to use this software under the terms of the GNU General
+// Public License, but WITHOUT ANY WARRANTY; without even the implied
+// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU General Public License for more details.
+//
+// Alternatively, you can license this software under a commercial
+// license, as set out in .
+//
+
+#include "mongoose.h"
+
+static void ev_handler(struct mg_connection *nc, int ev, void *p) {
+ struct mbuf *io = &nc->recv_mbuf;
+ (void) p;
+ switch (ev) {
+ case MG_EV_RECV:
+ mg_send(nc, io->buf, io->len); // Echo message back
+ mbuf_remove(io, io->len); // Discard message from recv buffer
+ // In case of UDP, Mongoose creates new virtual connection for
+ // incoming messages
+ // We can keep it (and it will be reused for another messages from
+ // the same address) or we can close it (this saves some memory, but
+ // decreases perfomance, because it forces creation of connection
+ // for every incoming dgram)
+ nc->flags |= MG_F_SEND_AND_CLOSE;
+ break;
+ default:
+ break;
+ }
+}
+
+int main(void) {
+ struct mg_mgr mgr;
+ const char *port1 = "udp://1234", *port2 = "udp://127.0.0.1:17000";
+
+ mg_mgr_init(&mgr, NULL);
+ mg_bind(&mgr, port1, ev_handler);
+ mg_bind(&mgr, port2, ev_handler);
+
+ printf("Starting echo mgr on ports %s, %s\n", port1, port2);
+ for (;;) {
+ mg_mgr_poll(&mgr, 1000);
+ }
+ mg_mgr_free(&mgr);
+
+ return 0;
+}