Cleaned up and removed some no longer used code.

diff --git a/files/change.c b/files/change.c
index 331700c..3dde14c 100644
--- a/files/change.c
+++ b/files/change.c
@@ -29,14 +29,10 @@
 typedef struct
 {
     K32OBJ       header;
-
     LPSTR        lpPathName;
     BOOL32       bWatchSubtree;
     DWORD        dwNotifyFilter;
-
-    THREAD_QUEUE wait_queue;    
     BOOL32       notify;
-
 } CHANGE_OBJECT;
 
 /****************************************************************************
@@ -67,13 +63,11 @@
     CHANGE_OBJECT *change;
     struct create_change_notification_request req;
     struct create_change_notification_reply reply;
-    int len;
 
     req.subtree = bWatchSubtree;
     req.filter  = dwNotifyFilter;
     CLIENT_SendRequest( REQ_CREATE_CHANGE_NOTIFICATION, -1, 1, &req, sizeof(req) );
-    CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
-    CHECK_LEN( len, sizeof(reply) );
+    CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL );
     if (reply.handle == -1) return INVALID_HANDLE_VALUE32;
 
     change = HeapAlloc( SystemHeap, 0, sizeof(CHANGE_OBJECT) );
@@ -89,8 +83,6 @@
     change->lpPathName = HEAP_strdupA( SystemHeap, 0, lpPathName );
     change->bWatchSubtree = bWatchSubtree;
     change->dwNotifyFilter = dwNotifyFilter;
-
-    change->wait_queue = NULL;
     change->notify = FALSE;
 
     return HANDLE_Alloc( PROCESS_Current(), &change->header, 
diff --git a/files/dos_fs.c b/files/dos_fs.c
index 5dfb7e6..7e49cae 100644
--- a/files/dos_fs.c
+++ b/files/dos_fs.c
@@ -652,10 +652,7 @@
                     !strcmp(DOSFS_Devices[i].name,"HPSCAN"))
                 {
                     int fd = open( "/dev/null", unixmode );
-                    if ((handle = FILE_Alloc( &file, fd )) == INVALID_HANDLE_VALUE32)
-                        return HFILE_ERROR32;
-                    file->unix_name = HEAP_strdupA( SystemHeap, 0, name );
-                    return handle;
+                    return FILE_Alloc( &file, fd, DOSFS_Devices[i].name );
 		}
 		FIXME(dosfs,"device open %s not supported (yet)\n",DOSFS_Devices[i].name);
     		return HFILE_ERROR32;
diff --git a/files/file.c b/files/file.c
index 5b000cf..3fc8c5c 100644
--- a/files/file.c
+++ b/files/file.c
@@ -71,19 +71,17 @@
  *
  * Allocate a file. The unix_handle is closed.
  */
-HFILE32 FILE_Alloc( FILE_OBJECT **file, int unix_handle )
+HFILE32 FILE_Alloc( FILE_OBJECT **file, int unix_handle, const char *unix_name )
 {
     HFILE32 handle;
     struct create_file_request req;
     struct create_file_reply reply;
-    int len;
 
     req.access = FILE_ALL_ACCESS | GENERIC_READ |
                  GENERIC_WRITE | GENERIC_EXECUTE;  /* FIXME */
     req.inherit = 1;  /* FIXME */
     CLIENT_SendRequest( REQ_CREATE_FILE, unix_handle, 1, &req, sizeof(req) );
-    CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
-    CHECK_LEN( len, sizeof(reply) );
+    CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL );
     if (reply.handle == -1) return INVALID_HANDLE_VALUE32;
 
     *file = HeapAlloc( SystemHeap, 0, sizeof(FILE_OBJECT) );
@@ -95,10 +93,9 @@
     }
     (*file)->header.type = K32OBJ_FILE;
     (*file)->header.refcount = 0;
-    (*file)->unix_name = NULL;
+    (*file)->unix_name = unix_name ? HEAP_strdupA( SystemHeap, 0, unix_name ) : NULL;
     (*file)->type = FILE_TYPE_DISK;
     (*file)->mode = 0;
-    (*file)->wait_queue = NULL;
 
     handle = HANDLE_Alloc( PROCESS_Current(), &(*file)->header, req.access,
                            req.inherit, reply.handle );
