diff --git a/lib/hpack.c b/lib/hpack.c
index 37c43192..56f66b54 100644
--- a/lib/hpack.c
+++ b/lib/hpack.c
@@ -668,8 +668,7 @@ int lws_add_http2_header_status(struct libwebsocket_context *context,
 	unsigned char status[10];
 	int n;
 	
-	if (code >= 400)
-		wsi->u.http2.END_STREAM = 1;
+	wsi->u.http2.send_END_STREAM = !!(code >= 400);
 	
 	n = sprintf((char *)status, "%u", code);
 	if (lws_add_http2_header_by_token(context, wsi, WSI_TOKEN_HTTP_COLON_STATUS, status, n, p, end))
diff --git a/lib/output.c b/lib/output.c
index 91c754ae..cee61494 100644
--- a/lib/output.c
+++ b/lib/output.c
@@ -445,6 +445,8 @@ send_raw:
 			if (protocol == LWS_WRITE_HTTP_HEADERS) {
 				n = LWS_HTTP2_FRAME_TYPE_HEADERS;
 				flags = LWS_HTTP2_FLAG_END_HEADERS;
+				if (wsi->u.http2.send_END_STREAM)
+					flags |= LWS_HTTP2_FLAG_END_STREAM;
 			}
 			
 			if ((protocol == LWS_WRITE_HTTP || protocol == LWS_WRITE_HTTP_FINAL) && wsi->u.http.content_length) {
@@ -456,7 +458,7 @@ send_raw:
 				}
 			}
 			
-			if ((protocol == LWS_WRITE_HTTP_FINAL || protocol == LWS_WRITE_HTTP_HEADERS) && wsi->u.http2.END_STREAM) {
+			if (protocol == LWS_WRITE_HTTP_FINAL && wsi->u.http2.END_STREAM) {
 				lwsl_info("%s: setting END_STREAM\n", __func__);
 				flags |= LWS_HTTP2_FLAG_END_STREAM;
 			}
diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h
index 4631bfed..4f171de2 100755
--- a/lib/private-libwebsockets.h
+++ b/lib/private-libwebsockets.h
@@ -699,6 +699,7 @@ struct _lws_http2_related {
 	
 	unsigned int END_STREAM:1;
 	unsigned int END_HEADERS:1;
+	unsigned int send_END_STREAM:1;
 
 	/* hpack */
 	enum http2_hpack_state hpack;