diff --git a/src/arglist.c b/src/arglist.c
index ad404d8..8e0f4d2 100644
--- a/src/arglist.c
+++ b/src/arglist.c
@@ -1046,7 +1046,7 @@
 	    // Move the already present window to below the current window
 	    if (curwin->w_arg_idx != i)
 	    {
-		for (wpnext = firstwin; wpnext != NULL; wpnext = wpnext->w_next)
+		FOR_ALL_WINDOWS(wpnext)
 		{
 		    if (wpnext->w_arg_idx == i)
 		    {
diff --git a/src/autocmd.c b/src/autocmd.c
index dce23b8..d6945f3 100644
--- a/src/autocmd.c
+++ b/src/autocmd.c
@@ -235,6 +235,10 @@
 
 static AutoPatCmd *active_apc_list = NULL; // stack of active autocommands
 
+// Macro to loop over all the patterns for an autocmd event
+#define FOR_ALL_AUTOCMD_PATTERNS(event, ap) \
+    for ((ap) = first_autopat[(int)(event)]; (ap) != NULL; (ap) = (ap)->next)
+
 /*
  * augroups stores a list of autocmd group names.
  */
@@ -456,7 +460,7 @@
     for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
 					    event = (event_T)((int)event + 1))
 	// loop over all autocommand patterns
-	for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
+	FOR_ALL_AUTOCMD_PATTERNS(event, ap)
 	    if (ap->buflocal_nr == buf->b_fnum)
 	    {
 		au_remove_pat(ap);
@@ -519,7 +523,7 @@
 	for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
 					    event = (event_T)((int)event + 1))
 	{
-	    for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
+	    FOR_ALL_AUTOCMD_PATTERNS(event, ap)
 		if (ap->group == i && ap->pat != NULL)
 		{
 		    give_warning((char_u *)_("W19: Deleting augroup that is still in use"), TRUE);
@@ -1041,7 +1045,7 @@
      */
     if (*pat == NUL)
     {
-	for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
+	FOR_ALL_AUTOCMD_PATTERNS(event, ap)
 	{
 	    if (forceit)  // delete the AutoPat, if it's in the current group
 	    {
@@ -2400,7 +2404,7 @@
     forward_slash(fname);
 #endif
 
-    for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
+    FOR_ALL_AUTOCMD_PATTERNS(event, ap)
 	if (ap->pat != NULL && ap->cmds != NULL
 	      && (ap->buflocal_nr == 0
 		? match_file_pat(NULL, &ap->reg_prog,
diff --git a/src/buffer.c b/src/buffer.c
index cec33b0..8201157 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -2911,7 +2911,7 @@
 {
     wininfo_T	*wip;
 
-    for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+    FOR_ALL_BUF_WININFO(buf, wip)
 	if (wip->wi_win == win)
 	    break;
     if (wip == NULL)
@@ -3004,7 +3004,7 @@
 {
     wininfo_T	*wip;
 
-    for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+    FOR_ALL_BUF_WININFO(buf, wip)
 	if (wip->wi_win == curwin
 #ifdef FEAT_DIFF
 		&& (!skip_diff_buffer || !wininfo_other_tab_diff(wip))
@@ -3019,7 +3019,7 @@
 #ifdef FEAT_DIFF
 	if (skip_diff_buffer)
 	{
-	    for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+	    FOR_ALL_BUF_WININFO(buf, wip)
 		if (!wininfo_other_tab_diff(wip))
 		    break;
 	}
@@ -3132,7 +3132,7 @@
     if (vim_strchr(eap->arg, 't'))
     {
 	ga_init2(&buflist, sizeof(buf_T *), 50);
-	for (buf = firstbuf; buf != NULL; buf = buf->b_next)
+	FOR_ALL_BUFFERS(buf)
 	{
 	    if (ga_grow(&buflist, 1) == OK)
 		((buf_T **)buflist.ga_data)[buflist.ga_len++] = buf;
diff --git a/src/change.c b/src/change.c
index 3ee7198..cfba90b 100644
--- a/src/change.c
+++ b/src/change.c
@@ -172,8 +172,7 @@
 	linenr_T    prev_lnum;
 	linenr_T    prev_lnume;
 
-	for (li = buf->b_recorded_changes->lv_first; li != NULL;
-							      li = li->li_next)
+	FOR_ALL_LIST_ITEMS(buf->b_recorded_changes, li)
 	{
 	    prev_lnum = (linenr_T)dict_get_number(
 				      li->li_tv.vval.v_dict, (char_u *)"lnum");
@@ -362,8 +361,7 @@
     argv[0].v_type = VAR_NUMBER;
     argv[0].vval.v_number = buf->b_fnum; // a:bufnr
 
-
-    for (li = buf->b_recorded_changes->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(buf->b_recorded_changes, li)
     {
 	varnumber_T lnum;
 
diff --git a/src/channel.c b/src/channel.c
index 4db40c9..1dfb28f 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -61,6 +61,12 @@
 static ch_part_T channel_part_read(channel_T *channel);
 static void free_job_options(jobopt_T *opt);
 
+#define FOR_ALL_CHANNELS(ch) \
+    for ((ch) = first_channel; (ch) != NULL; (ch) = (ch)->ch_next)
+
+#define FOR_ALL_JOBS(job) \
+    for ((job) = first_job; (job) != NULL; (job) = (job)->jv_next)
+
 // Whether a redraw is needed for appending a line to a buffer.
 static int channel_need_redraw = FALSE;
 
@@ -476,7 +482,7 @@
     // point.
     ++safe_to_invoke_callback;
 
-    for (ch = first_channel; ch != NULL; ch = ch->ch_next)
+    FOR_ALL_CHANNELS(ch)
 	if (!channel_still_useful(ch)
 				 && (ch->ch_copyID & mask) != (copyID & mask))
 	{
@@ -520,8 +526,7 @@
     ch_part_T	part;
 
     if (fd != INVALID_FD)
-	for (channel = first_channel; channel != NULL;
-						   channel = channel->ch_next)
+	FOR_ALL_CHANNELS(channel)
 	{
 	    for (part = PART_SOCK; part < PART_IN; ++part)
 		if (channel->ch_part[part].ch_fd == fd)
@@ -662,7 +667,7 @@
 {
     channel_T *channel;
 
-    for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+    FOR_ALL_CHANNELS(channel)
 	channel_gui_register(channel);
 }
 
@@ -1569,7 +1574,7 @@
     channel_T	*channel;
     ch_part_T	part;
 
-    for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+    FOR_ALL_CHANNELS(channel)
 	for (part = PART_SOCK; part < PART_COUNT; ++part)
 	{
 	    chanpart_T  *ch_part = &channel->ch_part[part];
@@ -1610,7 +1615,7 @@
 {
     channel_T	*channel;
 
-    for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+    FOR_ALL_CHANNELS(channel)
 	channel_write_input(channel);
 }
 
@@ -1625,7 +1630,7 @@
 
     // There could be more than one channel for the buffer, loop over all of
     // them.
-    for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+    FOR_ALL_CHANNELS(channel)
     {
 	chanpart_T  *in_part = &channel->ch_part[PART_IN];
 	linenr_T    lnum;
@@ -2604,7 +2609,7 @@
 	// Find channels reading from this buffer and adjust their
 	// next-to-read line number.
 	buffer->b_write_to_channel = TRUE;
-	for (ch = first_channel; ch != NULL; ch = ch->ch_next)
+	FOR_ALL_CHANNELS(ch)
 	{
 	    chanpart_T  *in_part = &ch->ch_part[PART_IN];
 
@@ -3180,7 +3185,7 @@
     channel_T *channel;
 
     ch_log(NULL, "channel_free_all()");
-    for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+    FOR_ALL_CHANNELS(channel)
 	channel_clear(channel);
 }
 #endif
@@ -3202,7 +3207,7 @@
     int		maxfd = maxfd_arg;
     channel_T	*ch;
 
-    for (ch = first_channel; ch != NULL; ch = ch->ch_next)
+    FOR_ALL_CHANNELS(ch)
     {
 	chanpart_T  *in_part = &ch->ch_part[PART_IN];
 
@@ -3227,7 +3232,7 @@
     int		nfd = nfd_in;
     channel_T	*ch;
 
-    for (ch = first_channel; ch != NULL; ch = ch->ch_next)
+    FOR_ALL_CHANNELS(ch)
     {
 	chanpart_T  *in_part = &ch->ch_part[PART_IN];
 
@@ -3821,7 +3826,7 @@
     ch_part_T	part;
     sock_T	fd;
 
-    for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+    FOR_ALL_CHANNELS(channel)
     {
 	if (only_keep_open && !channel->ch_keep_open)
 	    continue;
@@ -3854,7 +3859,7 @@
 {
     channel_T	*channel;
 
-    for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+    FOR_ALL_CHANNELS(channel)
 	if (channel->ch_keep_open)
 	    return TRUE;
     return FALSE;
@@ -4234,7 +4239,7 @@
     struct	pollfd *fds = fds_in;
     ch_part_T	part;
 
-    for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+    FOR_ALL_CHANNELS(channel)
     {
 	for (part = PART_SOCK; part < PART_IN; ++part)
 	{
@@ -4281,7 +4286,7 @@
     int		idx;
     chanpart_T	*in_part;
 
-    for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+    FOR_ALL_CHANNELS(channel)
     {
 	for (part = PART_SOCK; part < PART_IN; ++part)
 	{
@@ -4332,7 +4337,7 @@
     fd_set	*wfds = wfds_in;
     ch_part_T	part;
 
-    for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+    FOR_ALL_CHANNELS(channel)
     {
 	for (part = PART_SOCK; part < PART_IN; ++part)
 	{
@@ -4381,7 +4386,7 @@
     ch_part_T	part;
     chanpart_T	*in_part;
 
-    for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+    FOR_ALL_CHANNELS(channel)
     {
 	for (part = PART_SOCK; part < PART_IN; ++part)
 	{
@@ -5471,7 +5476,7 @@
 {
     job_T	*job;
 
-    for (job = first_job; job != NULL; job = job->jv_next)
+    FOR_ALL_JOBS(job)
 	if (job_still_useful(job))
 	{
 	    ch_log(NULL, "GUI not forking because a job is running");
@@ -5570,7 +5575,7 @@
     char_u	*s;
 
     range_list_materialize(l);
-    for (li = l->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(l, li)
     {
 	s = tv_get_string_chk(&li->li_tv);
 	if (s == NULL)
@@ -5695,7 +5700,7 @@
     int		did_free = FALSE;
     job_T	*job;
 
-    for (job = first_job; job != NULL; job = job->jv_next)
+    FOR_ALL_JOBS(job)
 	if ((job->jv_copyID & mask) != (copyID & mask)
 						    && !job_still_useful(job))
 	{
@@ -5781,7 +5786,7 @@
 {
     job_T	*job;
 
-    for (job = first_job; job != NULL; job = job->jv_next)
+    FOR_ALL_JOBS(job)
 	if (job->jv_status == JOB_STARTED && job->jv_stoponexit != NULL)
 	    mch_signal_job(job, job->jv_stoponexit);
 }
@@ -5795,7 +5800,7 @@
 {
     job_T	    *job;
 
-    for (job = first_job; job != NULL; job = job->jv_next)
+    FOR_ALL_JOBS(job)
 	// Only should check if the channel has been closed, if the channel is
 	// open the job won't exit.
 	if ((job->jv_status == JOB_STARTED && !job_channel_still_useful(job))
@@ -6589,7 +6594,7 @@
     job_T	*job;
     typval_T	tv;
 
-    for (job = first_job; job != NULL; job = job->jv_next)
+    FOR_ALL_JOBS(job)
     {
 	tv.v_type = VAR_JOB;
 	tv.vval.v_job = job;
diff --git a/src/cmdexpand.c b/src/cmdexpand.c
index 1f70dc5..4f9b3ca 100644
--- a/src/cmdexpand.c
+++ b/src/cmdexpand.c
@@ -2587,7 +2587,7 @@
 
     ga_init2(&ga, (int)sizeof(char *), 3);
     // Loop over the items in the list.
-    for (li = retlist->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(retlist, li)
     {
 	if (li->li_tv.v_type != VAR_STRING || li->li_tv.vval.v_string == NULL)
 	    continue;  // Skip non-string items and empty strings
diff --git a/src/diff.c b/src/diff.c
index f996904..3d61d49 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -90,6 +90,9 @@
 static int parse_diff_unified(char_u *line, linenr_T *lnum_orig, long *count_orig, linenr_T *lnum_new, long *count_new);
 static int xdiff_out(void *priv, mmbuffer_t *mb, int nbuf);
 
+#define FOR_ALL_DIFFBLOCKS_IN_TAB(tp, dp) \
+    for ((dp) = (tp)->tp_first_diff; (dp) != NULL; (dp) = (dp)->df_next)
+
 /*
  * Called when deleting or unloading a buffer: No longer make a diff with it.
  */
@@ -1857,7 +1860,7 @@
 #endif
 
     // search for a change that includes "lnum" in the list of diffblocks.
-    for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
+    FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
 	if (lnum <= dp->df_lnum[idx] + dp->df_count[idx])
 	    break;
     if (dp == NULL || lnum < dp->df_lnum[idx])
@@ -2069,7 +2072,7 @@
     towin->w_topfill = 0;
 
     // search for a change that includes "lnum" in the list of diffblocks.
-    for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
+    FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
 	if (lnum <= dp->df_lnum[fromidx] + dp->df_count[fromidx])
 	    break;
     if (dp == NULL)
@@ -2374,7 +2377,7 @@
     }
 
     // search for a change that includes "lnum" in the list of diffblocks.
-    for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
+    FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
 	if (lnum <= dp->df_lnum[idx] + dp->df_count[idx])
 	    break;
     if (dp == NULL || diff_check_sanity(curtab, dp) == FAIL)
@@ -2508,7 +2511,7 @@
     if (curtab->tp_first_diff == NULL)
 	return TRUE;
 
-    for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
+    FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
     {
 	// If this change is below the line there can't be any further match.
 	if (dp->df_lnum[idx] - diff_context > lnum)
@@ -3001,7 +3004,7 @@
     if (curtab->tp_first_diff == NULL)		// no diffs today
 	return lnum1;
 
-    for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
+    FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
     {
 	if (dp->df_lnum[idx1] > lnum1)
 	    return lnum1 - baseline;
@@ -3070,7 +3073,7 @@
 	ex_diffupdate(NULL);		// update after a big change
 
     // search for a change that includes "lnum" in the list of diffblocks.
-    for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
+    FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
 	if (lnum <= dp->df_lnum[idx] + dp->df_count[idx])
 	    break;
 
diff --git a/src/eval.c b/src/eval.c
index 7867375..6d666e6 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -3973,11 +3973,11 @@
 	abort = abort || set_ref_in_item(&aucmd_win->w_winvar.di_tv, copyID,
 								  NULL, NULL);
 #ifdef FEAT_PROP_POPUP
-    for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+    FOR_ALL_POPUPWINS(wp)
 	abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID,
 								  NULL, NULL);
     FOR_ALL_TABPAGES(tp)
-	for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+	FOR_ALL_POPUPWINS_IN_TAB(tp, wp)
 		abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID,
 								  NULL, NULL);
 #endif
diff --git a/src/evalbuffer.c b/src/evalbuffer.c
index de6af6a..2c20939 100644
--- a/src/evalbuffer.c
+++ b/src/evalbuffer.c
@@ -117,7 +117,7 @@
 {
     wininfo_T *wip;
 
-    for (wip = curbuf->b_wininfo; wip != NULL; wip = wip->wi_next)
+    FOR_ALL_BUF_WININFO(curbuf, wip)
     {
 	if (wip->wi_win != NULL)
 	{
@@ -572,11 +572,11 @@
     windows = list_alloc();
     if (windows != NULL)
     {
-	for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+	FOR_ALL_POPUPWINS(wp)
 	    if (wp->w_buffer == buf)
 		list_append_number(windows, (varnumber_T)wp->w_id);
 	FOR_ALL_TABPAGES(tp)
-	    for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+	    FOR_ALL_POPUPWINS_IN_TAB(tp, wp)
 		if (wp->w_buffer == buf)
 		    list_append_number(windows, (varnumber_T)wp->w_id);
 
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 6832bf1..0db848c 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -2831,8 +2831,7 @@
 		    if (lv_len > 0)
 		    {
 			range_list_materialize(list);
-			for (li = list->lv_first; li != NULL;
-							 li = li->li_next)
+			FOR_ALL_LIST_ITEMS(list, li)
 			    copy_tv(&li->li_tv, &pt->pt_argv[i++]);
 		    }
 		}
@@ -5021,7 +5020,7 @@
 
     l = argvars[0].vval.v_list;
     range_list_materialize(l);
-    for (li = l->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(argvars[0].vval.v_list, li)
     {
 	msg_puts((char *)tv_get_string(&li->li_tv));
 	msg_putchar('\n');
diff --git a/src/evalvars.c b/src/evalvars.c
index 35d038d..7e40886 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -1698,7 +1698,7 @@
 		    l->lv_lock &= ~VAR_LOCKED;
 		if ((deep < 0 || deep > 1) && l->lv_first != &range_list_item)
 		    // recursive: lock/unlock the items the List contains
-		    for (li = l->lv_first; li != NULL; li = li->li_next)
+		    FOR_ALL_LIST_ITEMS(l, li)
 			item_lock(&li->li_tv, deep - 1, lock);
 	    }
 	    break;
diff --git a/src/evalwindow.c b/src/evalwindow.c
index 534a047..ab4ba83 100644
--- a/src/evalwindow.c
+++ b/src/evalwindow.c
@@ -106,14 +106,14 @@
 #ifdef FEAT_PROP_POPUP
     // popup windows are in separate lists
      FOR_ALL_TABPAGES(tp)
-	 for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+	 FOR_ALL_POPUPWINS_IN_TAB(tp, wp)
 	     if (wp->w_id == id)
 	     {
 		 if (tpp != NULL)
 		     *tpp = tp;
 		 return wp;
 	     }
-    for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+    FOR_ALL_POPUPWINS(wp)
 	if (wp->w_id == id)
 	{
 	    if (tpp != NULL)
@@ -188,7 +188,7 @@
 	    if (wp->w_id == nr)
 		return wp;
 	// check global popup windows
-	for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+	FOR_ALL_POPUPWINS(wp)
 	    if (wp->w_id == nr)
 		return wp;
 #endif
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index bbaff39..59f04a5 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -303,7 +303,7 @@
     // buffers in other tabs
     FOR_ALL_TABPAGES(tp)
 	if (tp != curtab)
-	    for (wp = tp->tp_firstwin; wp != NULL; wp = wp->w_next)
+	    FOR_ALL_WINDOWS_IN_TAB(tp, wp)
 		add_bufnum(bufnrs, &bufnum, wp->w_buffer->b_fnum);
 
     // any other buffer
@@ -477,7 +477,7 @@
 	// great speed improvement.
 	save_ei = au_event_disable(",Syntax");
 
-	for (buf = firstbuf; buf != NULL; buf = buf->b_next)
+	FOR_ALL_BUFFERS(buf)
 	    buf->b_flags &= ~BF_SYN_SET;
 	buf = curbuf;
     }
diff --git a/src/filepath.c b/src/filepath.c
index 49b814f..37455a2 100644
--- a/src/filepath.c
+++ b/src/filepath.c
@@ -1917,7 +1917,7 @@
 	if (list == NULL)
 	    return;
 	range_list_materialize(list);
-	for (li = list->lv_first; li != NULL; li = li->li_next)
+	FOR_ALL_LIST_ITEMS(list, li)
 	    if (tv_get_string_chk(&li->li_tv) == NULL)
 		return;
     }
diff --git a/src/globals.h b/src/globals.h
index 290f07d..ac48a79 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -676,6 +676,11 @@
 	for ((wp) = ((tp) == curtab) \
 		? firstwin : (tp)->tp_firstwin; (wp); (wp) = (wp)->w_next)
 
+#define FOR_ALL_POPUPWINS(wp) \
+    for ((wp) = first_popupwin; (wp) != NULL; (wp) = (wp)->w_next)
+#define FOR_ALL_POPUPWINS_IN_TAB(tp, wp) \
+    for ((wp) = (tp)->tp_first_popupwin; (wp) != NULL; (wp) = (wp)->w_next)
+
 
 EXTERN win_T	*curwin;	// currently active window
 
@@ -716,6 +721,9 @@
 
 #define FOR_ALL_BUFFERS(buf) for (buf = firstbuf; buf != NULL; buf = buf->b_next)
 
+#define FOR_ALL_BUF_WININFO(buf, wip) \
+    for ((wip) = (buf)->b_wininfo; (wip) != NULL; (wip) = (wip)->wi_next)
+
 // Iterate through all the signs placed in a buffer
 #define FOR_ALL_SIGNS_IN_BUF(buf, sign) \
 	for (sign = buf->b_signlist; sign != NULL; sign = sign->se_next)
@@ -1469,6 +1477,9 @@
 // Line in which spell checking wasn't highlighted because it touched the
 // cursor position in Insert mode.
 EXTERN linenr_T		spell_redraw_lnum INIT(= 0);
+
+#define FOR_ALL_SPELL_LANGS(slang) \
+    for ((slang) = first_lang; (slang) != NULL; (slang) = slang->sl_next)
 #endif
 
 #ifdef FEAT_CONCEAL
@@ -1822,3 +1833,6 @@
 # define REPEATED_MSG_LOOKING	    1
 # define REPEATED_MSG_SAFESTATE	    2
 #endif
+
+#define FOR_ALL_LIST_ITEMS(l, li) \
+    for ((li) = (l)->lv_first; (li) != NULL; (li) = (li)->li_next)
diff --git a/src/gui.c b/src/gui.c
index 85e4628..2d60081 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -4189,7 +4189,7 @@
     // avoid that moving components around generates events
     ++hold_gui_events;
 
-    for (wp = firstwin; wp != NULL; wp = W_NEXT(wp))
+    FOR_ALL_WINDOWS(wp)
     {
 	if (wp->w_buffer == NULL)	// just in case
 	    continue;
diff --git a/src/if_py_both.h b/src/if_py_both.h
index c4d82e7..0d70de2 100644
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -786,7 +786,7 @@
 	}
 
 	range_list_materialize(list);
-	for (curr = list->lv_first; curr != NULL; curr = curr->li_next)
+	FOR_ALL_LIST_ITEMS(list, curr)
 	{
 	    if (!(newObj = VimToPython(&curr->li_tv, depth + 1, lookup_dict)))
 	    {
@@ -3035,7 +3035,7 @@
 		    return NULL;
 		}
 		curtv = argv;
-		for (li = argslist->lv_first; li != NULL; li = li->li_next)
+		FOR_ALL_LIST_ITEMS(argslist, li)
 		    copy_tv(&li->li_tv, curtv++);
 	    }
 	    list_unref(argslist);
diff --git a/src/if_ruby.c b/src/if_ruby.c
index 80481e7..9b6d388 100644
--- a/src/if_ruby.c
+++ b/src/if_ruby.c
@@ -1147,7 +1147,7 @@
 
 	if (list != NULL)
 	{
-	    for (curr = list->lv_first; curr != NULL; curr = curr->li_next)
+	    FOR_ALL_LIST_ITEMS(list, curr)
 		rb_ary_push(result, vim_to_ruby(&curr->li_tv));
 	}
     }
diff --git a/src/insexpand.c b/src/insexpand.c
index 0b2435f..259acb9 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -2331,7 +2331,7 @@
 
     // Go through the List with matches and add each of them.
     range_list_materialize(list);
-    for (li = list->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(list, li)
     {
 	if (ins_compl_add_tv(&li->li_tv, dir) == OK)
 	    // if dir was BACKWARD then honor it just once
@@ -2513,7 +2513,7 @@
     {
 	what_flag = 0;
 	range_list_materialize(what_list);
-	for (item = what_list->lv_first; item != NULL; item = item->li_next)
+	FOR_ALL_LIST_ITEMS(what_list, item)
 	{
 	    char_u *what = tv_get_string(&item->li_tv);
 
diff --git a/src/list.c b/src/list.c
index 918626e..a7f4d40 100644
--- a/src/list.c
+++ b/src/list.c
@@ -1109,7 +1109,7 @@
     char_u	*s;
 
     range_list_materialize(list);
-    for (li = list->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(list, li)
     {
 	for (s = tv_get_string(&li->li_tv); *s != NUL; ++s)
 	{
@@ -1207,7 +1207,7 @@
 	else
 	    char2bytes = mb_char2bytes;
 
-	for (li = l->lv_first; li != NULL; li = li->li_next)
+	FOR_ALL_LIST_ITEMS(l, li)
 	{
 	    buf[(*char2bytes)(tv_get_number(&li->li_tv), buf)] = NUL;
 	    ga_concat(&ga, buf);
@@ -1216,7 +1216,7 @@
     }
     else if (ga_grow(&ga, list_len(l) + 1) == OK)
     {
-	for (li = l->lv_first; li != NULL; li = li->li_next)
+	FOR_ALL_LIST_ITEMS(l, li)
 	    ga_append(&ga, tv_get_number(&li->li_tv));
 	ga_append(&ga, NUL);
     }
@@ -1579,7 +1579,7 @@
 	if (sort)
 	{
 	    // sort(): ptrs will be the list to sort
-	    for (li = l->lv_first; li != NULL; li = li->li_next)
+	    FOR_ALL_LIST_ITEMS(l, li)
 	    {
 		ptrs[i].item = li;
 		ptrs[i].idx = i;
diff --git a/src/misc2.c b/src/misc2.c
index 864d1fd..4918189 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -4348,7 +4348,7 @@
     if (*argv == NULL)
 	return FAIL;
     *argc = 0;
-    for (li = l->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(l, li)
     {
 	s = tv_get_string_chk(&li->li_tv);
 	if (s == NULL)
diff --git a/src/netbeans.c b/src/netbeans.c
index f55f388..4d79a2e 100644
--- a/src/netbeans.c
+++ b/src/netbeans.c
@@ -2982,7 +2982,7 @@
     if (!NETBEANS_OPEN)
 	return FALSE;
 
-    for (p = curbuf->b_signlist; p != NULL; p = p->se_next)
+    FOR_ALL_SIGNS_IN_BUF(curbuf, p)
 	if (p->se_id >= GUARDEDOFFSET)
 	    for (lnum = top + 1; lnum < bot; lnum++)
 		if (lnum == p->se_lnum)
@@ -3095,7 +3095,7 @@
     if (!NETBEANS_OPEN)
 	return;
 
-    for (p = curbuf->b_signlist; p != NULL; p = p->se_next)
+    FOR_ALL_SIGNS_IN_BUF(curbuf, p)
     {
 	if (p->se_lnum == lnum && p->se_next && p->se_next->se_lnum == lnum)
 	{
diff --git a/src/popupwin.c b/src/popupwin.c
index 947dd91..3a0dcb9 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -835,8 +835,7 @@
 	    listitem_T *li;
 
 	    ok = TRUE;
-	    for (li = di->di_tv.vval.v_list->lv_first; li != NULL;
-							      li = li->li_next)
+	    FOR_ALL_LIST_ITEMS(di->di_tv.vval.v_list, li)
 	    {
 		if (li->li_tv.v_type != VAR_LIST
 			|| li->li_tv.vval.v_list == NULL
@@ -967,7 +966,7 @@
     linenr_T    lnum = 0;
     char_u	*p;
 
-    for (li = l->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(l, li)
 	if (li->li_tv.v_type == VAR_STRING)
 	{
 	    p = li->li_tv.vval.v_string;
@@ -989,7 +988,7 @@
     dict_T	*dict;
 
     // first add the text lines
-    for (li = l->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(l, li)
     {
 	if (li->li_tv.v_type != VAR_DICT)
 	{
@@ -1022,7 +1021,7 @@
 	    plist = di->di_tv.vval.v_list;
 	    if (plist != NULL)
 	    {
-		for (pli = plist->lv_first; pli != NULL; pli = pli->li_next)
+		FOR_ALL_LIST_ITEMS(plist, pli)
 		{
 		    if (pli->li_tv.v_type != VAR_DICT)
 		    {
@@ -2881,12 +2880,12 @@
 	{
 	    win_T *twp;
 
-	     for (twp = tp->tp_first_popupwin; twp != NULL; twp = twp->w_next)
-		 if (twp->w_id == id)
-		     break;
-	     if (twp != NULL)
-		 break;
-	     ++i;
+	    FOR_ALL_POPUPWINS_IN_TAB(tp, twp)
+		if (twp->w_id == id)
+		    break;
+	    if (twp != NULL)
+		break;
+	    ++i;
 	}
 	if (tp == NULL)
 	    i = -1;  // must be global
@@ -2954,9 +2953,9 @@
 {
     win_T *wp;
 
-    for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+    FOR_ALL_POPUPWINS(wp)
 	wp->w_popup_handled &= ~handled_flag;
-    for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+    FOR_ALL_POPUPWINS_IN_TAB(curtab, wp)
 	wp->w_popup_handled &= ~handled_flag;
 }
 
@@ -2975,7 +2974,7 @@
 
     found_zindex = lowest ? INT_MAX : 0;
     found_wp = NULL;
-    for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+    FOR_ALL_POPUPWINS(wp)
 	if ((wp->w_popup_handled & handled_flag) == 0
 		&& (wp->w_popup_flags & POPF_HIDDEN) == 0
 		&& (lowest ? wp->w_zindex < found_zindex
@@ -2984,7 +2983,7 @@
 	    found_zindex = wp->w_zindex;
 	    found_wp = wp;
 	}
-    for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+    FOR_ALL_POPUPWINS_IN_TAB(curtab, wp)
 	if ((wp->w_popup_handled & handled_flag) == 0
 		&& (wp->w_popup_flags & POPF_HIDDEN) == 0
 		&& (lowest ? wp->w_zindex < found_zindex
@@ -3157,7 +3156,7 @@
 	return;
     cells = wp->w_popup_mask_cells;
 
-    for (lio = wp->w_popup_mask->lv_first; lio != NULL; lio = lio->li_next)
+    FOR_ALL_LIST_ITEMS(wp->w_popup_mask, lio)
     {
 	int cols, cole;
 	int lines, linee;
@@ -3215,7 +3214,7 @@
 	int		lines, linee;
 	int		col, line;
 
-	for (lio = wp->w_popup_mask->lv_first; lio != NULL; lio = lio->li_next)
+	FOR_ALL_LIST_ITEMS(wp->w_popup_mask, lio)
 	{
 	    li = lio->li_tv.vval.v_list->lv_first;
 	    cols = tv_get_number(&li->li_tv);
@@ -3325,12 +3324,12 @@
 
     // Check if any popup window buffer has changed and if any popup connected
     // to a text property has become visible.
-    for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+    FOR_ALL_POPUPWINS(wp)
 	if (wp->w_popup_flags & POPF_HIDDEN)
 	    popup_mask_refresh |= check_popup_unhidden(wp);
 	else if (popup_need_position_adjust(wp))
 	    popup_mask_refresh = TRUE;
-    for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+    FOR_ALL_POPUPWINS_IN_TAB(curtab, wp)
 	if (wp->w_popup_flags & POPF_HIDDEN)
 	    popup_mask_refresh |= check_popup_unhidden(wp);
 	else if (popup_need_position_adjust(wp))
@@ -3838,7 +3837,7 @@
     win_T *wp;
 
     // Preview window popup is always local to tab page.
-    for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+    FOR_ALL_POPUPWINS_IN_TAB(curtab, wp)
 	if (wp->w_p_pvw)
 	    return wp;
     return NULL;
@@ -3854,7 +3853,7 @@
     win_T *wp;
 
     // info window popup is always local to tab page.
-    for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+    FOR_ALL_POPUPWINS_IN_TAB(curtab, wp)
 	if (wp->w_popup_flags & POPF_INFO)
 	    return wp;
     return NULL;
diff --git a/src/quickfix.c b/src/quickfix.c
index f82a187..127811a 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -6911,7 +6911,7 @@
 	qf_store_title(qfl, title);
     }
 
-    for (li = list->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(list, li)
     {
 	if (li->li_tv.v_type != VAR_DICT)
 	    continue; // Skip non-dict items
diff --git a/src/screen.c b/src/screen.c
index ad548d2..d73e7c6 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -2572,11 +2572,11 @@
 	win_free_lsize(aucmd_win);
 #ifdef FEAT_PROP_POPUP
     // global popup windows
-    for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+    FOR_ALL_POPUPWINS(wp)
 	win_free_lsize(wp);
     // tab-local popup windows
     FOR_ALL_TABPAGES(tp)
-	for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+	FOR_ALL_POPUPWINS_IN_TAB(tp, wp)
 	    win_free_lsize(wp);
 #endif
 
@@ -2614,7 +2614,7 @@
 	outofmem = TRUE;
 #ifdef FEAT_PROP_POPUP
     // global popup windows
-    for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+    FOR_ALL_POPUPWINS(wp)
 	if (win_alloc_lines(wp) == FAIL)
 	{
 	    outofmem = TRUE;
@@ -2622,7 +2622,7 @@
 	}
     // tab-local popup windows
     FOR_ALL_TABPAGES(tp)
-	for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+	FOR_ALL_POPUPWINS_IN_TAB(tp, wp)
 	    if (win_alloc_lines(wp) == FAIL)
 	    {
 		outofmem = TRUE;
diff --git a/src/sign.c b/src/sign.c
index 1964c83..fb7d569 100644
--- a/src/sign.c
+++ b/src/sign.c
@@ -57,6 +57,9 @@
 # define SIGNCMD_LAST	6
 };
 
+#define FOR_ALL_SIGNS(sp)	\
+    for ((sp) = first_sign; (sp) != NULL; (sp) = (sp)->sn_next)
+
 static hashtab_T	sg_table;	// sign group (signgroup_T) hashtable
 static int		next_sign_id = 1; // next sign id in the global group
 
@@ -294,7 +297,7 @@
 {
     sign_T	*sp;
 
-    for (sp = first_sign; sp != NULL; sp = sp->sn_next)
+    FOR_ALL_SIGNS(sp)
 	if (sp->sn_typenr == typenr)
 	    return sp;
     return NULL;
@@ -308,7 +311,7 @@
 {
     sign_T	*sp;
 
-    for (sp = first_sign; sp != NULL; sp = sp->sn_next)
+    FOR_ALL_SIGNS(sp)
 	if (sp->sn_typenr == typenr)
 	    return sp->sn_name;
     return (char_u *)_("[Deleted]");
@@ -880,7 +883,7 @@
 
     if (sp_prev != NULL)
 	*sp_prev = NULL;
-    for (sp = first_sign; sp != NULL; sp = sp->sn_next)
+    FOR_ALL_SIGNS(sp)
     {
 	if (STRCMP(sp->sn_name, name) == 0)
 	    break;
@@ -1153,7 +1156,7 @@
     if (sign_group != NULL && (*sign_group == '*' || *sign_group == '\0'))
 	return FAIL;
 
-    for (sp = first_sign; sp != NULL; sp = sp->sn_next)
+    FOR_ALL_SIGNS(sp)
 	if (STRCMP(sp->sn_name, sign_name) == 0)
 	    break;
     if (sp == NULL)
@@ -1830,7 +1833,7 @@
 {
     sign_T	*sp;
 
-    for (sp = first_sign; sp != NULL; sp = sp->sn_next)
+    FOR_ALL_SIGNS(sp)
 	if (sp->sn_icon != NULL)
 	    sp->sn_image = gui_mch_register_sign(sp->sn_icon);
 }
@@ -1911,7 +1914,7 @@
 {
     sign_T	*sp;
 
-    for (sp = first_sign; sp != NULL; sp = sp->sn_next)
+    FOR_ALL_SIGNS(sp)
 	if (sp->sn_typenr == typenr)
 	    return sp->sn_image;
     return NULL;
@@ -1950,7 +1953,7 @@
 
     // Complete with name of signs already defined
     current_idx = 0;
-    for (sp = first_sign; sp != NULL; sp = sp->sn_next)
+    FOR_ALL_SIGNS(sp)
 	if (current_idx++ == idx)
 	    return sp->sn_name;
     return NULL;
@@ -2212,7 +2215,7 @@
     listitem_T	*li;
     int		retval;
 
-    for (li = l->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(l, li)
     {
 	retval = -1;
 	if (li->li_tv.v_type == VAR_DICT)
@@ -2547,7 +2550,7 @@
     }
 
     // Process the List of sign attributes
-    for (li = argvars[0].vval.v_list->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(argvars[0].vval.v_list, li)
     {
 	sign_id = -1;
 	if (li->li_tv.v_type == VAR_DICT)
@@ -2569,7 +2572,7 @@
     listitem_T	*li;
     int		retval;
 
-    for (li = l->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(l, li)
     {
 	retval = -1;
 	name = tv_get_string_chk(&li->li_tv);
@@ -2765,7 +2768,7 @@
 	return;
     }
 
-    for (li = argvars[0].vval.v_list->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(argvars[0].vval.v_list, li)
     {
 	retval = -1;
 	if (li->li_tv.v_type == VAR_DICT)
diff --git a/src/spell.c b/src/spell.c
index 5fdcc3a..99e030f 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -2031,7 +2031,7 @@
 		dont_use_region = TRUE;
 
 	    // Check if we loaded this language before.
-	    for (slang = first_lang; slang != NULL; slang = slang->sl_next)
+	    FOR_ALL_SPELL_LANGS(slang)
 		if (fullpathcmp(lang, slang->sl_fname, FALSE, TRUE) == FPC_SAME)
 		    break;
 	}
@@ -2048,7 +2048,7 @@
 		dont_use_region = TRUE;
 
 	    // Check if we loaded this language before.
-	    for (slang = first_lang; slang != NULL; slang = slang->sl_next)
+	    FOR_ALL_SPELL_LANGS(slang)
 		if (STRICMP(lang, slang->sl_name) == 0)
 		    break;
 	}
@@ -2083,7 +2083,7 @@
 	/*
 	 * Loop over the languages, there can be several files for "lang".
 	 */
-	for (slang = first_lang; slang != NULL; slang = slang->sl_next)
+	FOR_ALL_SPELL_LANGS(slang)
 	    if (filename ? fullpathcmp(lang, slang->sl_fname, FALSE, TRUE)
 								    == FPC_SAME
 			 : STRICMP(lang, slang->sl_name) == 0)
@@ -2162,7 +2162,7 @@
 	}
 
 	// Check if it was loaded already.
-	for (slang = first_lang; slang != NULL; slang = slang->sl_next)
+	FOR_ALL_SPELL_LANGS(slang)
 	    if (fullpathcmp(spf_name, slang->sl_fname, FALSE, TRUE)
 								== FPC_SAME)
 		break;
diff --git a/src/spellfile.c b/src/spellfile.c
index 9500813..920e051 100644
--- a/src/spellfile.c
+++ b/src/spellfile.c
@@ -296,6 +296,12 @@
 #define CF_WORD		0x01
 #define CF_UPPER	0x02
 
+/*
+ * Loop through all the siblings of a node (including the node)
+ */
+#define FOR_ALL_NODE_SIBLINGS(node, np) \
+    for ((np) = (node); (np) != NULL; (np) = (np)->wn_sibling)
+
 static int set_spell_finish(spelltab_T	*new_st);
 static int write_spell_prefcond(FILE *fd, garray_T *gap);
 static int read_region_section(FILE *fd, slang_T *slang, int len);
@@ -1737,7 +1743,7 @@
     slang_T	*slang;
     int		didit = FALSE;
 
-    for (slang = first_lang; slang != NULL; slang = slang->sl_next)
+    FOR_ALL_SPELL_LANGS(slang)
     {
 	if (fullpathcmp(fname, slang->sl_fname, FALSE, TRUE) == FPC_SAME)
 	{
@@ -2081,7 +2087,7 @@
 {
     wordnode_T	*np;
 
-    for (np = node; np != NULL; np = np->wn_sibling)
+    FOR_ALL_NODE_SIBLINGS(node, np)
     {
 	np->wn_u1.index = FALSE;
 	spell_clear_flags(np->wn_child);
@@ -4427,7 +4433,7 @@
 	{
 	    --node->wn_refs;
 	    copyprev = prev;
-	    for (copyp = node; copyp != NULL; copyp = copyp->wn_sibling)
+	    FOR_ALL_NODE_SIBLINGS(node, copyp)
 	    {
 		// Allocate a new node and copy the info.
 		np = get_wordnode(spin);
@@ -4618,7 +4624,7 @@
 
     if (--node->wn_refs == 0)
     {
-	for (np = node; np != NULL; np = np->wn_sibling)
+	FOR_ALL_NODE_SIBLINGS(node, np)
 	{
 	    if (np->wn_child != NULL)
 		cnt += deref_wordnode(spin, np->wn_child);
@@ -4761,7 +4767,7 @@
      */
     node->wn_u1.hashkey[0] = len;
     nr = 0;
-    for (np = node; np != NULL; np = np->wn_sibling)
+    FOR_ALL_NODE_SIBLINGS(node, np)
     {
 	if (np->wn_byte == NUL)
 	    // end node: use wn_flags, wn_region and wn_affixID
@@ -5252,7 +5258,7 @@
     wordnode_T	*np;
 
     if (node != NULL)
-	for (np = node; np != NULL; np = np->wn_sibling)
+	FOR_ALL_NODE_SIBLINGS(node, np)
 	{
 	    np->wn_u1.index = 0;
 	    np->wn_u2.wnode = NULL;
@@ -5296,7 +5302,7 @@
     node->wn_u1.index = idx;
 
     // Count the number of siblings.
-    for (np = node; np != NULL; np = np->wn_sibling)
+    FOR_ALL_NODE_SIBLINGS(node, np)
 	++siblingcount;
 
     // Write the sibling count.
@@ -5304,7 +5310,7 @@
 	putc(siblingcount, fd);				// <siblingcount>
 
     // Write each sibling byte and optionally extra info.
-    for (np = node; np != NULL; np = np->wn_sibling)
+    FOR_ALL_NODE_SIBLINGS(node, np)
     {
 	if (np->wn_byte == 0)
 	{
@@ -5392,7 +5398,7 @@
     newindex += siblingcount + 1;
 
     // Recursively dump the children of each sibling.
-    for (np = node; np != NULL; np = np->wn_sibling)
+    FOR_ALL_NODE_SIBLINGS(node, np)
 	if (np->wn_byte != 0 && np->wn_child->wn_u2.wnode == node)
 	    newindex = put_node(fd, np->wn_child, newindex, regionmask,
 								  prefixtree);
@@ -5447,7 +5453,7 @@
      * of the code for the soundfolding stuff.
      * It might have been done already by spell_reload_one().
      */
-    for (slang = first_lang; slang != NULL; slang = slang->sl_next)
+    FOR_ALL_SPELL_LANGS(slang)
 	if (fullpathcmp(wfname, slang->sl_fname, FALSE, TRUE) == FPC_SAME)
 	    break;
     if (slang == NULL)
@@ -5666,7 +5672,7 @@
     int		nr;
     int		prev_nr;
 
-    for (p = node; p != NULL; p = p->wn_sibling)
+    FOR_ALL_NODE_SIBLINGS(node, p)
     {
 	if (p->wn_byte == NUL)
 	{
diff --git a/src/spellsuggest.c b/src/spellsuggest.c
index 267a4a5..b74d30b 100644
--- a/src/spellsuggest.c
+++ b/src/spellsuggest.c
@@ -887,7 +887,7 @@
     if (list != NULL)
     {
 	// Loop over the items in the list.
-	for (li = list->lv_first; li != NULL; li = li->li_next)
+	FOR_ALL_LIST_ITEMS(list, li)
 	    if (li->li_tv.v_type == VAR_LIST)
 	    {
 		// Get the word and the score from the items.
diff --git a/src/tag.c b/src/tag.c
index bf45b21..dc4b9a5 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -1358,7 +1358,7 @@
     }
     taglist = rettv.vval.v_list;
 
-    for (item = taglist->lv_first; item != NULL; item = item->li_next)
+    FOR_ALL_LIST_ITEMS(taglist, item)
     {
 	char_u		*mfp;
 	char_u		*res_name, *res_fname, *res_cmd, *res_kind;
@@ -4191,7 +4191,7 @@
     int		fnum;
 
     // Add one entry at a time to the tag stack
-    for (li = l->lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(l, li)
     {
 	if (li->li_tv.v_type != VAR_DICT || li->li_tv.vval.v_dict == NULL)
 	    continue;				// Skip non-dict items
diff --git a/src/terminal.c b/src/terminal.c
index 2ff697a..d7d23cc 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -183,6 +183,9 @@
 #define MAX_ROW 999999	    // used for tl_dirty_row_end to update all rows
 #define KEY_BUF_LEN 200
 
+#define FOR_ALL_TERMS(term)	\
+    for ((term) = first_term; (term) != NULL; (term) = (term)->tl_next)
+
 /*
  * Functions with separate implementation for MS-Windows and Unix-like systems.
  */
@@ -626,8 +629,7 @@
 	listitem_T	*item;
 
 	ga_init2(&ga, 1, 100);
-	for (item = argvar->vval.v_list->lv_first;
-					item != NULL; item = item->li_next)
+	FOR_ALL_LIST_ITEMS(argvar->vval.v_list, item)
 	{
 	    char_u *s = tv_get_string_chk(&item->li_tv);
 	    char_u *p;
@@ -1892,7 +1894,7 @@
     term_T  *term;
     int	    next_due = next_due_arg;
 
-    for (term = first_term; term != NULL; term = term->tl_next)
+    FOR_ALL_TERMS(term)
     {
 	if (term->tl_timer_set && !term->tl_normal_mode)
 	{
@@ -2175,7 +2177,7 @@
     if (l != NULL)
     {
 	type = get_reg_type(c, &reglen);
-	for (item = l->lv_first; item != NULL; item = item->li_next)
+	FOR_ALL_LIST_ITEMS(l, item)
 	{
 	    char_u *s = tv_get_string(&item->li_tv);
 #ifdef MSWIN
@@ -5701,7 +5703,7 @@
 	return;
 
     l = rettv->vval.v_list;
-    for (tp = first_term; tp != NULL; tp = tp->tl_next)
+    FOR_ALL_TERMS(tp)
 	if (tp != NULL && tp->tl_buffer != NULL)
 	    if (list_append_number(l,
 				   (varnumber_T)tp->tl_buffer->b_fnum) == FAIL)
@@ -6077,7 +6079,7 @@
 {
     term_T	*term;
 
-    for (term = first_term; term != NULL; term = term->tl_next)
+    FOR_ALL_TERMS(term)
 	if (term->tl_job == ch->ch_job)
 	{
 	    if (term->tl_eof_chars != NULL)
diff --git a/src/userfunc.c b/src/userfunc.c
index 5f98f18..62003a8 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -792,7 +792,7 @@
     vars_clear(&fc->l_avars.dv_hashtab);
 
     // Free the a:000 variables.
-    for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next)
+    FOR_ALL_LIST_ITEMS(&fc->l_varlist, li)
 	clear_tv(&li->li_tv);
 
     free_funccal(fc);
@@ -851,7 +851,7 @@
 	free_fc = FALSE;
 
 	// Make a copy of the a:000 items, since we didn't do that above.
-	for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next)
+	FOR_ALL_LIST_ITEMS(&fc->l_varlist, li)
 	    copy_tv(&li->li_tv, &li->li_tv);
     }
 
@@ -1640,7 +1640,7 @@
     int		r = 0;
 
     range_list_materialize(l);
-    for (item = l->lv_first; item != NULL; item = item->li_next)
+    FOR_ALL_LIST_ITEMS(args->vval.v_list, item)
     {
 	if (argc == MAX_FUNC_ARGS - (partial == NULL ? 0 : partial->pt_argc))
 	{
diff --git a/src/version.c b/src/version.c
index 4c5abd6..bb11730 100644
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    500,
+/**/
     499,
 /**/
     498,
diff --git a/src/window.c b/src/window.c
index 964f1ef..7efe7b1 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1428,10 +1428,10 @@
 #ifdef FEAT_PROP_POPUP
     win_T	*wp;
 
-    for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+    FOR_ALL_POPUPWINS(wp)
 	if (wp == win)
 	    return TRUE;
-    for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+    FOR_ALL_POPUPWINS_IN_TAB(curtab, wp)
 	if (wp == win)
 	    return TRUE;
 #endif
@@ -1473,7 +1473,7 @@
 		return TRUE;
 	}
 #ifdef FEAT_PROP_POPUP
-	for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+	FOR_ALL_POPUPWINS_IN_TAB(tp, wp)
 	    if (wp == win)
 		return TRUE;
 #endif
@@ -2276,7 +2276,7 @@
     {
 	nexttp = tp->tp_next;
 	if (tp != curtab)
-	    for (wp = tp->tp_firstwin; wp != NULL; wp = wp->w_next)
+	    FOR_ALL_WINDOWS_IN_TAB(tp, wp)
 		if (wp->w_buffer == buf
 		    && !(wp->w_closing || wp->w_buffer->b_locked > 0))
 		{
@@ -4785,7 +4785,7 @@
     FOR_ALL_TABPAGES(tp)
 	if (tp != curtab)
 	{
-	    for (wp = tp->tp_firstwin; wp != NULL; wp = wp->w_next)
+	    FOR_ALL_WINDOWS_IN_TAB(tp, wp)
 		if (wp->w_buffer == buf)
 		    break;
 	    if (wp != NULL)
@@ -4968,7 +4968,7 @@
     // Remove the window from the b_wininfo lists, it may happen that the
     // freed memory is re-used for another window.
     FOR_ALL_BUFFERS(buf)
-	for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+	FOR_ALL_BUF_WININFO(buf, wip)
 	    if (wip->wi_win == wp)
 		wip->wi_win = NULL;
 
