diff --git a/apps/Makefile b/apps/Makefile
index 773eb535fe15bbd9e02f5b905539f9cf6903bc8d..fd5eaac36566c9a81afef6adab30308caf710d05 100755
--- a/apps/Makefile
+++ b/apps/Makefile
@@ -11,7 +11,7 @@
 # the GNU General Public License
 #
 
-APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_intercom.so app_mp3.so
+APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_intercom.so app_mp3.so app_system.so app_echo.so
 
 CFLAGS+=
 
diff --git a/apps/app_echo.c b/apps/app_echo.c
new file mode 100755
index 0000000000000000000000000000000000000000..370dc68636e6b7d183f038d3f37dfee0c0394df3
--- /dev/null
+++ b/apps/app_echo.c
@@ -0,0 +1,80 @@
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * Echo application -- play back what you hear to evaluate latency
+ * 
+ * Copyright (C) 1999, Mark Spencer
+ *
+ * Mark Spencer <markster@linux-support.net>
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License
+ */
+
+#include <asterisk/file.h>
+#include <asterisk/logger.h>
+#include <asterisk/channel.h>
+#include <asterisk/pbx.h>
+#include <asterisk/module.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <pthread.h>
+
+
+static char *tdesc = "Simple Echo Application";
+
+static char *app = "Echo";
+
+STANDARD_LOCAL_USER;
+
+LOCAL_USER_DECL;
+
+static int skel_exec(struct ast_channel *chan, void *data)
+{
+	int res=-1;
+	struct localuser *u;
+	struct ast_frame *f;
+	LOCAL_USER_ADD(u);
+	/* Do our thing here */
+	while((f = ast_read(chan))) {
+		if (f->frametype == AST_FRAME_VOICE) {
+			if (ast_write(chan, f)) 
+				break;
+		} else if (f->frametype == AST_FRAME_DTMF) {
+			if (f->subclass == '#') {
+				res = 0;
+				break;
+			} else
+				if (ast_write(chan, f))
+					break;
+		}
+	}
+	LOCAL_USER_REMOVE(u);
+	return res;
+}
+
+int unload_module(void)
+{
+	STANDARD_HANGUP_LOCALUSERS;
+	return ast_unregister_application(app);
+}
+
+int load_module(void)
+{
+	return ast_register_application(app, skel_exec);
+}
+
+char *description(void)
+{
+	return tdesc;
+}
+
+int usecount(void)
+{
+	int res;
+	STANDARD_USECOUNT(res);
+	return res;
+}
diff --git a/apps/app_skel.c b/apps/app_skel.c
index e766d1142bd7b3a3d93317b9004ac978d06c6e09..419b8f40a0587d578b0cc939461f89fca526ce17 100755
--- a/apps/app_skel.c
+++ b/apps/app_skel.c
@@ -15,6 +15,7 @@
 #include <asterisk/logger.h>
 #include <asterisk/channel.h>
 #include <asterisk/pbx.h>
+#include <asterisk/module.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
@@ -22,63 +23,32 @@
 
 #include <pthread.h>
 
-static pthread_mutex_t skellock = PTHREAD_MUTEX_INITIALIZER;
-
-static int usecnt=0;
 
 static char *tdesc = "Trivial skeleton Application";
 
 static char *app = "skel";
 
-struct skeluser {
-	struct ast_channel *chan;
-	struct skeluser *next;
-} *users = NULL;
+STANDARD_LOCAL_USER;
+
+LOCAL_USER_DECL;
 
 static int skel_exec(struct ast_channel *chan, void *data)
 {
 	int res=0;
-	struct skeluser *u, *ul=NULL;
+	struct localuser *u;
 	if (!data) {
 		ast_log(LOG_WARNING, "skel requires an argument (filename)\n");
 		return -1;
 	}
-	if (!(u=malloc(sizeof(struct skeluser)))) {
-		ast_log(LOG_WARNING, "Out of memory\n");
-		return -1;
-	}
-	pthread_mutex_lock(&skellock);
-	u->chan = chan;
-	u->next = users;
-	users = u;
-	usecnt++;
-	pthread_mutex_unlock(&skellock);
+	LOCAL_USER_ADD(u);
 	/* Do our thing here */
-	pthread_mutex_lock(&skellock);
-	u = users;
-	while(u) {
-		if (ul)
-			ul->next = u->next;
-		else
-			users = u->next;
-		u = u->next;
-	}
-	usecnt--;
-	pthread_mutex_unlock(&skellock);
+	LOCAL_USER_REMOVE(u);
 	return res;
 }
 
 int unload_module(void)
 {
-	struct skeluser *u;
-	pthread_mutex_lock(&skellock);
-	u = users;
-	while(u) {
-		/* Hang up anybody who is using us */
-		ast_softhangup(u->chan);
-		u = u->next;
-	}
-	pthread_mutex_unlock(&skellock);
+	STANDARD_HANGUP_LOCALUSERS;
 	return ast_unregister_application(app);
 }
 
@@ -95,8 +65,6 @@ char *description(void)
 int usecount(void)
 {
 	int res;
-	pthread_mutex_lock(&skellock);
-	res = usecnt;
-	pthread_mutex_unlock(&skellock);
+	STANDARD_USECOUNT(res);
 	return res;
 }
diff --git a/apps/app_system.c b/apps/app_system.c
new file mode 100755
index 0000000000000000000000000000000000000000..7e140a427833c0a922ac6ef08548e59aea0aace6
--- /dev/null
+++ b/apps/app_system.c
@@ -0,0 +1,82 @@
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * Execute arbitrary system commands
+ * 
+ * Copyright (C) 1999, Mark Spencer
+ *
+ * Mark Spencer <markster@linux-support.net>
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License
+ */
+
+#include <asterisk/file.h>
+#include <asterisk/logger.h>
+#include <asterisk/channel.h>
+#include <asterisk/pbx.h>
+#include <asterisk/module.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <pthread.h>
+
+
+static char *tdesc = "Generic System() application";
+
+static char *app = "System";
+
+STANDARD_LOCAL_USER;
+
+LOCAL_USER_DECL;
+
+static int skel_exec(struct ast_channel *chan, void *data)
+{
+	int res=0;
+	struct localuser *u;
+	if (!data) {
+		ast_log(LOG_WARNING, "System requires an argument(command)\n");
+		return -1;
+	}
+	LOCAL_USER_ADD(u);
+	/* Do our thing here */
+	res = system((char *)data);
+	if (res < 0) {
+		ast_log(LOG_WARNING, "Unable to execute '%s'\n", data);
+		res = -1;
+	} else if (res == 127) {
+		ast_log(LOG_WARNING, "Unable to execute '%s'\n", data);
+		res = -1;
+	} else {
+		if (res && ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101)) 
+			chan->priority+=100;
+		res = 0;
+	}
+	LOCAL_USER_REMOVE(u);
+	return res;
+}
+
+int unload_module(void)
+{
+	STANDARD_HANGUP_LOCALUSERS;
+	return ast_unregister_application(app);
+}
+
+int load_module(void)
+{
+	return ast_register_application(app, skel_exec);
+}
+
+char *description(void)
+{
+	return tdesc;
+}
+
+int usecount(void)
+{
+	int res;
+	STANDARD_USECOUNT(res);
+	return res;
+}
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index f2893b3f62bae1e9fed4b07a13bb81a04fd070c5..8fc6f500ff58e117e4e4beb4d72a5d3880637620 100755
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -141,7 +141,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent)
 	struct ast_config *cfg;
 	char *copy, *name, *passwd, *email, *dir, *fmt, *fmts, *fn=NULL;
 	char comment[256];
-	struct ast_filestream *writer, *others[MAX_OTHER_FORMATS];
+	struct ast_filestream *writer=NULL, *others[MAX_OTHER_FORMATS];
 	char *sfmt[MAX_OTHER_FORMATS];
 	int res = -1, fmtcnt=0, x;
 	int msgnum;
@@ -182,8 +182,12 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent)
 						snprintf(comment, sizeof(comment), "Voicemail from %s to %s (%s) on %s\n",
 											(chan->callerid ? chan->callerid : "Unknown"), 
 											name, ext, chan->name);
+						if (ast_fileexists(fn, NULL) > 0) {
+							msgnum++;
+							continue;
+						}
 						writer = ast_writefile(fn, fmt, comment, O_EXCL, 1 /* check for other formats */, 0700);
-						if (!writer && (errno != EEXIST))
+						if (!writer)
 							break;
 						msgnum++;
 					} while(!writer && (msgnum < MAXMSG));
