diff --git a/src/client.c b/src/client.c
index 3c442e7441f0e46dd0e8cc622ab187bfee8839a0..f4d7c33a2690e27680c8da141a3f947d472bbe29 100644
--- a/src/client.c
+++ b/src/client.c
@@ -41,18 +41,17 @@
 #include "werror.h"
 #include "xalloc.h"
 
-struct read_handler *make_client_read_line(struct ssh_connection *c);
-struct callback *make_client_close_handler();
-
 static int client_initiate(struct fd_callback **c,
 			   int fd)
 {
   struct client_callback *closure
     = (struct client_callback *) *c;
 
+  int res;
+  
   /* FIXME: Should pass a key exchange handler, not NULL! */
   struct ssh_connection *connection
-    = make_ssh_connection(NULL);
+    = make_ssh_connection(closure->kexinit_handler);
 
   connection_init_io(connection,
 		     io_read_write(closure->backend, fd,
@@ -67,8 +66,14 @@ static int client_initiate(struct fd_callback **c,
 		 SOFTWARE_CLIENT_VERSION,
 		 closure->id_comment);
   
-  return A_WRITE(connection->raw,
-		 ssh_format("%lS\r\n", connection->client_version));
+  res = A_WRITE(connection->raw,
+		ssh_format("%lS\r\n", connection->client_version));
+  if (res != WRITE_OK)
+    return res;
+
+  return initiate_keyexchange(connection, CONNECTION_CLIENT,
+			      MAKE_KEXINIT(closure->init),
+			      NULL);
 }
 
 struct client_line_handler
@@ -146,11 +151,14 @@ struct read_handler *make_client_read_line(struct ssh_connection *c)
   return make_read_line(&closure->super);
 }
   
-struct fd_callback *make_client_callback(struct io_backend *b,
-					 char *comment,
-					 UINT32 block_size,
-					 struct randomness *r)
-					 
+struct fd_callback *
+make_client_callback(struct io_backend *b,
+		     char *comment,
+		     UINT32 block_size,
+		     struct randomness *random,
+		     struct make_kexinit *init,
+		     struct packet_handler *kexinit_handler)
+  
 {
   struct client_callback *connected = xalloc(sizeof(struct client_callback));
 
@@ -158,7 +166,11 @@ struct fd_callback *make_client_callback(struct io_backend *b,
   connected->backend = b;
   connected->block_size = block_size;
   connected->id_comment = comment;
-  connected->random = r;
+
+  connected->random = random;
+  connected->init = init;
+  connected->kexinit_handler = kexinit_handler;
+
   return &connected->super;
 }
 
@@ -168,7 +180,7 @@ static int client_die(struct callback *closure)
   exit(1);
 }
 
-struct callback *make_client_close_handler()
+struct callback *make_client_close_handler(void)
 {
   struct callback *c = xalloc(sizeof(struct callback));
 
@@ -176,26 +188,3 @@ struct callback *make_client_close_handler()
 
   return c;
 }
-
-#if 0
-/* FIXME: HERE */
-struct abstract_write *make_client_dispatch(struct ssh_connection *c)
-{
-  struct abstract_write *ignore = make_packet_void();
-  struct abstract_write *fail = make_disconnect(connection);
-  struct abstract_write *kex = make_client_key_exchange(connection);
-  
-  struct dispatch_assoc table[] = {
-    { SSH_MSG_DISCONNECT, make_handle_disconnect(connection) },
-    { SSH_MSG_IGNORE, ignore },
-    { SSH_MSG_UNIMPLEMENTED, ignore },
-    { SSH_MSG_DEBUG, make_handle_debug(connection) },
-    { SSH_MSG_SERVICE_REQUEST, fail },
-    { SSH_MSG_SERVICE_ACCEPT, fail },
-    { SSH_MSG_KEXINIT, kex },
-    { SSH_MSG_NEWKEYS, fail },
-    { SSH_MSG
-
-      
-#endif
-      
diff --git a/src/client.h b/src/client.h
index 9826532a482fbef44080e5281bfd2bda17041acd..10f0b40812115074764e67b5d3380b6af2e70e3f 100644
--- a/src/client.h
+++ b/src/client.h
@@ -27,7 +27,7 @@
 #define LSH_CLIENT_H_INCLUDED
 
 #include "io.h"
-#include "abstract_crypto.h"
+#include "keyexchange.h"
 
 struct client_callback
 {
@@ -35,13 +35,22 @@ struct client_callback
   struct io_backend *backend;
   UINT32 block_size;
   char *id_comment;
+
   struct randomness *random;
+  struct make_kexinit *init;
+  struct packet_handler *kexinit_handler;
 };
 
-struct fd_callback *make_client_callback(struct io_backend *b,
-					 char *comment,
-					 UINT32 block_size,
-					 struct randomness *r);
+struct fd_callback *
+make_client_callback(struct io_backend *b,
+		     char *comment,
+		     UINT32 block_size,
+		     struct randomness *random,
+		     struct make_kexinit *init,
+		     struct packet_handler *kexinit_handler);
+
+struct read_handler *make_client_read_line(struct ssh_connection *c);
+struct callback *make_client_close_handler(void);
 
 #if 0
 struct client_session
diff --git a/src/server.c b/src/server.c
index dfdea072d7d44d3ef67e28976e348b8a78e725b1..859d9320f57e0abcf12c0dabb70203c4730ec7f4 100644
--- a/src/server.c
+++ b/src/server.c
@@ -36,9 +36,6 @@
 #include "werror.h"
 #include "xalloc.h"
 
-struct read_handler *make_server_read_line();
-struct callback *make_server_close_handler();
-
 static int server_initiate(struct fd_callback **c,
 			   int fd)
 {
@@ -46,13 +43,18 @@ static int server_initiate(struct fd_callback **c,
   
   struct ssh_connection *connection
     = make_ssh_connection(closure->kexinit_handler);
-  struct abstract_write *write =
-    io_read_write(closure->backend, fd,
-		  make_server_read_line(),
-		  closure->block_size,
-		  make_server_close_handler());
 
+  int res;
+  
   verbose("server_initiate()\n");
+
+  connection_init_io(connection,
+		     io_read_write(closure->backend, fd,
+				   make_server_read_line(connection),
+				   closure->block_size,
+				   make_server_close_handler()),
+		     closure->random);
+
   
   connection->server_version
     = ssh_format("SSH-%lz-%lz %lz",
@@ -60,7 +62,14 @@ static int server_initiate(struct fd_callback **c,
 		 SOFTWARE_SERVER_VERSION,
 		 closure->id_comment);
 
-  return A_WRITE(write, ssh_format("%lS\r\n", connection->server_version));
+  res = A_WRITE(connection->raw,
+		 ssh_format("%lS\r\n", connection->server_version));
+  if (res != WRITE_OK)
+    return res;
+
+  return initiate_keyexchange(connection, CONNECTION_SERVER,
+			      MAKE_KEXINIT(closure->init),
+			      NULL);
 }
 
 struct server_line_handler
@@ -121,13 +130,13 @@ static struct read_handler *do_line(struct line_handler **h,
     }
 }
 
-struct read_handler *make_server_read_line(struct ssh_connection *s)
+struct read_handler *make_server_read_line(struct ssh_connection *c)
 {
   struct server_line_handler *closure
     = xalloc(sizeof(struct server_line_handler));
   
   closure->super.handler = do_line;
-  closure->connection = s;
+  closure->connection = c;
   
   return make_read_line(&closure->super);
 }
@@ -136,6 +145,8 @@ struct fd_callback *
 make_server_callback(struct io_backend *b,
 		     char *comment,
 		     UINT32 block_size,
+		     struct randomness *random,
+		     struct make_kexinit *init,
 		     struct packet_handler *kexinit_handler)
 {
   struct server_callback *connected = xalloc(sizeof(struct server_callback));
@@ -145,6 +156,8 @@ make_server_callback(struct io_backend *b,
   connected->block_size = block_size;
   connected->id_comment = comment;
 
+  connected->random = random;  
+  connected->init = init;
   connected->kexinit_handler = kexinit_handler;
   
   return &connected->super;
@@ -157,7 +170,7 @@ static int server_die(struct callback *closure)
   return 0;  /* Ignored */
 }
 
-struct callback *make_server_close_handler()
+struct callback *make_server_close_handler(void)
 {
   struct callback *c = xalloc(sizeof(struct callback));
 
diff --git a/src/server.h b/src/server.h
index f904bc32c039b8d3f7b4cdaf45942fee7abd8fb7..9bbecd159174a09b882b04023f669ab0fe122e0b 100644
--- a/src/server.h
+++ b/src/server.h
@@ -41,6 +41,8 @@ struct server_callback
   UINT32 block_size;
   char *id_comment;
 
+  struct randomness *random;
+  struct make_kexinit *init;
   struct packet_handler *kexinit_handler;
 };
 
@@ -48,6 +50,11 @@ struct fd_callback *
 make_server_callback(struct io_backend *b,
 		     char *comment,
 		     UINT32 block_size,
+		     struct randomness *random,		     
+		     struct make_kexinit *init,
 		     struct packet_handler *kexinit_handler);
 
+struct read_handler *make_server_read_line(struct ssh_connection *c);
+struct callback *make_server_close_handler(void);
+
 #endif /* LSH_SERVER_H_INCLUDED */