diff --git a/desync.c b/desync.c
index 307854d..284d743 100644
--- a/desync.c
+++ b/desync.c
@@ -1,3 +1,5 @@
+#define _GNU_SOURCE
+
 #include <stdio.h>
 #include <string.h>
 
@@ -12,6 +14,8 @@
     #ifdef __linux__
     #include <sys/mman.h>
     #include <sys/sendfile.h>
+    #include <fcntl.h>
+
     #include <desync.h>
     
     #ifdef MFD_CLOEXEC
@@ -116,8 +120,10 @@ void wait_send(int sfd)
 
 #ifdef __linux__
 ssize_t send_fake(int sfd, char *buffer,
-        int cnt, long pos, int fa, struct desync_params *opt)
+        int cnt, long pos, struct sockaddr *dst, struct desync_params *opt)
 {
+    int fa = get_family(dst);
+    
     struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http;
     size_t psz = pkt.size;
     
@@ -145,12 +151,25 @@ ssize_t send_fake(int sfd, char *buffer,
         if (setttl(sfd, opt->ttl ? opt->ttl : 8, fa) < 0) {
             break;
         }
-        if (opt->ip_options
+        if (opt->md5sig) {
+            struct tcp_md5sig md5 = {
+                .tcpm_keylen = 5
+            };
+            memcpy(&md5.tcpm_addr, dst, sizeof(struct sockaddr_in6));
+            
+            if (setsockopt(sfd, IPPROTO_TCP,
+                    TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) {
+                perror("setsockopt TCP_MD5SIG");
+                break;
+            }
+        }
+        if (opt->ip_options && fa == AF_INET
             && setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
                 opt->ip_options, opt->ip_options_len) < 0) {
             perror("setsockopt IP_OPTIONS");
             break;
         }
+        
         len = sendfile(sfd, ffd, 0, pos);
         if (len < 0) {
             uniperror("sendfile");
@@ -162,12 +181,24 @@ ssize_t send_fake(int sfd, char *buffer,
         if (setttl(sfd, params.def_ttl, fa) < 0) {
             break;
         }
-        if (opt->ip_options
+        if (opt->ip_options && fa == AF_INET
             && setsockopt(sfd, IPPROTO_IP,
                 IP_OPTIONS, opt->ip_options, 0) < 0) {
             perror("setsockopt IP_OPTIONS");
             break;
         }
+        if (opt->md5sig) {
+            struct tcp_md5sig md5 = {
+                .tcpm_keylen = 0
+            };
+            memcpy(&md5.tcpm_addr, dst, sizeof(struct sockaddr_in6));
+            
+            if (setsockopt(sfd, IPPROTO_TCP,
+                    TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) {
+                perror("setsockopt TCP_MD5SIG");
+                break;
+            }
+        }
         break;
     }
     if (p) munmap(p, pos);
@@ -178,8 +209,10 @@ ssize_t send_fake(int sfd, char *buffer,
 
 #ifdef _WIN32
 ssize_t send_fake(int sfd, char *buffer,
-        int cnt, long pos, int fa, struct desync_params *opt)
+        int cnt, long pos, struct sockaddr *dst, struct desync_params *opt)
 {
+    int fa = get_family(dst);
+    
     struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http;
     size_t psz = pkt.size;
     
@@ -234,7 +267,7 @@ ssize_t send_fake(int sfd, char *buffer,
         if (setttl(sfd, opt->ttl ? opt->ttl : 8, fa) < 0) {
             break;
         }
-        if (opt->ip_options
+        if (opt->ip_options && fa == AF_INET
             && setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
                 opt->ip_options, opt->ip_options_len) < 0) {
             uniperror("setsockopt IP_OPTIONS");
@@ -261,7 +294,7 @@ ssize_t send_fake(int sfd, char *buffer,
         if (setttl(sfd, params.def_ttl, fa) < 0) {
             break;
         }
-        if (opt->ip_options
+        if (opt->ip_options && fa == AF_INET
             && setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
                 opt->ip_options, 0) < 0) {
             uniperror("setsockopt IP_OPTIONS");
@@ -440,7 +473,7 @@ ssize_t desync(int sfd, char *buffer, size_t bfsize,
             #ifdef FAKE_SUPPORT
             case DESYNC_FAKE:
                 s = send_fake(sfd, 
-                    buffer + lp, type, pos - lp, fa, &dp);
+                    buffer + lp, type, pos - lp, dst, &dp);
                 break;
             #endif
             case DESYNC_DISORDER:
diff --git a/main.c b/main.c
index 68f0b04..610b420 100644
--- a/main.c
+++ b/main.c
@@ -82,12 +82,15 @@ const char help_text[] = {
     "    -s, --split <n[+s]>       Split packet at n\n"
     "                              +s - add SNI offset\n"
     "                              +h - add HTTP Host offset\n"
-    "    -s, --disorder <n[+s]>    Split and send reverse order\n"
+    "    -d, --disorder <n[+s]>    Split and send reverse order\n"
     "    -o, --oob <n[+s]>         Split and send as OOB data\n"
     #ifdef FAKE_SUPPORT
     "    -f, --fake <n[+s]>        Split and send fake packet\n"
     "    -t, --ttl <num>           TTL of fake packets, default 8\n"
     "    -k, --ip-opt [f|:str]     IP options of fake packets\n"
+    #ifdef __linux__
+    "    -S, --md5sig              Add MD5 Signature option for fake packets\n"
+    #endif
     "    -l, --fake-tls <f|:str>\n"
     "    -j, --fake-http <f|:str>  Set custom fake packet\n"
     "    -n, --tls-sni <str>       Change SNI in fake ClientHello\n"
@@ -127,6 +130,9 @@ const struct option options[] = {
     {"fake",          1, 0, 'f'},
     {"ttl",           1, 0, 't'},
     {"ip-opt",        2, 0, 'k'},
+    #ifdef __linux__
+    {"md5sig",        0, 0, 'S'},
+    #endif
     {"fake-tls",      1, 0, 'l'},
     {"fake-http",     1, 0, 'j'},
     {"tls-sni",       1, 0, 'n'},
@@ -136,7 +142,7 @@ const struct option options[] = {
     {"tlsrec",        1, 0, 'r'},
     {"def-ttl",       1, 0, 'g'},
     {"delay",         1, 0, 'w'}, //
-    {"not-wait-send", 1, 0, 'W'}, //
+    {"not-wait-send", 0, 0, 'W'}, //
     {0}
 };
     
@@ -502,6 +508,10 @@ int main(int argc, char **argv)
             }
             break;
             
+        case 'S':
+            dp->md5sig = 1;
+            break;
+            
         case 'n':
             if (change_tls_sni(optarg, fake_tls.data, fake_tls.size)) {
                 fprintf(stderr, "error chsni\n");
@@ -579,7 +589,7 @@ int main(int argc, char **argv)
             }
             break;
             
-        case 'V': //
+        case 'w': //
             params.sfdelay = strtol(optarg, &end, 0);
             if (params.sfdelay < 0 || optarg == end 
                     || params.sfdelay >= 1000 || *end)
diff --git a/params.h b/params.h
index c06a47e..78fbee9 100644
--- a/params.h
+++ b/params.h
@@ -43,6 +43,7 @@ struct desync_params {
     int ttl;
     char *ip_options;
     ssize_t ip_options_len;
+    char md5sig;
     int parts_n;
     struct part *parts;
     int mod_http;
diff --git a/proxy.c b/proxy.c
index f181179..5a5dd3e 100644
--- a/proxy.c
+++ b/proxy.c
@@ -366,7 +366,7 @@ int create_conn(struct poolhd *pool,
     }
     val->pair = pair;
     pair->pair = val;
-    pair->in6 = dst->in6;
+    pair->in6 = addr.in6;
     pair->flag = FLAG_CONN;
     return 0;
 }
diff --git a/readme.txt b/readme.txt
index 8bfa865..7ce28bf 100644
--- a/readme.txt
+++ b/readme.txt
@@ -89,6 +89,10 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s
     Существенно снизит вероятность, что пакет дойдет до сервера
     Стоит учесть, что до DPI он также может не дойти
     
+-S, --md5sig
+    Установить опцию TCP MD5 Signature для фейкового пакета
+    Поддерживается в Linux, однако может быть выключен в некоторых сборках
+    
 -l, --fake-tls <file|:str>
 -j, --fake-http <file|:str>
     Указать свои поддельные пакеты, вместо дефолтных