@@ -152,28 +149,6 @@
 
 
 /***********************************************************************
- *           FILE_GetUnixHandle
- *
- * Return the Unix handle associated to a file handle.
- * The Unix handle must be closed after use.
- */
-int FILE_GetUnixHandle( HFILE32 hFile, DWORD access )
-{
-    FILE_OBJECT *file;
-    int unix_handle;
-    struct get_unix_handle_request req;
-
-    file = (FILE_OBJECT *)HANDLE_GetObjPtr( PROCESS_Current(), hFile,
-                                            K32OBJ_FILE, access, &req.handle );
-    if (!file) return -1;
-    req.access = access;
-    CLIENT_SendRequest( REQ_GET_UNIX_HANDLE, -1, 1, &req, sizeof(req) );
-    CLIENT_WaitReply( NULL, &unix_handle, 0 );
-    K32OBJ_DecCount( &file->header );
-    return unix_handle;
-}
-
-/***********************************************************************
  *              FILE_UnixToDosMode
  *
  * PARAMS
@@ -503,7 +478,7 @@
         FILE_SetDosError();
         return INVALID_HANDLE_VALUE32;
     }
-    return FILE_Alloc( &file, unix_handle );
+    return FILE_Alloc( &file, unix_handle, NULL );
 }
 
 
@@ -512,7 +487,6 @@
  */
 HFILE32 FILE_OpenUnixFile( const char *name, int mode )
 {
-    HFILE32 handle;
     int unix_handle;
     FILE_OBJECT *file;
     struct stat st;
@@ -534,12 +508,9 @@
         return INVALID_HANDLE_VALUE32;
     }
 
-    /* File opened OK, now fill the FILE_OBJECT */
+    /* File opened OK, now allocate a handle */
 
-    if ((handle = FILE_Alloc( &file, unix_handle )) == INVALID_HANDLE_VALUE32)
-        return INVALID_HANDLE_VALUE32;
-    file->unix_name = HEAP_strdupA( SystemHeap, 0, name );
-    return handle;
+    return FILE_Alloc( &file, unix_handle, name );
 }
 
 
@@ -650,9 +621,9 @@
 
     /* File created OK, now fill the FILE_OBJECT */
 
-    if ((handle = FILE_Alloc( &file, unix_handle )) == INVALID_HANDLE_VALUE32)
+    if ((handle = FILE_Alloc( &file, unix_handle,
+                              full_name.long_name )) == INVALID_HANDLE_VALUE32)
         return INVALID_HANDLE_VALUE32;
-    file->unix_name = HEAP_strdupA( SystemHeap, 0, full_name.long_name );
     file->mode = dosMode;
     return handle;
 }
@@ -712,18 +683,16 @@
 DWORD WINAPI GetFileInformationByHandle( HFILE32 hFile,
                                          BY_HANDLE_FILE_INFORMATION *info )
 {
-    FILE_OBJECT *file;
     struct get_file_info_request req;
     struct get_file_info_reply reply;
-    int len;
 
     if (!info) return 0;
-    if (!(file = FILE_GetFile( hFile, 0, &req.handle ))) return 0;
+    if ((req.handle = HANDLE_GetServerHandle( PROCESS_Current(), hFile,
+                                              K32OBJ_FILE, 0 )) == -1)
+        return 0;
     CLIENT_SendRequest( REQ_GET_FILE_INFO, -1, 1, &req, sizeof(req) );
-    CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
-    CHECK_LEN( len, sizeof(reply) );
-    FILE_ReleaseFile( file );
-
+    if (CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL ))
+        return 0;
     DOSFS_UnixTimeToFileTime( reply.write_time, &info->ftCreationTime, 0 );
     DOSFS_UnixTimeToFileTime( reply.write_time, &info->ftLastWriteTime, 0 );
     DOSFS_UnixTimeToFileTime( reply.access_time, &info->ftLastAccessTime, 0 );
