diff --git a/lib/client-handshake.c b/lib/client-handshake.c
index 7226480134c4907b11428e5cd4d626a3018ced0c..3876956f234e10a44116a4591e36222d26533caf 100644
--- a/lib/client-handshake.c
+++ b/lib/client-handshake.c
@@ -1,13 +1,14 @@
 #include "private-libwebsockets.h"
 
 struct lws *
-lws_client_connect_2(struct lws_context *context, struct lws *wsi)
+lws_client_connect_2(struct lws *wsi)
 {
 #ifdef LWS_USE_IPV6
 	struct sockaddr_in6 server_addr6;
 	struct sockaddr_in6 client_addr6;
 	struct addrinfo hints, *result;
 #endif
+	struct lws_context *context = wsi->context;
 	struct sockaddr_in server_addr4;
 	struct sockaddr_in client_addr4;
 	struct lws_pollfd pfd;
@@ -15,7 +16,7 @@ lws_client_connect_2(struct lws_context *context, struct lws *wsi)
 	int n, plen = 0;
 	const char *ads;
 
-       lwsl_client("lws_client_connect_2\n");
+	lwsl_client("%s\n", __func__);
 
 	/* proxy? */
 
@@ -310,7 +311,7 @@ oom4:
 	return NULL;
 
 failed:
-	lws_close_and_free_session(context, wsi, LWS_CLOSE_STATUS_NOSTATUS);
+	lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
 
 	return NULL;
 }
@@ -424,7 +425,7 @@ lws_client_connect(struct lws_context *context, const char *address,
 	}
 	lwsl_client("lws_client_connect: direct conn\n");
 
-       return lws_client_connect_2(context, wsi);
+       return lws_client_connect_2(wsi);
 
 bail1:
 	lws_free(wsi->u.hdr.ah);
