diff --git a/apps/app_directory.c b/apps/app_directory.c
index c169f43da111c90b2f92a9120965d7b9710a0e1a..3e4b7d3532835b6d63b772b56bb5c6620f310994 100755
--- a/apps/app_directory.c
+++ b/apps/app_directory.c
@@ -48,7 +48,7 @@ static char *descrip =
 /* For simplicity, I'm keeping the format compatible with the voicemail config,
    but i'm open to suggestions for isolating it */
 
-#define DIRECTORY_CONFIG "voicemail.conf"
+#define VOICEMAIL_CONFIG "voicemail.conf"
 
 /* How many digits to read in */
 #define NUMDIGITS 3
@@ -215,66 +215,59 @@ static int play_mailbox_owner(struct ast_channel *chan, char *context, char *dia
 
 static struct ast_config *realtime_directory(char *context)
 {
-	struct ast_config *cfg = NULL;
-	struct ast_variable *rtvar = NULL;
-	struct ast_category *cat = NULL;
-	char fullname[50] = "";
-	char mailbox[50] = "";
-	char tmp[100] = "";
-	int havename = 0;
-	int havemailbox = 0;
+	struct ast_config *cfg;
+	struct ast_config *rtdata;
+	struct ast_category *cat;
+	struct ast_variable *var;
+	char *mailbox;
+	char *fullname;
+	char *hidefromdir;
+	char tmp[100];
 
 	/* Load flat file config. */
-	cfg = ast_config_load(DIRECTORY_CONFIG);
+	cfg = ast_config_load(VOICEMAIL_CONFIG);
 
 	if (!cfg) {
-		/* Loading config failed. Even if config file doesn't exist, we should still have an ast_config. */
-		ast_log(LOG_WARNING, "Loading/Creating config failed.\n");
+		/* Loading config failed. */
+		ast_log(LOG_WARNING, "Loading config failed.\n");
 		return NULL;
 	}
 
-	/* Load RealTime voicemail users for this context. */
-	rtvar = ast_load_realtime("voicemail", "context", context, NULL);
+	/* Get realtime entries, categorized by their mailbox number
+	   and present in the requested context */
+	rtdata = ast_load_realtime_multientry("voicemail", "mailbox LIKE", "%", "context", context, NULL);
 
-	/* If we got nothing from RealTime, we can just return the Flatfile. */
-	if (!rtvar)
+	/* if there are no results, just return the entries from the config file */
+	if (!rtdata)
 		return cfg;
 
-	/* Does the context exist within the Flatfile? */
-	if (ast_category_exist(cfg, context)) {
-		/* If so, get a pointer to it so we can append RealTime variables to it. */
-		cat = ast_category_get(cfg, context);
-	} else {
-		/* If not, make a fresh one and append it to the master config. */
+	/* Does the context exist within the config file? If not, make one */
+	cat = ast_category_get(cfg, context);
+	if (!cat) {
 		cat = ast_category_new(context);
 		if (!cat) {
-			ast_log(LOG_WARNING, "Ran out of memory while creating new ast_category!\n");
+			ast_log(LOG_WARNING, "Out of memory\n");
 			ast_config_destroy(cfg);
 			return NULL;
 		}
 		ast_category_append(cfg, cat);
 	}
 
-	/* We now have a category: from the Flatfile or freshly created. */
-	while (rtvar) {
-		if (!strcasecmp(rtvar->name, "fullname")) {
-			strncpy(fullname, rtvar->value, sizeof(fullname)-1);
-			havename = 1;
-		} else if (!strcasecmp(rtvar->name, "mailbox")) {
-			strncpy(mailbox, rtvar->value, sizeof(mailbox)-1);
-			havemailbox = 1;
-		}
-
-		/* app_directory needs only mailbox and fullname. Fill password and email with dummy values. */
-		if (havemailbox && havename) {
-			sprintf(tmp, "9999,%s,email@email.com", fullname);
-			ast_variable_append(cat, ast_variable_new(mailbox, tmp));
-			havemailbox = 0;
-			havename = 0;
-		}
-
-		rtvar = rtvar->next;
+	mailbox = ast_category_browse(rtdata, NULL);
+	while (mailbox) {
+		fullname = ast_variable_retrieve(rtdata, mailbox, "fullname");
+		hidefromdir = ast_variable_retrieve(rtdata, mailbox, "hidefromdir");
+		snprintf(tmp, sizeof(tmp), "no-password,%s,hidefromdir=%s",
+			 fullname ? fullname : "",
+			 hidefromdir ? hidefromdir : "no");
+		var = ast_variable_new(mailbox, tmp);
+		if (var)
+			ast_variable_append(cat, var);
+		else
+			ast_log(LOG_WARNING, "Out of memory adding mailbox '%s'\n", mailbox);
+		mailbox = ast_category_browse(rtdata, mailbox);
 	}
+	ast_config_destroy(rtdata);
 
 	return cfg;
 }
@@ -336,7 +329,7 @@ static int do_directory(struct ast_channel *chan, struct ast_config *cfg, char *
 			while(v) {
 				/* Find a candidate extension */
 				start = strdup(v->value);
-				if (start) {
+				if (start && !strcasestr(start, "hidefromdir=yes")) {
 					stringp=start;
 					strsep(&stringp, ",");
 					pos = strsep(&stringp, ",");
@@ -435,10 +428,8 @@ top:
 		dialcontext = context;
 
 	cfg = realtime_directory(context);
-	if (!cfg) {
-		ast_log(LOG_WARNING, "Unable to open/create directory configuration %s\n", DIRECTORY_CONFIG);
+	if (!cfg)
 		return -1;
-	}
 
 	LOCAL_USER_ADD(u);
 
diff --git a/configs/voicemail.conf.sample b/configs/voicemail.conf.sample
index 52a7278116e627fc7ba7a0627f2fb97ac7542581..8cff4a803fb06a9e143cfd7713c4b99800dcebad 100755
--- a/configs/voicemail.conf.sample
+++ b/configs/voicemail.conf.sample
@@ -133,7 +133,9 @@ sendvoicemail=yes	; Context to Send voicemail from [option 5 from the advanced m
 			;     determined by the password being the same as
 			;     the mailbox number.  The default is "no".
 ; forcegreetings=no	; This is the same as forcename, except for recording
-			;     greetings.  The default is "no".			
+			;     greetings.  The default is "no".
+; hidefromdir=yes	; Hide this mailbox from the directory produced by app_directory
+			;     The default is "no".
 
 [zonemessages]
 eastern=America/New_York|'vm-received' Q 'digits/at' IMp