diff --git a/src/quickfix.c b/src/quickfix.c
index 5816319..c43ad60 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -136,18 +136,17 @@
 
 static void	qf_new_list(qf_info_T *qi, char_u *qf_title);
 static int	qf_add_entry(qf_info_T *qi, int qf_idx, char_u *dir, char_u *fname, char_u *module, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid);
-static void	qf_free(qf_info_T *qi, int idx);
+static void	qf_free(qf_list_T *qfl);
 static char_u	*qf_types(int, int);
 static int	qf_get_fnum(qf_info_T *qi, int qf_idx, char_u *, char_u *);
 static char_u	*qf_push_dir(char_u *, struct dir_stack_T **, int is_file_stack);
 static char_u	*qf_pop_dir(struct dir_stack_T **);
-static char_u	*qf_guess_filepath(qf_info_T *qi, int qf_idx, char_u *);
+static char_u	*qf_guess_filepath(qf_list_T *qfl, char_u *);
 static void	qf_fmt_text(char_u *text, char_u *buf, int bufsize);
 static int	qf_win_pos_update(qf_info_T *qi, int old_qf_index);
 static win_T	*qf_find_win(qf_info_T *qi);
 static buf_T	*qf_find_buf(qf_info_T *qi);
 static void	qf_update_buffer(qf_info_T *qi, qfline_T *old_last);
-static void	qf_set_title_var(qf_info_T *qi);
 static void	qf_fill_buffer(qf_info_T *qi, buf_T *buf, qfline_T *old_last);
 static char_u	*get_mef_name(void);
 static buf_T	*load_dummy_buffer(char_u *fname, char_u *dirname_start, char_u *resulting_dir);
