diff --git a/Makefile b/Makefile
index 56b1dcc7b86ad262ec402a53b21d1fc1403799e8..9d63b4be86309b6e193e743e492ed60be331ac51 100755
--- a/Makefile
+++ b/Makefile
@@ -430,6 +430,7 @@ bininstall: all
 	mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/voicemail
 	mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/system
 	mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/tmp
+	mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/meetme
 	install -m 755 asterisk $(DESTDIR)$(ASTSBINDIR)/
 	install -m 755 contrib/scripts/astgenkey $(DESTDIR)$(ASTSBINDIR)/
 	install -m 755 contrib/scripts/autosupport $(DESTDIR)$(ASTSBINDIR)/	
diff --git a/app.c b/app.c
index 5251c3a48760f63aafa6498a311d40f87dee8652..5621773dd1568d0729fca5387189ddb0abb18950 100755
--- a/app.c
+++ b/app.c
@@ -1455,3 +1455,38 @@ char *ast_read_textfile(const char *filename)
 	return output;
 }
 
+int ast_parseoptions(const struct ast_option *options, struct ast_flags *flags, char **args, char *optstr)
+{
+	char *s;
+	int curarg;
+	int argloc;
+	char *arg;
+	int res = 0;
+	flags->flags = 0;
+	if (!optstr)
+		return 0;
+	s = optstr;
+	while(*s) {
+		curarg = *s & 0x7f;
+		flags->flags |= options[curarg].flag;
+		argloc = options[curarg].argoption;
+		s++;
+		if (*s == '(') {
+			/* Has argument */
+			s++;
+			arg = s;
+			while(*s && (*s != ')')) s++;
+			if (*s) {
+				if (argloc)
+					args[argloc - 1] = arg;
+				*s = '\0';
+				s++;
+			} else {
+				ast_log(LOG_WARNING, "Missing closing parenthesis for argument '%c'\n", curarg);
+				res = -1;
+			}
+		}
+	}
+	return res;
+}
+
diff --git a/apps/app_ivrdemo.c b/apps/app_ivrdemo.c
index f1a9f086fe532b8b4c307780bc7bdebe00eb6e39..d182eecf239dbc23fa5e09d867ebf7d20f579a1b 100755
--- a/apps/app_ivrdemo.c
+++ b/apps/app_ivrdemo.c
@@ -94,7 +94,7 @@ int unload_module(void)
 
 int load_module(void)
 {
-	return ast_register_application(app, skel_exec, synopsis, tdesc);
+	return ast_register_application(app, skel_exec, tdesc, synopsis);
 }
 
 char *description(void)
diff --git a/apps/app_md5.c b/apps/app_md5.c
index a481393dfb1bfcd0b770df41523bb7cbfceb8846..1d09be4df081fffcc23b0827806b030bf26f0453 100755
--- a/apps/app_md5.c
+++ b/apps/app_md5.c
@@ -21,14 +21,15 @@
 #include <unistd.h>
 #include <string.h>
 
-static char *tdesc_md5 = "MD5 checksum application";
+static char *tdesc_md5 = "MD5 checksum applications";
 static char *app_md5 = "MD5";
+static char *desc_md5 = "Calculate MD5 checksum";
 static char *synopsis_md5 = 
 "  MD5(<var>=<string>): Calculates a MD5 checksum on <string>.\n"
 "Returns hash value in a channel variable. Always return 0\n";
 
-static char *tdesc_md5check = "MD5 checksum verification application";
 static char *app_md5check = "MD5Check";
+static char *desc_md5check = "Check MD5 checksum";
 static char *synopsis_md5check = 
 "  MD5Check(<md5hash>,<string>): Calculates a MD5 checksum on <string>\n"
 "and compares it with the hash. Returns 0 if <md5hash> is correct for <string>.\n"
@@ -122,8 +123,8 @@ int load_module(void)
 {
 	int res;
 
-	res = ast_register_application(app_md5check, md5check_exec, synopsis_md5check, tdesc_md5check);
-	res |= ast_register_application(app_md5, md5_exec, synopsis_md5, tdesc_md5);
+	res = ast_register_application(app_md5check, md5check_exec, desc_md5check, synopsis_md5check);
+	res |= ast_register_application(app_md5, md5_exec, desc_md5, synopsis_md5);
 	return res;
 }
 
diff --git a/apps/app_meetme.c b/apps/app_meetme.c
index ff70b5e6549d1bfb34fba4fbf16c41ca6d56673f..fa50bc83a767c10400a38caf6d92937f1218c767 100755
--- a/apps/app_meetme.c
+++ b/apps/app_meetme.c
@@ -184,6 +184,35 @@ static void *recordthread(void *args);
 #define CONFFLAG_INTROUSER (1 << 14)	/* If set, user will be ask record name on entry of conference */
 #define CONFFLAG_RECORDCONF (1<< 15)	/* If set, the MeetMe will be recorded */
 #define CONFFLAG_MONITORTALKER (1 << 16) /* If set, the user will be monitored if the user is talking or not */