@@ -221,9 +225,14 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent)
 								if (f->frametype == AST_FRAME_VOICE) {
 									/* Write the primary format */
 									res = ast_writestream(writer, f);
+									if (res) {
+										ast_log(LOG_WARNING, "Error writing primary frame\n");
+										break;
+									}
 									/* And each of the others */
-									for (x=0;x<fmtcnt;x++)
+									for (x=0;x<fmtcnt;x++) {
 										res |= ast_writestream(others[x], f);
+									}
 									ast_frfree(f);
 									/* Exit on any error */
 									if (res) {
@@ -314,20 +323,30 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 		ast_log(LOG_WARNING, "No voicemail configuration\n");
 		goto out;
 	}
-	if (ast_streamfile(chan, "vm-login"))
+	if (ast_streamfile(chan, "vm-login")) {
+		ast_log(LOG_WARNING, "Couldn't stream login file\n");
 		goto out;
+	}
 	do {
 		/* Prompt for, and read in the username */
-		if (ast_readstring(chan, username, sizeof(username), 2000, 5000, "#"))
+		if (ast_readstring(chan, username, sizeof(username), 2000, 5000, "#")) {
+			ast_log(LOG_WARNING, "Couldn't read username\n");
 			goto out;
+		}			
 		if (!strlen(username)) {
+			if (option_verbose > 2)
+				ast_verbose(VERBOSE_PREFIX_3 "Username not entered\n");
 			res = 0;
 			goto out;
 		}
-		if (ast_streamfile(chan, "vm-password"))
+		if (ast_streamfile(chan, "vm-password")) {
+			ast_log(LOG_WARNING, "Unable to stream password file\n");
 			goto out;
-		if (ast_readstring(chan, password, sizeof(password), 2000, 5000, "#"))
+		}
+		if (ast_readstring(chan, password, sizeof(password), 2000, 5000, "#")) {
+			ast_log(LOG_WARNING, "Unable to read password\n");
 			goto out;
+		}
 		copy = ast_variable_retrieve(cfg, NULL, username);
 		if (copy) {
 			copy = strdup(copy);
diff --git a/asterisk.c b/asterisk.c
index a79474077bd9c913fd7613c8f2a9b5b13151b326..bec0894aee19d07b8f4f38bcaa2e7f2e86116bcc 100755
--- a/asterisk.c
+++ b/asterisk.c
@@ -28,7 +28,9 @@ int option_verbose=0;
 int option_debug=0;
 int option_nofork=0;
 int option_quiet=0;
+int option_console=0;
 int option_highpriority=0;
+int fully_booted = 0;
 
 #define HIGH_PRIORITY 1
 #define HIGH_PRIORITY_SCHED SCHED_RR
@@ -39,6 +41,7 @@ static void urg_handler(int num)
 	   system call.  We don't actually need to do anything though.  */
 	if (option_debug)
 		ast_log(LOG_DEBUG, "Urgent handler\n");
+	signal(num, urg_handler);
 	return;
 }
 
@@ -89,6 +92,7 @@ static void console_verboser(char *s, int pos, int replace, int complete)
 	if (!pos)
 		fprintf(stdout, "\r");
 	fprintf(stdout, s + pos);
+	fflush(stdout);
 	if (complete)
 	/* Wake up a select()ing console */
 		pthread_kill(consolethread, SIGURG);
@@ -99,8 +103,19 @@ static void consolehandler(char *s)
 	/* Called when readline data is available */
 	if (s && strlen(s))
 		add_history(s);
-	if (s)
+	/* Give the console access to the shell */
+	if (s) {
+		if (s[0] == '!') {
+			if (s[1])
+				system(s+1);
+			else
+				system(getenv("SHELL") ? getenv("SHELL") : "/bin/sh");
+		} else 
 		ast_cli_command(STDOUT_FILENO, s);
+		if (!strcasecmp(s, "help"))
+			fprintf(stdout, "          !<command>   Executes a given shell command\n");
+	} else
+		fprintf(stdout, "\nUse \"quit\" to exit\n");
 }
 
 static char quit_help[] = 
@@ -138,17 +153,21 @@ int main(int argc, char *argv[])
 		exit(1);
 	}
 	/* Check for options */
