diff -urN openvpn-2.0_beta15/event.h openvpn-2.0_beta15-new/event.h
--- openvpn-2.0_beta15/event.h	Sun Aug 15 08:28:36 2004
+++ openvpn-2.0_beta15-new/event.h	Mon Nov  1 23:31:39 2004
@@ -145,6 +145,12 @@
 {
   if (HANDLE_DEFINED (win32_signal.in.read))
     event_ctl (es, &win32_signal.in, EVENT_READ, arg);
+  if (HANDLE_DEFINED (win32_signal.event_SIGUSR1.read))
+    event_ctl (es, &win32_signal.event_SIGUSR1, EVENT_READ, arg);
+  if (HANDLE_DEFINED (win32_signal.event_SIGUSR2.read))
+    event_ctl (es, &win32_signal.event_SIGUSR2, EVENT_READ, arg);
+  if (HANDLE_DEFINED (win32_signal.event_SIGHUP.read))
+    event_ctl (es, &win32_signal.event_SIGHUP, EVENT_READ, arg);
 }
 
 #else
diff -urN openvpn-2.0_beta15/win32.c openvpn-2.0_beta15-new/win32.c
--- openvpn-2.0_beta15/win32.c	Tue Oct 26 22:38:30 2004
+++ openvpn-2.0_beta15-new/win32.c	Wed Nov  3 23:04:14 2004
@@ -226,6 +226,32 @@
   CLEAR (*ws);
 }
 
+HANDLE
+win32_create_signal_event(const char *event_name,
+                          bool initial_state)
+{
+  HANDLE event;
+  struct security_attributes sa;
+
+  if (!init_security_attributes_allow_all (&sa))
+    msg (M_ERR, "Error: win32_signal_open: init SA failed");
+
+  event = CreateEvent (&sa.sa,
+  		       TRUE,
+		       initial_state,
+		       event_name);
+  if (event == NULL)
+    {
+      msg (M_WARN|M_ERRNO, "NOTE: CreateEvent '%s' failed", event_name);
+    }
+  else
+    {
+      if (WaitForSingleObject (event, 0) != WAIT_TIMEOUT)
+        msg (M_FATAL, "ERROR: Event ('%s') is signaled", event_name);
+    }
+  return event;
+}
+ 
 void
 win32_signal_open (struct win32_signal *ws,
 		   int force,
@@ -278,26 +304,26 @@
   if ((force == WSO_NOFORCE || force == WSO_FORCE_SERVICE)
       && !HANDLE_DEFINED (ws->in.read) && exit_event_name)
     {
-      struct security_attributes sa;
+      char event_name[100];
 
-      if (!init_security_attributes_allow_all (&sa))
-	msg (M_ERR, "Error: win32_signal_open: init SA failed");
-
-      ws->in.read = CreateEvent (&sa.sa,
-				 TRUE,
-				 exit_event_initial_state ? TRUE : FALSE,
-				 exit_event_name);
-      if (ws->in.read == NULL)
-	{
-	  msg (M_WARN|M_ERRNO, "NOTE: CreateEvent '%s' failed", exit_event_name);
-	}
-      else
-	{
-	  if (WaitForSingleObject (ws->in.read, 0) != WAIT_TIMEOUT)
-	    msg (M_FATAL, "ERROR: Exit Event ('%s') is signaled", exit_event_name);
-	  else
-	    ws->mode = WSO_MODE_SERVICE;
-	}
+      /* Create SIGTERM (exit) event */
+      ws->in.read = win32_create_signal_event(exit_event_name,
+				              exit_event_initial_state ? TRUE : FALSE);
+      if (ws->in.read != NULL)
+        ws->mode = WSO_MODE_SERVICE;
+
+
+      /* Create SIGUSR1 event */
+      snprintf(event_name, sizeof(event_name), "%s_SIGUSR1", exit_event_name);
+      ws->event_SIGUSR1.read = win32_create_signal_event(event_name, FALSE);
+						       
+      /* Create SIGUSR2 event */
+      snprintf(event_name, sizeof(event_name), "%s_SIGUSR2", exit_event_name);
+      ws->event_SIGUSR2.read = win32_create_signal_event(event_name, FALSE);
+						       
+      /* Create SIGHUP event */
+      snprintf(event_name, sizeof(event_name), "%s_SIGHUP", exit_event_name);
+      ws->event_SIGHUP.read = win32_create_signal_event(event_name, FALSE);
     }
 }
 
@@ -363,18 +389,36 @@
 }
 
 /*
- * Return true if interrupt occurs in service mode.
+ * Return signal if interrupt occurs in service mode.
  */
-static bool
+int
 win32_service_interrupt (struct win32_signal *ws)
 {
   if (ws->mode == WSO_MODE_SERVICE)
     {
       if (HANDLE_DEFINED (ws->in.read)
 	  && WaitForSingleObject (ws->in.read, 0) == WAIT_OBJECT_0)
-	return true;
+	return SIGTERM;
+      if (HANDLE_DEFINED (ws->event_SIGUSR1.read)
+	  && WaitForSingleObject (ws->event_SIGUSR1.read, 0) == WAIT_OBJECT_0)
+        {
+          ResetEvent(ws->event_SIGUSR1.read);
+	  return SIGUSR1;
+        }
+      if (HANDLE_DEFINED (ws->event_SIGUSR2.read)
+	  && WaitForSingleObject (ws->event_SIGUSR2.read, 0) == WAIT_OBJECT_0)
+        {
+          ResetEvent(ws->event_SIGUSR2.read);
+	  return SIGUSR2;
+        }
+      if (HANDLE_DEFINED (ws->event_SIGHUP.read)
+	  && WaitForSingleObject (ws->event_SIGHUP.read, 0) == WAIT_OBJECT_0)
+        {
+          ResetEvent(ws->event_SIGHUP.read);
+	  return SIGHUP;
+        }
     }
-  return false;
+  return 0;
 }
 
 int
@@ -383,8 +427,7 @@
   int ret = 0;
   if (ws->mode == WSO_MODE_SERVICE)
     {
-      if (win32_service_interrupt (ws))
-	ret = SIGTERM;
+      ret = win32_service_interrupt (ws);
     }
   else if (ws->mode == WSO_MODE_CONSOLE)
     {
diff -urN openvpn-2.0_beta15/win32.h openvpn-2.0_beta15-new/win32.h
--- openvpn-2.0_beta15/win32.h	Mon Sep 27 04:43:58 2004
+++ openvpn-2.0_beta15-new/win32.h	Mon Nov  1 23:20:47 2004
@@ -92,6 +92,9 @@
 # define WSO_MODE_CONSOLE 2
   int mode;
   struct rw_handle in;
+  struct rw_handle event_SIGUSR1;
+  struct rw_handle event_SIGUSR2;
+  struct rw_handle event_SIGHUP;
   DWORD console_mode_save;
   bool console_mode_save_defined;
 };