@@ -1757,7 +1756,7 @@
     if (!adding)
     {
 	/* Error when creating a new list. Free the new list */
-	qf_free(qi, qi->qf_curlist);
+	qf_free(&qi->qf_lists[qi->qf_curlist]);
 	qi->qf_listcount--;
 	if (qi->qf_curlist > 0)
 	    --qi->qf_curlist;
@@ -1802,15 +1801,15 @@
  * Prepends ':' to the title.
  */
     static void
-qf_store_title(qf_info_T *qi, int qf_idx, char_u *title)
+qf_store_title(qf_list_T *qfl, char_u *title)
 {
-    VIM_CLEAR(qi->qf_lists[qf_idx].qf_title);
+    VIM_CLEAR(qfl->qf_title);
 
     if (title != NULL)
     {
 	char_u *p = alloc((int)STRLEN(title) + 2);
 
-	qi->qf_lists[qf_idx].qf_title = p;
+	qfl->qf_title = p;
 	if (p != NULL)
 	    STRCPY(p, title);
     }
@@ -1847,7 +1846,7 @@
      * way with ":grep'.
      */
     while (qi->qf_listcount > qi->qf_curlist + 1)
-	qf_free(qi, --qi->qf_listcount);
+	qf_free(&qi->qf_lists[--qi->qf_listcount]);
 
     /*
      * When the stack is full, remove to oldest entry
@@ -1855,7 +1854,7 @@
      */
     if (qi->qf_listcount == LISTCOUNT)
     {
-	qf_free(qi, 0);
+	qf_free(&qi->qf_lists[0]);
 	for (i = 1; i < LISTCOUNT; ++i)
 	    qi->qf_lists[i - 1] = qi->qf_lists[i];
 	qi->qf_curlist = LISTCOUNT - 1;
@@ -1863,12 +1862,12 @@
     else
 	qi->qf_curlist = qi->qf_listcount++;
     vim_memset(&qi->qf_lists[qi->qf_curlist], 0, (size_t)(sizeof(qf_list_T)));
-    qf_store_title(qi, qi->qf_curlist, qf_title);
+    qf_store_title(&qi->qf_lists[qi->qf_curlist], qf_title);
     qi->qf_lists[qi->qf_curlist].qf_id = ++last_qf_id;
 }
 
 /*
- * Free a location list
+ * Free a location list stack
  */
     static void
 ll_free_all(qf_info_T **pqi)
@@ -1886,7 +1885,7 @@
     {
 	/* No references to this location list */
 	for (i = 0; i < qi->qf_listcount; ++i)
-	    qf_free(qi, i);
+	    qf_free(&qi->qf_lists[i]);
 	vim_free(qi);
     }
 }
@@ -1909,7 +1908,7 @@
     else
 	/* quickfix list */
 	for (i = 0; i < qi->qf_listcount; ++i)
-	    qf_free(qi, i);
+	    qf_free(&qi->qf_lists[i]);
 }
 
 /*
@@ -1933,6 +1932,7 @@
     int		type,		/* type character */
     int		valid)		/* valid entry */
 {
+    qf_list_T	*qfl = &qi->qf_lists[qf_idx];
     qfline_T	*qfp;
     qfline_T	**lastp;	/* pointer to qf_last or NULL */
 
@@ -1980,12 +1980,12 @@
     qfp->qf_type = type;
     qfp->qf_valid = valid;
 
-    lastp = &qi->qf_lists[qf_idx].qf_last;
+    lastp = &qfl->qf_last;
     if (qf_list_empty(qi, qf_idx))	/* first element in the list */
     {
-	qi->qf_lists[qf_idx].qf_start = qfp;
-	qi->qf_lists[qf_idx].qf_ptr = qfp;
-	qi->qf_lists[qf_idx].qf_index = 0;
+	qfl->qf_start = qfp;
+	qfl->qf_ptr = qfp;
+	qfl->qf_index = 0;
 	qfp->qf_prev = NULL;
     }
     else
@@ -1996,20 +1996,19 @@
     qfp->qf_next = NULL;
     qfp->qf_cleared = FALSE;
     *lastp = qfp;
-    ++qi->qf_lists[qf_idx].qf_count;
-    if (qi->qf_lists[qf_idx].qf_index == 0 && qfp->qf_valid)
+    ++qfl->qf_count;
+    if (qfl->qf_index == 0 && qfp->qf_valid)
 				/* first valid entry */
     {
-	qi->qf_lists[qf_idx].qf_index =
-	    qi->qf_lists[qf_idx].qf_count;
-	qi->qf_lists[qf_idx].qf_ptr = qfp;
+	qfl->qf_index = qfl->qf_count;
+	qfl->qf_ptr = qfp;
     }
 
     return OK;
 }
 
 /*
- * Allocate a new location list
+ * Allocate a new location list stack
  */
     static qf_info_T *
 ll_new_list(void)
@@ -2023,8 +2022,8 @@
 }
 
 /*
- * Return the location list for window 'wp'.
- * If not present, allocate a location list
+ * Return the location list stack for window 'wp'.
+ * If not present, allocate a location list stack
  */
     static qf_info_T *
 ll_get_or_alloc_list(win_T *wp)
