diff --git a/lib/secure-streams/secure-streams-serialize.c b/lib/secure-streams/secure-streams-serialize.c
index eac5956cb..a9e7469bd 100644
--- a/lib/secure-streams/secure-streams-serialize.c
+++ b/lib/secure-streams/secure-streams-serialize.c
@@ -1233,17 +1233,18 @@ payload_ff:
 			 * CREATING now so we'll know the metadata to sync.
 			 */
 
-			h->creating_cb_done = 1;
-
-			if (lws_ss_check_next_state(&h->lc, &h->prev_ss_state,
-						    LWSSSCS_CREATING))
-				return LWSSSSRET_DESTROY_ME;
-
-			h->prev_ss_state = (uint8_t)LWSSSCS_CREATING;
+			if (!h->creating_cb_done) {
+				if (lws_ss_check_next_state(&h->lc, &h->prev_ss_state,
+							    LWSSSCS_CREATING))
+					return LWSSSSRET_DESTROY_ME;
+				h->prev_ss_state = (uint8_t)LWSSSCS_CREATING;
+				h->creating_cb_done = 1;
+			} else
+				h->prev_ss_state = LWSSSCS_DISCONNECTED;
 
 			if (ssi->state) {
 				n = ssi->state(client_pss_to_userdata(pss),
-							NULL, LWSSSCS_CREATING, 0);
+					       NULL, h->prev_ss_state, 0);
 				switch (n) {
 				case LWSSSSRET_OK:
 					break;
@@ -1422,5 +1423,8 @@ swallow:
 	return LWSSSSRET_OK;
 
 hangup:
+
+	lwsl_notice("%s: hangup\n", __func__);
+
 	return LWSSSSRET_DISCONNECT_ME;
 }