-	while((c=getopt(argc, argv, "dvqp")) != EOF) {
+	while((c=getopt(argc, argv, "dvqpc")) != EOF) {
 		switch(c) {
 		case 'd':
 			option_debug++;
 			option_nofork++;
 			break;
+		case 'c':
+			option_console++;
+			option_nofork++;
 		case 'p':
 			option_highpriority++;
 			break;
 		case 'v':
 			option_verbose++;
+			option_nofork++;
 			break;
 		case 'q':
 			option_quiet++;
@@ -157,12 +176,15 @@ int main(int argc, char *argv[])
 			exit(1);
 		}
 	}
+	ast_register_verbose(console_verboser);
 	/* Print a welcome message if desired */
-	if (option_verbose) {
+	if (option_verbose || option_console) {
 		ast_verbose( "Asterisk, Copyright (C) 1999 Mark Spencer\n");
 		ast_verbose( "Written by Mark Spencer <markster@linux-support.net>\n");
 		ast_verbose( "=========================================================================\n");
 	}
+	if (option_console && !option_verbose) 
+		ast_verbose("[ Booting...");
 	signal(SIGURG, urg_handler);
 	signal(SIGINT, quit_handler);
 	signal(SIGTERM, quit_handler);
@@ -177,28 +199,34 @@ int main(int argc, char *argv[])
 		exit(1);
 	/* We might have the option of showing a console, but for now just
 	   do nothing... */
-
-	/* Console stuff now... */
-	/* Register our quit function */
-    ast_cli_register(&quit);
-	consolethread = pthread_self();
-	ast_register_verbose(console_verboser);
-	if (option_verbose)
+	if (option_console && !option_verbose)
+		ast_verbose(" ]\n");
+	if (option_verbose || option_console)
 		ast_verbose( "Asterisk Ready.\n");
-	if (strlen(filename))
-		read_history(filename);
-	rl_callback_handler_install(ASTERISK_PROMPT, consolehandler);
-	rl_completion_entry_function = (Function *)cli_generator;
-	for(;;) {
-		FD_ZERO(&rfds);
-		FD_SET(STDIN_FILENO, &rfds);
-		res = select(STDIN_FILENO + 1, &rfds, NULL, NULL, NULL);
-		if (res > 0) {
-			rl_callback_read_char();
-		} else if (res < 1) {
-			rl_forced_update_display();
-		}
-
-	}	
+	fully_booted = 1;
+	if (option_console) {
+		/* Console stuff now... */
+		/* Register our quit function */
+	    ast_cli_register(&quit);
+		consolethread = pthread_self();
+		if (strlen(filename))
+			read_history(filename);
+		rl_callback_handler_install(ASTERISK_PROMPT, consolehandler);
+		rl_completion_entry_function = (Function *)cli_generator;
+		for(;;) {
+			FD_ZERO(&rfds);
+			FD_SET(STDIN_FILENO, &rfds);
+			res = select(STDIN_FILENO + 1, &rfds, NULL, NULL, NULL);
+			if (res > 0) {
+				rl_callback_read_char();
+			} else if (res < 1) {
+				rl_forced_update_display();
+			}
+	
+		}	
+	} else {
+		/* Do nothing */
+		select(0,NULL,NULL,NULL,NULL);
+	}
 	return 0;
 }
diff --git a/channel.c b/channel.c
index 0a18b28187e209c942f68230f87ca9ca4419d4d8..881e291cf6e4abec959482a46d33f8550923f0ea 100755
--- a/channel.c
+++ b/channel.c
@@ -18,6 +18,7 @@
 #include <sys/time.h>
 #include <signal.h>
 #include <errno.h>
+#include <unistd.h>
 #include <asterisk/sched.h>
 #include <asterisk/options.h>
 #include <asterisk/channel.h>
@@ -26,6 +27,27 @@
 #include <asterisk/file.h>
 #include <asterisk/translate.h>
 
+
+
+#ifdef DEBUG_MUTEX
+/* Convenient mutex debugging functions */
+#define PTHREAD_MUTEX_LOCK(a) __PTHREAD_MUTEX_LOCK(__FUNCTION__, a)
+#define PTHREAD_MUTEX_UNLOCK(a) __PTHREAD_MUTEX_UNLOCK(__FUNCTION__, a)
+
+static int __PTHREAD_MUTEX_LOCK(char *f, pthread_mutex_t *a) {
+	ast_log(LOG_DEBUG, "Locking %p (%s)\n", a, f); 
+	return pthread_mutex_lock(a);
+}
+
+static int __PTHREAD_MUTEX_UNLOCK(char *f, pthread_mutex_t *a) {
+	ast_log(LOG_DEBUG, "Unlocking %p (%s)\n", a, f); 
+	return pthread_mutex_unlock(a);
+}
+#else
+#define PTHREAD_MUTEX_LOCK(a) pthread_mutex_lock(a)
+#define PTHREAD_MUTEX_UNLOCK(a) pthread_mutex_unlock(a)
+#endif
+
 struct chanlist {
 	char type[80];
 	char description[80];
@@ -33,7 +55,6 @@ struct chanlist {
 	struct ast_channel * (*requester)(char *type, int format, void *data);
 	struct chanlist *next;
 } *backends = NULL;
-
 struct ast_channel *channels = NULL;
 
 /* Protect the channel list (highly unlikely that two things would change
@@ -45,7 +66,7 @@ int ast_channel_register(char *type, char *description, int capabilities,
 		struct ast_channel *(*requester)(char *type, int format, void *data))
 {
 	struct chanlist *chan, *last=NULL;
-	if (pthread_mutex_lock(&chlock)) {
+	if (PTHREAD_MUTEX_LOCK(&chlock)) {
 		ast_log(LOG_WARNING, "Unable to lock channel list\n");
 		return -1;
 	}
@@ -53,7 +74,7 @@ int ast_channel_register(char *type, char *description, int capabilities,
 	while(chan) {
 		if (!strcasecmp(type, chan->type)) {
 			ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", type);
-			pthread_mutex_unlock(&chlock);
+			PTHREAD_MUTEX_UNLOCK(&chlock);
 			return -1;
 		}
 		last = chan;
@@ -62,7 +83,7 @@ int ast_channel_register(char *type, char *description, int capabilities,
 	chan = malloc(sizeof(struct chanlist));
 	if (!chan) {
 		ast_log(LOG_WARNING, "Out of memory\n");
-		pthread_mutex_unlock(&chlock);
+		PTHREAD_MUTEX_UNLOCK(&chlock);
 		return -1;
 	}
 	strncpy(chan->type, type, sizeof(chan->type));
@@ -78,7 +99,7 @@ int ast_channel_register(char *type, char *description, int capabilities,
 		ast_log(LOG_DEBUG, "Registered handler for '%s' (%s)\n", chan->type, chan->description);
 	else if (option_verbose > 1)
 		ast_verbose( VERBOSE_PREFIX_2 "Registered channel type '%s' (%s)\n", chan->type, chan->description);
-	pthread_mutex_unlock(&chlock);
+	PTHREAD_MUTEX_UNLOCK(&chlock);
 	return 0;
 }
 
@@ -86,7 +107,7 @@ struct ast_channel *ast_channel_alloc(void)
 {
 	struct ast_channel *tmp;
 	struct ast_channel_pvt *pvt;
-	pthread_mutex_lock(&chlock);
+	PTHREAD_MUTEX_LOCK(&chlock);
 	tmp = malloc(sizeof(struct ast_channel));
 	memset(tmp, 0, sizeof(struct ast_channel));
 	if (tmp) {
@@ -121,17 +142,17 @@ struct ast_channel *ast_channel_alloc(void)
 		}
 	} else 
 		ast_log(LOG_WARNING, "Out of memory\n");
-	pthread_mutex_unlock(&chlock);
+	PTHREAD_MUTEX_UNLOCK(&chlock);
 	return tmp;
 }
 
 struct ast_channel *ast_channel_walk(struct ast_channel *prev)
 {
 	struct ast_channel *l, *ret=NULL;
-	pthread_mutex_lock(&chlock);
+	PTHREAD_MUTEX_LOCK(&chlock);
 	l = channels;
 	if (!prev) {
-		pthread_mutex_unlock(&chlock);
+		PTHREAD_MUTEX_UNLOCK(&chlock);
 		return l;
 	}
 	while(l) {
@@ -139,7 +160,7 @@ struct ast_channel *ast_channel_walk(struct ast_channel *prev)
 			ret = l->next;
 		l = l->next;
 	}
-	pthread_mutex_unlock(&chlock);
+	PTHREAD_MUTEX_UNLOCK(&chlock);
 	return ret;
 	
 }
@@ -147,7 +168,7 @@ struct ast_channel *ast_channel_walk(struct ast_channel *prev)
 void ast_channel_free(struct ast_channel *chan)
 {
 	struct ast_channel *last=NULL, *cur;
-	pthread_mutex_lock(&chlock);
+	PTHREAD_MUTEX_LOCK(&chlock);
 	cur = channels;
 	while(cur) {
 		if (cur == chan) {
@@ -174,7 +195,7 @@ void ast_channel_free(struct ast_channel *chan)
 		free(chan->callerid);	
 	pthread_mutex_destroy(&chan->lock);
 	free(chan);
-	pthread_mutex_unlock(&chlock);
+	PTHREAD_MUTEX_UNLOCK(&chlock);
 }
 
 int ast_softhangup(struct ast_channel *chan)
@@ -220,7 +241,7 @@ void ast_channel_unregister(char *type)
 	struct chanlist *chan, *last=NULL;
 	if (option_debug)
 		ast_log(LOG_DEBUG, "Unregistering channel type '%s'\n", type);
-	if (pthread_mutex_lock(&chlock)) {
+	if (PTHREAD_MUTEX_LOCK(&chlock)) {
 		ast_log(LOG_WARNING, "Unable to lock channel list\n");
 		return;
 	}
@@ -232,13 +253,13 @@ void ast_channel_unregister(char *type)
 			else
 				backends = backends->next;
 			free(chan);
-			pthread_mutex_unlock(&chlock);
+			PTHREAD_MUTEX_UNLOCK(&chlock);
 			return;
 		}
 		last = chan;
 		chan = chan->next;
 	}
-	pthread_mutex_unlock(&chlock);
+	PTHREAD_MUTEX_UNLOCK(&chlock);
 }
 
 int ast_answer(struct ast_channel *chan)
@@ -392,7 +413,7 @@ struct ast_channel *ast_request(char *type, int format, void *data)
 {
 	struct chanlist *chan;
 	struct ast_channel *c = NULL;
-	if (pthread_mutex_lock(&chlock)) {
+	if (PTHREAD_MUTEX_LOCK(&chlock)) {
 		ast_log(LOG_WARNING, "Unable to lock channel list\n");
 		return NULL;
 	}
@@ -402,15 +423,16 @@ struct ast_channel *ast_request(char *type, int format, void *data)
 			if (!(chan->capabilities & format)) {
 				format = ast_translator_best_choice(format, chan->capabilities);
 			}
+			PTHREAD_MUTEX_UNLOCK(&chlock);
 			if (chan->requester)
 				c = chan->requester(type, format, data);
-			pthread_mutex_unlock(&chlock);
-			break;
+			return c;
 		}
 		chan = chan->next;
 	}
 	if (!chan)
 		ast_log(LOG_WARNING, "No channel type registered for '%s'\n", type);
+	PTHREAD_MUTEX_UNLOCK(&chlock);
 	return c;
 }
 
@@ -433,9 +455,10 @@ int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int fti
 	if (!len)
 		return -1;
 	do {
-		if (c->streamid > -1) {
+		if ((c->streamid > -1) || (c->trans && (c->trans->streamid > -1))) {
 			d = ast_waitstream(c, AST_DIGIT_ANY);
 			ast_stopstream(c);
+			usleep(1000);
 			if (!d)
 				d = ast_waitfordigit(c, to);
 		} else {
diff --git a/codecs/codec_g723_1.c b/codecs/codec_g723_1.c
index 89d2be760467bf51bef5ec6398a5067ce6dd50ea..b71e28cc2d389db3c29880d7ebce32c9f8e32308 100755
--- a/codecs/codec_g723_1.c
+++ b/codecs/codec_g723_1.c
@@ -200,7 +200,7 @@ static int g723tolin_framein(struct ast_translator_pvt *pvt, struct ast_frame *f
 #ifdef ANNEX_B
 		Decod(&tmp->dec, tmpdata, f->data, 0);
 		for (x=0;x<Frame;x++)
-			(tmp->buf + tmp->tail)[x] = tmpdata[x]; 
+			(tmp->buf + tmp->tail)[x] = (short)tmpdata[x]; 
 #else
 		Decod(&tmp->dec, tmp->buf + tmp->tail, f->data, 0);
 #endif
diff --git a/configs/adtranvofr.conf.sample b/configs/adtranvofr.conf.sample
index df19e094eb195377df0bfd52945b85c530356773..efd6af3f0beecfb8557f6218090ec2e6a795a91c 100755
--- a/configs/adtranvofr.conf.sample
+++ b/configs/adtranvofr.conf.sample
@@ -6,8 +6,10 @@
 [interfaces]
 ;
 ; Lines for which we are the user termination.  They accept incoming
-; and outgoing calls.
+; and outgoing calls.  We use the default context on the first 8 lines
+; used by internal phones.
 ;
+context=default
 ;user=voice00
 ;user=voice01
 ;user=voice02
@@ -16,15 +18,11 @@
 ;user=voice05
 ;user=voice06
 ;user=voice07
-context=default
-user=voice13
-user=voice14
-user=voice15
 ; Calls on 16 and 17 come from the outside world, so they get
 ; a little bit special treatment
 context=remote
-user=voice16
-user=voice17
+;user=voice16
+;user=voice17
 ;
 ; Next we have lines which we only accept calls on, and typically
 ; do not send outgoing calls on (i.e. these are where we are the
diff --git a/configs/modem.conf.sample b/configs/modem.conf.sample
index 27b3230f49062ef6e84a4a818cf4af40c9666c93..d5989b4779b761fd41147bdf273c8ec729fcafea 100755
--- a/configs/modem.conf.sample
+++ b/configs/modem.conf.sample
@@ -26,8 +26,8 @@ stripmsd=1
 ;
 ; Type of dialing
 ;
-;dialtype=tone
-dialtype=pulse
+dialtype=tone
+;dialtype=pulse
 ;
 ; Mode selection.  "Immediate" means that as soon as you dial, you're connected
 ; and the line is considered up.  "Ring" means we wait until the ring cadence
@@ -39,4 +39,4 @@ mode=immediate
 ;
 ; List all devices we can use.
 ;
-device=/dev/ttyS3
+;device=/dev/ttyS3
diff --git a/configs/modules.conf.sample b/configs/modules.conf.sample
index 2fe03093b4a20c8941694b166f590499a02105d9..2b32e1b0937c37946034c49f3cdd2deb2d110863 100755
--- a/configs/modules.conf.sample
+++ b/configs/modules.conf.sample
@@ -3,12 +3,26 @@
 ;
 ; Module Loader configuration file
 ;
+
 [modules]
 autoload=yes
-;load=pbx_gtkconsole.so
+;
+; If you want, load the GTK console right away.  
+; Don't load the KDE console since
+; it's not as sophisticated right now.
+;
 noload=pbx_gtkconsole.so
+;load=pbx_gtkconsole.so
 noload=pbx_kdeconsole.so
+;
+; Intercom application is obsoleted by
+; chan_oss.  Don't load it.
+;
 noload=app_intercom.so
-;load=chan_vofr.so
-;load=chan_h323.so 
 
+;
+; Module names listed in "global" section will have symbols globally
+; exported to modules loaded after them.
+;
+[global]
+chan_modem.so=yes
diff --git a/configs/voicemail.conf.sample b/configs/voicemail.conf.sample
index dcf3d0f8f12d00bcef6f764c8497480a10a2e6dd..ce36a3b6601f4dcd7020b17c4ed8b69fb7242281 100755
--- a/configs/voicemail.conf.sample
+++ b/configs/voicemail.conf.sample
@@ -2,13 +2,19 @@
 ; Voicemail Configuration
 ;
 [general]
-; Default format for writing Voicemail
-; format=g723sf|rawgsm|mp3|wav
-format=g723sf|wav49|wav
+; Default formats for writing Voicemail
+;format=g723sf|wav49|wav
+format=gsm|wav49|wav
 
+;
+; Each mailbox is listed in the form <mailbox>=<password>,<name>,<email>
+; if the e-mail is specified, a message will be sent when a message is
+; received, to the given mailbox.
+;
 [default]
-4200=2345,Mark Spencer,markster@linux-support.net
-4300=2345,Ben Rigas,ben@american-computer.net
-4310=2345,Sales,sales@marko.net
-4069=2345,Matt Brooks,matt@marko.net
-4110=1379,Rob Flynn,rflynn@blueridge.net
+1234=4242,Example Mailbox,root@localhost
+;4200=9855,Mark Spencer,markster@linux-support.net
+;4300=3456,Ben Rigas,ben@american-computer.net
+;4310=5432,Sales,sales@marko.net
+;4069=6522,Matt Brooks,matt@marko.net
+;4110=3443,Rob Flynn,rflynn@blueridge.net
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h
index 425eb2e304501df529a3997635f3d569ad9a68ed..d78c490d1d6fcece0e0fe98633b41ba4bd52ab90 100755
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -143,12 +143,14 @@ char ast_waitfordigit(struct ast_channel *c, int ms);
    for the first digit */
 int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders);
 #define CHECK_BLOCKING(c) { 	 \
-							if ((c)->blocking) \
+							if ((c)->blocking) {\
 								ast_log(LOG_WARNING, "Blocking '%s', already blocked by thread %ld in procedure %s\n", (c)->name, (c)->blocker, (c)->blockproc); \
-							else { \
+								/* *((int *)0)=0; */ \
+							} else { \
 								(c)->blocker = pthread_self(); \
 								(c)->blockproc = __PRETTY_FUNCTION__; \
-									c->blocking = -1; } }
+									c->blocking = -1; \
+									} }
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }
diff --git a/loader.c b/loader.c
index d6a549b4b1a124e6e04f55974dd3d69cba0d7053..63c44df40c917c24aeb1015439917a165755d303 100755
--- a/loader.c
+++ b/loader.c
@@ -92,6 +92,22 @@ int ast_load_resource(char *resource_name)
 	int errors=0;
 	int res;
 	struct module *m;