@@ -2197,7 +2196,7 @@
 	if (mch_getperm(ptr) < 0)
 	{
 	    vim_free(ptr);
-	    directory = qf_guess_filepath(qi, qf_idx, fname);
+	    directory = qf_guess_filepath(&qi->qf_lists[qf_idx], fname);
 	    if (directory)
 		ptr = concat_fnames(directory, fname, TRUE);
 	    else
@@ -2365,12 +2364,11 @@
  * qf_guess_filepath will return NULL.
  */
     static char_u *
-qf_guess_filepath(qf_info_T *qi, int qf_idx, char_u *filename)
+qf_guess_filepath(qf_list_T *qfl, char_u *filename)
 {
     struct dir_stack_T     *ds_ptr;
     struct dir_stack_T     *ds_tmp;
     char_u		   *fullname;
-    qf_list_T		   *qfl = &qi->qf_lists[qf_idx];
 
     /* no dirs on the stack - there's nothing we can do */
     if (qfl->qf_dir_stack == NULL)
@@ -2436,14 +2434,11 @@
  * Similar to location list.
  */
     static int
-is_qf_entry_present(qf_info_T *qi, qfline_T *qf_ptr)
+is_qf_entry_present(qf_list_T *qfl, qfline_T *qf_ptr)
 {
-    qf_list_T	*qfl;
     qfline_T	*qfp;
     int		i;
 
-    qfl = &qi->qf_lists[qi->qf_curlist];
-
     /* Search for the entry in the current list */
     for (i = 0, qfp = qfl->qf_start; i < qfl->qf_count;
 	    ++i, qfp = qfp->qf_next)
@@ -2462,7 +2457,7 @@
  */
     static qfline_T *
 get_next_valid_entry(
-	qf_info_T	*qi,
+	qf_list_T	*qfl,
 	qfline_T	*qf_ptr,
 	int		*qf_index,
 	int		dir)
@@ -2475,13 +2470,11 @@
 
     do
     {
-	if (idx == qi->qf_lists[qi->qf_curlist].qf_count
-		|| qf_ptr->qf_next == NULL)
+	if (idx == qfl->qf_count || qf_ptr->qf_next == NULL)
 	    return NULL;
 	++idx;
 	qf_ptr = qf_ptr->qf_next;
-    } while ((!qi->qf_lists[qi->qf_curlist].qf_nonevalid
-		&& !qf_ptr->qf_valid)
+    } while ((!qfl->qf_nonevalid && !qf_ptr->qf_valid)
 	    || (dir == FORWARD_FILE && qf_ptr->qf_fnum == old_qf_fnum));
 
     *qf_index = idx;
@@ -2494,7 +2487,7 @@
  */
     static qfline_T *
 get_prev_valid_entry(
-	qf_info_T	*qi,
+	qf_list_T	*qfl,
 	qfline_T	*qf_ptr,
 	int		*qf_index,
 	int		dir)
@@ -2511,8 +2504,7 @@
 	    return NULL;
 	--idx;
 	qf_ptr = qf_ptr->qf_prev;
-    } while ((!qi->qf_lists[qi->qf_curlist].qf_nonevalid
-		&& !qf_ptr->qf_valid)
+    } while ((!qfl->qf_nonevalid && !qf_ptr->qf_valid)
 	    || (dir == BACKWARD_FILE && qf_ptr->qf_fnum == old_qf_fnum));
 
     *qf_index = idx;
@@ -2527,7 +2519,7 @@
  */
     static qfline_T *
 get_nth_valid_entry(
-	qf_info_T	*qi,
+	qf_list_T	*qfl,
 	int		errornr,
 	qfline_T	*qf_ptr,
 	int		*qf_index,
@@ -2544,9 +2536,9 @@
 	prev_index = *qf_index;
 
 	if (dir == FORWARD || dir == FORWARD_FILE)
-	    qf_ptr = get_next_valid_entry(qi, qf_ptr, qf_index, dir);
+	    qf_ptr = get_next_valid_entry(qfl, qf_ptr, qf_index, dir);
 	else
-	    qf_ptr = get_prev_valid_entry(qi, qf_ptr, qf_index, dir);
+	    qf_ptr = get_prev_valid_entry(qfl, qf_ptr, qf_index, dir);
 	if (qf_ptr == NULL)
 	{
 	    qf_ptr = prev_qf_ptr;
@@ -2570,7 +2562,7 @@
  */
     static qfline_T *
 get_nth_entry(
-	qf_info_T	*qi,
+	qf_list_T	*qfl,
 	int		errornr,
 	qfline_T	*qf_ptr,
 	int		*cur_qfidx)
@@ -2584,9 +2576,8 @@
 	qf_ptr = qf_ptr->qf_prev;
     }
     /* New error number is greater than the current error number */
-    while (errornr > qf_idx &&
-	    qf_idx < qi->qf_lists[qi->qf_curlist].qf_count &&
-	    qf_ptr->qf_next != NULL)
+    while (errornr > qf_idx && qf_idx < qfl->qf_count &&
+						qf_ptr->qf_next != NULL)
     {
 	++qf_idx;
 	qf_ptr = qf_ptr->qf_next;
@@ -2784,9 +2775,10 @@
 }
 
 /*
- * Go to a window that shows the specified file. If a window is not found, go
- * to the window just above the quickfix window. This is used for opening a
- * file from a quickfix window and not from a location window.
+ * Go to a window that contains the specified buffer 'qf_fnum'. If a window is
+ * not found, then go to the window just above the quickfix window. This is
+ * used for opening a file from a quickfix window and not from a location
+ * window.
  */
     static void
 qf_goto_win_with_qfl_file(int qf_fnum)
@@ -2899,6 +2891,7 @@
 	int		*opened_window,
 	int		*abort)
 {
+    qf_list_T	*qfl = &qi->qf_lists[qi->qf_curlist];
     int		retval = OK;
 
     if (qf_ptr->qf_type == 1)
@@ -2918,7 +2911,7 @@
     else
     {
 	int old_qf_curlist = qi->qf_curlist;
-	int save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
+	int save_qfid = qfl->qf_id;
 
 	retval = buflist_getfile(qf_ptr->qf_fnum,
 		(linenr_T)1, GETF_SETMARK | GETF_SWITCH, forceit);
@@ -2942,7 +2935,7 @@
 	    }
 	}
 	else if (old_qf_curlist != qi->qf_curlist
-		|| !is_qf_entry_present(qi, qf_ptr))
+		|| !is_qf_entry_present(qfl, qf_ptr))
 	{
 	    if (IS_QF_STACK(qi))
 		EMSG(_("E925: Current quickfix was changed"));
@@ -3087,6 +3080,7 @@
 	int		errornr,
 	int		forceit)
 {
+    qf_list_T		*qfl;
     qfline_T		*qf_ptr;
     qfline_T		*old_qf_ptr;
     int			qf_index;
@@ -3113,13 +3107,15 @@
 	return;
     }
 
-    qf_ptr = qi->qf_lists[qi->qf_curlist].qf_ptr;
+    qfl = &qi->qf_lists[qi->qf_curlist];
+
+    qf_ptr = qfl->qf_ptr;
     old_qf_ptr = qf_ptr;
-    qf_index = qi->qf_lists[qi->qf_curlist].qf_index;
+    qf_index = qfl->qf_index;
     old_qf_index = qf_index;
     if (dir != 0)    /* next/prev valid entry */
     {
-	qf_ptr = get_nth_valid_entry(qi, errornr, qf_ptr, &qf_index, dir);
+	qf_ptr = get_nth_valid_entry(qfl, errornr, qf_ptr, &qf_index, dir);
 	if (qf_ptr == NULL)
 	{
 	    qf_ptr = old_qf_ptr;
@@ -3128,9 +3124,9 @@
 	}
     }
     else if (errornr != 0)	/* go to specified number */
-	qf_ptr = get_nth_entry(qi, errornr, qf_ptr, &qf_index);
+	qf_ptr = get_nth_entry(qfl, errornr, qf_ptr, &qf_index);
 
-    qi->qf_lists[qi->qf_curlist].qf_index = qf_index;
+    qfl->qf_index = qf_index;
     if (qf_win_pos_update(qi, old_qf_index))
 	/* No need to print the error message if it's visible in the error
 	 * window */
@@ -3215,8 +3211,8 @@
 theend:
     if (qi != NULL)
     {
-	qi->qf_lists[qi->qf_curlist].qf_ptr = qf_ptr;
-	qi->qf_lists[qi->qf_curlist].qf_index = qf_index;
+	qfl->qf_ptr = qf_ptr;
+	qfl->qf_index = qf_index;
     }
     if (p_swb != old_swb && opened_window)
     {
@@ -3242,9 +3238,11 @@
 /*
  * Display information about a single entry from the quickfix/location list.
  * Used by ":clist/:llist" commands.
+ * 'cursel' will be set to TRUE for the currently selected entry in the
+ * quickfix list.
  */
     static void
-qf_list_entry(qf_info_T *qi, qfline_T *qfp, int qf_idx)
+qf_list_entry(qfline_T *qfp, int qf_idx, int cursel)
 {
     char_u	*fname;
     buf_T	*buf;
@@ -3285,8 +3283,7 @@
 	return;
 
     msg_putchar('\n');
-    msg_outtrans_attr(IObuff, qf_idx == qi->qf_lists[qi->qf_curlist].qf_index
-	    ? HL_ATTR(HLF_QFL) : qfFileAttr);
+    msg_outtrans_attr(IObuff, cursel ? HL_ATTR(HLF_QFL) : qfFileAttr);
 
     if (qfp->qf_lnum != 0)
 	msg_puts_attr((char_u *)":", qfSepAttr);
@@ -3326,6 +3323,7 @@
     void
 qf_list(exarg_T *eap)
 {
+    qf_list_T	*qfl;
     qfline_T	*qfp;
     int		i;
     int		idx1 = 1;
@@ -3362,15 +3360,16 @@
 	EMSG(_(e_trailing));
 	return;
     }
+    qfl = &qi->qf_lists[qi->qf_curlist];
     if (plus)
     {
-	i = qi->qf_lists[qi->qf_curlist].qf_index;
+	i = qfl->qf_index;
 	idx2 = i + idx1;
 	idx1 = i;
     }
     else
     {
-	i = qi->qf_lists[qi->qf_curlist].qf_count;
+	i = qfl->qf_count;
 	if (idx1 < 0)
 	    idx1 = (-idx1 > i) ? 0 : idx1 + i + 1;
 	if (idx2 < 0)
@@ -3394,17 +3393,17 @@
     if (qfLineAttr == 0)
 	qfLineAttr = HL_ATTR(HLF_N);
 
-    if (qi->qf_lists[qi->qf_curlist].qf_nonevalid)
+    if (qfl->qf_nonevalid)
 	all = TRUE;
-    qfp = qi->qf_lists[qi->qf_curlist].qf_start;
-    for (i = 1; !got_int && i <= qi->qf_lists[qi->qf_curlist].qf_count; )
+    qfp = qfl->qf_start;
+    for (i = 1; !got_int && i <= qfl->qf_count; )
     {
 	if ((qfp->qf_valid || all) && idx1 <= i && i <= idx2)
 	{
 	    if (got_int)
 		break;
 
-	    qf_list_entry(qi, qfp, i);
+	    qf_list_entry(qfp, i, i == qfl->qf_index);
 	}
 
 	qfp = qfp->qf_next;
@@ -3547,12 +3546,11 @@
  * associated with the list like context and title are not freed.
  */
     static void
-qf_free_items(qf_info_T *qi, int idx)
+qf_free_items(qf_list_T *qfl)
 {
     qfline_T	*qfp;
     qfline_T	*qfpnext;
     int		stop = FALSE;
-    qf_list_T	*qfl = &qi->qf_lists[idx];
 
     while (qfl->qf_count && qfl->qf_start != NULL)
     {
@@ -3595,11 +3593,9 @@
  * associated context information and the title.
  */
     static void
-qf_free(qf_info_T *qi, int idx)
+qf_free(qf_list_T *qfl)
 {
-    qf_list_T	*qfl = &qi->qf_lists[idx];
-
-    qf_free_items(qi, idx);
+    qf_free_items(qfl);
 
     VIM_CLEAR(qfl->qf_title);
     free_tv(qfl->qf_ctx);
@@ -3801,6 +3797,16 @@
 }
 
 /*
+ * Set "w:quickfix_title" if "qi" has a title.
+ */
+    static void
+qf_set_title_var(qf_list_T *qfl)
+{
+    if (qfl->qf_title != NULL)
+	set_internal_string_var((char_u *)"w:quickfix_title", qfl->qf_title);
+}
+
+/*
  * ":copen": open a window that shows the list of errors.
  * ":lopen": open a window that shows the location list.
  */
@@ -3919,7 +3925,7 @@
 	    prevwin = win;
     }
 
-    qf_set_title_var(qi);
+    qf_set_title_var(&qi->qf_lists[qi->qf_curlist]);
 
     /*
      * Fill the buffer with the quickfix list.
@@ -4033,7 +4039,7 @@
 
 /*
  * Check whether the given window is displaying the specified quickfix/location
- * list buffer
+ * stack.
  */
     static int
 is_qf_win(win_T *win, qf_info_T *qi)
@@ -4053,7 +4059,7 @@
 }
 
 /*
- * Find a window displaying the quickfix/location list 'qi'
+ * Find a window displaying the quickfix/location stack 'qi'
  * Only searches in the current tabpage.
  */
     static win_T *
@@ -4097,7 +4103,7 @@
     {
 	curwin_save = curwin;
 	curwin = win;
-	qf_set_title_var(qi);
+	qf_set_title_var(&qi->qf_lists[qi->qf_curlist]);
 	curwin = curwin_save;
     }
 }
@@ -4143,17 +4149,6 @@
 }
 
 /*
- * Set "w:quickfix_title" if "qi" has a title.
- */
-    static void
-qf_set_title_var(qf_info_T *qi)
-{
-    if (qi->qf_lists[qi->qf_curlist].qf_title != NULL)
-	set_internal_string_var((char_u *)"w:quickfix_title",
-				    qi->qf_lists[qi->qf_curlist].qf_title);
-}
-
-/*
  * Add an error line to the quickfix buffer.
  */
     static int
@@ -4679,9 +4674,8 @@
  * For :cfdo and :lfdo returns the 'n'th valid file entry.
  */
     static int
-qf_get_nth_valid_entry(qf_info_T *qi, int n, int fdo)
+qf_get_nth_valid_entry(qf_list_T *qfl, int n, int fdo)
 {
-    qf_list_T	*qfl = &qi->qf_lists[qi->qf_curlist];
     qfline_T	*qfp = qfl->qf_start;
     int		i, eidx;
     int		prev_fnum = 0;
@@ -4762,7 +4756,7 @@
      */
     if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo
 	    || eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo)
-	errornr = qf_get_nth_valid_entry(qi,
+	errornr = qf_get_nth_valid_entry(&qi->qf_lists[qi->qf_curlist],
 		eap->addr_count > 0 ? (int)eap->line1 : 1,
 		eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo);
 
@@ -5712,7 +5706,7 @@
 			TRUE, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0)
 	    {
 		(void)get_errorlist(qi, NULL, 0, l);
-		qf_free(qi, 0);
+		qf_free(&qi->qf_lists[0]);
 	    }
 	    free(qi);
 	}
@@ -5983,6 +5977,7 @@
 qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict)
 {
     qf_info_T	*qi = &ql_info;
+    qf_list_T	*qfl;
     int		status = OK;
     int		qf_idx;
     dictitem_T	*di;
@@ -6003,6 +5998,8 @@
     if (qi == NULL || qi->qf_listcount == 0 || qf_idx == INVALID_QFIDX)
 	return qf_getprop_defaults(qi, flags, retdict);
 
+    qfl = &qi->qf_lists[qf_idx];
+
     if (flags & QF_GETLIST_TITLE)
 	status = qf_getprop_title(qi, qf_idx, retdict);
     if ((status == OK) && (flags & QF_GETLIST_NR))
@@ -6014,15 +6011,13 @@
     if ((status == OK) && (flags & QF_GETLIST_CONTEXT))
 	status = qf_getprop_ctx(qi, qf_idx, retdict);
     if ((status == OK) && (flags & QF_GETLIST_ID))
-	status = dict_add_number(retdict, "id", qi->qf_lists[qf_idx].qf_id);
+	status = dict_add_number(retdict, "id", qfl->qf_id);
     if ((status == OK) && (flags & QF_GETLIST_IDX))
 	status = qf_getprop_idx(qi, qf_idx, retdict);
     if ((status == OK) && (flags & QF_GETLIST_SIZE))
-	status = dict_add_number(retdict, "size",
-					      qi->qf_lists[qf_idx].qf_count);
+	status = dict_add_number(retdict, "size", qfl->qf_count);
     if ((status == OK) && (flags & QF_GETLIST_TICK))
-	status = dict_add_number(retdict, "changedtick",
-					qi->qf_lists[qf_idx].qf_changedtick);
+	status = dict_add_number(retdict, "changedtick", qfl->qf_changedtick);
     if ((status == OK) && (wp != NULL) && (flags & QF_GETLIST_FILEWINID))
 	status = qf_getprop_filewinid(wp, qi, retdict);
 
@@ -6118,6 +6113,7 @@
 	char_u		*title,
 	int		action)
 {
+    qf_list_T	*qfl = &qi->qf_lists[qf_idx];
     listitem_T	*li;
     dict_T	*d;
     qfline_T	*old_last = NULL;
@@ -6128,14 +6124,15 @@
 	/* make place for a new list */
 	qf_new_list(qi, title);
 	qf_idx = qi->qf_curlist;
+	qfl = &qi->qf_lists[qf_idx];
     }
     else if (action == 'a' && !qf_list_empty(qi, qf_idx))
 	/* Adding to existing list, use last entry. */
-	old_last = qi->qf_lists[qf_idx].qf_last;
+	old_last = qfl->qf_last;
     else if (action == 'r')
     {
-	qf_free_items(qi, qf_idx);
-	qf_store_title(qi, qf_idx, title);
+	qf_free_items(qfl);
+	qf_store_title(qfl, title);
     }
 
     for (li = list->lv_first; li != NULL; li = li->li_next)
@@ -6152,17 +6149,16 @@
 	    break;
     }
 
