pass user_data to libtelnet_init() only instead of having to pass it to every function call
diff --git a/README b/README
index f3d7e1a..c7860b2 100644
--- a/README
+++ b/README
@@ -20,7 +20,6 @@
 
  - RFC 1143 option negotiation algorithm
  - automatic MCCP2 handling (controllable by host app)
- ? MCCP1
  ? ZMP parsing
  ? MSSP parsing
  ? ENVIRON/NEW-ENVIRON parsing
@@ -59,7 +58,8 @@
    API calls.
 
  void libtelnet_init(struct libtelnet_t *telnet,
-     libtelnet_event_handler_t handler, enum libtelnet_mode_t mode);
+     libtelnet_event_handler_t handler, enum libtelnet_mode_t mode,
+     void *user_data);
    The libtelnet_init() function is responsible for initializing
    the data in a libtelnet_t structure.  It must be called
    immediately after establishing a connection and before any other
@@ -69,6 +69,11 @@
    libtelnet_event_handler_t definition.  More information about
    events can be found in section IId.
 
+   The user_data parameter is passed to the event handler whenver it
+   is invoked.  This will usually be a structure container
+   information about the connection, including a socket descriptor
+   for implementing LIBTELNET_EV_SEND event handling.
+
    The mode parameter must be one of LIBTELNET_MODE_SERVER,
    LIBTELNET_MODE_CLIENT, or LIBTELNET_MODE_PROXY.  These slightly
    alter the behavior of libtelnet in certain instances.  If you are
@@ -98,8 +103,7 @@
 IIc. Sending Data
 
  All of the libtelnet_send_*() functions will invoke the
- LIBTELNET_EV_SEND event.  The user_data parameter to each of these
- functions is passed through to the callback.
+ LIBTELNET_EV_SEND event.
 
  Note: it is very important that ALL data sent to the remote end of
  the connection be passed through libtelnet.  All user input or
@@ -108,25 +112,24 @@
  data directly!
 
  void libtelnet_send_command(struct libtelnet_t *telnet,
-     unsigned char cmd, void *user_data);
+     unsigned char cmd);
    Sends a single "simple" TELNET command, such as the GO-AHEAD
    commands (255 249).
 
  void libtelnet_send_negotiate(struct libtelnet_t *telnet,
-     unsigned char cmd, unsigned char opt, void *user_data);
+     unsigned char cmd, unsigned char opt);
    Sends a TELNET negotiation command.  The cmd parameter must be
    one of LIBTELNET_WILL, LIBTELNET_DONT, LIBTELNET_DO, or
    LIBTELNET_DONT.  The opt parameter is the option to
    negotiate.
 
  void libtelnet_send_data(struct libtelnet_t *telnet,
-     unsigned char *buffer, unsigned int size, void *user_data);
+     unsigned char *buffer, unsigned int size);
    Sends raw data, which would be either the process output from
    a server or the user input from a client.
 
  void libtelnet_send_subnegotiation(struct libtelnet_t *telnet,
-     unsigned char opt, unsigned char *buffer, unsigned int size,
-     void *user_data);
+     unsigned char opt, unsigned char *buffer, unsigned int size);
    Sends a TELNET sub-negotiation command.  The opt parameter
    is the sub-negotiation option.
 
