diff --git a/channels/chan_unistim.c b/channels/chan_unistim.c
index 5b64f96..99896ef 100644
--- a/channels/chan_unistim.c
+++ b/channels/chan_unistim.c
@@ -359,6 +359,7 @@ struct unistim_subchannel {
 	int softkey;			/*! Softkey assigned */
 	pthread_t ss_thread;		/*! unistim_ss thread handle */
 	int alreadygone;
+	int holding;	/*! this subchannel holds someone */
 	char ringvolume;
 	char ringstyle;
 	int moh;					/*!< Music on hold in progress */
@@ -2534,13 +2535,15 @@ static void sub_hold(struct unistimsession *pte, struct unistim_subchannel *sub)
 		return;
 	}
 	sub->moh = 1;
-	sub->subtype = SUB_ONHOLD;
+	//sub->subtype = SUB_ONHOLD;
+	sub->holding = 1;
 	send_favorite_short(sub->softkey, FAV_ICON_ONHOLD_BLACK + FAV_BLINK_SLOW, pte);
 	send_select_output(pte, pte->device->output, pte->device->volume, MUTE_ON);
 	send_stop_timer(pte);
 	if (sub->owner) {
+//		ast_log(LOG_WARNING, "Debug (hold): send end call\n");
 		ast_queue_hold(sub->owner, NULL);
-		send_end_call(pte);
+//		send_end_call(pte);
 	}
 	return;
 }
@@ -2555,7 +2558,8 @@ static void sub_unhold(struct unistimsession *pte, struct unistim_subchannel *su
 	}
 
 	sub->moh = 0;
-	sub->subtype = SUB_REAL;
+	sub->holding = 0;
+	//sub->subtype = SUB_REAL;
 	send_favorite_short(sub->softkey, FAV_ICON_OFFHOOK_BLACK, pte);
 	send_select_output(pte, pte->device->output, pte->device->volume, MUTE_OFF);
 	send_start_timer(pte);
@@ -3388,20 +3392,20 @@ static void handle_key_fav(struct unistimsession *pte, char keycode)
 	} else {
 		sub = pte->device->ssub[keynum];
 		/* Favicon have assigned sub, activate it and put current on hold */
-		if (sub->subtype == SUB_REAL) {
+		if (sub->subtype == SUB_REAL && !sub->holding) {
 			sub_hold(pte, sub);
 			show_main_page(pte);
-		} else if (sub->subtype == SUB_RING) {
-			sub->softkey = keynum;
-			handle_call_incoming(pte);
-		} else if (sub->subtype == SUB_ONHOLD) {
+		} else if (sub->subtype == SUB_REAL && sub->holding) {
 			if (pte->state == STATE_DIALPAGE){
 				send_tone(pte, 0, 0);
 			}
 			send_callerid_screen(pte, sub);
 			sub_unhold(pte, sub);
 			pte->state = STATE_CALL;
-		}
+		} else if (sub->subtype == SUB_RING) {
+			sub->softkey = keynum;
+			handle_call_incoming(pte);
+		} 
 	}
 }
 
@@ -3470,8 +3474,13 @@ static void key_call(struct unistimsession *pte, char keycode)
 	case KEY_ONHOLD:
 		if (!sub) {
 			if(pte->device->ssub[pte->device->selected]) {
-				sub_hold(pte, pte->device->ssub[pte->device->selected]);
+				sub = pte->device->ssub[pte->device->selected];
+			} else {
+				break;
 			}
+		}
+		if (sub->holding) {
+			sub_unhold(pte, sub);
 		} else {
 			sub_hold(pte, sub);
 		}
@@ -4129,7 +4138,7 @@ static void show_main_page(struct unistimsession *pte)
 			send_date_time2(pte);
 			send_idle_clock(pte);
 			if (strlen(pte->device->maintext0)) {
-				send_text(TEXT_LINE0, TEXT_NORMAL, pte, pte->device->maintext0);
+				send_text(TEXT_LINE0, TEXT_NORMAL, pte, ustmtext(pte->device->maintext0, pte));
 			}
 		} else {
 			if (pte->device->missed_call == 1) {
@@ -4148,11 +4157,11 @@ static void show_main_page(struct unistimsession *pte)
 			strcat(tmpbuf, ast_inet_ntoa(pte->sin.sin_addr));
 			send_text(TEXT_LINE2, TEXT_NORMAL, pte, tmpbuf);
 		} else {
-			send_text(TEXT_LINE2, TEXT_NORMAL, pte, pte->device->maintext2);
+			send_text(TEXT_LINE2, TEXT_NORMAL, pte, ustmtext(pte->device->maintext2, pte));
 		}
 	}
 
-	send_texttitle(pte, pte->device->titledefault);
+	send_texttitle(pte, ustmtext(pte->device->titledefault, pte));
 	change_favorite_icon(pte, FAV_LINE_ICON);
 }
 
@@ -4407,7 +4416,7 @@ static void init_phone_step2(struct unistimsession *pte)
 			strcat(tmp, pte->macaddr);
 			send_text(TEXT_LINE2, TEXT_NORMAL, pte, tmp);
 			send_text_status(pte, "");
-			send_texttitle(pte, "UNISTIM for*");
+			send_texttitle(pte, ustmtext("UNISTIM for*", pte));
 			return;
 		}
 	}
@@ -4897,14 +4906,15 @@ static int unistim_hangup_clean(struct ast_channel *ast, struct unistim_subchann
 	ast_channel_tech_pvt_set(ast, NULL);
 	unistim_set_owner(sub, NULL);
 	sub->alreadygone = 0;
-	ast_mutex_unlock(&sub->lock);
 	if (sub->rtp) {
 		if (unistimdebug) {
 			ast_verb(0, "Destroying RTP session\n");
 		}
+		ast_rtp_instance_stop(sub->rtp);
 		ast_rtp_instance_destroy(sub->rtp);
 		sub->rtp = NULL;
 	}
+	ast_mutex_unlock(&sub->lock);
 	return 0;
 }
 
@@ -5428,6 +5438,7 @@ static struct unistim_subchannel *find_subchannel_by_name(const char *dest)
 					}
 					if (sub->owner) {
 						/* Allocate additional channel if asterisk channel already here */
+						ast_log(LOG_WARNING, "Allocate ONHOLD channel!!!");
 						sub = unistim_alloc_sub(d, SUB_ONHOLD);
 					}
 					sub->ringvolume = -1;
