diff --git a/examples/udp_client/Makefile b/examples/udp_client/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..00ebca381c496d705fe2db9dc406ee672b281fd5
--- /dev/null
+++ b/examples/udp_client/Makefile
@@ -0,0 +1,2 @@
+PROG = udp_client
+include ../examples.mk
diff --git a/examples/udp_client/udp_client.c b/examples/udp_client/udp_client.c
new file mode 100644
index 0000000000000000000000000000000000000000..faeb2ebed9ce5374fd8b206a85cb30cf37e6fec0
--- /dev/null
+++ b/examples/udp_client/udp_client.c
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2014-2018 Cesanta Software Limited
+ * All rights reserved
+ *
+ * This program sends provided data to the provided UDP server and port, and
+ * then prints all incoming data, until user stops the program.
+ */
+
+#include "mongoose.h"
+
+#define ADDR_BUF_SIZE 256
+
+static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) {
+  switch (ev) {
+    case MG_EV_RECV:
+      fprintf(stderr, "%.*s", (int) nc->recv_mbuf.len, nc->recv_mbuf.buf);
+      nc->recv_mbuf.len = 0;
+      break;
+    default:
+      break;
+  }
+
+  (void) ev_data;
+}
+
+int main(int argc, char *argv[]) {
+  struct mg_mgr mgr;
+  char addr[ADDR_BUF_SIZE];
+
+  mg_mgr_init(&mgr, NULL);
+
+  if (argc != 3) {
+    fprintf(stderr, "Usage: %s <server:port> <data>\n", argv[0]);
+    exit(EXIT_FAILURE);
+  }
+
+  snprintf(addr, sizeof(addr), "udp://%s", argv[1]);
+
+  fprintf(stderr, "Connecting to '%s'\n", addr);
+
+  struct mg_connection *nc = mg_connect(&mgr, addr, ev_handler);
+
+  if (nc == NULL) {
+    fprintf(stderr, "Failed to connect");
+    exit(1);
+  }
+
+  fprintf(stderr, "Sending '%s'\n", argv[2]);
+
+  mg_send(nc, argv[2], strlen(argv[2]));
+
+  fprintf(stderr, "Waiting for data\n");
+
+  for (;;) {
+    mg_mgr_poll(&mgr, 10);
+  }
+  mg_mgr_free(&mgr);
+
+  return 0;
+}