diff -Nur openbsc.3_llist/include/openbsc/e1_input.h openbsc.4_txdelay/include/openbsc/e1_input.h
--- openbsc.3_llist/include/openbsc/e1_input.h	2009-05-21 07:20:43.000000000 +0200
+++ openbsc.4_txdelay/include/openbsc/e1_input.h	2009-05-21 08:56:30.000000000 +0200
@@ -64,7 +64,10 @@
 
 	union {
 		struct {
+			/* list of all signalling links on this TS */
 			struct llist_head sign_links;
+			/* timer when to dequeue next frame */
+			struct timer_list tx_timer;
 		} sign;
 		struct {
 			/* subchannel demuxer for frames from E1 */
diff -Nur openbsc.3_llist/src/e1_input.c openbsc.4_txdelay/src/e1_input.c
--- openbsc.3_llist/src/e1_input.c	2009-05-21 08:12:33.000000000 +0200
+++ openbsc.4_txdelay/src/e1_input.c	2009-05-21 08:47:45.000000000 +0200
@@ -216,6 +216,7 @@
 {
 	struct e1inp_sign_link *sign_link;
 	struct e1inp_driver *e1inp_driver;
+	struct e1inp_ts *e1i_ts;
 
 	msg->l2h = msg->data;
 
@@ -225,15 +226,17 @@
 	}
 
 	sign_link = msg->trx->rsl_link;
+	e1i_ts = sign_link->ts;
+	if (!bsc_timer_pending(&e1i_ts->sign.tx_timer)) {
+		/* notify the driver we have something to write */
+		e1inp_driver = sign_link->ts->line->driver;
+		e1inp_driver->want_write(e1i_ts);
+	}
 	msgb_enqueue(&sign_link->tx_list, msg);
 
 	/* dump it */
 	write_pcap_packet(PCAP_OUTPUT, sign_link->sapi, sign_link->tei, msg);
 
-	/* notify the driver we have something to write */
-	e1inp_driver = sign_link->ts->line->driver;
-	e1inp_driver->want_write(sign_link->ts);
-
 	return 0;
 }
 
@@ -241,6 +244,7 @@
 {
 	struct e1inp_sign_link *sign_link;
 	struct e1inp_driver *e1inp_driver;
+	struct e1inp_ts *e1i_ts;
 
 	msg->l2h = msg->data;
 
@@ -250,15 +254,17 @@
 	}
 
 	sign_link = msg->trx->bts->oml_link;
+	e1i_ts = sign_link->ts;
+	if (!bsc_timer_pending(&e1i_ts->sign.tx_timer)) {
+		/* notify the driver we have something to write */
+		e1inp_driver = sign_link->ts->line->driver;
+		e1inp_driver->want_write(e1i_ts);
+	}
 	msgb_enqueue(&sign_link->tx_list, msg);
 
 	/* dump it */
 	write_pcap_packet(PCAP_OUTPUT, sign_link->sapi, sign_link->tei, msg);
 
-	/* notify the driver we have something to write */
-	e1inp_driver = sign_link->ts->line->driver;
-	e1inp_driver->want_write(sign_link->ts);
-
 	return 0;
 }
 
diff -Nur openbsc.3_llist/src/input/misdn.c openbsc.4_txdelay/src/input/misdn.c
--- openbsc.3_llist/src/input/misdn.c	2009-05-21 08:12:22.000000000 +0200
+++ openbsc.4_txdelay/src/input/misdn.c	2009-05-21 08:56:30.000000000 +0200
@@ -158,6 +158,27 @@
 	return ret;
 }
 
+static int ts_want_write(struct e1inp_ts *e1i_ts)
+{
+	/* We never include the mISDN B-Channel FD into the
+	 * writeset, since it doesn't support poll() based
+	 * write flow control */		
+	if (e1i_ts->type == E1INP_TS_TYPE_TRAU)
+		return 0;
+
+	e1i_ts->driver.misdn.fd.when |= BSC_FD_WRITE;
+
+	return 0;
+}
+
+static void timeout_ts1_write(void *data)
+{
+	struct e1inp_ts *e1i_ts = (struct e1inp_ts *)data;
+
+	/* trigger write of ts1, due to tx delay timer */
+	ts_want_write(e1i_ts);
+}
+
 static int handle_ts1_write(struct bsc_fd *bfd)
 {
 	struct e1inp_line *line = bfd->data;
@@ -170,10 +191,12 @@
 	u_int8_t *l2_data;
 	int ret;
 
+	bfd->when &= ~BSC_FD_WRITE;
+
 	/* get the next msg for this timeslot */
 	msg = e1inp_tx_ts(e1i_ts, &sign_link);
 	if (!msg) {
-		bfd->when &= ~BSC_FD_WRITE;
+		/* no message after tx delay timer */
 		return 0;
 	}
 
@@ -198,8 +221,10 @@
 		fprintf(stderr, "%s sendto failed %d\n", __func__, ret);
 	msgb_free(msg);
 
-	/* FIXME: this has to go */
-	usleep(100000);
+	/* set tx delay timer for next event */
+	e1i_ts->sign.tx_timer.cb = timeout_ts1_write;
+	e1i_ts->sign.tx_timer.data = e1i_ts;
+	bsc_schedule_timer(&e1i_ts->sign.tx_timer, 0, 50000);
 
 	return ret;
 }
@@ -336,19 +361,6 @@
 	return ret;
 }
 
-static int ts_want_write(struct e1inp_ts *e1i_ts)
-{
-	/* We never include the mISDN B-Channel FD into the
-	 * writeset, since it doesn't support poll() based
-	 * write flow control */		
-	if (e1i_ts->type == E1INP_TS_TYPE_TRAU)
-		return 0;
-
-	e1i_ts->driver.misdn.fd.when |= BSC_FD_WRITE;
-
-	return 0;
-}
-
 struct e1inp_driver misdn_driver = {
 	.name = "mISDNuser",
 	.want_write = ts_want_write,
