diff --git a/examples/form_submit/form_submit.c b/examples/form_submit/form_submit.c
new file mode 100644
index 0000000000000000000000000000000000000000..f6893114d7f4d3516d0d09029ca5bb31b090988d
--- /dev/null
+++ b/examples/form_submit/form_submit.c
@@ -0,0 +1,62 @@
+#include <stdio.h>
+#include <string.h>
+#include "mongoose.h"
+
+static const char *html_form =
+  "<html><body>POST example."
+  "<form method=\"POST\" action=\"/handle_post_request\">"
+  "Input 1: <input type=\"text\" name=\"input_1\" /> <br/>"
+  "Input 2: <input type=\"text\" name=\"input_2\" /> <br/>"
+  "<input type=\"submit\" />"
+  "</form></body></html>";
+
+static void send_reply(struct mg_connection *conn) {
+  char var1[500], var2[500];
+
+  if (strcmp(conn->uri, "/handle_post_request") == 0) {
+    // User has submitted a form, show submitted data and a variable value
+    // Parse form data. var1 and var2 are guaranteed to be NUL-terminated
+    mg_get_var(conn, "input_1", var1, sizeof(var1));
+    mg_get_var(conn, "input_2", var2, sizeof(var2));
+
+    // Send reply to the client, showing submitted form values.
+    // POST data is in conn->content, data length is in conn->content_len
+    mg_send_header(conn, "Content-Type", "text/plain");
+    mg_printf_data(conn,
+                   "Submitted data: [%.*s]\n"
+                   "Submitted data length: %d bytes\n"
+                   "input_1: [%s]\n"
+                   "input_2: [%s]\n",
+                   conn->content_len, conn->content,
+                   conn->content_len, var1, var2);
+  } else {
+    // Show HTML form.
+    mg_send_data(conn, html_form, strlen(html_form));
+  }
+}
+
+static int ev_handler(struct mg_connection *conn, enum mg_event ev) {
+  if (ev == MG_REQUEST) {
+    send_reply(conn);
+    return MG_TRUE;
+  } else if (ev == MG_AUTH) {
+    return MG_TRUE;
+  } else {
+    return MG_FALSE;
+  }
+}
+
+int main(void) {
+  struct mg_server *server = mg_create_server(NULL, ev_handler);
+
+  mg_set_option(server, "listening_port", "8080");
+
+  printf("Starting on port %s\n", mg_get_option(server, "listening_port"));
+  for (;;) {
+    mg_poll_server(server, 1000);
+  }
+
+  mg_destroy_server(&server);
+
+  return 0;
+}
diff --git a/examples/proxy_server/Makefile b/examples/proxy_server/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..38d1a4db2313cb06e066f206ccf4f905066d8b5e
--- /dev/null
+++ b/examples/proxy_server/Makefile
@@ -0,0 +1,13 @@
+# Copyright (c) 2014 Cesanta Software
+# All rights reserved
+
+PROG = proxy_server
+FLAGS = -I../.. -I../../../net_skeleton -DNS_ENABLE_SSL
+CFLAGS = -W -Wall -g -O0 -lssl $(FLAGS) $(CFLAGS_EXTRA)
+SOURCES = $(PROG).c ../../mongoose.c
+
+unix: $(SOURCES)
+	$(CC) -o $(PROG) $(SOURCES) $(CFLAGS)
+
+clean:
+	rm -rf $(PROG) *.exe *.dSYM *.obj *.exp .*o *.lib
diff --git a/examples/web_server/Makefile b/examples/web_server/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..efc2e3e7971c7b6719e1337569d8a02909a11ac4
--- /dev/null
+++ b/examples/web_server/Makefile
@@ -0,0 +1,12 @@
+# Copyright (c) 2014 Cesanta Software
+# All rights reserved
+
+PROG = web_server
+CFLAGS = -W -Wall -I../.. -g -O0 $(CFLAGS_EXTRA)
+SOURCES = $(PROG).c ../../mongoose.c
+
+$(PROG): $(SOURCES)
+	$(CC) -o $(PROG) $(SOURCES) $(CFLAGS)
+
+clean:
+	rm -rf $(PROG) *.exe *.dSYM *.obj *.exp .*o *.lib