diff -Naur a/docs/signals.txt b/docs/signals.txt
--- a/docs/signals.txt	2008-11-02 12:42:31.000000000 +0100
+++ b/docs/signals.txt	2008-11-02 11:28:24.000000000 +0100
@@ -217,6 +217,8 @@
 
  "proxy client connected", CLIENT_REC
  "proxy client disconnected", CLIENT_REC
+ "proxy client command", CLIENT_REC, char *args, char *data
+ "proxy client dump", CLIENT_REC, char *data
 
 FE common
 ---------
diff -Naur a/src/irc/proxy/listen.c b/src/irc/proxy/listen.c
--- a/src/irc/proxy/listen.c	2008-11-02 12:42:31.000000000 +0100
+++ b/src/irc/proxy/listen.c	2008-11-02 11:28:17.000000000 +0100
@@ -186,6 +186,8 @@
 			client->want_ctcp = 0;
 			proxy_outdata(client, ":%s NOTICE %s :Proxy is now handling itself CTCPs sent to %s\n",
 				      client->proxy_address, client->nick, client->listen->ircnet);
+		} else {
+			signal_emit("proxy client command", 3, client, args, data);
 		}
 		return;
 	}
@@ -663,6 +665,14 @@
 	}
 }
 
+static void sig_dump(CLIENT_REC *client, const char *data)
+{
+	g_return_if_fail(client != NULL);
+	g_return_if_fail(data != NULL);
+
+	proxy_outdata(client, data);
+}
+
 void proxy_listen_init(void)
 {
 	next_line = g_string_new(NULL);
@@ -680,6 +690,8 @@
 	signal_add("message own_private", (SIGNAL_FUNC) sig_message_own_private);
 	signal_add("message irc own_action", (SIGNAL_FUNC) sig_message_own_action);
 	signal_add("setup changed", (SIGNAL_FUNC) read_settings);
+
+	signal_add("proxy client dump", (SIGNAL_FUNC) sig_dump);
 }
 
 void proxy_listen_deinit(void)
@@ -697,4 +709,6 @@
 	signal_remove("message own_private", (SIGNAL_FUNC) sig_message_own_private);
 	signal_remove("message irc own_action", (SIGNAL_FUNC) sig_message_own_action);
 	signal_remove("setup changed", (SIGNAL_FUNC) read_settings);
+
+	signal_remove("proxy client dump", (SIGNAL_FUNC) sig_dump);
 }
diff -Naur a/src/irc/proxy/Makefile.am b/src/irc/proxy/Makefile.am
--- a/src/irc/proxy/Makefile.am	2008-11-02 12:42:31.000000000 +0100
+++ b/src/irc/proxy/Makefile.am	2008-11-02 11:39:11.000000000 +0100
@@ -21,7 +21,8 @@
 	listen.c
 
 noinst_HEADERS = \
-	module.h
+	module.h \
+	proxy.h
 
 clean-generic:
 	rm -f libirc_proxy.a
diff -Naur a/src/irc/proxy/module.h b/src/irc/proxy/module.h
--- a/src/irc/proxy/module.h	2008-11-02 12:42:31.000000000 +0100
+++ b/src/irc/proxy/module.h	2008-11-02 11:39:01.000000000 +0100
@@ -6,28 +6,7 @@
 #include "irc.h"
 #include "irc-servers.h"
 
-typedef struct {
-	int port;
-	char *ircnet;
-
-	int tag;
-	GIOChannel *handle;
-
-	GSList *clients;
-} LISTEN_REC;
-
-typedef struct {
-	char *nick, *host;
-	NET_SENDBUF_REC *handle;
-	int recv_tag;
-	char *proxy_address;
-	LISTEN_REC *listen;
-	IRC_SERVER_REC *server;
-	unsigned int pass_sent:1;
-	unsigned int user_sent:1;
-	unsigned int connected:1;
-	unsigned int want_ctcp:1;
-} CLIENT_REC;
+#include "proxy.h"
 
 extern GSList *proxy_listens;
 extern GSList *proxy_clients;
diff -Naur a/src/irc/proxy/proxy.h b/src/irc/proxy/proxy.h
--- a/src/irc/proxy/proxy.h	1970-01-01 01:00:00.000000000 +0100
+++ b/src/irc/proxy/proxy.h	2008-11-02 12:17:30.000000000 +0100
@@ -0,0 +1,33 @@
+#ifndef PROXY_H
+#define PROXY_H
+
+#include "common.h"
+
+#include "network.h"
+#include "irc.h"
+#include "irc-servers.h"
+
+typedef struct {
+	int port;
+	char *ircnet;
+
+	int tag;
+	GIOChannel *handle;
+
+	GSList *clients;
+} LISTEN_REC;
+
+typedef struct {
+	char *nick, *host;
+	NET_SENDBUF_REC *handle;
+	int recv_tag;
+	char *proxy_address;
+	LISTEN_REC *listen;
+	IRC_SERVER_REC *server;
+	unsigned int pass_sent:1;
+	unsigned int user_sent:1;
+	unsigned int connected:1;
+	unsigned int want_ctcp:1;
+} CLIENT_REC;
+
+#endif
diff -Naur a/src/perl/get-signals.pl b/src/perl/get-signals.pl
--- a/src/perl/get-signals.pl	2008-11-02 12:48:39.000000000 +0100
+++ b/src/perl/get-signals.pl	2008-11-02 11:46:18.000000000 +0100
@@ -42,6 +42,7 @@
 	s/DCC_REC[^,]*/siobject/g;
 	s/AUTOIGNORE_REC[^,]*/Irssi::Irc::Autoignore/g;
 	s/NOTIFYLIST_REC[^,]*/Irssi::Irc::Notifylist/g;
