diff --git a/changelog b/changelog
index 4da56ba82cd3a99268fcd18962be43ed463bbc4e..0af359b2206d8c9382b2fc6661fe0ae8fbac05c1 100644
--- a/changelog
+++ b/changelog
@@ -27,6 +27,9 @@ when it finishes replying to a transaction in http.  Previously the library
 did it for you, but that disallowed large, long transfers with multiple
 trips around the event loop (and cgi...).
 
+6) MAJOR connections on ah waiting list that closed did not get removed from
+the waiting list...
+
 
 Changes
 -------
diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c
index 42c6c81d1783de2a8ab6fc400f2332daf9729a81..8d166b093815ccb57ccd4d3e6c20ac1c23578bdf 100644
--- a/lib/libwebsockets.c
+++ b/lib/libwebsockets.c
@@ -58,11 +58,12 @@ lws_free_wsi(struct lws *wsi)
 	lws_free_set_NULL(wsi->rxflow_buffer);
 	lws_free_set_NULL(wsi->trunc_alloc);
 
-	if (wsi->u.hdr.ah) {
+	if (wsi->u.hdr.ah)
 		/* we're closing, losing some rx is OK */
 		wsi->u.hdr.ah->rxpos = wsi->u.hdr.ah->rxlen;
-		lws_header_table_detach(wsi);
-	}
+
+	/* we may not have an ah, but may be on the waiting list... */
+	lws_header_table_detach(wsi);
 
 	wsi->context->count_wsi_allocated--;
 	lwsl_debug("%s: %p, remaining wsi %d\n", __func__, wsi,
diff --git a/lib/parsers.c b/lib/parsers.c
index 0e36eee3bde265c6fe2c30e4210788e011fbbc66..d505ee43195a891ae86abb03945286d845675ca6 100644
--- a/lib/parsers.c
+++ b/lib/parsers.c
@@ -203,19 +203,18 @@ int lws_header_table_detach(struct lws *wsi)
 
 	pwsi = &pt->ah_wait_list;
 	if (!ah) { /* remove from wait list if none attached */
-//		if (wsi->socket_is_permanently_unusable)
-			while (*pwsi) {
-				if (*pwsi == wsi) {
-					lwsl_info("%s: wsi %p, remv wait\n",
-						  __func__, wsi);
-					*pwsi = wsi->u.hdr.ah_wait_list;
-					wsi->u.hdr.ah_wait_list = NULL;
-					pt->ah_wait_list_length--;
-					goto bail;
-				}
-				pwsi = &(*pwsi)->u.hdr.ah_wait_list;
+		while (*pwsi) {
+			if (*pwsi == wsi) {
+				lwsl_info("%s: wsi %p, remv wait\n",
+					  __func__, wsi);
+				*pwsi = wsi->u.hdr.ah_wait_list;
+				wsi->u.hdr.ah_wait_list = NULL;
+				pt->ah_wait_list_length--;
+				goto bail;
 			}
-
+			pwsi = &(*pwsi)->u.hdr.ah_wait_list;
+		}
+		/* no ah, not on list... no more business here */
 		goto bail;
 	}
 	/* we did have an ah attached */