diff --git a/lib/client-parser.c b/lib/client-parser.c
index cfe90a39..4157e085 100644
--- a/lib/client-parser.c
+++ b/lib/client-parser.c
@@ -36,6 +36,16 @@ int lws_client_rx_sm(struct lws *wsi, unsigned char c)
 			wsi->u.ws.opcode = c & 0xf;
 			/* revisit if an extension wants them... */
 			switch (wsi->u.ws.opcode) {
+			case LWSWSOPC_TEXT_FRAME:
+			case LWSWSOPC_BINARY_FRAME:
+				wsi->u.ws.continuation_possible = 1;
+				break;
+			case LWSWSOPC_CONTINUATION:
+				if (!wsi->u.ws.continuation_possible) {
+					lwsl_info("disordered continuation\n");
+					return -1;
+				}
+				break;
 			case 3:
 			case 4:
 			case 5:
@@ -62,6 +72,9 @@ int lws_client_rx_sm(struct lws *wsi, unsigned char c)
 				return -1;
 			}
 			wsi->u.ws.final = !!((c >> 7) & 1);
+			if (wsi->u.ws.final)
+				wsi->u.ws.continuation_possible = 0;
+
 			if ((wsi->u.ws.opcode & 8) && !wsi->u.ws.final) {
 				lwsl_info("control message cannot be fragmented\n");
 				return -1;
diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h
index b91417f9..15b6f84f 100644
--- a/lib/private-libwebsockets.h
+++ b/lib/private-libwebsockets.h
@@ -856,6 +856,7 @@ struct _lws_websocket_related {
 	unsigned int clean_buffer:1; /* buffer not rewritten by extension */
 	unsigned int payload_is_close:1; /* process as PONG, but it is close */
 	unsigned int ping_pending_flag:1;
+	unsigned int continuation_possible:1;
 };
 
 struct lws {