@@ -141,9 +144,10 @@
  meet the following prototype:
 
   void (libtelnet_t *telnet, libtelnet_event_t *event,
-      void *user_data); 
-
- The libtelnet_event_t structure has the following definition:
+      void *user_data);
+ 
+ The event structure is detailed below.  The user_data value is the
+ pointer passed to libtelnet_init().
 
   struct libtelnet_event_t {
     enum libtelnet_event_type_t type;
diff --git a/libtelnet.c b/libtelnet.c
index 27513ef..ea0e661 100644
--- a/libtelnet.c
+++ b/libtelnet.c
@@ -26,14 +26,14 @@
 #ifdef ERROR
 #  undef ERROR
 #endif
-#define ERROR(telnet, code, user_data, msg) \
-		_error(telnet, __FILE__, __LINE__, code, user_data, "%s", msg)
-#define ERROR_NOMEM(telnet, user_data, msg) \
-		_error(telnet, __FILE__, __LINE__, LIBTELNET_ENOMEM, user_data, \
+#define ERROR(telnet, code, msg) \
+		_error(telnet, __FILE__, __LINE__, code, "%s", msg)
+#define ERROR_NOMEM(telnet, msg) \
+		_error(telnet, __FILE__, __LINE__, LIBTELNET_ENOMEM, \
 		"%s: %s", msg, strerror(errno))
-#define ERROR_ZLIB(telnet, user_data, rs, msg) \
+#define ERROR_ZLIB(telnet, rs, msg) \
 		_error(telnet, __FILE__, __LINE__, LIBTELNET_EUNKNOWN, \
-		user_data, "%s: %s", msg, zError(rs))
+		"%s: %s", msg, zError(rs))
 
 /* buffer sizes */
 static const unsigned int _buffer_sizes[] = {
@@ -49,8 +49,7 @@
 /* event dispatch helper */
 static void _event(struct libtelnet_t *telnet,
 		enum libtelnet_event_type_t type, unsigned char command,
-		unsigned char telopt, unsigned char *buffer, unsigned int size,
-		void *user_data) {
+		unsigned char telopt, unsigned char *buffer, unsigned int size) {
 	struct libtelnet_event_t ev;
 	ev.type = type;
 	ev.command = command;
@@ -58,12 +57,12 @@
 	ev.buffer = buffer;
 	ev.size = size;
 
-	telnet->eh(telnet, &ev, user_data);
+	telnet->eh(telnet, &ev, telnet->ud);
 }
 
 /* error generation function */
 static void _error(struct libtelnet_t *telnet, const char *file, unsigned line,
-		enum libtelnet_error_t err, void *user_data, const char *fmt, ...) {
+		enum libtelnet_error_t err, const char *fmt, ...) {
 	char buffer[512];
 	va_list va;
 
@@ -76,22 +75,21 @@
 			fmt, va);
 	va_end(va);
 
-	_event(telnet, LIBTELNET_EV_ERROR, err, 0, 0, 0, user_data);
+	_event(telnet, LIBTELNET_EV_ERROR, err, 0, 0, 0);
 }
 
 /* initialize the zlib box for a telnet box; if deflate is non-zero, it
  * initializes zlib for delating (compression), otherwise for inflating
  * (decompression)
  */
-z_stream *_init_zlib(struct libtelnet_t *telnet, int deflate,
-		void *user_data) {
+z_stream *_init_zlib(struct libtelnet_t *telnet, int deflate) {
 	z_stream *zlib;
 	int rs;
 
 	/* allocate zstream box */
 	if ((zlib = (z_stream *)calloc(1, sizeof(z_stream)))
 			== 0) {
-		ERROR_NOMEM(telnet, user_data, "malloc() failed");
+		ERROR_NOMEM(telnet, "malloc() failed");
 		return 0;
 	}
 
@@ -99,13 +97,13 @@
 	if (deflate) {
 		if ((rs = deflateInit(zlib, Z_DEFAULT_COMPRESSION)) != Z_OK) {
 			free(zlib);
-			ERROR_ZLIB(telnet, user_data, rs, "deflateInit() failed");
+			ERROR_ZLIB(telnet, rs, "deflateInit() failed");
 			return 0;
 		}
 	} else {
 		if ((rs = inflateInit(zlib)) != Z_OK) {
 			free(zlib);
-			ERROR_ZLIB(telnet, user_data, rs, "inflateInit() failed");
+			ERROR_ZLIB(telnet, rs, "inflateInit() failed");
 			return 0;
 		}
 	}
@@ -115,8 +113,9 @@
 
 /* initialize a telnet state tracker */
 void libtelnet_init(struct libtelnet_t *telnet, libtelnet_event_handler_t eh,
-		enum libtelnet_mode_t mode) {
+		enum libtelnet_mode_t mode, void *user_data) {
 	memset(telnet, 0, sizeof(struct libtelnet_t));
+	telnet->ud = user_data;
 	telnet->eh = eh;
 	telnet->mode = mode;
 }
@@ -146,7 +145,7 @@
 
 /* push a byte into the telnet buffer */
 static enum libtelnet_error_t _buffer_byte(struct libtelnet_t *telnet,
-		unsigned char byte, void *user_data) {
+		unsigned char byte) {
 	unsigned char *new_buffer;
 	int i;
 
@@ -161,7 +160,7 @@
 		/* overflow -- can't grow any more */
 		if (i >= _buffer_sizes_count - 1) {
 			_error(telnet, __FILE__, __LINE__, LIBTELNET_EOVERFLOW,
-					user_data, "subnegotiation buffer size limit reached");
+					"subnegotiation buffer size limit reached");
 			libtelnet_free(telnet);
 			return LIBTELNET_EOVERFLOW;
 		}
@@ -170,7 +169,7 @@
 		new_buffer = (unsigned char *)realloc(telnet->buffer,
 				_buffer_sizes[i + 1]);
 		if (new_buffer == 0) {
-			ERROR_NOMEM(telnet, user_data, "realloc() failed");
+			ERROR_NOMEM(telnet, "realloc() failed");
 			libtelnet_free(telnet);
 			return LIBTELNET_ENOMEM;
 		}
@@ -185,7 +184,7 @@
 }
 
 static void _process(struct libtelnet_t *telnet, unsigned char *buffer,
-		unsigned int size, void *user_data) {
+		unsigned int size) {
 	unsigned char byte;
 	unsigned int i, start;
 	for (i = start = 0; i != size; ++i) {
@@ -198,7 +197,7 @@
 			if (byte == LIBTELNET_IAC) {
 				if (i != start)
 					_event(telnet, LIBTELNET_EV_DATA, 0, 0, &buffer[start],
-							i - start, user_data);
+							i - start);
 				telnet->state = LIBTELNET_STATE_IAC;
 			}
 			break;
@@ -225,13 +224,13 @@
 				break;
 			/* IAC escaping */
 			case LIBTELNET_IAC:
-				_event(telnet, LIBTELNET_EV_DATA, 0, 0, &byte, 1, user_data);
+				_event(telnet, LIBTELNET_EV_DATA, 0, 0, &byte, 1);
 				start = i + 1;
 				telnet->state = LIBTELNET_STATE_DATA;
 				break;
 			/* some other command */
 			default:
-				_event(telnet, LIBTELNET_EV_IAC, byte, 0, 0, 0, user_data);
+				_event(telnet, LIBTELNET_EV_IAC, byte, 0, 0, 0);
 				start = i + 1;
 				telnet->state = LIBTELNET_STATE_DATA;
 			}
@@ -239,26 +238,22 @@
 
 		/* negotiation commands */
 		case LIBTELNET_STATE_DO:
-			_event(telnet, LIBTELNET_EV_NEGOTIATE, LIBTELNET_DO, byte,
-					0, 0, user_data);
+			_event(telnet, LIBTELNET_EV_NEGOTIATE, LIBTELNET_DO, byte, 0, 0);
 			start = i + 1;
 			telnet->state = LIBTELNET_STATE_DATA;
 			break;
 		case LIBTELNET_STATE_DONT:
-			_event(telnet, LIBTELNET_EV_NEGOTIATE, LIBTELNET_DONT, byte,
-					0, 0, user_data);
+			_event(telnet, LIBTELNET_EV_NEGOTIATE, LIBTELNET_DONT, byte, 0, 0);
 			start = i + 1;
 			telnet->state = LIBTELNET_STATE_DATA;
 			break;
 		case LIBTELNET_STATE_WILL:
-			_event(telnet, LIBTELNET_EV_NEGOTIATE, LIBTELNET_WILL, byte,
-					0, 0, user_data);
+			_event(telnet, LIBTELNET_EV_NEGOTIATE, LIBTELNET_WILL, byte, 0, 0);
 			start = i + 1;
 			telnet->state = LIBTELNET_STATE_DATA;
 			break;
 		case LIBTELNET_STATE_WONT:
-			_event(telnet, LIBTELNET_EV_NEGOTIATE, LIBTELNET_WONT, byte,
-					0, 0, user_data);
+			_event(telnet, LIBTELNET_EV_NEGOTIATE, LIBTELNET_WONT, byte, 0, 0);
 			start = i + 1;
 			telnet->state = LIBTELNET_STATE_DATA;
 			break;
@@ -276,8 +271,7 @@
 			if (byte == LIBTELNET_IAC) {
 				telnet->state = LIBTELNET_STATE_SB_DATA_IAC;
 			/* buffer the byte, or bail if we can't */
-			} else if (_buffer_byte(telnet, byte, user_data) !=
-					LIBTELNET_EOK) {
+			} else if (_buffer_byte(telnet, byte) != LIBTELNET_EOK) {
 				start = i + 1;
 				telnet->state = LIBTELNET_STATE_DATA;
 			}
@@ -294,8 +288,7 @@
 
 				/* invoke callback */
 				_event(telnet, LIBTELNET_EV_SUBNEGOTIATION, 0,
-						telnet->sb_telopt, telnet->buffer, telnet->length,
-						user_data);
+						telnet->sb_telopt, telnet->buffer, telnet->length);
 
 #ifdef HAVE_ZLIB
 				/* if we are a client or a proxy and just received the
@@ -307,13 +300,12 @@
 						(telnet->mode == LIBTELNET_MODE_CLIENT ||
 						 telnet->mode == LIBTELNET_MODE_PROXY)) {
 
-					if ((telnet->z_inflate = _init_zlib(telnet, 0, user_data))
+					if ((telnet->z_inflate = _init_zlib(telnet, 0))
 							== 0)
 						break;
 
 					/* notify app that compression was enabled */
-					_event(telnet, LIBTELNET_EV_COMPRESS, 1, 0, 0, 0,
-							user_data);
+					_event(telnet, LIBTELNET_EV_COMPRESS, 1, 0, 0, 0);
 
 					/* any remaining bytes in the buffer are compressed.
 					 * we have to re-invoke libtelnet_push to get those
@@ -321,8 +313,7 @@
 					 * remaining compressed bytes in the current _process
 					 * buffer argument
 					 */
-					libtelnet_push(telnet, &buffer[start], size - start,
-							user_data);
+					libtelnet_push(telnet, &buffer[start], size - start);
 					return;
 				}
 #endif /* HAVE_ZLIB */