+#define CONFFLAG_DYNAMIC (1 << 17)
+#define CONFFLAG_DYNAMICPIN (1 << 18)
+#define CONFFLAG_EMPTY (1 << 19)
+#define CONFFLAG_EMPTYNOPIN (1 << 20)
+#define CONFFLAG_ALWAYSPROMPT (1 << 21)
+
+
+AST_DECLARE_OPTIONS(meetme_opts,{
+	['a'] = { CONFFLAG_ADMIN },
+	['T'] = { CONFFLAG_MONITORTALKER },
+	['i'] = { CONFFLAG_INTROUSER },
+	['m'] = { CONFFLAG_MONITOR },
+	['p'] = { CONFFLAG_POUNDEXIT },
+	['s'] = { CONFFLAG_STARMENU },
+	['t'] = { CONFFLAG_TALKER },
+	['q'] = { CONFFLAG_QUIET },
+	['M'] = { CONFFLAG_MOH },
+	['x'] = { CONFFLAG_MARKEDEXIT },
+	['X'] = { CONFFLAG_EXIT_CONTEXT },
+	['A'] = { CONFFLAG_MARKEDUSER },
+	['b'] = { CONFFLAG_AGI },
+	['w'] = { CONFFLAG_WAITMARKED },
+	['r'] = { CONFFLAG_RECORDCONF },
+	['d'] = { CONFFLAG_DYNAMIC },
+	['D'] = { CONFFLAG_DYNAMICPIN },
+	['e'] = { CONFFLAG_EMPTY },
+	['E'] = { CONFFLAG_EMPTYNOPIN },
+	['P'] = { CONFFLAG_ALWAYSPROMPT },
+});
 
 static char *istalking(int x)
 {
@@ -657,10 +686,11 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
 		else
 			strncpy(exitcontext, chan->context, sizeof(exitcontext) - 1);
 	}
-        snprintf(user->namerecloc,sizeof(user->namerecloc),"%s/meetme-username-%s-%d",AST_SPOOL_DIR,conf->confno,user->user_no);
 