+	int flags=0;
+	char *val;
+	int o;
+	struct ast_config *cfg;
+	/* Keep the module file parsing silent */
+	o = option_verbose;
+	option_verbose = 0;
+	cfg = ast_load(AST_MODULE_CONFIG);
+	option_verbose = o;
+	if (cfg) {
+		if ((val = ast_variable_retrieve(cfg, "global", resource_name))
+				&& ast_true(val))
+			flags |= RTLD_GLOBAL;
+		ast_destroy(cfg);
+	}
+	
 	if (pthread_mutex_lock(&modlock))
 		ast_log(LOG_WARNING, "Failed to lock\n");
 	m = module_list;
@@ -115,7 +131,7 @@ int ast_load_resource(char *resource_name)
 	} else {
 		snprintf(fn, sizeof(fn), "%s/%s", AST_MODULE_DIR, resource_name);
 	}
-	m->lib = dlopen(fn, RTLD_NOW  | RTLD_GLOBAL);
+	m->lib = dlopen(fn, RTLD_NOW | flags);
 	if (!m->lib) {
 		ast_log(LOG_WARNING, "%s\n", dlerror());
 		free(m);
@@ -149,16 +165,24 @@ int ast_load_resource(char *resource_name)
 		pthread_mutex_unlock(&modlock);
 		return -1;
 	}
-	if (option_verbose) 
-		ast_verbose( " => (%s)\n", m->description());
+	if (!fully_booted) {
+		if (option_verbose) 
+			ast_verbose( " => (%s)\n", m->description());
+		if (option_console && !option_verbose)
+			ast_verbose( ".");
+	} else {
+		if (option_verbose)
+			ast_verbose(VERBOSE_PREFIX_1 "Loaded %s => (%s)\n", fn, m->description());
+	}
+	m->next = module_list;
+	module_list = m;
 	pthread_mutex_unlock(&modlock);
 	if ((res = m->load_module())) {
-		ast_log(LOG_WARNING, "%s: load_module failed, returning %d\n", m->resource, fn, res);
+		ast_log(LOG_WARNING, "%s: load_module failed, returning %d\n", m->resource, res);
 		ast_unload_resource(resource_name, 0);
 		return -1;
 	}
-	m->next = module_list;
-	module_list = m;
+	ast_update_use_count();
 	return 0;
 }	
 
diff --git a/pbx/pbx_gtkconsole.c b/pbx/pbx_gtkconsole.c
index 1aefa4ca884f3c36d0346a5b375bf216184f0e25..52a4ecb980bb51350cb8f6987d508e6e1d7d7e18 100755
--- a/pbx/pbx_gtkconsole.c
+++ b/pbx/pbx_gtkconsole.c
@@ -25,12 +25,15 @@
 #include <asterisk/module.h>
 #include <asterisk/logger.h>
 #include <asterisk/options.h>
+#include <asterisk/cli.h>
 #include <stdlib.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdarg.h>
+#include <sys/time.h>
+#include <sys/signal.h>
 
 #include <gtk/gtk.h>
 #include <glib.h>
@@ -42,6 +45,9 @@ static pthread_mutex_t verb_lock = PTHREAD_MUTEX_INITIALIZER;
 static pthread_t console_thread;
 
 static int inuse=0;
+static int clipipe[2];
+static int cleanupid = -1;
+
 static char *dtext = "Asterisk PBX Console (GTK Version)";
 
 static GtkWidget *window;
@@ -50,6 +56,9 @@ static GtkWidget *closew;
 static GtkWidget *verb;
 static GtkWidget *modules;
 static GtkWidget *statusbar;
+static GtkWidget *cli;
+
+static struct timeval last;
 
 static void update_statusbar(char *msg)
 {
@@ -65,26 +74,101 @@ int unload_module(void)
 		gdk_threads_enter();
 		gtk_widget_destroy(window);
 		gdk_threads_leave();
+		close(clipipe[0]);
+		close(clipipe[1]);
 	}
 	return 0;
 }
 
+static int cleanup(void *useless)
+{
+	gdk_threads_enter();
+	gtk_clist_thaw(GTK_CLIST(verb));
+	gtk_widget_queue_resize(verb->parent);
+	gtk_clist_moveto(GTK_CLIST(verb), GTK_CLIST(verb)->rows - 1, 0, 0, 0);
+	cleanupid = -1;
+	gdk_threads_leave();
+	return 0;
+}
+
 
-static void verboser(char *stuff, int opos, int replacelast, int complete)
+static void __verboser(char *stuff, int opos, int replacelast, int complete)
 {
 	char *s2[2];
-	pthread_mutex_lock(&verb_lock);
+	struct timeval tv;
+	int ms;
 	s2[0] = stuff;
 	s2[1] = NULL;
-	gdk_threads_enter();
+	gtk_clist_freeze(GTK_CLIST(verb));
 	if (replacelast) 
 		gtk_clist_remove(GTK_CLIST(verb), GTK_CLIST(verb)->rows - 1);
 	gtk_clist_append(GTK_CLIST(verb), s2);
-	gtk_clist_moveto(GTK_CLIST(verb), GTK_CLIST(verb)->rows - 1, 0, 0, 0);
-	gdk_threads_leave();
+	if (last.tv_sec || last.tv_usec) {
+		gdk_threads_leave();
+		gettimeofday(&tv, NULL);
+		if (cleanupid > -1)
+			gtk_timeout_remove(cleanupid);
+		ms = (tv.tv_sec - last.tv_sec) * 1000 + (tv.tv_usec - last.tv_usec) / 1000;
+		if (ms < 100) {
+			/* We just got a message within 100ms, so just schedule an update
+			   in the near future */
+			cleanupid = gtk_timeout_add(200, cleanup, NULL);
+		} else {
+			cleanup(&cleanupid);
+		}
+		last = tv;
+	} else {
+		gettimeofday(&last, NULL);
+	}
+}
+
+static void verboser(char *stuff, int opos, int replacelast, int complete) 
+{
+	pthread_mutex_lock(&verb_lock);
+	/* Lock appropriately if we're really being called in verbose mode */
+	__verboser(stuff, opos, replacelast, complete);
 	pthread_mutex_unlock(&verb_lock);
 }
 
+static void cliinput(void *data, int source, GdkInputCondition ic)
+{
+	static char buf[256];
+	static int offset = 0;
+	int res;
+	char *c;
+	char *l;
+	char n;
+	/* Read as much stuff is there */
+	res = read(source, buf + offset, sizeof(buf) - 1 - offset);
+	if (res > -1)
+		buf[res + offset] = '\0';
+	/* make sure we've null terminated whatever we have so far */
+	c = buf;
+	l = buf;
+	while(*c) {
+		if (*c == '\n') {
+			/* Keep the trailing \n */
+			c++;
+			n = *c;
+			*c = '\0';
+			__verboser(l, 0, 0, 1);
+			*(c - 1) = '\0';
+			*c = n;
+			l = c;
+		} else
+		c++;
+	}
+	if (strlen(l)) {
+		/* We have some left over */
+		memmove(buf, l, strlen(l) + 1);
+		offset = strlen(buf);
+	} else {
+		offset = 0;
+	}
+
+}
+
+
 static void remove_module()
 {
 	int res;
@@ -194,14 +278,12 @@ static int mod_update(void)
 	if (GTK_CLIST(modules)->selection) {
 		module= (char *)gtk_clist_get_row_data(GTK_CLIST(modules), (int) GTK_CLIST(modules)->selection->data);
 	}
-	gdk_threads_enter();
 	gtk_clist_freeze(GTK_CLIST(modules));
 	gtk_clist_clear(GTK_CLIST(modules));
 	ast_update_module_list(add_mod);
 	if (module)
 		gtk_clist_select_row(GTK_CLIST(modules), gtk_clist_find_row_from_data(GTK_CLIST(modules), module), -1);
 	gtk_clist_thaw(GTK_CLIST(modules));
-	gdk_threads_leave();
 	return 1;
 }
 
