diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt
index cc638ba..6764ffa 100644
--- a/Lua_scripts/MultiChan.txt
+++ b/Lua_scripts/MultiChan.txt
@@ -191,6 +191,7 @@
 62,0,XK,X450,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video
 62,1,XK,X420,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video,Flip,Light
 62,2,XK,Cars,0,FMode,TakeOf,Emerg,3D_6G,Pict,Video,Flip,Light
+99,0,XK2,X4,0,Rate,Mode,Hover
 8,0,YD717,Std,1,Flip,Light,Pict,Video,HLess
 8,1,YD717,SkyWlkr,1,Flip,Light,Pict,Video,HLess
 8,2,YD717,Simax4,1,Flip,Light,Pict,Video,HLess
diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt
index 5c8ccd3..e28ef65 100644
--- a/Multiprotocol/Multi.txt
+++ b/Multiprotocol/Multi.txt
@@ -94,4 +94,5 @@
 95,BlueFly
 96,BumbleB
 97,SGF22
-98,Kyosho3
\ No newline at end of file
+98,Kyosho3
+99,XK2
\ No newline at end of file
diff --git a/Multiprotocol/Multi_Protos.ino b/Multiprotocol/Multi_Protos.ino
index 27367df..fecf26f 100644
--- a/Multiprotocol/Multi_Protos.ino
+++ b/Multiprotocol/Multi_Protos.ino
@@ -82,6 +82,7 @@ const char STR_FX[]			="FX";
 const char STR_BAYANG_RX[]	="BayanRX";
 const char STR_PELIKAN[]	="Pelikan";
 const char STR_XK[]			="XK";
+const char STR_XK2[]		="XK2";
 const char STR_XN297DUMP[]	="XN297DP";
 const char STR_FRSKYR9[]	="FrSkyR9";
 const char STR_PROPEL[]		="Propel";
@@ -495,6 +496,9 @@ const mm_protocol_definition multi_protocols[] = {
 	#if defined(XK_CCNRF_INO)
 		{PROTO_XK,         STR_XK,        STR_SUBTYPE_XK,        3, OPTION_RFTUNE,  0, 0, SW_NRF,    XK_init,         XK_callback         },	
 	#endif
+	#if defined(XK2_CCNRF_INO)
+		{PROTO_XK2,        STR_XK2,       NO_SUBTYPE,            0, OPTION_RFTUNE,  0, 0, SW_NRF,    XK2_init,        XK2_callback        },	
+	#endif
 	#if defined(XN297DUMP_NRF24L01_INO)
 		{PROTO_XN297DUMP,  STR_XN297DUMP, STR_SUBTYPE_XN297DUMP, 6, OPTION_RFCHAN,  0, 0, SW_NRF,    XN297Dump_init,  XN297Dump_callback  },
 	#endif
diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h
index dc302b7..3d41013 100644
--- a/Multiprotocol/Multiprotocol.h
+++ b/Multiprotocol/Multiprotocol.h
@@ -19,7 +19,7 @@
 #define VERSION_MAJOR		1
 #define VERSION_MINOR		3
 #define VERSION_REVISION	4
-#define VERSION_PATCH_LEVEL	9
+#define VERSION_PATCH_LEVEL	10
 
 #define MODE_SERIAL 0
 
@@ -126,7 +126,7 @@ enum PROTOCOLS
 	PROTO_BUMBLEB	= 96,	// =>CC2500 & NRF24L01
 	PROTO_SGF22		= 97,	// =>NRF24L01
 	PROTO_KYOSHO3	= 98,	// =>CYRF6936
-
+	PROTO_XK2		= 99,	// =>CC2500 & NRF24L01
 	
 	PROTO_NANORF	= 126,	// =>NRF24L01
 	PROTO_TEST		= 127,	// =>CC2500
diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h
index beffa13..0e29d1d 100644
--- a/Multiprotocol/Validate.h
+++ b/Multiprotocol/Validate.h
@@ -354,6 +354,7 @@
 	#undef	SLT_CCNRF_INO
 	#undef	V911S_CCNRF_INO
 	#undef	XK_CCNRF_INO
+	#undef	XK2_CCNRF_INO
 #endif
 #if not defined(DSM_CYRF6936_INO)
 	#undef	LOSI_CYRF6936_INO
diff --git a/Multiprotocol/XK2_ccnrf.ino b/Multiprotocol/XK2_ccnrf.ino
new file mode 100644
index 0000000..99492f6
--- /dev/null
+++ b/Multiprotocol/XK2_ccnrf.ino
@@ -0,0 +1,201 @@
+/*
+ This project is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+Multiprotocol is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Multiprotocol.  If not, see .
+ */
+// Compatible with XK TX X4 and model A160S.
+
+#if defined(XK2_CCNRF_INO)
+
+#include "iface_xn297.h"
+
+#define FORCE_XK2_ID
+
+#define XK2_RF_BIND_CHANNEL	71
+#define XK2_PAYLOAD_SIZE	9
+#define XK2_PACKET_PERIOD	4911
+#define XK2_RF_NUM_CHANNELS	4
+
+enum {
+	XK2_BIND1,
+	XK2_BIND2,
+	XK2_DATA_PREP,
+	XK2_DATA
+};
+
+static void __attribute__((unused)) XK2_send_packet()
+{
+	static uint8_t trim_ch=0;
+	
+	if(IS_BIND_IN_PROGRESS)
+	{
+		packet[0] = 0x9D;
+		//TXID
+		memcpy(&packet[1], rx_tx_addr, 3);
+		//RXID
+		//memcpy(&packet[4], rx_id     , 3);
+		//Unknown
+		packet[7] = 0x00;
+		//Checksum seed
+		packet[8] = 0xC0;												//Constant?
+	}
+	else
+	{
+		XN297_Hopping(hopping_frequency_no);
+		hopping_frequency_no++;
+		hopping_frequency_no &= 0x03;
+		//Channels
+		packet[0] = convert_channel_16b_limit(AILERON ,0x00,0x64);		//Aileron
+		packet[1] = convert_channel_16b_limit(ELEVATOR,0x00,0x64);		//Elevator
+		packet[2] = convert_channel_16b_limit(THROTTLE,0x00,0x64);		//Throttle
+		packet[3] = convert_channel_16b_limit(RUDDER  ,0x00,0x64);		//Rudder
+		//Center the trims
+		trim_ch++;
+		if(trim_ch > 2) trim_ch = 0;
+		packet[4] = 0x20 + 0x40 * trim_ch;								//Trims are A=01..20..3F/E=41..60..7F/R=81..A0..BF, E0 appears when telemetry is received, C1 when p[6] changes from 00->08, C0 when p[6] changes from 08->00
+		if(trim_ch == 2)												//Drive rudder trim since otherwise there is no control...
+		{
+			packet[4] = 0x80 + (convert_channel_8b(RUDDER)>>2);
+			if(packet[4] <= 0x81) packet[4] = 0x81;
+		}
+		//Flags
+		packet[5] = GET_FLAG(CH5_SW, 0x01)								//Rate
+				  | GET_FLAG(CH6_SW, 0x08)								//Mode
+				  | GET_FLAG(CH7_SW, 0x20);								//Hover
+		//Telemetry not received=00, Telemetry received=01 but sometimes switch to 1 even if telemetry is not there...
+		packet[6] = 0x00;
+		//Unknown
+		packet[7] = 0x5A;												//Constant?
+		//Checksum seed
+		packet[8] = 0x7F;												//Constant?
+	}
+	//Checksum
+	for(uint8_t i=0; i