-	if (!(confflags & CONFFLAG_QUIET) && (confflags & CONFFLAG_INTROUSER))
+	if (!(confflags & CONFFLAG_QUIET) && (confflags & CONFFLAG_INTROUSER)) {
+		snprintf(user->namerecloc,sizeof(user->namerecloc),"%s/meetme/meetme-username-%s-%d",ast_config_AST_SPOOL_DIR,conf->confno,user->user_no);
 		ast_record_review(chan,"vm-rec-name",user->namerecloc, 10,"sln", &duration, NULL);
+	}
 
 	while((confflags & CONFFLAG_WAITMARKED) && (conf->markedusers == 0)) {
 		confflags &= ~CONFFLAG_QUIET;
@@ -1363,7 +1393,7 @@ static int conf_exec(struct ast_channel *chan, void *data)
 	int allowretry = 0;
 	int retrycnt = 0;
 	struct ast_conference *cnf;
-	int confflags = 0;
+	struct ast_flags confflags = {0};
 	int dynamic = 0;
 	int empty = 0, empty_no_pin = 0;
 	int always_prompt = 0;
@@ -1396,52 +1426,14 @@ static int conf_exec(struct ast_channel *chan, void *data)
 		strncpy(the_pin, inpin, sizeof(the_pin) - 1);
 
 	if (inflags) {
-		if (strchr(inflags, 'a'))
-			confflags |= CONFFLAG_ADMIN;
-		if (strchr(inflags, 'T'))
-			confflags |= CONFFLAG_MONITORTALKER;
-		if (strchr(inflags, 'i'))
-			confflags |= CONFFLAG_INTROUSER;
-		if (strchr(inflags, 'm'))
-			confflags |= CONFFLAG_MONITOR;
-		if (strchr(inflags, 'p'))
-			confflags |= CONFFLAG_POUNDEXIT;
-		if (strchr(inflags, 's'))
-			confflags |= CONFFLAG_STARMENU;
-		if (strchr(inflags, 't'))
-			confflags |= CONFFLAG_TALKER;
-		if (strchr(inflags, 'q'))
-			confflags |= CONFFLAG_QUIET;
-		if (strchr(inflags, 'M'))
-			confflags |= CONFFLAG_MOH;
-		if (strchr(inflags, 'x'))
-			confflags |= CONFFLAG_MARKEDEXIT;
-		if (strchr(inflags, 'X'))
-			confflags |= CONFFLAG_EXIT_CONTEXT;
-		if (strchr(inflags, 'A'))
-			confflags |= CONFFLAG_MARKEDUSER;
-		if (strchr(inflags, 'b'))
-			confflags |= CONFFLAG_AGI;
-		if (strchr(inflags, 'w'))
-			confflags |= CONFFLAG_WAITMARKED;
-		if (strchr(inflags, 'r'))
-			confflags |= CONFFLAG_RECORDCONF;	
-		if (strchr(inflags, 'd'))
-			dynamic = 1;
-		if (strchr(inflags, 'D')) {
-			dynamic = 1;
-			if (! inpin) {
-				strncpy(the_pin, "q", sizeof(the_pin) - 1);
-			}
-		}
-		if (strchr(inflags, 'e'))
-			empty = 1;
-		if (strchr(inflags, 'E')) {
-			empty = 1;
-			empty_no_pin = 1;
-		}
-		if (strchr(inflags, 'P'))
-			always_prompt = 1;
+		ast_parseoptions(meetme_opts, &confflags, NULL, inflags);
+		dynamic = ast_test_flag(&confflags, CONFFLAG_DYNAMIC | CONFFLAG_DYNAMICPIN);
+		if (ast_test_flag(&confflags, CONFFLAG_DYNAMICPIN) && !inpin)
+			strncpy(the_pin, "q", sizeof(the_pin) - 1);
+
+		empty = ast_test_flag(&confflags, CONFFLAG_EMPTY | CONFFLAG_EMPTYNOPIN);
+		empty_no_pin = ast_test_flag(&confflags, CONFFLAG_EMPTYNOPIN);
+		always_prompt = ast_test_flag(&confflags, CONFFLAG_ALWAYSPROMPT);
 	}
 
 	do {
@@ -1568,7 +1560,7 @@ static int conf_exec(struct ast_channel *chan, void *data)
 				if (allowretry)
 					confno[0] = '\0';
 			} else {
-				if ((!ast_strlen_zero(cnf->pin) && ! (confflags & CONFFLAG_ADMIN)) || (!ast_strlen_zero(cnf->pinadmin) && (confflags & CONFFLAG_ADMIN))) {
+				if ((!ast_strlen_zero(cnf->pin) &&  !ast_test_flag(&confflags, CONFFLAG_ADMIN)) || (!ast_strlen_zero(cnf->pinadmin) && ast_test_flag(&confflags, CONFFLAG_ADMIN))) {
 					char pin[AST_MAX_EXTENSION]="";
 					int j;
 
@@ -1587,9 +1579,9 @@ static int conf_exec(struct ast_channel *chan, void *data)
 								/* Pin correct */
 								allowretry = 0;
 								if (!ast_strlen_zero(cnf->pinadmin) && !strcasecmp(pin, cnf->pinadmin)) 
-									confflags |= CONFFLAG_ADMIN;
+									ast_set_flag(&confflags, CONFFLAG_ADMIN);
 								/* Run the conference */
-								res = conf_run(chan, cnf, confflags);
+								res = conf_run(chan, cnf, confflags.flags);
 								break;
 							} else {
 								/* Pin invalid */
@@ -1620,7 +1612,7 @@ static int conf_exec(struct ast_channel *chan, void *data)
 					allowretry = 0;
 
 					/* Run the conference */
-					res = conf_run(chan, cnf, confflags);
+					res = conf_run(chan, cnf, confflags.flags);
 				}
 			}
 		}
diff --git a/apps/app_skel.c b/apps/app_skel.c
index 68bdd9262d2225a0e86c6345adcaf678b78a1321..47ab89f0ecb110b3c270aa3d103ddbb20df71179 100755
--- a/apps/app_skel.c
+++ b/apps/app_skel.c
@@ -53,7 +53,7 @@ int unload_module(void)
 
 int load_module(void)
 {
-	return ast_register_application(app, skel_exec, synopsis, tdesc);
+	return ast_register_application(app, skel_exec, tdesc, synopsis);
 }
 
 char *description(void)
diff --git a/include/asterisk/app.h b/include/asterisk/app.h
index 2699803092e9fa93b6b062fc830b76cd1b017e77..b50dfe36b5f0f0d7f154b8d20ae3c913143d39b5 100755
--- a/include/asterisk/app.h
+++ b/include/asterisk/app.h
@@ -65,6 +65,16 @@ struct ast_ivr_menu {
 
 #define AST_IVR_FLAG_AUTORESTART (1 << 0)
 
+struct ast_option {
+	unsigned int flag;
+	int argoption;
+};
+
+extern int ast_parseoptions(const struct ast_option *options, struct ast_flags *flags, char **args, char *optstr);
+
+#define AST_DECLARE_OPTIONS(holder,args...) \
+	static struct ast_option holder[128] = args
+
 #define AST_IVR_DECLARE_MENU(holder,title,flags,foo...) \
 	static struct ast_ivr_option __options_##holder[] = foo;\
 	static struct ast_ivr_menu holder = { title, flags, __options_##holder }