@@ -331,7 +322,7 @@
 			/* escaped IAC byte */
 			case LIBTELNET_IAC:
 				/* push IAC into buffer */
-				if (_buffer_byte(telnet, LIBTELNET_IAC, user_data) !=
+				if (_buffer_byte(telnet, LIBTELNET_IAC) !=
 						LIBTELNET_EOK) {
 					start = i + 1;
 					telnet->state = LIBTELNET_STATE_DATA;
@@ -342,7 +333,7 @@
 			/* something else -- protocol error */
 			default:
 				_error(telnet, __FILE__, __LINE__, LIBTELNET_EPROTOCOL,
-						user_data, "unexpected byte after IAC inside SB: %d",
+						"unexpected byte after IAC inside SB: %d",
 						byte);
 				start = i + 1;
 				telnet->state = LIBTELNET_STATE_DATA;
@@ -354,13 +345,12 @@
 
 	/* pass through any remaining bytes */ 
 	if (telnet->state == LIBTELNET_STATE_DATA && i != start)
-		_event(telnet, LIBTELNET_EV_DATA, 0, 0, buffer + start, i - start,
-				user_data);
+		_event(telnet, LIBTELNET_EV_DATA, 0, 0, buffer + start, i - start);
 }
 
 /* push a bytes into the state tracker */
 void libtelnet_push(struct libtelnet_t *telnet, unsigned char *buffer,
-		unsigned int size, void *user_data) {
+		unsigned int size) {
 #ifdef HAVE_ZLIB
 	/* if we have an inflate (decompression) zlib stream, use it */
 	if (telnet->z_inflate != 0) {
@@ -383,9 +373,9 @@
 			/* process the decompressed bytes on success */
 			if (rs == Z_OK || rs == Z_STREAM_END)
 				_process(telnet, inflate_buffer, sizeof(inflate_buffer) -
-						telnet->z_inflate->avail_out, user_data);
+						telnet->z_inflate->avail_out);
 			else
-				ERROR_ZLIB(telnet, user_data, rs, "inflate() failed");
+				ERROR_ZLIB(telnet, rs, "inflate() failed");
 
 			/* prepare output buffer for next run */
 			telnet->z_inflate->next_out = inflate_buffer;
@@ -393,7 +383,7 @@
 
 			/* on error (or on end of stream) disable further inflation */
 			if (rs != Z_OK) {
-				_event(telnet, LIBTELNET_EV_COMPRESS, 0, 0, 0, 0, user_data);
+				_event(telnet, LIBTELNET_EV_COMPRESS, 0, 0, 0, 0);
 
 				inflateEnd(telnet->z_inflate);
 				free(telnet->z_inflate);
@@ -405,11 +395,11 @@
 	/* COMPRESS2 is not negotiated, just process */
 	} else
 #endif /* HAVE_ZLIB */
-		_process(telnet, buffer, size, user_data);
+		_process(telnet, buffer, size);
 }
 
 static void _send(struct libtelnet_t *telnet, unsigned char *buffer,
-		unsigned int size, void *user_data) {
+		unsigned int size) {
 #ifdef HAVE_ZLIB
 	/* if we have a deflate (compression) zlib box, use it */
 	if (telnet->z_deflate != 0) {
@@ -426,7 +416,7 @@
 		while (telnet->z_deflate->avail_in > 0 || telnet->z_deflate->avail_out == 0) {
 			/* compress */
 			if ((rs = deflate(telnet->z_deflate, Z_SYNC_FLUSH)) != Z_OK) {
-				ERROR_ZLIB(telnet, user_data, rs, "deflate() failed");
+				ERROR_ZLIB(telnet, rs, "deflate() failed");
 				deflateEnd(telnet->z_deflate);
 				free(telnet->z_deflate);
 				telnet->z_deflate = 0;
@@ -434,8 +424,7 @@
 			}
 
 			_event(telnet, LIBTELNET_EV_SEND, 0, 0, deflate_buffer,
-					sizeof(deflate_buffer) - telnet->z_deflate->avail_out,
-					user_data);
+					sizeof(deflate_buffer) - telnet->z_deflate->avail_out);
 
 			/* prepare output buffer for next run */
 			telnet->z_deflate->next_out = deflate_buffer;
@@ -445,53 +434,51 @@
 	/* COMPRESS2 is not negotiated, just send */
 	} else
 #endif /* HAVE_ZLIB */
-		_event(telnet, LIBTELNET_EV_SEND, 0, 0, buffer, size, user_data);
+		_event(telnet, LIBTELNET_EV_SEND, 0, 0, buffer, size);
 }
 
 /* send an iac command */
-void libtelnet_send_command(struct libtelnet_t *telnet, unsigned char cmd,
-		void *user_data) {
+void libtelnet_send_command(struct libtelnet_t *telnet, unsigned char cmd) {
 	unsigned char bytes[2] = { LIBTELNET_IAC, cmd };
-	_send(telnet, bytes, 2, user_data);
+	_send(telnet, bytes, 2);
 }
 
 /* send negotiation */
 void libtelnet_send_negotiate(struct libtelnet_t *telnet, unsigned char cmd,
-		unsigned char opt, void *user_data) {
+		unsigned char opt) {
 	unsigned char bytes[3] = { LIBTELNET_IAC, cmd, opt };
-	_send(telnet, bytes, 3, user_data);
+	_send(telnet, bytes, 3);
 }
 
 /* send non-command data (escapes IAC bytes) */
 void libtelnet_send_data(struct libtelnet_t *telnet, unsigned char *buffer,
-		unsigned int size, void *user_data) {
+		unsigned int size) {
 	unsigned int i, l;
 	for (l = i = 0; i != size; ++i) {
 		/* dump prior portion of text, send escaped bytes */
 		if (buffer[i] == LIBTELNET_IAC) {
 			/* dump prior text if any */
 			if (i != l)
-				_send(telnet, buffer + l, i - l, user_data);
+				_send(telnet, buffer + l, i - l);
 			l = i + 1;
 
 			/* send escape */
-			libtelnet_send_command(telnet, LIBTELNET_IAC, user_data);
+			libtelnet_send_command(telnet, LIBTELNET_IAC);
 		}
 	}
 
 	/* send whatever portion of buffer is left */
 	if (i != l)
-		_send(telnet, buffer + l, i - l, user_data);
+		_send(telnet, buffer + l, i - l);
 }
 
 /* send sub-request */
 void libtelnet_send_subnegotiation(struct libtelnet_t *telnet,
-		unsigned char opt, unsigned char *buffer, unsigned int size,
-		void *user_data)  {
-	libtelnet_send_command(telnet, LIBTELNET_SB, user_data);
-	libtelnet_send_data(telnet, &opt, 1, user_data);
-	libtelnet_send_data(telnet, buffer, size, user_data);
-	libtelnet_send_command(telnet, LIBTELNET_SE, user_data);
+		unsigned char opt, unsigned char *buffer, unsigned int size) {
+	libtelnet_send_command(telnet, LIBTELNET_SB);
+	libtelnet_send_data(telnet, &opt, 1);
+	libtelnet_send_data(telnet, buffer, size);
+	libtelnet_send_command(telnet, LIBTELNET_SE);
 
 #ifdef HAVE_ZLIB
 	/* if we're a proxy and we just sent the COMPRESS2 marker, we must
@@ -501,16 +488,16 @@
 			telnet->z_deflate == 0 &&
 			opt == LIBTELNET_TELOPT_COMPRESS2) {
 
-		if ((telnet->z_deflate = _init_zlib(telnet, 1, user_data)) == 0)
+		if ((telnet->z_deflate = _init_zlib(telnet, 1)) == 0)
 			return;
 
 		/* notify app that compression was enabled */
-		_event(telnet, LIBTELNET_EV_COMPRESS, 1, 0, 0, 0, user_data);
+		_event(telnet, LIBTELNET_EV_COMPRESS, 1, 0, 0, 0);
 	}
 #endif /* HAVE_ZLIB */
 }
 
-void libtelnet_begin_compress2(struct libtelnet_t *telnet, void *user_data) {
+void libtelnet_begin_compress2(struct libtelnet_t *telnet) {
 #ifdef HAVE_ZLIB
 	z_stream *zlib;
 
@@ -523,12 +510,11 @@
 		return;
 
 	/* attempt to create output stream first, bail if we can't */
-	if ((zlib = _init_zlib(telnet, 1, user_data)) == 0)
+	if ((zlib = _init_zlib(telnet, 1)) == 0)
 		return;
 
 	/* send compression marker */
-	libtelnet_send_subnegotiation(telnet, LIBTELNET_TELOPT_COMPRESS2, 0, 0,
-			user_data);
+	libtelnet_send_subnegotiation(telnet, LIBTELNET_TELOPT_COMPRESS2, 0, 0);
 
 	/* set our deflate stream */
 	telnet->z_deflate = zlib;
diff --git a/libtelnet.h b/libtelnet.h
index 629dace..11e01b9 100644
--- a/libtelnet.h
+++ b/libtelnet.h
@@ -144,6 +144,8 @@
 
 /* state tracker */
 struct libtelnet_t {
+	/* user data */
+	void *ud;
 	/* event handler */
 	libtelnet_event_handler_t eh;
 #ifdef HAVE_ZLIB
@@ -167,34 +169,33 @@
 
 /* initialize a telnet state tracker */
 extern void libtelnet_init(struct libtelnet_t *telnet,
-		libtelnet_event_handler_t eh, enum libtelnet_mode_t mode);
+		libtelnet_event_handler_t eh, enum libtelnet_mode_t mode,
+		void *user_data);
 
 /* free up any memory allocated by a state tracker */
 extern void libtelnet_free(struct libtelnet_t *telnet);
 
 /* push a byte buffer into the state tracker */
 extern void libtelnet_push(struct libtelnet_t *telnet,
-		unsigned char *buffer, unsigned int size, void *user_data);
+		unsigned char *buffer, unsigned int size);
 
 /* send an iac command */
 extern void libtelnet_send_command(struct libtelnet_t *telnet,
-		unsigned char cmd, void *user_data);
+		unsigned char cmd);
 
 /* send negotiation */
 extern void libtelnet_send_negotiate(struct libtelnet_t *telnet,
-		unsigned char cmd, unsigned char opt, void *user_data);
+		unsigned char cmd, unsigned char opt);
 
 /* send non-command data (escapes IAC bytes) */
 extern void libtelnet_send_data(struct libtelnet_t *telnet,
-		unsigned char *buffer, unsigned int size, void *user_data);
+		unsigned char *buffer, unsigned int size);
 
 /* send sub-request */
 extern void libtelnet_send_subnegotiation(struct libtelnet_t *telnet,
-		unsigned char opt, unsigned char *buffer, unsigned int size,
-		void *user_data);
+		unsigned char opt, unsigned char *buffer, unsigned int size);
 
 /* begin sending compressed data (server only) */