+	s/CLIENT_REC[^,]*/Irssi::Irc::Client/g;
 
 	# fe-common
 	s/THEME_REC[^,]*/Irssi::UI::Theme/g;
diff -Naur a/src/perl/irc/Client.xs b/src/perl/irc/Client.xs
--- a/src/perl/irc/Client.xs	1970-01-01 01:00:00.000000000 +0100
+++ b/src/perl/irc/Client.xs	2008-11-02 11:46:08.000000000 +0100
@@ -0,0 +1,5 @@
+#include "module.h"
+
+MODULE = Irssi::Irc::Client  PACKAGE = Irssi::Irc
+PROTOTYPES: ENABLE
+
diff -Naur a/src/perl/irc/Irc.xs b/src/perl/irc/Irc.xs
--- a/src/perl/irc/Irc.xs	2008-11-02 12:42:31.000000000 +0100
+++ b/src/perl/irc/Irc.xs	2008-11-02 12:35:18.000000000 +0100
@@ -144,6 +144,20 @@
 	hv_store(hv, "ircnets", 7, newRV_noinc((SV*)av), 0);
 }
 
+static void perl_client_fill_hash(HV *hv, CLIENT_REC *client)
+{
+	hv_store(hv, "nick", 4, new_pv(client->nick), 0);
+	hv_store(hv, "host", 4, new_pv(client->host), 0);
+	hv_store(hv, "recv_tag", 8, newSViv(client->recv_tag), 0);
+	hv_store(hv, "proxy_address", 13, new_pv(client->proxy_address), 0);
+	hv_store(hv, "server", 6, iobject_bless(client->server), 0);
+	hv_store(hv, "pass_sent", 9, newSViv(client->pass_sent), 0);
+	hv_store(hv, "user_sent", 9, newSViv(client->user_sent), 0);
+	hv_store(hv, "connected", 9, newSViv(client->connected), 0);
+	hv_store(hv, "want_ctcp", 9, newSViv(client->want_ctcp), 0);
+	hv_store(hv, "ircnet", 6, new_pv(client->listen->ircnet), 0);
+}
+
 static PLAIN_OBJECT_INIT_REC irc_plains[] = {
 	{ "Irssi::Irc::Ban", (PERL_OBJECT_FUNC) perl_ban_fill_hash },
 	{ "Irssi::Irc::Dcc", (PERL_OBJECT_FUNC) perl_dcc_fill_hash },
@@ -151,6 +165,7 @@
 	{ "Irssi::Irc::Netsplitserver", (PERL_OBJECT_FUNC) perl_netsplit_server_fill_hash },
 	{ "Irssi::Irc::Netsplitchannel", (PERL_OBJECT_FUNC) perl_netsplit_channel_fill_hash },
 	{ "Irssi::Irc::Notifylist", (PERL_OBJECT_FUNC) perl_notifylist_fill_hash },
+	{ "Irssi::Irc::Client", (PERL_OBJECT_FUNC) perl_client_fill_hash },
 
 	{ NULL, NULL }
 };
@@ -209,3 +224,4 @@
 	irssi_boot(Irc__Notifylist);
 	irssi_boot(Irc__Query);
 	irssi_boot(Irc__Server);
+	irssi_boot(Irc__Client);
diff -Naur a/src/perl/irc/module.h b/src/perl/irc/module.h
--- a/src/perl/irc/module.h	2008-11-02 12:42:31.000000000 +0100
+++ b/src/perl/irc/module.h	2008-11-02 11:45:05.000000000 +0100
@@ -20,6 +20,8 @@
 #include "dcc/dcc-send.h"
 #include "notifylist/notifylist.h"
 
+#include "proxy/proxy.h"
+
 typedef IRC_SERVER_REC *Irssi__Irc__Server;
 typedef IRC_SERVER_CONNECT_REC *Irssi__Irc__Connect;
 typedef IRC_CHANNEL_REC *Irssi__Irc__Channel;
@@ -35,3 +37,5 @@
 typedef NETSPLIT_SERVER_REC *Irssi__Irc__Netsplitserver;
 typedef NETSPLIT_CHAN_REC *Irssi__Irc__Netsplitchannel;
 typedef NOTIFYLIST_REC *Irssi__Irc__Notifylist;
+
+typedef CLIENT_REC *Irssi__Irc__Client;
diff -Naur a/src/perl/irc/typemap b/src/perl/irc/typemap
--- a/src/perl/irc/typemap	2008-11-02 12:42:31.000000000 +0100
+++ b/src/perl/irc/typemap	2008-11-02 11:43:32.000000000 +0100
@@ -14,6 +14,7 @@
 Irssi::Irc::Netsplitserver	T_PlainObj
 Irssi::Irc::Netsplitchannel	T_PlainObj
 Irssi::Irc::Notifylist		T_PlainObj
+Irssi::Irc::Client		T_IrssiObj
 
 INPUT
 
diff -Naur a/src/perl/Makefile.am b/src/perl/Makefile.am
--- a/src/perl/Makefile.am	2008-11-02 12:42:31.000000000 +0100
+++ b/src/perl/Makefile.am	2008-11-02 11:46:24.000000000 +0100
@@ -100,6 +100,7 @@
 	irc/Modes.xs \
 	irc/Netsplit.xs \
 	irc/Notifylist.xs \
+	irc/Client.xs \
 	irc/Makefile.PL.in \
 	irc/typemap \
 	irc/module.h
