diff --git a/examples/udp_echo_server/Makefile b/examples/udp_echo_server/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..87a88cdfc97a8adf81bf57dac32bcdadda0d0664
--- /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 0000000000000000000000000000000000000000..ddbdd4249fe0d6851fbb2c434e67209c02b76d7d
--- /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 <http://www.gnu.org/licenses/>.
+//
+// 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 <https://www.cesanta.com/license>.
+//
+
+#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;
+}