diff --git a/plugins/websockets/ws.c b/plugins/websockets/ws.c
index 0b917eb..cca70eb 100644
--- a/plugins/websockets/ws.c
+++ b/plugins/websockets/ws.c
@@ -159,7 +159,6 @@ int ws_handler(int socket, struct client_session *cs, struct session_request *sr
     return MK_PLUGIN_RET_CONTINUE;
 }
 
-
 /* _MKP_EVENTs */
 int _mkp_event_read(int sockfd)
 {
@@ -168,11 +167,10 @@ int _mkp_event_read(int sockfd)
     unsigned int frame_size = 0;
     unsigned int frame_opcode = 0;
     unsigned int frame_mask = 0;
-    unsigned int frame_payload = 0;    
-    unsigned char frame_masking_key[256];
+    unsigned char *frame_payload;    
+    unsigned char frame_masking_key[WS_FRAME_MASK_LEN];
     uint64_t payload_length = 0;
-    unsigned int payload_size = 0;
-    unsigned int mask_key_init = 0;
+    unsigned int masking_key_offset = 0;
     unsigned char data[256];
 
     struct mk_ws_request *wr;
@@ -194,16 +192,18 @@ int _mkp_event_read(int sockfd)
     frame_size    = n;
     frame_opcode  = buf[0] & 0x0f;
     frame_mask    = CHECK_BIT(buf[1], 7);
-    frame_payload = buf[1] & 0x7f;
+    payload_length = buf[1] & 0x7f;
 
-    if (frame_payload == 126) {
+    if (payload_length == 126) {
         payload_length = buf[2] * 256 + buf[3];
+        masking_key_offset = 4;
     }
-    else if (frame_payload == 127) { 
+    else if (payload_length == 127) { 
         memcpy(&payload_length, buf + 2, 8);
+        masking_key_offset = 10;
     }
     else {
-        payload_length = frame_payload;
+        masking_key_offset = 2;
     }
 
     
@@ -217,30 +217,29 @@ int _mkp_event_read(int sockfd)
     printf("Op Code\t%i\n", frame_opcode);
     printf("Mask ?\t%i\n", frame_mask);
     printf("Frame Size\t%i\n", frame_size);
-    printf("Frame Payload\t%i\n", frame_payload);
-    printf("Payload Value\t%i\n", (unsigned int) payload_length);
-    printf("Payload Size\t%i\n", (unsigned int) payload_size);
+    printf("Payload Length\t%i\n", (unsigned int) payload_length);
+    printf("Mask Key Offset\t%i\n", (unsigned int) masking_key_offset);
     fflush(stdout);
 #endif
 
     memset(data, '\0', sizeof(data));
     if (frame_mask) {
-        mask_key_init = 2 + payload_size;
-        memcpy(&frame_masking_key, buf + mask_key_init, WS_FRAME_MASK_LEN);
+        memcpy(frame_masking_key, buf + masking_key_offset, WS_FRAME_MASK_LEN);
 
-        if (payload_size != (frame_size - (mask_key_init + WS_FRAME_MASK_LEN))) {
+        if (payload_length != (frame_size - (masking_key_offset + WS_FRAME_MASK_LEN))) {
             //mk_err("Invalid frame size: %i", (frame_size - (mask_key_init + WS_FRAME_MASK_LEN)));
             /* FIXME: Send error, frame size does not cover the payload size */
             //return MK_PLUGIN_RET_EVENT_CLOSE;
         }
 
-        memcpy(&data, buf + mask_key_init + WS_FRAME_MASK_LEN, payload_length);
-        for (i=0; i < payload_length; i++) {
-            data[i] = data[i] ^ frame_masking_key[i % 4];
+        /* Unmasking the frame payload */
+        frame_payload = buf + masking_key_offset + WS_FRAME_MASK_LEN;
+        for (i = 0; i < payload_length; i++) {
+            data[i] = frame_payload[i] ^ frame_masking_key[i & 0x03];
         }
     }
     else {
-        memcpy(&data, buf + 2 + payload_size, payload_length); 
+        memcpy(data, frame_payload, payload_length); 
     }
 
 #ifdef TRACE
