diff --git a/src/quickfix.c b/src/quickfix.c
index d332e23..33787e4 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -160,10 +160,10 @@
 static efm_T	*fmt_start = NULL; // cached across qf_parse_line() calls
 
 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 int	qf_add_entry(qf_list_T *qfl, 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_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 int	qf_get_fnum(qf_list_T *qfl, 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_list_T *qfl, char_u *);
@@ -1322,8 +1322,6 @@
  */
     static int
 qf_parse_multiline_pfx(
-	qf_info_T *qi,
-	int qf_idx,
 	int idx,
 	qf_list_T *qfl,
 	qffields_T *fields)
@@ -1361,7 +1359,7 @@
 	    qfprev->qf_col = fields->col;
 	qfprev->qf_viscol = fields->use_viscol;
 	if (!qfprev->qf_fnum)
-	    qfprev->qf_fnum = qf_get_fnum(qi, qf_idx,
+	    qfprev->qf_fnum = qf_get_fnum(qfl,
 		    qfl->qf_directory,
 		    *fields->namebuf || qfl->qf_directory != NULL
 		    ? fields->namebuf
@@ -1381,8 +1379,7 @@
  */
     static int
 qf_parse_line(
-	qf_info_T	*qi,
-	int		qf_idx,
+	qf_list_T	*qfl,
 	char_u		*linebuf,
 	int		linelen,
 	efm_T		*fmt_first,
@@ -1391,7 +1388,6 @@
     efm_T		*fmt_ptr;
     int			idx = 0;
     char_u		*tail = NULL;
-    qf_list_T		*qfl = &qi->qf_lists[qf_idx];
     int			status;
 
 restofline:
@@ -1450,7 +1446,7 @@
 	}
 	else if (vim_strchr((char_u *)"CZ", idx) != NULL)
 	{				// continuation of multi-line msg
-	    status = qf_parse_multiline_pfx(qi, qf_idx, idx, qfl, fields);
+	    status = qf_parse_multiline_pfx(idx, qfl, fields);
 	    if (status != QF_OK)
 		return status;
 	}
@@ -1485,11 +1481,18 @@
  * Returns TRUE if the specified quickfix/location list is empty.
  */
     static int
-qf_list_empty(qf_info_T *qi, int qf_idx)
+qf_list_empty(qf_list_T *qfl)
 {
-    if (qi == NULL || qf_idx < 0 || qf_idx >= LISTCOUNT)
-	return TRUE;
-    return qi->qf_lists[qf_idx].qf_count <= 0;
+    return qfl == NULL || qfl->qf_count <= 0;
+}
+
+/*
+ * Return a pointer to a list in the specified quickfix stack
+ */
+    static qf_list_T *
+qf_get_list(qf_info_T *qi, int idx)
+{
+    return &qi->qf_lists[idx];
 }
 
 /*
@@ -1631,11 +1634,11 @@
     {
 	// Adding to existing list, use last entry.
 	adding = TRUE;
-	if (!qf_list_empty(qi, qf_idx))
+	if (!qf_list_empty(qf_get_list(qi, qf_idx)))
 	    old_last = qi->qf_lists[qf_idx].qf_last;
     }
 
-    qfl = &qi->qf_lists[qf_idx];
+    qfl = qf_get_list(qi, qf_idx);
 
     // Use the local value of 'errorformat' if it's set.
     if (errorformat == p_efm && tv == NULL && *buf->b_p_efm != NUL)
@@ -1675,7 +1678,7 @@
 	if (status == QF_END_OF_INPUT)	// end of input
 	    break;
 
-	status = qf_parse_line(qi, qf_idx, state.linebuf, state.linelen,
+	status = qf_parse_line(qfl, state.linebuf, state.linelen,
 							fmt_first, &fields);
 	if (status == QF_FAIL)
 	    goto error2;
@@ -1684,8 +1687,7 @@
 	if (status == QF_IGNORE_LINE)
 	    continue;
 
-	if (qf_add_entry(qi,
-			qf_idx,
+	if (qf_add_entry(qfl,
 			qfl->qf_directory,
 			(*fields.namebuf || qfl->qf_directory != NULL)
 			    ? fields.namebuf
@@ -1808,7 +1810,7 @@
     static qf_list_T *
 qf_get_curlist(qf_info_T *qi)
 {
-    return &qi->qf_lists[qi->qf_curlist];
+    return qf_get_list(qi, qi->qf_curlist);
 }
 
 /*
@@ -1924,7 +1926,7 @@
 	wipe_qf_buffer(qi);
 
 	for (i = 0; i < qi->qf_listcount; ++i)
-	    qf_free(&qi->qf_lists[i]);
+	    qf_free(qf_get_list(qi, i));
 	vim_free(qi);
     }
 }
@@ -1947,7 +1949,7 @@
     else
 	// quickfix list
 	for (i = 0; i < qi->qf_listcount; ++i)
-	    qf_free(&qi->qf_lists[i]);
+	    qf_free(qf_get_list(qi, i));
 }
 
 /*
@@ -2010,8 +2012,7 @@
  */
     static int
 qf_add_entry(
-    qf_info_T	*qi,		// quickfix list
-    int		qf_idx,		// list index
+    qf_list_T	*qfl,		// quickfix list entry
     char_u	*dir,		// optional directory name
     char_u	*fname,		// file name or NULL
     char_u	*module,	// module name or NULL
@@ -2025,7 +2026,6 @@
     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
 
@@ -2041,7 +2041,7 @@
 		IS_QF_LIST(qfl) ? BUF_HAS_QF_ENTRY : BUF_HAS_LL_ENTRY;
     }
     else
-	qfp->qf_fnum = qf_get_fnum(qi, qf_idx, dir, fname);
+	qfp->qf_fnum = qf_get_fnum(qfl, dir, fname);
     if ((qfp->qf_text = vim_strsave(mesg)) == NULL)
     {
 	vim_free(qfp);
@@ -2074,7 +2074,7 @@
     qfp->qf_valid = valid;
 
     lastp = &qfl->qf_last;
-    if (qf_list_empty(qi, qf_idx))	// first element in the list
+    if (qf_list_empty(qfl))		// first element in the list
     {
 	qfl->qf_start = qfp;
 	qfl->qf_ptr = qfp;
@@ -2141,7 +2141,7 @@
  * Copy location list entries from 'from_qfl' to 'to_qfl'.
  */
     static int
-copy_loclist_entries(qf_list_T *from_qfl, qf_list_T *to_qfl, qf_info_T *to_qi)
+copy_loclist_entries(qf_list_T *from_qfl, qf_list_T *to_qfl)
 {
     int		i;
     qfline_T    *from_qfp;
@@ -2152,8 +2152,7 @@
 	    i < from_qfl->qf_count && from_qfp != NULL;
 	    ++i, from_qfp = from_qfp->qf_next)
     {
-	if (qf_add_entry(to_qi,
-		    to_qi->qf_curlist,
+	if (qf_add_entry(to_qfl,
 		    NULL,
 		    NULL,
 		    from_qfp->qf_module,
@@ -2185,7 +2184,7 @@
  * Copy the specified location list 'from_qfl' to 'to_qfl'.
  */
     static int
-copy_loclist(qf_list_T *from_qfl, qf_list_T *to_qfl, qf_info_T *to_qi)
+copy_loclist(qf_list_T *from_qfl, qf_list_T *to_qfl)
 {
     // Some of the fields are populated by qf_add_entry()
     to_qfl->qfl_type = from_qfl->qfl_type;
@@ -2209,7 +2208,7 @@
 	to_qfl->qf_ctx = NULL;
 
     if (from_qfl->qf_count)
-	if (copy_loclist_entries(from_qfl, to_qfl, to_qi) == FAIL)
+	if (copy_loclist_entries(from_qfl, to_qfl) == FAIL)
 	    return FAIL;
 
     to_qfl->qf_index = from_qfl->qf_index;	// current index in the list
@@ -2260,8 +2259,8 @@
     {
 	to->w_llist->qf_curlist = idx;
 
-	if (copy_loclist(&qi->qf_lists[idx],
-			&to->w_llist->qf_lists[idx], to->w_llist) == FAIL)
+	if (copy_loclist(qf_get_list(qi, idx),
+			qf_get_list(to->w_llist, idx)) == FAIL)
 	{
 	    qf_free_all(to);
 	    return;
@@ -2276,9 +2275,8 @@
  * Also sets the b_has_qf_entry flag.
  */
     static int
-qf_get_fnum(qf_info_T *qi, int qf_idx, char_u *directory, char_u *fname)
+qf_get_fnum(qf_list_T *qfl, char_u *directory, char_u *fname)
 {
-    qf_list_T	*qfl = &qi->qf_lists[qf_idx];
     char_u	*ptr = NULL;
     buf_T	*buf;
     char_u	*bufname;
@@ -2906,7 +2904,7 @@
 
     // If the location list for the window is not set, then set it
     // to the location list from the location window
-    if (win->w_llist == NULL)
+    if (win->w_llist == NULL && ll_ref != NULL)
 	win_set_loclist(win, ll_ref);
 }
 
@@ -3312,7 +3310,7 @@
     if (qi == NULL)
 	qi = &ql_info;
 
-    if (qf_stack_empty(qi) || qf_list_empty(qi, qi->qf_curlist))
+    if (qf_stack_empty(qi) || qf_list_empty(qf_get_curlist(qi)))
     {
 	emsg(_(e_quickfix));
 	return;
@@ -3506,7 +3504,7 @@
 	}
     }
 
-    if (qf_stack_empty(qi) || qf_list_empty(qi, qi->qf_curlist))
+    if (qf_stack_empty(qi) || qf_list_empty(qf_get_curlist(qi)))
     {
 	emsg(_(e_quickfix));
 	return;
@@ -3790,9 +3788,12 @@
     }
 
     for (idx = 0; idx < qi->qf_listcount; ++idx)
-	if (!qf_list_empty(qi, idx))
-	    for (i = 0, qfp = qi->qf_lists[idx].qf_start;
-			i < qi->qf_lists[idx].qf_count && qfp != NULL;
+    {
+	qf_list_T	*qfl = qf_get_list(qi, idx);
+
+	if (!qf_list_empty(qfl))
+	    for (i = 0, qfp = qfl->qf_start;
+			i < qfl->qf_count && qfp != NULL;
 			++i, qfp = qfp->qf_next)
 		if (qfp->qf_fnum == curbuf->b_fnum)
 		{
@@ -3807,6 +3808,7 @@
 		    else if (amount_after && qfp->qf_lnum > line2)
 			qfp->qf_lnum += amount_after;
 		}
+    }
 
     if (!found_one)
 	curbuf->b_has_qf_entry &= ~buf_has_flag;
@@ -3872,7 +3874,7 @@
     if (IS_LL_WINDOW(curwin))
 	qi = GET_LOC_LIST(curwin);
 
-    if (qf_list_empty(qi, qi->qf_curlist))
+    if (qf_list_empty(qf_get_curlist(qi)))
     {
 	emsg(_(e_quickfix));
 	return;
@@ -3919,7 +3921,7 @@
     // it if we have errors; otherwise, leave it closed.
     if (qf_stack_empty(qi)
 	    || qfl->qf_nonevalid
-	    || qf_list_empty(qi, qi->qf_curlist))
+	    || qf_list_empty(qf_get_curlist(qi)))
     {
 	if (win != NULL)
 	    ex_cclose(eap);
@@ -4580,7 +4582,7 @@
 	return;
 
     // Autocommands might have cleared the list, check for that.
-    if (!qf_list_empty(qi, qi->qf_curlist))
+    if (!qf_list_empty(qf_get_curlist(qi)))
 	qf_jump(qi, 0, 0, forceit);
 }
 
@@ -5305,8 +5307,7 @@
 	    // Pass the buffer number so that it gets used even for a
 	    // dummy buffer, unless duplicate_name is set, then the
 	    // buffer will be wiped out below.
-	    if (qf_add_entry(qi,
-			qi->qf_curlist,
+	    if (qf_add_entry(qf_get_curlist(qi),
 			NULL,       // dir
 			fname,
 			NULL,
@@ -5624,7 +5625,7 @@
     }
 
     // Jump to first match.
-    if (!qf_list_empty(qi, qi->qf_curlist))
+    if (!qf_list_empty(qf_get_curlist(qi)))
     {
 	if ((flags & VGR_NOJUMP) == 0)
 	    vgr_jump_to_match(qi, eap->forceit, &redraw_for_dummy,
@@ -5837,6 +5838,7 @@
 get_errorlist(qf_info_T *qi_arg, win_T *wp, int qf_idx, list_T *list)
 {
     qf_info_T	*qi = qi_arg;
+    qf_list_T	*qfl;
     dict_T	*dict;
     char_u	buf[2];
     qfline_T	*qfp;
@@ -5857,11 +5859,15 @@
     if (qf_idx == INVALID_QFIDX)
 	qf_idx = qi->qf_curlist;
 
-    if (qf_idx >= qi->qf_listcount || qf_list_empty(qi, qf_idx))
+    if (qf_idx >= qi->qf_listcount)
 	return FAIL;
 
-    qfp = qi->qf_lists[qf_idx].qf_start;
-    for (i = 1; !got_int && i <= qi->qf_lists[qf_idx].qf_count; ++i)
+    qfl = qf_get_list(qi, qf_idx);
+    if (qf_list_empty(qfl))
+	return FAIL;
+
+    qfp = qfl->qf_start;
+    for (i = 1; !got_int && i <= qfl->qf_count; ++i)
     {
 	// Handle entries with a non-existing buffer number.
 	bufnum = qfp->qf_fnum;
@@ -6215,10 +6221,10 @@
  * Return the current quickfix list index as 'idx' in retdict
  */
     static int
-qf_getprop_idx(qf_info_T *qi, int qf_idx, dict_T *retdict)
+qf_getprop_idx(qf_list_T *qfl, dict_T *retdict)
 {
-    int curidx = qi->qf_lists[qf_idx].qf_index;
-    if (qf_list_empty(qi, qf_idx))
+    int curidx = qfl->qf_index;
+    if (qf_list_empty(qfl))
 	// For empty lists, current index is set to 0
 	curidx = 0;
     return dict_add_number(retdict, "idx", curidx);
@@ -6254,7 +6260,7 @@
     if (qf_stack_empty(qi) || qf_idx == INVALID_QFIDX)
 	return qf_getprop_defaults(qi, flags, wp != NULL, retdict);
 
-    qfl = &qi->qf_lists[qf_idx];
+    qfl = qf_get_list(qi, qf_idx);
 
     if (flags & QF_GETLIST_TITLE)
 	status = qf_getprop_title(qfl, retdict);
@@ -6269,7 +6275,7 @@
     if ((status == OK) && (flags & QF_GETLIST_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);
+	status = qf_getprop_idx(qfl, retdict);
     if ((status == OK) && (flags & QF_GETLIST_SIZE))
 	status = dict_add_number(retdict, "size", qfl->qf_count);
     if ((status == OK) && (flags & QF_GETLIST_TICK))
@@ -6289,8 +6295,7 @@
  */
     static int
 qf_add_entry_from_dict(
-	qf_info_T	*qi,
-	int		qf_idx,
+	qf_list_T	*qfl,
 	dict_T		*d,
 	int		first_entry,
 	int		*valid_entry)
@@ -6337,8 +6342,7 @@
     if ((dict_find(d, (char_u *)"valid", -1)) != NULL)
 	valid = (int)dict_get_number(d, (char_u *)"valid");
 
-    status =  qf_add_entry(qi,
-			qf_idx,
+    status =  qf_add_entry(qfl,
 			NULL,		// dir
 			filename,
 			module,
@@ -6376,7 +6380,7 @@
 	char_u		*title,
 	int		action)
 {
-    qf_list_T	*qfl = &qi->qf_lists[qf_idx];
+    qf_list_T	*qfl = qf_get_list(qi, qf_idx);
     listitem_T	*li;
     dict_T	*d;
     qfline_T	*old_last = NULL;
@@ -6388,9 +6392,9 @@
 	// make place for a new list
 	qf_new_list(qi, title);
 	qf_idx = qi->qf_curlist;
-	qfl = &qi->qf_lists[qf_idx];
+	qfl = qf_get_list(qi, qf_idx);
     }
-    else if (action == 'a' && !qf_list_empty(qi, qf_idx))
+    else if (action == 'a' && !qf_list_empty(qfl))
 	// Adding to existing list, use last entry.
 	old_last = qfl->qf_last;
     else if (action == 'r')
@@ -6408,7 +6412,7 @@
 	if (d == NULL)
 	    continue;
 
-	retval = qf_add_entry_from_dict(qi, qf_idx, d, li == list->lv_first,
+	retval = qf_add_entry_from_dict(qfl, d, li == list->lv_first,
 								&valid_entry);
 	if (retval == FAIL)
 	    break;
@@ -6427,7 +6431,7 @@
 
     // Update the current error index if not appending to the list or if the
     // list was empty before and it is not empty now.
-    if ((action != 'a' || qfl->qf_index == 0) && !qf_list_empty(qi, qf_idx))
+    if ((action != 'a' || qfl->qf_index == 0) && !qf_list_empty(qfl))
 	qfl->qf_index = 1;
 
     // Don't update the cursor in quickfix window when appending entries
@@ -6504,7 +6508,7 @@
     static int
 qf_setprop_title(qf_info_T *qi, int qf_idx, dict_T *what, dictitem_T *di)
 {
-    qf_list_T	*qfl = &qi->qf_lists[qf_idx];
+    qf_list_T	*qfl = qf_get_list(qi, qf_idx);
 
     if (di->di_tv.v_type != VAR_STRING)
 	return FAIL;
@@ -6663,7 +6667,7 @@
 	qf_idx = qi->qf_curlist;
     }
 
-    qfl = &qi->qf_lists[qf_idx];
+    qfl = qf_get_list(qi, qf_idx);
     if ((di = dict_find(what, (char_u *)"title", -1)) != NULL)
 	retval = qf_setprop_title(qi, qf_idx, what, di);
     if ((di = dict_find(what, (char_u *)"items", -1)) != NULL)
@@ -7113,8 +7117,7 @@
 	    while (l > 0 && line[l - 1] <= ' ')
 		line[--l] = NUL;
 
-	    if (qf_add_entry(qi,
-			qi->qf_curlist,
+	    if (qf_add_entry(qf_get_curlist(qi),
 			NULL,	// dir
 			fname,
 			NULL,
@@ -7310,7 +7313,7 @@
     }
 
     // Jump to first match.
-    if (!qf_list_empty(qi, qi->qf_curlist))
+    if (!qf_list_empty(qf_get_curlist(qi)))
 	qf_jump(qi, 0, 0, FALSE);
     else
 	semsg(_(e_nomatch2), eap->arg);
