diff --git a/examples/c#/example.cs b/examples/c#/example.cs
index 07f5048c01d30f5a6e8ce94da6351f909d5e6dd2..e7fc453b4c166cb718befa88b12badce6c3fc2a7 100644
--- a/examples/c#/example.cs
+++ b/examples/c#/example.cs
@@ -5,23 +5,33 @@ using System;
 using System.Runtime.InteropServices;
 
 public class Program {
-  static private int RequestHandler(MongooseConnection conn) {
-    return 0;
-    /*
-    conn.write("HTTP/1.1 200 OK\r\n\r\n");
-    conn.write("Hello from C#!\n");
-    conn.write("Your user-agent is: " + conn.get_header("User-Agent") + "\n");
-    */
+  static private int EventHandler(MongooseEvent ev) {
+    if (ev.type != 1) {
+      return 0; // Mark as unhandled
+    }
+
+    MongooseRequestInfo request_info = (MongooseRequestInfo)
+      Marshal.PtrToStructure(ev.request_info, typeof(MongooseRequestInfo));
+
+    if (request_info.uri != "/test") {
+      return 0; // Mark as unhandled
+    }
+
+    Mongoose.write(ev.conn, "HTTP/1.1 200 OK\r\n\r\n");
+    Mongoose.write(ev.conn, "Hello from C#!\n");
+
+    return 1; // Mark as handled
   }
 
   static void Main() {
-    Mongoose web_server = new Mongoose("c:\\", "8080",
-        new MongooseBeginRequest(RequestHandler));
+    Mongoose web_server = new Mongoose(".", "9000",
+        new MongooseEventHandler(EventHandler));
 
     Console.WriteLine("Mongoose v." + web_server.version_ + " started.");
     Console.WriteLine("Press enter to exit program.");
 
     // Serve requests until user presses "enter" on a keyboard
     Console.ReadLine();
+    web_server.stop();
   }
 }
diff --git a/examples/c#/mongoose.cs b/examples/c#/mongoose.cs
index 68afed1f84d7f4ec4ed4fe6f143339d9f5a01e27..61ad282b3dafb6d227e185411a6b2a133876f9d8 100644
--- a/examples/c#/mongoose.cs
+++ b/examples/c#/mongoose.cs
@@ -5,60 +5,60 @@ using System;
 using System.Runtime.InteropServices;
 
 [StructLayout(LayoutKind.Sequential)] public struct MongooseHeader {
-  public IntPtr name;    // Using IntPtr here because if we use strings here,
-  public IntPtr value;   // it won't be properly marshalled.
+  [MarshalAs(UnmanagedType.LPTStr)] public IntPtr name;
+  [MarshalAs(UnmanagedType.LPTStr)] public IntPtr value;
 };
 
 // mongoose.h :: struct mg_request_info
 [StructLayout(LayoutKind.Sequential)] public struct MongooseRequestInfo {
-  public string request_method;
-  public string uri;
-  public string http_version;
-  public string query_string;
-  public string remote_user;
+  [MarshalAs(UnmanagedType.LPTStr)] public string request_method;
+  [MarshalAs(UnmanagedType.LPTStr)] public string uri;
+  [MarshalAs(UnmanagedType.LPTStr)] public string http_version;
+  [MarshalAs(UnmanagedType.LPTStr)] public string query_string;
+  [MarshalAs(UnmanagedType.LPTStr)] public string remote_user;
   public int remote_ip;
   public int remote_port;
   public int is_ssl;
-  public IntPtr user_data;
-  public IntPtr conn_data;
   [MarshalAs(UnmanagedType.ByValArray,SizeConst=64)]
     public MongooseHeader[] http_headers;
 };
 
-[UnmanagedFunctionPointer(CallingConvention.StdCall)] public delegate
-  int MongooseBeginRequest_native(IntPtr conn);
-public delegate int MongooseBeginRequest(MongooseConnection conn);
-
-// mongoose.h :: struct mg_callbacks
-[StructLayout(LayoutKind.Sequential)] public struct MongooseCallbacks {
-  public MongooseBeginRequest_native begin_request;
-  [MarshalAs(UnmanagedType.ByValArray,SizeConst=20)]
-    public IntPtr[] other_callbacks;
+[StructLayout(LayoutKind.Sequential)] public struct MongooseEvent {
+  public int type;
+  public IntPtr user_data;
+  public IntPtr conn_data;
+  public IntPtr event_param;
+  public IntPtr conn;
+  public IntPtr request_info;
 };
 
+public delegate int MongooseEventHandlerN(ref MongooseEvent ev);
+public delegate int MongooseEventHandler(MongooseEvent ev);
+
 public class Mongoose {
   public const string dll_name_ = "mongoose";
   public string version_ = "??";
 
   // These are here to store a ref to the callbacks
   // while they are over in unmanaged code, to prevent garbage collection.
-  private event MongooseBeginRequest_native delegates;
+  private event MongooseEventHandlerN delegates;
 
   private IntPtr ctx_;
 
   [DllImport(dll_name_)] private static extern
     IntPtr mg_start([MarshalAs(UnmanagedType.LPArray,
                      ArraySubType=UnmanagedType.LPTStr)] string[] options,
-                    ref MongooseCallbacks callbacks,
+                    MongooseEventHandlerN callback,
                     IntPtr user_data);
-  [DllImport(dll_name_)] public static extern
-    IntPtr mg_get_request_info(IntPtr conn);
   [DllImport(dll_name_)] private static extern void mg_stop(IntPtr ctx);
-  [DllImport(dll_name_)] private static extern string mg_version();
+  [DllImport(dll_name_)] private static extern IntPtr mg_version();
+  [DllImport(dll_name_)] public static extern int mg_write(IntPtr conn,
+      string data, int length);
 
-  public Mongoose(string document_root, string listening_ports,
-                  MongooseBeginRequest request_handler) {
-    version_ = mg_version();
+  public Mongoose(string document_root,
+                  string listening_ports,
+                  MongooseEventHandler event_handler) {
+    version_ = Marshal.PtrToStringAnsi(mg_version());
 
     string[] options = {
       "document_root", document_root,
@@ -66,53 +66,28 @@ public class Mongoose {
       null
     };
 
-    MongooseBeginRequest_native begin_request_cb = delegate(IntPtr conn) {
-      return request_handler(new MongooseConnection(conn, this));
+    MongooseEventHandlerN cb = delegate(ref MongooseEvent ev) {
+      return event_handler(ev);
     };
-    MongooseCallbacks callbacks = new MongooseCallbacks();
-    callbacks.begin_request = begin_request_cb;
 
     // Prevent garbage collection
-    delegates += begin_request_cb;
+    delegates += cb;
 
-    ctx_ = mg_start(options, ref callbacks, IntPtr.Zero);
+    ctx_ = mg_start(options, cb, IntPtr.Zero);
   }
 
-  ~Mongoose() {
+  public static int write(IntPtr conn, string data) {
+    return mg_write(conn, data, data.Length);
+  }
+
+  public void stop() {
     if (this.ctx_ != IntPtr.Zero) {
       mg_stop(this.ctx_);
     }
     this.ctx_ = IntPtr.Zero;
   }
-}
 
-public class MongooseConnection {
-  public Mongoose mongoose;
-  private IntPtr conn;
-
-  [DllImport(Mongoose.dll_name_)] private static extern
-    string mg_get_header(IntPtr conn, string name);
-  [DllImport(Mongoose.dll_name_)] private static extern
-    string mg_get_var(IntPtr conn, string name);
-  [DllImport(Mongoose.dll_name_)] public static extern
-    int mg_write(IntPtr conn, string data, int length);
-
-  public MongooseConnection(IntPtr conn_, Mongoose mongoose_) {
-    mongoose = mongoose_;
-    conn = conn_;
-  }
-
-  public string get_header(string header_name) {
-    return mg_get_header(this.conn, header_name);
-  }
-
-  public string get_var(string header_name) {
-    string s = mg_get_var(this.conn, header_name);
-    string copy = "" + s;
-    return copy;
-  }
-
-  public int write(string data) {
-    return mg_write(this.conn, data, data.Length);
+  ~Mongoose() {
+    stop();
   }
 }