@@ -220,8 +302,12 @@ static void exit_now(GtkWidget *widget, gpointer data)
 
 static void exit_completely(GtkWidget *widget, gpointer data)
 {
-	/* This is the wrong way to do this.  We need an ast_clean_exit() routine */
-	exit(0);
+#if 0
+	/* Clever... */
+	ast_cli_command(clipipe[1], "quit");
+#else
+	kill(getpid(), SIGTERM);
+#endif
 }
 
 static void exit_nicely(GtkWidget *widget, gpointer data)
@@ -239,6 +325,17 @@ static void *consolethread(void *data)
 	return NULL;
 }
 
+static int cli_activate()
+{
+	char buf[256];
+	strncpy(buf, gtk_entry_get_text(GTK_ENTRY(cli)), sizeof(buf));
+	gtk_entry_set_text(GTK_ENTRY(cli), "");
+	if (strlen(buf)) {
+		ast_cli_command(clipipe[1], buf);
+	}
+	return TRUE;
+}
+
 static int show_console()
 {
 	GtkWidget *hbox;
@@ -276,7 +373,7 @@ static int show_console()
 	gtk_container_add(GTK_CONTAINER(sw), verb);
 	gtk_widget_show(verb);
 	gtk_widget_show(sw);
-	gtk_widget_set_usize(verb, 600, 400);
+	gtk_widget_set_usize(verb, 640, 400);
 	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), sw, gtk_label_new("Verbose Status"));
 
 	
@@ -333,14 +430,21 @@ static int show_console()
 
 	hbox = gtk_vbox_new(FALSE, 0);
 	gtk_widget_show(hbox);
+	
+	/* Command line */
+	cli = gtk_entry_new();
+	gtk_widget_show(cli);
+
+	gtk_signal_connect(GTK_OBJECT(cli), "activate",
+			GTK_SIGNAL_FUNC (cli_activate), NULL);
 
 	gtk_box_pack_start(GTK_BOX(hbox), notebook, TRUE, TRUE, 5);
 	gtk_box_pack_start(GTK_BOX(hbox), wbox, FALSE, FALSE, 5);
+	gtk_box_pack_start(GTK_BOX(hbox), cli, FALSE, FALSE, 0);
 	gtk_box_pack_start(GTK_BOX(hbox), statusbar, FALSE, FALSE, 0);
-
-
 	gtk_container_add(GTK_CONTAINER(window), hbox);
 	gtk_window_set_title(GTK_WINDOW(window), "Asterisk Console");
+	gtk_widget_grab_focus(cli);
 	pthread_create(&console_thread, NULL, consolethread, NULL);
 	/* XXX Okay, seriously fix me! XXX */
 	usleep(100000);
@@ -348,6 +452,7 @@ static int show_console()
 	gtk_clist_freeze(GTK_CLIST(verb));
 	ast_loader_register(mod_update);
 	gtk_clist_thaw(GTK_CLIST(verb));
+	gdk_input_add(clipipe[0], GDK_INPUT_READ, cliinput, NULL);
 	mod_update();
 	update_statusbar("Asterisk Console Ready");
 	return 0;
