diff --git a/binaries/aarch64/nfqws b/binaries/aarch64/nfqws
index 6d122dc..abb7a5a 100755
Binary files a/binaries/aarch64/nfqws and b/binaries/aarch64/nfqws differ
diff --git a/binaries/armhf/nfqws b/binaries/armhf/nfqws
index d708da7..9e27233 100755
Binary files a/binaries/armhf/nfqws and b/binaries/armhf/nfqws differ
diff --git a/binaries/mips32r1-lsb/nfqws b/binaries/mips32r1-lsb/nfqws
index 3b55548..324a9e0 100755
Binary files a/binaries/mips32r1-lsb/nfqws and b/binaries/mips32r1-lsb/nfqws differ
diff --git a/binaries/mips32r1-msb/nfqws b/binaries/mips32r1-msb/nfqws
index 914424f..80b05f3 100755
Binary files a/binaries/mips32r1-msb/nfqws and b/binaries/mips32r1-msb/nfqws differ
diff --git a/binaries/mips64r2-msb/nfqws b/binaries/mips64r2-msb/nfqws
index 475d573..e7ddce9 100755
Binary files a/binaries/mips64r2-msb/nfqws and b/binaries/mips64r2-msb/nfqws differ
diff --git a/binaries/ppc/nfqws b/binaries/ppc/nfqws
index 7b827bd..79ee035 100755
Binary files a/binaries/ppc/nfqws and b/binaries/ppc/nfqws differ
diff --git a/binaries/x86/nfqws b/binaries/x86/nfqws
index 64bca70..ee6ebcf 100755
Binary files a/binaries/x86/nfqws and b/binaries/x86/nfqws differ
diff --git a/binaries/x86_64/nfqws b/binaries/x86_64/nfqws
index 36ee0cb..75f985d 100755
Binary files a/binaries/x86_64/nfqws and b/binaries/x86_64/nfqws differ
diff --git a/docs/changes.txt b/docs/changes.txt
index 76d5d08..1c4d087 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -152,3 +152,8 @@ ip exclude system
 v30
 
 nfqws : DPI desync attack modes : fake,rst
+
+v31
+
+nfqws : DPI desync attack modes : disorder,disorder2,split,split2.
+nfqws : DPI desync fooling mode : badseq.  multiple modes supported
diff --git a/docs/readme.eng.txt b/docs/readme.eng.txt
index 5576690..4d63b83 100644
--- a/docs/readme.eng.txt
+++ b/docs/readme.eng.txt
@@ -139,7 +139,7 @@ It takes the following parameters:
  --pidfile=<filename>  			; write pid to file
  --user=<username>      		; drop root privs
  --uid=uid[:gid]			; drop root privs
- --dpi-desync[=<mode>]			; try to desync dpi state. modes : fake rst rstack disorder disorder2
+ --dpi-desync[=<mode>]			; try to desync dpi state. modes : fake rst rstack disorder disorder2 split split2
  --dpi-desync-fwmark=<int|0xHEX>        ; override fwmark for desync packet. default = 0x40000000
  --dpi-desync-ttl=<int>                 ; set ttl for desync packet
  --dpi-desync-fooling=none|md5sig|ts|badseq|badsum ; can take multiple comma separated values
@@ -196,7 +196,14 @@ If position is higher than packet length, pos=1 is used.
 This sequence is designed to make reconstruction of critical message as difficult as possible.
 Fake segments may not be required to bypass some DPIs, but can potentially help if more sophisticated reconstruction
 algorithms are used.
-Mode 'disorder2' disables sending of fake segments. It can be used as a faster alternative to --wsize.
+Mode 'disorder2' disables sending of fake segments.
+
+Split mode is very similar to disorder but without segment reordering :
+1. 1st segment
+2. fake 1st segment, data filled with zeroes
+3. fake 1st segment, data filled with zeroes (2nd copy)
+4. 2nd segment
+Mode 'split2' disables sending of fake segments. It can be used as a faster alternative to --wsize.
 
 There are DPIs that analyze responses from the server, particularly the certificate from the ServerHello
 that contain domain name(s). The ClientHello delivery confirmation is an ACK packet from the server
diff --git a/docs/readme.txt b/docs/readme.txt
index 53bb5d2..06f2555 100644
--- a/docs/readme.txt
+++ b/docs/readme.txt
@@ -1,4 +1,4 @@
-zapret v.30
+zapret v.31
 
 English
 -------
