diff --git a/mongoose.c b/mongoose.c
index 4988cdc19f8c50dfd9fd6f2da1ba18ca0bf035e7..966178a07427eabc3f4ec50542a1483d1c99e068 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -2631,7 +2631,9 @@ static void send_websocket_handshake_if_requested(struct mg_connection *conn) {
         *key = mg_get_header(conn, "Sec-WebSocket-Key");
   if (ver != NULL && key != NULL) {
     conn->is_websocket = 1;
-    send_websocket_handshake(conn, key);
+    if (call_user(MG_CONN_2_CONN(conn), MG_WS_HANDSHAKE) == MG_FALSE) {
+      send_websocket_handshake(conn, key);
+    }
   }
 }
 
diff --git a/mongoose.h b/mongoose.h
index db22091ad835f8a1ee2514fedb0a0c7a7fe42762..f2efd0528b570bc387898dad9ebd56e2d03d3451 100644
--- a/mongoose.h
+++ b/mongoose.h
@@ -67,7 +67,7 @@ enum mg_event {
   MG_REQUEST,     // If callback returns MG_FALSE, Mongoose continues with req
   MG_REPLY,       // If callback returns MG_FALSE, Mongoose closes connection
   MG_CLOSE,       // Connection is closed, callback return value is ignored
-  MG_LUA,         // Called before LSP page invoked
+  MG_WS_HANDSHAKE,  // New websocket connection, handshake request
   MG_HTTP_ERROR   // If callback returns MG_FALSE, Mongoose continues with err
 };
 typedef int (*mg_handler_t)(struct mg_connection *, enum mg_event);