diff --git a/bchannel.c b/bchannel.c
index c5dcc4b..b154972 100644
--- a/bchannel.c
+++ b/bchannel.c
@@ -25,6 +25,10 @@
 #include <sys/socket.h>
 #include <mISDNif.h>
 
+#define AF_COMPATIBILITY_FUNC 1
+#define MISDN_OLD_AF_COMPATIBILITY 1
+#include <compat_af_isdn.h>
+
 #include <asterisk/frame.h>
 
 
@@ -53,6 +57,8 @@ enum {
 
 int bchannel_initialize(void)
 {
+  	init_af_isdn();
+
 	return(0);
 }
 
diff --git a/chan_lcr.c b/chan_lcr.c
index e09004c..d578a04 100644
--- a/chan_lcr.c
+++ b/chan_lcr.c
@@ -476,7 +476,7 @@ void apply_opt(struct chan_call *call, char *data)
 				bchannel_pipeline(call->bchannel, call->pipeline);
 			break;
 		case 'r':
-			if (opt[1] == '\0') {
+			if (opt[1] != '\0') {
 				CERROR(call, call->ast, "Option 'r' (re-buffer 160 bytes) expects no parameter.\n", opt);
 				break;
 			}
@@ -1959,27 +1959,64 @@ static struct ast_frame *lcr_read(struct ast_channel *ast)
 		return NULL;
 	}
 	if (call->pipe[0] > -1) {
+		fd_set rrfs;
+		struct timeval tv;
+		char read_buff[sizeof(call->read_buff)];
+		int fd = call->pipe[0];
+
 		if (call->rebuffer && !call->hdlc) {
-			len = read(call->pipe[0], call->read_buff, 160);
+			len = 160;
 		} else {
-			len = read(call->pipe[0], call->read_buff, sizeof(call->read_buff));
+			len = sizeof(read_buff);
 		}
+
+		/* don't lock while waiting on pipe */
+		ast_mutex_unlock(&chan_lock);	
+
+		tv.tv_sec=0;
+		tv.tv_usec=0;
+
+		FD_ZERO(&rrfs);
+		FD_SET(fd,&rrfs);
+
+		if (!select(FD_SETSIZE,&rrfs,NULL, NULL,&tv)) {
+			return &ast_null_frame;
+		}
+
+		len = read(fd, read_buff, len);
+
+		ast_mutex_lock(&chan_lock);
+
+		/* re-aquire call, since it could have been closed 
+		   in between */
+		call = ast->tech_pvt;
+		if (!call) {
+			ast_mutex_unlock(&chan_lock);
+			return NULL;
+		}
+
 		if (len <= 0) {
 			close(call->pipe[0]);
 			call->pipe[0] = -1;
+			ast_mutex_unlock(&chan_lock);
 			return NULL;
 		}
-	}
 
-	call->read_fr.frametype = AST_FRAME_VOICE;
-	call->read_fr.subclass = ast->nativeformats;
-	call->read_fr.datalen = len;
-	call->read_fr.samples = len;
-	call->read_fr.delivery = ast_tv(0,0);
-	call->read_fr.data = call->read_buff;
-	ast_mutex_unlock(&chan_lock);
+		memcpy(call->read_buff, read_buff, len);
 
-	return &call->read_fr;
+		call->read_fr.frametype = AST_FRAME_VOICE;
+		call->read_fr.subclass = ast->nativeformats;
+		call->read_fr.datalen = len;
+		call->read_fr.samples = len;
+		call->read_fr.delivery = ast_tv(0,0);
+		call->read_fr.data = call->read_buff;
+
+		ast_mutex_unlock(&chan_lock);
+		return &call->read_fr;
+	} else {
+		ast_mutex_unlock(&chan_lock);
+		return NULL;
+	}
 }
 
 static int lcr_indicate(struct ast_channel *ast, int cond, const void *data, size_t datalen)
diff --git a/mISDN.cpp b/mISDN.cpp
index eeb00ee..40d9a9a 100644
--- a/mISDN.cpp
+++ b/mISDN.cpp
@@ -13,6 +13,8 @@
 #include "myisdn.h"
 
 extern "C" {
+#define MISDN_OLD_AF_COMPATIBILITY 1
+#include <compat_af_isdn.h>
 }
 #include <q931.h>
 
@@ -46,6 +48,8 @@ int mISDN_initialize(void)
 {
 	char filename[256];
 
+	init_af_isdn();
+
 	/* try to open raw socket to check kernel */
 	mISDNsocket = socket(PF_ISDN, SOCK_RAW, ISDN_P_BASE);
 	if (mISDNsocket < 0)
