diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 85e1c38e00b823c624b5a7700e05947b1c503f37..1dd7aa0d07263315f53bd93203237849fca30e90 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -2026,10 +2026,6 @@ static void free_user(struct ast_vm_user *vmu)
 		return;
 	}
 
-	if (!ast_strlen_zero(vmu->mailbox)) {
-		ast_delete_mwi_state_full(vmu->mailbox, vmu->context, NULL);
-	}
-
 	ast_free(vmu->email);
 	vmu->email = NULL;
 	ast_free(vmu->emailbody);
@@ -2042,6 +2038,19 @@ static void free_user(struct ast_vm_user *vmu)
 	}
 }
 
+static void free_user_final(struct ast_vm_user *vmu)
+{
+	if (!vmu) {
+		return;
+	}
+
+	if (!ast_strlen_zero(vmu->mailbox)) {
+		ast_delete_mwi_state_full(vmu->mailbox, vmu->context, NULL);
+	}
+
+	free_user(vmu);
+}
+
 static int vm_allocate_dh(struct vm_state *vms, struct ast_vm_user *vmu, int count_msg) {
 
 	int arraysize = (vmu->maxmsg > count_msg ? vmu->maxmsg : count_msg);
@@ -13491,7 +13500,7 @@ static void free_vm_users(void)
 	AST_LIST_LOCK(&users);
 	while ((current = AST_LIST_REMOVE_HEAD(&users, list))) {
 		ast_set_flag(current, VM_ALLOCED);
-		free_user(current);
+		free_user_final(current);
 	}
 	AST_LIST_UNLOCK(&users);
 }