diff --git a/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c b/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c
index fbe6ca0822..bfb67e4c78 100644
--- a/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c
+++ b/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c
@@ -127,9 +127,8 @@ static int __pri_lpwrap_read(struct pri *pri, void *buf, int buflen)
 		} else {
 			ftdm_log(FTDM_LOG_CRIT, "span %d D-READ TIMEOUT\n", spri->span->span_id);
 		}
-
-		ftdm_clear_flag(spri, LPWRAP_PRI_READY);
-		return -1;
+		/* we cannot return -1, libpri seems to expect values >= 0 */
+		return 0;
 	}
 	spri->errs = 0;
 	res = (int)len;
@@ -156,8 +155,8 @@ static int __pri_lpwrap_write(struct pri *pri, void *buf, int buflen)
 
 	if (ftdm_channel_write(spri->dchan, buf, buflen, &len) != FTDM_SUCCESS) {
 		ftdm_log(FTDM_LOG_CRIT, "span %d D-WRITE FAIL! [%s]\n", spri->span->span_id, spri->dchan->last_error);
-		ftdm_clear_flag(spri, LPWRAP_PRI_READY);
-		return -1;
+		/* we cannot return -1, libpri seems to expect values >= 0 */
+		return 0;
 	}
 
 #ifdef IODEBUG
diff --git a/libs/freetdm/src/ftmod/ftmod_zt/ftmod_zt.c b/libs/freetdm/src/ftmod/ftmod_zt/ftmod_zt.c
index 09208f8d2c..b16ead7a66 100644
--- a/libs/freetdm/src/ftmod/ftmod_zt/ftmod_zt.c
+++ b/libs/freetdm/src/ftmod/ftmod_zt/ftmod_zt.c
@@ -1152,6 +1152,7 @@ static FIO_WRITE_FUNCTION(zt_write)
 		bytes += 2;
 	}
 
+tryagain:
 	w = write(ftdmchan->sockfd, data, bytes);
 	
 	if (w >= 0) {
@@ -1159,6 +1160,17 @@ static FIO_WRITE_FUNCTION(zt_write)
 		return FTDM_SUCCESS;
 	}
 
+	if (errno == ELAST) {
+		zt_event_t zt_event_id = 0;
+		if (ioctl(ftdmchan->sockfd, codes.GETEVENT, &zt_event_id) == -1) {
+			ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Failed retrieving event after ELAST on write: %s\n", strerror(errno));
+			return FTDM_FAIL;
+		}
+		/* we should enqueue this event somewhere so it can be retrieved by the user, for now, dropping it to see what it is! */
+		ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dropping event %d to be able to write data\n", zt_event_id);
+		goto tryagain;
+	}
+
 	return FTDM_FAIL;
 }