diff --git a/apps/trx/ctrl_if.py b/apps/trx/ctrl_if.py
index 43fc185..58960c5 100644
--- a/apps/trx/ctrl_if.py
+++ b/apps/trx/ctrl_if.py
@@ -25,42 +25,17 @@
 import socket
 import select
 
-class UDPServer:
-	def __init__(self, remote_addr, remote_port, bind_port):
-		self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-		self.sock.bind(('0.0.0.0', bind_port))
-		self.sock.setblocking(0)
+from udp_link import UDPLink
 
-		# Save remote info
-		self.remote_addr = remote_addr
-		self.remote_port = remote_port
-
-	def loop(self):
-		r_event, w_event, x_event = select.select([self.sock], [], [])
-
-		# Check for incoming data
-		if self.sock in r_event:
-			data, addr = self.sock.recvfrom(128)
-			self.handle_rx(data)
-
-	def shutdown(self):
-		self.sock.close();
-
-	def send(self, data):
-		self.sock.sendto(data, (self.remote_addr, self.remote_port))
-
-	def handle_rx(self, data):
-		raise NotImplementedError
-
-class CTRLInterface(UDPServer):
+class CTRLInterface(UDPLink):
 	def __init__(self, remote_addr, remote_port, bind_port, radio_if):
 		print("[i] Init TRX CTRL interface")
-		UDPServer.__init__(self, remote_addr, remote_port, bind_port)
+		UDPLink.__init__(self, remote_addr, remote_port, bind_port)
 		self.tb = radio_if
 
 	def shutdown(self):
 		print("[i] Shutdown TRX CTRL interface")
-		UDPServer.shutdown(self)
+		UDPLink.shutdown(self)
 
 	def handle_rx(self, data):
 		if self.verify_req(data):
diff --git a/apps/trx/udp_link.py b/apps/trx/udp_link.py
new file mode 100644
index 0000000..0d90ec9
--- /dev/null
+++ b/apps/trx/udp_link.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+
+# GR-GSM based transceiver
+# UDP link implementation
+#
+# (C) 2017 by Vadim Yanitskiy <axilirator@gmail.com>
+#
+# All Rights Reserved
+#
+# This program 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 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import socket
+import select
+
+class UDPLink:
+	def __init__(self, remote_addr, remote_port, bind_port):
+		self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+		self.sock.bind(('0.0.0.0', bind_port))
+		self.sock.setblocking(0)
+
+		# Save remote info
+		self.remote_addr = remote_addr
+		self.remote_port = remote_port
+
+	def loop(self):
+		r_event, w_event, x_event = select.select([self.sock], [], [])
+
+		# Check for incoming data
+		if self.sock in r_event:
+			data, addr = self.sock.recvfrom(128)
+			self.handle_rx(data.decode())
+
+	def shutdown(self):
+		self.sock.close();
+
+	def send(self, data):
+		if type(data) not in [bytearray, bytes]:
+			data = data.encode()
+
+		self.sock.sendto(data, (self.remote_addr, self.remote_port))
+
+	def handle_rx(self, data):
+		raise NotImplementedError
