diff --git a/pbx.c b/pbx.c
index 0f787513cd377b216c87e07c65bbd4032a7939cb..9e9a3ecaf82331b724ffad296a622a7951e93154 100755
--- a/pbx.c
+++ b/pbx.c
@@ -766,7 +766,6 @@ static void pbx_substitute_variables_helper(struct ast_channel *c,char *cp1,char
 	*cp2='\0';
 	do {
 		char *start,*start2;
-		if (!(*wherearewe)) break;
 		if ((tmp=strstr(wherearewe,"${"))) {
 			variables++;
 			length=(int)(tmp-wherearewe);
@@ -818,16 +817,15 @@ static void pbx_substitute_variables_helper(struct ast_channel *c,char *cp1,char
 				
 				cp1=cp2;
 			}
-			
-			pbx_substitute_variables_temp(c,cp1,&cp4);
-				
-			if (cp4) {
-				/* reset output variable so we could store the result */
-				*cp2='\0';
-				length=strlen(cp4);
-				strncat(cp2,cp4,length);
-			} else {
-				if (count) cp2[0]='\0';
+			if (count) {			
+				pbx_substitute_variables_temp(c,cp1,&cp4);
+				if (cp4) {
+					/* reset output variable so we could store the result */
+					*cp2='\0';
+					length=strlen(cp4);
+					strncat(cp2,cp4,length);
+				} else
+					cp2[0]='\0';
 			}
 			break;
 		}
diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c
index 1270471863b305e85da3303417bb5547c16d0991..0d540aebd7cbb25902cbd8631de979273d8b8cc1 100755
--- a/res/res_musiconhold.c
+++ b/res/res_musiconhold.c
@@ -531,11 +531,27 @@ static void load_moh_classes(void)
 	}
 }
 
+void ast_moh_destroy(void)
+{
+	struct mohclass *moh;
+	ast_pthread_mutex_lock(&moh_lock);
+	moh = mohclasses;
+	while(moh) {
+		if (moh->pid) {
+			kill(moh->pid, SIGKILL);
+			moh->pid = 0;
+			}
+		moh = moh->next;
+	}
+	ast_pthread_mutex_unlock(&moh_lock);
+}
+
 int load_module(void)
 {
 	int res;
 	load_moh_classes();
 	res = ast_register_application(app0, moh0_exec, synopsis0, descrip0);
+	atexit(ast_moh_destroy);
 	if (!res)
 		res = ast_register_application(app1, moh1_exec, synopsis1, descrip1);
 	if (!res)