@@ -1175,7 +1144,6 @@
 BOOL32 WINAPI ReadFile( HANDLE32 hFile, LPVOID buffer, DWORD bytesToRead,
                         LPDWORD bytesRead, LPOVERLAPPED overlapped )
 {
-    K32OBJ *ptr;
     struct get_read_fd_request req;
     int unix_handle, result;
 
@@ -1184,18 +1152,11 @@
     if (bytesRead) *bytesRead = 0;  /* Do this before anything else */
     if (!bytesToRead) return TRUE;
 
-    if (!(ptr = HANDLE_GetObjPtr( PROCESS_Current(), hFile,
-                                  K32OBJ_UNKNOWN, GENERIC_READ, &req.handle )))
+    if ((req.handle = HANDLE_GetServerHandle( PROCESS_Current(), hFile,
+                                              K32OBJ_UNKNOWN, GENERIC_READ )) == -1)
         return FALSE;
-
-    if (req.handle == -1)  /* We need a server handle */
-    {
-        K32OBJ_DecCount( ptr );
-        return FALSE;
-    }
     CLIENT_SendRequest( REQ_GET_READ_FD, -1, 1, &req, sizeof(req) );
     CLIENT_WaitReply( NULL, &unix_handle, 0 );
-    K32OBJ_DecCount( ptr );
     if (unix_handle == -1) return FALSE;
     while ((result = read( unix_handle, buffer, bytesToRead )) == -1)
     {
@@ -1216,7 +1177,6 @@
 BOOL32 WINAPI WriteFile( HANDLE32 hFile, LPCVOID buffer, DWORD bytesToWrite,
                          LPDWORD bytesWritten, LPOVERLAPPED overlapped )
 {
-    K32OBJ *ptr;
     struct get_write_fd_request req;
     int unix_handle, result;
 
@@ -1225,18 +1185,11 @@
     if (bytesWritten) *bytesWritten = 0;  /* Do this before anything else */
     if (!bytesToWrite) return TRUE;
 
-    if (!(ptr = HANDLE_GetObjPtr( PROCESS_Current(), hFile,
-                                  K32OBJ_UNKNOWN, GENERIC_WRITE, &req.handle )))
+    if ((req.handle = HANDLE_GetServerHandle( PROCESS_Current(), hFile,
+                                              K32OBJ_UNKNOWN, GENERIC_READ )) == -1)
         return FALSE;
-
-    if (req.handle == -1)  /* We need a server handle */
-    {
-        K32OBJ_DecCount( ptr );
-        return FALSE;
-    }
     CLIENT_SendRequest( REQ_GET_WRITE_FD, -1, 1, &req, sizeof(req) );
     CLIENT_WaitReply( NULL, &unix_handle, 0 );
-    K32OBJ_DecCount( ptr );
     if (unix_handle == -1) return FALSE;
     while ((result = write( unix_handle, buffer, bytesToWrite )) == -1)
     {
@@ -1336,10 +1289,8 @@
 DWORD WINAPI SetFilePointer( HFILE32 hFile, LONG distance, LONG *highword,
                              DWORD method )
 {
-    FILE_OBJECT *file;
     struct set_file_pointer_request req;
     struct set_file_pointer_reply reply;
-    int len, err;
 
     if (highword && *highword)
     {
@@ -1350,18 +1301,15 @@
     TRACE(file, "handle %d offset %ld origin %ld\n",
           hFile, distance, method );
 
-    if (!(file = FILE_GetFile( hFile, 0, &req.handle ))) return 0xffffffff;
-    assert( req.handle != -1 );
-
+    if ((req.handle = HANDLE_GetServerHandle( PROCESS_Current(), hFile,
+                                              K32OBJ_FILE, 0 )) == -1)
+        return 0xffffffff;
     req.low = distance;
     req.high = highword ? *highword : 0;
     /* FIXME: assumes 1:1 mapping between Windows and Unix seek constants */
     req.whence = method;
     CLIENT_SendRequest( REQ_SET_FILE_POINTER, -1, 1, &req, sizeof(req) );
-    err = CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
-    CHECK_LEN( len, sizeof(reply) );
-    FILE_ReleaseFile( file );
-    if (err) return 0xffffffff;
+    if (CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL )) return 0xffffffff;
     SetLastError( 0 );
     if (highword) *highword = reply.high;
     return reply.low;
@@ -1552,17 +1500,13 @@
  */
 BOOL32 WINAPI FlushFileBuffers( HFILE32 hFile )
 {
-    FILE_OBJECT *file;
-    BOOL32 ret;
     struct flush_file_request req;
 
-    if (!(file = FILE_GetFile( hFile, GENERIC_WRITE, &req.handle ))) return FALSE;
-    assert( req.handle != -1 );
-
+    if ((req.handle = HANDLE_GetServerHandle( PROCESS_Current(), hFile,
+                                              K32OBJ_FILE, 0 )) == -1)
+        return FALSE;
     CLIENT_SendRequest( REQ_FLUSH_FILE, -1, 1, &req, sizeof(req) );
-    ret = !CLIENT_WaitReply( NULL, NULL, 0 );
-    FILE_ReleaseFile( file );
-    return ret;
+    return !CLIENT_WaitReply( NULL, NULL, 0 );
 }
 
 
@@ -1571,17 +1515,13 @@
  */
 BOOL32 WINAPI SetEndOfFile( HFILE32 hFile )
 {
-    FILE_OBJECT *file;
-    BOOL32 ret;
     struct truncate_file_request req;
 
-    if (!(file = FILE_GetFile( hFile, GENERIC_WRITE, &req.handle ))) return FALSE;
-    assert( req.handle != -1 );
-
+    if ((req.handle = HANDLE_GetServerHandle( PROCESS_Current(), hFile,
+                                              K32OBJ_FILE, 0 )) == -1)
+        return FALSE;
     CLIENT_SendRequest( REQ_TRUNCATE_FILE, -1, 1, &req, sizeof(req) );
-    ret = !CLIENT_WaitReply( NULL, NULL, 0 );
-    FILE_ReleaseFile( file );
-    return ret;
+    return !CLIENT_WaitReply( NULL, NULL, 0 );
 }
 
 
@@ -1648,7 +1588,7 @@
 /***********************************************************************
  *           FILE_dommap
  */
-LPVOID FILE_dommap( FILE_OBJECT *file, int unix_handle, LPVOID start,
+LPVOID FILE_dommap( int unix_handle, LPVOID start,
                     DWORD size_high, DWORD size_low,
                     DWORD offset_high, DWORD offset_low,
                     int prot, int flags )
@@ -1660,7 +1600,7 @@
     if (size_high || offset_high)
         FIXME(file, "offsets larger than 4Gb not supported\n");
 
-    if (!file)
+    if (unix_handle == -1)
     {
 #ifdef MAP_ANON
         flags |= MAP_ANON;
@@ -1695,7 +1635,7 @@
     /* page-aligned (EINVAL), or because the underlying filesystem */
     /* does not support mmap() (ENOEXEC), we do it by hand.        */
 
-    if (!file) return ret;
+    if (unix_handle == -1) return ret;
     if ((errno != ENOEXEC) && (errno != EINVAL)) return ret;
     if (prot & PROT_WRITE)
     {
@@ -1709,7 +1649,7 @@
     }
 /*    printf( "FILE_mmap: mmap failed (%d), faking it\n", errno );*/
     /* Reserve the memory with an anonymous mmap */
-    ret = FILE_dommap( NULL, -1, start, size_high, size_low, 0, 0,
+    ret = FILE_dommap( -1, start, size_high, size_low, 0, 0,
                        PROT_READ | PROT_WRITE, flags );
     if (ret == (LPVOID)-1) return ret;
     /* Now read in the file */
@@ -2269,5 +2209,3 @@
     HeapFree( GetProcessHeap(), 0, nameA );
     return res;
 }
-
-
diff --git a/include/file.h b/include/file.h
index 3de96d6..dd2a71a 100644
--- a/include/file.h
+++ b/include/file.h
@@ -10,7 +10,6 @@
 #include <time.h>
 #include "windows.h"
 #include "k32obj.h"
-#include "thread.h"
 
 #define MAX_PATHNAME_LEN   1024
 
@@ -21,7 +20,6 @@
     int       mode;
     char     *unix_name;
     DWORD     type;         /* Type for win32 apps */
-    THREAD_QUEUE	wait_queue;
 } FILE_OBJECT;
 
 /* Definition of a full DOS file name */
@@ -62,9 +60,8 @@
 extern FILE_OBJECT *FILE_GetFile( HFILE32 handle, DWORD access,
                                   int *server_handle );
 extern void FILE_ReleaseFile( FILE_OBJECT *file );
-extern HFILE32 FILE_Alloc( FILE_OBJECT **file, int unix_handle );
+extern HFILE32 FILE_Alloc( FILE_OBJECT **file, int unix_handle, const char *unix_name );
 extern void FILE_SetDosError(void);
-extern int FILE_GetUnixHandle( HFILE32 hFile, DWORD access );
 extern HFILE32 FILE_DupUnixHandle( int fd );
 extern BOOL32 FILE_Stat( LPCSTR unixName, BY_HANDLE_FILE_INFORMATION *info );
 extern HFILE32 FILE_Dup( HFILE32 hFile );
@@ -72,7 +69,7 @@
 extern HFILE32 FILE_Open( LPCSTR path, INT32 mode ,INT32 sharemode);
 extern HFILE32 FILE_OpenUnixFile( LPCSTR path, INT32 mode );
 extern BOOL32 FILE_SetFileType( HFILE32 hFile, DWORD type );
-extern LPVOID FILE_dommap( FILE_OBJECT *file, int unix_handle, LPVOID start,
+extern LPVOID FILE_dommap( int unix_handle, LPVOID start,
                            DWORD size_high, DWORD size_low,
                            DWORD offset_high, DWORD offset_low,
                            int prot, int flags );
diff --git a/scheduler/client.c b/scheduler/client.c
index 4f01efd..24fdfa4 100644
--- a/scheduler/client.c
+++ b/scheduler/client.c
@@ -28,7 +28,7 @@
 /***********************************************************************
  *           CLIENT_ProtocolError
  */
-void CLIENT_ProtocolError( const char *err, ... )
+static void CLIENT_ProtocolError( const char *err, ... )
 {
     THDB *thdb = THREAD_Current();
     va_list args;
@@ -216,6 +216,26 @@
 
 
 /***********************************************************************
+ *           CLIENT_WaitSimpleReply
+ *
+ * Wait for a simple fixed-length reply from the server.
+ */
+unsigned int CLIENT_WaitSimpleReply( void *reply, int len, int *passed_fd )
+{
+    struct iovec vec[2];
+    unsigned int ret;
+    int got;
+
+    vec[1].iov_base = reply;
+    vec[1].iov_len  = len;
+    ret = CLIENT_WaitReply_v( &got, passed_fd, vec, 2 );
+    if (got != len)
+        CLIENT_ProtocolError( "WaitSimpleReply: len %d != %d\n", len, got );
+    return ret;
+}
+
+
+/***********************************************************************
  *           CLIENT_NewThread
  *
  * Send a new thread request.
@@ -224,7 +244,7 @@
 {
     struct new_thread_request request;
     struct new_thread_reply reply;
-    int len, fd[2];
+    int fd[2];
     extern BOOL32 THREAD_InitDone;
     extern void server_init( int fd );
     extern void select_loop(void);
@@ -273,16 +293,13 @@
 
     request.pid = thdb->process->server_pid;
     CLIENT_SendRequest( REQ_NEW_THREAD, fd[1], 1, &request, sizeof(request) );
-
-    if (CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) )) goto error;
-    if (len < sizeof(reply)) goto error;
+    if (CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL )) goto error;
     thdb->server_tid = reply.tid;
     thdb->process->server_pid = reply.pid;
     if (thdb->socket != -1) close( thdb->socket );
     thdb->socket = fd[0];
     thdb->seq = 0;  /* reset the sequence number for the new fd */
 
-    /* we don't need the handles for now */
     if (thandle) *thandle = reply.thandle;
     else if (reply.thandle != -1) CLIENT_CloseHandle( reply.thandle );
     if (phandle) *phandle = reply.phandle;
@@ -359,45 +376,12 @@
     req.options     = options;
 
     CLIENT_SendRequest( REQ_DUP_HANDLE, -1, 1, &req, sizeof(req) );
-    CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
-    CHECK_LEN( len, sizeof(reply) );
+    CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL );
     return reply.handle;
 }
 
 
 /***********************************************************************
- *           CLIENT_GetProcessInfo
- *
- * Send a get process info request. Return 0 if OK.
- */
-int CLIENT_GetProcessInfo( int handle, struct get_process_info_reply *reply )
-{
-    int len, err;
-
-    CLIENT_SendRequest( REQ_GET_PROCESS_INFO, -1, 1, &handle, sizeof(handle) );
-    err = CLIENT_WaitReply( &len, NULL, 1, reply, sizeof(*reply) );
-    CHECK_LEN( len, sizeof(*reply) );
-    return err;
-}
-
-
-/***********************************************************************
- *           CLIENT_GetThreadInfo
- *
- * Send a get thread info request. Return 0 if OK.
- */
-int CLIENT_GetThreadInfo( int handle, struct get_thread_info_reply *reply )
-{
-    int len, err;
-
-    CLIENT_SendRequest( REQ_GET_THREAD_INFO, -1, 1, &handle, sizeof(handle) );
-    err = CLIENT_WaitReply( &len, NULL, 1, reply, sizeof(*reply) );
-    CHECK_LEN( len, sizeof(*reply) );
-    return err;
-}
-
-
-/***********************************************************************
  *           CLIENT_OpenProcess
  *
  * Open a handle to a process.
@@ -406,15 +390,13 @@
 {
     struct open_process_request req;
     struct open_process_reply reply;
-    int len;
 
     req.pid     = pid;
     req.access  = access;
     req.inherit = inherit;
 
     CLIENT_SendRequest( REQ_OPEN_PROCESS, -1, 1, &req, sizeof(req) );
-    CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
-    CHECK_LEN( len, sizeof(reply) );
+    CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL );
     return reply.handle;
 }
 
@@ -435,7 +417,6 @@
     CLIENT_SendRequest( REQ_SELECT, -1, 2,
                         &req, sizeof(req),
                         handles, count * sizeof(int) );
-    CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
-    CHECK_LEN( len, sizeof(reply) );
+    CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL );
     return reply.signaled;
 }
diff --git a/scheduler/event.c b/scheduler/event.c
index 30a1c76..fbf2991 100644
--- a/scheduler/event.c
+++ b/scheduler/event.c
@@ -20,13 +20,6 @@
     K32OBJ        header;
 } EVENT;
 
-static void EVENT_Destroy( K32OBJ *obj );
-
-const K32OBJ_OPS EVENT_Ops =
-{
-    EVENT_Destroy       /* destroy */
-};
-
 
 /***********************************************************************
  *           CreateEvent32A    (KERNEL32.156)
@@ -45,8 +38,7 @@
     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) );
+    CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL );
     if (reply.handle == -1) return 0;
 
     SYSTEM_LOCK();
@@ -96,8 +88,7 @@
     req.access  = access;
     req.inherit = inherit;
     CLIENT_SendRequest( REQ_OPEN_NAMED_OBJ, -1, 2, &req, sizeof(req), name, len );
-    CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
-    CHECK_LEN( len, sizeof(reply) );
+    CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL );
     if (reply.handle != -1)
     {
         SYSTEM_LOCK();
@@ -173,20 +164,6 @@
 
 
 /***********************************************************************
- *           EVENT_Destroy
- */
-static void EVENT_Destroy( K32OBJ *obj )
-{
-    EVENT *event = (EVENT *)obj;
-    assert( obj->type == K32OBJ_EVENT );
-    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
diff --git a/scheduler/k32obj.c b/scheduler/k32obj.c
index a0b8e82..3d67e95 100644
--- a/scheduler/k32obj.c
+++ b/scheduler/k32obj.c
@@ -21,23 +21,25 @@
 extern const K32OBJ_OPS CONSOLE_Ops;
 extern const K32OBJ_OPS SNAPSHOT_Ops;
 
-/* The following are fully implemented in the server and could be removed */
-extern const K32OBJ_OPS SEMAPHORE_Ops;
-extern const K32OBJ_OPS EVENT_Ops;
-extern const K32OBJ_OPS MUTEX_Ops;
-extern const K32OBJ_OPS PIPE_Ops;
-
 static const K32OBJ_OPS K32OBJ_NullOps =
 {
     NULL     /* destroy */
 };
 
+static void K32OBJ_Destroy( K32OBJ *obj );
+
+static const K32OBJ_OPS K32OBJ_DefaultOps =
+{
+    K32OBJ_Destroy     /* destroy */
+};
+
+
 const K32OBJ_OPS * const K32OBJ_Ops[K32OBJ_NBOBJECTS] =
 {
     NULL,
-    &SEMAPHORE_Ops,         /* K32OBJ_SEMAPHORE */
-    &EVENT_Ops,             /* K32OBJ_EVENT */
-    &MUTEX_Ops,             /* K32OBJ_MUTEX */
+    &K32OBJ_DefaultOps,     /* K32OBJ_SEMAPHORE */
+    &K32OBJ_DefaultOps,     /* K32OBJ_EVENT */
+    &K32OBJ_DefaultOps,     /* K32OBJ_MUTEX */
     &K32OBJ_NullOps,        /* K32OBJ_CRITICAL_SECTION */
     &PROCESS_Ops,           /* K32OBJ_PROCESS */
     &THREAD_Ops,            /* K32OBJ_THREAD */
@@ -48,7 +50,7 @@
     &MEM_MAPPED_FILE_Ops,   /* K32OBJ_MEM_MAPPED_FILE */
     &K32OBJ_NullOps,        /* K32OBJ_SERIAL */
     &DEVICE_Ops,            /* K32OBJ_DEVICE_IOCTL */
-    &PIPE_Ops,              /* K32OBJ_PIPE */
+    &K32OBJ_DefaultOps,     /* K32OBJ_PIPE */
     &K32OBJ_NullOps,        /* K32OBJ_MAILSLOT */
     &K32OBJ_NullOps,        /* K32OBJ_TOOLHELP_SNAPSHOT */
     &K32OBJ_NullOps         /* K32OBJ_SOCKET */
@@ -113,6 +115,18 @@
 
 
 /***********************************************************************
+ *           K32OBJ_Destroy
+ *
+ * Generic destroy functions for objects that don't need any special treatment.
+ */
+static void K32OBJ_Destroy( K32OBJ *obj )
+{
+    obj->type = K32OBJ_UNKNOWN;
+    HeapFree( SystemHeap, 0, obj );
+}
+
+
+/***********************************************************************
  *           K32OBJ_IsValid
  *
  * Check if a pointer is a valid kernel object
diff --git a/scheduler/mutex.c b/scheduler/mutex.c
index 05c72ed..83f1917 100644
--- a/scheduler/mutex.c
+++ b/scheduler/mutex.c
@@ -19,13 +19,6 @@
     K32OBJ         header;
 } MUTEX;
 
-static void MUTEX_Destroy( K32OBJ *obj );
-
-const K32OBJ_OPS MUTEX_Ops =
-{
-    MUTEX_Destroy      /* destroy */
-};
-
 
 /***********************************************************************
  *           CreateMutex32A   (KERNEL32.166)
@@ -43,8 +36,7 @@
     req.inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
 
     CLIENT_SendRequest( REQ_CREATE_MUTEX, -1, 2, &req, sizeof(req), name, len );
-    CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
-    CHECK_LEN( len, sizeof(reply) );
+    CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL );
     if (reply.handle == -1) return 0;
 
     SYSTEM_LOCK();
@@ -86,8 +78,7 @@
     req.access  = access;
     req.inherit = inherit;
     CLIENT_SendRequest( REQ_OPEN_NAMED_OBJ, -1, 2, &req, sizeof(req), name, len );
-    CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
-    CHECK_LEN( len, sizeof(reply) );
+    CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL );
     if (reply.handle != -1)
     {
         SYSTEM_LOCK();
@@ -130,15 +121,3 @@
     CLIENT_SendRequest( REQ_RELEASE_MUTEX, -1, 1, &req, sizeof(req) );
     return !CLIENT_WaitReply( NULL, NULL, 0 );
 }
-
-
-/***********************************************************************
- *           MUTEX_Destroy
- */
-static void MUTEX_Destroy( K32OBJ *obj )
-{
-    MUTEX *mutex = (MUTEX *)obj;
-    assert( obj->type == K32OBJ_MUTEX );
-    obj->type = K32OBJ_UNKNOWN;
-    HeapFree( SystemHeap, 0, mutex );
-}
diff --git a/scheduler/pipe.c b/scheduler/pipe.c
index 94279fb..0847ec5 100644
--- a/scheduler/pipe.c
+++ b/scheduler/pipe.c
@@ -19,13 +19,6 @@
     K32OBJ         header;
 } PIPE;
 
-static void PIPE_Destroy( K32OBJ *obj );
-
-const K32OBJ_OPS PIPE_Ops =
-{
-    PIPE_Destroy      /* destroy */
-};
-
 
 /***********************************************************************
  *	CreatePipe    (KERNEL32.170)
@@ -71,16 +64,3 @@
     SYSTEM_UNLOCK();
     return TRUE;
 }
-
-
-/***********************************************************************
- *           PIPE_Destroy
- */
-static void PIPE_Destroy( K32OBJ *obj )
-{
-    PIPE *pipe = (PIPE *)obj;
-    assert( obj->type == K32OBJ_PIPE );
-    obj->type = K32OBJ_UNKNOWN;
-    HeapFree( SystemHeap, 0, pipe );
-}
-
diff --git a/scheduler/semaphore.c b/scheduler/semaphore.c
index 561d536..24a70db 100644
--- a/scheduler/semaphore.c
+++ b/scheduler/semaphore.c
@@ -19,13 +19,6 @@
     K32OBJ        header;
 } SEMAPHORE;
 
-static void SEMAPHORE_Destroy( K32OBJ *obj );
-
-const K32OBJ_OPS SEMAPHORE_Ops =
-{
-    SEMAPHORE_Destroy      /* destroy */
-};
-
 
 /***********************************************************************
  *           CreateSemaphore32A   (KERNEL32.174)
@@ -52,8 +45,7 @@
     req.inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
 
     CLIENT_SendRequest( REQ_CREATE_SEMAPHORE, -1, 2, &req, sizeof(req), name, len );
-    CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
-    CHECK_LEN( len, sizeof(reply) );
+    CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL );
     if (reply.handle == -1) return 0;
 
     SYSTEM_LOCK();
@@ -95,8 +87,7 @@
     req.access  = access;
     req.inherit = inherit;
     CLIENT_SendRequest( REQ_OPEN_NAMED_OBJ, -1, 2, &req, sizeof(req), name, len );
-    CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
-    CHECK_LEN( len, sizeof(reply) );
+    CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL );
     if (reply.handle != -1)
     {
         SYSTEM_LOCK();
@@ -133,7 +124,6 @@
 {
     struct release_semaphore_request req;
     struct release_semaphore_reply reply;
-    int len;
 
     if (count < 0)
     {
@@ -145,21 +135,7 @@
     if (req.handle == -1) return FALSE;
     req.count = (unsigned int)count;
     CLIENT_SendRequest( REQ_RELEASE_SEMAPHORE, -1, 1, &req, sizeof(req) );
-    if (CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) )) return FALSE;
-    CHECK_LEN( len, sizeof(reply) );
+    if (CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL )) return FALSE;
     if (previous) *previous = reply.prev_count;
     return TRUE;
 }
-
-
-/***********************************************************************
- *           SEMAPHORE_Destroy
- */
-static void SEMAPHORE_Destroy( K32OBJ *obj )
-{
-    SEMAPHORE *sem = (SEMAPHORE *)obj;
-    assert( obj->type == K32OBJ_SEMAPHORE );
-    /* There cannot be any thread on the list since the ref count is 0 */
-    obj->type = K32OBJ_UNKNOWN;
-    HeapFree( SystemHeap, 0, sem );
-}
diff --git a/win32/console.c b/win32/console.c
index ae53a8b..31c9d87 100644
--- a/win32/console.c
+++ b/win32/console.c
@@ -60,7 +60,6 @@
         LPSTR   		title;	/* title of console */
 	INPUT_RECORD		*irs;	/* buffered input records */
 	int			nrofirs;/* nr of buffered input records */
-	THREAD_QUEUE   		wait_queue;
 } CONSOLE;
 
 static void CONSOLE_Destroy( K32OBJ *obj );
@@ -644,7 +643,6 @@
 {
         struct create_console_request req;
         struct create_console_reply reply;
-        int len;
 	PDB32 *pdb = PROCESS_Current();
 	CONSOLE *console;
 	HANDLE32 hIn, hOut, hErr;
@@ -674,7 +672,6 @@
         console->pid             = -1;
         console->title           = NULL;
 	console->nrofirs	 = 0;
-	console->wait_queue	 = NULL;
 	console->irs	 	 = HeapAlloc(GetProcessHeap(),0,1);;
     	console->mode		 =   ENABLE_PROCESSED_INPUT
 				   | ENABLE_LINE_INPUT
@@ -685,13 +682,12 @@
         console->hread = console->hwrite = -1;
 
         CLIENT_SendRequest( REQ_CREATE_CONSOLE, -1, 1, &req, sizeof(req) );
-        if (CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) ) != ERROR_SUCCESS)
+        if (CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL ) != ERROR_SUCCESS)
         {
             K32OBJ_DecCount(&console->header);
             SYSTEM_UNLOCK();
             return FALSE;
         }
-        CHECK_LEN( len, sizeof(reply) );
         console->hread = reply.handle_read;
         console->hwrite = reply.handle_write;