-extern void libtelnet_begin_compress2(struct libtelnet_t *telnet,
-		void *user_data);
+extern void libtelnet_begin_compress2(struct libtelnet_t *telnet);
 
 #endif /* !defined(LIBTELNET_INCLUDE) */
diff --git a/telnet-proxy.c b/telnet-proxy.c
index 4f2f0a9..dbbbf05 100644
--- a/telnet-proxy.c
+++ b/telnet-proxy.c
@@ -172,8 +172,7 @@
 		print_buffer(ev->buffer, ev->size);
 		printf(COLOR_NORMAL "\n");
 
-		libtelnet_send_data(&conn->remote->telnet, ev->buffer, ev->size,
-				conn->remote);
+		libtelnet_send_data(&conn->remote->telnet, ev->buffer, ev->size);
 		break;
 	/* data must be sent */
 	case LIBTELNET_EV_SEND:
@@ -190,8 +189,7 @@
 		printf("%s IAC %s" COLOR_NORMAL "\n", conn->name,
 				get_cmd(ev->command));
 
-		libtelnet_send_command(&conn->remote->telnet, ev->command,
-				conn->remote);
+		libtelnet_send_command(&conn->remote->telnet, ev->command);
 		break;
 	/* negotiation */
 	case LIBTELNET_EV_NEGOTIATE:
@@ -199,7 +197,7 @@
 				get_cmd(ev->command), (int)ev->telopt, get_opt(ev->telopt));
 
 		libtelnet_send_negotiate(&conn->remote->telnet, ev->command,
-				ev->telopt, conn->remote);
+				ev->telopt);
 		break;
 	/* subnegotiation */
 	case LIBTELNET_EV_SUBNEGOTIATION:
@@ -212,7 +210,7 @@
 		printf(COLOR_NORMAL "\n");
 
 		libtelnet_send_subnegotiation(&conn->remote->telnet, ev->telopt,
-				ev->buffer, ev->size, conn->remote);
+				ev->buffer, ev->size);
 		break;
 	/* compression notification */
 	case LIBTELNET_EV_COMPRESS:
@@ -333,8 +331,10 @@
 		client.remote = &server;
 
 		/* initialize telnet boxes */
-		libtelnet_init(&server.telnet, _event_handler, LIBTELNET_MODE_PROXY);
-		libtelnet_init(&client.telnet, _event_handler, LIBTELNET_MODE_PROXY);
+		libtelnet_init(&server.telnet, _event_handler, LIBTELNET_MODE_PROXY,
+				&server);
+		libtelnet_init(&client.telnet, _event_handler, LIBTELNET_MODE_PROXY,
+				&client);
 
 		/* initialize poll descriptors */
 		memset(pfd, 0, sizeof(pfd));
@@ -348,7 +348,7 @@
 			/* read from server */
 			if (pfd[0].revents & POLLIN) {
 				if ((rs = recv(server.sock, buffer, sizeof(buffer), 0)) > 0) {
-					libtelnet_push(&server.telnet, buffer, rs, (void*)&server);
+					libtelnet_push(&server.telnet, buffer, rs);
 				} else if (rs == 0) {
 					printf("%s DISCONNECTED" COLOR_NORMAL "\n", server.name);
 					break;
@@ -362,7 +362,7 @@
 			/* read from client */
 			if (pfd[1].revents & POLLIN) {
 				if ((rs = recv(client.sock, buffer, sizeof(buffer), 0)) > 0) {
-					libtelnet_push(&client.telnet, buffer, rs, (void*)&client);
+					libtelnet_push(&client.telnet, buffer, rs);
 				} else if (rs == 0) {
 					printf("%s DISCONNECTED" COLOR_NORMAL "\n", client.name);
 					break;