diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 6e19c95c2bc1420e874ce2b0da500edf3a025907..7b9a37dfd7cdd3be5819424b98f6efd896b1dacc 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -5898,7 +5898,6 @@ static int load_config(void)
 	}
 	zones = NULL;
 	zonesl = NULL;
-	AST_LIST_HEAD_INIT(&users);
 	memset(ext_pass_cmd, 0, sizeof(ext_pass_cmd));
 
 	if (cfg) {
diff --git a/include/asterisk/linkedlists.h b/include/asterisk/linkedlists.h
index 49dd3a10dc56454d486eabd8d3f91128ad3ebcdc..17d92c57ab0d294680cfdddad4cd4193d3d41bc5 100644
--- a/include/asterisk/linkedlists.h
+++ b/include/asterisk/linkedlists.h
@@ -298,9 +298,11 @@ struct {								\
 #define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field) {				\
 	typeof((head)->first) __list_next;						\
 	typeof((head)->first) __list_prev = NULL;					\
-	for ((var) = (head)->first,  __list_next = (var) ? (var)->field.next : NULL;	\
+	typeof((head)->first) __new_prev = NULL;					\
+	for ((var) = (head)->first, __new_prev = (var),					\
+	      __list_next = (var) ? (var)->field.next : NULL;				\
 	     (var);									\
-	     __list_prev = (var), (var) = __list_next,					\
+	     __list_prev = __new_prev, (var) = __list_next,				\
 	     __list_next = (var) ? (var)->field.next : NULL				\
 	    )
 
@@ -316,6 +318,7 @@ struct {								\
   previous entry, if any).
  */
 #define AST_LIST_REMOVE_CURRENT(head, field)						\
+	__new_prev = __list_prev;							\
 	if (__list_prev)								\
 		__list_prev->field.next = __list_next;					\
 	else										\
@@ -340,7 +343,8 @@ struct {								\
 	} else {							\
 		(elm)->field.next = (head)->first;			\
 		(head)->first = (elm);					\
-	}										\
+	}								\
+	__new_prev = (elm);						\
 } while (0)
 
 /*!