diff --git a/apps/airprobe_decode.py b/apps/airprobe_decode.py
new file mode 100755
index 0000000..74f851a
--- /dev/null
+++ b/apps/airprobe_decode.py
@@ -0,0 +1,357 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# @file
+# @author Roman Khassraf <rkhassraf@gmail.com>
+# @section LICENSE
+#
+# Gr-gsm 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, or (at your option)
+# any later version.
+#
+# Gr-gsm 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 gr-gsm; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+#
+
+from gnuradio import blocks
+from gnuradio import eng_notation
+from gnuradio import gr
+from gnuradio.eng_option import eng_option
+from optparse import OptionParser, OptionGroup
+import collections
+import grgsm
+import socket
+
+
+class airprobe_decoder(gr.top_block):
+
+    def __init__(self, timeslot=0, subslot=None, chan_mode='BCCH',
+                 burst_file=None,
+                 cfile=None, fc=939.4e6, samp_rate=2e6, arfcn=None,
+                 a5=1, a5_kc=None,
+                 speech_file=None, speech_codec=None):
+
+        gr.top_block.__init__(self, "Airprobe Decode")
+
+        ##################################################
+        # Parameters
+        ##################################################
+        self.timeslot = timeslot
+        self.subslot = subslot
+        self.chan_mode = chan_mode
+        self.burst_file = burst_file
+        self.cfile = cfile
+        self.fc = fc
+        self.samp_rate = samp_rate
+        self.arfcn = arfcn
+        self.a5 = a5
+        self.kc = a5_kc
+        if len(a5_kc) < 8:
+            self.kc = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
+        self.speech_file = speech_file
+        self.speech_codec = speech_codec
+
+        ##################################################
+        # Blocks
+        ##################################################
+
+        if self.burst_file:
+            self.burst_file_source = grgsm.burst_file_source(burst_file)
+        elif self.cfile:
+            self.file_source = blocks.file_source(gr.sizeof_gr_complex*1, self.cfile, False)
+            self.receiver = grgsm.receiver(4, ([0]), ([]))
+            self.input_adapter = grgsm.gsm_input(
+                ppm=0,
+                osr=4,
+                fc=fc,
+                samp_rate_in=samp_rate,
+            )
+            self.offset_control = grgsm.clock_offset_control(fc)
+
+        self.dummy_burst_filter = grgsm.dummy_burst_filter()
+        self.timeslot_filter = grgsm.burst_timeslot_filter(self.timeslot)
+
+        self.subslot_filter = None
+        if self.chan_mode == 'BCCH_SDCCH4' and self.subslot is not None:
+            self.subslot_filter = grgsm.burst_sdcch_subslot_filter(grgsm.SS_FILTER_SDCCH4, self.subslot)
+        elif self.chan_mode == 'SDCCH8' and self.subslot is not None:
+            self.subslot_filter = grgsm.burst_sdcch_subslot_filter(grgsm.SS_FILTER_SDCCH8, self.subslot)
+
+        if self.chan_mode == 'BCCH':
+            self.bcch_demapper = grgsm.universal_ctrl_chans_demapper(self.timeslot,
+                                                                     ([2, 6, 12, 16, 22, 26, 32, 36, 42, 46]),
+                                                                     ([1, 2, 2, 2, 2, 2, 2, 2, 2, 2]))
+        elif self.chan_mode == 'BCCH_SDCCH4':
+            self.bcch_sdcch4_demapper = grgsm.universal_ctrl_chans_demapper(self.timeslot,
+                                                                            ([2, 6, 12, 16, 22, 26, 32, 36, 42, 46]),
+                                                                            ([1, 2, 2, 2, 7, 7, 7, 7, 135, 135]))
+        elif self.chan_mode == 'SDCCH8':
+            self.sdcch8_demapper = grgsm.universal_ctrl_chans_demapper(self.timeslot,
+                                                                       ([0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44]),
+                                                                       ([8, 8, 8, 8, 8, 8, 8, 8, 136, 136, 136, 136]))
+        elif self.chan_mode == 'TCHF':
+            self.tch_f_demapper = grgsm.tch_f_chans_demapper(self.timeslot)
+            self.tch_f_decoder = grgsm.tch_f_decoder(speech_codec, speech_file)
+
+        if self.kc != [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]:
+            self.decryption = grgsm.decryption(self.kc, self.a5)
+            self.cch_decoder_decrypted = grgsm.control_channels_decoder()
+            if self.chan_mode == 'TCHF':
+                self.decryption_tch_sacch = grgsm.decryption(self.kc, self.a5)
+
+        self.cch_decoder = grgsm.control_channels_decoder()
+
+        self.socket_pdu = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000, False)
+
+        ##################################################
+        # Asynch Message Connections
+        ##################################################
+
+        if self.burst_file:
+            self.msg_connect(self.burst_file_source, "out", self.dummy_burst_filter, "in")
+        elif self.cfile:
+            self.connect((self.file_source, 0), (self.input_adapter, 0))
+            self.connect((self.input_adapter, 0), (self.receiver, 0))
+            self.msg_connect(self.offset_control, "ppm", self.input_adapter, "ppm_in")
+            self.msg_connect(self.receiver, "measurements", self.offset_control, "measurements")
+            self.msg_connect(self.receiver, "C0", self.dummy_burst_filter, "in")
+
+        self.msg_connect(self.dummy_burst_filter, "out", self.timeslot_filter, "in")
+
+        if (self.chan_mode == 'BCCH_SDCCH4' or self.chan_mode == 'SDCCH8') and self.subslot_filter is not None:
+            self.msg_connect(self.timeslot_filter, "out", self.subslot_filter, "in")
+
+        if self.chan_mode == 'BCCH':
+            if self.subslot_filter is not None:
+                self.msg_connect(self.subslot_filter, "out", self.bcch_demapper, "bursts")
+            else:
+                self.msg_connect(self.timeslot_filter, "out", self.bcch_demapper, "bursts")
+
+            self.msg_connect(self.bcch_demapper, "bursts", self.cch_decoder, "bursts")
+            self.msg_connect(self.cch_decoder, "msgs", self.socket_pdu, "pdus")
+
+        elif self.chan_mode == 'BCCH_SDCCH4':
+            if self.subslot_filter is not None:
+                self.msg_connect(self.subslot_filter, "out", self.bcch_sdcch4_demapper, "bursts")
+            else:
+                self.msg_connect(self.timeslot_filter, "out", self.bcch_sdcch4_demapper, "bursts")
+
+            if self.kc != [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]:
+                self.msg_connect(self.bcch_sdcch4_demapper, "bursts", self.decryption, "bursts")
+                self.msg_connect(self.decryption, "bursts", self.cch_decoder_decrypted, "bursts")
+                self.msg_connect(self.cch_decoder_decrypted, "msgs", self.socket_pdu, "pdus")
+
+            self.msg_connect(self.bcch_sdcch4_demapper, "bursts", self.cch_decoder, "bursts")
+            self.msg_connect(self.cch_decoder, "msgs", self.socket_pdu, "pdus")
+
+        elif self.chan_mode == 'SDCCH8':
+            if self.subslot_filter is not None:
+                self.msg_connect(self.subslot_filter, "out", self.sdcch8_demapper, "bursts")
+            else:
+                self.msg_connect(self.timeslot_filter, "out", self.sdcch8_demapper, "bursts")
+
+            if self.kc != [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]:
+                self.msg_connect(self.sdcch8_demapper, "bursts", self.decryption, "bursts")
+                self.msg_connect(self.decryption, "bursts", self.cch_decoder_decrypted, "bursts")
+                self.msg_connect(self.cch_decoder_decrypted, "msgs", self.socket_pdu, "pdus")
+
+            self.msg_connect(self.sdcch8_demapper, "bursts", self.cch_decoder, "bursts")
+            self.msg_connect(self.cch_decoder, "msgs", self.socket_pdu, "pdus")
+
+        elif self.chan_mode == 'TCHF':
+            self.msg_connect(self.timeslot_filter, "out", self.tch_f_demapper, "bursts")
+            if self.kc != [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]:
+                self.msg_connect(self.tch_f_demapper, "acch_bursts", self.decryption_tch_sacch, "bursts")
+                self.msg_connect(self.tch_f_demapper, "tch_bursts", self.decryption, "bursts")
+
+                self.msg_connect(self.decryption_tch_sacch, "bursts", self.cch_decoder, "bursts")
+                self.msg_connect(self.decryption, "bursts", self.tch_f_decoder, "bursts")
+            else:
+                self.msg_connect(self.tch_f_demapper, "acch_bursts", self.cch_decoder, "bursts")
+                self.msg_connect(self.tch_f_demapper, "tch_bursts", self.tch_f_decoder, "bursts")
+
+            self.msg_connect(self.tch_f_decoder, "msgs", self.socket_pdu, "pdus")
+            self.msg_connect(self.cch_decoder, "msgs", self.socket_pdu, "pdus")
+            
+
+if __name__ == '__main__':
+
+    # List of channel configurations
+    channel_modes = ['BCCH', 'BCCH_SDCCH4', 'SDCCH8', 'TCHF']
+
+    # mapping options to grgsm's enums
+    tch_codecs = collections.OrderedDict([
+        ('FR', grgsm.TCH_FS),
+        ('EFR', grgsm.TCH_EFR),
+        ('AMR12.2', grgsm.TCH_AFS12_2),
+        ('AMR10.2', grgsm.TCH_AFS10_2),
+        ('AMR7.95', grgsm.TCH_AFS7_95),
+        ('AMR7.4', grgsm.TCH_AFS7_4),
+        ('AMR6.7', grgsm.TCH_AFS6_7),
+        ('AMR5.9', grgsm.TCH_AFS5_9),
+        ('AMR5.15', grgsm.TCH_AFS5_15),
+        ('AMR4.75', grgsm.TCH_AFS4_75)
+    ])
+
+    kc = []
+
+    parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
+
+    def kc_callback(option, opt_str, value, parser):
+
+        """ Callback function that parses Kc """
+
+        # format 0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF
+        if ',' in value:
+            value_str = value.split(',')
+
+            for s in value_str:
+                val = int(s, 16)
+                if val < 0 or val > 255:
+                    parser.error("Invalid Kc % s\n" % s)
+                kc.append(val)
+            if len(kc) != 8:
+                parser.error("Invalid Kc length")
+        # format: 1234567890ABCDEF
+        elif len(value) == 16:
+            for i in range(8):
+                s = value[2*i: 2*i + 2]
+                val = int(s, 16)
+                if val < 0 or val > 255:
+                    parser.error("Invalid Kc % s\n" % s)
+                kc.append(val)
+        else:
+            parser.error("Invalid Kc format")
+
+    # define options
+    parser.add_option("-m", "--mode", dest="chan_mode", default='BCCH',
+                      type='choice', choices=channel_modes,
+                      help="Channel mode. Valid options are 'BCCH' (Non-combined C0), "
+                           "'BCCH_SDCCH4'(Combined C0), 'SDCCH8' (Stand-alone control channel) "
+                           "and 'TCHF' (Traffic Channel, Full rate) ")
+    parser.add_option("-t", "--timeslot", dest="timeslot", type="intx", default=0,
+                      help="Timeslot to decode [default=%default]")
+    parser.add_option("-u", "--subslot", dest="subslot", type="intx",
+                      help="Subslot to decode. Use in combination with channel type BCCH_SDCCH4 and SDCCH8")
+    parser.add_option("-b", "--burst-file", dest="burst_file", help="Input file (bursts)")
+    parser.add_option("-c", "--cfile", dest="cfile", help="Input file (cfile)")
+
+    # group cfile options together
+    cfile_options = OptionGroup(
+        parser, 'Cfile Options', 'Options for decoding cfile input.',
+    )
+    cfile_options.add_option("-f", "--fc", dest="fc", type="eng_float",
+                             help="Frequency of cfile capture [default=eng_notation.num_to_str(939.4e6)]")
+    cfile_options.add_option("-a", "--arfcn", dest="arfcn", type="intx",
+                             help="Set ARFCN instead of frequency. "
+                                  "In some cases you may have to provide the GSM band also")
+    cfile_options.add_option("--band", dest="band",
+                             help="Specify the GSM band for the frequency.\nAvailable bands are: "
+                                  + ", ".join(grgsm.arfcn.get_bands()) + "."
+                                  + "If no band is specified, it will be determined automatically, defaulting to 0.")
+    cfile_options.add_option("-s", "--samp-rate", dest="samp_rate", type="eng_float",
+                             default=eng_notation.num_to_str(2e6),
+                             help="Sample rate of cfile capture [default=%default]")
+    parser.add_option_group(cfile_options)
+
+    # group decryption options
+    decryption_options = OptionGroup(
+        parser, 'Decryption Options', 'Options for setting the A5 decryption parameters.',
+    )
+    decryption_options.add_option("-e", "--a5", dest="a5", type="intx", default=1,
+                                  help="A5 version [default=%default]. A5 versions 1 - 3 supported")
+    decryption_options.add_option("-k", "--kc", action="callback", callback=kc_callback, type="string",
+                                  help="A5 session key Kc. Valid formats are "
+                                       "'0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF' and '1234567890ABCDEF'")
+    parser.add_option_group(decryption_options)
+
+    # group TCH options
+    tch_options = OptionGroup(
+        parser, 'TCH Options', 'Options for setting Traffic channel decoding parameters.',
+    )
+    tch_options.add_option("-d", "--speech-codec", dest="speech_codec", default='FR',
+                           type='choice', choices=tch_codecs.keys(),
+                           help="TCH-F speech codec [default=%default]. "
+                                "Valid options are " + ", ".join(tch_codecs.keys()))
+    tch_options.add_option("-o", "--output-tch", dest="speech_output_file", default="/tmp/speech.au.gsm",
+                           help="TCH/F speech output file [default=%default].")
+    parser.add_option_group(tch_options)
+
+    # parse
+    (options, args) = parser.parse_args()
+
+    # some verifications
+    if (options.cfile is None and options.burst_file is None) or \
+            (options.cfile is not None and options.burst_file is not None):
+        parser.error("Please provide a cfile or a burst file (but not both) as input\n")
+
+    if options.timeslot < 0 or options.timeslot > 7:
+        parser.error("Invalid timeslot. Must be a in range 0-7\n")
+
+    if options.subslot is not None and (options.subslot < 0 or options.subslot > 7):
+        parser.error("Invalid subslot. Must be a in range 0-7\n")
+
+    if options.a5 < 0 or options.a5 > 3:
+        parser.error("Invalid A5 version\n")
+
+    if (options.fc is None and options.arfcn is None) or (options.fc is not None and options.arfcn is not None):
+        parser.error("You have to provide either a frequency or an ARFCN (but not both).\n")
+
+    # handle frequency / arfcn input
+    arfcn = 0
+    fc = 939.4e6
+    if options.arfcn:
+        if options.band:
+            if options.band not in grgsm.arfcn.get_bands():
+                parser.error("Invalid GSM band\n")
+            elif not grgsm.arfcn.is_valid_arfcn(options.arfcn, options.band):
+                parser.error("ARFCN is not valid in the specified band\n")
+            else:
+                arfcn = options.arfcn
+                fc = grgsm.arfcn.arfcn2downlink(arfcn, options.band)
+        else:
+            arfcn = options.arfcn
+            for band in grgsm.arfcn.get_bands():
+                if grgsm.arfcn.is_valid_arfcn(arfcn, band):
+                    fc = grgsm.arfcn.arfcn2downlink(arfcn, band)
+                    break
+    elif options.fc:
+        fc = options.fc
+        if options.band:
+            if options.band not in grgsm.arfcn.get_bands():
+                parser.error("Invalid GSM band\n")
+            elif not grgsm.arfcn.is_valid_downlink(options.fc, options.band):
+                parser.error("Frequency is not valid in the specified band\n")
+            else:
+                arfcn = grgsm.arfcn.downlink2arfcn(options.fc, options.band)
+        else:
+            for band in grgsm.arfcn.get_bands():
+                if grgsm.arfcn.is_valid_downlink(options.fc, band):
+                    arfcn = grgsm.arfcn.downlink2arfcn(options.fc, band)
+                    break
+
+    # open udp port 4729 to avoid icmp messages
+    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    sock.bind(("localhost", 4729))
+
+    # instanciate decoder
+    tb = airprobe_decoder(timeslot=options.timeslot, subslot=options.subslot, chan_mode=options.chan_mode,
+                          burst_file=options.burst_file,
+                          cfile=options.cfile, arfcn=arfcn, fc=fc, samp_rate=options.samp_rate,
+                          a5=options.a5, a5_kc=kc,
+                          speech_file=options.speech_output_file, speech_codec=tch_codecs.get(options.speech_codec))
+
+    # run
+    tb.start()
+    tb.wait()
+
+    # we are done, close socket
+    sock.close()