diff --git a/lib/client.c b/lib/client.c
index f20f691d9967c0b7ca4dfbadea3982c33648293d..040e378853c44e8aab239c574a2689cd7647fd68 100644
--- a/lib/client.c
+++ b/lib/client.c
@@ -59,7 +59,7 @@ int lws_client_socket_service(struct lws_context *context,
 		 * timeout protection set in client-handshake.c
 		 */
 
-               if (lws_client_connect_2(context, wsi) == NULL) {
+               if (lws_client_connect_2(wsi) == NULL) {
 			/* closed */
 			lwsl_client("closed\n");
 			return -1;
@@ -75,10 +75,9 @@ int lws_client_socket_service(struct lws_context *context,
 		if (pollfd->revents & LWS_POLLHUP) {
 
 			lwsl_warn("Proxy connection %p (fd=%d) dead\n",
-				(void *)wsi, pollfd->fd);
+				  (void *)wsi, pollfd->fd);
 
-			lws_close_and_free_session(context, wsi,
-						     LWS_CLOSE_STATUS_NOSTATUS);
+			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
 			return 0;
 		}
 
@@ -91,8 +90,7 @@ int lws_client_socket_service(struct lws_context *context,
 				return 0;
 			}
 
-			lws_close_and_free_session(context, wsi,
-						   LWS_CLOSE_STATUS_NOSTATUS);
+			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
 			lwsl_err("ERROR reading from proxy socket\n");
 			return 0;
 		}
@@ -101,8 +99,7 @@ int lws_client_socket_service(struct lws_context *context,
 		if (strcmp((char *)context->service_buffer, "HTTP/1.0 200 ") &&
 		    strcmp((char *)context->service_buffer, "HTTP/1.1 200 ")
 		) {
-			lws_close_and_free_session(context, wsi,
-						   LWS_CLOSE_STATUS_NOSTATUS);
+			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
 			lwsl_err("ERROR proxy: %s\n", context->service_buffer);
 			return 0;
 		}
@@ -334,8 +331,8 @@ some_wait:
 				} else {
 					lwsl_err("server's cert didn't look good, X509_V_ERR = %d: %s\n",
 						 n, ERR_error_string(n, (char *)context->service_buffer));
-					lws_close_and_free_session(context,
-							wsi, LWS_CLOSE_STATUS_NOSTATUS);
+					lws_close_free_wsi(wsi,
+						LWS_CLOSE_STATUS_NOSTATUS);
 					return 0;
 				}
 			}
@@ -351,11 +348,10 @@ some_wait:
 		/* fallthru */
 
 	case LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE2:
-		p = lws_generate_client_handshake(context, wsi, p);
+		p = lws_generate_client_handshake(wsi, p);
 		if (p == NULL) {
 			lwsl_err("Failed to generate handshake for client\n");
-			lws_close_and_free_session(context, wsi,
-						   LWS_CLOSE_STATUS_NOSTATUS);
+			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
 			return 0;
 		}
 
@@ -370,8 +366,7 @@ some_wait:
 		switch (n) {
 		case LWS_SSL_CAPABLE_ERROR:
 			lwsl_debug("ERROR writing to client socket\n");
-			lws_close_and_free_session(context, wsi,
-						   LWS_CLOSE_STATUS_NOSTATUS);
+			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
 			return 0;
 		case LWS_SSL_CAPABLE_MORE_SERVICE:
 			lws_callback_on_writable(context, wsi);
@@ -422,7 +417,7 @@ some_wait:
 		len = 1;
 		while (wsi->u.hdr.parser_state != WSI_PARSING_COMPLETE &&
 		       len > 0) {
-			n = lws_ssl_capable_read(context, wsi, &c, 1);
+			n = lws_ssl_capable_read(wsi, &c, 1);
 			lws_latency(context, wsi, "send lws_issue_raw", n,
 				    n == 1);
 			switch (n) {
@@ -432,7 +427,7 @@ some_wait:
 				return 0;
 			}
 
-			if (lws_parse(context, wsi, c)) {
+			if (lws_parse(wsi, c)) {
 				lwsl_warn("problems parsing header\n");
 				goto bail3;
 			}
@@ -453,12 +448,11 @@ some_wait:
 		 * right away and deal with it that way
 		 */
 
-		return lws_client_interpret_server_handshake(context, wsi);
+		return lws_client_interpret_server_handshake(wsi);
 
 bail3:
 		lwsl_info("closing conn at LWS_CONNMODE...SERVER_REPLY\n");
-		lws_close_and_free_session(context, wsi,
-					   LWS_CLOSE_STATUS_NOSTATUS);
+		lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
 		return -1;
 
 	case LWS_CONNMODE_WS_CLIENT_WAITING_EXTENSION_CONNECT:
@@ -490,9 +484,9 @@ strtolower(char *s)
 }
 
 int
-lws_client_interpret_server_handshake(struct lws_context *context,
-				      struct lws *wsi)
+lws_client_interpret_server_handshake(struct lws *wsi)
 {
+	struct lws_context *context = wsi->context;
 	int close_reason = LWS_CLOSE_STATUS_PROTOCOL_ERR;
 	int n, len, okay = 0, isErrorCodeReceived = 0;
 	const char *pc;
@@ -815,17 +809,17 @@ bail2:
 
 	/* free up his parsing allocations */
 	lws_free2(wsi->u.hdr.ah);
-	lws_close_and_free_session(context, wsi, close_reason);
+	lws_close_free_wsi(wsi, close_reason);
 
 	return 1;
 }
 
 
 char *
-lws_generate_client_handshake(struct lws_context *context,
-			      struct lws *wsi, char *pkt)
+lws_generate_client_handshake(struct lws *wsi, char *pkt)
 {
 	char buf[128], hash[20], key_b64[40], *p = pkt;
+	struct lws_context *context = wsi->context;
 	int n;
 #ifndef LWS_NO_EXTENSIONS
 	const struct lws_extension *ext;
@@ -839,8 +833,7 @@ lws_generate_client_handshake(struct lws_context *context,
 	if (n != 16) {
 		lwsl_err("Unable to read from random dev %s\n",
 			 SYSTEM_RANDOM_FILEPATH);
-		lws_close_and_free_session(context, wsi,
-					   LWS_CLOSE_STATUS_NOSTATUS);
+		lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
 		return NULL;
 	}
 
diff --git a/lib/context.c b/lib/context.c
index 514e8ff2a3f0fe985a8253fe6e6693518fcf37e4..f194ec226c89339db5c5ced6debdeefdf76f99f8 100644
--- a/lib/context.c
+++ b/lib/context.c
@@ -262,8 +262,7 @@ lws_context_destroy(struct lws_context *context)
 		struct lws *wsi = wsi_from_fd(context, context->fds[n].fd);
 		if (!wsi)
 			continue;
-		lws_close_and_free_session(context, wsi,
-				LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY
+		lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY
 				/* no protocol close */);
 		n--;
 	}
diff --git a/lib/extension.c b/lib/extension.c
index 120ef4745f2113874d1d55e8b3e967971f878322..5f2ee46e5ee75d52f310d31f420e1b56d164de4c 100644
--- a/lib/extension.c
+++ b/lib/extension.c
@@ -185,13 +185,13 @@ lws_issue_raw_ext_access(struct lws *wsi,
 }
 
 int
-lws_any_extension_handled(struct lws_context *context,
-			  struct lws *wsi,
+lws_any_extension_handled(struct lws *wsi,
 			  enum lws_extension_callback_reasons r,
 						       void *v, size_t len)
 {
 	int n;
 	int handled = 0;
+	struct lws_context *context = wsi->context;
 
 	/* maybe an extension will take care of it for us */
 
diff --git a/lib/handshake.c b/lib/handshake.c
index 03870621cd83e38442529ba3ae9b813c0a028f6b..c77e6ed7c2faac42e9c370f302290945b26124e8 100644
--- a/lib/handshake.c
+++ b/lib/handshake.c
@@ -217,7 +217,7 @@ http_complete:
 
 bail:
 	lwsl_debug("closing connection at lws_read bail:\n");
-	lws_close_and_free_session(context, wsi, LWS_CLOSE_STATUS_NOSTATUS);
+	lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
 
 	return -1;
 }
diff --git a/lib/hpack.c b/lib/hpack.c
index a22c237e8bf14104b77e22c7ff60f2d408d8ded4..88aa29186f68f4dd808f3f0dbc2f70def286514d 100644
--- a/lib/hpack.c
+++ b/lib/hpack.c
@@ -202,14 +202,14 @@ static int lws_frag_start(struct lws *wsi, int hdr_token_idx)
 	if (!hdr_token_idx)
 		return 1;
 
-	if (ah->next_frag_index >= ARRAY_SIZE(ah->frag_index))
+	if (ah->nfrag >= ARRAY_SIZE(ah->frag_index))
 		return 1;
 
-	ah->frags[ah->next_frag_index].offset = ah->pos;
-	ah->frags[ah->next_frag_index].len = 0;
-	ah->frags[ah->next_frag_index].next_frag_index = 0;
+	ah->frags[ah->nfrag].offset = ah->pos;
+	ah->frags[ah->nfrag].len = 0;
+	ah->frags[ah->nfrag].nfrag = 0;
 
-	ah->frag_index[hdr_token_idx] = ah->next_frag_index;
+	ah->frag_index[hdr_token_idx] = ah->nfrag;
 
 	return 0;
 }
@@ -219,7 +219,7 @@ static int lws_frag_append(struct lws *wsi, unsigned char c)
 	struct allocated_headers * ah = wsi->u.http2.http.ah;
 
 	ah->data[ah->pos++] = c;
-	ah->frags[ah->next_frag_index].len++;
+	ah->frags[ah->nfrag].len++;
 
 	return ah->pos >= sizeof(ah->data);
 }
@@ -229,7 +229,7 @@ static int lws_frag_end(struct lws *wsi)
 	if (lws_frag_append(wsi, 0))
 		return 1;
 
-	wsi->u.http2.http.ah->next_frag_index++;
+	wsi->u.http2.http.ah->nfrag++;
 	return 0;
 }
 
@@ -543,7 +543,7 @@ pre_data:
 				if (lws_frag_append(wsi, c1))
 					return 1;
 			} else { /* name */
-				if (lws_parse(context, wsi, c1))
+				if (lws_parse(wsi, c1))
 					return 1;
 
 			}
diff --git a/lib/http2.c b/lib/http2.c
index 307b126074eb377026e7b5a0601085744390df68..0eb2d6a2ae6fdcf2799b5ae32df0dbb194b67dde 100644
--- a/lib/http2.c
+++ b/lib/http2.c
@@ -219,7 +219,7 @@ lws_http2_parser(struct lws_context *context, struct lws *wsi, unsigned char c)
 			 * and the peer must send a SETTINGS with ACK flag...
 			 */
 
-			lws_set_protocol_write_pending(context, wsi,
+			lws_set_protocol_write_pending(wsi,
 						       LWS_PPS_HTTP2_MY_SETTINGS);
 		}
 		break;
@@ -295,14 +295,14 @@ lws_http2_parser(struct lws_context *context, struct lws *wsi, unsigned char c)
 			case LWS_HTTP2_FRAME_TYPE_HEADERS:
 				/* service the http request itself */
 				lwsl_info("servicing initial http request, wsi=%p, stream wsi=%p\n", wsi, wsi->u.http2.stream_wsi);
-				n = lws_http_action(context, swsi);
+				n = lws_http_action(swsi);
 				(void)n;
 				lwsl_info("  action result %d\n", n);
 				break;
 			case LWS_HTTP2_FRAME_TYPE_PING:
 				if (wsi->u.http2.flags & LWS_HTTP2_FLAG_SETTINGS_ACK) { // ack
 				} else { /* they're sending us a ping request */
-					lws_set_protocol_write_pending(context, wsi, LWS_PPS_HTTP2_PONG);
+					lws_set_protocol_write_pending(wsi, LWS_PPS_HTTP2_PONG);
 				}
 				break;
 			case LWS_HTTP2_FRAME_TYPE_WINDOW_UPDATE:
@@ -360,7 +360,7 @@ lws_http2_parser(struct lws_context *context, struct lws *wsi, unsigned char c)
 				if (wsi->u.http2.flags & LWS_HTTP2_FLAG_SETTINGS_ACK) { // ack
 				} else
 					/* non-ACK coming in means we must ACK it */
-					lws_set_protocol_write_pending(context, wsi, LWS_PPS_HTTP2_ACK_SETTINGS);
+					lws_set_protocol_write_pending(wsi, LWS_PPS_HTTP2_ACK_SETTINGS);
 				break;
 			case LWS_HTTP2_FRAME_TYPE_PING:
 				if (wsi->u.http2.stream_id)
@@ -486,7 +486,7 @@ int lws_http2_do_pps_send(struct lws_context *context, struct lws *wsi)
 			/* demanded by HTTP2 */
 			swsi->u.http2.END_STREAM = 1;
 			lwsl_info("servicing initial http request\n");
-			return lws_http_action(context, swsi);
+			return lws_http_action(swsi);
 		}
 		break;
 	case LWS_PPS_HTTP2_PONG:
diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c
index 2ac176298ce4d12ef8d8646052d8e6c931cfffc7..e0b8d521507504a1aac2891132dcb4f3140fd10d 100644
--- a/lib/libwebsockets.c
+++ b/lib/libwebsockets.c
@@ -57,9 +57,9 @@ lws_free_wsi(struct lws *wsi)
 }
 
 void
-lws_close_and_free_session(struct lws_context *context,
-			   struct lws *wsi, enum lws_close_status reason)
+lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason)
 {
+	struct lws_context *context = wsi->context;
 	int n, m, ret, old_state;
 	struct lws_tokens eff_buf;
 	unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 2 +
@@ -216,10 +216,10 @@ just_kill_connection:
 	 * we won't be servicing or receiving anything further from this guy
 	 * delete socket from the internal poll list if still present
 	 */
-	lws_ssl_remove_wsi_from_buffered_list(context, wsi);
+	lws_ssl_remove_wsi_from_buffered_list(wsi);
 
 	/* checking return redundant since we anyway close */
-	remove_wsi_socket_from_fds(context, wsi);
+	remove_wsi_socket_from_fds(wsi);
 
 	wsi->state = WSI_STATE_DEAD_SOCKET;
 
@@ -889,8 +889,7 @@ lws_partial_buffered(struct lws *wsi)
 	return !!wsi->truncated_send_len;
 }
 