@@ -167,7 +167,7 @@ nfqws
  --hostcase				; менять регистр заголовка "Host:" по умолчанию на "host:".
  --hostnospace				; убрать пробел после "Host:" и переместить его в конец значения "User-Agent:" для сохранения длины пакета
  --hostspell=HoST			; точное написание заголовка Host (можно "HOST" или "HoSt"). автоматом включает --hostcase
- --dpi-desync[=<mode>]			; атака по десинхронизации DPI. mode : fake rst rstack disorder disorder2
+ --dpi-desync[=<mode>]			; атака по десинхронизации DPI. mode : fake rst rstack disorder disorder2 split split2
  --dpi-desync-fwmark=<int|0xHEX>        ; бит fwmark для пометки десинхронизирующих пакетов, чтобы они повторно не падали в очередь. default = 0x40000000
  --dpi-desync-ttl=<int>                 ; установить ttl для десинхронизирующих пакетов
  --dpi-desync-fooling=none|md5sig|ts|badseq|badsum ; дополнительные методики как сделать, чтобы фейковый пакет не дошел до сервера
@@ -226,7 +226,15 @@ nfqws
 Этой последовательностью для DPI максимально усложняется задача реконструкции начального сообщения,
 по которому принимается решение о блокировке. Некоторым DPI хватит и tcp сегментов в неправильном порядке,
 поддельные части сделаны для дополнительной надежности и более сложных алгоритмов реконструкции.
-Режим disorder2 отключает отправку поддельных частей. Он может быть использован как более быстрая альтернатива --wsize.
+Режим disorder2 отключает отправку поддельных частей.
+
+Режим split очень похож на disorder, только нет изменения порядка следования сегментов :
+1. поддельная 1-я часть пакета, поле данных заполнено нулями
+2. 1-я часть пакета
+3. поддельная 1-я часть пакета, поле данных заполнено нулями. отсылка 2-й раз.
+4. 2-я часть пакета
+Режим split2 отключает отправку поддельных частей.
+Он может быть использован как более быстрая альтернатива --wsize.
 
 Есть DPI, которые анализируют ответы от сервера, в частности сертификат из ServerHello, где прописаны домены.
 Подтверждением доставки ClientHello является ACK пакет от сервера с номером ACK sequence, соответствующим длине ClientHello+1.
diff --git a/init.d/openwrt/custom-desync-keepalive b/init.d/openwrt/custom-desync-keepalive
new file mode 100644
index 0000000..3c5c314
--- /dev/null
+++ b/init.d/openwrt/custom-desync-keepalive
@@ -0,0 +1,15 @@
+# this script contain your special code to launch daemons and configure firewall
+# use helpers from "functions" file and "zapret" init script
+# in case of upgrade keep this file only, do not modify others
+
+zapret_custom_daemons()
+{
+	run_daemon 1 $NFQWS "$NFQWS_OPT_BASE $NFQWS_OPT_DESYNC"
+}
+zapret_custom_firewall()
+{
+	local desync_http="--dport 80 -m mark ! --mark $DESYNC_MARK/$DESYNC_MARK"
+	local desync_https="--dport 443 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 2:4 -m mark ! --mark $DESYNC_MARK/$DESYNC_MARK"
+	fw_nfqws_post "$desync_http" "$desync_http" $QNUM
+	fw_nfqws_post "$desync_https" "$desync_https" $QNUM
+}
diff --git a/init.d/sysv/custom-desync-keepalive b/init.d/sysv/custom-desync-keepalive
new file mode 100644
index 0000000..6a8b86d
--- /dev/null
+++ b/init.d/sysv/custom-desync-keepalive
@@ -0,0 +1,15 @@
+# this script contain your special code to launch daemons and configure firewall
+# use helpers from "functions" file and "zapret" init script
+# in case of upgrade keep this file only, do not modify others
+
+zapret_custom_daemons()
+{
+	run_daemon $1 1 $NFQWS "$NFQWS_OPT_BASE $NFQWS_OPT_DESYNC"
+}
+zapret_custom_firewall()
+{
+	local desync_http="--dport 80 -m mark ! --mark $DESYNC_MARK/$DESYNC_MARK"
+	local desync_https="--dport 443 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 2:4 -m mark ! --mark $DESYNC_MARK/$DESYNC_MARK"
+	fw_nfqws_post $1 "$desync_http" "$desync_http" $QNUM
+	fw_nfqws_post $1 "$desync_https" "$desync_https" $QNUM
+}