formatting cleanup on the header,
[asterisk/asterisk.git] / apps / app_minivm.c
index 7af82d7..20d1069 100644 (file)
  * Back: \ref App_minivm
  */
 
-#include <stdlib.h>
-#include <errno.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
 #include <ctype.h>
 #include <sys/time.h>
 #include <sys/stat.h>
-#include <sys/types.h>
 #include <sys/mman.h>
 #include <time.h>
 #include <dirent.h>
 #include <locale.h>
 
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
+#include "asterisk/paths.h"    /* use various paths */
 #include "asterisk/astobj.h"
 #include "asterisk/lock.h"
 #include "asterisk/file.h"
-#include "asterisk/logger.h"
 #include "asterisk/channel.h"
 #include "asterisk/pbx.h"
-#include "asterisk/options.h"
 #include "asterisk/config.h"
 #include "asterisk/say.h"
 #include "asterisk/module.h"
@@ -231,7 +224,7 @@ static char *app_minivm_accmess = "MinivmAccMess";  /* Record personal voicemail
 
 static char *synopsis_minivm_record = "Receive Mini-Voicemail and forward via e-mail";
 static char *descrip_minivm_record = 
-       "Syntax: MinivmRecord(username@domain[,options])\n"
+       "  MinivmRecord(username@domain[,options]):\n"
        "This application is part of the Mini-Voicemail system, configured in minivm.conf.\n"
        "MiniVM records audio file in configured format and forwards message to e-mail and pager.\n"
        "If there's no user account for that address, a temporary account will\n"
@@ -254,7 +247,7 @@ static char *descrip_minivm_record =
 
 static char *synopsis_minivm_greet = "Play Mini-Voicemail prompts";
 static char *descrip_minivm_greet = 
-       "Syntax: MinivmGreet(username@domain[,options])\n"
+       "  MinivmGreet(username@domain[,options]):\n"
        "This application is part of the Mini-Voicemail system, configured in minivm.conf.\n"
        "MinivmGreet() plays default prompts or user specific prompts for an account.\n"
        "Busy and unavailable messages can be choosen, but will be overridden if a temporary\n"
@@ -271,7 +264,7 @@ static char *descrip_minivm_greet =
 
 static char *synopsis_minivm_notify = "Notify voicemail owner about new messages.";
 static char *descrip_minivm_notify = 
-       "Syntax: MinivmNotify(username@domain[,template])\n"
+       "  MinivmNotify(username@domain[,template]):\n"
        "This application is part of the Mini-Voicemail system, configured in minivm.conf.\n"
        "MiniVMnotify forwards messages about new voicemail to e-mail and pager.\n"
        "If there's no user account for that address, a temporary account will\n"
@@ -290,7 +283,7 @@ static char *descrip_minivm_notify =
 
 static char *synopsis_minivm_delete = "Delete Mini-Voicemail voicemail messages";
 static char *descrip_minivm_delete = 
-       "Syntax: MinivmDelete(filename)\n"
+       "  MinivmDelete(filename):\n"
        "This application is part of the Mini-Voicemail system, configured in minivm.conf.\n"
        "It deletes voicemail file set in MVM_FILENAME or given filename.\n"
        "\n"
@@ -301,7 +294,7 @@ static char *descrip_minivm_delete =
 
 static char *synopsis_minivm_accmess = "Record account specific messages";
 static char *descrip_minivm_accmess = 
-       "Syntax: MinivmAccmess(username@domain,option)\n"
+       "  MinivmAccmess(username@domain,option):\n"
        "This application is part of the Mini-Voicemail system, configured in minivm.conf.\n"
        "Use this application to record account specific audio/video messages for\n"
        "busy, unavailable and temporary messages.\n"
@@ -425,9 +418,9 @@ struct minivm_stats {
        int timezones;                  /*!< Number of time zones */
        int templates;                  /*!< Number of templates */
 
-       time_t reset;                   /*!< Time for last reset */
+       struct timeval reset;                   /*!< Time for last reset */
        int receivedmessages;           /*!< Number of received messages since reset */
-       time_t lastreceived;            /*!< Time for last voicemail sent */
+       struct timeval lastreceived;            /*!< Time for last voicemail sent */
 };
 
 /*! \brief Statistics for voicemail */
@@ -459,18 +452,18 @@ static double global_volgain;     /*!< Volume gain for voicmemail via e-mail */
 #define DEFAULT_CHARSET                "ISO-8859-1"
 
 /* Forward declarations */
-static char *message_template_parse_filebody(char *filename);
+static char *message_template_parse_filebody(const char *filename);
 static char *message_template_parse_emailbody(const char *body);
 static int create_vmaccount(char *name, struct ast_variable *var, int realtime);
 static struct minivm_account *find_user_realtime(const char *domain, const char *username);