-void lws_set_protocol_write_pending(struct lws_context *context,
-				    struct lws *wsi,
+void lws_set_protocol_write_pending(struct lws *wsi,
 				    enum lws_pending_protocol_send pend)
 {
 	lwsl_info("setting pps %d\n", pend);
@@ -899,7 +898,7 @@ void lws_set_protocol_write_pending(struct lws_context *context,
 		lwsl_err("pps overwrite\n");
 	wsi->pps = pend;
 	lws_rx_flow_control(wsi, 0);
-	lws_callback_on_writable(context, wsi);
+	lws_callback_on_writable(wsi->context, wsi);
 }
 
 LWS_VISIBLE size_t
diff --git a/lib/lws-plat-mbed3.cpp b/lib/lws-plat-mbed3.cpp
index f213d2978b2de9f23db4cfa619c0c4ca986075f0..66bef3d68c5f23cac6e6929f60354e85ababac66 100644
--- a/lib/lws-plat-mbed3.cpp
+++ b/lib/lws-plat-mbed3.cpp
@@ -82,15 +82,13 @@ lws_plat_change_pollfd(struct lws_context *context,
 }
 
 extern "C" LWS_VISIBLE int
-lws_ssl_capable_read_no_ssl(struct lws_context *context,
-			    struct lws *wsi, unsigned char *buf, int len)
+lws_ssl_capable_read_no_ssl(struct lws *wsi, unsigned char *buf, int len)
 {
 	socket_error_t err;
 	size_t _len = len;
 
 	lwsl_debug("%s\r\n", __func__);
 
-	(void)context;
 	err = ((lws_conn *)wsi->sock)->ts->recv((char *)buf, &_len);
 	if (err == SOCKET_ERROR_NONE) {
 		lwsl_info("%s: got %d bytes\n", __func__, _len);
@@ -298,8 +296,7 @@ void lws_conn::onDisconnect(TCPStream *s)
 {
 	lwsl_notice("%s:\r\n", __func__);
 	(void)s;
-	lws_close_and_free_session(lws_get_ctx(wsi), wsi,
-						LWS_CLOSE_STATUS_NOSTATUS);
+	lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
 }
 
 
diff --git a/lib/lws-plat-unix.c b/lib/lws-plat-unix.c
index 6478e2754922884c5b17c7684308df073556001f..91cf75c2471f90cd6ddd0267b4b4b94f45b783bb 100644
--- a/lib/lws-plat-unix.c
+++ b/lib/lws-plat-unix.c
@@ -157,7 +157,7 @@ lws_plat_service(struct lws_context *context, int timeout_ms)
 			 * at the end of the service, he'll get put back on the
 			 * list then.
 			 */
-			lws_ssl_remove_wsi_from_buffered_list(context, wsi);
+			lws_ssl_remove_wsi_from_buffered_list(wsi);
 		}
 		wsi = wsi_next;
 	}
diff --git a/lib/output.c b/lib/output.c
index 9f82e295097a37012848f7c100fc09f0a41f23ff..70be3c65bc0516d7e746f8e1f4db31fd9af91612 100644
--- a/lib/output.c
+++ b/lib/output.c
@@ -577,13 +577,10 @@ all_sent:
 
 #if LWS_POSIX
 LWS_VISIBLE int
-lws_ssl_capable_read_no_ssl(struct lws_context *context,
-			    struct lws *wsi, unsigned char *buf, int len)
+lws_ssl_capable_read_no_ssl(struct lws *wsi, unsigned char *buf, int len)
 {
 	int n;
 
-	(void)context;
-
 	n = recv(wsi->sock, (char *)buf, len, 0);
 	if (n >= 0)
 		return n;
diff --git a/lib/parsers.c b/lib/parsers.c
index 65d045de5526fbfdd8140e251be51e415b5cb20a..f20364f01174d6f3f2e1cee511cf1571f7f7902b 100644
--- a/lib/parsers.c
+++ b/lib/parsers.c
@@ -29,7 +29,6 @@ unsigned char lextable[] = {
 
 int lextable_decode(int pos, char c)
 {
-
 	c = tolower(c);
 
 	while (1) {
@@ -69,7 +68,7 @@ int lws_allocate_header_table(struct lws *wsi)
 		return -1;
 	}
 	memset(wsi->u.hdr.ah->frag_index, 0, sizeof(wsi->u.hdr.ah->frag_index));
-	wsi->u.hdr.ah->next_frag_index = 0;
+	wsi->u.hdr.ah->nfrag = 0;
 	wsi->u.hdr.ah->pos = 0;
 
 	return 0;
@@ -92,13 +91,13 @@ LWS_VISIBLE int lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h)
 		return 0;
 	do {
 		len += wsi->u.hdr.ah->frags[n].len;
-		n = wsi->u.hdr.ah->frags[n].next_frag_index;
+		n = wsi->u.hdr.ah->frags[n].nfrag;
 	} while (n);
 
 	return len;
 }
 
-LWS_VISIBLE int lws_hdr_copy(struct lws *wsi, char *dest, int len,
+LWS_VISIBLE int lws_hdr_copy(struct lws *wsi, char *dst, int len,
 			     enum lws_token_indexes h)
 {
 	int toklen = lws_hdr_total_length(wsi, h);
@@ -112,10 +111,9 @@ LWS_VISIBLE int lws_hdr_copy(struct lws *wsi, char *dest, int len,
 		return 0;
 
 	do {
-		strcpy(dest,
-			&wsi->u.hdr.ah->data[wsi->u.hdr.ah->frags[n].offset]);
-		dest += wsi->u.hdr.ah->frags[n].len;
-		n = wsi->u.hdr.ah->frags[n].next_frag_index;
+		strcpy(dst, &wsi->u.hdr.ah->data[wsi->u.hdr.ah->frags[n].offset]);
+		dst += wsi->u.hdr.ah->frags[n].len;
+		n = wsi->u.hdr.ah->frags[n].nfrag;
 	} while (n);
 
 	return toklen;
@@ -132,23 +130,20 @@ char *lws_hdr_simple_ptr(struct lws *wsi, enum lws_token_indexes h)
 	return &wsi->u.hdr.ah->data[wsi->u.hdr.ah->frags[n].offset];
 }
 
-int lws_hdr_simple_create(struct lws *wsi,
-			  enum lws_token_indexes h, const char *s)
+int lws_hdr_simple_create(struct lws *wsi, enum lws_token_indexes h,
+			  const char *s)
 {
-	wsi->u.hdr.ah->next_frag_index++;
-	if (wsi->u.hdr.ah->next_frag_index ==
-	       sizeof(wsi->u.hdr.ah->frags) / sizeof(wsi->u.hdr.ah->frags[0])) {
+	wsi->u.hdr.ah->nfrag++;
+	if (wsi->u.hdr.ah->nfrag == ARRAY_SIZE(wsi->u.hdr.ah->frags)) {
 		lwsl_warn("More hdr frags than we can deal with, dropping\n");
 		return -1;
 	}
 
-	wsi->u.hdr.ah->frag_index[h] = wsi->u.hdr.ah->next_frag_index;
+	wsi->u.hdr.ah->frag_index[h] = wsi->u.hdr.ah->nfrag;
 
-	wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].offset =
-							     wsi->u.hdr.ah->pos;
-	wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len = 0;
-	wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].next_frag_index =
-									      0;
+	wsi->u.hdr.ah->frags[wsi->u.hdr.ah->nfrag].offset = wsi->u.hdr.ah->pos;
+	wsi->u.hdr.ah->frags[wsi->u.hdr.ah->nfrag].len = 0;
+	wsi->u.hdr.ah->frags[wsi->u.hdr.ah->nfrag].nfrag = 0;
 
 	do {
 		if (wsi->u.hdr.ah->pos == sizeof(wsi->u.hdr.ah->data)) {
@@ -157,8 +152,7 @@ int lws_hdr_simple_create(struct lws *wsi,
 		}
 		wsi->u.hdr.ah->data[wsi->u.hdr.ah->pos++] = *s;
 		if (*s)
-			wsi->u.hdr.ah->frags[
-					wsi->u.hdr.ah->next_frag_index].len++;
+			wsi->u.hdr.ah->frags[wsi->u.hdr.ah->nfrag].len++;
 	} while (*s++);
 
 	return 0;
@@ -181,32 +175,35 @@ static signed char char_to_hex(const char c)
 static int issue_char(struct lws *wsi, unsigned char c)
 {
 	unsigned short frag_len;
+
 	if (wsi->u.hdr.ah->pos == sizeof(wsi->u.hdr.ah->data)) {
 		lwsl_warn("excessive header content\n");
 		return -1;
 	}
 
-	frag_len = \
-		wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len;
-	/* If we haven't hit the token limit, just copy the character into
-	 * the header: */
-	if( frag_len < wsi->u.hdr.current_token_limit ) {
+	frag_len = wsi->u.hdr.ah->frags[wsi->u.hdr.ah->nfrag].len;
+	/*
+	 * If we haven't hit the token limit, just copy the character into
+	 * the header
+	 */
+	if (frag_len < wsi->u.hdr.current_token_limit) {
 		wsi->u.hdr.ah->data[wsi->u.hdr.ah->pos++] = c;
 		if (c)
-			wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len++;
+			wsi->u.hdr.ah->frags[wsi->u.hdr.ah->nfrag].len++;
 		return 0;
 	}
-	else {
-		/* Insert a null character when we *hit* the limit: */
-		if( frag_len == wsi->u.hdr.current_token_limit ) {
-			wsi->u.hdr.ah->data[wsi->u.hdr.ah->pos++] = '\0';
-			lwsl_warn("header %i exceeds limit\n", wsi->u.hdr.parser_state);
-		};
-	};
+
+	/* Insert a null character when we *hit* the limit: */
+	if (frag_len == wsi->u.hdr.current_token_limit) {
+		wsi->u.hdr.ah->data[wsi->u.hdr.ah->pos++] = '\0';
+		lwsl_warn("header %i exceeds limit\n",
+			  wsi->u.hdr.parser_state);
+	}
+
 	return 1;
 }
 
-int lws_parse(struct lws_context *context, struct lws *wsi, unsigned char c)
+int lws_parse(struct lws *wsi, unsigned char c)
 {
 	static const unsigned char methods[] = {
 		WSI_TOKEN_GET_URI,
@@ -216,6 +213,8 @@ int lws_parse(struct lws_context *context, struct lws *wsi, unsigned char c)
 		WSI_TOKEN_PATCH_URI,
 		WSI_TOKEN_DELETE_URI,
 	};
+	struct allocated_headers *ah = wsi->u.hdr.ah;
+	struct lws_context *context = wsi->context;
 	unsigned int n, m, enc = 0;
 
 	switch (wsi->u.hdr.parser_state) {
@@ -225,7 +224,7 @@ int lws_parse(struct lws_context *context, struct lws *wsi, unsigned char c)
 
 		/* collect into malloc'd buffers */
 		/* optional initial space swallow */
-		if (!wsi->u.hdr.ah->frags[wsi->u.hdr.ah->frag_index[
+		if (!ah->frags[ah->frag_index[
 				      wsi->u.hdr.parser_state]].len && c == ' ')
 			break;
 
@@ -240,7 +239,7 @@ int lws_parse(struct lws_context *context, struct lws *wsi, unsigned char c)
 
 		if (c == ' ') {
 			/* enforce starting with / */
-			if (!wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len)
+			if (!ah->frags[ah->nfrag].len)
 				if (issue_char(wsi, '/') < 0)
 					return -1;
 
@@ -279,7 +278,7 @@ int lws_parse(struct lws_context *context, struct lws *wsi, unsigned char c)
 				issue_char(wsi, '%');
 				wsi->u.hdr.ues = URIES_IDLE;
 				/* regurgitate + assess */
-				if (lws_parse(context, wsi, wsi->u.hdr.esc_stash) < 0)
+				if (lws_parse(wsi, wsi->u.hdr.esc_stash) < 0)
 					return -1;
 				/* continue on to assess c */
 				break;
@@ -324,14 +323,14 @@ int lws_parse(struct lws_context *context, struct lws *wsi, unsigned char c)
 				 * safe against header fragmentation because
 				 * the method URI can only be in 1 fragment
 				 */
-				if (wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len > 2) {
-					wsi->u.hdr.ah->pos--;
-					wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len--;
+				if (ah->frags[ah->nfrag].len > 2) {
+					ah->pos--;
+					ah->frags[ah->nfrag].len--;
 					do {
-						wsi->u.hdr.ah->pos--;
-						wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len--;
-					} while (wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len > 1 &&
-							wsi->u.hdr.ah->data[wsi->u.hdr.ah->pos] != '/');
+						ah->pos--;
+						ah->frags[ah->nfrag].len--;
+					} while (ah->frags[ah->nfrag].len > 1 &&
+						 ah->data[ah->pos] != '/');
 				}
 				wsi->u.hdr.ups = URIPS_SEEN_SLASH_DOT_DOT;
 				goto swallow;
@@ -363,20 +362,15 @@ int lws_parse(struct lws_context *context, struct lws *wsi, unsigned char c)
 
 		if (c == '?' && !enc) { /* start of URI arguments */
 			/* seal off uri header */
-			wsi->u.hdr.ah->data[wsi->u.hdr.ah->pos++] = '\0';
+			ah->data[ah->pos++] = '\0';
 
 			/* move to using WSI_TOKEN_HTTP_URI_ARGS */
-			wsi->u.hdr.ah->next_frag_index++;
-			wsi->u.hdr.ah->frags[
-				wsi->u.hdr.ah->next_frag_index].offset =
-							     wsi->u.hdr.ah->pos;
-			wsi->u.hdr.ah->frags[
-					wsi->u.hdr.ah->next_frag_index].len = 0;
-			wsi->u.hdr.ah->frags[
-			    wsi->u.hdr.ah->next_frag_index].next_frag_index = 0;
-
-			wsi->u.hdr.ah->frag_index[WSI_TOKEN_HTTP_URI_ARGS] =
-						 wsi->u.hdr.ah->next_frag_index;
+			ah->nfrag++;
+			ah->frags[ah->nfrag].offset = ah->pos;
+			ah->frags[ah->nfrag].len = 0;
+			ah->frags[ah->nfrag].nfrag = 0;
+
+			ah->frag_index[WSI_TOKEN_HTTP_URI_ARGS] = ah->nfrag;
 
 			/* defeat normal uri path processing */
 			wsi->u.hdr.ups = URIPS_ARGUMENTS;
@@ -419,7 +413,7 @@ swallow:
 		    wsi->mode == LWS_CONNMODE_HTTP_SERVING) {
 			/* this is not a header we know about */
 			for (m = 0; m < ARRAY_SIZE(methods); m++)
-				if (wsi->u.hdr.ah->frag_index[methods[m]]) {
+				if (ah->frag_index[methods[m]]) {
 					/*
 					 * already had the method, no idea what
 					 * this crap from the client is, ignore
@@ -455,7 +449,7 @@ swallow:
 			lwsl_parser("known hdr %d\n", n);
 			for (m = 0; m < ARRAY_SIZE(methods); m++)
 				if (n == methods[m] &&
-						wsi->u.hdr.ah->frag_index[
+						ah->frag_index[
 							methods[m]]) {
 					lwsl_warn("Duplicated method\n");
 					return -1;
@@ -473,9 +467,10 @@ swallow:
 
 			if (context->token_limits)
 				wsi->u.hdr.current_token_limit =
-					context->token_limits->token_limit[wsi->u.hdr.parser_state];
+					context->token_limits->token_limit[
+						       wsi->u.hdr.parser_state];
 			else
-				wsi->u.hdr.current_token_limit = sizeof(wsi->u.hdr.ah->data);
+				wsi->u.hdr.current_token_limit = sizeof(ah->data);
 
 			if (wsi->u.hdr.parser_state == WSI_TOKEN_CHALLENGE)
 				goto set_parsing_complete;
@@ -485,39 +480,33 @@ swallow:
 		break;
 
 start_fragment:
-		wsi->u.hdr.ah->next_frag_index++;
-		if (wsi->u.hdr.ah->next_frag_index ==
-				sizeof(wsi->u.hdr.ah->frags) /
-					      sizeof(wsi->u.hdr.ah->frags[0])) {
+		ah->nfrag++;
+		if (ah->nfrag == ARRAY_SIZE(ah->frags)) {
 			lwsl_warn("More hdr frags than we can deal with\n");
 			return -1;
 		}
 
-		wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].offset =
-							     wsi->u.hdr.ah->pos;
-		wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len = 0;
-		wsi->u.hdr.ah->frags[
-			    wsi->u.hdr.ah->next_frag_index].next_frag_index = 0;
+		ah->frags[ah->nfrag].offset = ah->pos;
+		ah->frags[ah->nfrag].len = 0;
+		ah->frags[ ah->nfrag].nfrag = 0;
 
-		n = wsi->u.hdr.ah->frag_index[wsi->u.hdr.parser_state];
+		n = ah->frag_index[wsi->u.hdr.parser_state];
 		if (!n) { /* first fragment */
-			wsi->u.hdr.ah->frag_index[wsi->u.hdr.parser_state] =
-						 wsi->u.hdr.ah->next_frag_index;
+			ah->frag_index[wsi->u.hdr.parser_state] = ah->nfrag;
 			break;
 		}
 		/* continuation */
-		while (wsi->u.hdr.ah->frags[n].next_frag_index)
-				n = wsi->u.hdr.ah->frags[n].next_frag_index;
-		wsi->u.hdr.ah->frags[n].next_frag_index =
-						 wsi->u.hdr.ah->next_frag_index;
+		while (ah->frags[n].nfrag)
+				n = ah->frags[n].nfrag;
+		ah->frags[n].nfrag = ah->nfrag;
 
-		if (wsi->u.hdr.ah->pos == sizeof(wsi->u.hdr.ah->data)) {
+		if (ah->pos == sizeof(ah->data)) {
 			lwsl_warn("excessive header content\n");
 			return -1;
 		}
 
-		wsi->u.hdr.ah->data[wsi->u.hdr.ah->pos++] = ' ';
-		wsi->u.hdr.ah->frags[wsi->u.hdr.ah->next_frag_index].len++;
+		ah->data[ah->pos++] = ' ';
+		ah->frags[ah->nfrag].len++;
 		break;
 
 		/* skipping arg part of a name we didn't recognize */
diff --git a/lib/pollfd.c b/lib/pollfd.c
index 03725e0355e022dd20b0693992f9446ce757e967..a4e68815f9b91f4076678b371d7384b4634a3218 100644
--- a/lib/pollfd.c
+++ b/lib/pollfd.c
@@ -70,11 +70,11 @@ insert_wsi_socket_into_fds(struct lws_context *context,
 }
 
 int
-remove_wsi_socket_from_fds(struct lws_context *context,
-						      struct lws *wsi)
+remove_wsi_socket_from_fds(struct lws *wsi)
 {
 	int m;
 	struct lws_pollargs pa = { wsi->sock, 0, 0 };
+	struct lws_context *context = wsi->context;
 
 	lws_libev_io(context, wsi, LWS_EV_STOP | LWS_EV_READ | LWS_EV_WRITE);
 
diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h
index f6f0f26770182963442233dc93173c5f1ad0ae69..12212b4fc56d0fb909cfbdbb78b75b161077a008 100644
--- a/lib/private-libwebsockets.h
+++ b/lib/private-libwebsockets.h
@@ -600,7 +600,7 @@ enum uri_esc_states {
 struct lws_fragments {
 	unsigned short offset;
 	unsigned short len;
-	unsigned char next_frag_index;
+	unsigned char nfrag;
 };
 
 /* notice that these union members:
@@ -616,7 +616,7 @@ struct lws_fragments {
  */
 
 struct allocated_headers {
-	unsigned char next_frag_index;
+	unsigned char nfrag;
 	unsigned short pos;
 	unsigned char frag_index[WSI_TOKEN_COUNT];
 	struct lws_fragments frags[WSI_TOKEN_COUNT * 2];
@@ -905,11 +905,10 @@ struct lws {
 LWS_EXTERN int log_level;
 
 LWS_EXTERN void
-lws_close_and_free_session(struct lws_context *context,
-			   struct lws *wsi, enum lws_close_status);
+lws_close_free_wsi(struct lws *wsi, enum lws_close_status);
 
 LWS_EXTERN int
-remove_wsi_socket_from_fds(struct lws_context *context, struct lws *wsi);
+remove_wsi_socket_from_fds(struct lws *wsi);
 LWS_EXTERN int
 lws_rxflow_cache(struct lws *wsi, unsigned char *buf, int n, int len);
 
@@ -934,16 +933,16 @@ lws_latency(struct lws_context *context, struct lws *wsi, const char *action,
 #endif
 
 LWS_EXTERN void
-lws_set_protocol_write_pending(struct lws_context *context, struct lws *wsi,
+lws_set_protocol_write_pending(struct lws *wsi,
 			       enum lws_pending_protocol_send pend);
 LWS_EXTERN int
 lws_client_rx_sm(struct lws *wsi, unsigned char c);
 
 LWS_EXTERN int
-lws_parse(struct lws_context *context, struct lws *wsi, unsigned char c);
+lws_parse(struct lws *wsi, unsigned char c);
 
 LWS_EXTERN int
-lws_http_action(struct lws_context *context, struct lws *wsi);
+lws_http_action(struct lws *wsi);
 
 LWS_EXTERN int
 lws_b64_selftest(void);
@@ -971,22 +970,19 @@ lws_issue_raw(struct lws *wsi, unsigned char *buf, size_t len);
 
 
 LWS_EXTERN int
-lws_service_timeout_check(struct lws_context *context,
-			  struct lws *wsi, unsigned int sec);
+lws_service_timeout_check(struct lws *wsi, unsigned int sec);
 
 LWS_EXTERN struct lws *
-lws_client_connect_2(struct lws_context *context, struct lws *wsi);
+lws_client_connect_2(struct lws *wsi);
 
 LWS_EXTERN struct lws *
 lws_create_new_server_wsi(struct lws_context *context);
 
 LWS_EXTERN char *
-lws_generate_client_handshake(struct lws_context *context, struct lws *wsi,
-			      char *pkt);
+lws_generate_client_handshake(struct lws *wsi, char *pkt);
 
 LWS_EXTERN int
-lws_handle_POLLOUT_event(struct lws_context *context, struct lws *wsi,
-			 struct lws_pollfd *pollfd);
+lws_handle_POLLOUT_event(struct lws *wsi, struct lws_pollfd *pollfd);
 
 /*
  * EXTENSIONS
@@ -997,7 +993,7 @@ LWS_VISIBLE void
 lws_context_init_extensions(struct lws_context_creation_info *info,
 			    struct lws_context *context);
 LWS_EXTERN int
-lws_any_extension_handled(struct lws_context *context, struct lws *wsi,
+lws_any_extension_handled(struct lws *wsi,
 			  enum lws_extension_callback_reasons r,
 			  void *v, size_t len);
 
@@ -1009,7 +1005,7 @@ lws_ext_callback_for_each_extension_type(struct lws_context *context,
 					 struct lws *wsi, int reason,
 					 void *arg, int len);
 #else
-#define lws_any_extension_handled(_a, _b, _c, _d, _e) (0)
+#define lws_any_extension_handled(_a, _b, _c, _d) (0)
 #define lws_ext_callback_for_each_active(_a, _b, _c, _d) (0)
 #define lws_ext_callback_for_each_extension_type(_a, _b, _c, _d, _e) (0)
 #define lws_issue_raw_ext_access lws_issue_raw
@@ -1017,8 +1013,7 @@ lws_ext_callback_for_each_extension_type(struct lws_context *context,
 #endif
 
 LWS_EXTERN int
-lws_client_interpret_server_handshake(struct lws_context *context,
-				      struct lws *wsi);
+lws_client_interpret_server_handshake(struct lws *wsi);
 
 LWS_EXTERN int
 lws_rx_sm(struct lws *wsi, unsigned char c);
@@ -1140,31 +1135,29 @@ enum lws_ssl_capable_status {
 #define lws_ssl_capable_read lws_ssl_capable_read_no_ssl
 #define lws_ssl_capable_write lws_ssl_capable_write_no_ssl
 #define lws_ssl_pending lws_ssl_pending_no_ssl
-#define lws_server_socket_service_ssl(_a, _b, _c, _d, _e) (0)
+#define lws_server_socket_service_ssl(_a, _b, _c, _d) (0)
 #define lws_ssl_close(_a) (0)
 #define lws_ssl_context_destroy(_a)
-#define lws_ssl_remove_wsi_from_buffered_list(_a, _b)
+#define lws_ssl_remove_wsi_from_buffered_list(_a)
 #else
 #define LWS_SSL_ENABLED(context) (context->use_ssl)
 LWS_EXTERN int openssl_websocket_private_data_index;
 LWS_EXTERN int
-lws_ssl_capable_read(struct lws_context *context,
-		     struct lws *wsi, unsigned char *buf, int len);
+lws_ssl_capable_read(struct lws *wsi, unsigned char *buf, int len);
 LWS_EXTERN int
 lws_ssl_capable_write(struct lws *wsi, unsigned char *buf, int len);
 LWS_EXTERN int
 lws_ssl_pending(struct lws *wsi);
 LWS_EXTERN int
-lws_server_socket_service_ssl(struct lws_context *context, struct lws **wsi,
-			      struct lws *new_wsi, lws_sockfd_type accept_fd,
+lws_server_socket_service_ssl(struct lws **wsi, struct lws *new_wsi,
+			      lws_sockfd_type accept_fd,
 			      struct lws_pollfd *pollfd);
 LWS_EXTERN int
 lws_ssl_close(struct lws *wsi);
 LWS_EXTERN void
 lws_ssl_context_destroy(struct lws_context *context);
 LWS_VISIBLE void
-lws_ssl_remove_wsi_from_buffered_list(struct lws_context *context,
-				      struct lws *wsi);
+lws_ssl_remove_wsi_from_buffered_list(struct lws *wsi);
 #ifndef LWS_NO_SERVER
 LWS_EXTERN int
 lws_context_init_server_ssl(struct lws_context_creation_info *info,
@@ -1186,8 +1179,7 @@ lws_context_init_http2_ssl(struct lws_context *context);
 #endif
 
 LWS_EXTERN int
-lws_ssl_capable_read_no_ssl(struct lws_context *context,
-			    struct lws *wsi, unsigned char *buf, int len);
+lws_ssl_capable_read_no_ssl(struct lws *wsi, unsigned char *buf, int len);
 
 LWS_EXTERN int
 lws_ssl_capable_write_no_ssl(struct lws *wsi, unsigned char *buf, int len);
diff --git a/lib/server-handshake.c b/lib/server-handshake.c
index a54b64ded93abe4d92fc06afce04673fc44f328d..9fd8cb2f73d4d465b36959bdc2e523ec2ecabb79 100644
--- a/lib/server-handshake.c
+++ b/lib/server-handshake.c
@@ -24,13 +24,13 @@
 #define LWS_CPYAPP(ptr, str) { strcpy(ptr, str); ptr += strlen(str); }
 #ifndef LWS_NO_EXTENSIONS
 LWS_VISIBLE int
-lws_extension_server_handshake(struct lws_context *context,
-			       struct lws *wsi, char **p)
+lws_extension_server_handshake(struct lws *wsi, char **p)
 {
 	int n;
 	char *c;
 	char ext_name[128];
 	const struct lws_extension *ext;
+	struct lws_context *context = wsi->context;
 	int ext_count = 0;
 	int more = 1;
 
@@ -223,7 +223,7 @@ handshake_0405(struct lws_context *context, struct lws *wsi)
 	 * Figure out which extensions the client has that we want to
 	 * enable on this connection, and give him back the list
 	 */
-	if (lws_extension_server_handshake(context, wsi, &p))
+	if (lws_extension_server_handshake(wsi, &p))
 		goto bail;
 #endif
 
@@ -233,9 +233,8 @@ handshake_0405(struct lws_context *context, struct lws *wsi)
 
 	LWS_CPYAPP(p, "\x0d\x0a\x0d\x0a");
 
-	if (!lws_any_extension_handled(context, wsi,
-			LWS_EXT_CALLBACK_HANDSHAKE_REPLY_TX,
-						     response, p - response)) {
+	if (!lws_any_extension_handled(wsi, LWS_EXT_CALLBACK_HANDSHAKE_REPLY_TX,
+				       response, p - response)) {
 
 		/* okay send the handshake response accepting the connection */
 
@@ -244,7 +243,7 @@ handshake_0405(struct lws_context *context, struct lws *wsi)
 		fwrite(response, 1,  p - response, stderr);
 #endif
 		n = lws_write(wsi, (unsigned char *)response,
-						  p - response, LWS_WRITE_HTTP_HEADERS);
+			      p - response, LWS_WRITE_HTTP_HEADERS);
 		if (n != (p - response)) {
 			lwsl_debug("handshake_0405: ERROR writing to socket\n");
 			goto bail;
diff --git a/lib/server.c b/lib/server.c
index 8229378d9e7f02e94c032d5a9e18f0ecea8ce5ca..0fe82ee5ee30145cf319050bedf1c62cd49e4afe 100644
--- a/lib/server.c
+++ b/lib/server.c
@@ -186,8 +186,9 @@ _lws_rx_flow_control(struct lws *wsi)
 	return 0;
 }
 
-int lws_http_action(struct lws_context *context, struct lws *wsi)
+int lws_http_action(struct lws *wsi)
 {
+	struct lws_context *context = wsi->context;
 	enum http_connection_type connection_type;
 	enum http_version request_version;
 	char content_length_str[32];
@@ -350,7 +351,7 @@ int lws_handshake_server(struct lws_context *context, struct lws *wsi,
 	/* LWS_CONNMODE_WS_SERVING */
 
 	while (len--) {
-		if (lws_parse(context, wsi, *(*buf)++)) {
+		if (lws_parse(wsi, *(*buf)++)) {
 			lwsl_info("lws_parse failed\n");
 			goto bail_nuke_ah;
 		}
@@ -377,7 +378,7 @@ int lws_handshake_server(struct lws_context *context, struct lws *wsi,
 			/* expose it at the same offset as u.hdr */
 			wsi->u.http.ah = ah;
 
-			n = lws_http_action(context, wsi);
+			n = lws_http_action(wsi);
 
 			return n;
 		}
@@ -721,8 +722,7 @@ int lws_server_socket_service(struct lws_context *context,
 		/* any incoming data ready? */
 
 		if (pollfd->revents & LWS_POLLIN) {
-			len = lws_ssl_capable_read(context, wsi,
-						   context->service_buffer,
+			len = lws_ssl_capable_read(wsi, context->service_buffer,
 						   sizeof(context->service_buffer));
 			lwsl_debug("%s: read %d\r\n", __func__, len);
 			switch (len) {
@@ -874,12 +874,11 @@ try_pollout:
 		break;
 	}
 
-	if (!lws_server_socket_service_ssl(context, &wsi, new_wsi, accept_fd,
-					   pollfd))
+	if (!lws_server_socket_service_ssl(&wsi, new_wsi, accept_fd, pollfd))
 		return 0;
 
 fail:
-	lws_close_and_free_session(context, wsi, LWS_CLOSE_STATUS_NOSTATUS);
+	lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
 
 	return 1;
 }
diff --git a/lib/service.c b/lib/service.c
index a7d9ebd0ee18b3e4dcf990d42158618ad121973b..de3fa6764576802d212f181b45bcf6eff46ac0bf 100644
--- a/lib/service.c
+++ b/lib/service.c
@@ -44,9 +44,9 @@ lws_calllback_as_writeable(struct lws_context *context, struct lws *wsi)
 }
 
 int
-lws_handle_POLLOUT_event(struct lws_context *context, struct lws *wsi,
-			 struct lws_pollfd *pollfd)
+lws_handle_POLLOUT_event(struct lws *wsi, struct lws_pollfd *pollfd)
 {
+	struct lws_context *context = wsi->context;
 	int write_type = LWS_WRITE_PONG;
 	struct lws_tokens eff_buf;
 #ifdef LWS_USE_HTTP2
@@ -60,16 +60,15 @@ lws_handle_POLLOUT_event(struct lws_context *context, struct lws *wsi,
 		if (lws_issue_raw(wsi, wsi->truncated_send_malloc +
 				wsi->truncated_send_offset,
 						wsi->truncated_send_len) < 0) {
-			lwsl_info("lws_handle_POLLOUT_event signalling to close\n");
+			lwsl_info("%s signalling to close\n", __func__);
 			return -1;
 		}
 		/* leave POLLOUT active either way */
 		return 0;
 	} else
-		if (wsi->state == WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE) {
-			lwsl_info("***** %x signalling to close in POLLOUT handler\n", wsi);
+		if (wsi->state == WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE)
 			return -1; /* retry closing now */
-		}
+
 #ifdef LWS_USE_HTTP2
 	/* protocol packets are next */
 	if (wsi->pps) {
@@ -258,8 +257,7 @@ user_service:
 		wsi2->u.http2.requested_POLLOUT = 0;
 		if (lws_calllback_as_writeable(context, wsi2)) {
 			lwsl_debug("Closing POLLOUT child\n");
-			lws_close_and_free_session(context, wsi2,
-						LWS_CLOSE_STATUS_NOSTATUS);
+			lws_close_free_wsi(wsi2, LWS_CLOSE_STATUS_NOSTATUS);
 		}
 		wsi2 = wsi;
 	} while (wsi2 != NULL && !lws_send_pipe_choked(wsi));
@@ -275,8 +273,7 @@ notify:
 
 
 int
-lws_service_timeout_check(struct lws_context *context,
-			  struct lws *wsi, unsigned int sec)
+lws_service_timeout_check(struct lws *wsi, unsigned int sec)
 {
 	/*
 	 * if extensions want in on it (eg, we are a mux parent)
@@ -304,8 +301,8 @@ lws_service_timeout_check(struct lws_context *context,
 		 * cleanup like flush partials.
 		 */
 		wsi->socket_is_permanently_unusable = 1;
-		lws_close_and_free_session(context, wsi,
-					   LWS_CLOSE_STATUS_NOSTATUS);
+		lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
+
 		return 1;
 	}
 
@@ -401,8 +398,7 @@ lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd)
 			if (!wsi)
 				continue;
 
-			if (lws_service_timeout_check(context, wsi,
-						      (unsigned int)now))
+			if (lws_service_timeout_check(wsi, (unsigned int)now))
 				/* he did time out... */
 				if (mfd == our_fd)
 					/* it was the guy we came to service! */
@@ -512,7 +508,7 @@ lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd)
 		     wsi->state == WSI_STATE_HTTP2_ESTABLISHED_PRE_SETTINGS ||
 		     wsi->state == WSI_STATE_RETURNED_CLOSE_ALREADY ||
 		     wsi->state == WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE) &&
-			   lws_handle_POLLOUT_event(context, wsi, pollfd)) {
+			   lws_handle_POLLOUT_event(wsi, pollfd)) {
 			if (wsi->state == WSI_STATE_RETURNED_CLOSE_ALREADY)
 				wsi->state = WSI_STATE_FLUSHING_STORED_SEND_BEFORE_CLOSE;
 			lwsl_info("lws_service_fd: closing\n");
@@ -536,7 +532,7 @@ lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd)
 			break;
 read:
 
-		eff_buf.token_len = lws_ssl_capable_read(context, wsi,
+		eff_buf.token_len = lws_ssl_capable_read(wsi,
 					context->service_buffer,
 					pending ? pending :
 					sizeof(context->service_buffer));
@@ -631,7 +627,7 @@ handle_pending:
 
 close_and_handled:
 	lwsl_debug("Close and handled\n");
-	lws_close_and_free_session(context, wsi, LWS_CLOSE_STATUS_NOSTATUS);
+	lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
 	/*
 	 * pollfd may point to something else after the close
 	 * due to pollfd swapping scheme on delete on some platforms
diff --git a/lib/ssl.c b/lib/ssl.c
index 1fd8419bda1726c700ae98e63854cd46d87056fb..8f05360aed26d910a9f724dd61644b4d9fc247ec 100644
--- a/lib/ssl.c
+++ b/lib/ssl.c
@@ -408,9 +408,10 @@ int lws_context_init_client_ssl(struct lws_context_creation_info *info,
 #endif
 
 LWS_VISIBLE void
-lws_ssl_remove_wsi_from_buffered_list(struct lws_context *context,
-		     struct lws *wsi)
+lws_ssl_remove_wsi_from_buffered_list(struct lws *wsi)
 {
+	struct lws_context *context = wsi->context;
+
 	if (!wsi->pending_read_list_prev &&
 	    !wsi->pending_read_list_next &&
 	    context->pending_read_list != wsi)
@@ -434,13 +435,13 @@ lws_ssl_remove_wsi_from_buffered_list(struct lws_context *context,
 }
 
 LWS_VISIBLE int
-lws_ssl_capable_read(struct lws_context *context,
-		     struct lws *wsi, unsigned char *buf, int len)
+lws_ssl_capable_read(struct lws *wsi, unsigned char *buf, int len)
 {
+	struct lws_context *context = wsi->context;
 	int n;
 
 	if (!wsi->ssl)
-		return lws_ssl_capable_read_no_ssl(context, wsi, buf, len);
+		return lws_ssl_capable_read_no_ssl(wsi, buf, len);
 
 	n = SSL_read(wsi->ssl, buf, len);
 	/* manpage: returning 0 means connection shut down */
@@ -467,7 +468,7 @@ lws_ssl_capable_read(struct lws_context *context,
 				}
 			}
 		} else
-			lws_ssl_remove_wsi_from_buffered_list(context, wsi);
+			lws_ssl_remove_wsi_from_buffered_list(wsi);
 
 		return n;
 	}
@@ -529,11 +530,12 @@ lws_ssl_close(struct lws *wsi)
 /* leave all wsi close processing to the caller */
 
 LWS_VISIBLE int
-lws_server_socket_service_ssl(struct lws_context *context, struct lws **pwsi,
-			      struct lws *new_wsi, lws_sockfd_type accept_fd,
+lws_server_socket_service_ssl(struct lws **pwsi, struct lws *new_wsi,
+			      lws_sockfd_type accept_fd,
 			      struct lws_pollfd *pollfd)
 {
 	struct lws *wsi = *pwsi;
+	struct lws_context *context = wsi->context;
 	int n, m;
 #ifndef USE_WOLFSSL
 	BIO *bio;