diff --git a/apps/Makefile b/apps/Makefile
index 589293c1e6bc7a0c462351edf04cbea16a6c75f4..02b705ddb25fd234107cba51a3579eb99ef9ddc4 100644
--- a/apps/Makefile
+++ b/apps/Makefile
@@ -16,23 +16,45 @@ MENUSELECT_CATEGORY=APPS
 MENUSELECT_DESCRIPTION=Applications
 
 MENUSELECT_OPTS_app_directory:=$(MENUSELECT_OPTS_app_voicemail)
-ifneq ($(findstring ODBC_STORAGE,$(MENUSELECT_OPTS_app_voicemail)),)
-  MENUSELECT_DEPENDS_app_voicemail+=$(MENUSELECT_DEPENDS_ODBC_STORAGE)
-endif
-ifneq ($(findstring IMAP_STORAGE,$(MENUSELECT_OPTS_app_voicemail)),)
-  MENUSELECT_DEPENDS_app_voicemail+=$(MENUSELECT_DEPENDS_IMAP_STORAGE)
-endif
 
 all: _all
 
 include $(ASTTOPDIR)/Makefile.moddir_rules
 
+.app_voicemail.moduleinfo: app_voicemail.c
+	@echo "<member name=\"app_voicemail\" displayname=\"$(shell $(GREP) -e AST_MODULE_INFO $< | head -n 1 | cut -d '"' -f 2)\" remove_on_change=\"$(SUBDIR)/$*.o $(SUBDIR)/$*.so\">" > $@
+	echo "<support_level>core</support_level>"  >> $@
+	echo "<defaultenabled>yes</defaultenabled>" >> $@
+	echo "<use type=\"module\">res_adsi</use>" >> $@
+	echo "<use type=\"module\">res_smdi</use>" >> $@
+	echo "</member>" >> $@
+
+.app_voicemail_imap.moduleinfo: app_voicemail_imap.c
+	@echo "<member name=\"app_voicemail_imap\" displayname=\"$(shell $(GREP) -e AST_MODULE_INFO $< | head -n 1 | cut -d '"' -f 2)\" remove_on_change=\"$(SUBDIR)/$*.o $(SUBDIR)/$*.so\">" > $@
+	echo "<support_level>core</support_level>"  >> $@
+	echo "<defaultenabled>no</defaultenabled>" >> $@
+	echo "<depend>imap_tk</depend>" >> $@
+	echo "<use type=\"module\">res_adsi</use>" >> $@
+	echo "<use type=\"module\">res_smdi</use>" >> $@
+	echo "</member>" >> $@
+
+.app_voicemail_odbc.moduleinfo: app_voicemail_odbc.c
+	@echo "<member name=\"app_voicemail_odbc\" displayname=\"$(shell $(GREP) -e AST_MODULE_INFO $< | head -n 1 | cut -d '"' -f 2)\" remove_on_change=\"$(SUBDIR)/$*.o $(SUBDIR)/$*.so\">" > $@
+	echo "<support_level>core</support_level>"  >> $@
+	echo "<defaultenabled>no</defaultenabled>" >> $@
+	echo "<depend>generic_odbc</depend>" >> $@
+	echo "<use type=\"module\">res_adsi</use>" >> $@
+	echo "<use type=\"module\">res_smdi</use>" >> $@
+	echo "</member>" >> $@
+
 $(call MOD_ADD_C,app_confbridge,$(wildcard confbridge/*.c))
 
 app_confbridge.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION)
 app_meetme.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION)
 app_minivm.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION)
-app_voicemail.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION)
+app_voicemail.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION) -DFILE_STORAGE
+app_voicemail_odbc.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION) -DODBC_STORAGE
+app_voicemail_imap.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION) -DIMAP_STORAGE
 app_while.o: _ASTCFLAGS+=$(AST_NO_FORMAT_TRUNCATION)
 
 ifneq ($(findstring $(OSARCH), mingw32 cygwin ),)
diff --git a/apps/app_voicemail_imap.c b/apps/app_voicemail_imap.c
new file mode 120000
index 0000000000000000000000000000000000000000..fdb024a6e7f6d49bc138f2788b822e2d54bf506a
--- /dev/null
+++ b/apps/app_voicemail_imap.c
@@ -0,0 +1 @@
+app_voicemail.c
\ No newline at end of file
diff --git a/apps/app_voicemail_imap.exports.in b/apps/app_voicemail_imap.exports.in
new file mode 120000
index 0000000000000000000000000000000000000000..401e8f224033504c2284f7a118a073b02ca1d9c5
--- /dev/null
+++ b/apps/app_voicemail_imap.exports.in
@@ -0,0 +1 @@
+app_voicemail.exports.in
\ No newline at end of file
diff --git a/apps/app_voicemail_odbc.c b/apps/app_voicemail_odbc.c
new file mode 120000
index 0000000000000000000000000000000000000000..fdb024a6e7f6d49bc138f2788b822e2d54bf506a
--- /dev/null
+++ b/apps/app_voicemail_odbc.c
@@ -0,0 +1 @@
+app_voicemail.c
\ No newline at end of file
diff --git a/apps/app_voicemail_odbc.exports.in b/apps/app_voicemail_odbc.exports.in
new file mode 120000
index 0000000000000000000000000000000000000000..401e8f224033504c2284f7a118a073b02ca1d9c5
--- /dev/null
+++ b/apps/app_voicemail_odbc.exports.in
@@ -0,0 +1 @@
+app_voicemail.exports.in
\ No newline at end of file
diff --git a/configs/samples/modules.conf.sample b/configs/samples/modules.conf.sample
index 793245dc9ba121ebb29a25b4c499ecae0b389a6a..134ab897d6a11742b65156336413724bbf34e2bc 100644
--- a/configs/samples/modules.conf.sample
+++ b/configs/samples/modules.conf.sample
@@ -44,3 +44,10 @@ noload => res_hep_rtcp.so
 
 ; Do not load chan_sip by default, it may conflict with res_pjsip.
 noload => chan_sip.so
+
+; The default voicemail module is app_voicemal. All voicemail modules
+; are mutually exclusive. Therefore it is better to make sure they
+; are not loaded at startup
+;
+noload => app_voicemail_odbc.so
+noload => app_voicemail_imap.so
diff --git a/doc/UPGRADE-staging/Build_all_3_app_voicemail_variants_at_the_same_time.txt b/doc/UPGRADE-staging/Build_all_3_app_voicemail_variants_at_the_same_time.txt
new file mode 100644
index 0000000000000000000000000000000000000000..22fb4f7fa5f40e221c81797262cecb7a1ba053eb
--- /dev/null
+++ b/doc/UPGRADE-staging/Build_all_3_app_voicemail_variants_at_the_same_time.txt
@@ -0,0 +1,9 @@
+Subject: app_voicemail.c
+
+The "Voicemail Build Options" section of menuselect has been removed along with
+the FILE_STORAGE, ODBC_STORAGE and IMAP_STORAGE menuselect options.  All 3 variants
+of the voicemail app can now be built at the same by enabling app_voicemail,
+app_voicemail_imap, and app_voicemail_odbc under the "Applications" section.
+By default, only app_voicemail is enabled.  Also, the modules.conf sample has
+been updated to "noload" app_voicemail_imap and app_voicemail_odbc should they
+all be built.  Packagers must update their build scripts appropriately.