@@ -356,6 +461,10 @@ static int show_console()
 
 int load_module(void)
 {
+	if (pipe(clipipe)) {
+		ast_log(LOG_WARNING, "Unable to create CLI pipe\n");
+		return -1;
+	}
 	g_thread_init(NULL);
 	if (gtk_init_check(NULL, NULL))  {
 		/* XXX Do we need to call this twice? XXX */
diff --git a/say.c b/say.c
index c3f5fba5b419b8cf3191dc481036211808ee9072..41b66925e4da9171f051c6a3975eb319d819c2ca 100755
--- a/say.c
+++ b/say.c
@@ -42,8 +42,13 @@ int ast_say_digits(struct ast_channel *chan, int num)
 int ast_say_number(struct ast_channel *chan, int num)
 {
 	int res = 0;
+	int playh = 0;
 	char fn[256] = "";
 	while(num && !res) {
+		if (playh) {
+			snprintf(fn, sizeof(fn), "digits/hundred");
+			playh = 0;
+		} else
 		if (num < 20) {
 			snprintf(fn, sizeof(fn), "digits/%d", num);
 			num = 0;
@@ -52,8 +57,13 @@ int ast_say_number(struct ast_channel *chan, int num)
 			snprintf(fn, sizeof(fn), "digits/%d", (num /10) * 10);
 			num -= ((num / 10) * 10);
 		} else {
-			ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num);
-			res = -1;
+			if (num < 1000){
+				snprintf(fn, sizeof(fn), "digits/%d", (num/100));
+				playh++;
+			} else {
+				ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num);
+				res = -1;
+			}
 		}
 		if (!res) {
 			res = ast_streamfile(chan, fn);
diff --git a/sounds/beep.gsm b/sounds/beep.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..16407f65576c744e8bc988188a958884eb0ab6ab
Binary files /dev/null and b/sounds/beep.gsm differ
diff --git a/sounds/demo-abouttotry.gsm b/sounds/demo-abouttotry.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..2d7842fd31e380d7951363dc83cbb3f1b5bfe85a
Binary files /dev/null and b/sounds/demo-abouttotry.gsm differ
diff --git a/sounds/demo-congrats.gsm b/sounds/demo-congrats.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..c3fa396bac5e19d353176e3475dff06d3d589e81
Binary files /dev/null and b/sounds/demo-congrats.gsm differ
diff --git a/sounds/demo-echodone.gsm b/sounds/demo-echodone.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..f0d6764f44428a480e40aba6be9e708e395baa98
Binary files /dev/null and b/sounds/demo-echodone.gsm differ
diff --git a/sounds/demo-echotest.gsm b/sounds/demo-echotest.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..3ad6c2aa45977880f952ec37c53135a2018505a3
Binary files /dev/null and b/sounds/demo-echotest.gsm differ
diff --git a/sounds/demo-instruct.gsm b/sounds/demo-instruct.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..b40d17212eb92120552ce2fb2177f494b337d19c
Binary files /dev/null and b/sounds/demo-instruct.gsm differ
diff --git a/sounds/demo-nogo.gsm b/sounds/demo-nogo.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..340b3c87062884f95747bc757b9e43926d5274c0
Binary files /dev/null and b/sounds/demo-nogo.gsm differ
diff --git a/sounds/demo-thanks.gsm b/sounds/demo-thanks.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..6c8b1418f9ac634c5e512ac732229a231b992325
Binary files /dev/null and b/sounds/demo-thanks.gsm differ
diff --git a/sounds/digits/0.gsm b/sounds/digits/0.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..d7c3be0ae1715bae172b8cee5d42a3206b605037
Binary files /dev/null and b/sounds/digits/0.gsm differ
diff --git a/sounds/digits/1.gsm b/sounds/digits/1.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..c59f027cd67002407a43dfee8b52a1bfc99059aa
Binary files /dev/null and b/sounds/digits/1.gsm differ
diff --git a/sounds/digits/10.gsm b/sounds/digits/10.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..fd8c88a09fb77fb86661b973df832f6034bbdab1
Binary files /dev/null and b/sounds/digits/10.gsm differ
diff --git a/sounds/digits/11.gsm b/sounds/digits/11.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..c22cf785bfd6695ff6e08dbf17f338188a7ad3b6
--- /dev/null
+++ b/sounds/digits/11.gsm
@@ -0,0 +1,5 @@
+Ó™ÕS^ÀͪUe ³M-WƒVÀ¹˜J’[¬¡jm¶éÓè‚#àÀÖ’­CKœá8ë1·äÁ8Ô±jMo!¡ú¿iÒv›°sdH±ÛebÂ,]¤Ö…´Ûž%”^$)n8ÄÒkú¥k¤Å¨æòÓ¢ÈãGâµ ˜oŠ6åñ™Ú„–Ód4Ò5ª!kŠ¦Ûè‘ØdŒÃÈ“•;?Œä‹‰×*$&Ür[„Ò1á¤ë¶ƒ%™¶D9^Ô:Ü‘"‘Ú€Æ]‹#ÙðV½Ò4Ð᳉"ó"qÉ/‹!a&€‡â'MðÛÆÃZi”Ò3èis…¹ ²UãÕ!ŽÇ ",ށöÙ}ⵝ‚W ÒqÑe{{Ç)Ž;o{åƒT­²Âw¤4üE(s*(ÛMLþÓs“žywU¨¢rÑI¾-ÄâqPµQúmkMá¤N–ÁÔ/”:qÎ/'je*o³§ט¤m2äÙ.'oo®+ÓçcÔmœ[xÛ°¶ä7@³ÙQÄêžS\kQ¸ÔjG=ÙPŠ”P¶ÕÔ,¬_pk¯¥Û磌kbñáCisÇf·ÙÓMTÒp6%Ó¬¬_pkPߎUÆÔÓÏVü5wk®Êãxd5n…›1´›Óë“×:kp=ÚRÆ¡ÚíX+»è
+ÜJHÉ…„æäÌÿJÇbÓêyÞkî©—“¯h<€Ç9[…¸×~Èh$‰Ê؃솲9[Ôj‚jîÅhÊôfÊ…#›»ñ‹D„¥ÈÄi·¬…^
+r4ìÓjƒgq…¨9Rrþ4¼ˆÐœR„ˆ‰ÉW5AÙ“‰¯u0þÓ«d3©‹¨ò¿ŒÎÔ‰§Ä
+‰=p‰(ÄÜQ½X“((͞ѤÓç„ghçLK¬h“˧cÔ;"'É0ÂS¡	)\ééTÓ(Œç``«9km&£vµÉfªYc¢Ä«'±2žEÓ)u3 ÈC>Uͯ
réqR#¶BV¶Ü¯e¸M$îÒå„ê(´¤dÅr+cºÆ¶ã7À£ûe!¦ë¨ä5"•„‚ÒŸweà°ÄG.öSžÄFäÍÙ²£óZ±ÚÂb{‘[¹ŠÓW
+³b
•NÏd±Ôºî@ò·–Ä£º{¢"× ÓN"™³5,ªÔ³"«'‘°«µãFۍ´ŸZˆ–—ÜâÓ]UÞY`!®ûQɱA«;v_AØܹҐ³ÁB¦…ÔjÒ^†áT¢ªŽs[¢Ûe¨Ó¦@ç±îV“Ö@¨Š,S¥Ò^S¥"à ¾õ²ÄÓ¦Áäm´ãØ€Ùœ‰["À€£+mGYÓ s™Zž€¥¬µÉnÖ å£rE3| ¸ÓqÄ¥Ç@öá®Á-ÒÝjœÚfÀ¼ò­Ø´ÄàÏrMÌ¢Þ £T1†‚À¯uš76Ô jaX” Çl’i,˜ ¶ÓLÕ“Õ@¤™Å‹!E""îÓßzÙQŒ ã6”·òªà·"ˆ´êÆ Ë!±¥SpÀÆòŠ8ÕÒÝZ\ÙX Æì®MZàºã‰\l §h*'‚@êÛ‘E­ÒbÔ@8ì—[;ì`µK­VÀbBÃó˜à_S}u
\ No newline at end of file
diff --git a/sounds/digits/12.gsm b/sounds/digits/12.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..445a4bfea752b482d07aa3222f7b9caa0eddabd7
Binary files /dev/null and b/sounds/digits/12.gsm differ
diff --git a/sounds/digits/13.gsm b/sounds/digits/13.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..e0e04e717a33ba827a8f1f0857c27711a90f089f
Binary files /dev/null and b/sounds/digits/13.gsm differ
diff --git a/sounds/digits/14.gsm b/sounds/digits/14.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..0ee808ad488b009903f24f0a4b57a4dde0dff51d
Binary files /dev/null and b/sounds/digits/14.gsm differ
diff --git a/sounds/digits/15.gsm b/sounds/digits/15.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..debe890589d682df8b3a208c22e49d2af145ba42
Binary files /dev/null and b/sounds/digits/15.gsm differ
diff --git a/sounds/digits/16.gsm b/sounds/digits/16.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..fe4b020abfb05ec29efdf0e4c6f6b204b8e374ad
Binary files /dev/null and b/sounds/digits/16.gsm differ
diff --git a/sounds/digits/17.gsm b/sounds/digits/17.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..af2fc6aaa42cc8716a4ed3685b6b7f17363ba206
--- /dev/null
+++ b/sounds/digits/17.gsm
@@ -0,0 +1,4 @@
+Õ‘-£R¢4t`Ö¡f¢¤¥* Â¶«4;p¢Q²I^œÖy`©»"ŸIVš˜
c,ÒÀâU\OÚ« ÁË¥Uòó×èxÝÙ|¢(­V£™‘Œá™©sSŸ˜¢ÎÍ4¤Ö[xؑء†¥±FͺÂÙnD¨ÜÂ6ͦç(œâ›¢5fÈÕœ`˜Y»#ÊÕfh ßøänÍCçbÔ¢7fY$´§i7&ԝr¡rw%(ª‰ÖƒÈÄãm¸6X…T0&Ë›+7,¶±%Ô¦dè_Í4ä–ûÅ\lÿ¶6îy[uDny13#nJÆÕ&u8Šîà-`Â]wÐ;ðIÆ“wQ$‹ŽÚ+°°²¡Ôét¦øëRK„m8äw1”“q[ul&ä1…®u0ê,ÉLÓê|æ±ç/4¬›$èÐF̉IotÍŠ«iÆÚèï9%îãÔ*[ZrîÈÈ42',îÈ„³>™[}E¿å›Ó&v¦Õa8äÔhdò}äô+if‚}ÈFãyÕâvÈà,V{¥C„qªÅÔ¦cß1{é9$×A%Žè
+D)vw¬KD²'#wì¶í–Óæcë0qh†ªE)Ws<%m·bçG7-¸.“æË%ZmË·Òålç(æ©#hÇè†Çc¿ˆ´ìç`­mÉ¿îÅŽeq¥iÒ%§™x¦9wÁ³=K¤ñCx49-zåÉm¢G#Ò&¦Xá ä–¥Në{B€ËÆ4¥~û]ò&㢢(ÉvɧÒ'¥$é€Â-D°ÓÒat–ùK­àI+5ꁪõvù¤ÓàL ÚPág›˜¤n°¡Lšój3êRà)w¤¡èä•Ú×bš$¢’¡Û	•1%å摇¸‘h£Þ.ÈĦD¿dXœØ¥‘%"ê¤=³m²£GÚ
ÆËl¤8øµLÓ¹i(äÆÜØh‰]pj†ÝŒ†ç;Š¾¥„¨Ø½¹<¡«fnÞãØdpqŒ§kœ}9i´ÆÉS´¦ÀÃãÀøþdå½­NhÂÕLrèh8å›ûºdǶÁ@¸îƒ¯ËBmÆã}-H“’È$ÕžD÷(˜ªI„ƒhÉò©¦Ûh\M…7?…¨bì‘É=ÕE¾Ø‹G'oÊœ¨¨%’²Ä“7øYÔ¦
+h"LÔÝU¾å²ún<Ñ‘C·MUm“J²ÁÔ“e´ÛqÙwÔnyIÜ…´° ]—d´ãIÛX¦¦ZäMÉP›¢É#³Ç¤Óžv¹
+›¶ÚÇdcšy¡"Äj¶[¡A$þxÒߥ¸œ¡Â.HË¡ÂZ›R?•Z£4’$‚§P‘J}QÔÝMù³Bò‘RÝ«ƒ‚ÜnYbRĉ%mÉ"¥¤jÁæ°fÓßf­Y¬¤Tq¦¤³"”e—-¶¤km8ܶâ6âmÂ2Ò$¥ì™·!Šæ¾é%laµÒݼÁ¡×ÊÉm¾‚!¤±ÇdÒŸfå Ç#·I½a×H²fÚ»a¹#jE̹AÅs²Q#Ò vd¢àÀÃR¶H’¹!‡NJíT"ß©—"¹A&Øn¨Ü
\ No newline at end of file
diff --git a/sounds/digits/18.gsm b/sounds/digits/18.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..d2c604867afd49f0742429993a8606e9ba198f1b
Binary files /dev/null and b/sounds/digits/18.gsm differ
diff --git a/sounds/digits/19.gsm b/sounds/digits/19.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..67dc993b36299413b60e73e081aaf48525608cf5
--- /dev/null
+++ b/sounds/digits/19.gsm
@@ -0,0 +1 @@
+Ô cœ‘‚À¦írXS° ¦ì)ÔœºàZ¬Ú_œÀÉ&j¦âÒzXÐh€r‰ÁEþ†€ÔôVæ’ Ùª–Y3” É#M8[Ôà‹ÙÖàÃQ¸ãÔ 'esYžà Ë­RFåtÀ
N$Ò]zœÙÄ€+!e#4êàÊÔ¾¹cr€æã–4Ù’ÀÄâÂãÒÝj™RÀ¹‘8›®€34Q…„àoóÕW—ðÀ¿q%ҝdÜâb@©]n=€·ªÉðà6ß–hÁ¹ù¶ÑÒa‡]Ùua„“i˶ƒCJV8š‡c4Û“È%¹D&Y1£ÁÔhr§0ƒìÉlèÒª(ÐÙ>ƒMRvÄ܃Ìʼn¯Õkr_(hÔf'v­ér&£}î7$ŽÁÚ’¬È˜¥8çÕª‚—p{ÍXÏMÈêy­&š™ï†ŽÌ၆¯ñŽW¹m¶ÜÔè{XwL¤Û–pÞàéÎ(°gë-½DÒ'ul&ì›ÖÕh[_Ru(ˆ 1}éêô1P¼Ís+8ï¼"álR;gÖ$K_aç
j•´Üo͸ðX¥o+'¾Ñ*ÙÜC¶(çÕ_LòØÛj±‰äÛ'š·p!ËÚÈ#wîŒì)—N¹gÒ'¥ÙRÚ‰]Ò)ØÛÚDÆìÜD£ÜCÖÕÊ[pîBu+ÛÒcdâèƒ[e
¨ÜÚÂ	IéãÊ¡E]¯!¤Ü¢7ô’ÅTÓb|!RîÁ#Y$óª@è#Gäì4}’–ÔŒÀþ]ÏYjÒžc-Q¡DŒRÌêÁ'#i©!n ¥Ý‘9˜r «jØÓ×"rqA;JÇéÉÖ¤ÜzãFZq )ˆÅ±M),ØëpLêØ„*’0ܤg9´íéfÆÝÛžw›ZÅ+¨ƒ©Ùêš)QHF*…º›¶¥<¾“»RÇEäv;\žÆG(}(ŒÙkiÉhÌ…ú:dÅæ-MªãÈÃI–Úü«dz£¶€*Ö_$2à˜ƒ2)Ûv€ãzÒ)¤¥ëˆ¹mŸ——ã̽ýÖ^<öàƒdÌ©3uŠÊ°[M½´Ž„!¡YF‹*íhÕ]E·è&¦Ò£g©Z’Xìš&Ê¥%8T-¤ÕÝE;î„•€£$¥ä:
iÁ}VännIš©ÃË-çTãÖ^<ûð¦z„u–”«å¸âŽË7«Go[®Ç#©ÄE"x8œÕM{©DGõŽ´•žBÏYl(R«EÈ둾¬¯ÇÇ#r63Ômþ˜¦„”Nµ¡R¢™£‹\°ã–å»ú°ÂˆLq¶ÐÒ'Ŭšªƒ RjˬÂan×[¦á»+u[îîs:¨8¥Ò#Žä¢§dɪ'$VBÚ±¶í¾!WXMÄ´¡MdÇZÒßn]baÃIjPƒ'/Ö¦å¯!Å,±ª¢ÜzéÒŸe]"«bQ)¨˜«A)«eÍfáORT˜«`³“UªÞÒt¥"ØÁK"Œ‘e¦A&ÍŽ¨ãä€Ù¹ÉXà€©‘ªóÑÝK%šÀ¥*–+Þ€Çd²ÌSTÀÆ)²"e¾À¶œnC+
\ No newline at end of file
diff --git a/sounds/digits/2.gsm b/sounds/digits/2.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..4de58fbc9c562881805be7344fa4419b202b2fc9
Binary files /dev/null and b/sounds/digits/2.gsm differ
diff --git a/sounds/digits/20.gsm b/sounds/digits/20.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..e10de0d628df21f40950d9b47e8c28f7ca025649
Binary files /dev/null and b/sounds/digits/20.gsm differ
diff --git a/sounds/digits/3.gsm b/sounds/digits/3.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..4395cae0a42815c345e1b716a20832ccb420c5ef
Binary files /dev/null and b/sounds/digits/3.gsm differ
diff --git a/sounds/digits/30.gsm b/sounds/digits/30.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..025a2584687b940aa6d53d5813bd792784a6c050
Binary files /dev/null and b/sounds/digits/30.gsm differ
diff --git a/sounds/digits/4.gsm b/sounds/digits/4.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..be5c1df6b5f4661ef13217d88a649ff8301c73c1
Binary files /dev/null and b/sounds/digits/4.gsm differ
diff --git a/sounds/digits/40.gsm b/sounds/digits/40.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..cdf537e67e417822de561274e9ac1e013a8a3704
Binary files /dev/null and b/sounds/digits/40.gsm differ
diff --git a/sounds/digits/5.gsm b/sounds/digits/5.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..570b01f1a74733d79f3401e8ace47ad5a42b187e
--- /dev/null
+++ b/sounds/digits/5.gsm
@@ -0,0 +1,4 @@
+ÓßiÕ† Ìé·Hœbà¶Ûvó̠ÉӍʤnÀDáX¢oÓ]z"´ X$9»S¢ <[s(ÂêÀ©!vEUvÀ}’!Ój¡¦@—’ÈüR YWú+\€<ËÂp‚À3®ˆÚÒ]zYÀ —*Q·+æ€Ù,§KzÀÔ­Qäh §v,ãÔß‚`Ùրɣ‰Ç$´€ÖԌȢfÀô«¥–€à¦ËÒ8ªÕ¡zYÐÀ§aÑÉ"r`ß›—Y¨ÀÄÜ”í$š€%ŠIŠÖé›ebæÁFÒQ"ñâÉ&·Ë¶_ËÈͶAdRH1«M"šÓ1›ž:ZD@)5$êCW[’ý¾YÌG#m¹/aÎÚ$dÔ•ÓðºÚ=]°9¨‘É$sÎ"³÷+q¥YnqïC[v%ÈÔ¯ÃÕ½qϸ/œ9qQ8!M ‚äâ¡0*qñVã¦8¨ÔñÙüo­väÊÖ'mP7L))/oQ[ò*mí9'†¨ÙÔò»Ùûoº#V]Emm3˜¦%¯ÛÌÃÝÆ×>mÎÇ\8œÔó³Ö:×ñÅm7ÏÙŽê”Û"o©‚ÀÔ¦ØÛQÆäÐHÜÔ±¼;oÌŽW*émÔêf1
+oÌMn·cÝé*4·å/Ôq
+¤J)/qzr«#áðÇ#7#ß3¼*n=¢Õ2³™»‚ð, ©ÜãpíÃÍÆés®X£²N[u
hÆ"ŸÕ1´R:u¯22†«Uu®™SŽtów,ÁaM#/í1Q]MGEÕ2›Úyï©Ê*ã’{‹yùr9|{­#âÈ¢}Î'^›Õq”z¾ÑÖÚ'}1oErDìO¶¡¯ùDÆÑI[l˜Õm”y­ÆL¢Öª‡®È4ÍUÂÒqdP¦ë‰ÐH¢Ç„Õ­ƒÞùزÉ#u&ÃŽÁ,þ"‘N«Q†ÐËõG#Õª„"¸—0FÜc'$•
} µÇ#—o6à‘·%›*Îu¬F“Õèt¸›«ÈúmƒÜÌñ}*fŸjº¤²]| ŠtdhºÌÖ§[Ò¹¡ë3K©6…æŒzg„ÈK£IxsÌêŒo‘…PÕfKÞù§ÌVè­É¦¦}Nµ¬ ©5u8«H{Zj7ÔçBÚ+®ªÈÛlW°Ä­Œ";5¦b¯Ý@äÄcm¾»Ô"R£ª£Ú̍M²ä}‹ÛìʁêâÇ	ðaÖ%l­ZÔk!¢ÁX¬QzæàÜåw•w¸,¬-Õ+ðÁDœ6ÛÖ"z"Tá\q%"|ÁY5ŽË'²¡Y'D›ŽTÂI±OÕ¤Z–ÂfÓq‡ªˆá,Û­Ù®ÈÁgb¥ÛêÄA\rMS$Ô%QÙጡ—Cmȥ΀¨…½­ÌÎA[j<Ìî öŠm‘Ó!iàà¤Ó1,™êf]ŠY[œ Õ5Ž&Ô´ ¢ÓˆÈ£Ój]Ùê ÊÖÈóÚàÖôŽYcØàèäŽW[Ž€»
+»cÒ]z˜âR Ø“’ÉT¸€É${VìÔÀ*«CÌ­¡`Ç
n'ҝsbà·i½àÀë#ŽG,”€lå•rãÚ€¦¥šã
\ No newline at end of file
diff --git a/sounds/digits/50.gsm b/sounds/digits/50.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..38edca62358c57d9f6c895d05d03b915e95d3827
Binary files /dev/null and b/sounds/digits/50.gsm differ
diff --git a/sounds/digits/6.gsm b/sounds/digits/6.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..bfad09ae7b193e9525d4ffcdd27ca35560d23e5c
Binary files /dev/null and b/sounds/digits/6.gsm differ
diff --git a/sounds/digits/60.gsm b/sounds/digits/60.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..2bfdd22b13007589ef6393de413ef27bf83a1910
Binary files /dev/null and b/sounds/digits/60.gsm differ
diff --git a/sounds/digits/7.gsm b/sounds/digits/7.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..10d47a833b652fefe5c4e4cd9868875054e6e61f
Binary files /dev/null and b/sounds/digits/7.gsm differ
diff --git a/sounds/digits/70.gsm b/sounds/digits/70.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..b2d792d46c7f790c124c833e6d59abefbe59f14a
Binary files /dev/null and b/sounds/digits/70.gsm differ
diff --git a/sounds/digits/8.gsm b/sounds/digits/8.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..d448934c0aa1a5b24a74e268efd28a273baf44ec
Binary files /dev/null and b/sounds/digits/8.gsm differ
diff --git a/sounds/digits/80.gsm b/sounds/digits/80.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..8f03a1e6116f626dd30ad4ef68e0bb56335d666a
Binary files /dev/null and b/sounds/digits/80.gsm differ
diff --git a/sounds/digits/9.gsm b/sounds/digits/9.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..834c1a529cc600f6d7ff99b1379c1f2739ef8c39
Binary files /dev/null and b/sounds/digits/9.gsm differ
diff --git a/sounds/digits/90.gsm b/sounds/digits/90.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..7a362fdf6cbb4cac8f856ce4c7791b604a21e872
Binary files /dev/null and b/sounds/digits/90.gsm differ
diff --git a/sounds/digits/hundred.gsm b/sounds/digits/hundred.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..890cd90c7b8c4a51bfc24efe7d814df8c772be42
Binary files /dev/null and b/sounds/digits/hundred.gsm differ
diff --git a/sounds/transfer.gsm b/sounds/transfer.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..a4928913bc03227648f629d42158ea2b436776fa
Binary files /dev/null and b/sounds/transfer.gsm differ
diff --git a/sounds/vm-deleted.gsm b/sounds/vm-deleted.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..0839a0e94e107f4c68eb5fa90c931773319168d6
Binary files /dev/null and b/sounds/vm-deleted.gsm differ
diff --git a/sounds/vm-goodbye.gsm b/sounds/vm-goodbye.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..9ae8ad1eefbe6bc96066500ed4e733a32266be5d
Binary files /dev/null and b/sounds/vm-goodbye.gsm differ
diff --git a/sounds/vm-incorrect.gsm b/sounds/vm-incorrect.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..486a9b8b4e1ae2d3ca8aed833ae5162006073787
Binary files /dev/null and b/sounds/vm-incorrect.gsm differ
diff --git a/sounds/vm-instructions.gsm b/sounds/vm-instructions.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..7e826b79154b6529ffb2133fc8636a4dd83fbe15
Binary files /dev/null and b/sounds/vm-instructions.gsm differ
diff --git a/sounds/vm-intro.gsm b/sounds/vm-intro.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..64624a0d892df9cee816e3278ee8b748e20ebb31
Binary files /dev/null and b/sounds/vm-intro.gsm differ
diff --git a/sounds/vm-isonphone.gsm b/sounds/vm-isonphone.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..a0ce4e5a52678a34ff0c651063925b48e3226c2e
Binary files /dev/null and b/sounds/vm-isonphone.gsm differ
diff --git a/sounds/vm-isunavail.gsm b/sounds/vm-isunavail.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..e972c1ebfba78ea52de05091243c44553af92803
Binary files /dev/null and b/sounds/vm-isunavail.gsm differ
diff --git a/sounds/vm-login.gsm b/sounds/vm-login.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..a1f14288e31cb2f25f16a1f94c4db607b0ff2408
Binary files /dev/null and b/sounds/vm-login.gsm differ
diff --git a/sounds/vm-message.gsm b/sounds/vm-message.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..8386ae79916d7eaf558d3effeb14e2bcc9318f5e
Binary files /dev/null and b/sounds/vm-message.gsm differ
diff --git a/sounds/vm-messages.gsm b/sounds/vm-messages.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..5c2b5b240053ab721e68f6bf836ac4a10015fee4
--- /dev/null
+++ b/sounds/vm-messages.gsm
@@ -0,0 +1,5 @@
+ÔEP™ˆáZüSÉ]ŸÁX|ûÔÁ|’Lo39\AT-»VÒfr¡Y„¡Í;2|­V¶N6ÓÊ€–fGH‘ðA(Ýi
+Ò§zÙ—!)a‚]mRàó+u£
+”Á"e$Kk”¡Eâ­›eÒé‹•Q„ŠJÙ¬p¡‡Q4›ÀÃfÁ%ÐÁ\ÜVëÒhƒQ!dmrL¯láj[°Ûu–¡8S$ZXÁPl)ZûÒ£e¨cQe+Û·By%j¬Ê[#:Ýœ™kâÈŠqôÒ¤vlë¯%¤N1¢o&×|rÄ¢oC² OÖjÄ–l)ÑoÒç…-ªoÃ÷££KáÊ©ŽTœk-µ$vÖ$kÌ:\‡´Ó©lz°iMÑuNÅk-;wU²ãi¬	LŽ££iéÌœ•Y˜Ôh\êøijyCÔ&×ÏìkD¤¸Ùg,š•ñKK͉–ÂèK*Óèm£(g	v•ѦeNÑ$jµË
ƾÆâËMÔå—¶ÛÔhTâðË-4,R×z|«(ȃ®gLÌm4ãkHù5¿'#Ô¦Ri°Ê)ÒNÍkæEˆÀ§µÞ‡6MÆäÀ¤=b¿m|Õi¬¨»CHÄù1Œ¦Gñ'nÀ„§Ü©i¢Ê£½.ôkÕid©®ã!›œt±¯$» Ù¯%x¥
+”«xã&’%‹Ö€è°Ê㙌ÆtdâäËAÕ¤"Ö¤2!­(ý™%ÓvÇkÓãsq¸ge.Uy´oɨ;mwîšfÌ8‚mI7£)&#•Ó%e*øv¬³-Ø9"vêG¡)/}Èê,Ú䁒ÿ—äÓÓãL*x¦È㥀ö‚¨XàSfš„Æ3CWKiª‡Ðãr¶’Óßbqû‡È­æ‰XÃU(•Ž§Ú¦iÎÔŽ…Ï’.ԝÒb£¬êrD}*2©ŒCµH‰Ù,î"¹X•âîâ"‚…:õÓž«mšV»ã)GBR‚U]r¤ÄAú׊ñ".f*­*ØZƒiâÜ¢–	û»©#éîÎJßë¬1$m¶Û„¥É7y¥CÚ”q&°e´š|öêFÙ¡ꧧDm)¥z…òP(§ÕZ‚r-pÉÙ­9+¿IÆÛ
ÆîîãZƤ–ÈÙÍÄïÓ£m.q™l-Ñ<ä’å`j.ýÿP¤ˆ­V·[—FI“¶îÌÓ¤mjñhÊHãnDÄ—%!T¶êĘÅÅ$ÉÔ„—Ķ¬Òæ}æ°š†¦£m±š£#¯­;&ŸgÊÛmsZ$ù¬íÆÓÒæefø ¢*‚ÁœÃNüÅúËÝEˆx› ãÍä­¨ÜÓ¤c©ù¤Ä:ì–¬¥Å)LòµmP¢â«ÑÁ¨Âš²èBÔ_™i¢Üâ Qr˜±C½kù¹S¼Â‘EoFêÀ‚Šf¦ÁׁéSÒæU´¦èã[4—ÉfÕ$Tü2˜Ä^¥KrF+Õ˜aìár„$ÁáB¡R¢¶õŠüŦ¤MÕmÚßê£h˜1DÑÖX’mazâ¥"mú©#·w†)Tæ1êƒâÜ„„ZÁ°Ò×”zeS¼"¶ÖXûšàM”{°äX5“Å­€¥McˆÛAÔØš%[Z³„ŒÓŠ‚k%tlé®Ã5\z©°°ã'ýy(eÔ"¢a[¦¢Áj«T¡ù]N7車PêºidÔ‚KeŽ
+©Õ“YÜÁñ&¯^å’ú§¬6ÛjáÙLßf„ƒ×±6Û
\ No newline at end of file
diff --git a/sounds/vm-msginstruct.gsm b/sounds/vm-msginstruct.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..2d1628e7b332967e70c3ce31ca943dad1eac79f9
Binary files /dev/null and b/sounds/vm-msginstruct.gsm differ
diff --git a/sounds/vm-msgsaved.gsm b/sounds/vm-msgsaved.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..e065901023cfe017eb99c017a24623c47aa6e209
Binary files /dev/null and b/sounds/vm-msgsaved.gsm differ
diff --git a/sounds/vm-no.gsm b/sounds/vm-no.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..cb27cf80546606e69fb12513822a700d7a4fcc6a
--- /dev/null
+++ b/sounds/vm-no.gsm
@@ -0,0 +1 @@
+ÒdŠ”ÛÆÀëŸB6ëªàËq4TŽR –©
ˆ“ ¡ZÝwUMÒ¤ƒÙ¼ÁEü•k\`§ž†êçÂÁ9”’)ÔÌÁÄØi©%Ñ,Ö!#kCÛîIÇtÂ&YjÚÁ¨ÃØ…U*ä‚»;ÅÌ¡ÑiÍ¥ªÂ¨\©Íþž¢àät´ƒ%
sÀ®lâw‰é£&ÑéÃõ°}"ÔÊdšyb±ÿH^{C%$m¸þy§ºäŒz’Ó(„vøs*6ÜÞ„ËsÌ’Ûh»|s¬©7ÆÞql;l¢õÔ(Œ.¸áÌ•4Skr¬ÔÐa0oŒKÞV>ìoªh¦œ‡Ó«„v¹q®We˘oJtM‰¨Ý.]âñ«cmÌ[؆@ÊÓk¤®©ÛLDŒE¡îmÌI6vþöÛ.7í=Y#ÛŒú¥ Óªœn¹Ü°’P4_o
Ü~³wvqŒÛ­÷7áåt%…öÓé£îzsäÃI¼ÓåO·½V¶äw«nف$Ñë0FÔr8Ó+¬®iñƒ¼15}lËzyQ”ÔÔrH؁
¨k±†ÛÓ,”n±„«õLHHž…ß—½ÉUŒÍÈ,f[PÚɪin	Ò줪rB··ìâKÉ¥•¡‘	¯m¸×Tä©}K ‰Òp«n¢“&}ëª'5Ž§Ã­襖§T=€ªÙæÉ4ÄqËýÒn²®ª•dŒé˺”èDÔvûW°¦F™È•E–*Ï©,Ònâê#•#G-¿3•%´åú†²“âéa„Š•;;¢¸ÒpÓi¬ŒÄ÷Zm—5“¥éæn¶šH0ÒJ(ì‘$PrŠ8Òj³àìæ4ä¾]®£¨‹–€[Ž‡Æä’Q\sc!bDÒ/kR*ˆ£é»F©Œ¡SS§…&ì‚&å(‘ð"»$·ÒåÒeœ†áĤp,Œ¡ÀñI¬ä‚ÁYúêùsš!i“M6Ò%“X\ª¡”ÃFÒÍî¡M·4Þ|ÀïYñ'=à`’S°¦™Ò!¢™’ê6ÞE·ZjÁWl½Ç5\áÇmÀ›RÁY)a5Òf¢•‘z¡N¦Ö%]j¡)_Õ™Ô®ÁE‘=ˆá+q.KÑb›Y³Aº£‘·Ý ¡5²UÆܐ`à ¦ÜÔ€Õ¬zØMÑâ’™Zƒas-Ë8ÛŽx]®fÛ|Á´#L¥ªÁI±Û,Ñ"’™š¤)4uØ,ÌÁ$ÜQ‰š Æår=òЁi²È¹,Ѥ‚ØÒðá	£…ÆdcA5/ZSÈ Êô’=[¦ái*±ÆìÑeŠÛð!HڊǺàºY­JVŽ §iæݬÁH¯Î«ZÑer‘"pÁ<ØŒÅK¸Á'ÉÃ#RÁLæ‰i5àÀùŸ±¬áÒ©r“ÜáYaJá`¡3c*‹ˆÁÞÝS/vdÁ$´É
'Ô*«YRÖ¡¥znKÄpÁ†"@VâÓ°¶ÁpÁ±/Eó
\ No newline at end of file
diff --git a/sounds/vm-nomore.gsm b/sounds/vm-nomore.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..0e89761df57cf3ca6e4fcb22decce5bf4f4a3b05
Binary files /dev/null and b/sounds/vm-nomore.gsm differ
diff --git a/sounds/vm-password.gsm b/sounds/vm-password.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..fe6660bedb5952c35a021a851e4bebeb8c36208c
Binary files /dev/null and b/sounds/vm-password.gsm differ
diff --git a/sounds/vm-theperson.gsm b/sounds/vm-theperson.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..3938e0ce70bc79260466ce3b9938939d5b9745b8
Binary files /dev/null and b/sounds/vm-theperson.gsm differ
diff --git a/sounds/vm-undeleted.gsm b/sounds/vm-undeleted.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..e7fa4be02d726a9f3768e33a6458317f4f0f52fe
Binary files /dev/null and b/sounds/vm-undeleted.gsm differ
diff --git a/sounds/vm-youhave.gsm b/sounds/vm-youhave.gsm
new file mode 100755
index 0000000000000000000000000000000000000000..9c2e38208a22f0eeb6d199f9b4816bedd2469c51
Binary files /dev/null and b/sounds/vm-youhave.gsm differ