diff --git a/docs/Embed.md b/docs/Embed.md
index ec79f9df8fc7b2a572a275bd2bead9358fa8b2b8..7a102b64cfb6a2f9df2b06b7399cbf2e9c5db573 100644
--- a/docs/Embed.md
+++ b/docs/Embed.md
@@ -90,6 +90,7 @@ a couple of kilobytes to the executable size, and also has some runtime penalty.
 Mongoose source code contains a well-commented example code, listed below:
 
    * [hello.c](https://github.com/cesanta/mongoose/blob/master/examples/hello.c)
-   is a minimalisting hello world example
+   is a minimalistic hello world example
    * [post.c](https://github.com/cesanta/mongoose/blob/master/examples/post.c)
-   shows how to handle form input
+   * [upload.c](https://github.com/cesanta/mongoose/blob/master/examples/post.c)
+   shows how to upload files
diff --git a/examples/Makefile b/examples/Makefile
index 9469554225d61cb6a45f9a2f14c398ac1aa75200..562d47938f3f6f9ccc39c0818e8c44ae12cbf4d6 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -23,8 +23,8 @@ all:
 	$(CC) qcomm.c ../mongoose.c  -o qcomm $(CFLAGS)
 	$(CC) post.c ../mongoose.c -o post $(CFLAGS)
 	$(CC) multi_threaded.c ../mongoose.c -o multi_threaded $(CFLAGS)
+	$(CC) upload.c ../mongoose.c -o upload $(CFLAGS)
 
-#	$(CC) upload.c ../mongoose.c -o upload $(CFLAGS)
 #	$(CC) -DUSE_WEBSOCKET websocket.c ../mongoose.c -o $@ $(CFLAGS)
 #	$(CC) chat.c ../mongoose.c -o chat $(CFLAGS)
 #	$(CC) lua_dll.c ../build/lua_5.2.1.c -o $@.so $(CFLAGS) $(DLL_FLAGS)
@@ -40,7 +40,8 @@ windows:
 	$(CL) hello.c ../mongoose.c $(CLFLAGS) $(LFLAGS)
 	$(CL) post.c ../mongoose.c $(CLFLAGS) $(LFLAGS)
 	$(CL) multi_threaded.c ../mongoose.c $(CLFLAGS) $(LFLAGS)
-#	$(CL) upload.c ../mongoose.c $(CLFLAGS) $(LFLAGS)
+	$(CL) upload.c ../mongoose.c $(CLFLAGS) $(LFLAGS)
+
 #	$(CL) /DUSE_WEBSOCKET websocket.c ../mongoose.c $(CLFLAGS) $(LFLAGS)
 #$(CL) lua_dll.c $(CLFLAGS) $(DLL_FLAGS) /DLL $(LFLAGS) /SUBSYSTEM:WINDOWS /ENTRY:luaopen_lua_dll /EXPORT:luaopen_lua_dll /out:lua_dll.dll
 
diff --git a/examples/upload.c b/examples/upload.c
index 0ce0fac7c8f2670a01866606a2aa32d4214d8231..b83693952e3934c3ba2e4c6db83acf5007b8eacf 100644
--- a/examples/upload.c
+++ b/examples/upload.c
@@ -5,48 +5,50 @@
 #include <string.h>
 #include "mongoose.h"
 
-static int event_handler(struct mg_event *event) {
-
-  if (event->type == MG_REQUEST_BEGIN) {
-    if (!strcmp(event->request_info->uri, "/handle_post_request")) {
-      char path[200];
-      FILE *fp = mg_upload(event->conn, "/tmp", path, sizeof(path));
-      if (fp != NULL) {
-        fclose(fp);
-        mg_printf(event->conn, "HTTP/1.0 200 OK\r\n\r\nSaved: [%s]", path);
-      } else {
-        mg_printf(event->conn, "%s", "HTTP/1.0 200 OK\r\n\r\nNo files sent");
-      }
-    } else {
-      // Show HTML form. Make sure it has enctype="multipart/form-data" attr.
-      static const char *html_form =
-        "<html><body>Upload example."
-        "<form method=\"POST\" action=\"/handle_post_request\" "
-        "  enctype=\"multipart/form-data\">"
-        "<input type=\"file\" name=\"file\" /> <br/>"
-        "<input type=\"submit\" value=\"Upload\" />"
-        "</form></body></html>";
-
-      mg_printf(event->conn, "HTTP/1.0 200 OK\r\n"
-          "Content-Length: %d\r\n"
-          "Content-Type: text/html\r\n\r\n%s",
-          (int) strlen(html_form), html_form);
-    }
-
-    // Mark request as processed
-    return 1;
+static int index_html(struct mg_connection *conn) {
+  const char *data;
+  int data_len;
+  char var_name[100], file_name[100];
+
+  mg_printf_data(conn, "%s",
+                 "<html><body>Upload example."
+                 "<form method=\"POST\" action=\"/handle_post_request\" "
+                 "  enctype=\"multipart/form-data\">"
+                 "<input type=\"file\" name=\"file\" /> <br/>"
+                 "<input type=\"submit\" value=\"Upload\" />"
+                 "</form>");
+
+  if (mg_parse_multipart(conn->content, conn->content_len,
+                         var_name, sizeof(var_name),
+                         file_name, sizeof(file_name),
+                         &data, &data_len) > 0) {
+
+    mg_printf_data(conn, "%s", "Uploaded file:<pre>");
+    mg_send_data(conn, data, data_len);
+    mg_printf_data(conn, "%s", "/pre>");
   }
 
-  // All other events left unprocessed
+  mg_printf_data(conn, "%s", "</body></html>");
+
   return 1;
 }
 
 int main(void) {
-  struct mg_context *ctx;
-  const char *options[] = {"listening_ports", "8080", NULL};
-  ctx = mg_start(options, event_handler, NULL);
-  getchar();  // Wait until user hits "enter"
-  mg_stop(ctx);
+  struct mg_server *server;
+
+  // Create and configure the server
+  server = mg_create_server(NULL);
+  mg_set_option(server, "listening_port", "8080");
+  mg_add_uri_handler(server, "/", index_html);
+
+  // Serve request. Hit Ctrl-C to terminate the program
+  printf("Starting on port %s\n", mg_get_option(server, "listening_port"));
+  for (;;) {
+    mg_poll_server(server, 1000);
+  }
+
+  // Cleanup, and free server instance
+  mg_destroy_server(&server);
 
   return 0;
 }