-    if (qi->qf_lists[qf_idx].qf_index == 0)
+    if (qfl->qf_index == 0)
 	/* no valid entry */
-	qi->qf_lists[qf_idx].qf_nonevalid = TRUE;
+	qfl->qf_nonevalid = TRUE;
     else
-	qi->qf_lists[qf_idx].qf_nonevalid = FALSE;
+	qfl->qf_nonevalid = FALSE;
     if (action != 'a')
     {
-	qi->qf_lists[qf_idx].qf_ptr =
-	    qi->qf_lists[qf_idx].qf_start;
+	qfl->qf_ptr = qfl->qf_start;
 	if (!qf_list_empty(qi, qf_idx))
-	    qi->qf_lists[qf_idx].qf_index = 1;
+	    qfl->qf_index = 1;
     }
 
     /* Don't update the cursor in quickfix window when appending entries */
@@ -6302,7 +6298,7 @@
 	return FAIL;
 
     if (action == 'r')
-	qf_free_items(qi, qf_idx);
+	qf_free_items(&qi->qf_lists[qf_idx]);
     if (qf_init_ext(qi, qf_idx, NULL, NULL, &di->di_tv, errorformat,
 		FALSE, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0)
 	retval = OK;
@@ -6314,15 +6310,15 @@
  * Set quickfix list context.
  */
     static int
-qf_setprop_context(qf_info_T *qi, int qf_idx, dictitem_T *di)
+qf_setprop_context(qf_list_T *qfl, dictitem_T *di)
 {
     typval_T	*ctx;
 
-    free_tv(qi->qf_lists[qf_idx].qf_ctx);
+    free_tv(qfl->qf_ctx);
     ctx =  alloc_tv();
     if (ctx != NULL)
 	copy_tv(&di->di_tv, ctx);
-    qi->qf_lists[qf_idx].qf_ctx = ctx;
+    qfl->qf_ctx = ctx;
 
     return OK;
 }
@@ -6361,7 +6357,7 @@
     if ((di = dict_find(what, (char_u *)"lines", -1)) != NULL)
 	retval = qf_setprop_items_from_lines(qi, qf_idx, what, di, action);
     if ((di = dict_find(what, (char_u *)"context", -1)) != NULL)
-	retval = qf_setprop_context(qi, qf_idx, di);
+	retval = qf_setprop_context(&qi->qf_lists[qf_idx], di);
 
     if (retval == OK)
 	qf_list_changed(qi, qf_idx);
@@ -6370,7 +6366,8 @@
 }
 
 /*
- * Find the non-location list window with the specified location list.
+ * Find the non-location list window with the specified location list in the
+ * current tabpage.
  */
     static win_T *
 find_win_with_ll(qf_info_T *qi)
@@ -6399,7 +6396,7 @@
     {
 	/* If the quickfix/location list window is open, then clear it */
 	if (qi->qf_curlist < qi->qf_listcount)
-	    qf_free(qi, qi->qf_curlist);
+	    qf_free(&qi->qf_lists[qi->qf_curlist]);
 	qf_update_buffer(qi, NULL);
     }
 
