diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c
index 46b3069f8e7ad4b4a39412a1c01f0ff183a32446..63c5448bc3f670bbcbe51571a15119538717b8ea 100644
--- a/channels/chan_misdn.c
+++ b/channels/chan_misdn.c
@@ -112,6 +112,7 @@ enum tone_e {
 	TONE_NONE=0,
 	TONE_DIAL,
 	TONE_ALERTING,
+	TONE_FAR_ALERTING,
 	TONE_BUSY,
 	TONE_CUSTOM,
 	TONE_FILE
@@ -186,6 +187,8 @@ struct chan_list {
 	int zero_read_cnt;
 	int dropped_frame_cnt;
 
+	int far_alerting;
+
 	const struct tone_zone_sound *ts;
 	
 	struct chan_list *peer;
@@ -1263,6 +1266,8 @@ static int read_config(struct chan_list *ch, int orig) {
 
 	misdn_cfg_get( port, MISDN_CFG_NEED_MORE_INFOS, &bc->need_more_infos, sizeof(int));
 	
+	misdn_cfg_get( port, MISDN_CFG_FAR_ALERTING, &ch->far_alerting, sizeof(int));
+	
 	int hdlc=0;
 	misdn_cfg_get( port, MISDN_CFG_HDLC, &hdlc, sizeof(int));
 	
@@ -1705,6 +1710,8 @@ static int misdn_answer(struct ast_channel *ast)
 	}
 	
 	p->state = MISDN_CONNECTED;
+	misdn_lib_echo(p->bc,0);
+	tone_indicate(p, TONE_NONE);
 
 	if ( ast_strlen_zero(p->bc->cad) ) {
 		chan_misdn_log(2,p->bc->port," --> empty cad using dad\n");
@@ -2058,7 +2065,6 @@ static struct ast_frame  *misdn_read(struct ast_channel *ast)
 	
 	read(tmp->pipe[0],blah,sizeof(blah));
 	
-	
 	len = misdn_ibuf_usedcount(tmp->bc->astbuf);
 
 	if (!len) {
@@ -2141,7 +2147,7 @@ static int misdn_write(struct ast_channel *ast, struct ast_frame *frame)
 	if ( !(frame->subclass & prefformat)) {
 		
 		chan_misdn_log(-1, ch->bc->port, "Got Unsupported Frame with Format:%d\n", frame->subclass);
-		return -1;
+		return 0;
 	}
 	
 
@@ -2184,7 +2190,7 @@ static int misdn_write(struct ast_channel *ast, struct ast_frame *frame)
 
 		return 0;
 	}
-	
+
 	chan_misdn_log(9, ch->bc->port, "Sending :%d bytes 2 MISDN\n",frame->samples);
 	/*if speech flip bits*/
 	if ( misdn_cap_is_speech(ch->bc->capability) )
@@ -2318,6 +2324,13 @@ static int tone_indicate( struct chan_list *cl, enum tone_e tone)
 		ts=ast_get_indication_tone(ast->zone,"ring");
 		misdn_lib_tone_generator_stop(cl->bc);
 		break;
+	case TONE_FAR_ALERTING:
+	/* VERY UGLY HACK, BECAUSE CHAN_SIP DOES NOT GENERATE TONES */
+		chan_misdn_log(2,cl->bc->port," --> Ring\n");
+		ts=ast_get_indication_tone(ast->zone,"ring");
+		misdn_lib_tone_generator_start(cl->bc);
+		misdn_lib_echo(cl->bc,1);
+		break;
 	case TONE_BUSY:
 		chan_misdn_log(2,cl->bc->port," --> Busy\n");
 		ts=ast_get_indication_tone(ast->zone,"busy");
@@ -2611,7 +2624,9 @@ static struct ast_channel *misdn_new(struct chan_list *chlist, int state,  char
 		tmp->nativeformats = prefformat;
 
 		tmp->readformat = format;
+		tmp->rawreadformat = format;
 		tmp->writeformat = format;
+		tmp->rawwriteformat = format;
     
 		tmp->tech_pvt = chlist;
 		
@@ -3533,7 +3548,15 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
 		cb_log(1,bc->port,"Set State Ringing\n");
 		
 		if ( misdn_cap_is_speech(bc->capability) && misdn_inband_avail(bc)) {
+			cb_log(1,bc->port,"Starting Tones, we have inband Data\n");
 			start_bc_tones(ch);
+		} else {
+			cb_log(1,bc->port,"We have no inband Data, the other end must create ringing\n");
+			if (ch->far_alerting) {
+				cb_log(1,bc->port,"The other end can not do ringing eh ?.. we must do all ourself..");
+				start_bc_tones(ch);
+				tone_indicate(ch, TONE_FAR_ALERTING);
+			}
 		}
 	}
 	break;
@@ -3543,6 +3566,9 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
 	
 		struct ast_channel *bridged=AST_BRIDGED_P(ch->ast);
 		
+		misdn_lib_echo(bc,0);
+		tone_indicate(ch, TONE_NONE);
+
 		if (bridged && strcasecmp(bridged->tech->type,"mISDN")) {
 			struct chan_list *bridged_ch=MISDN_ASTERISK_TECH_PVT(bridged);
 
diff --git a/channels/misdn/chan_misdn_config.h b/channels/misdn/chan_misdn_config.h
index 9717e7846987b773983dcbb93a37997c53bb005b..a2ff16b3acfbd6c7c745378e27ce4dee29ad11bb 100644
--- a/channels/misdn/chan_misdn_config.h
+++ b/channels/misdn/chan_misdn_config.h
@@ -23,6 +23,7 @@ enum misdn_cfg_elements {
 	/* port config items */
 	MISDN_CFG_FIRST = 0,
 	MISDN_CFG_GROUPNAME,           /* char[] */
+	MISDN_CFG_FAR_ALERTING,        /* int (bool) */
 	MISDN_CFG_RXGAIN,              /* int */
 	MISDN_CFG_TXGAIN,              /* int */
 	MISDN_CFG_TE_CHOOSE_CHANNEL,   /* int (bool) */
diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c
index 824fc59cd5058350df6f60f412dc24177415e69b..51ccce3f3c0685e5724b2d760186f9adce6e5ea1 100644
--- a/channels/misdn/isdn_lib.c
+++ b/channels/misdn/isdn_lib.c
@@ -3064,8 +3064,6 @@ int handle_err(msg_t *msg)
 int queue_l2l3(msg_t *msg) {
 	iframe_t *frm= (iframe_t*)msg->data;
 	struct misdn_stack *stack;
-	int err=0;
-
 	stack=find_stack_by_addr( frm->addr );
 
 	
@@ -3261,7 +3259,6 @@ void manager_event_handler(void *arg)
 		     stack=stack->next ) { 
 
 			while ( (msg=msg_dequeue(&stack->upqueue)) ) {
-				int res=0;
 				/** Handle L2/3 Signalling after bchans **/ 
 				if (!handle_frm_nt(msg)) {
 					/* Maybe it's TE */
@@ -3848,3 +3845,13 @@ void misdn_lib_split_bridge( struct misdn_bchannel * bc1, struct misdn_bchannel
 	}
 	
 }
+
+
+
+void misdn_lib_echo(struct misdn_bchannel *bc, int onoff)
+{
+	cb_log(1,bc->port, " --> ECHO %s\n", onoff?"ON":"OFF");
+	manager_ph_control(bc, onoff?CMX_ECHO_ON:CMX_ECHO_OFF, 0);
+}
+
+
diff --git a/channels/misdn/isdn_lib.h b/channels/misdn/isdn_lib.h
index 444ae62ffa834855b8bc571464f5ed21b4385034..c6324d37e40e7765c89e9848a66918ea805a1d80 100644
--- a/channels/misdn/isdn_lib.h
+++ b/channels/misdn/isdn_lib.h
@@ -392,6 +392,8 @@ void misdn_lib_setup_bc(struct misdn_bchannel *bc);
 void misdn_lib_bridge( struct misdn_bchannel * bc1, struct misdn_bchannel *bc2);
 void misdn_lib_split_bridge( struct misdn_bchannel * bc1, struct misdn_bchannel *bc2);
 
+void misdn_lib_echo(struct misdn_bchannel *bc, int onoff);
+
 unsigned char * flip_buf_bits ( unsigned char * buf , int len);
 
 int misdn_lib_is_ptp(int port);
diff --git a/channels/misdn_config.c b/channels/misdn_config.c
index 96156099cca491f8d9a36abef67a7718802a2c65..a94f3478106db18ef9b81c5e1256bc348dcec4c9 100644
--- a/channels/misdn_config.c
+++ b/channels/misdn_config.c
@@ -87,6 +87,7 @@ static const struct misdn_cfg_spec port_spec[] = {
 	{ "rxgain", MISDN_CFG_RXGAIN, MISDN_CTYPE_INT, "0", NONE },
 	{ "txgain", MISDN_CFG_TXGAIN, MISDN_CTYPE_INT, "0", NONE },
 	{ "te_choose_channel", MISDN_CFG_TE_CHOOSE_CHANNEL, MISDN_CTYPE_BOOL, "no", NONE },
+	{ "far_alerting", MISDN_CFG_FAR_ALERTING, MISDN_CTYPE_BOOL, "no", NONE },
 	{ "pmp_l1_check", MISDN_CFG_PMP_L1_CHECK, MISDN_CTYPE_BOOL, "yes", NONE },
 	{ "hdlc", MISDN_CFG_HDLC, MISDN_CTYPE_BOOL, "no", NONE },
 	{ "context", MISDN_CFG_CONTEXT, MISDN_CTYPE_STR, "default", NONE },
diff --git a/configs/misdn.conf.sample b/configs/misdn.conf.sample
index 6dd59c8052746916f5c7a882cfe8903137670fb3..1fb07193066cc594069902773169c55a1a5649b5 100644
--- a/configs/misdn.conf.sample
+++ b/configs/misdn.conf.sample
@@ -108,6 +108,12 @@ musicclass=default
 ; 
 senddtmf=yes
 
+;
+; If we should generate Ringing for chan_sip and others
+;
+far_alerting=no
+
+
 ; Prefixes for national and international, those are put before the 
 ; oad if an according dialplan is set by the other end. 
 ;