diff --git a/scheduler/event.c b/scheduler/event.c
index 1ca9d16..650bf6e 100644
--- a/scheduler/event.c
+++ b/scheduler/event.c
@@ -11,6 +11,9 @@
 #include "process.h"
 #include "thread.h"
 #include "heap.h"
+#include "syslevel.h"
+#include "server/request.h"
+#include "server.h"
 
 typedef struct
 {
@@ -83,12 +86,24 @@
 HANDLE32 WINAPI CreateEvent32A( SECURITY_ATTRIBUTES *sa, BOOL32 manual_reset,
                                 BOOL32 initial_state, LPCSTR name )
 {
+    struct create_event_request req;
+    struct create_event_reply reply;
+    int len = name ? strlen(name) + 1 : 0;
     HANDLE32 handle;
     EVENT *event;
 
+    req.manual_reset = manual_reset;
+    req.initial_state = initial_state;
+    req.inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
+
+    CLIENT_SendRequest( REQ_CREATE_EVENT, -1, 2, &req, sizeof(req), name, len );
+    CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
+    CHECK_LEN( len, sizeof(reply) );
+    if (reply.handle == -1) return NULL;
+
     SYSTEM_LOCK();
-    event = (EVENT *)K32OBJ_Create( K32OBJ_EVENT, sizeof(*event),
-                                    name, EVENT_ALL_ACCESS, sa, &handle );
+    event = (EVENT *)K32OBJ_Create( K32OBJ_EVENT, sizeof(*event), name,
+                                    reply.handle, EVENT_ALL_ACCESS, sa, &handle );
     if (event)
     {
         /* Finish initializing it */
@@ -114,6 +129,14 @@
     return ret;
 }
 
+/***********************************************************************
+ *           WIN16_CreateEvent    (KERNEL.457)
+ */
+HANDLE32 WINAPI WIN16_CreateEvent( BOOL32 manual_reset, BOOL32 initial_state )
+{
+    return CreateEvent32A( NULL, manual_reset, initial_state, NULL );
+}
+
 
 /***********************************************************************
  *           OpenEvent32A    (KERNEL32.536)
@@ -150,14 +173,23 @@
  */
 BOOL32 WINAPI PulseEvent( HANDLE32 handle )
 {
+    struct event_op_request req;
     EVENT *event;
     SYSTEM_LOCK();
     if (!(event = (EVENT *)HANDLE_GetObjPtr(PROCESS_Current(), handle,
-                                            K32OBJ_EVENT, EVENT_MODIFY_STATE, NULL)))
+                                            K32OBJ_EVENT, EVENT_MODIFY_STATE,
+                                            &req.handle )))
     {
         SYSTEM_UNLOCK();
         return FALSE;
     }
+    if (req.handle != -1)
+    {
+        SYSTEM_UNLOCK();
+        req.op = PULSE_EVENT;
+        CLIENT_SendRequest( REQ_EVENT_OP, -1, 1, &req, sizeof(req) );
+        return !CLIENT_WaitReply( NULL, NULL, 0 );
+    }
     event->signaled = TRUE;
     SYNC_WakeUp( &event->wait_queue, event->manual_reset ? INFINITE32 : 1 );
     event->signaled = FALSE;
@@ -172,14 +204,23 @@
  */
 BOOL32 WINAPI SetEvent( HANDLE32 handle )
 {
+    struct event_op_request req;
     EVENT *event;
     SYSTEM_LOCK();
     if (!(event = (EVENT *)HANDLE_GetObjPtr(PROCESS_Current(), handle,
-                                            K32OBJ_EVENT, EVENT_MODIFY_STATE, NULL)))
+                                            K32OBJ_EVENT, EVENT_MODIFY_STATE,
+                                            &req.handle )))
     {
         SYSTEM_UNLOCK();
         return FALSE;
     }
+    if (req.handle != -1)
+    {
+        SYSTEM_UNLOCK();
+        req.op = SET_EVENT;
+        CLIENT_SendRequest( REQ_EVENT_OP, -1, 1, &req, sizeof(req) );
+        return !CLIENT_WaitReply( NULL, NULL, 0 );
+    }
     event->signaled = TRUE;
     SYNC_WakeUp( &event->wait_queue, event->manual_reset ? INFINITE32 : 1 );
     K32OBJ_DecCount( &event->header );
@@ -193,14 +234,23 @@
  */
 BOOL32 WINAPI ResetEvent( HANDLE32 handle )
 {
+    struct event_op_request req;
     EVENT *event;
     SYSTEM_LOCK();
     if (!(event = (EVENT *)HANDLE_GetObjPtr(PROCESS_Current(), handle,
-                                            K32OBJ_EVENT, EVENT_MODIFY_STATE, NULL)))
+                                            K32OBJ_EVENT, EVENT_MODIFY_STATE,
+                                            &req.handle )))
     {
         SYSTEM_UNLOCK();
         return FALSE;
     }
+    if (req.handle != -1)
+    {
+        SYSTEM_UNLOCK();
+        req.op = RESET_EVENT;
+        CLIENT_SendRequest( REQ_EVENT_OP, -1, 1, &req, sizeof(req) );
+        return !CLIENT_WaitReply( NULL, NULL, 0 );
+    }
     event->signaled = FALSE;
     K32OBJ_DecCount( &event->header );
     SYSTEM_UNLOCK();
@@ -272,3 +322,48 @@
     obj->type = K32OBJ_UNKNOWN;
     HeapFree( SystemHeap, 0, event );
 }
+
+
+
+
+/***********************************************************************
+ * NOTE: The Win95 VWin32_Event routines given below are really low-level
+ *       routines implemented directly by VWin32. The user-mode libraries
+ *       implement Win32 synchronisation routines on top of these low-level
+ *       primitives. We do it the other way around here :-)
+ */
+
+/***********************************************************************
+ *       VWin32_EventCreate	(KERNEL.442)
+ */
+HANDLE32 WINAPI VWin32_EventCreate(VOID)
+{
+    return CreateEvent32A( NULL, FALSE, 0, NULL );
+}
+
+/***********************************************************************
+ *       VWin32_EventDestroy	(KERNEL.443)
+ */
+VOID WINAPI VWin32_EventDestroy(HANDLE32 event)
+{
+    CloseHandle( event );
+}
+
+/***********************************************************************
+ *       VWin32_EventWait	(KERNEL.450) 
+ */
+VOID WINAPI VWin32_EventWait(HANDLE32 event)
+{
+    SYSLEVEL_ReleaseWin16Lock();
+    WaitForSingleObject( event, INFINITE32 );
+    SYSLEVEL_RestoreWin16Lock();
+}
+
+/***********************************************************************
+ *       VWin32_EventSet	(KERNEL.451)
+ */
+VOID WINAPI VWin32_EventSet(HANDLE32 event)
+{
+    SetEvent( event );
+}
+