-static int handle_minivm_reload(int fd, int argc, char *argv[]);
+static char *handle_minivm_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
 
 /*! \brief Create message template */
 static struct minivm_template *message_template_create(const char *name)
 {
        struct minivm_template *template;
 
-       template = ast_calloc(1, sizeof(struct minivm_template));
+       template = ast_calloc(1, sizeof(*template));
        if (!template)
                return NULL;
 
@@ -488,9 +481,9 @@ static struct minivm_template *message_template_create(const char *name)
 static void message_template_free(struct minivm_template *template)
 {
        if (template->body)
-               free(template->body);
+               ast_free(template->body);
 
-       free (template);
+       ast_free (template);
 }
 
 /*! \brief Build message template from configuration */
@@ -506,8 +499,7 @@ static int message_template_build(const char *name, struct ast_variable *var)
        }
 
        while (var) {
-               if (option_debug > 2)
-                       ast_log(LOG_DEBUG, "-_-_- Configuring template option %s = \"%s\" for template %s\n", var->name, var->value, name);
+               ast_debug(3, "-_-_- Configuring template option %s = \"%s\" for template %s\n", var->name, var->value, name);
                if (!strcasecmp(var->name, "fromaddress")) {
                        ast_copy_string(template->fromaddress, var->value, sizeof(template->fromaddress));
                } else if (!strcasecmp(var->name, "fromemail")) {
@@ -524,7 +516,7 @@ static int message_template_build(const char *name, struct ast_variable *var)
                        ast_copy_string(template->charset, var->value, sizeof(template->charset));
                } else if (!strcasecmp(var->name, "templatefile")) {
                        if (template->body) 
-                               free(template->body);
+                               ast_free(template->body);
                        template->body = message_template_parse_filebody(var->value);
                        if (!template->body) {
                                ast_log(LOG_ERROR, "Error reading message body definition file %s\n", var->value);
@@ -532,7 +524,7 @@ static int message_template_build(const char *name, struct ast_variable *var)
                        }
                } else if (!strcasecmp(var->name, "messagebody")) {
                        if (template->body) 
-                               free(template->body);
+                               ast_free(template->body);
                        template->body = message_template_parse_emailbody(var->value);
                        if (!template->body) {
                                ast_log(LOG_ERROR, "Error parsing message body definition:\n          %s\n", var->value);
@@ -687,8 +679,8 @@ static int base_encode(char *filename, FILE *so)
 
                if (n> 0) {
                        ogroup[0]= dtable[igroup[0]>>2];
-                       ogroup[1]= dtable[((igroup[0]&3)<<4)|(igroup[1]>>4)];
-                       ogroup[2]= dtable[((igroup[1]&0xF)<<2)|(igroup[2]>>6)];
+                       ogroup[1]= dtable[((igroup[0]&3)<<4) | (igroup[1]>>4)];
+                       ogroup[2]= dtable[((igroup[1]&0xF)<<2) | (igroup[2]>>6)];
                        ogroup[3]= dtable[igroup[2]&0x3F];
 
                        if (n<3) {
@@ -714,11 +706,11 @@ static int base_encode(char *filename, FILE *so)
 
 static int get_date(char *s, int len)
 {
-       struct tm tm;
-       time_t t;
-       t = time(0);
-       localtime_r(&t,&tm);
-       return strftime(s, len, "%a %b %e %r %Z %Y", &tm);
+       struct ast_tm tm;
+       struct timeval tv = ast_tvnow();
+
+       ast_localtime(&tv, &tm, NULL);
+       return ast_strftime(s, len, "%a %b %e %r %Z %Y", &tm);
 }
 
 
@@ -727,7 +719,7 @@ static void free_user(struct minivm_account *vmu)
 {
        if (vmu->chanvars)
                ast_variables_destroy(vmu->chanvars);
-       free(vmu);
+       ast_free(vmu);
 }
 
 
@@ -793,7 +785,7 @@ static struct minivm_account *mvm_user_alloc(void)
 {
        struct minivm_account *new;
 
-       new = calloc(1, sizeof(struct minivm_account));
+       new = ast_calloc(1, sizeof(*new));
        if (!new)
                return NULL;
        populate_defaults(new);
@@ -808,7 +800,7 @@ static void vmaccounts_destroy_list(void)
        struct minivm_account *this;
        AST_LIST_LOCK(&minivm_accounts);
        while ((this = AST_LIST_REMOVE_HEAD(&minivm_accounts, list))) 
-               free(this);
+               ast_free(this);
        AST_LIST_UNLOCK(&minivm_accounts);
 }
 
@@ -823,8 +815,7 @@ static struct minivm_account *find_account(const char *domain, const char *usern
                ast_log(LOG_NOTICE, "No username or domain? \n");
                return NULL;
        }
-       if (option_debug > 2)
-               ast_log(LOG_DEBUG, "-_-_-_- Looking for voicemail user %s in domain %s\n", username, domain);
+       ast_debug(3, "-_-_-_- Looking for voicemail user %s in domain %s\n", username, domain);
 
        AST_LIST_LOCK(&minivm_accounts);
        AST_LIST_TRAVERSE(&minivm_accounts, cur, list) {
@@ -835,8 +826,7 @@ static struct minivm_account *find_account(const char *domain, const char *usern
        AST_LIST_UNLOCK(&minivm_accounts);
 
        if (cur) {
-               if (option_debug > 2)
-                       ast_log(LOG_DEBUG, "-_-_- Found account for %s@%s\n", username, domain);
+               ast_debug(3, "-_-_- Found account for %s@%s\n", username, domain);
                vmu = cur;
 
        } else
@@ -849,8 +839,7 @@ static struct minivm_account *find_account(const char *domain, const char *usern
                if (vmu) {
                        ast_copy_string(vmu->username, username, sizeof(vmu->username));
                        ast_copy_string(vmu->domain, domain, sizeof(vmu->domain));
-                       if (option_debug)
-                               ast_log(LOG_DEBUG, "--- Created temporary account\n");
+                       ast_debug(1, "--- Created temporary account\n");
                }
 
        }
@@ -877,7 +866,7 @@ static struct minivm_account *find_user_realtime(const char *domain, const char
        var = ast_load_realtime("minivm", "username", username, "domain", domain, NULL);
 
        if (!var) {
-               free(retval);
+               ast_free(retval);
                return NULL;
        }
 
@@ -901,8 +890,8 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
        char dur[PATH_MAX];
        char tmp[80] = "/tmp/astmail-XXXXXX";
        char tmp2[PATH_MAX];
-       time_t now;
-       struct tm tm;
+       struct timeval now;
+       struct ast_tm tm;
        struct minivm_zone *the_zone = NULL;
        int len_passdata;
        struct ast_channel *ast;
@@ -926,8 +915,7 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
                return -1;      
        }
 
-       if (option_debug > 2)
-               ast_log(LOG_DEBUG, "-_-_- Sending mail to %s@%s - Using template %s\n", vmu->username, vmu->domain, template->name);
+       ast_debug(3, "-_-_- Sending mail to %s@%s - Using template %s\n", vmu->username, vmu->domain, template->name);
 
        if (!strcmp(format, "wav49"))
                format = "WAV";
@@ -939,15 +927,13 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
                char tmpcmd[PATH_MAX];
                int tmpfd;
 
-               snprintf(newtmp, sizeof(newtmp), "/tmp/XXXXXX");
-               if (option_debug > 2)
-                       ast_log(LOG_DEBUG, "newtmp: %s\n", newtmp);
+               ast_copy_string(newtmp, "/tmp/XXXXXX", sizeof(newtmp));
+               ast_debug(3, "newtmp: %s\n", newtmp);
                tmpfd = mkstemp(newtmp);
                snprintf(tmpcmd, sizeof(tmpcmd), "sox -v %.4f %s.%s %s.%s", vmu->volgain, filename, format, newtmp, format);
                ast_safe_system(tmpcmd);
                finalfilename = newtmp;
-               if (option_debug > 2)
-                       ast_log (LOG_DEBUG, "-- VOLGAIN: Stored at: %s.%s - Level: %.4f - Mailbox: %s\n", filename, format, vmu->volgain, vmu->username);
+               ast_debug(3, "-- VOLGAIN: Stored at: %s.%s - Level: %.4f - Mailbox: %s\n", filename, format, vmu->volgain, vmu->username);
        } else {
                finalfilename = ast_strdupa(filename);
        }
@@ -955,8 +941,8 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
        /* Create file name */
        snprintf(fname, sizeof(fname), "%s.%s", finalfilename, format);
 
-       if (option_debug && template->attachment)
-               ast_log(LOG_DEBUG, "-- Attaching file '%s', format '%s', uservm is '%d'\n", finalfilename, format, attach_user_voicemail);
+       if (template->attachment)
+               ast_debug(1, "-- Attaching file '%s', format '%s', uservm is '%d'\n", finalfilename, format, attach_user_voicemail);
 
        /* Make a temporary file instead of piping directly to sendmail, in case the mail
           command hangs */
@@ -967,8 +953,7 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
                        close(pfd);
                        pfd = -1;
                }
-               if (option_debug)
-                       ast_log(LOG_DEBUG, "-_-_- Opening temp file for e-mail: %s\n", tmp);
+               ast_debug(1, "-_-_- Opening temp file for e-mail: %s\n", tmp);
        }
        if (!p) {
                ast_log(LOG_WARNING, "Unable to open temporary file '%s'\n", tmp);
@@ -993,15 +978,15 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
                AST_LIST_UNLOCK(&minivm_zones);
        }
 
-       time(&now);
+       now = ast_tvnow();
        ast_localtime(&now, &tm, the_zone ? the_zone->timezone : NULL);
-       strftime(date, sizeof(date), "%a, %d %b %Y %H:%M:%S %z", &tm);
+       ast_strftime(date, sizeof(date), "%a, %d %b %Y %H:%M:%S %z", &tm);
 
        /* Start printing the email to the temporary file */
        fprintf(p, "Date: %s\n", date);
 
        /* Set date format for voicemail mail */
-       strftime(date, sizeof(date), template->dateformat, &tm);
+       ast_strftime(date, sizeof(date), template->dateformat, &tm);
 
 
        /* Populate channel with channel variables for substitution */
@@ -1029,13 +1014,11 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
        if (ast_strlen_zero(fromaddress)) {
                fprintf(p, "From: Asterisk PBX <%s>\n", who);
        } else {
-               if (option_debug > 3)
-                       ast_log(LOG_DEBUG, "-_-_- Fromaddress template: %s\n", fromaddress);
                /* Allocate a buffer big enough for variable substitution */
                int vmlen = strlen(fromaddress) * 3 + 200;
 
+               ast_debug(4, "-_-_- Fromaddress template: %s\n", fromaddress);
                if ((passdata = alloca(vmlen))) {
-                       memset(passdata, 0, vmlen);
                        pbx_substitute_variables_helper(ast, fromaddress, passdata, vmlen);
                        len_passdata = strlen(passdata) * 2 + 3;
                        passdata2 = alloca(len_passdata);
@@ -1046,10 +1029,9 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
                        return -1;      
                }
        } 
-       if (option_debug > 3)
-               ast_log(LOG_DEBUG, "-_-_- Fromstring now: %s\n", ast_strlen_zero(passdata) ? "-default-" : passdata);
+       ast_debug(4, "-_-_- Fromstring now: %s\n", ast_strlen_zero(passdata) ? "-default-" : passdata);
 
-       fprintf(p, "Message-ID: <Asterisk-%d-%s-%d-%s>\n", (unsigned int)rand(), vmu->username, getpid(), who);
+       fprintf(p, "Message-ID: <Asterisk-%d-%s-%d-%s>\n", (unsigned int)rand(), vmu->username, (int)getpid(), who);
        len_passdata = strlen(vmu->fullname) * 2 + 3;
        passdata2 = alloca(len_passdata);
        if (!ast_strlen_zero(vmu->email))
@@ -1061,7 +1043,6 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
                char *passdata;
                int vmlen = strlen(template->subject) * 3 + 200;
                if ((passdata = alloca(vmlen))) {
-                       memset(passdata, 0, vmlen);
                        pbx_substitute_variables_helper(ast, template->subject, passdata, vmlen);
                        fprintf(p, "Subject: %s\n", passdata);
                } else {
@@ -1069,11 +1050,12 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
                        fclose(p);
                        return -1;      
                }
-               if (option_debug > 3)
-                       ast_log(LOG_DEBUG, "-_-_- Subject now: %s\n", passdata);
+
+               ast_debug(4, "-_-_- Subject now: %s\n", passdata);
+
        } else  {
                fprintf(p, "Subject: New message in mailbox %s@%s\n", vmu->username, vmu->domain);
-               ast_log(LOG_DEBUG, "-_-_- Using default subject for this email \n");
+               ast_debug(1, "-_-_- Using default subject for this email \n");
        }
 
 
@@ -1082,7 +1064,7 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
        fprintf(p, "MIME-Version: 1.0\n");
 
        /* Something unique. */
-       snprintf(bound, sizeof(bound), "voicemail_%s%d%d", vmu->username, getpid(), (unsigned int)rand());
+       snprintf(bound, sizeof(bound), "voicemail_%s%d%d", vmu->username, (int)getpid(), (unsigned int)rand());
 
        fprintf(p, "Content-Type: multipart/mixed; boundary=\"%s\"\n\n\n", bound);
 
@@ -1092,10 +1074,8 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
                char *passdata;
                int vmlen = strlen(template->body)*3 + 200;
                if ((passdata = alloca(vmlen))) {
-                       memset(passdata, 0, vmlen);
                        pbx_substitute_variables_helper(ast, template->body, passdata, vmlen);
-                       if (option_debug > 2)
-                               ast_log(LOG_DEBUG, "Message now: %s\n-----\n", passdata);
+                       ast_debug(3, "Message now: %s\n-----\n", passdata);
                        fprintf(p, "%s\n", passdata);
                } else
                        ast_log(LOG_WARNING, "Cannot allocate workspace for variable substitution\n");
@@ -1105,14 +1085,12 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
                        "in mailbox %s from %s, on %s so you might\n"
                        "want to check it when you get a chance.  Thanks!\n\n\t\t\t\t--Asterisk\n\n", vmu->fullname, 
                        dur,  vmu->username, (cidname ? cidname : (cidnum ? cidnum : "an unknown caller")), date);
-               if (option_debug > 2)
-                       ast_log(LOG_DEBUG, "Using default message body (no template)\n-----\n");
+               ast_debug(3, "Using default message body (no template)\n-----\n");
        }
        /* Eww. We want formats to tell us their own MIME type */
        if (template->attachment) {
-               if (option_debug > 2)
-                       ast_log(LOG_DEBUG, "-_-_- Attaching file to message: %s\n", fname);
                char *ctype = "audio/x-";
+               ast_debug(3, "-_-_- Attaching file to message: %s\n", fname);
                if (!strcasecmp(format, "ogg"))
                        ctype = "application/";
        
@@ -1128,11 +1106,8 @@ static int sendmail(struct minivm_template *template, struct minivm_account *vmu
        fclose(p);
        snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", global_mailcmd, tmp, tmp);
        ast_safe_system(tmp2);
-       if (option_debug) {
-               ast_log(LOG_DEBUG, "Sent message to %s with command '%s' - %s\n", vmu->email, global_mailcmd, template->attachment ? "(media attachment)" : "");
-               if (option_debug > 2)
-                       ast_log(LOG_DEBUG, "-_-_- Actual command used: %s\n", tmp2);
-       }
+       ast_debug(1, "Sent message to %s with command '%s' - %s\n", vmu->email, global_mailcmd, template->attachment ? "(media attachment)" : "");
+       ast_debug(3, "-_-_- Actual command used: %s\n", tmp2);
        if (ast)
                ast_channel_free(ast);
        return 0;
@@ -1172,31 +1147,13 @@ static int check_dirpath(char *dest, int len, char *domain, char *username, char
  */
 static int create_dirpath(char *dest, int len, char *domain, char *username, char *folder)
 {
-       mode_t  mode = VOICEMAIL_DIR_MODE;
-
-       if(!ast_strlen_zero(domain)) {
-               make_dir(dest, len, domain, "", "");
-               if(mkdir(dest, mode) && errno != EEXIST) {
-                       ast_log(LOG_WARNING, "mkdir '%s' failed: %s\n", dest, strerror(errno));
-                       return -1;
-               }
-       }
-       if(!ast_strlen_zero(username)) {
-               make_dir(dest, len, domain, username, "");
-               if(mkdir(dest, mode) && errno != EEXIST) {
-                       ast_log(LOG_WARNING, "mkdir '%s' failed: %s\n", dest, strerror(errno));
-                       return -1;
-               }
-       }
-       if(!ast_strlen_zero(folder)) {
-               make_dir(dest, len, domain, username, folder);
-               if(mkdir(dest, mode) && errno != EEXIST) {
-                       ast_log(LOG_WARNING, "mkdir '%s' failed: %s\n", dest, strerror(errno));
-                       return -1;
-               }
+       int res;
+       make_dir(dest, len, domain, username, folder);
+       if ((res = ast_mkdir(dest, 0777))) {
+               ast_log(LOG_WARNING, "ast_mkdir '%s' failed: %s\n", dest, strerror(res));
+               return -1;
        }
-       if (option_debug > 1)
-               ast_log(LOG_DEBUG, "Creating directory for %s@%s folder %s : %s\n", username, domain, folder, dest);
+       ast_debug(2, "Creating directory for %s@%s folder %s : %s\n", username, domain, folder, dest);
        return 0;
 }
 
@@ -1208,8 +1165,7 @@ static int invent_message(struct ast_channel *chan, char *domain, char *username
        int res;
        char fn[PATH_MAX];
 
-       if (option_debug > 1)
-               ast_log(LOG_DEBUG, "-_-_- Still preparing to play message ...\n");
+       ast_debug(2, "-_-_- Still preparing to play message ...\n");
 
        snprintf(fn, sizeof(fn), "%s%s/%s/greet", MVM_SPOOL_DIR, domain, username);
 
@@ -1224,12 +1180,10 @@ static int invent_message(struct ast_channel *chan, char *domain, char *username
                int numericusername = 1;
                char *i = username;
 
-               if (option_debug > 1)
-                       ast_log(LOG_DEBUG, "-_-_- No personal prompts. Using default prompt set for language\n");
+               ast_debug(2, "-_-_- No personal prompts. Using default prompt set for language\n");
                
                while (*i)  {
-                       if (option_debug > 1)
-                               ast_log(LOG_DEBUG, "-_-_- Numeric? Checking %c\n", *i);
+                       ast_debug(2, "-_-_- Numeric? Checking %c\n", *i);
                        if (!isdigit(*i)) {
                                numericusername = FALSE;
                                break;
@@ -1266,8 +1220,7 @@ static int vm_delete(char *file)
 {
        int res;
 
-       if (option_debug)
-               ast_log(LOG_DEBUG, "-_-_- Deleting voicemail file %s\n", file);
+       ast_debug(1, "-_-_- Deleting voicemail file %s\n", file);
 
        res = unlink(file);     /* Remove the meta data file */
        res |=  ast_filedelete(file, NULL);     /* remove the media file */
@@ -1418,9 +1371,7 @@ static void run_externnotify(struct ast_channel *chan, struct minivm_account *vm
                vmu->username, vmu->domain,
                chan->cid.cid_name, chan->cid.cid_num);
 
-       if (option_debug)
-               ast_log(LOG_DEBUG, "Executing: %s\n", arguments);
-
+       ast_debug(1, "Executing: %s\n", arguments);
        ast_safe_system(arguments);
 }
 
@@ -1454,8 +1405,7 @@ static int notify_new_message(struct ast_channel *chan, const char *templatename
        if (!ast_strlen_zero(etemplate->locale)) {
                char *newlocale;
                ast_copy_string(oldlocale, setlocale(LC_TIME, NULL), sizeof(oldlocale));
-               if (option_debug > 1)
-                       ast_log(LOG_DEBUG, "-_-_- Changing locale from %s to %s\n", oldlocale, etemplate->locale);
+               ast_debug(2, "-_-_- Changing locale from %s to %s\n", oldlocale, etemplate->locale);
                newlocale = setlocale(LC_TIME, etemplate->locale);
                if (newlocale == NULL) {
                        ast_log(LOG_WARNING, "-_-_- Changing to new locale did not work. Locale: %s\n", etemplate->locale);
@@ -1466,11 +1416,10 @@ static int notify_new_message(struct ast_channel *chan, const char *templatename
 
        /* Read counter if available */
        counter = pbx_builtin_getvar_helper(chan, "MVM_COUNTER");
-       if (option_debug > 1) {
-               if (ast_strlen_zero(counter))
-                       ast_log(LOG_DEBUG, "-_-_- MVM_COUNTER not found\n");
-               else
-                       ast_log(LOG_DEBUG, "-_-_- MVM_COUNTER found - will use it with value %s\n", counter);
+       if (ast_strlen_zero(counter)) {
+               ast_debug(2, "-_-_- MVM_COUNTER not found\n");
+       } else {
+               ast_debug(2, "-_-_- MVM_COUNTER found - will use it with value %s\n", counter);
        }
 
        res = sendmail(etemplate, vmu, cidnum, cidname, filename, messageformat, duration, etemplate->attachment, MVM_MESSAGE_EMAIL, counter);
@@ -1555,8 +1504,7 @@ static int leave_voicemail(struct ast_channel *chan, char *username, struct leav
        /* If we have no user directory, use generic temporary directory */
        if (!userdir) {
                create_dirpath(tmpdir, sizeof(tmpdir), "0000_minivm_temp", "mediafiles", "");
-               if (option_debug > 2)
-                       ast_log(LOG_DEBUG, "Creating temporary directory %s\n", tmpdir);
+               ast_debug(3, "Creating temporary directory %s\n", tmpdir);
        }
 
 
@@ -1583,8 +1531,7 @@ static int leave_voicemail(struct ast_channel *chan, char *username, struct leav
 
        /* OEJ XXX Maybe this can be turned into a log file? Hmm. */
        /* Store information */
-       if (option_debug > 1)
-               ast_log(LOG_DEBUG, "Open file for metadata: %s\n", tmptxtfile);
+       ast_debug(2, "Open file for metadata: %s\n", tmptxtfile);
 
        res = play_record_review(chan, NULL, tmptxtfile, global_vmmaxmessage, fmt, 1, vmu, &duration, NULL, options->record_gain);
 
@@ -1592,14 +1539,13 @@ static int leave_voicemail(struct ast_channel *chan, char *username, struct leav
        if (!txt) {
                ast_log(LOG_WARNING, "Error opening text file for output\n");
        } else {
-               struct tm tm;
-               time_t now;
+               struct ast_tm tm;
+               struct timeval now = ast_tvnow();
                char timebuf[30];
                char logbuf[BUFSIZ];
                get_date(date, sizeof(date));
-               now = time(NULL);
                ast_localtime(&now, &tm, NULL);
-               strftime(timebuf, sizeof(timebuf), "%H:%M:%S", &tm);
+               ast_strftime(timebuf, sizeof(timebuf), "%H:%M:%S", &tm);
                
                snprintf(logbuf, sizeof(logbuf),
                        /* "Mailbox:domain:macrocontext:exten:priority:callerchan:callerid:origdate:origtime:duration:durationstatus:accountcode" */
@@ -1635,8 +1581,7 @@ static int leave_voicemail(struct ast_channel *chan, char *username, struct leav
                } 
                fclose(txt); /* Close log file */
                if (ast_fileexists(tmptxtfile, NULL, NULL) <= 0) {
-                       if (option_debug) 
-                               ast_log(LOG_DEBUG, "The recorded media file is gone, so we should remove the .txt file too!\n");
+                       ast_debug(1, "The recorded media file is gone, so we should remove the .txt file too!\n");
                        unlink(tmptxtfile);
                        pbx_builtin_setvar_helper(chan, "MINIVM_RECORD_STATUS", "FAILED");
                        if(ast_test_flag(vmu, MVM_ALLOCED))
@@ -1651,13 +1596,13 @@ static int leave_voicemail(struct ast_channel *chan, char *username, struct leav
                pbx_builtin_setvar_helper(chan, "MVM_FORMAT", fmt);
 
        }
-       global_stats.lastreceived = time(NULL);
+       global_stats.lastreceived = ast_tvnow();
        global_stats.receivedmessages++;
 //     /* Go ahead and delete audio files from system, they're not needed any more */
 //     if (ast_fileexists(tmptxtfile, NULL, NULL) <= 0) {
 //             ast_filedelete(tmptxtfile, NULL);
-//             if (option_debug > 1)
-//                     ast_log(LOG_DEBUG, "-_-_- Deleted audio file after notification :: %s \n", tmptxtfile);
+//              /* Even not being used at the moment, it's better to convert ast_log to ast_debug anyway */
+//             ast_debug(2, "-_-_- Deleted audio file after notification :: %s \n", tmptxtfile);
 //     }
 
        if (res > 0)
@@ -1673,7 +1618,6 @@ static int leave_voicemail(struct ast_channel *chan, char *username, struct leav
 /*! \brief Notify voicemail account owners - either generic template or user specific */
 static int minivm_notify_exec(struct ast_channel *chan, void *data)
 {
-       struct ast_module_user *u;
        int argc;
        char *argv[2];
        int res = 0;
@@ -1687,21 +1631,16 @@ static int minivm_notify_exec(struct ast_channel *chan, void *data)
        const char *format;
        const char *duration_string;
        
-       u = ast_module_user_add(chan);
-
-
        if (ast_strlen_zero(data))  {
                ast_log(LOG_ERROR, "Minivm needs at least an account argument \n");
-               ast_module_user_remove(u);
                return -1;
        }
        tmpptr = ast_strdupa((char *)data);
        if (!tmpptr) {
                ast_log(LOG_ERROR, "Out of memory\n");
-               ast_module_user_remove(u);
                return -1;
        }
-       argc = ast_app_separate_args(tmpptr, '|', argv, sizeof(argv) / sizeof(argv[0]));
+       argc = ast_app_separate_args(tmpptr, ',', argv, sizeof(argv) / sizeof(argv[0]));
 
        if (argc == 2 && !ast_strlen_zero(argv[1]))
                template = argv[1];
@@ -1715,7 +1654,6 @@ static int minivm_notify_exec(struct ast_channel *chan, void *data)
        } 
        if (ast_strlen_zero(domain) || ast_strlen_zero(username)) {
                ast_log(LOG_ERROR, "Need username@domain as argument. Sorry. Argument 0 %s\n", argv[0]);
-               ast_module_user_remove(u);
                return -1;
        }
 
@@ -1723,7 +1661,6 @@ static int minivm_notify_exec(struct ast_channel *chan, void *data)
                /* We could not find user, let's exit */
                ast_log(LOG_WARNING, "Could not allocate temporary memory for '%s@%s'\n", username, domain);
                pbx_builtin_setvar_helper(chan, "MINIVM_NOTIFY_STATUS", "FAILED");
-               ast_module_user_remove(u);
                return -1;
        }
        
@@ -1742,7 +1679,6 @@ static int minivm_notify_exec(struct ast_channel *chan, void *data)
                free_user(vmu);
 
        /* Ok, we're ready to rock and roll. Return to dialplan */
-       ast_module_user_remove(u);
 
        return res;
 
@@ -1752,16 +1688,13 @@ static int minivm_notify_exec(struct ast_channel *chan, void *data)
 static int minivm_record_exec(struct ast_channel *chan, void *data)
 {
        int res = 0;
-       struct ast_module_user *u;
        char *tmp;
        struct leave_vm_options leave_options;
        int argc;
        char *argv[2];
        struct ast_flags flags = { 0 };
        char *opts[OPT_ARG_ARRAY_SIZE];
-       
-       u = ast_module_user_add(chan);
-       
+               
        memset(&leave_options, 0, sizeof(leave_options));
 
        /* Answer channel if it's not already answered */
@@ -1770,19 +1703,16 @@ static int minivm_record_exec(struct ast_channel *chan, void *data)
 
        if (ast_strlen_zero(data))  {
                ast_log(LOG_ERROR, "Minivm needs at least an account argument \n");
-               ast_module_user_remove(u);
                return -1;
        }
        tmp = ast_strdupa((char *)data);
        if (!tmp) {
                ast_log(LOG_ERROR, "Out of memory\n");
-               ast_module_user_remove(u);
                return -1;
        }
-       argc = ast_app_separate_args(tmp, '|', argv, sizeof(argv) / sizeof(argv[0]));
+       argc = ast_app_separate_args(tmp, ',', argv, sizeof(argv) / sizeof(argv[0]));
        if (argc == 2) {
                if (ast_app_parse_options(minivm_app_options, &flags, opts, argv[1])) {
-                       ast_module_user_remove(u);
                        return -1;
                }
                ast_copy_flags(&leave_options, &flags, OPT_SILENT | OPT_BUSY_GREETING | OPT_UNAVAIL_GREETING );
@@ -1791,7 +1721,6 @@ static int minivm_record_exec(struct ast_channel *chan, void *data)
 
                        if (sscanf(opts[OPT_ARG_RECORDGAIN], "%d", &gain) != 1) {
                                ast_log(LOG_WARNING, "Invalid value '%s' provided for record gain option\n", opts[OPT_ARG_RECORDGAIN]);
-                               ast_module_user_remove(u);
                                return -1;
                        } else 
                                leave_options.record_gain = (signed char) gain;
@@ -1803,22 +1732,17 @@ static int minivm_record_exec(struct ast_channel *chan, void *data)
 
        if (res == ERROR_LOCK_PATH) {
                ast_log(LOG_ERROR, "Could not leave voicemail. The path is already locked.\n");
-               /* Send the call to n+101 priority, where n is the current priority*/
                pbx_builtin_setvar_helper(chan, "MINIVM_RECORD_STATUS", "FAILED");
                res = 0;
        }
        pbx_builtin_setvar_helper(chan, "MINIVM_RECORD_STATUS", "SUCCESS");
 
-       
-       ast_module_user_remove(u);
-
        return res;
 }
 
 /*! \brief Play voicemail prompts - either generic or user specific */
 static int minivm_greet_exec(struct ast_channel *chan, void *data)
 {
-       struct ast_module_user *u;
        struct leave_vm_options leave_options = { 0, '\0'};
        int argc;
        char *argv[2];
@@ -1838,27 +1762,21 @@ static int minivm_greet_exec(struct ast_channel *chan, void *data)
        char *tmpptr;
        struct minivm_account *vmu;
        char *username = argv[0];
-       
-       u = ast_module_user_add(chan);
 
        if (ast_strlen_zero(data))  {
                ast_log(LOG_ERROR, "Minivm needs at least an account argument \n");
-               ast_module_user_remove(u);
                return -1;
        }
        tmpptr = ast_strdupa((char *)data);
        if (!tmpptr) {
                ast_log(LOG_ERROR, "Out of memory\n");
-               ast_module_user_remove(u);
                return -1;
        }
-       argc = ast_app_separate_args(tmpptr, '|', argv, sizeof(argv) / sizeof(argv[0]));
+       argc = ast_app_separate_args(tmpptr, ',', argv, sizeof(argv) / sizeof(argv[0]));
 
        if (argc == 2) {
-               if (ast_app_parse_options(minivm_app_options, &flags, opts, argv[1])) {
-                       ast_module_user_remove(u);
+               if (ast_app_parse_options(minivm_app_options, &flags, opts, argv[1]))
                        return -1;
-               }
                ast_copy_flags(&leave_options, &flags, OPT_SILENT | OPT_BUSY_GREETING | OPT_UNAVAIL_GREETING );
        }
 
@@ -1871,15 +1789,12 @@ static int minivm_greet_exec(struct ast_channel *chan, void *data)
        } 
        if (ast_strlen_zero(domain) || ast_strlen_zero(username)) {
                ast_log(LOG_ERROR, "Need username@domain as argument. Sorry. Argument:  %s\n", argv[0]);
-               ast_module_user_remove(u);
                return -1;
        }
-       if (option_debug)
-               ast_log(LOG_DEBUG, "-_-_- Trying to find configuration for user %s in domain %s\n", username, domain);
+       ast_debug(1, "-_-_- Trying to find configuration for user %s in domain %s\n", username, domain);
 
        if (!(vmu = find_account(domain, username, TRUE))) {
                ast_log(LOG_ERROR, "Could not allocate memory. \n");
-               ast_module_user_remove(u);
                return -1;
        }
 
@@ -1905,12 +1820,10 @@ static int minivm_greet_exec(struct ast_channel *chan, void *data)
        /* Check for temporary greeting - it overrides busy and unavail */
        snprintf(tempfile, sizeof(tempfile), "%s%s/%s/temp", MVM_SPOOL_DIR, vmu->domain, username);
        if (!(res = check_dirpath(dest, sizeof(dest), vmu->domain, username, "temp"))) {
-               if (option_debug > 1)
-                       ast_log(LOG_DEBUG, "Temporary message directory does not exist, using default (%s)\n", tempfile);
+               ast_debug(2, "Temporary message directory does not exist, using default (%s)\n", tempfile);
                ast_copy_string(prefile, tempfile, sizeof(prefile));
        }
-       if (option_debug > 1)
-               ast_log(LOG_DEBUG, "-_-_- Preparing to play message ...\n");
+       ast_debug(2, "-_-_- Preparing to play message ...\n");
 
        /* Check current or macro-calling context for special extensions */
        if (ast_test_flag(vmu, MVM_OPERATOR)) {
@@ -1945,17 +1858,14 @@ static int minivm_greet_exec(struct ast_channel *chan, void *data)
                if (ast_streamfile(chan, prefile, chan->language) > -1) 
                        res = ast_waitstream(chan, ecodes);
        } else {
-               if (option_debug > 1)
-                       ast_log(LOG_DEBUG, "%s doesn't exist, doing what we can\n", prefile);
+               ast_debug(2, "%s doesn't exist, doing what we can\n", prefile);
                res = invent_message(chan, vmu->domain, username, ast_test_flag(&leave_options, OPT_BUSY_GREETING), ecodes);
        }
        if (res < 0) {
-               if (option_debug > 1)
-                       ast_log(LOG_DEBUG, "Hang up during prefile playback\n");
+               ast_debug(2, "Hang up during prefile playback\n");
                pbx_builtin_setvar_helper(chan, "MINIVM_GREET_STATUS", "FAILED");
                if(ast_test_flag(vmu, MVM_ALLOCED))
                        free_user(vmu);
-               ast_module_user_remove(u);
                return -1;
        }
        if (res == '#') {
@@ -2012,8 +1922,6 @@ static int minivm_greet_exec(struct ast_channel *chan, void *data)
 
 
        /* Ok, we're ready to rock and roll. Return to dialplan */
-       ast_module_user_remove(u);
-
        return res;
 
 }
@@ -2022,18 +1930,14 @@ static int minivm_greet_exec(struct ast_channel *chan, void *data)
 static int minivm_delete_exec(struct ast_channel *chan, void *data)
 {
        int res = 0;
-       struct ast_module_user *u;
        char filename[BUFSIZ];
-       
-       u = ast_module_user_add(chan);
-       
+               
        if (!ast_strlen_zero(data))
                ast_copy_string(filename, (char *) data, sizeof(filename));
        else
                ast_copy_string(filename, pbx_builtin_getvar_helper(chan, "MVM_FILENAME"), sizeof(filename));
 
        if (ast_strlen_zero(filename)) {
-               ast_module_user_remove(u);
                ast_log(LOG_ERROR, "No filename given in application arguments or channel variable MVM_FILENAME\n");
                return res;
        } 
@@ -2043,21 +1947,16 @@ static int minivm_delete_exec(struct ast_channel *chan, void *data)
        if (ast_fileexists(filename, NULL, NULL) > 0) {
                res = vm_delete(filename);
                if (res) {
-                       if (option_debug > 1)
-                               ast_log(LOG_DEBUG, "-_-_- Can't delete file: %s\n", filename);
+                       ast_debug(2, "-_-_- Can't delete file: %s\n", filename);
                        pbx_builtin_setvar_helper(chan, "MINIVM_DELETE_STATUS", "FAILED");
                } else {
-                       if (option_debug > 1)
-                               ast_log(LOG_DEBUG, "-_-_- Deleted voicemail file :: %s \n", filename);
+                       ast_debug(2, "-_-_- Deleted voicemail file :: %s \n", filename);
                        pbx_builtin_setvar_helper(chan, "MINIVM_DELETE_STATUS", "SUCCESS");
                }
        } else {
-               if (option_debug > 1)
-                       ast_log(LOG_DEBUG, "-_-_- Filename does not exist: %s\n", filename);
+               ast_debug(2, "-_-_- Filename does not exist: %s\n", filename);
                pbx_builtin_setvar_helper(chan, "MINIVM_DELETE_STATUS", "FAILED");
        }
-       
-       ast_module_user_remove(u);
 
        return res;
 }
@@ -2065,14 +1964,13 @@ static int minivm_delete_exec(struct ast_channel *chan, void *data)
 /*! \brief Record specific messages for voicemail account */
 static int minivm_accmess_exec(struct ast_channel *chan, void *data)
 {
-       struct ast_module_user *u;
        int argc = 0;
        char *argv[2];
        int res = 0;
        char filename[PATH_MAX];
        char tmp[PATH_MAX];
        char *domain;
-       char *tmpptr;
+       char *tmpptr = NULL;
        struct minivm_account *vmu;
        char *username = argv[0];
        struct ast_flags flags = { 0 };
@@ -2082,8 +1980,6 @@ static int minivm_accmess_exec(struct ast_channel *chan, void *data)
        char *prompt = NULL;
        int duration;
        int cmd;
-       
-       u = ast_module_user_add(chan);
 
        if (ast_strlen_zero(data))  {
                ast_log(LOG_ERROR, "MinivmAccmess needs at least two arguments: account and option\n");
@@ -2095,7 +1991,7 @@ static int minivm_accmess_exec(struct ast_channel *chan, void *data)
                        ast_log(LOG_ERROR, "Out of memory\n");
                        error = TRUE;
                } else
-                       argc = ast_app_separate_args(tmpptr, '|', argv, sizeof(argv) / sizeof(argv[0]));
+                       argc = ast_app_separate_args(tmpptr, ',', argv, sizeof(argv) / sizeof(argv[0]));
        }
 
        if (argc <=1) {
@@ -2112,10 +2008,8 @@ static int minivm_accmess_exec(struct ast_channel *chan, void *data)
                error = TRUE;
        }
 
-       if (error) {
-               ast_module_user_remove(u);
+       if (error)
                return -1;
-       }
 
        ast_copy_string(tmp, argv[0], sizeof(tmp));
        username = tmp;
@@ -2126,7 +2020,6 @@ static int minivm_accmess_exec(struct ast_channel *chan, void *data)
        } 
        if (ast_strlen_zero(domain) || ast_strlen_zero(username)) {
                ast_log(LOG_ERROR, "Need username@domain as argument. Sorry. Argument 0 %s\n", argv[0]);
-               ast_module_user_remove(u);
                return -1;
        }
 
@@ -2134,7 +2027,6 @@ static int minivm_accmess_exec(struct ast_channel *chan, void *data)
                /* We could not find user, let's exit */
                ast_log(LOG_WARNING, "Could not allocate temporary memory for '%s@%s'\n", username, domain);
                pbx_builtin_setvar_helper(chan, "MINIVM_NOTIFY_STATUS", "FAILED");
-               ast_module_user_remove(u);
                return -1;
        }
 
@@ -2160,16 +2052,13 @@ static int minivm_accmess_exec(struct ast_channel *chan, void *data)
        /* Maybe we should check the result of play_record_review ? */
        cmd = play_record_review(chan, prompt, filename, global_maxgreet, default_vmformat, 0, vmu, &duration, NULL, FALSE);
 
-       if (option_debug)
-               ast_log(LOG_DEBUG, "Recorded new %s message in %s (duration %d)\n", message, filename, duration);
+       ast_debug(1, "Recorded new %s message in %s (duration %d)\n", message, filename, duration);
 
        if(ast_test_flag(vmu, MVM_ALLOCED))
                free_user(vmu);
 
 
        /* Ok, we're ready to rock and roll. Return to dialplan */
-       ast_module_user_remove(u);
-
        return res;
 
 }
@@ -2182,8 +2071,7 @@ static int create_vmaccount(char *name, struct ast_variable *var, int realtime)
        char *username;
        char accbuf[BUFSIZ];
 
-       if (option_debug > 2)
-               ast_log(LOG_DEBUG, "Creating %s account for [%s]\n", realtime ? "realtime" : "static", name);
+       ast_debug(3, "Creating %s account for [%s]\n", realtime ? "realtime" : "static", name);
 
        ast_copy_string(accbuf, name, sizeof(accbuf));
        username = accbuf;
@@ -2197,11 +2085,10 @@ static int create_vmaccount(char *name, struct ast_variable *var, int realtime)
                return 0;
        }
 
-       if (option_debug > 2)
-               ast_log(LOG_DEBUG, "Creating static account for user %s domain %s\n", username, domain);
+       ast_debug(3, "Creating static account for user %s domain %s\n", username, domain);
 
        /* Allocate user account */
-       vmu = ast_calloc(1, sizeof(struct minivm_account));
+       vmu = ast_calloc(1, sizeof(*vmu));
        if (!vmu)
                return 0;
        
@@ -2210,12 +2097,10 @@ static int create_vmaccount(char *name, struct ast_variable *var, int realtime)
 
        populate_defaults(vmu);
 
-       if (option_debug > 2)
-               ast_log(LOG_DEBUG, "...Configuring account %s\n", name);
+       ast_debug(3, "...Configuring account %s\n", name);
 
        while (var) {
-               if (option_debug > 2)
-                       ast_log(LOG_DEBUG, "---- Configuring %s = \"%s\" for account %s\n", var->name, var->value, name);
+               ast_debug(3, "---- Configuring %s = \"%s\" for account %s\n", var->name, var->value, name);
                if (!strcasecmp(var->name, "serveremail")) {
                        ast_copy_string(vmu->serveremail, var->value, sizeof(vmu->serveremail));
                } else if (!strcasecmp(var->name, "email")) {
@@ -2246,7 +2131,7 @@ static int create_vmaccount(char *name, struct ast_variable *var, int realtime)
                        if (varname && (varval = strchr(varname, '='))) {
                                *varval = '\0';
                                varval++;
-                               if ((tmpvar = ast_variable_new(varname, varval))) {
+                               if ((tmpvar = ast_variable_new(varname, varval, ""))) {
                                        tmpvar->next = vmu->chanvars;
                                        vmu->chanvars = tmpvar;
                                }
@@ -2260,8 +2145,7 @@ static int create_vmaccount(char *name, struct ast_variable *var, int realtime)
                }
                var = var->next;
        }
-       if (option_debug > 2)
-               ast_log(LOG_DEBUG, "...Linking account %s\n", name);
+       ast_debug(3, "...Linking account %s\n", name);
        
        AST_LIST_LOCK(&minivm_accounts);
        AST_LIST_INSERT_TAIL(&minivm_accounts, vmu, list);
@@ -2269,15 +2153,14 @@ static int create_vmaccount(char *name, struct ast_variable *var, int realtime)
 
        global_stats.voicemailaccounts++;
 
-       if (option_debug > 1)
-               ast_log(LOG_DEBUG, "MINIVM :: Created account %s@%s - tz %s etemplate %s %s\n", username, domain, ast_strlen_zero(vmu->zonetag) ? "" : vmu->zonetag, ast_strlen_zero(vmu->etemplate) ? "" : vmu->etemplate, realtime ? "(realtime)" : "");
+       ast_debug(2, "MINIVM :: Created account %s@%s - tz %s etemplate %s %s\n", username, domain, ast_strlen_zero(vmu->zonetag) ? "" : vmu->zonetag, ast_strlen_zero(vmu->etemplate) ? "" : vmu->etemplate, realtime ? "(realtime)" : "");
        return 0;
 }
 
 /*! \brief Free Mini Voicemail timezone */
 static void free_zone(struct minivm_zone *z)
 {
-       free(z);
+       ast_free(z);
 }
 
 /*! \brief Clear list of timezones */
@@ -2285,37 +2168,35 @@ static void timezone_destroy_list(void)
 {
        struct minivm_zone *this;
 
-       if (AST_LIST_EMPTY(&minivm_zones))
-               return;
        AST_LIST_LOCK(&minivm_zones);
        while ((this = AST_LIST_REMOVE_HEAD(&minivm_zones, list))) 
-               free(this);
+               free_zone(this);
                
        AST_LIST_UNLOCK(&minivm_zones);
 }
 
 /*! \brief Add time zone to memory list */
-static int timezone_add(char *zonename, char *config)
+static int timezone_add(const char *zonename, const char *config)
 {
 
        struct minivm_zone *newzone;
        char *msg_format, *timezone;
 
-       newzone = ast_calloc(1, sizeof(struct minivm_zone));
+       newzone = ast_calloc(1, sizeof(*newzone));
        if (newzone == NULL)
                return 0;
 
        msg_format = ast_strdupa(config);
        if (msg_format == NULL) {
                ast_log(LOG_WARNING, "Out of memory.\n");
-               free(newzone);
+               ast_free(newzone);
                return 0;
        }
 
        timezone = strsep(&msg_format, "|");
        if (!msg_format) {
                ast_log(LOG_WARNING, "Invalid timezone definition : %s\n", zonename);
-               free(newzone);
+               ast_free(newzone);
                return 0;
        }
                        
@@ -2333,7 +2214,7 @@ static int timezone_add(char *zonename, char *config)
 }
 
 /*! \brief Read message template from file */
-static char *message_template_parse_filebody(char *filename) {
+static char *message_template_parse_filebody(const char *filename) {
        char buf[BUFSIZ * 6];
        char readbuf[BUFSIZ];
        char filenamebuf[BUFSIZ];
@@ -2366,10 +2247,8 @@ static char *message_template_parse_filebody(char *filename) {
        fclose(fi);
        messagebody = ast_calloc(1, strlen(buf + 1));
        ast_copy_string(messagebody, buf, strlen(buf) + 1);
-       if (option_debug > 3) {
-               ast_log(LOG_DEBUG, "---> Size of allocation %d\n", (int) strlen(buf + 1) );
-               ast_log(LOG_DEBUG, "---> Done reading message template : \n%s\n---- END message template--- \n", messagebody);
-       }
+       ast_debug(4, "---> Size of allocation %d\n", (int) strlen(buf + 1) );
+       ast_debug(4, "---> Done reading message template : \n%s\n---- END message template--- \n", messagebody);
 
        return messagebody;
 }
@@ -2378,7 +2257,7 @@ static char *message_template_parse_filebody(char *filename) {
 static char *message_template_parse_emailbody(const char *configuration)
 {
        char *tmpread, *tmpwrite;
-       char *emailbody = strdup(configuration);
+       char *emailbody = ast_strdup(configuration);
 
        /* substitute strings \t and \n into the apropriate characters */
        tmpread = tmpwrite = emailbody;
@@ -2386,11 +2265,11 @@ static char *message_template_parse_emailbody(const char *configuration)
               int len = strlen("\n");
               switch (tmpwrite[1]) {
               case 'n':
-                     strncpy(tmpwrite+len, tmpwrite+2, strlen(tmpwrite+2)+1);
+                     memmove(tmpwrite + len, tmpwrite + 2, strlen(tmpwrite + 2) + 1);
                      strncpy(tmpwrite, "\n", len);
                      break;
               case 't':
-                     strncpy(tmpwrite+len, tmpwrite+2, strlen(tmpwrite+2)+1);
+                     memmove(tmpwrite + len, tmpwrite + 2, strlen(tmpwrite + 2) + 1);
                      strncpy(tmpwrite, "\t", len);
                      break;
               default:
@@ -2460,39 +2339,27 @@ static int apply_general_options(struct ast_variable *var)
 }
 
 /*! \brief Load minivoicemail configuration */
-static int load_config(void)
+static int load_config(int reload)
 {
-       struct minivm_account *cur;
-       struct minivm_zone *zcur;
-       struct minivm_template *tcur;
        struct ast_config *cfg;
        struct ast_variable *var;
        char *cat;
        const char *chanvar;
        int error = 0;
+       struct minivm_template *template;
+       struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
 
-       cfg = ast_config_load(VOICEMAIL_CONFIG);
-       ast_mutex_lock(&minivmlock);
-
-       AST_LIST_LOCK(&minivm_accounts);
-       while ((cur = AST_LIST_REMOVE_HEAD(&minivm_accounts, list))) {
-               free_user(cur);
-       }
-       AST_LIST_UNLOCK(&minivm_accounts);
+       cfg = ast_config_load(VOICEMAIL_CONFIG, config_flags);
+       if (cfg == CONFIG_STATUS_FILEUNCHANGED)
+               return 0;
 
-       /* Free all zones */
-       AST_LIST_LOCK(&minivm_zones);
-       while ((zcur = AST_LIST_REMOVE_HEAD(&minivm_zones, list))) {
-               free_zone(zcur);
-       }
-       AST_LIST_UNLOCK(&minivm_zones);
+       ast_mutex_lock(&minivmlock);
 
-       /* Free all templates */
-       AST_LIST_LOCK(&message_templates);
-       while ((tcur = AST_LIST_REMOVE_HEAD(&message_templates, list))) {
-               message_template_free(tcur);
-       }
-       AST_LIST_UNLOCK(&message_templates);
+       /* Destroy lists to reconfigure */
+       message_destroy_list();         /* Destroy list of voicemail message templates */
+       timezone_destroy_list();        /* Destroy list of timezones */
+       vmaccounts_destroy_list();      /* Destroy list of voicemail accounts */
+       ast_debug(2, "Destroyed memory objects...\n");
 
        /* First, set some default settings */
        global_externnotify[0] = '\0';
@@ -2508,10 +2375,9 @@ static int load_config(void)
        ast_set2_flag((&globalflags), FALSE, MVM_REVIEW);       
        ast_set2_flag((&globalflags), FALSE, MVM_OPERATOR);     
        strcpy(global_charset, "ISO-8859-1");
-       struct minivm_template *template;
        /* Reset statistics */
-       memset(&global_stats, 0, sizeof(struct minivm_stats));
-       global_stats.reset = time(NULL);
+       memset(&global_stats, 0, sizeof(global_stats));
+       global_stats.reset = ast_tvnow();
 
        /* Make sure we could load configuration file */
        if (!cfg) {
@@ -2520,15 +2386,13 @@ static int load_config(void)
                return 0;
        }
 
-       if (option_debug > 1)
-               ast_log(LOG_DEBUG, "-_-_- Loaded configuration file, now parsing\n");
+       ast_debug(2, "-_-_- Loaded configuration file, now parsing\n");
 
        /* General settings */
 
        cat = ast_category_browse(cfg, NULL);
        while (cat) {
-               if (option_debug > 2)
-                       ast_log(LOG_DEBUG, "-_-_- Found configuration section [%s]\n", cat);
+               ast_debug(3, "-_-_- Found configuration section [%s]\n", cat);
                if (!strcasecmp(cat, "general")) {
                        /* Nothing right now */
                        error += apply_general_options(ast_variable_browse(cfg, cat));
@@ -2603,57 +2467,44 @@ static int load_config(void)
                minivmlogfile = fopen(global_logfile, "a");
                if(!minivmlogfile)
                        ast_log(LOG_ERROR, "Failed to open minivm log file %s : %s\n", global_logfile, strerror(errno));
-               if (option_debug > 2 && minivmlogfile)
-                       ast_log(LOG_DEBUG, "-_-_- Opened log file %s \n", global_logfile);
+               if (minivmlogfile)
+                       ast_debug(3, "-_-_- Opened log file %s \n", global_logfile);
        }
 
        return 0;
 }
 
-static const char minivm_show_users_help[] =
-"Usage: minivm list accounts\n"
-"       Lists all mailboxes currently set up\n";
-
-static const char minivm_show_zones_help[] =
-"Usage: minivm list zones\n"
-"       Lists zone message formats\n";
-
-static const char minivm_list_templates_help[] =
-"Usage: minivm list templates\n"
-"       Lists message templates for e-mail, paging and IM\n";
-
-static const char minivm_show_stats_help[] =
-"Usage: minivm show stats\n"
-"       Display Mini-Voicemail counters\n";
-
-static const char minivm_show_settings_help[] =
-"Usage: minivm show settings\n"
-"       Display Mini-Voicemail general settings\n";
-
-static const char minivm_reload_help[] =
-"Usage: minivm reload\n"
-"       Reload mini-voicemail configuration and reset statistics\n";
-
 /*! \brief CLI routine for listing templates */
-static int handle_minivm_list_templates(int fd, int argc, char *argv[])
+static char *handle_minivm_list_templates(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
        struct minivm_template *this;
        char *output_format = "%-15s %-10s %-10s %-15.15s %-50s\n";
        int count = 0;
 
-       if (argc > 3)
-               return RESULT_SHOWUSAGE;
+       switch (cmd) {
+       case CLI_INIT:
+               e->command = "minivm list templates";
+               e->usage =
+                       "Usage: minivm list templates\n"
+                       "       Lists message templates for e-mail, paging and IM\n";
+               return NULL;
+       case CLI_GENERATE:
+               return NULL;
+       }
+
+       if (a->argc > 3)
+               return CLI_SHOWUSAGE;
 
        AST_LIST_LOCK(&message_templates);
        if (AST_LIST_EMPTY(&message_templates)) {
-               ast_cli(fd, "There are no message templates defined\n");
+               ast_cli(a->fd, "There are no message templates defined\n");
                AST_LIST_UNLOCK(&message_templates);
-               return RESULT_FAILURE;
+               return CLI_FAILURE;
        }
-       ast_cli(fd, output_format, "Template name", "Charset", "Locale", "Attach media", "Subject");
-       ast_cli(fd, output_format, "-------------", "-------", "------", "------------", "-------");
+       ast_cli(a->fd, output_format, "Template name", "Charset", "Locale", "Attach media", "Subject");
+       ast_cli(a->fd, output_format, "-------------", "-------", "------", "------------", "-------");
        AST_LIST_TRAVERSE(&message_templates, this, list) {
-               ast_cli(fd, output_format, this->name, 
+               ast_cli(a->fd, output_format, this->name, 
                        this->charset ? this->charset : "-", 
                        this->locale ? this->locale : "-",
                        this->attachment ? "Yes" : "No",
@@ -2661,38 +2512,71 @@ static int handle_minivm_list_templates(int fd, int argc, char *argv[])
                count++;
        }
        AST_LIST_UNLOCK(&message_templates);
-       ast_cli(fd, "\n * Total: %d minivoicemail message templates\n", count);
-       return RESULT_SUCCESS;
+       ast_cli(a->fd, "\n * Total: %d minivoicemail message templates\n", count);
+       return CLI_SUCCESS;
+}
+
+static char *complete_minivm_show_users(const char *line, const char *word, int pos, int state)
+{
+       int which = 0;
+       int wordlen;
+       struct minivm_account *vmu;
+       const char *domain = "";
+
+       /* 0 - voicemail; 1 - list; 2 - accounts; 3 - for; 4 - <domain> */
+       if (pos > 4)
+               return NULL;
+       if (pos == 3)
+               return (state == 0) ? ast_strdup("for") : NULL;
+       wordlen = strlen(word);
+       AST_LIST_TRAVERSE(&minivm_accounts, vmu, list) {
+               if (!strncasecmp(word, vmu->domain, wordlen)) {
+                       if (domain && strcmp(domain, vmu->domain) && ++which > state)
+                               return ast_strdup(vmu->domain);
+                       /* ignore repeated domains ? */
+                       domain = vmu->domain;
+               }
+       }
+       return NULL;
 }
 
 /*! \brief CLI command to list voicemail accounts */
-static int handle_minivm_show_users(int fd, int argc, char *argv[])
+static char *handle_minivm_show_users(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
        struct minivm_account *vmu;
        char *output_format = "%-23s %-15s %-15s %-10s %-10s %-50s\n";
        int count = 0;
 
-       if ((argc < 3) || (argc > 5) || (argc == 4))
-               return RESULT_SHOWUSAGE;
-       if ((argc == 5) && strcmp(argv[3],"for"))
-               return RESULT_SHOWUSAGE;
+       switch (cmd) {
+       case CLI_INIT:
+               e->command = "minivm list accounts";
+               e->usage =
+                       "Usage: minivm list accounts\n"
+                       "       Lists all mailboxes currently set up\n";
+               return NULL;
+       case CLI_GENERATE:
+               return complete_minivm_show_users(a->line, a->word, a->pos, a->n);
+       }
+
+       if ((a->argc < 3) || (a->argc > 5) || (a->argc == 4))
+               return CLI_SHOWUSAGE;
+       if ((a->argc == 5) && strcmp(a->argv[3],"for"))
+               return CLI_SHOWUSAGE;
 
        AST_LIST_LOCK(&minivm_accounts);
        if (AST_LIST_EMPTY(&minivm_accounts)) {
-               ast_cli(fd, "There are no voicemail users currently defined\n");
+               ast_cli(a->fd, "There are no voicemail users currently defined\n");
                AST_LIST_UNLOCK(&minivm_accounts);
-               return RESULT_FAILURE;
+               return CLI_FAILURE;
        }
-       ast_cli(fd, output_format, "User", "E-Template", "P-template", "Zone", "Format", "Full name");
-       ast_cli(fd, output_format, "----", "----------", "----------", "----", "------", "---------");
+       ast_cli(a->fd, output_format, "User", "E-Template", "P-template", "Zone", "Format", "Full name");
+       ast_cli(a->fd, output_format, "----", "----------", "----------", "----", "------", "---------");
        AST_LIST_TRAVERSE(&minivm_accounts, vmu, list) {
                char tmp[256] = "";
-
-
-               if ((argc == 3) || ((argc == 5) && !strcmp(argv[4], vmu->domain))) {
+               if ((a->argc == 3) || ((a->argc == 5) && !strcmp(a->argv[4], vmu->domain))) {
                        count++;
                        snprintf(tmp, sizeof(tmp), "%s@%s", vmu->username, vmu->domain);
-                       ast_cli(fd, output_format, tmp, vmu->etemplate ? vmu->etemplate : "-", 
+                       ast_cli(a->fd, output_format, tmp, vmu->etemplate ? vmu->etemplate : "-", 
                                vmu->ptemplate ? vmu->ptemplate : "-",
                                vmu->zonetag ? vmu->zonetag : "-", 
                                vmu->attachfmt ? vmu->attachfmt : "-",
@@ -2700,108 +2584,117 @@ static int handle_minivm_show_users(int fd, int argc, char *argv[])
                }
        }
        AST_LIST_UNLOCK(&minivm_accounts);
-       ast_cli(fd, "\n * Total: %d minivoicemail accounts\n", count);
-       return RESULT_SUCCESS;
+       ast_cli(a->fd, "\n * Total: %d minivoicemail accounts\n", count);
+       return CLI_SUCCESS;
 }
 
 /*! \brief Show a list of voicemail zones in the CLI */
-static int handle_minivm_show_zones(int fd, int argc, char *argv[])
+static char *handle_minivm_show_zones(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
        struct minivm_zone *zone;
        char *output_format = "%-15s %-20s %-45s\n";
-       int res = RESULT_SUCCESS;
+       char *res = CLI_SUCCESS;
+
+       switch (cmd) {
+       case CLI_INIT:
+               e->command = "minivm list zones";
+               e->usage =
+                       "Usage: minivm list zones\n"
+                       "       Lists zone message formats\n";
+               return NULL;
+       case CLI_GENERATE:
+               return NULL;
+       }
 
-       if (argc != 3)
-               return RESULT_SHOWUSAGE;
+       if (a->argc != 3)
+               return CLI_SHOWUSAGE;
 
        AST_LIST_LOCK(&minivm_zones);
        if (!AST_LIST_EMPTY(&minivm_zones)) {
-               ast_cli(fd, output_format, "Zone", "Timezone", "Message Format");
-               ast_cli(fd, output_format, "----", "--------", "--------------");
+               ast_cli(a->fd, output_format, "Zone", "Timezone", "Message Format");
+               ast_cli(a->fd, output_format, "----", "--------", "--------------");
                AST_LIST_TRAVERSE(&minivm_zones, zone, list) {
-                       ast_cli(fd, output_format, zone->name, zone->timezone, zone->msg_format);
+                       ast_cli(a->fd, output_format, zone->name, zone->timezone, zone->msg_format);
                }
        } else {
-               ast_cli(fd, "There are no voicemail zones currently defined\n");
-               res = RESULT_FAILURE;
+               ast_cli(a->fd, "There are no voicemail zones currently defined\n");
+               res = CLI_FAILURE;
        }
        AST_LIST_UNLOCK(&minivm_zones);
 
        return res;
 }
 
-
-static char *complete_minivm_show_users(const char *line, const char *word, int pos, int state)
+/*! \brief CLI Show settings */
+static char *handle_minivm_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
-       int which = 0;
-       int wordlen;
-       struct minivm_account *vmu;
-       const char *domain = "";
-
-       /* 0 - show; 1 - voicemail; 2 - users; 3 - for; 4 - <domain> */
-       if (pos > 4)
+       switch (cmd) {
+       case CLI_INIT:
+               e->command = "minivm show settings";
+               e->usage =
+                       "Usage: minivm show settings\n"
+                       "       Display Mini-Voicemail general settings\n";
+               return NULL;
+       case CLI_GENERATE:
                return NULL;
-       if (pos == 3)
-               return (state == 0) ? strdup("for") : NULL;
-       wordlen = strlen(word);
-       AST_LIST_TRAVERSE(&minivm_accounts, vmu, list) {
-               if (!strncasecmp(word, vmu->domain, wordlen)) {
-                       if (domain && strcmp(domain, vmu->domain) && ++which > state)
-                               return strdup(vmu->domain);
-                       /* ignore repeated domains ? */
-                       domain = vmu->domain;
-               }
        }
-       return NULL;
-}
 
-/*! \brief CLI Show settings */
-static int handle_minivm_show_settings(int fd, int argc, char *argv[])
-{
-       ast_cli(fd, "* Mini-Voicemail general settings\n");
-       ast_cli(fd, "  -------------------------------\n");
-       ast_cli(fd, "\n");
-       ast_cli(fd, "  Mail command (shell):               %s\n", global_mailcmd);
-       ast_cli(fd, "  Max silence:                        %d\n", global_maxsilence);
-       ast_cli(fd, "  Silence treshold:                   %d\n", global_silencethreshold);
-       ast_cli(fd, "  Max message length (secs):          %d\n", global_vmmaxmessage);
-       ast_cli(fd, "  Min message length (secs):          %d\n", global_vmminmessage);
-       ast_cli(fd, "  Default format:                     %s\n", default_vmformat);
-       ast_cli(fd, "  Extern notify (shell):              %s\n", global_externnotify);
-       ast_cli(fd, "  Logfile:                            %s\n", global_logfile[0] ? global_logfile : "<disabled>");
-       ast_cli(fd, "  Operator exit:                      %s\n", ast_test_flag(&globalflags, MVM_OPERATOR) ? "Yes" : "No");
-       ast_cli(fd, "  Message review:                     %s\n", ast_test_flag(&globalflags, MVM_REVIEW) ? "Yes" : "No");
-
-       ast_cli(fd, "\n");
-       return RESULT_SUCCESS;
+       ast_cli(a->fd, "* Mini-Voicemail general settings\n");
+       ast_cli(a->fd, "  -------------------------------\n");
+       ast_cli(a->fd, "\n");
+       ast_cli(a->fd, "  Mail command (shell):               %s\n", global_mailcmd);
+       ast_cli(a->fd, "  Max silence:                        %d\n", global_maxsilence);
+       ast_cli(a->fd, "  Silence treshold:                   %d\n", global_silencethreshold);
+       ast_cli(a->fd, "  Max message length (secs):          %d\n", global_vmmaxmessage);
+       ast_cli(a->fd, "  Min message length (secs):          %d\n", global_vmminmessage);
+       ast_cli(a->fd, "  Default format:                     %s\n", default_vmformat);
+       ast_cli(a->fd, "  Extern notify (shell):              %s\n", global_externnotify);
+       ast_cli(a->fd, "  Logfile:                            %s\n", global_logfile[0] ? global_logfile : "<disabled>");
+       ast_cli(a->fd, "  Operator exit:                      %s\n", ast_test_flag(&globalflags, MVM_OPERATOR) ? "Yes" : "No");
+       ast_cli(a->fd, "  Message review:                     %s\n", ast_test_flag(&globalflags, MVM_REVIEW) ? "Yes" : "No");
+
+       ast_cli(a->fd, "\n");
+       return CLI_SUCCESS;
 }
 
 /*! \brief Show stats */
-static int handle_minivm_show_stats(int fd, int argc, char *argv[])
+static char *handle_minivm_show_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
-       struct tm time;
+       struct ast_tm time;
        char buf[BUFSIZ];
 
-       ast_cli(fd, "* Mini-Voicemail statistics\n");
-       ast_cli(fd, "  -------------------------\n");
-       ast_cli(fd, "\n");
-       ast_cli(fd, "  Voicemail accounts:                  %-5.5d\n", global_stats.voicemailaccounts);
-       ast_cli(fd, "  Templates:                           %-5.5d\n", global_stats.templates);
-       ast_cli(fd, "  Timezones:                           %-5.5d\n", global_stats.timezones);
+       switch (cmd) {
+       
+       case CLI_INIT:
+               e->command = "minivm show stats";
+               e->usage =
+                       "Usage: minivm show stats\n"
+                       "       Display Mini-Voicemail counters\n";
+               return NULL;
+       case CLI_GENERATE:
+               return NULL;
+       }
+
+       ast_cli(a->fd, "* Mini-Voicemail statistics\n");
+       ast_cli(a->fd, "  -------------------------\n");
+       ast_cli(a->fd, "\n");
+       ast_cli(a->fd, "  Voicemail accounts:                  %5d\n", global_stats.voicemailaccounts);
+       ast_cli(a->fd, "  Templates:                           %5d\n", global_stats.templates);
+       ast_cli(a->fd, "  Timezones:                           %5d\n", global_stats.timezones);
        if (global_stats.receivedmessages == 0) {
-               ast_cli(fd, "  Received messages since last reset:  <none>\n");
+               ast_cli(a->fd, "  Received messages since last reset:  <none>\n");
        } else {
-               ast_cli(fd, "  Received messages since last reset:  %d\n", global_stats.receivedmessages);
+               ast_cli(a->fd, "  Received messages since last reset:  %d\n", global_stats.receivedmessages);
                ast_localtime(&global_stats.lastreceived, &time, NULL);
-               strftime(buf, sizeof(buf), "%a %b %e %r %Z %Y", &time);
-               ast_cli(fd, "  Last received voicemail:             %s\n", buf);
+               ast_strftime(buf, sizeof(buf), "%a %b %e %r %Z %Y", &time);
+               ast_cli(a->fd, "  Last received voicemail:             %s\n", buf);
        }
        ast_localtime(&global_stats.reset, &time, NULL);
-       strftime(buf, sizeof(buf), "%a %b %e %r %Z %Y", &time);
-       ast_cli(fd, "  Last reset:                          %s\n", buf);
+       ast_strftime(buf, sizeof(buf), "%a %b %e %r %Z %Y", &time);
+       ast_cli(a->fd, "  Last reset:                          %s\n", buf);
 
-       ast_cli(fd, "\n");
-       return RESULT_SUCCESS;
+       ast_cli(a->fd, "\n");
+       return CLI_SUCCESS;
 }
 
 /*! \brief  ${MINIVMACCOUNT()} Dialplan function - reads account data */
@@ -2920,8 +2813,7 @@ static int access_counter_file(char *directory, char *countername, int value, in
                counterfile = fopen(filename, "r");
                if (counterfile) {
                        if(fgets(readbuf, sizeof(readbuf), counterfile)) {
-                               if (option_debug > 2)
-                                       ast_log(LOG_DEBUG, "Read this string from counter file: %s\n", readbuf);
+                               ast_debug(3, "Read this string from counter file: %s\n", readbuf);
                                old = counter = atoi(readbuf);
                        }
                        fclose(counterfile);
@@ -2930,8 +2822,7 @@ static int access_counter_file(char *directory, char *countername, int value, in
        switch (operand) {
        case 0: /* Read only */
                ast_unlock_path(directory);
-               if (option_debug > 1)
-                       ast_log(LOG_DEBUG, "MINIVM Counter %s/%s: Value %d\n", directory, countername, counter);
+               ast_debug(2, "MINIVM Counter %s/%s: Value %d\n", directory, countername, counter);
                return counter;
                break;
        case 1: /* Set new value */
@@ -2954,8 +2845,7 @@ static int access_counter_file(char *directory, char *countername, int value, in
        fprintf(counterfile, "%d\n\n", counter);
        fclose(counterfile);
        ast_unlock_path(directory);
-       if (option_debug > 1)
-               ast_log(LOG_DEBUG, "MINIVM Counter %s/%s: Old value %d New value %d\n", directory, countername, old, counter);
+       ast_debug(2, "MINIVM Counter %s/%s: Old value %d New value %d\n", directory, countername, old, counter);
        return counter;
 }
 
@@ -3092,29 +2982,12 @@ static int minivm_counter_func_write(struct ast_channel *chan, const char *cmd,
 
 /*! \brief CLI commands for Mini-voicemail */
 static struct ast_cli_entry cli_minivm[] = {
-       { { "minivm", "list", "accounts", NULL },
-       handle_minivm_show_users, "List defined mini-voicemail boxes",
-       minivm_show_users_help, complete_minivm_show_users, NULL },
-
-       { { "minivm", "list", "zones", NULL },
-       handle_minivm_show_zones, "List zone message formats",
-       minivm_show_zones_help, NULL, NULL },
-
-       { { "minivm", "list", "templates", NULL },
-       handle_minivm_list_templates, "List message templates",
-       minivm_list_templates_help, NULL, NULL },
-
-       { { "minivm", "reload", NULL, NULL },
-       handle_minivm_reload, "Reload Mini-voicemail configuration",
-       minivm_reload_help, NULL, NULL },
-
-       { { "minivm", "show", "stats", NULL },
-       handle_minivm_show_stats, "Show some mini-voicemail statistics",
-       minivm_show_stats_help, NULL, NULL },
-
-       { { "minivm", "show", "settings", NULL },
-       handle_minivm_show_settings, "Show mini-voicemail general settings",
-       minivm_show_settings_help, NULL, NULL },
+       AST_CLI_DEFINE(handle_minivm_show_users, "List defined mini-voicemail boxes"),
+       AST_CLI_DEFINE(handle_minivm_show_zones, "List zone message formats"),
+       AST_CLI_DEFINE(handle_minivm_list_templates, "List message templates"), 
+       AST_CLI_DEFINE(handle_minivm_reload, "Reload Mini-voicemail configuration"),
+       AST_CLI_DEFINE(handle_minivm_show_stats, "Show some mini-voicemail statistics"),
+       AST_CLI_DEFINE(handle_minivm_show_settings, "Show mini-voicemail general settings"),
 };
 
 static struct ast_custom_function minivm_counter_function = {
@@ -3172,7 +3045,7 @@ static int load_module(void)
        if (res)
                return(res);
 
-       if ((res = load_config()))
+       if ((res = load_config(0)))
                return(res);
 
        ast_cli_register_multiple(cli_minivm, sizeof(cli_minivm)/sizeof(cli_minivm[0]));
@@ -3186,21 +3059,27 @@ static int load_module(void)
 /*! \brief Reload mini voicemail module */
 static int reload(void)
 {
-       /* Destroy lists to reconfigure */      
-       message_destroy_list();         /* Destroy list of voicemail message templates */
-       timezone_destroy_list();        /* Destroy list of timezones */
-       vmaccounts_destroy_list();      /* Destroy list of voicemail accounts */
-       if (option_debug > 1)
-               ast_log(LOG_DEBUG, "Destroyed memory objects...\n");
-       return(load_config());
+       return(load_config(1));
 }
 
 /*! \brief Reload cofiguration */
-static int handle_minivm_reload(int fd, int argc, char *argv[])
+static char *handle_minivm_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
+       
+       switch (cmd) {
+       case CLI_INIT:
+               e->command = "minivm reload";
+               e->usage =
+                       "Usage: minivm reload\n"
+                       "       Reload mini-voicemail configuration and reset statistics\n";
+               return NULL;
+       case CLI_GENERATE:
+               return NULL;
+       }
+       
        reload();
-       ast_cli(fd, "\n-- Mini voicemail re-configured \n");
-       return RESULT_SUCCESS;
+       ast_cli(a->fd, "\n-- Mini voicemail re-configured \n");
+       return CLI_SUCCESS;
 }
 
 /*! \brief Unload mini voicemail module */
@@ -3221,9 +3100,6 @@ static int unload_module(void)
        timezone_destroy_list();        /* Destroy list of timezones */
        vmaccounts_destroy_list();      /* Destroy list of voicemail accounts */
 
-       
-       ast_module_user_hangup_all();
-
        return res;
 }