diff -Naur nfqueue/nfqueue.c nfqueue.new/nfqueue.c
--- nfqueue/nfqueue.c	2008-01-03 10:37:49.000000000 +0100
+++ nfqueue.new/nfqueue.c	2008-03-05 17:07:20.000000000 +0100
@@ -26,6 +26,7 @@
 	int queue_num;
 	int fd;
 	char *buf;
+	int reading;
 } NFQObject;
 
 static struct timeval* tv;
@@ -251,6 +252,8 @@
 		return NULL;
 	}
 
+	NFQ->reading = 0;
+
 	return (PyObject *)NFQ;
 }
 
@@ -309,13 +312,40 @@
 static PyObject *
 NFQ_read(PyObject *self, PyObject *args)
 {
-	NFQObject*     NFQ = (NFQObject *)self;
+	NFQObject	*NFQ = (NFQObject *)self;
+    PyObject	*result = NULL;
 	int rv;
 	char buf[4096];
-	while ((rv = recv(NFQ->fd, buf, sizeof(buf), 0)) && rv >= 0) {
+
+	NFQ->reading = 1;
+	Py_BEGIN_ALLOW_THREADS
+		rv = recv(NFQ->fd, buf, sizeof(buf), 0);
+	Py_END_ALLOW_THREADS
+	while (NFQ->reading && rv && rv >= 0) {
 		nfq_handle_packet(NFQ->h, buf, rv);
+		Py_BEGIN_ALLOW_THREADS
+			rv = recv(NFQ->fd, buf, sizeof(buf), 0);
+		Py_END_ALLOW_THREADS
 	}
-	return NULL;
+	Py_INCREF(Py_None);
+	result = Py_None;
+	return result;
+}
+
+char NFQ_stop__doc__[] = "\
+stop() -- stops reading\n\
+";
+
+static PyObject *
+NFQ_stop(PyObject *self, PyObject *args)
+{
+	NFQObject	*NFQ = (NFQObject *)self;
+    PyObject	*result = NULL;
+
+	NFQ->reading = 0;
+	Py_INCREF(Py_None);
+	result = Py_None;
+    return result;
 }
 
 char NFQ_set_verdict__doc__[] = "\
@@ -370,6 +400,7 @@
 	{"register_cb", NFQ_register_cb, METH_VARARGS, NULL},
 	{"fileno",      NFQ_fileno,      METH_VARARGS, NFQ_fileno__doc__},
 	{"read",        NFQ_read,        METH_VARARGS, NFQ_read__doc__},
+	{"stop",        NFQ_stop,        METH_VARARGS, NFQ_stop__doc__},
 	{"set_verdict", NFQ_set_verdict, METH_VARARGS, NFQ_set_verdict__doc__},
 	{NULL, NULL}		/* Sentinel */
 };
