Merged uplink-decoding branch (with complete support for control channels decoding on uplink)

# Conflicts:
#	examples
#	lib/demapping/universal_ctrl_chans_demapper_impl.cc
#	lib/receiver/receiver_impl.cc
diff --git a/.gitignore b/.gitignore
index 9cef6bd..321fa74 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,4 +5,4 @@
 *.pyc
 *.pyo
 .unittests
-
+build/
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..f87dc9f
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,6 @@
+[submodule "test_data"]
+	path = test_data
+	url = https://github.com/ptrkrysik/test_data.git
+[submodule "examples"]
+	path = examples
+	url = https://github.com/ptrkrysik/examples.git
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..551b982
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,20 @@
+sudo: required
+
+language: ruby
+
+env:
+  #- DOCKERFILE=tests/dockerfiles/Debian_Jessie.docker IMGNAME=debjess-grgsm
+  #- DOCKERFILE=tests/dockerfiles/Ubuntu_15_04.docker IMGNAME=ubu15.04-grgsm
+  - DOCKERFILE=tests/dockerfiles/Debian_testing.docker IMGNAME=debtest-grgsm
+  - DOCKERFILE=tests/dockerfiles/Ubuntu_16_04.docker IMGNAME=ubu16.04-grgsm
+
+services:
+  - docker
+
+before_install:
+  - cat $DOCKERFILE > Dockerfile ; docker build -t $IMGNAME .
+
+script:
+  - docker run -it --rm $IMGNAME sh -c 'cd /src/build;make test'
+  - docker run -it --rm $IMGNAME /src/tests/scripts/decode.sh
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c8fac31..00c37dd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -64,6 +64,17 @@
     message(FATAL_ERROR "Boost required to compile gr-gsm")
 endif()
 
+find_package(SWIG)
+
+if(SWIG_FOUND)
+    # Minimum SWIG version required is 1.3.31
+    set(SWIG_VERSION_CHECK FALSE)
+    if("${SWIG_VERSION}" VERSION_GREATER "1.3.30")
+        set(SWIG_VERSION_CHECK TRUE)
+    endif()
+endif(SWIG_FOUND)
+
+
 ########################################################################
 # Install directories
 ########################################################################
@@ -142,6 +153,21 @@
 set(GR_GSM_SWIG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/swig CACHE INTERNAL "" FORCE)
 
 ########################################################################
+# On Apple only, set install name and use rpath correctly, if not already set
+########################################################################
+if(APPLE)
+    if(NOT CMAKE_INSTALL_NAME_DIR)
+        set(CMAKE_INSTALL_NAME_DIR ${CMAKE_INSTALL_PREFIX}/${GR_LIBRARY_DIR} CACHE PATH "Library Install Name Destination Directory" FORCE)
+    endif(NOT CMAKE_INSTALL_NAME_DIR)
+    if(NOT CMAKE_INSTALL_RPATH)
+        set(cmakE_INSTALL_RPATH  ${CMAKE_INSTALL_PREFIX}/${GR_LIBRARY_DIR} CACHE PATH "Library Install RPath" FORCE)
+    endif(NOT CMAKE_INSTALL_RPATH)
+    if(NOT CMAKE_BUILD_WITH_INSTALL_RPATH)
+        set(CMAKE_BUILD_WITH_INSTALL_RPATH ON CACHE  BOOL "Do Build Using Library Install RPath" FORCE)
+    endif(NOT CMAKE_BUILD_WITH_INSTALL_RPATH)
+endif(APPLE)
+
+########################################################################
 # Create uninstall target
 ########################################################################
 configure_file(
@@ -170,3 +196,14 @@
 install(FILES cmake/Modules/gr-gsmConfig.cmake
     DESTINATION lib${LIB_SUFFIX}/cmake/grgsm
 )
+
+########################################################################
+# Cpack stuff
+########################################################################
+set(CPACK_DEBIAN_PACKAGE_DEPENDS "gnuradio (>> 3.7.9), gr-osmosdr, libosmogsm5")
+set(CPACK_PACKAGE_NAME gr-gsm)
+set(CPACK_PACKAGE_VERSION 0.9.0)
+set(CPACK_PACKAGE_MAINTAINER ptrkrysik@gmail.com)
+set(CPACK_PACKAGE_DESCRIPTION "GSM functionality for Gnuradio")
+set(CPACK_PACKAGE_CONTACT ptrkrysik@gmail.com)
+include(CPack)
diff --git a/PACKAGING.md b/PACKAGING.md
new file mode 100644
index 0000000..75914db
--- /dev/null
+++ b/PACKAGING.md
@@ -0,0 +1,4 @@
+# Packaging gr-gsm
+## This is a work in progress...
+
+* Run the build.sh script!
diff --git a/README.md b/README.md
index 6ced75e..517b001 100644
--- a/README.md
+++ b/README.md
@@ -4,157 +4,26 @@
 
 The aim is to provide set of tools for receiving information transmitted by GSM equipment/devices.
 
+Installation and usage
+======================
+Please see project's wiki https://github.com/ptrkrysik/gr-gsm/wiki for information on [installation](https://github.com/ptrkrysik/gr-gsm/wiki/Installation) and [usage](https://github.com/ptrkrysik/gr-gsm/wiki/Usage) of gr-gsm.
+
 Mailing list
 ============
 Current gr-gsm project's mailing list address is following:
 
 gr-gsm@googlegroups.com
 
+Mailing list is a place for general discussions, questions about the usage and installation. In case of problem with installation please try to provide full information that will help reproducing it. Minimum information should contain:
+- operating system with version,
+- kind of installation (how gr-gsm and its dependencies were installed: with pybombs, from distibution's repository, compiled manually)
+- version of gnuradio (it can be obtained with: gnuradio-companion --version)
+- error messages (in case of pybombs installation they can be obtained after switching it to verbous mode with -v option).
+
 To join the group with any e-mail addres (google account is not required) use this link:
 
 https://groups.google.com/forum/#!forum/gr-gsm/join
 
-Installation
-============
-The *gr-gsm* is based on *GNU Radio* signal processing framework and takes advantage of its great features like stream tagging and message passing.
-Presence of *GNU Radio* is therefore a basic requirement for compilation and installation of *gr-gsm*. 
-
-The easiest way to install *gr-gsm* it to use *pybombs* installer (GNU Radio install management system). Installation with this tool was tested on Ubuntu 14.04 and 14.10 (on 14.10 installation will be much faster as compilation of *GNU Radio* is not necessary).
-For installation of pybombs you will need git. On Debian based distributions you can get it with:
-```sh
-sudo apt-get install git
-```
-Then download *pybombs* sources using git:
-```sh
-git clone https://github.com/pybombs/pybombs.git
-```
-
-Go into *pybombs* directory and configure it:
-```sh
-cd pybombs
-./pybombs config
-```
-
-As a install prefix enter */usr/local/*. The rest of the options can be left as defaul.
-
-On distributions that have *GNU Radio* version 3.7.3 and above in standard repository, *GNU Radio* can be installed from packages without compilation. To avoid this quite lenghty process use:
-```sh
-./pybombs config forcebuild ' '
-```
-
-To check *GNU Radio* version use:
-```sh
-apt-cache policy gnuradio-dev
-```
-
-**Then build and install *gr-gsm* with following command**:
-```
-sudo ./pybombs install gr-gsm
-```
-
-Pybombs will take care of downloading all of required libraries and for installation of *GNU Radio* and building *gr-gsm*.
-
-At the end create the `~/.gnuradio/config.conf` config file so gnuradio-companion can find custom blocks of gr-gsm:
-
-```ini
-[grc]
-local_blocks_path=/usr/local/share/gnuradio/grc/blocks
-```
-
-Usage
-=====
-There are many possible applications of *gr-gsm*. At this moment there is one application that is ready out of the box. It is improved replacement of the old *Airprobe* - the program that lets you receive and decode GSM control messages from *timeslot 0* on the broadcasting channel of a BTS. After installation of *gr-gsm* there are two python executables that will be installed:
-
--```airprobe_rtlsdr.py```,
-
--```airprobe_file.py```.
-
-Airprobe with RTL-SDR input
----------------
-This program uses cheap RTL-SDR receivers as a source of the signal. It can be started by running from a terminal:
-```
-airprobe_rtlsdr.py
-```
-The window of the program contains amplitude spectrum of the signal drawn in real-time. The central frequency of the signal can be changed by moving *fc* slider. The GSM signal has bandwidth of around *200kHz*. By looking for constant hills on the spectrum of such width you can find a GSM broadcasting channel. After setting the *fc* slider to a carrier frequency of a broadcasting channel the program should immediately print content of subsequent messages on the standard output. 
-
-If it doesn't happen, set *ppm* slider into different positions. The slider is responsible for setting devices clock offset correction. If the clock offset is too large the clock offset correction algorithm that is implemented in the program won't work. There is intentionally added upper of allowable clock offset - it was done in order to avoid adaptation of the algorithm to neighbour channels that would inevitably lead to instability. You can use the value set later by passing it as argument of the program:
-```
-airprobe_rtlsdr.py -p <correction>
-```
-
-Airprobe with file input
--------------
-This program processes files containing complex data - interleaved float IQ samples.
-Example of the usage:
-```
-airprobe_file.py --samp-rate=1M --fc=940M -i input_file 
-```
-where:
-```
---samp-rate - sampling frequency of the data stored in the file,
---fc - central frequency of the recorded data - it is needed for frequency offset correction,
--i - the file containing the complex data.
-```
-
-Analyzing GSM messages in the Wireshark
--------------------------------------------
-The *Airprobe* (file, rtlsdr) application sends GSM messages in *GSMTAP* format that was created by *Harald Welte* to the UDP port number 4729. Wireshark interprets packets coming on this port as GSM data with *GSMTAP* header and it is able to dissect messages.
-
-On Debian like systems *Wireshark can be installed with:
-```
-sudo apt-get install wireshark
-```
-To start *Wireshark* straight to analysis of the *GSMTAP* packets obtained from *gr-gsm*'s airprobe use following command:
-```
-sudo wireshark -k -f udp -Y gsmtap -i lo
-````
-
-If you want to avoid the risks caused by running *Wireshark* with root privileges follow this short howto:
-https://ask.wireshark.org/questions/7976/wireshark-setup-linux-for-nonroot-user
-
-Manual compilation and installation of gr-gsm
-=============================================
-
-If you intend to develop gr-gsm or have problem with pyboms installation - here is description how to manually compile and install gr-gsm from source.
-
-You will need gnuradio, rtl-sdr, and gr-osmosdr. For their installation look at homepages of those projects:
-http://gnuradio.org/redmine/projects/gnuradio/wiki
-http://sdr.osmocom.org/trac/wiki/rtl-sdr
-http://sdr.osmocom.org/trac/wiki/GrOsmoSDR
-
-Sometimes it is possible to install these programs/libraries from distibution's repository. Keep in mind that gr-gsm need GNU Radio 3.7.3 and above.
-
-To download gr-gsm sources run following command:
-
-```
-git clone https://github.com/ptrkrysik/gr-gsm.git
-```
-
-Make sure that you have all required packages (checked on Ubuntu 14.04 and 14.10):
-
-```
-sudo apt-get install cmake libboost-all-dev libcppunit-dev swig \
-                     doxygen liblog4cpp5-dev python-scipy
-```
-
-To compile and install gr-gsm run:
-
-```
-cd gr-gsm
-mkdir build
-cmake ..
-make
-sudo make install
-```
-
-
-Installation using Docker
-=========================
-It is possible to install gr-gsm with use of Docker image prepared by Marcel Maatkamp.
-This method of installation might be easier for people using distributions where pybombs doesn't work.
-The installation guide is available here:
-https://github.com/marcelmaatkamp/docker-gnuradio-gr-gsm-ptrkrysik
-
 Development
 ===========
 New features are accepted through github's pull requests. When creating pull request try to make it adress one topic (addition of a feature x, corretion of bug y).
diff --git a/TESTING.md b/TESTING.md
new file mode 100644
index 0000000..b51e647
--- /dev/null
+++ b/TESTING.md
@@ -0,0 +1,15 @@
+# Testing gr-gsm
+
+## CI Testing
+
+CI testing currently consists of attempting to build gr-gsm as described in the .docker files located under gr-gsm/tests/dockerfiles using travis-ci.org.  If the build is successful, travis-ci will attempt to decode the test file located under gr-gsm/test_data and compare the results to this file: gr-gsm/tests/fixtures/grgsm_decode_test1_expected.  See the gr-gsm/tests/scripts/decode.sh file for details.
+
+## Integration testing
+
+Integration testing with use of the grgsm_scanner application:
+* Make sure that your RTL SDR dongle is plugged into the system and if you're running on Mac, you need to have the dongle accessible to the VirtualBox VM that's running Docker.
+* cd gr-gsm/tests/scripts
+* scanner.sh
+
+This will copy the entire contents of the currently checked out branch of gr-gsm to a temp folder, and attempt to build the docker images according to the definitions in the .docker files located under gr-gsm/dockerfiles.  
+Once the images are created, the script instantiates a container for testing the rtlsdr scanner on each band, against each Docker image built.  This can take quite a while.  If you're running on Mac, consider using the ```caffeinate``` command to keep your machine from sleeping.
diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt
index ce8b205..48fabb0 100644
--- a/apps/CMakeLists.txt
+++ b/apps/CMakeLists.txt
@@ -18,14 +18,26 @@
 # Boston, MA 02110-1301, USA.
 
 include(GrPython)
-
-#GRCC( airprobe_file.grc airprobe_rtlsdr.grc airprobe_usrp.grc ${CMAKE_CURRENT_BINARY_DIR} ) #PK: removed untill I figure out how to do this correctly
+include(CreateSymlink)
+add_subdirectory(helpers)
 
 GR_PYTHON_INSTALL(
     PROGRAMS
-#    ${PYFILES}
-    airprobe_file.py
-    airprobe_rtlsdr.py
-
+    grgsm_livemon
+    grgsm_scanner
+    grgsm_decode
     DESTINATION bin
 )
+
+CREATE_SYMLINK(grgsm_livemon airprobe_rtlsdr.py)
+CREATE_SYMLINK(grgsm_decode airprobe_decode.py)
+CREATE_SYMLINK(grgsm_scanner airprobe_rtlsdr_scanner.py)
+
+add_custom_target(apps_symlinks ALL DEPENDS ${symlinks})
+
+install(
+    PROGRAMS
+    ${symlinks}
+    DESTINATION bin
+)
+
diff --git a/apps/README b/apps/README
index 1106ef5..e811c06 100644
--- a/apps/README
+++ b/apps/README
@@ -1,6 +1,17 @@
-This directory contains programs based on gr-gsm. Currently two are available:
-- airprobe_rtlsdr.py
-- airprobe_file.py
+This directory contains programs based on gr-gsm:
+* grgsm_decode     (old name: airprobe_decode.py) - program for decoding C0 channel 
+                    which is most close in terms of functionality to the old gsm-receiver 
+                    from Airprobe project, with ability to decode signalling channels and traffic channels with speech 
+                    (analysis of the data can be performed in Wireshark, decoded sound is stored to an audio file),
+* grgsm_livemon    (old name: airprobe_rtlsdr.py) - interactive monitor of a single C0 channel with analysis 
+`                   performed by Wireshark (command to run wireshark: sudo wireshark -k -f udp -Y gsmtap -i lo),
+* grgsm_scanner    (old name: airprobe_rtlsdr_scanner.py) - an application that scans GSM bands and prints 
+                    information about base transceiver stations transmitting in the area.
 
-- airprobe_usrp can be used but it will need to be customized in the gnuradio-companion for given configuration (for example address of the USRP will need to be changed).
+There are following helper programs for grgsm_decode program:
+
+* grgsm_capture    (old name: airprobe_rtlsdr_capture.py) - program for capturing GSM signal to a file 
+                    that can be later processed by grgsm_decode,
+* grgsm_channelize (old name: gsm_channelize.py) - splits wideband capture file into multiple files - each contain 
+                  single GSM channel.
 
diff --git a/apps/airprobe_file.grc b/apps/airprobe_file.grc
deleted file mode 100644
index e21b8f2..0000000
--- a/apps/airprobe_file.grc
+++ /dev/null
@@ -1,778 +0,0 @@
-<?xml version='1.0' encoding='ASCII'?>
-<?grc format='1' created='3.7.6'?>
-<flow_graph>
-  <timestamp>Sat Dec 13 10:46:37 2014</timestamp>
-  <block>
-    <key>options</key>
-    <param>
-      <key>id</key>
-      <value>airprobe_file</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>title</key>
-      <value></value>
-    </param>
-    <param>
-      <key>author</key>
-      <value></value>
-    </param>
-    <param>
-      <key>description</key>
-      <value></value>
-    </param>
-    <param>
-      <key>window_size</key>
-      <value>1280, 1024</value>
-    </param>
-    <param>
-      <key>generate_options</key>
-      <value>no_gui</value>
-    </param>
-    <param>
-      <key>category</key>
-      <value>Custom</value>
-    </param>
-    <param>
-      <key>run_options</key>
-      <value>run</value>
-    </param>
-    <param>
-      <key>run</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>max_nouts</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>realtime_scheduling</key>
-      <value></value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(16, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>SDCCH</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>6</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1080, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>CHANNEL_UNKNOWN</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(576, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>PCH</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>5</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1008, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>AGCH</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>4</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(936, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>CCCH</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>2</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(792, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>RACH</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>3</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(864, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>BCCH</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(720, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>parameter</key>
-    <param>
-      <key>id</key>
-      <value>input_file_name</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>input_file_name</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>input.cfile</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>string</value>
-    </param>
-    <param>
-      <key>short_id</key>
-      <value>i</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(208, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>parameter</key>
-    <param>
-      <key>id</key>
-      <value>fc</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>fc</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>937e6</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>eng_float</value>
-    </param>
-    <param>
-      <key>short_id</key>
-      <value>f</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(328, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>parameter</key>
-    <param>
-      <key>id</key>
-      <value>samp_rate</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>samp_rate</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>1e6</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>eng_float</value>
-    </param>
-    <param>
-      <key>short_id</key>
-      <value>s</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(416, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>blocks_file_source</key>
-    <param>
-      <key>id</key>
-      <value>blocks_file_source_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>file</key>
-      <value>input_file_name</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>complex</value>
-    </param>
-    <param>
-      <key>repeat</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>vlen</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(16, 195)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_input</key>
-    <param>
-      <key>id</key>
-      <value>gsm_input_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>ppm</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>osr</key>
-      <value>4</value>
-    </param>
-    <param>
-      <key>fc</key>
-      <value>fc</value>
-    </param>
-    <param>
-      <key>samp_rate_in</key>
-      <value>samp_rate</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(200, 208)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_receiver</key>
-    <param>
-      <key>id</key>
-      <value>gsm_receiver_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>osr</key>
-      <value>4</value>
-    </param>
-    <param>
-      <key>cell_allocation</key>
-      <value>[0]</value>
-    </param>
-    <param>
-      <key>tseq_nums</key>
-      <value>[]</value>
-    </param>
-    <param>
-      <key>num_streams</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(384, 192)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_clock_offset_control</key>
-    <param>
-      <key>id</key>
-      <value>gsm_clock_offset_control_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>fc</key>
-      <value>fc</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(272, 315)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>180</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_universal_ctrl_chans_demapper</key>
-    <param>
-      <key>id</key>
-      <value>gsm_universal_ctrl_chans_demapper_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>starts_fn_mod51</key>
-      <value>[2,6,12,16,22,26,32,36,42,46]</value>
-    </param>
-    <param>
-      <key>channel_types</key>
-      <value>[BCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(576, 192)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_control_channels_decoder</key>
-    <param>
-      <key>id</key>
-      <value>gsm_control_channels_decoder_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(840, 192)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>blocks_socket_pdu</key>
-    <param>
-      <key>id</key>
-      <value>blocks_socket_pdu_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>"UDP_CLIENT"</value>
-    </param>
-    <param>
-      <key>host</key>
-      <value>127.0.0.1</value>
-    </param>
-    <param>
-      <key>port</key>
-      <value>4729</value>
-    </param>
-    <param>
-      <key>mtu</key>
-      <value>10000</value>
-    </param>
-    <param>
-      <key>tcp_no_delay</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1088, 243)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_message_printer</key>
-    <param>
-      <key>id</key>
-      <value>gsm_message_printer_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>prepend_string</key>
-      <value>""</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1088, 192)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <connection>
-    <source_block_id>gsm_control_channels_decoder_0</source_block_id>
-    <sink_block_id>blocks_socket_pdu_0</sink_block_id>
-    <source_key>msgs</source_key>
-    <sink_key>pdus</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>blocks_file_source_0</source_block_id>
-    <sink_block_id>gsm_input_0</sink_block_id>
-    <source_key>0</source_key>
-    <sink_key>0</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_clock_offset_control_0</source_block_id>
-    <sink_block_id>gsm_input_0</sink_block_id>
-    <source_key>ppm</source_key>
-    <sink_key>ppm_in</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_receiver_0</source_block_id>
-    <sink_block_id>gsm_universal_ctrl_chans_demapper_0</sink_block_id>
-    <source_key>C0</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_universal_ctrl_chans_demapper_0</source_block_id>
-    <sink_block_id>gsm_control_channels_decoder_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_input_0</source_block_id>
-    <sink_block_id>gsm_receiver_0</sink_block_id>
-    <source_key>0</source_key>
-    <sink_key>0</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_control_channels_decoder_0</source_block_id>
-    <sink_block_id>gsm_message_printer_0</sink_block_id>
-    <source_key>msgs</source_key>
-    <sink_key>msgs</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_receiver_0</source_block_id>
-    <sink_block_id>gsm_clock_offset_control_0</sink_block_id>
-    <source_key>measurements</source_key>
-    <sink_key>measurements</sink_key>
-  </connection>
-</flow_graph>
diff --git a/apps/airprobe_file.py b/apps/airprobe_file.py
deleted file mode 100644
index 5f84b8d..0000000
--- a/apps/airprobe_file.py
+++ /dev/null
@@ -1,144 +0,0 @@
-#!/usr/bin/env python
-##################################################
-# Gnuradio Python Flow Graph
-# Title: Airprobe File
-# Generated: Sat Feb  7 19:30:42 2015
-##################################################
-
-from gnuradio import blocks
-from gnuradio import eng_notation
-from gnuradio import gr
-from gnuradio.eng_option import eng_option
-from gnuradio.filter import firdes
-from optparse import OptionParser
-import grgsm
-import pmt
-
-class airprobe_file(gr.top_block):
-
-    def __init__(self, input_file_name="input.cfile", fc=937e6, samp_rate=1e6):
-        gr.top_block.__init__(self, "Airprobe File")
-
-        ##################################################
-        # Parameters
-        ##################################################
-        self.input_file_name = input_file_name
-        self.fc = fc
-        self.samp_rate = samp_rate
-
-        ##################################################
-        # Variables
-        ##################################################
-        self.SDCCH = SDCCH = 6
-        self.RACH = RACH = 3
-        self.PCH = PCH = 5
-        self.CHANNEL_UNKNOWN = CHANNEL_UNKNOWN = 0
-        self.CCCH = CCCH = 2
-        self.BCCH = BCCH = 1
-        self.AGCH = AGCH = 4
-
-        ##################################################
-        # Blocks
-        ##################################################
-        self.gsm_universal_ctrl_chans_demapper_0 = grgsm.universal_ctrl_chans_demapper(0, ([2,6,12,16,22,26,32,36,42,46]), ([BCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH]))
-        self.gsm_receiver_0 = grgsm.receiver(4, ([0]), ([]))
-        self.gsm_message_printer_0 = grgsm.message_printer(pmt.intern(""))
-        self.gsm_input_0 = grgsm.gsm_input(
-            ppm=0,
-            osr=4,
-            fc=fc,
-            samp_rate_in=samp_rate,
-        )
-        self.gsm_control_channels_decoder_0 = grgsm.control_channels_decoder()
-        self.gsm_clock_offset_control_0 = grgsm.clock_offset_control(fc)
-        self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000)
-        self.blocks_file_source_0 = blocks.file_source(gr.sizeof_gr_complex*1, input_file_name, False)
-
-        ##################################################
-        # Connections
-        ##################################################
-        self.msg_connect(self.gsm_clock_offset_control_0, 'ppm', self.gsm_input_0, 'ppm_in')    
-        self.msg_connect(self.gsm_control_channels_decoder_0, 'msgs', self.blocks_socket_pdu_0, 'pdus')    
-        self.msg_connect(self.gsm_control_channels_decoder_0, 'msgs', self.gsm_message_printer_0, 'msgs')    
-        self.msg_connect(self.gsm_receiver_0, 'measurements', self.gsm_clock_offset_control_0, 'measurements')    
-        self.msg_connect(self.gsm_receiver_0, 'C0', self.gsm_universal_ctrl_chans_demapper_0, 'bursts')    
-        self.msg_connect(self.gsm_universal_ctrl_chans_demapper_0, 'bursts', self.gsm_control_channels_decoder_0, 'bursts')    
-        self.connect((self.blocks_file_source_0, 0), (self.gsm_input_0, 0))    
-        self.connect((self.gsm_input_0, 0), (self.gsm_receiver_0, 0))    
-
-
-    def get_input_file_name(self):
-        return self.input_file_name
-
-    def set_input_file_name(self, input_file_name):
-        self.input_file_name = input_file_name
-        self.blocks_file_source_0.open(self.input_file_name, False)
-
-    def get_fc(self):
-        return self.fc
-
-    def set_fc(self, fc):
-        self.fc = fc
-        self.gsm_input_0.set_fc(self.fc)
-
-    def get_samp_rate(self):
-        return self.samp_rate
-
-    def set_samp_rate(self, samp_rate):
-        self.samp_rate = samp_rate
-        self.gsm_input_0.set_samp_rate_in(self.samp_rate)
-
-    def get_SDCCH(self):
-        return self.SDCCH
-
-    def set_SDCCH(self, SDCCH):
-        self.SDCCH = SDCCH
-
-    def get_RACH(self):
-        return self.RACH
-
-    def set_RACH(self, RACH):
-        self.RACH = RACH
-
-    def get_PCH(self):
-        return self.PCH
-
-    def set_PCH(self, PCH):
-        self.PCH = PCH
-
-    def get_CHANNEL_UNKNOWN(self):
-        return self.CHANNEL_UNKNOWN
-
-    def set_CHANNEL_UNKNOWN(self, CHANNEL_UNKNOWN):
-        self.CHANNEL_UNKNOWN = CHANNEL_UNKNOWN
-
-    def get_CCCH(self):
-        return self.CCCH
-
-    def set_CCCH(self, CCCH):
-        self.CCCH = CCCH
-
-    def get_BCCH(self):
-        return self.BCCH
-
-    def set_BCCH(self, BCCH):
-        self.BCCH = BCCH
-
-    def get_AGCH(self):
-        return self.AGCH
-
-    def set_AGCH(self, AGCH):
-        self.AGCH = AGCH
-
-if __name__ == '__main__':
-    parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
-    parser.add_option("-i", "--input-file-name", dest="input_file_name", type="string", default="input.cfile",
-        help="Set input.cfile [default=%default]")
-    parser.add_option("-f", "--fc", dest="fc", type="eng_float", default=eng_notation.num_to_str(937e6),
-        help="Set fc [default=%default]")
-    parser.add_option("-s", "--samp-rate", dest="samp_rate", type="eng_float", default=eng_notation.num_to_str(1e6),
-        help="Set samp_rate [default=%default]")
-    (options, args) = parser.parse_args()
-    tb = airprobe_file(input_file_name=options.input_file_name, fc=options.fc, samp_rate=options.samp_rate)
-    tb.start()
-    tb.wait()
diff --git a/apps/airprobe_rtlsdr.grc b/apps/airprobe_rtlsdr.grc
deleted file mode 100644
index 9cac347..0000000
--- a/apps/airprobe_rtlsdr.grc
+++ /dev/null
@@ -1,3673 +0,0 @@
-<?xml version='1.0' encoding='ASCII'?>
-<?grc format='1' created='3.7.6'?>
-<flow_graph>
-  <timestamp>Sat Dec 13 10:49:59 2014</timestamp>
-  <block>
-    <key>options</key>
-    <param>
-      <key>id</key>
-      <value>airprobe_rtlsdr</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>title</key>
-      <value></value>
-    </param>
-    <param>
-      <key>author</key>
-      <value></value>
-    </param>
-    <param>
-      <key>description</key>
-      <value></value>
-    </param>
-    <param>
-      <key>window_size</key>
-      <value>2280, 1024</value>
-    </param>
-    <param>
-      <key>generate_options</key>
-      <value>qt_gui</value>
-    </param>
-    <param>
-      <key>category</key>
-      <value>Custom</value>
-    </param>
-    <param>
-      <key>run_options</key>
-      <value>prompt</value>
-    </param>
-    <param>
-      <key>run</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>max_nouts</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>realtime_scheduling</key>
-      <value></value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(16, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>CHANNEL_UNKNOWN</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(864, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>PCH</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>5</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1296, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>AGCH</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>4</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1224, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>RACH</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>3</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1152, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>CCCH</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>2</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1080, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>BCCH</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1008, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>SDCCH</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>6</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1368, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>SACCH</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>0x80</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1448, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_input</key>
-    <param>
-      <key>id</key>
-      <value>gsm_input_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>ppm</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>osr</key>
-      <value>4</value>
-    </param>
-    <param>
-      <key>fc</key>
-      <value>fc</value>
-    </param>
-    <param>
-      <key>samp_rate_in</key>
-      <value>samp_rate</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(280, 304)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_clock_offset_control</key>
-    <param>
-      <key>id</key>
-      <value>gsm_clock_offset_control_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>fc</key>
-      <value>fc</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(344, 411)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>180</value>
-    </param>
-  </block>
-  <block>
-    <key>variable_qtgui_range</key>
-    <param>
-      <key>id</key>
-      <value>ppm_slider</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>PPM Offset</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>ppm</value>
-    </param>
-    <param>
-      <key>start</key>
-      <value>-150</value>
-    </param>
-    <param>
-      <key>stop</key>
-      <value>150</value>
-    </param>
-    <param>
-      <key>step</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>widget</key>
-      <value>counter</value>
-    </param>
-    <param>
-      <key>orient</key>
-      <value>Qt.Horizontal</value>
-    </param>
-    <param>
-      <key>min_len</key>
-      <value>100</value>
-    </param>
-    <param>
-      <key>gui_hint</key>
-      <value></value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(440, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable_qtgui_range</key>
-    <param>
-      <key>id</key>
-      <value>g_slider</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>Gain</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>gain</value>
-    </param>
-    <param>
-      <key>start</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>stop</key>
-      <value>50</value>
-    </param>
-    <param>
-      <key>step</key>
-      <value>0.5</value>
-    </param>
-    <param>
-      <key>widget</key>
-      <value>counter</value>
-    </param>
-    <param>
-      <key>orient</key>
-      <value>Qt.Horizontal</value>
-    </param>
-    <param>
-      <key>min_len</key>
-      <value>100</value>
-    </param>
-    <param>
-      <key>gui_hint</key>
-      <value></value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(192, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable_qtgui_range</key>
-    <param>
-      <key>id</key>
-      <value>fc_slider</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>Frequency</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>fc</value>
-    </param>
-    <param>
-      <key>start</key>
-      <value>925e6</value>
-    </param>
-    <param>
-      <key>stop</key>
-      <value>1990e6</value>
-    </param>
-    <param>
-      <key>step</key>
-      <value>2e5</value>
-    </param>
-    <param>
-      <key>widget</key>
-      <value>counter_slider</value>
-    </param>
-    <param>
-      <key>orient</key>
-      <value>Qt.Horizontal</value>
-    </param>
-    <param>
-      <key>min_len</key>
-      <value>100</value>
-    </param>
-    <param>
-      <key>gui_hint</key>
-      <value></value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(304, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>parameter</key>
-    <param>
-      <key>id</key>
-      <value>fc</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>fc</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>939.4e6</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>eng_float</value>
-    </param>
-    <param>
-      <key>short_id</key>
-      <value>f</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(648, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>parameter</key>
-    <param>
-      <key>id</key>
-      <value>gain</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>gain</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>30</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>eng_float</value>
-    </param>
-    <param>
-      <key>short_id</key>
-      <value>g</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(552, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>parameter</key>
-    <param>
-      <key>id</key>
-      <value>samp_rate</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>samp_rate</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>2000000.052982</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>eng_float</value>
-    </param>
-    <param>
-      <key>short_id</key>
-      <value>s</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(16, 75)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>rtlsdr_source</key>
-    <param>
-      <key>id</key>
-      <value>rtlsdr_source_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>fc32</value>
-    </param>
-    <param>
-      <key>args</key>
-      <value></value>
-    </param>
-    <param>
-      <key>sync</key>
-      <value></value>
-    </param>
-    <param>
-      <key>num_mboards</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>clock_source0</key>
-      <value></value>
-    </param>
-    <param>
-      <key>time_source0</key>
-      <value></value>
-    </param>
-    <param>
-      <key>clock_source1</key>
-      <value></value>
-    </param>
-    <param>
-      <key>time_source1</key>
-      <value></value>
-    </param>
-    <param>
-      <key>clock_source2</key>
-      <value></value>
-    </param>
-    <param>
-      <key>time_source2</key>
-      <value></value>
-    </param>
-    <param>
-      <key>clock_source3</key>
-      <value></value>
-    </param>
-    <param>
-      <key>time_source3</key>
-      <value></value>
-    </param>
-    <param>
-      <key>clock_source4</key>
-      <value></value>
-    </param>
-    <param>
-      <key>time_source4</key>
-      <value></value>
-    </param>
-    <param>
-      <key>clock_source5</key>
-      <value></value>
-    </param>
-    <param>
-      <key>time_source5</key>
-      <value></value>
-    </param>
-    <param>
-      <key>clock_source6</key>
-      <value></value>
-    </param>
-    <param>
-      <key>time_source6</key>
-      <value></value>
-    </param>
-    <param>
-      <key>clock_source7</key>
-      <value></value>
-    </param>
-    <param>
-      <key>time_source7</key>
-      <value></value>
-    </param>
-    <param>
-      <key>nchan</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>sample_rate</key>
-      <value>samp_rate</value>
-    </param>
-    <param>
-      <key>freq0</key>
-      <value>fc_slider</value>
-    </param>
-    <param>
-      <key>corr0</key>
-      <value>ppm_slider</value>
-    </param>
-    <param>
-      <key>dc_offset_mode0</key>
-      <value>2</value>
-    </param>
-    <param>
-      <key>iq_balance_mode0</key>
-      <value>2</value>
-    </param>
-    <param>
-      <key>gain_mode0</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>gain0</key>
-      <value>g_slider</value>
-    </param>
-    <param>
-      <key>if_gain0</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain0</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant0</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw0</key>
-      <value>250e3</value>
-    </param>
-    <param>
-      <key>freq1</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr1</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode1</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode1</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode1</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>gain1</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain1</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain1</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant1</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw1</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq2</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr2</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode2</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode2</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode2</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>gain2</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain2</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain2</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant2</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw2</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq3</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr3</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode3</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode3</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode3</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>gain3</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain3</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain3</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant3</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw3</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq4</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr4</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode4</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode4</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode4</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>gain4</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain4</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain4</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant4</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw4</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq5</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr5</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode5</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode5</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode5</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain5</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain5</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain5</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant5</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw5</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq6</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr6</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode6</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode6</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode6</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain6</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain6</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain6</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant6</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw6</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq7</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr7</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode7</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode7</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode7</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain7</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain7</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain7</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant7</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw7</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq8</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr8</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode8</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode8</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode8</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain8</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain8</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain8</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant8</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw8</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq9</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr9</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode9</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode9</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode9</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain9</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain9</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain9</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant9</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw9</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq10</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr10</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode10</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode10</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode10</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain10</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain10</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain10</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant10</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw10</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq11</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr11</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode11</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode11</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode11</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain11</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain11</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain11</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant11</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw11</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq12</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr12</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode12</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode12</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode12</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain12</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain12</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain12</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant12</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw12</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq13</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr13</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode13</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode13</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode13</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain13</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain13</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain13</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant13</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw13</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq14</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr14</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode14</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode14</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode14</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain14</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain14</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain14</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant14</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw14</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq15</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr15</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode15</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode15</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode15</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain15</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain15</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain15</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant15</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw15</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq16</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr16</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode16</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode16</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode16</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain16</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain16</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain16</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant16</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw16</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq17</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr17</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode17</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode17</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode17</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain17</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain17</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain17</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant17</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw17</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq18</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr18</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode18</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode18</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode18</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain18</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain18</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain18</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant18</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw18</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq19</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr19</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode19</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode19</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode19</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain19</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain19</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain19</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant19</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw19</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq20</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr20</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode20</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode20</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode20</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain20</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain20</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain20</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant20</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw20</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq21</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr21</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode21</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode21</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode21</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain21</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain21</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain21</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant21</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw21</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq22</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr22</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode22</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode22</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode22</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain22</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain22</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain22</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant22</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw22</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq23</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr23</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode23</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode23</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode23</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain23</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain23</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain23</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant23</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw23</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq24</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr24</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode24</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode24</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode24</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain24</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain24</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain24</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant24</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw24</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq25</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr25</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode25</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode25</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode25</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain25</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain25</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain25</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant25</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw25</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq26</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr26</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode26</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode26</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode26</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain26</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain26</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain26</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant26</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw26</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq27</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr27</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode27</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode27</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode27</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain27</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain27</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain27</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant27</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw27</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq28</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr28</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode28</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode28</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode28</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain28</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain28</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain28</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant28</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw28</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq29</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr29</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode29</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode29</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode29</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain29</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain29</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain29</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant29</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw29</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq30</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr30</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode30</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode30</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode30</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain30</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain30</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain30</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant30</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw30</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq31</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr31</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode31</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode31</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode31</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain31</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain31</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain31</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant31</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw31</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(16, 227)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_universal_ctrl_chans_demapper</key>
-    <param>
-      <key>id</key>
-      <value>gsm_universal_ctrl_chans_demapper_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>timeslot_nr</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>starts_fn_mod51</key>
-      <value>[2,6,12,16,22,26,32,36,42,46]</value>
-    </param>
-    <param>
-      <key>channel_types</key>
-      <value>[BCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(664, 288)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>parameter</key>
-    <param>
-      <key>id</key>
-      <value>ppm</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>ppm</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>intx</value>
-    </param>
-    <param>
-      <key>short_id</key>
-      <value>p</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(744, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_receiver</key>
-    <param>
-      <key>id</key>
-      <value>gsm_receiver_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>osr</key>
-      <value>4</value>
-    </param>
-    <param>
-      <key>cell_allocation</key>
-      <value>[0]</value>
-    </param>
-    <param>
-      <key>tseq_nums</key>
-      <value>[]</value>
-    </param>
-    <param>
-      <key>num_streams</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(464, 288)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_message_printer</key>
-    <param>
-      <key>id</key>
-      <value>gsm_message_printer_1</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>prepend_string</key>
-      <value>""</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1312, 288)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_control_channels_decoder</key>
-    <param>
-      <key>id</key>
-      <value>gsm_control_channels_decoder_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1080, 288)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>blocks_socket_pdu</key>
-    <param>
-      <key>id</key>
-      <value>blocks_socket_pdu_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>"UDP_CLIENT"</value>
-    </param>
-    <param>
-      <key>host</key>
-      <value>127.0.0.1</value>
-    </param>
-    <param>
-      <key>port</key>
-      <value>4729</value>
-    </param>
-    <param>
-      <key>mtu</key>
-      <value>10000</value>
-    </param>
-    <param>
-      <key>tcp_no_delay</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1328, 363)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_universal_ctrl_chans_demapper</key>
-    <param>
-      <key>id</key>
-      <value>gsm_universal_ctrl_chans_demapper_0_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>timeslot_nr</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>starts_fn_mod51</key>
-      <value>[0,4,8,12,16,20,24,28,32,36,40,44]</value>
-    </param>
-    <param>
-      <key>channel_types</key>
-      <value>[SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH,SACCH,SACCH,SACCH,SACCH]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(664, 344)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_control_channels_decoder</key>
-    <param>
-      <key>id</key>
-      <value>gsm_control_channels_decoder_0_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1080, 344)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_control_channels_decoder</key>
-    <param>
-      <key>id</key>
-      <value>gsm_control_channels_decoder_0_0_0_0_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1080, 632)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_control_channels_decoder</key>
-    <param>
-      <key>id</key>
-      <value>gsm_control_channels_decoder_0_0_1_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1080, 584)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_control_channels_decoder</key>
-    <param>
-      <key>id</key>
-      <value>gsm_control_channels_decoder_0_0_0_1</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1080, 536)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_control_channels_decoder</key>
-    <param>
-      <key>id</key>
-      <value>gsm_control_channels_decoder_0_0_0_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1080, 488)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_control_channels_decoder</key>
-    <param>
-      <key>id</key>
-      <value>gsm_control_channels_decoder_0_0_1</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1080, 440)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_control_channels_decoder</key>
-    <param>
-      <key>id</key>
-      <value>gsm_control_channels_decoder_0_0_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1080, 392)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_universal_ctrl_chans_demapper</key>
-    <param>
-      <key>id</key>
-      <value>gsm_universal_ctrl_chans_demapper_0_0_0_0_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>timeslot_nr</key>
-      <value>7</value>
-    </param>
-    <param>
-      <key>starts_fn_mod51</key>
-      <value>[0,4,8,12,16,20,24,28]</value>
-    </param>
-    <param>
-      <key>channel_types</key>
-      <value>[SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH,SACCH,SACCH,SACCH,SACCH]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(664, 632)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_universal_ctrl_chans_demapper</key>
-    <param>
-      <key>id</key>
-      <value>gsm_universal_ctrl_chans_demapper_0_0_1_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>timeslot_nr</key>
-      <value>6</value>
-    </param>
-    <param>
-      <key>starts_fn_mod51</key>
-      <value>[0,4,8,12,16,20,24,28]</value>
-    </param>
-    <param>
-      <key>channel_types</key>
-      <value>[SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH,SACCH,SACCH,SACCH,SACCH]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(664, 584)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_universal_ctrl_chans_demapper</key>
-    <param>
-      <key>id</key>
-      <value>gsm_universal_ctrl_chans_demapper_0_0_0_1</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>timeslot_nr</key>
-      <value>5</value>
-    </param>
-    <param>
-      <key>starts_fn_mod51</key>
-      <value>[0,4,8,12,16,20,24,28]</value>
-    </param>
-    <param>
-      <key>channel_types</key>
-      <value>[SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH,SACCH,SACCH,SACCH,SACCH]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(664, 536)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_universal_ctrl_chans_demapper</key>
-    <param>
-      <key>id</key>
-      <value>gsm_universal_ctrl_chans_demapper_0_0_0_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>timeslot_nr</key>
-      <value>4</value>
-    </param>
-    <param>
-      <key>starts_fn_mod51</key>
-      <value>[0,4,8,12,16,20,24,28]</value>
-    </param>
-    <param>
-      <key>channel_types</key>
-      <value>[SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH,SACCH,SACCH,SACCH,SACCH]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(664, 488)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_universal_ctrl_chans_demapper</key>
-    <param>
-      <key>id</key>
-      <value>gsm_universal_ctrl_chans_demapper_0_0_1</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>timeslot_nr</key>
-      <value>3</value>
-    </param>
-    <param>
-      <key>starts_fn_mod51</key>
-      <value>[0,4,8,12,16,20,24,28]</value>
-    </param>
-    <param>
-      <key>channel_types</key>
-      <value>[SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH,SACCH,SACCH,SACCH,SACCH]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(664, 440)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_universal_ctrl_chans_demapper</key>
-    <param>
-      <key>id</key>
-      <value>gsm_universal_ctrl_chans_demapper_0_0_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>timeslot_nr</key>
-      <value>2</value>
-    </param>
-    <param>
-      <key>starts_fn_mod51</key>
-      <value>[0,4,8,12,16,20,24,28]</value>
-    </param>
-    <param>
-      <key>channel_types</key>
-      <value>[SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH, SDCCH,SACCH,SACCH,SACCH,SACCH]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(664, 392)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_decryption</key>
-    <param>
-      <key>id</key>
-      <value>gsm_decryption_0_1_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>k_c</key>
-      <value>[]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(920, 579)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_decryption</key>
-    <param>
-      <key>id</key>
-      <value>gsm_decryption_0_0_1</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>k_c</key>
-      <value>[]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(920, 531)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_decryption</key>
-    <param>
-      <key>id</key>
-      <value>gsm_decryption_0_0_0_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>k_c</key>
-      <value>[]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(920, 627)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_decryption</key>
-    <param>
-      <key>id</key>
-      <value>gsm_decryption_0_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>k_c</key>
-      <value>[]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(920, 387)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_decryption</key>
-    <param>
-      <key>id</key>
-      <value>gsm_decryption_0_1</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>k_c</key>
-      <value>[]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(920, 435)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_decryption</key>
-    <param>
-      <key>id</key>
-      <value>gsm_decryption_0_0_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>k_c</key>
-      <value>[]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(920, 483)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_decryption</key>
-    <param>
-      <key>id</key>
-      <value>gsm_decryption_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>k_c</key>
-      <value>[]</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(920, 339)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>qtgui_freq_sink_x</key>
-    <param>
-      <key>id</key>
-      <value>qtgui_freq_sink_x_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>complex</value>
-    </param>
-    <param>
-      <key>name</key>
-      <value>""</value>
-    </param>
-    <param>
-      <key>fftsize</key>
-      <value>1024</value>
-    </param>
-    <param>
-      <key>freqhalf</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>wintype</key>
-      <value>firdes.WIN_BLACKMAN_hARRIS</value>
-    </param>
-    <param>
-      <key>fc</key>
-      <value>fc_slider</value>
-    </param>
-    <param>
-      <key>bw</key>
-      <value>samp_rate</value>
-    </param>
-    <param>
-      <key>grid</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>autoscale</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>average</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>ymin</key>
-      <value>-140</value>
-    </param>
-    <param>
-      <key>ymax</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>nconnections</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>update_time</key>
-      <value>0.10</value>
-    </param>
-    <param>
-      <key>gui_hint</key>
-      <value></value>
-    </param>
-    <param>
-      <key>showports</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>tr_mode</key>
-      <value>qtgui.TRIG_MODE_FREE</value>
-    </param>
-    <param>
-      <key>tr_level</key>
-      <value>0.0</value>
-    </param>
-    <param>
-      <key>tr_chan</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>tr_tag</key>
-      <value>""</value>
-    </param>
-    <param>
-      <key>label1</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width1</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color1</key>
-      <value>"blue"</value>
-    </param>
-    <param>
-      <key>alpha1</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label2</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width2</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color2</key>
-      <value>"red"</value>
-    </param>
-    <param>
-      <key>alpha2</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label3</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width3</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color3</key>
-      <value>"green"</value>
-    </param>
-    <param>
-      <key>alpha3</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label4</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width4</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color4</key>
-      <value>"black"</value>
-    </param>
-    <param>
-      <key>alpha4</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label5</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width5</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color5</key>
-      <value>"cyan"</value>
-    </param>
-    <param>
-      <key>alpha5</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label6</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width6</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color6</key>
-      <value>"magenta"</value>
-    </param>
-    <param>
-      <key>alpha6</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label7</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width7</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color7</key>
-      <value>"yellow"</value>
-    </param>
-    <param>
-      <key>alpha7</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label8</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width8</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color8</key>
-      <value>"dark red"</value>
-    </param>
-    <param>
-      <key>alpha8</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label9</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width9</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color9</key>
-      <value>"dark green"</value>
-    </param>
-    <param>
-      <key>alpha9</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label10</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width10</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color10</key>
-      <value>"dark blue"</value>
-    </param>
-    <param>
-      <key>alpha10</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(280, 187)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <connection>
-    <source_block_id>gsm_receiver_0</source_block_id>
-    <sink_block_id>gsm_universal_ctrl_chans_demapper_0</sink_block_id>
-    <source_key>C0</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_input_0</source_block_id>
-    <sink_block_id>gsm_receiver_0</sink_block_id>
-    <source_key>0</source_key>
-    <sink_key>0</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>rtlsdr_source_0</source_block_id>
-    <sink_block_id>gsm_input_0</sink_block_id>
-    <source_key>0</source_key>
-    <sink_key>0</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_clock_offset_control_0</source_block_id>
-    <sink_block_id>gsm_input_0</sink_block_id>
-    <source_key>ppm</source_key>
-    <sink_key>ppm_in</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>rtlsdr_source_0</source_block_id>
-    <sink_block_id>qtgui_freq_sink_x_0</sink_block_id>
-    <source_key>0</source_key>
-    <sink_key>0</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_control_channels_decoder_0</source_block_id>
-    <sink_block_id>gsm_message_printer_1</sink_block_id>
-    <source_key>msgs</source_key>
-    <sink_key>msgs</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_universal_ctrl_chans_demapper_0</source_block_id>
-    <sink_block_id>gsm_control_channels_decoder_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_control_channels_decoder_0</source_block_id>
-    <sink_block_id>blocks_socket_pdu_0</sink_block_id>
-    <source_key>msgs</source_key>
-    <sink_key>pdus</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_control_channels_decoder_0_0_0_0_0</source_block_id>
-    <sink_block_id>blocks_socket_pdu_0</sink_block_id>
-    <source_key>msgs</source_key>
-    <sink_key>pdus</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_control_channels_decoder_0_0_1_0</source_block_id>
-    <sink_block_id>blocks_socket_pdu_0</sink_block_id>
-    <source_key>msgs</source_key>
-    <sink_key>pdus</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_control_channels_decoder_0_0_0_1</source_block_id>
-    <sink_block_id>blocks_socket_pdu_0</sink_block_id>
-    <source_key>msgs</source_key>
-    <sink_key>pdus</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_control_channels_decoder_0_0_0_0</source_block_id>
-    <sink_block_id>blocks_socket_pdu_0</sink_block_id>
-    <source_key>msgs</source_key>
-    <sink_key>pdus</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_control_channels_decoder_0_0_1</source_block_id>
-    <sink_block_id>blocks_socket_pdu_0</sink_block_id>
-    <source_key>msgs</source_key>
-    <sink_key>pdus</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_control_channels_decoder_0_0_0</source_block_id>
-    <sink_block_id>blocks_socket_pdu_0</sink_block_id>
-    <source_key>msgs</source_key>
-    <sink_key>pdus</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_receiver_0</source_block_id>
-    <sink_block_id>gsm_universal_ctrl_chans_demapper_0_0_0_0_0</sink_block_id>
-    <source_key>C0</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_receiver_0</source_block_id>
-    <sink_block_id>gsm_universal_ctrl_chans_demapper_0_0_1_0</sink_block_id>
-    <source_key>C0</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_receiver_0</source_block_id>
-    <sink_block_id>gsm_universal_ctrl_chans_demapper_0_0_0_1</sink_block_id>
-    <source_key>C0</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_receiver_0</source_block_id>
-    <sink_block_id>gsm_universal_ctrl_chans_demapper_0_0_0_0</sink_block_id>
-    <source_key>C0</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_receiver_0</source_block_id>
-    <sink_block_id>gsm_universal_ctrl_chans_demapper_0_0_1</sink_block_id>
-    <source_key>C0</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_decryption_0_0_1</source_block_id>
-    <sink_block_id>gsm_control_channels_decoder_0_0_0_1</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_universal_ctrl_chans_demapper_0_0_0_1</source_block_id>
-    <sink_block_id>gsm_decryption_0_0_1</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_decryption_0_0_0_0</source_block_id>
-    <sink_block_id>gsm_control_channels_decoder_0_0_0_0_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_universal_ctrl_chans_demapper_0_0_0_0_0</source_block_id>
-    <sink_block_id>gsm_decryption_0_0_0_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_universal_ctrl_chans_demapper_0_0_1_0</source_block_id>
-    <sink_block_id>gsm_decryption_0_1_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_decryption_0_1_0</source_block_id>
-    <sink_block_id>gsm_control_channels_decoder_0_0_1_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_decryption_0_0</source_block_id>
-    <sink_block_id>gsm_control_channels_decoder_0_0_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_universal_ctrl_chans_demapper_0_0_0</source_block_id>
-    <sink_block_id>gsm_decryption_0_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_receiver_0</source_block_id>
-    <sink_block_id>gsm_universal_ctrl_chans_demapper_0_0_0</sink_block_id>
-    <source_key>C0</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_control_channels_decoder_0_0</source_block_id>
-    <sink_block_id>blocks_socket_pdu_0</sink_block_id>
-    <source_key>msgs</source_key>
-    <sink_key>pdus</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_decryption_0_0_0</source_block_id>
-    <sink_block_id>gsm_control_channels_decoder_0_0_0_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_universal_ctrl_chans_demapper_0_0_0_0</source_block_id>
-    <sink_block_id>gsm_decryption_0_0_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_universal_ctrl_chans_demapper_0_0_1</source_block_id>
-    <sink_block_id>gsm_decryption_0_1</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_decryption_0_1</source_block_id>
-    <sink_block_id>gsm_control_channels_decoder_0_0_1</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_receiver_0</source_block_id>
-    <sink_block_id>gsm_universal_ctrl_chans_demapper_0_0</sink_block_id>
-    <source_key>C0</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_decryption_0</source_block_id>
-    <sink_block_id>gsm_control_channels_decoder_0_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_universal_ctrl_chans_demapper_0_0</source_block_id>
-    <sink_block_id>gsm_decryption_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_receiver_0</source_block_id>
-    <sink_block_id>gsm_clock_offset_control_0</sink_block_id>
-    <source_key>measurements</source_key>
-    <sink_key>measurements</sink_key>
-  </connection>
-</flow_graph>
diff --git a/apps/airprobe_rtlsdr.py b/apps/airprobe_rtlsdr.py
deleted file mode 100755
index ba40fa9..0000000
--- a/apps/airprobe_rtlsdr.py
+++ /dev/null
@@ -1,349 +0,0 @@
-#!/usr/bin/env python
-##################################################
-# Gnuradio Python Flow Graph
-# Title: Airprobe Rtlsdr
-# Generated: Tue Apr 28 22:47:46 2015
-##################################################
-
-from PyQt4 import Qt
-from PyQt4.QtCore import QObject, pyqtSlot
-from gnuradio import blocks
-from gnuradio import eng_notation
-from gnuradio import gr
-from gnuradio import qtgui
-from gnuradio.eng_option import eng_option
-from gnuradio.filter import firdes
-from optparse import OptionParser
-import PyQt4.Qwt5 as Qwt
-import grgsm
-import osmosdr
-import pmt
-import sip
-import sys
-import time
-
-from distutils.version import StrictVersion
-class airprobe_rtlsdr(gr.top_block, Qt.QWidget):
-
-    def __init__(self, fc=939.4e6, gain=30, samp_rate=2000000.052982, ppm=0):
-        gr.top_block.__init__(self, "Airprobe Rtlsdr")
-        Qt.QWidget.__init__(self)
-        self.setWindowTitle("Airprobe Rtlsdr")
-        try:
-             self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
-        except:
-             pass
-        self.top_scroll_layout = Qt.QVBoxLayout()
-        self.setLayout(self.top_scroll_layout)
-        self.top_scroll = Qt.QScrollArea()
-        self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
-        self.top_scroll_layout.addWidget(self.top_scroll)
-        self.top_scroll.setWidgetResizable(True)
-        self.top_widget = Qt.QWidget()
-        self.top_scroll.setWidget(self.top_widget)
-        self.top_layout = Qt.QVBoxLayout(self.top_widget)
-        self.top_grid_layout = Qt.QGridLayout()
-        self.top_layout.addLayout(self.top_grid_layout)
-
-        self.settings = Qt.QSettings("GNU Radio", "airprobe_rtlsdr")
-        self.restoreGeometry(self.settings.value("geometry").toByteArray())
-
-
-        ##################################################
-        # Parameters
-        ##################################################
-        self.fc = fc
-        self.gain = gain
-        self.samp_rate = samp_rate
-        self.ppm = ppm
-
-        ##################################################
-        # Variables
-        ##################################################
-        self.ppm_slider = ppm_slider = ppm
-        self.g_slider = g_slider = gain
-        self.fc_slider = fc_slider = fc
-        self.SDCCH = SDCCH = 6
-        self.SACCH = SACCH = 0x80
-        self.RACH = RACH = 3
-        self.PCH = PCH = 5
-        self.CHANNEL_UNKNOWN = CHANNEL_UNKNOWN = 0
-        self.CCCH = CCCH = 2
-        self.BCCH = BCCH = 1
-        self.AGCH = AGCH = 4
-
-        ##################################################
-        # Blocks
-        ##################################################
-        self._ppm_slider_layout = Qt.QHBoxLayout()
-        self._ppm_slider_layout.addWidget(Qt.QLabel("PPM Offset"+": "))
-        class qwt_counter_pyslot(Qwt.QwtCounter):
-            def __init__(self, parent=None):
-                Qwt.QwtCounter.__init__(self, parent)
-            @pyqtSlot('double')
-            def setValue(self, value):
-                super(Qwt.QwtCounter, self).setValue(value)
-        self._ppm_slider_counter = qwt_counter_pyslot()
-        self._ppm_slider_counter.setRange(-150, 150, 1)
-        self._ppm_slider_counter.setNumButtons(2)
-        self._ppm_slider_counter.setMinimumWidth(100)
-        self._ppm_slider_counter.setValue(self.ppm_slider)
-        self._ppm_slider_layout.addWidget(self._ppm_slider_counter)
-        self._ppm_slider_counter.valueChanged.connect(self.set_ppm_slider)
-        self.top_layout.addLayout(self._ppm_slider_layout)
-        self._g_slider_layout = Qt.QHBoxLayout()
-        self._g_slider_layout.addWidget(Qt.QLabel("Gain"+": "))
-        class qwt_counter_pyslot(Qwt.QwtCounter):
-            def __init__(self, parent=None):
-                Qwt.QwtCounter.__init__(self, parent)
-            @pyqtSlot('double')
-            def setValue(self, value):
-                super(Qwt.QwtCounter, self).setValue(value)
-        self._g_slider_counter = qwt_counter_pyslot()
-        self._g_slider_counter.setRange(0, 50, 0.5)
-        self._g_slider_counter.setNumButtons(2)
-        self._g_slider_counter.setMinimumWidth(100)
-        self._g_slider_counter.setValue(self.g_slider)
-        self._g_slider_layout.addWidget(self._g_slider_counter)
-        self._g_slider_counter.valueChanged.connect(self.set_g_slider)
-        self.top_layout.addLayout(self._g_slider_layout)
-        self._fc_slider_layout = Qt.QVBoxLayout()
-        self._fc_slider_tool_bar = Qt.QToolBar(self)
-        self._fc_slider_layout.addWidget(self._fc_slider_tool_bar)
-        self._fc_slider_tool_bar.addWidget(Qt.QLabel("Frequency"+": "))
-        class qwt_counter_pyslot(Qwt.QwtCounter):
-            def __init__(self, parent=None):
-                Qwt.QwtCounter.__init__(self, parent)
-            @pyqtSlot('double')
-            def setValue(self, value):
-                super(Qwt.QwtCounter, self).setValue(value)
-        self._fc_slider_counter = qwt_counter_pyslot()
-        self._fc_slider_counter.setRange(925e6, 1990e6, 2e5)
-        self._fc_slider_counter.setNumButtons(2)
-        self._fc_slider_counter.setValue(self.fc_slider)
-        self._fc_slider_tool_bar.addWidget(self._fc_slider_counter)
-        self._fc_slider_counter.valueChanged.connect(self.set_fc_slider)
-        self._fc_slider_slider = Qwt.QwtSlider(None, Qt.Qt.Horizontal, Qwt.QwtSlider.BottomScale, Qwt.QwtSlider.BgSlot)
-        self._fc_slider_slider.setRange(925e6, 1990e6, 2e5)
-        self._fc_slider_slider.setValue(self.fc_slider)
-        self._fc_slider_slider.setMinimumWidth(100)
-        self._fc_slider_slider.valueChanged.connect(self.set_fc_slider)
-        self._fc_slider_layout.addWidget(self._fc_slider_slider)
-        self.top_layout.addLayout(self._fc_slider_layout)
-        self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + "" )
-        self.rtlsdr_source_0.set_sample_rate(samp_rate)
-        self.rtlsdr_source_0.set_center_freq(fc_slider, 0)
-        self.rtlsdr_source_0.set_freq_corr(ppm_slider, 0)
-        self.rtlsdr_source_0.set_dc_offset_mode(2, 0)
-        self.rtlsdr_source_0.set_iq_balance_mode(2, 0)
-        self.rtlsdr_source_0.set_gain_mode(True, 0)
-        self.rtlsdr_source_0.set_gain(g_slider, 0)
-        self.rtlsdr_source_0.set_if_gain(20, 0)
-        self.rtlsdr_source_0.set_bb_gain(20, 0)
-        self.rtlsdr_source_0.set_antenna("", 0)
-        self.rtlsdr_source_0.set_bandwidth(250e3, 0)
-          
-        self.qtgui_freq_sink_x_0 = qtgui.freq_sink_c(
-        	1024, #size
-        	firdes.WIN_BLACKMAN_hARRIS, #wintype
-        	fc_slider, #fc
-        	samp_rate, #bw
-        	"", #name
-        	1 #number of inputs
-        )
-        self.qtgui_freq_sink_x_0.set_update_time(0.10)
-        self.qtgui_freq_sink_x_0.set_y_axis(-140, 10)
-        self.qtgui_freq_sink_x_0.enable_autoscale(False)
-        self.qtgui_freq_sink_x_0.enable_grid(False)
-        self.qtgui_freq_sink_x_0.set_fft_average(1.0)
-        
-        labels = ["", "", "", "", "",
-                  "", "", "", "", ""]
-        widths = [1, 1, 1, 1, 1,
-                  1, 1, 1, 1, 1]
-        colors = ["blue", "red", "green", "black", "cyan",
-                  "magenta", "yellow", "dark red", "dark green", "dark blue"]
-        alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
-                  1.0, 1.0, 1.0, 1.0, 1.0]
-        for i in xrange(1):
-            if len(labels[i]) == 0:
-                self.qtgui_freq_sink_x_0.set_line_label(i, "Data {0}".format(i))
-            else:
-                self.qtgui_freq_sink_x_0.set_line_label(i, labels[i])
-            self.qtgui_freq_sink_x_0.set_line_width(i, widths[i])
-            self.qtgui_freq_sink_x_0.set_line_color(i, colors[i])
-            self.qtgui_freq_sink_x_0.set_line_alpha(i, alphas[i])
-        
-        self._qtgui_freq_sink_x_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget)
-        self.top_layout.addWidget(self._qtgui_freq_sink_x_0_win)
-        self.gsm_universal_ctrl_chans_demapper_0 = grgsm.universal_ctrl_chans_demapper(0, ([2,6,12,16,22,26,32,36,42,46]), ([BCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH]))
-        self.gsm_receiver_0 = grgsm.receiver(4, ([0]), ([]))
-        self.gsm_message_printer_1 = grgsm.message_printer(pmt.intern(""))
-        self.gsm_input_0 = grgsm.gsm_input(
-            ppm=0,
-            osr=4,
-            fc=fc,
-            samp_rate_in=samp_rate,
-        )
-        self.gsm_control_channels_decoder_0 = grgsm.control_channels_decoder()
-        self.gsm_clock_offset_control_0 = grgsm.clock_offset_control(fc)
-        self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000, False)
-
-        ##################################################
-        # Connections
-        ##################################################
-        self.connect((self.gsm_input_0, 0), (self.gsm_receiver_0, 0))
-        self.connect((self.rtlsdr_source_0, 0), (self.gsm_input_0, 0))
-        self.connect((self.rtlsdr_source_0, 0), (self.qtgui_freq_sink_x_0, 0))
-
-        ##################################################
-        # Asynch Message Connections
-        ##################################################
-        self.msg_connect(self.gsm_receiver_0, "C0", self.gsm_universal_ctrl_chans_demapper_0, "bursts")
-        self.msg_connect(self.gsm_clock_offset_control_0, "ppm", self.gsm_input_0, "ppm_in")
-        self.msg_connect(self.gsm_control_channels_decoder_0, "msgs", self.gsm_message_printer_1, "msgs")
-        self.msg_connect(self.gsm_universal_ctrl_chans_demapper_0, "bursts", self.gsm_control_channels_decoder_0, "bursts")
-        self.msg_connect(self.gsm_control_channels_decoder_0, "msgs", self.blocks_socket_pdu_0, "pdus")
-        self.msg_connect(self.gsm_receiver_0, "measurements", self.gsm_clock_offset_control_0, "measurements")
-
-    def closeEvent(self, event):
-        self.settings = Qt.QSettings("GNU Radio", "airprobe_rtlsdr")
-        self.settings.setValue("geometry", self.saveGeometry())
-        event.accept()
-
-    def get_fc(self):
-        return self.fc
-
-    def set_fc(self, fc):
-        self.fc = fc
-        self.gsm_input_0.set_fc(self.fc)
-        self.set_fc_slider(self.fc)
-
-    def get_gain(self):
-        return self.gain
-
-    def set_gain(self, gain):
-        self.gain = gain
-        self.set_g_slider(self.gain)
-
-    def get_samp_rate(self):
-        return self.samp_rate
-
-    def set_samp_rate(self, samp_rate):
-        self.samp_rate = samp_rate
-        self.gsm_input_0.set_samp_rate_in(self.samp_rate)
-        self.rtlsdr_source_0.set_sample_rate(self.samp_rate)
-        self.qtgui_freq_sink_x_0.set_frequency_range(self.fc_slider, self.samp_rate)
-
-    def get_ppm(self):
-        return self.ppm
-
-    def set_ppm(self, ppm):
-        self.ppm = ppm
-        self.set_ppm_slider(self.ppm)
-
-    def get_ppm_slider(self):
-        return self.ppm_slider
-
-    def set_ppm_slider(self, ppm_slider):
-        self.ppm_slider = ppm_slider
-        Qt.QMetaObject.invokeMethod(self._ppm_slider_counter, "setValue", Qt.Q_ARG("double", self.ppm_slider))
-        self.rtlsdr_source_0.set_freq_corr(self.ppm_slider, 0)
-
-    def get_g_slider(self):
-        return self.g_slider
-
-    def set_g_slider(self, g_slider):
-        self.g_slider = g_slider
-        Qt.QMetaObject.invokeMethod(self._g_slider_counter, "setValue", Qt.Q_ARG("double", self.g_slider))
-        self.rtlsdr_source_0.set_gain(self.g_slider, 0)
-
-    def get_fc_slider(self):
-        return self.fc_slider
-
-    def set_fc_slider(self, fc_slider):
-        self.fc_slider = fc_slider
-        Qt.QMetaObject.invokeMethod(self._fc_slider_counter, "setValue", Qt.Q_ARG("double", self.fc_slider))
-        Qt.QMetaObject.invokeMethod(self._fc_slider_slider, "setValue", Qt.Q_ARG("double", self.fc_slider))
-        self.rtlsdr_source_0.set_center_freq(self.fc_slider, 0)
-        self.qtgui_freq_sink_x_0.set_frequency_range(self.fc_slider, self.samp_rate)
-
-    def get_SDCCH(self):
-        return self.SDCCH
-
-    def set_SDCCH(self, SDCCH):
-        self.SDCCH = SDCCH
-
-    def get_SACCH(self):
-        return self.SACCH
-
-    def set_SACCH(self, SACCH):
-        self.SACCH = SACCH
-
-    def get_RACH(self):
-        return self.RACH
-
-    def set_RACH(self, RACH):
-        self.RACH = RACH
-
-    def get_PCH(self):
-        return self.PCH
-
-    def set_PCH(self, PCH):
-        self.PCH = PCH
-
-    def get_CHANNEL_UNKNOWN(self):
-        return self.CHANNEL_UNKNOWN
-
-    def set_CHANNEL_UNKNOWN(self, CHANNEL_UNKNOWN):
-        self.CHANNEL_UNKNOWN = CHANNEL_UNKNOWN
-
-    def get_CCCH(self):
-        return self.CCCH
-
-    def set_CCCH(self, CCCH):
-        self.CCCH = CCCH
-
-    def get_BCCH(self):
-        return self.BCCH
-
-    def set_BCCH(self, BCCH):
-        self.BCCH = BCCH
-
-    def get_AGCH(self):
-        return self.AGCH
-
-    def set_AGCH(self, AGCH):
-        self.AGCH = AGCH
-
-if __name__ == '__main__':
-    import ctypes
-    import sys
-    if sys.platform.startswith('linux'):
-        try:
-            x11 = ctypes.cdll.LoadLibrary('libX11.so')
-            x11.XInitThreads()
-        except:
-            print "Warning: failed to XInitThreads()"
-    parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
-    parser.add_option("-f", "--fc", dest="fc", type="eng_float", default=eng_notation.num_to_str(939.4e6),
-        help="Set fc [default=%default]")
-    parser.add_option("-g", "--gain", dest="gain", type="eng_float", default=eng_notation.num_to_str(30),
-        help="Set gain [default=%default]")
-    parser.add_option("-s", "--samp-rate", dest="samp_rate", type="eng_float", default=eng_notation.num_to_str(2000000.052982),
-        help="Set samp_rate [default=%default]")
-    parser.add_option("-p", "--ppm", dest="ppm", type="intx", default=0,
-        help="Set ppm [default=%default]")
-    (options, args) = parser.parse_args()
-    if(StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0")):
-        Qt.QApplication.setGraphicsSystem(gr.prefs().get_string('qtgui','style','raster'))
-    qapp = Qt.QApplication(sys.argv)
-    tb = airprobe_rtlsdr(fc=options.fc, gain=options.gain, samp_rate=options.samp_rate, ppm=options.ppm)
-    tb.start()
-    tb.show()
-    def quitting():
-        tb.stop()
-        tb.wait()
-    qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
-    qapp.exec_()
-    tb = None #to clean up Qt widgets
diff --git a/apps/grgsm_decode b/apps/grgsm_decode
new file mode 100755
index 0000000..4be199d
--- /dev/null
+++ b/apps/grgsm_decode
@@ -0,0 +1,388 @@
+#!/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 pmt
+import socket
+
+
+class grgsm_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, 
+                 a5=1, a5_kc=None,
+                 speech_file=None, speech_codec=None,
+                 verbose=False,
+                 print_bursts=False):
+
+        gr.top_block.__init__(self, "Gr-gsm 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.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
+        self.verbose = verbose
+        self.print_bursts = print_bursts
+
+        ##################################################
+        # 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]), ([]))
+            if self.fc is not None:
+                self.input_adapter = grgsm.gsm_input(ppm=0, osr=4, fc=self.fc, samp_rate_in=samp_rate)
+                self.offset_control = grgsm.clock_offset_control(self.fc)
+            else:
+                self.input_adapter = grgsm.gsm_input(ppm=0, osr=4, samp_rate_in=samp_rate)
+
+        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)
+        if self.verbose:
+            self.message_printer = grgsm.message_printer(pmt.intern(""), True, True, False)
+
+        if self.print_bursts:
+            self.bursts_printer = grgsm.bursts_printer(pmt.intern(""), True, True, True, True)
+
+
+
+        ##################################################
+        # 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))
+            if self.fc is not None:
+                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.print_bursts:
+            self.msg_connect(self.timeslot_filter, "out", self.bursts_printer, 'bursts')
+
+        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")
+            if self.verbose:
+                self.msg_connect(self.cch_decoder, "msgs", self.message_printer, "msgs")
+
+        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")
+                if self.verbose:
+                    self.msg_connect(self.cch_decoder_decrypted, "msgs", self.message_printer, "msgs")
+
+            self.msg_connect(self.bcch_sdcch4_demapper, "bursts", self.cch_decoder, "bursts")
+            self.msg_connect(self.cch_decoder, "msgs", self.socket_pdu, "pdus")
+            if self.verbose:
+                self.msg_connect(self.cch_decoder, "msgs", self.message_printer, "msgs")
+
+        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")
+                if self.verbose:
+                    self.msg_connect(self.cch_decoder_decrypted, "msgs", self.message_printer, "msgs")
+
+            self.msg_connect(self.sdcch8_demapper, "bursts", self.cch_decoder, "bursts")
+            self.msg_connect(self.cch_decoder, "msgs", self.socket_pdu, "pdus")
+            if self.verbose:
+                self.msg_connect(self.cch_decoder, "msgs", self.message_printer, "msgs")
+
+        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 self.verbose:
+                self.msg_connect(self.tch_f_decoder, "msgs", self.message_printer, "msgs")
+                self.msg_connect(self.cch_decoder, "msgs", self.message_printer, "msgs")
+            
+
+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)")
+    parser.add_option("-v", "--verbose", action="store_true",
+                      help="If set, the decoded messages (with frame number and count) are printed to stdout")
+    parser.add_option("-p", "--print-bursts", action="store_true",
+                      help="If set, the raw bursts (with frame number and count) are printed to stdout")
+
+    # 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(1e6),
+                             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.cfile and (options.fc is None and options.arfcn is None) or (options.fc is not None and options.arfcn is not None):
+        print("You haven't provided a frequency or an ARFCN - working without automatic frequency offset correction.\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 = grgsm_decoder(timeslot=options.timeslot, subslot=options.subslot, chan_mode=options.chan_mode,
+                          burst_file=options.burst_file,
+                          cfile=options.cfile, 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),
+                          verbose=options.verbose,
+                          print_bursts=options.print_bursts)
+
+    # run
+    tb.start()
+    tb.wait()
+
+    # we are done, close socket
+    sock.close()
diff --git a/apps/grgsm_livemon b/apps/grgsm_livemon
new file mode 100755
index 0000000..6c58e08
--- /dev/null
+++ b/apps/grgsm_livemon
@@ -0,0 +1,279 @@
+#!/usr/bin/env python2
+##################################################
+# GNU Radio Python Flow Graph
+# Title: Gr-gsm Livemon
+# Generated: Wed Sep  2 21:46:35 2015
+##################################################
+
+if __name__ == '__main__':
+    import ctypes
+    import sys
+    if sys.platform.startswith('linux'):
+        try:
+            x11 = ctypes.cdll.LoadLibrary('libX11.so')
+            x11.XInitThreads()
+        except:
+            print "Warning: failed to XInitThreads()"
+
+from PyQt4 import Qt
+from gnuradio import blocks
+from gnuradio import eng_notation
+from gnuradio import gr
+from gnuradio import qtgui
+from gnuradio.eng_option import eng_option
+from gnuradio.filter import firdes
+from gnuradio.qtgui import Range, RangeWidget
+from math import pi
+from optparse import OptionParser
+import grgsm
+import osmosdr
+import pmt
+import sip
+import sys
+import time
+
+
+class grgsm_livemon(gr.top_block, Qt.QWidget):
+
+    def __init__(self, fc=939.4e6, gain=30, ppm=0, samp_rate=2000000.052982, shiftoff=400e3, args=""):
+        gr.top_block.__init__(self, "Gr-gsm Livemon")
+        Qt.QWidget.__init__(self)
+        self.setWindowTitle("Gr-gsm Livemon")
+        try:
+             self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
+        except:
+             pass
+        self.top_scroll_layout = Qt.QVBoxLayout()
+        self.setLayout(self.top_scroll_layout)
+        self.top_scroll = Qt.QScrollArea()
+        self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
+        self.top_scroll_layout.addWidget(self.top_scroll)
+        self.top_scroll.setWidgetResizable(True)
+        self.top_widget = Qt.QWidget()
+        self.top_scroll.setWidget(self.top_widget)
+        self.top_layout = Qt.QVBoxLayout(self.top_widget)
+        self.top_grid_layout = Qt.QGridLayout()
+        self.top_layout.addLayout(self.top_grid_layout)
+
+        self.settings = Qt.QSettings("GNU Radio", "grgsm_livemon")
+        self.restoreGeometry(self.settings.value("geometry").toByteArray())
+
+        ##################################################
+        # Parameters
+        ##################################################
+        self.fc = fc
+        self.gain = gain
+        self.ppm = ppm
+        self.samp_rate = samp_rate
+        self.shiftoff = shiftoff
+
+        ##################################################
+        # Variables
+        ##################################################
+        self.ppm_slider = ppm_slider = ppm
+        self.g_slider = g_slider = gain
+        self.fc_slider = fc_slider = fc
+
+        ##################################################
+        # Blocks
+        ##################################################
+        self._ppm_slider_range = Range(-150, 150, 1, ppm, 100)
+        self._ppm_slider_win = RangeWidget(self._ppm_slider_range, self.set_ppm_slider, "PPM Offset", "counter", float)
+        self.top_layout.addWidget(self._ppm_slider_win)
+        self._g_slider_range = Range(0, 50, 0.5, gain, 100)
+        self._g_slider_win = RangeWidget(self._g_slider_range, self.set_g_slider, "Gain", "counter", float)
+        self.top_layout.addWidget(self._g_slider_win)
+        self._fc_slider_range = Range(925e6, 1990e6, 2e5, fc, 100)
+        self._fc_slider_win = RangeWidget(self._fc_slider_range, self.set_fc_slider, "Frequency", "counter_slider", float)
+        self.top_layout.addWidget(self._fc_slider_win)
+        self.rtlsdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + args )
+        self.rtlsdr_source_0.set_sample_rate(samp_rate)
+        self.rtlsdr_source_0.set_center_freq(fc_slider-shiftoff, 0)
+        self.rtlsdr_source_0.set_freq_corr(ppm_slider, 0)
+        self.rtlsdr_source_0.set_dc_offset_mode(2, 0)
+        self.rtlsdr_source_0.set_iq_balance_mode(2, 0)
+        self.rtlsdr_source_0.set_gain_mode(False, 0)
+        self.rtlsdr_source_0.set_gain(g_slider, 0)
+        self.rtlsdr_source_0.set_if_gain(20, 0)
+        self.rtlsdr_source_0.set_bb_gain(20, 0)
+        self.rtlsdr_source_0.set_antenna("", 0)
+        self.rtlsdr_source_0.set_bandwidth(250e3+abs(shiftoff), 0)
+          
+        self.qtgui_freq_sink_x_0 = qtgui.freq_sink_c(
+        	1024, #size
+        	firdes.WIN_BLACKMAN_hARRIS, #wintype
+        	fc_slider, #fc
+        	samp_rate, #bw
+        	"", #name
+        	1 #number of inputs
+        )
+        self.qtgui_freq_sink_x_0.set_update_time(0.10)
+        self.qtgui_freq_sink_x_0.set_y_axis(-140, 10)
+#        self.qtgui_freq_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "")
+#        self.qtgui_freq_sink_x_0.enable_autoscale(False)
+#        self.qtgui_freq_sink_x_0.enable_grid(False)
+#        self.qtgui_freq_sink_x_0.set_fft_average(1.0)
+#        self.qtgui_freq_sink_x_0.enable_control_panel(False)
+#        
+#        if not True:
+#          self.qtgui_freq_sink_x_0.disable_legend()
+#        
+#        if complex == type(float()):
+#          self.qtgui_freq_sink_x_0.set_plot_pos_half(not True)
+#        
+#        labels = ["", "", "", "", "",
+#                  "", "", "", "", ""]
+#        widths = [1, 1, 1, 1, 1,
+#                  1, 1, 1, 1, 1]
+#        colors = ["blue", "red", "green", "black", "cyan",
+#                  "magenta", "yellow", "dark red", "dark green", "dark blue"]
+#        alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
+#                  1.0, 1.0, 1.0, 1.0, 1.0]
+#        for i in xrange(1):
+#            if len(labels[i]) == 0:
+#                self.qtgui_freq_sink_x_0.set_line_label(i, "Data {0}".format(i))
+#            else:
+#                self.qtgui_freq_sink_x_0.set_line_label(i, labels[i])
+#            self.qtgui_freq_sink_x_0.set_line_width(i, widths[i])
+#            self.qtgui_freq_sink_x_0.set_line_color(i, colors[i])
+#            self.qtgui_freq_sink_x_0.set_line_alpha(i, alphas[i])
+        
+        self._qtgui_freq_sink_x_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget)
+        self.top_layout.addWidget(self._qtgui_freq_sink_x_0_win)
+        self.gsm_sdcch8_demapper_0 = grgsm.universal_ctrl_chans_demapper(1, ([0,4,8,12,16,20,24,28,32,36,40,44]), ([8,8,8,8,8,8,8,8,136,136,136,136]))
+        self.gsm_receiver_0 = grgsm.receiver(4, ([0]), ([]))
+        self.gsm_message_printer_1 = grgsm.message_printer(pmt.intern(""), False)
+        self.gsm_input_0 = grgsm.gsm_input(
+            ppm=0,
+            osr=4,
+            fc=fc,
+            samp_rate_in=samp_rate,
+        )
+        self.gsm_decryption_0 = grgsm.decryption(([]), 1)
+        self.gsm_control_channels_decoder_0_0 = grgsm.control_channels_decoder()
+        self.gsm_control_channels_decoder_0 = grgsm.control_channels_decoder()
+        self.gsm_clock_offset_control_0 = grgsm.clock_offset_control(fc-shiftoff)
+        self.gsm_bcch_ccch_demapper_0 = grgsm.universal_ctrl_chans_demapper(0, ([2,6,12,16,22,26,32,36,42,46]), ([1,2,2,2,2,2,2,2,2,2]))
+        self.blocks_socket_pdu_0_0 = blocks.socket_pdu("UDP_SERVER", "127.0.0.1", "4729", 10000)
+        self.blocks_socket_pdu_0 = blocks.socket_pdu("UDP_CLIENT", "127.0.0.1", "4729", 10000)
+        self.blocks_rotator_cc_0 = blocks.rotator_cc(-2*pi*shiftoff/samp_rate)
+
+        ##################################################
+        # Connections
+        ##################################################
+        self.msg_connect((self.gsm_bcch_ccch_demapper_0, 'bursts'), (self.gsm_control_channels_decoder_0, 'bursts'))    
+        self.msg_connect((self.gsm_clock_offset_control_0, 'ppm'), (self.gsm_input_0, 'ppm_in'))    
+        self.msg_connect((self.gsm_control_channels_decoder_0, 'msgs'), (self.blocks_socket_pdu_0, 'pdus'))    
+        self.msg_connect((self.gsm_control_channels_decoder_0, 'msgs'), (self.gsm_message_printer_1, 'msgs'))    
+        self.msg_connect((self.gsm_control_channels_decoder_0_0, 'msgs'), (self.blocks_socket_pdu_0, 'pdus'))    
+        self.msg_connect((self.gsm_control_channels_decoder_0_0, 'msgs'), (self.gsm_message_printer_1, 'msgs'))    
+        self.msg_connect((self.gsm_decryption_0, 'bursts'), (self.gsm_control_channels_decoder_0_0, 'bursts'))    
+        self.msg_connect((self.gsm_receiver_0, 'C0'), (self.gsm_bcch_ccch_demapper_0, 'bursts'))    
+        self.msg_connect((self.gsm_receiver_0, 'measurements'), (self.gsm_clock_offset_control_0, 'measurements'))    
+        self.msg_connect((self.gsm_receiver_0, 'C0'), (self.gsm_sdcch8_demapper_0, 'bursts'))    
+        self.msg_connect((self.gsm_sdcch8_demapper_0, 'bursts'), (self.gsm_decryption_0, 'bursts'))    
+        self.connect((self.blocks_rotator_cc_0, 0), (self.gsm_input_0, 0))    
+        self.connect((self.blocks_rotator_cc_0, 0), (self.qtgui_freq_sink_x_0, 0))    
+        self.connect((self.gsm_input_0, 0), (self.gsm_receiver_0, 0))    
+        self.connect((self.rtlsdr_source_0, 0), (self.blocks_rotator_cc_0, 0))    
+
+    def closeEvent(self, event):
+        self.settings = Qt.QSettings("GNU Radio", "grgsm_livemon")
+        self.settings.setValue("geometry", self.saveGeometry())
+        event.accept()
+
+    def get_fc(self):
+        return self.fc
+
+    def set_fc(self, fc):
+        self.fc = fc
+        self.set_fc_slider(self.fc)
+        self.gsm_input_0.set_fc(self.fc)
+
+    def get_gain(self):
+        return self.gain
+
+    def set_gain(self, gain):
+        self.gain = gain
+        self.set_g_slider(self.gain)
+
+    def get_ppm(self):
+        return self.ppm
+
+    def set_ppm(self, ppm):
+        self.ppm = ppm
+        self.set_ppm_slider(self.ppm)
+
+    def get_samp_rate(self):
+        return self.samp_rate
+
+    def set_samp_rate(self, samp_rate):
+        self.samp_rate = samp_rate
+        self.blocks_rotator_cc_0.set_phase_inc(-2*pi*self.shiftoff/self.samp_rate)
+        self.gsm_input_0.set_samp_rate_in(self.samp_rate)
+        self.qtgui_freq_sink_x_0.set_frequency_range(self.fc_slider, self.samp_rate)
+        self.rtlsdr_source_0.set_sample_rate(self.samp_rate)
+
+    def get_shiftoff(self):
+        return self.shiftoff
+
+    def set_shiftoff(self, shiftoff):
+        self.shiftoff = shiftoff
+        self.blocks_rotator_cc_0.set_phase_inc(-2*pi*self.shiftoff/self.samp_rate)
+        self.rtlsdr_source_0.set_center_freq(self.fc_slider-self.shiftoff, 0)
+        self.rtlsdr_source_0.set_bandwidth(250e3+abs(self.shiftoff), 0)
+
+    def get_ppm_slider(self):
+        return self.ppm_slider
+
+    def set_ppm_slider(self, ppm_slider):
+        self.ppm_slider = ppm_slider
+        self.rtlsdr_source_0.set_freq_corr(self.ppm_slider, 0)
+
+    def get_g_slider(self):
+        return self.g_slider
+
+    def set_g_slider(self, g_slider):
+        self.g_slider = g_slider
+        self.rtlsdr_source_0.set_gain(self.g_slider, 0)
+
+    def get_fc_slider(self):
+        return self.fc_slider
+
+    def set_fc_slider(self, fc_slider):
+        self.fc_slider = fc_slider
+        self.qtgui_freq_sink_x_0.set_frequency_range(self.fc_slider, self.samp_rate)
+        self.rtlsdr_source_0.set_center_freq(self.fc_slider-self.shiftoff, 0)
+
+
+if __name__ == '__main__':
+    parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
+    parser.add_option("-f", "--fc", dest="fc", type="eng_float", default=eng_notation.num_to_str(939.4e6),
+        help="Set fc [default=%default]")
+    parser.add_option("-g", "--gain", dest="gain", type="eng_float", default=eng_notation.num_to_str(30),
+        help="Set gain [default=%default]")
+    parser.add_option("-p", "--ppm", dest="ppm", type="intx", default=0,
+        help="Set ppm [default=%default]")
+    parser.add_option("-s", "--samp-rate", dest="samp_rate", type="eng_float", default=eng_notation.num_to_str(2000000.052982),
+        help="Set samp_rate [default=%default]")
+    parser.add_option("-o", "--shiftoff", dest="shiftoff", type="eng_float", default=eng_notation.num_to_str(400e3),
+        help="Set shiftoff [default=%default]")
+    parser.add_option("", "--args", dest="args", type="string", default="",
+        help="Set device arguments [default=%default]")
+                
+    (options, args) = parser.parse_args()
+#    from distutils.version import StrictVersion
+#    if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"):
+#        Qt.QApplication.setGraphicsSystem(gr.prefs().get_string('qtgui','style','raster'))
+    Qt.QApplication.setGraphicsSystem(gr.prefs().get_string('qtgui','style','raster'))
+    qapp = Qt.QApplication(sys.argv)
+    tb = grgsm_livemon(fc=options.fc, gain=options.gain, ppm=options.ppm, samp_rate=options.samp_rate, shiftoff=options.shiftoff, args=options.args)
+    tb.start()
+    tb.show()
+
+    def quitting():
+        tb.stop()
+        tb.wait()
+    qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
+    qapp.exec_()
+    tb = None  # to clean up Qt widgets
diff --git a/examples/experimental_receiver_components_test.grc b/apps/grgsm_livemon.grc
similarity index 76%
rename from examples/experimental_receiver_components_test.grc
rename to apps/grgsm_livemon.grc
index 4f92f3d..22c30b0 100644
--- a/examples/experimental_receiver_components_test.grc
+++ b/apps/grgsm_livemon.grc
@@ -1,50 +1,54 @@
-<?xml version='1.0' encoding='ASCII'?>
-<?grc format='1' created='3.7.6'?>
+<?xml version='1.0' encoding='utf-8'?>
+<?grc format='1' created='3.7.8'?>
 <flow_graph>
-  <timestamp>Wed Aug 13 14:23:19 2014</timestamp>
+  <timestamp>Sat Dec 13 10:49:59 2014</timestamp>
   <block>
     <key>options</key>
     <param>
-      <key>id</key>
-      <value>test_rtl_taggery_pythonowe</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>title</key>
-      <value></value>
-    </param>
-    <param>
       <key>author</key>
-      <value></value>
+      <value>Piotr Krysik</value>
     </param>
     <param>
-      <key>description</key>
+      <key>alias</key>
       <value></value>
     </param>
     <param>
       <key>window_size</key>
-      <value>1280, 1024</value>
-    </param>
-    <param>
-      <key>generate_options</key>
-      <value>qt_gui</value>
+      <value>2280, 1024</value>
     </param>
     <param>
       <key>category</key>
       <value>Custom</value>
     </param>
     <param>
-      <key>run_options</key>
-      <value>run</value>
+      <key>comment</key>
+      <value></value>
     </param>
     <param>
-      <key>run</key>
+      <key>description</key>
+      <value>Interactive monitor of a single C0 channel with analysis performed by Wireshark (command to run wireshark: sudo wireshark -k -f udp -Y gsmtap -i lo)</value>
+    </param>
+    <param>
+      <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
+      <key>_coordinate</key>
+      <value>(16, 11)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>generate_options</key>
+      <value>qt_gui</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>grgsm_livemon</value>
+    </param>
+    <param>
       <key>max_nouts</key>
       <value>0</value>
     </param>
@@ -53,449 +57,1005 @@
       <value></value>
     </param>
     <param>
-      <key>alias</key>
-      <value></value>
+      <key>run_options</key>
+      <value>prompt</value>
     </param>
     <param>
-      <key>_coordinate</key>
-      <value>(10, 10)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>samp_rate</value>
-    </param>
-    <param>
-      <key>_enabled</key>
+      <key>run</key>
       <value>True</value>
     </param>
     <param>
-      <key>value</key>
-      <value>100e6/100</value>
-    </param>
-    <param>
-      <key>alias</key>
+      <key>thread_safe_setters</key>
       <value></value>
     </param>
     <param>
-      <key>_coordinate</key>
-      <value>(10, 169)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>id</key>
-      <value>samp_rate2</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>13e6/12</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(21, 245)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>parameter</key>
-    <param>
-      <key>id</key>
-      <value>OSR</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>Over Sampling Ratio</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>4</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value></value>
-    </param>
-    <param>
-      <key>short_id</key>
-      <value></value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(253, 34)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
+      <key>title</key>
+      <value>Gr-gsm Livemon</value>
     </param>
   </block>
   <block>
     <key>variable_qtgui_range</key>
     <param>
-      <key>id</key>
-      <value>ppm</value>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>fc</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>label</key>
-      <value>ppm</value>
+      <key>_coordinate</key>
+      <value>(304, 11)</value>
     </param>
     <param>
-      <key>value</key>
-      <value>-4</value>
+      <key>gui_hint</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>fc_slider</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>Frequency</value>
+    </param>
+    <param>
+      <key>min_len</key>
+      <value>100</value>
+    </param>
+    <param>
+      <key>orient</key>
+      <value>Qt.Horizontal</value>
     </param>
     <param>
       <key>start</key>
-      <value>-50</value>
+      <value>925e6</value>
+    </param>
+    <param>
+      <key>step</key>
+      <value>2e5</value>
+    </param>
+    <param>
+      <key>stop</key>
+      <value>1990e6</value>
+    </param>
+    <param>
+      <key>rangeType</key>
+      <value>float</value>
+    </param>
+    <param>
+      <key>widget</key>
+      <value>counter_slider</value>
+    </param>
+  </block>
+  <block>
+    <key>variable_qtgui_range</key>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>gain</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(192, 11)</value>
+    </param>
+    <param>
+      <key>gui_hint</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>g_slider</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>Gain</value>
+    </param>
+    <param>
+      <key>min_len</key>
+      <value>100</value>
+    </param>
+    <param>
+      <key>orient</key>
+      <value>Qt.Horizontal</value>
+    </param>
+    <param>
+      <key>start</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>step</key>
+      <value>0.5</value>
     </param>
     <param>
       <key>stop</key>
       <value>50</value>
     </param>
     <param>
-      <key>step</key>
-      <value>0.1</value>
+      <key>rangeType</key>
+      <value>float</value>
     </param>
     <param>
       <key>widget</key>
-      <value>counter_slider</value>
-    </param>
-    <param>
-      <key>orient</key>
-      <value>Qt.Horizontal</value>
-    </param>
-    <param>
-      <key>min_len</key>
-      <value>200</value>
-    </param>
-    <param>
-      <key>gui_hint</key>
-      <value></value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(764, 42)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
+      <value>counter</value>
     </param>
   </block>
   <block>
     <key>variable_qtgui_range</key>
     <param>
-      <key>id</key>
-      <value>g</value>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>ppm</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>label</key>
-      <value>g</value>
+      <key>_coordinate</key>
+      <value>(440, 11)</value>
     </param>
     <param>
-      <key>value</key>
-      <value>20</value>
+      <key>gui_hint</key>
+      <value></value>
     </param>
     <param>
-      <key>start</key>
+      <key>_rotation</key>
       <value>0</value>
     </param>
     <param>
-      <key>stop</key>
+      <key>id</key>
+      <value>ppm_slider</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>PPM Offset</value>
+    </param>
+    <param>
+      <key>min_len</key>
       <value>100</value>
     </param>
     <param>
-      <key>step</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>widget</key>
-      <value>counter_slider</value>
-    </param>
-    <param>
       <key>orient</key>
       <value>Qt.Horizontal</value>
     </param>
     <param>
-      <key>min_len</key>
-      <value>200</value>
+      <key>start</key>
+      <value>-150</value>
     </param>
     <param>
-      <key>gui_hint</key>
-      <value></value>
+      <key>step</key>
+      <value>1</value>
     </param>
     <param>
+      <key>stop</key>
+      <value>150</value>
+    </param>
+    <param>
+      <key>rangeType</key>
+      <value>float</value>
+    </param>
+    <param>
+      <key>widget</key>
+      <value>counter</value>
+    </param>
+  </block>
+  <block>
+    <key>parameter</key>
+    <param>
       <key>alias</key>
       <value></value>
     </param>
     <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
       <key>_coordinate</key>
-      <value>(619, 45)</value>
+      <value>(872, 11)</value>
     </param>
     <param>
       <key>_rotation</key>
       <value>0</value>
     </param>
-  </block>
-  <block>
-    <key>variable_qtgui_range</key>
     <param>
       <key>id</key>
-      <value>fc</value>
+      <value>args</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>Device Arguments</value>
+    </param>
+    <param>
+      <key>short_id</key>
+      <value></value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>string</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>""</value>
+    </param>
+  </block>
+  <block>
+    <key>blocks_rotator_cc</key>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>affinity</key>
+      <value></value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
+      <key>_coordinate</key>
+      <value>(256, 299)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>blocks_rotator_cc_0</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>phase_inc</key>
+      <value>-2*pi*shiftoff/samp_rate</value>
+    </param>
+  </block>
+  <block>
+    <key>blocks_socket_pdu</key>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>affinity</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(1512, 363)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>host</key>
+      <value>127.0.0.1</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>blocks_socket_pdu_0</value>
+    </param>
+    <param>
+      <key>mtu</key>
+      <value>10000</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>port</key>
+      <value>4729</value>
+    </param>
+    <param>
+      <key>tcp_no_delay</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>"UDP_CLIENT"</value>
+    </param>
+  </block>
+  <block>
+    <key>blocks_socket_pdu</key>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>affinity</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(1512, 459)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>host</key>
+      <value>127.0.0.1</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>blocks_socket_pdu_0_0</value>
+    </param>
+    <param>
+      <key>mtu</key>
+      <value>10000</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>port</key>
+      <value>4729</value>
+    </param>
+    <param>
+      <key>tcp_no_delay</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>"UDP_SERVER"</value>
+    </param>
+  </block>
+  <block>
+    <key>parameter</key>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(624, 11)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>fc</value>
+    </param>
+    <param>
       <key>label</key>
       <value>fc</value>
     </param>
     <param>
+      <key>short_id</key>
+      <value>f</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>eng_float</value>
+    </param>
+    <param>
       <key>value</key>
-      <value>938.4e6</value>
+      <value>939.4e6</value>
     </param>
-    <param>
-      <key>start</key>
-      <value>900e6</value>
-    </param>
-    <param>
-      <key>stop</key>
-      <value>1000e6</value>
-    </param>
-    <param>
-      <key>step</key>
-      <value>200e3</value>
-    </param>
-    <param>
-      <key>widget</key>
-      <value>counter_slider</value>
-    </param>
-    <param>
-      <key>orient</key>
-      <value>Qt.Horizontal</value>
-    </param>
-    <param>
-      <key>min_len</key>
-      <value>200</value>
-    </param>
-    <param>
-      <key>gui_hint</key>
-      <value></value>
-    </param>
+  </block>
+  <block>
+    <key>parameter</key>
     <param>
       <key>alias</key>
       <value></value>
     </param>
     <param>
-      <key>_coordinate</key>
-      <value>(472, 52)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>fractional_resampler_xx</key>
-    <param>
-      <key>id</key>
-      <value>fractional_resampler_xx_0</value>
+      <key>comment</key>
+      <value></value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>type</key>
-      <value>complex</value>
+      <key>_coordinate</key>
+      <value>(552, 11)</value>
     </param>
     <param>
-      <key>phase_shift</key>
+      <key>_rotation</key>
       <value>0</value>
     </param>
     <param>
-      <key>resamp_ratio</key>
-      <value>samp_rate/samp_rate2</value>
+      <key>id</key>
+      <value>gain</value>
     </param>
     <param>
+      <key>label</key>
+      <value>gain</value>
+    </param>
+    <param>
+      <key>short_id</key>
+      <value>g</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>eng_float</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>30</value>
+    </param>
+  </block>
+  <block>
+    <key>gsm_bcch_ccch_demapper</key>
+    <param>
       <key>alias</key>
       <value></value>
     </param>
     <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
       <key>affinity</key>
       <value></value>
     </param>
     <param>
-      <key>minoutbuf</key>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(896, 283)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
       <value>0</value>
     </param>
     <param>
+      <key>id</key>
+      <value>gsm_bcch_ccch_demapper_0</value>
+    </param>
+    <param>
       <key>maxoutbuf</key>
       <value>0</value>
     </param>
     <param>
-      <key>_coordinate</key>
-      <value>(417, 249)</value>
+      <key>minoutbuf</key>
+      <value>0</value>
     </param>
     <param>
-      <key>_rotation</key>
+      <key>timeslot_nr</key>
       <value>0</value>
     </param>
+    <param>
+      <key>channel_types</key>
+      <value>[1,2,2,2,2,2,2,2,2,2]</value>
+    </param>
+    <param>
+      <key>starts_fn_mod51</key>
+      <value>[2,6,12,16,22,26,32,36,42,46]</value>
+    </param>
   </block>
   <block>
-    <key>low_pass_filter</key>
+    <key>gsm_clock_offset_control</key>
     <param>
-      <key>id</key>
-      <value>low_pass_filter_0</value>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>affinity</key>
+      <value></value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>type</key>
-      <value>fir_filter_ccf</value>
+      <key>_coordinate</key>
+      <value>(552, 411)</value>
     </param>
     <param>
-      <key>decim</key>
+      <key>_rotation</key>
+      <value>180</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>gsm_clock_offset_control_0</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>fc</key>
+      <value>fc-shiftoff</value>
+    </param>
+  </block>
+  <block>
+    <key>gsm_control_channels_decoder</key>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>affinity</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(1264, 289)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>gsm_control_channels_decoder_0</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>gsm_control_channels_decoder</key>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>affinity</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
       <value>1</value>
     </param>
     <param>
-      <key>interp</key>
+      <key>_coordinate</key>
+      <value>(1264, 345)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>gsm_control_channels_decoder_0_0</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>gsm_decryption</key>
+    <param>
+      <key>a5_version</key>
       <value>1</value>
     </param>
     <param>
-      <key>gain</key>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>affinity</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
       <value>1</value>
     </param>
     <param>
-      <key>samp_rate</key>
+      <key>_coordinate</key>
+      <value>(1112, 331)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>gsm_decryption_0</value>
+    </param>
+    <param>
+      <key>k_c</key>
+      <value>[]</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+  </block>
+  <block>
+    <key>gsm_input</key>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>affinity</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(488, 305)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>gsm_input_0</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>osr</key>
+      <value>4</value>
+    </param>
+    <param>
+      <key>fc</key>
+      <value>fc</value>
+    </param>
+    <param>
+      <key>ppm</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>samp_rate_in</key>
       <value>samp_rate</value>
     </param>
-    <param>
-      <key>cutoff_freq</key>
-      <value>200e3</value>
-    </param>
-    <param>
-      <key>width</key>
-      <value>10e3</value>
-    </param>
-    <param>
-      <key>win</key>
-      <value>firdes.WIN_HAMMING</value>
-    </param>
-    <param>
-      <key>beta</key>
-      <value>6.76</value>
-    </param>
+  </block>
+  <block>
+    <key>gsm_message_printer</key>
     <param>
       <key>alias</key>
       <value></value>
     </param>
     <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
       <key>affinity</key>
       <value></value>
     </param>
     <param>
-      <key>minoutbuf</key>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(1496, 291)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
       <value>0</value>
     </param>
     <param>
+      <key>id</key>
+      <value>gsm_message_printer_1</value>
+    </param>
+    <param>
+      <key>prepend_frame_count</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>prepend_fnr</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>prepend_string</key>
+      <value>""</value>
+    </param>
+    <param>
+      <key>print_gsmtap_header</key>
+      <value>False</value>
+    </param>
+  </block>
+  <block>
+    <key>gsm_receiver</key>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>cell_allocation</key>
+      <value>[0]</value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>affinity</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(672, 289)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>gsm_receiver_0</value>
+    </param>
+    <param>
       <key>maxoutbuf</key>
       <value>0</value>
     </param>
     <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>num_streams</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>osr</key>
+      <value>4</value>
+    </param>
+    <param>
+      <key>tseq_nums</key>
+      <value>[]</value>
+    </param>
+  </block>
+  <block>
+    <key>gsm_sdcch8_demapper</key>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>affinity</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
       <key>_coordinate</key>
-      <value>(250, 197)</value>
+      <value>(912, 339)</value>
     </param>
     <param>
       <key>_rotation</key>
       <value>0</value>
     </param>
+    <param>
+      <key>id</key>
+      <value>gsm_sdcch8_demapper_0</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>timeslot_nr</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>channel_types</key>
+      <value>[8,8,8,8,8,8,8,8,136,136,136,136]</value>
+    </param>
+    <param>
+      <key>starts_fn_mod51</key>
+      <value>[0,4,8,12,16,20,24,28,32,36,40,44]</value>
+    </param>
+  </block>
+  <block>
+    <key>import</key>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(1016, 11)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>import_0</value>
+    </param>
+    <param>
+      <key>import</key>
+      <value>from math import pi</value>
+    </param>
+  </block>
+  <block>
+    <key>parameter</key>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(712, 11)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>ppm</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>ppm</value>
+    </param>
+    <param>
+      <key>short_id</key>
+      <value>p</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>intx</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>0</value>
+    </param>
   </block>
   <block>
     <key>qtgui_freq_sink_x</key>
     <param>
-      <key>id</key>
-      <value>qtgui_freq_sink_x_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>complex</value>
-    </param>
-    <param>
-      <key>name</key>
-      <value>""</value>
-    </param>
-    <param>
-      <key>fftsize</key>
-      <value>1024</value>
-    </param>
-    <param>
-      <key>freqhalf</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>wintype</key>
-      <value>firdes.WIN_BLACKMAN_hARRIS</value>
-    </param>
-    <param>
-      <key>fc</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>bw</key>
-      <value>samp_rate</value>
-    </param>
-    <param>
-      <key>grid</key>
-      <value>False</value>
-    </param>
-    <param>
       <key>autoscale</key>
       <value>False</value>
     </param>
@@ -504,475 +1064,68 @@
       <value>1.0</value>
     </param>
     <param>
-      <key>ymin</key>
-      <value>-140</value>
+      <key>bw</key>
+      <value>samp_rate</value>
     </param>
     <param>
-      <key>ymax</key>
-      <value>10</value>
+      <key>alias</key>
+      <value></value>
     </param>
     <param>
-      <key>nconnections</key>
-      <value>1</value>
+      <key>fc</key>
+      <value>fc_slider</value>
     </param>
     <param>
-      <key>update_time</key>
-      <value>0.10</value>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>ctrlpanel</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>affinity</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>fftsize</key>
+      <value>1024</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(488, 187)</value>
     </param>
     <param>
       <key>gui_hint</key>
       <value></value>
     </param>
     <param>
-      <key>showports</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>tr_mode</key>
-      <value>qtgui.TRIG_MODE_FREE</value>
-    </param>
-    <param>
-      <key>tr_level</key>
-      <value>0.0</value>
-    </param>
-    <param>
-      <key>tr_chan</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>tr_tag</key>
-      <value>""</value>
-    </param>
-    <param>
-      <key>label1</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width1</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color1</key>
-      <value>"blue"</value>
-    </param>
-    <param>
-      <key>alpha1</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label2</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width2</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color2</key>
-      <value>"red"</value>
-    </param>
-    <param>
-      <key>alpha2</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label3</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width3</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color3</key>
-      <value>"green"</value>
-    </param>
-    <param>
-      <key>alpha3</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label4</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width4</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color4</key>
-      <value>"black"</value>
-    </param>
-    <param>
-      <key>alpha4</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label5</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width5</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color5</key>
-      <value>"cyan"</value>
-    </param>
-    <param>
-      <key>alpha5</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label6</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width6</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color6</key>
-      <value>"magenta"</value>
-    </param>
-    <param>
-      <key>alpha6</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label7</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width7</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color7</key>
-      <value>"yellow"</value>
-    </param>
-    <param>
-      <key>alpha7</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label8</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width8</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color8</key>
-      <value>"dark red"</value>
-    </param>
-    <param>
-      <key>alpha8</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label9</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width9</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color9</key>
-      <value>"dark green"</value>
-    </param>
-    <param>
-      <key>alpha9</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label10</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width10</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color10</key>
-      <value>"dark blue"</value>
-    </param>
-    <param>
-      <key>alpha10</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(287, 419)</value>
-    </param>
-    <param>
       <key>_rotation</key>
       <value>0</value>
     </param>
-  </block>
-  <block>
-    <key>blocks_complex_to_mag</key>
-    <param>
-      <key>id</key>
-      <value>blocks_complex_to_mag_0_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>vlen</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(866, 460)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_fcch_detector</key>
-    <param>
-      <key>id</key>
-      <value>gsm_fcch_detector_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>OSR</key>
-      <value>OSR</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(623, 263)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_sch_detector</key>
-    <param>
-      <key>id</key>
-      <value>gsm_sch_detector_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>OSR</key>
-      <value>OSR</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(818, 263)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>blocks_complex_to_mag</key>
-    <param>
-      <key>id</key>
-      <value>blocks_complex_to_mag_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>vlen</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(968, 267)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>qtgui_time_sink_x</key>
-    <param>
-      <key>id</key>
-      <value>qtgui_time_sink_x_0</value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>float</value>
-    </param>
-    <param>
-      <key>name</key>
-      <value>QT GUI Plot</value>
-    </param>
-    <param>
-      <key>ylabel</key>
-      <value>Amplitude</value>
-    </param>
-    <param>
-      <key>yunit</key>
-      <value>""</value>
-    </param>
-    <param>
-      <key>size</key>
-      <value>int(51*4*8*156.25)</value>
-    </param>
-    <param>
-      <key>srate</key>
-      <value>samp_rate2</value>
-    </param>
     <param>
       <key>grid</key>
       <value>False</value>
     </param>
     <param>
-      <key>autoscale</key>
-      <value>False</value>
+      <key>id</key>
+      <value>qtgui_freq_sink_x_0</value>
     </param>
     <param>
-      <key>ymin</key>
-      <value>-0.00001</value>
-    </param>
-    <param>
-      <key>ymax</key>
-      <value>2</value>
-    </param>
-    <param>
-      <key>nconnections</key>
-      <value>2</value>
-    </param>
-    <param>
-      <key>update_time</key>
-      <value>(51.0*4*8*156.25)/samp_rate</value>
-    </param>
-    <param>
-      <key>entags</key>
+      <key>legend</key>
       <value>True</value>
     </param>
     <param>
-      <key>gui_hint</key>
-      <value></value>
+      <key>alpha1</key>
+      <value>1.0</value>
     </param>
     <param>
-      <key>tr_mode</key>
-      <value>qtgui.TRIG_MODE_TAG</value>
-    </param>
-    <param>
-      <key>tr_slope</key>
-      <value>qtgui.TRIG_SLOPE_POS</value>
-    </param>
-    <param>
-      <key>tr_level</key>
-      <value>0.0</value>
-    </param>
-    <param>
-      <key>tr_delay</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>tr_chan</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>tr_tag</key>
-      <value>"fcch"</value>
+      <key>color1</key>
+      <value>"blue"</value>
     </param>
     <param>
       <key>label1</key>
@@ -983,212 +1136,12 @@
       <value>1</value>
     </param>
     <param>
-      <key>color1</key>
-      <value>"blue"</value>
-    </param>
-    <param>
-      <key>style1</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>marker1</key>
-      <value>-1</value>
-    </param>
-    <param>
-      <key>alpha1</key>
+      <key>alpha10</key>
       <value>1.0</value>
     </param>
     <param>
-      <key>label2</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width2</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color2</key>
-      <value>"red"</value>
-    </param>
-    <param>
-      <key>style2</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>marker2</key>
-      <value>-1</value>
-    </param>
-    <param>
-      <key>alpha2</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label3</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width3</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color3</key>
-      <value>"green"</value>
-    </param>
-    <param>
-      <key>style3</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>marker3</key>
-      <value>-1</value>
-    </param>
-    <param>
-      <key>alpha3</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label4</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width4</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color4</key>
-      <value>"black"</value>
-    </param>
-    <param>
-      <key>style4</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>marker4</key>
-      <value>-1</value>
-    </param>
-    <param>
-      <key>alpha4</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label5</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width5</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color5</key>
-      <value>"cyan"</value>
-    </param>
-    <param>
-      <key>style5</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>marker5</key>
-      <value>-1</value>
-    </param>
-    <param>
-      <key>alpha5</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label6</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width6</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color6</key>
-      <value>"magenta"</value>
-    </param>
-    <param>
-      <key>style6</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>marker6</key>
-      <value>-1</value>
-    </param>
-    <param>
-      <key>alpha6</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label7</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width7</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color7</key>
-      <value>"yellow"</value>
-    </param>
-    <param>
-      <key>style7</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>marker7</key>
-      <value>-1</value>
-    </param>
-    <param>
-      <key>alpha7</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label8</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width8</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color8</key>
-      <value>"dark red"</value>
-    </param>
-    <param>
-      <key>style8</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>marker8</key>
-      <value>-1</value>
-    </param>
-    <param>
-      <key>alpha8</key>
-      <value>1.0</value>
-    </param>
-    <param>
-      <key>label9</key>
-      <value></value>
-    </param>
-    <param>
-      <key>width9</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>color9</key>
-      <value>"dark green"</value>
-    </param>
-    <param>
-      <key>style9</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>marker9</key>
-      <value>-1</value>
-    </param>
-    <param>
-      <key>alpha9</key>
-      <value>1.0</value>
+      <key>color10</key>
+      <value>"dark blue"</value>
     </param>
     <param>
       <key>label10</key>
@@ -1199,63 +1152,1511 @@
       <value>1</value>
     </param>
     <param>
-      <key>color10</key>
-      <value>"blue"</value>
-    </param>
-    <param>
-      <key>style10</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>marker10</key>
-      <value>-1</value>
-    </param>
-    <param>
-      <key>alpha10</key>
+      <key>alpha2</key>
       <value>1.0</value>
     </param>
     <param>
+      <key>color2</key>
+      <value>"red"</value>
+    </param>
+    <param>
+      <key>label2</key>
+      <value></value>
+    </param>
+    <param>
+      <key>width2</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>alpha3</key>
+      <value>1.0</value>
+    </param>
+    <param>
+      <key>color3</key>
+      <value>"green"</value>
+    </param>
+    <param>
+      <key>label3</key>
+      <value></value>
+    </param>
+    <param>
+      <key>width3</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>alpha4</key>
+      <value>1.0</value>
+    </param>
+    <param>
+      <key>color4</key>
+      <value>"black"</value>
+    </param>
+    <param>
+      <key>label4</key>
+      <value></value>
+    </param>
+    <param>
+      <key>width4</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>alpha5</key>
+      <value>1.0</value>
+    </param>
+    <param>
+      <key>color5</key>
+      <value>"cyan"</value>
+    </param>
+    <param>
+      <key>label5</key>
+      <value></value>
+    </param>
+    <param>
+      <key>width5</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>alpha6</key>
+      <value>1.0</value>
+    </param>
+    <param>
+      <key>color6</key>
+      <value>"magenta"</value>
+    </param>
+    <param>
+      <key>label6</key>
+      <value></value>
+    </param>
+    <param>
+      <key>width6</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>alpha7</key>
+      <value>1.0</value>
+    </param>
+    <param>
+      <key>color7</key>
+      <value>"yellow"</value>
+    </param>
+    <param>
+      <key>label7</key>
+      <value></value>
+    </param>
+    <param>
+      <key>width7</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>alpha8</key>
+      <value>1.0</value>
+    </param>
+    <param>
+      <key>color8</key>
+      <value>"dark red"</value>
+    </param>
+    <param>
+      <key>label8</key>
+      <value></value>
+    </param>
+    <param>
+      <key>width8</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>alpha9</key>
+      <value>1.0</value>
+    </param>
+    <param>
+      <key>color9</key>
+      <value>"dark green"</value>
+    </param>
+    <param>
+      <key>label9</key>
+      <value></value>
+    </param>
+    <param>
+      <key>width9</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>name</key>
+      <value>""</value>
+    </param>
+    <param>
+      <key>nconnections</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>showports</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>freqhalf</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>tr_chan</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>tr_level</key>
+      <value>0.0</value>
+    </param>
+    <param>
+      <key>tr_mode</key>
+      <value>qtgui.TRIG_MODE_FREE</value>
+    </param>
+    <param>
+      <key>tr_tag</key>
+      <value>""</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>complex</value>
+    </param>
+    <param>
+      <key>update_time</key>
+      <value>0.10</value>
+    </param>
+    <param>
+      <key>wintype</key>
+      <value>firdes.WIN_BLACKMAN_hARRIS</value>
+    </param>
+    <param>
+      <key>ymax</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ymin</key>
+      <value>-140</value>
+    </param>
+  </block>
+  <block>
+    <key>rtlsdr_source</key>
+    <param>
       <key>alias</key>
       <value></value>
     </param>
     <param>
+      <key>ant0</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain0</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw0</key>
+      <value>250e3+abs(shiftoff)</value>
+    </param>
+    <param>
+      <key>dc_offset_mode0</key>
+      <value>2</value>
+    </param>
+    <param>
+      <key>corr0</key>
+      <value>ppm_slider</value>
+    </param>
+    <param>
+      <key>freq0</key>
+      <value>fc_slider-shiftoff</value>
+    </param>
+    <param>
+      <key>gain_mode0</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain0</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode0</key>
+      <value>2</value>
+    </param>
+    <param>
+      <key>gain0</key>
+      <value>g_slider</value>
+    </param>
+    <param>
+      <key>ant10</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain10</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw10</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode10</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr10</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq10</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode10</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain10</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode10</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain10</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant11</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain11</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw11</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode11</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr11</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq11</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode11</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain11</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode11</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain11</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant12</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain12</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw12</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode12</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr12</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq12</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode12</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain12</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode12</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain12</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant13</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain13</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw13</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode13</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr13</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq13</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode13</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain13</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode13</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain13</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant14</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain14</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw14</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode14</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr14</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq14</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode14</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain14</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode14</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain14</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant15</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain15</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw15</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode15</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr15</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq15</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode15</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain15</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode15</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain15</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant16</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain16</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw16</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode16</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr16</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq16</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode16</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain16</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode16</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain16</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant17</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain17</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw17</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode17</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr17</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq17</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode17</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain17</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode17</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain17</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant18</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain18</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw18</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode18</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr18</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq18</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode18</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain18</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode18</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain18</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant19</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain19</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw19</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode19</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr19</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq19</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode19</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain19</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode19</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain19</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant1</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain1</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw1</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode1</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr1</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq1</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode1</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>if_gain1</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode1</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain1</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant20</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain20</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw20</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode20</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr20</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq20</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode20</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain20</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode20</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain20</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant21</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain21</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw21</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode21</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr21</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq21</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode21</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain21</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode21</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain21</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant22</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain22</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw22</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode22</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr22</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq22</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode22</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain22</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode22</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain22</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant23</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain23</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw23</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode23</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr23</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq23</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode23</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain23</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode23</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain23</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant24</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain24</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw24</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode24</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr24</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq24</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode24</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain24</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode24</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain24</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant25</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain25</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw25</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode25</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr25</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq25</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode25</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain25</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode25</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain25</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant26</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain26</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw26</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode26</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr26</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq26</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode26</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain26</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode26</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain26</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant27</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain27</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw27</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode27</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr27</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq27</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode27</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain27</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode27</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain27</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant28</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain28</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw28</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode28</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr28</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq28</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode28</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain28</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode28</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain28</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant29</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain29</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw29</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode29</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr29</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq29</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode29</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain29</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode29</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain29</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant2</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain2</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw2</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode2</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr2</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq2</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode2</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>if_gain2</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode2</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain2</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant30</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain30</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw30</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode30</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr30</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq30</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode30</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain30</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode30</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain30</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant31</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain31</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw31</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode31</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr31</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq31</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode31</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain31</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode31</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain31</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant3</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain3</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw3</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode3</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr3</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq3</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode3</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>if_gain3</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode3</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain3</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant4</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain4</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw4</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode4</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr4</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq4</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode4</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>if_gain4</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode4</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain4</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant5</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain5</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw5</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode5</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr5</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq5</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode5</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain5</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode5</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain5</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant6</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain6</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw6</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode6</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr6</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq6</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode6</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain6</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode6</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain6</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant7</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain7</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw7</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode7</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr7</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq7</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode7</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain7</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode7</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain7</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant8</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain8</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw8</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode8</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr8</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq8</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode8</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain8</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode8</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain8</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>ant9</key>
+      <value></value>
+    </param>
+    <param>
+      <key>bb_gain9</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>bw9</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>dc_offset_mode9</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>corr9</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>freq9</key>
+      <value>100e6</value>
+    </param>
+    <param>
+      <key>gain_mode9</key>
+      <value>False</value>
+    </param>
+    <param>
+      <key>if_gain9</key>
+      <value>20</value>
+    </param>
+    <param>
+      <key>iq_balance_mode9</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>gain9</key>
+      <value>10</value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
       <key>affinity</key>
       <value></value>
     </param>
     <param>
-      <key>_coordinate</key>
-      <value>(1123, 415)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>rtlsdr_source</key>
-    <param>
-      <key>id</key>
-      <value>rtlsdr_source_0</value>
+      <key>args</key>
+      <value>args</value>
     </param>
     <param>
       <key>_enabled</key>
       <value>True</value>
     </param>
     <param>
-      <key>type</key>
-      <value>fc32</value>
+      <key>_coordinate</key>
+      <value>(16, 227)</value>
     </param>
     <param>
-      <key>args</key>
-      <value></value>
+      <key>_rotation</key>
+      <value>0</value>
     </param>
     <param>
-      <key>sync</key>
-      <value></value>
+      <key>id</key>
+      <value>rtlsdr_source_0</value>
     </param>
     <param>
-      <key>num_mboards</key>
-      <value>1</value>
+      <key>maxoutbuf</key>
+      <value>0</value>
     </param>
     <param>
       <key>clock_source0</key>
@@ -1322,1371 +2723,204 @@
       <value></value>
     </param>
     <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
       <key>nchan</key>
       <value>1</value>
     </param>
     <param>
+      <key>num_mboards</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>fc32</value>
+    </param>
+    <param>
       <key>sample_rate</key>
       <value>samp_rate</value>
     </param>
     <param>
-      <key>freq0</key>
-      <value>fc</value>
-    </param>
-    <param>
-      <key>corr0</key>
-      <value>ppm</value>
-    </param>
-    <param>
-      <key>dc_offset_mode0</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode0</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode0</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain0</key>
-      <value>g</value>
-    </param>
-    <param>
-      <key>if_gain0</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain0</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant0</key>
+      <key>sync</key>
       <value></value>
     </param>
-    <param>
-      <key>bw0</key>
-      <value>250e3</value>
-    </param>
-    <param>
-      <key>freq1</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr1</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode1</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode1</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode1</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain1</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain1</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain1</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant1</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw1</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq2</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr2</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode2</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode2</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode2</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain2</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain2</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain2</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant2</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw2</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq3</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr3</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode3</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode3</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode3</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain3</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain3</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain3</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant3</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw3</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq4</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr4</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode4</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode4</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode4</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain4</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain4</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain4</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant4</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw4</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq5</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr5</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode5</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode5</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode5</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain5</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain5</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain5</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant5</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw5</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq6</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr6</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode6</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode6</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode6</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain6</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain6</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain6</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant6</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw6</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq7</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr7</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode7</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode7</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode7</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain7</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain7</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain7</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant7</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw7</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq8</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr8</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode8</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode8</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode8</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain8</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain8</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain8</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant8</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw8</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq9</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr9</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode9</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode9</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode9</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain9</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain9</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain9</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant9</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw9</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq10</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr10</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode10</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode10</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode10</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain10</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain10</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain10</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant10</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw10</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq11</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr11</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode11</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode11</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode11</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain11</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain11</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain11</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant11</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw11</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq12</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr12</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode12</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode12</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode12</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain12</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain12</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain12</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant12</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw12</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq13</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr13</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode13</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode13</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode13</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain13</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain13</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain13</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant13</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw13</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq14</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr14</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode14</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode14</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode14</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain14</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain14</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain14</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant14</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw14</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq15</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr15</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode15</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode15</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode15</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain15</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain15</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain15</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant15</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw15</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq16</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr16</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode16</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode16</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode16</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain16</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain16</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain16</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant16</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw16</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq17</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr17</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode17</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode17</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode17</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain17</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain17</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain17</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant17</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw17</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq18</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr18</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode18</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode18</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode18</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain18</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain18</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain18</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant18</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw18</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq19</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr19</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode19</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode19</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode19</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain19</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain19</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain19</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant19</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw19</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq20</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr20</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode20</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode20</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode20</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain20</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain20</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain20</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant20</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw20</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq21</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr21</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode21</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode21</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode21</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain21</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain21</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain21</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant21</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw21</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq22</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr22</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode22</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode22</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode22</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain22</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain22</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain22</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant22</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw22</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq23</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr23</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode23</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode23</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode23</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain23</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain23</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain23</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant23</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw23</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq24</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr24</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode24</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode24</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode24</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain24</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain24</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain24</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant24</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw24</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq25</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr25</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode25</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode25</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode25</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain25</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain25</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain25</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant25</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw25</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq26</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr26</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode26</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode26</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode26</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain26</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain26</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain26</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant26</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw26</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq27</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr27</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode27</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode27</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode27</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain27</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain27</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain27</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant27</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw27</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq28</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr28</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode28</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode28</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode28</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain28</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain28</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain28</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant28</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw28</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq29</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr29</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode29</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode29</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode29</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain29</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain29</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain29</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant29</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw29</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq30</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr30</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode30</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode30</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode30</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain30</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain30</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain30</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant30</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw30</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>freq31</key>
-      <value>100e6</value>
-    </param>
-    <param>
-      <key>corr31</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>dc_offset_mode31</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>iq_balance_mode31</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>gain_mode31</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>gain31</key>
-      <value>10</value>
-    </param>
-    <param>
-      <key>if_gain31</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>bb_gain31</key>
-      <value>20</value>
-    </param>
-    <param>
-      <key>ant31</key>
-      <value></value>
-    </param>
-    <param>
-      <key>bw31</key>
-      <value>0</value>
-    </param>
+  </block>
+  <block>
+    <key>parameter</key>
     <param>
       <key>alias</key>
       <value></value>
     </param>
     <param>
-      <key>affinity</key>
+      <key>comment</key>
       <value></value>
     </param>
     <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
+      <key>_enabled</key>
+      <value>True</value>
     </param>
     <param>
       <key>_coordinate</key>
-      <value>(-2, 363)</value>
+      <value>(16, 115)</value>
     </param>
     <param>
       <key>_rotation</key>
       <value>0</value>
     </param>
+    <param>
+      <key>id</key>
+      <value>samp_rate</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>samp_rate</value>
+    </param>
+    <param>
+      <key>short_id</key>
+      <value>s</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>eng_float</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>2000000.052982</value>
+    </param>
+  </block>
+  <block>
+    <key>parameter</key>
+    <param>
+      <key>alias</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(784, 11)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>shiftoff</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>shiftoff</value>
+    </param>
+    <param>
+      <key>short_id</key>
+      <value>o</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>eng_float</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>400e3</value>
+    </param>
   </block>
   <connection>
-    <source_block_id>rtlsdr_source_0</source_block_id>
-    <sink_block_id>low_pass_filter_0</sink_block_id>
+    <source_block_id>blocks_rotator_cc_0</source_block_id>
+    <sink_block_id>gsm_input_0</sink_block_id>
     <source_key>0</source_key>
     <sink_key>0</sink_key>
   </connection>
   <connection>
-    <source_block_id>fractional_resampler_xx_0</source_block_id>
-    <sink_block_id>gsm_fcch_detector_0</sink_block_id>
-    <source_key>0</source_key>
-    <sink_key>0</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>low_pass_filter_0</source_block_id>
-    <sink_block_id>fractional_resampler_xx_0</sink_block_id>
-    <source_key>0</source_key>
-    <sink_key>0</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>rtlsdr_source_0</source_block_id>
+    <source_block_id>blocks_rotator_cc_0</source_block_id>
     <sink_block_id>qtgui_freq_sink_x_0</sink_block_id>
     <source_key>0</source_key>
     <sink_key>0</sink_key>
   </connection>
   <connection>
-    <source_block_id>gsm_fcch_detector_0</source_block_id>
-    <sink_block_id>gsm_sch_detector_0</sink_block_id>
+    <source_block_id>gsm_bcch_ccch_demapper_0</source_block_id>
+    <sink_block_id>gsm_control_channels_decoder_0</sink_block_id>
+    <source_key>bursts</source_key>
+    <sink_key>bursts</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>gsm_clock_offset_control_0</source_block_id>
+    <sink_block_id>gsm_input_0</sink_block_id>
+    <source_key>ppm</source_key>
+    <sink_key>ppm_in</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>gsm_control_channels_decoder_0</source_block_id>
+    <sink_block_id>blocks_socket_pdu_0</sink_block_id>
+    <source_key>msgs</source_key>
+    <sink_key>pdus</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>gsm_control_channels_decoder_0</source_block_id>
+    <sink_block_id>gsm_message_printer_1</sink_block_id>
+    <source_key>msgs</source_key>
+    <sink_key>msgs</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>gsm_control_channels_decoder_0_0</source_block_id>
+    <sink_block_id>blocks_socket_pdu_0</sink_block_id>
+    <source_key>msgs</source_key>
+    <sink_key>pdus</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>gsm_control_channels_decoder_0_0</source_block_id>
+    <sink_block_id>gsm_message_printer_1</sink_block_id>
+    <source_key>msgs</source_key>
+    <sink_key>msgs</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>gsm_decryption_0</source_block_id>
+    <sink_block_id>gsm_control_channels_decoder_0_0</sink_block_id>
+    <source_key>bursts</source_key>
+    <sink_key>bursts</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>gsm_input_0</source_block_id>
+    <sink_block_id>gsm_receiver_0</sink_block_id>
     <source_key>0</source_key>
     <sink_key>0</sink_key>
   </connection>
   <connection>
-    <source_block_id>gsm_fcch_detector_0</source_block_id>
-    <sink_block_id>blocks_complex_to_mag_0_0</sink_block_id>
-    <source_key>0</source_key>
-    <sink_key>0</sink_key>
+    <source_block_id>gsm_receiver_0</source_block_id>
+    <sink_block_id>gsm_bcch_ccch_demapper_0</sink_block_id>
+    <source_key>C0</source_key>
+    <sink_key>bursts</sink_key>
   </connection>
   <connection>
-    <source_block_id>blocks_complex_to_mag_0_0</source_block_id>
-    <sink_block_id>qtgui_time_sink_x_0</sink_block_id>
-    <source_key>0</source_key>
-    <sink_key>1</sink_key>
+    <source_block_id>gsm_receiver_0</source_block_id>
+    <sink_block_id>gsm_sdcch8_demapper_0</sink_block_id>
+    <source_key>C0</source_key>
+    <sink_key>bursts</sink_key>
   </connection>
   <connection>
-    <source_block_id>gsm_sch_detector_0</source_block_id>
-    <sink_block_id>blocks_complex_to_mag_0</sink_block_id>
-    <source_key>0</source_key>
-    <sink_key>0</sink_key>
+    <source_block_id>gsm_receiver_0</source_block_id>
+    <sink_block_id>gsm_clock_offset_control_0</sink_block_id>
+    <source_key>measurements</source_key>
+    <sink_key>measurements</sink_key>
   </connection>
   <connection>
-    <source_block_id>blocks_complex_to_mag_0</source_block_id>
-    <sink_block_id>qtgui_time_sink_x_0</sink_block_id>
+    <source_block_id>gsm_sdcch8_demapper_0</source_block_id>
+    <sink_block_id>gsm_decryption_0</sink_block_id>
+    <source_key>bursts</source_key>
+    <sink_key>bursts</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>rtlsdr_source_0</source_block_id>
+    <sink_block_id>blocks_rotator_cc_0</sink_block_id>
     <source_key>0</source_key>
     <sink_key>0</sink_key>
   </connection>
 </flow_graph>
-
diff --git a/apps/grgsm_scanner b/apps/grgsm_scanner
new file mode 100755
index 0000000..94bba43
--- /dev/null
+++ b/apps/grgsm_scanner
@@ -0,0 +1,399 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# @file
+# @author Piotr Krysik <ptrkrysik@gmail.com>
+# @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 gr
+from gnuradio import eng_notation
+from gnuradio.eng_option import eng_option
+from gnuradio.filter import firdes
+from gnuradio.filter import pfb
+from math import pi
+from optparse import OptionParser
+
+import grgsm
+import numpy
+import os
+import osmosdr
+import pmt
+import time
+
+
+#from wideband_receiver import *
+
+class receiver_with_decoder(grgsm.hier_block):
+
+    def __init__(self, OSR=4, chan_num=0, fc=939.4e6, ppm=0, samp_rate=0.2e6):
+        grgsm.hier_block.__init__(
+            self, "Receiver With Decoder",
+            gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
+            gr.io_signature(0, 0, 0),
+        )
+        self.message_port_register_hier_out("bursts")
+        self.message_port_register_hier_out("msgs")
+
+        ##################################################
+        # Parameters
+        ##################################################
+        self.OSR = OSR
+        self.chan_num = chan_num
+        self.fc = fc
+        self.ppm = ppm
+        self.samp_rate = samp_rate
+
+        ##################################################
+        # Variables
+        ##################################################
+        self.samp_rate_out = samp_rate_out = 1625000.0/6.0*OSR
+
+        ##################################################
+        # Blocks
+        ##################################################
+        self.gsm_receiver_0 = grgsm.receiver(OSR, ([chan_num]), ([]))
+        self.gsm_input_0 = grgsm.gsm_input(
+            ppm=ppm,
+            osr=OSR,
+            fc=fc,
+            samp_rate_in=samp_rate,
+        )
+        self.gsm_control_channels_decoder_0 = grgsm.control_channels_decoder()
+        self.gsm_clock_offset_control_0 = grgsm.clock_offset_control(fc)
+        self.gsm_bcch_ccch_demapper_0 = grgsm.universal_ctrl_chans_demapper(0, ([2,6,12,16,22,26,32,36,42,46]), ([1,2,2,2,2,2,2,2,2,2]))
+
+        ##################################################
+        # Connections
+        ##################################################
+        self.msg_connect(self.gsm_bcch_ccch_demapper_0, 'bursts', self, 'bursts')
+        self.msg_connect(self.gsm_bcch_ccch_demapper_0, 'bursts', self.gsm_control_channels_decoder_0, 'bursts')
+        self.msg_connect(self.gsm_clock_offset_control_0, 'ppm', self.gsm_input_0, 'ppm_in')
+        self.msg_connect(self.gsm_control_channels_decoder_0, 'msgs', self, 'msgs')
+        self.msg_connect(self.gsm_receiver_0, 'C0', self.gsm_bcch_ccch_demapper_0, 'bursts')
+        self.msg_connect(self.gsm_receiver_0, 'measurements', self.gsm_clock_offset_control_0, 'measurements')
+        self.connect((self.gsm_input_0, 0), (self.gsm_receiver_0, 0))    
+        self.connect((self, 0), (self.gsm_input_0, 0))    
+
+
+    def get_OSR(self):
+        return self.OSR
+
+    def set_OSR(self, OSR):
+        self.OSR = OSR
+        self.set_samp_rate_out(1625000.0/6.0*self.OSR)
+        self.gsm_input_0.set_osr(self.OSR)
+
+    def get_chan_num(self):
+        return self.chan_num
+
+    def set_chan_num(self, chan_num):
+        self.chan_num = chan_num
+
+    def get_fc(self):
+        return self.fc
+
+    def set_fc(self, fc):
+        self.fc = fc
+        self.gsm_input_0.set_fc(self.fc)
+
+    def get_ppm(self):
+        return self.ppm
+
+    def set_ppm(self, ppm):
+        self.ppm = ppm
+        self.gsm_input_0.set_ppm(self.ppm)
+
+    def get_samp_rate(self):
+        return self.samp_rate
+
+    def set_samp_rate(self, samp_rate):
+        self.samp_rate = samp_rate
+        self.gsm_input_0.set_samp_rate_in(self.samp_rate)
+
+    def get_samp_rate_out(self):
+        return self.samp_rate_out
+
+    def set_samp_rate_out(self, samp_rate_out):
+        self.samp_rate_out = samp_rate_out
+
+
+class wideband_receiver(grgsm.hier_block):
+
+    def __init__(self, OSR=4, fc=939.4e6, samp_rate=0.4e6):
+        grgsm.hier_block.__init__(
+            self, "Wideband receiver",
+            gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
+            gr.io_signature(0, 0, 0),
+        )
+        self.message_port_register_hier_out("bursts")
+        self.message_port_register_hier_out("msgs")
+        self.__init(OSR, fc, samp_rate)
+    
+    def __init(self, OSR=4, fc=939.4e6, samp_rate=0.4e6):
+        ##################################################
+        # Parameters
+        ##################################################
+        self.OSR = OSR
+        self.fc = fc
+        self.samp_rate = samp_rate
+        self.channels_num = int(samp_rate/0.2e6)
+        self.OSR_PFB = 2
+        
+        ##################################################
+        # Blocks
+        ##################################################
+        self.pfb_channelizer_ccf_0 = pfb.channelizer_ccf(
+            self.channels_num,
+            (),
+            self.OSR_PFB,
+            100)
+        self.pfb_channelizer_ccf_0.set_channel_map(([]))
+        self.create_receivers()
+
+        ##################################################
+        # Connections
+        ##################################################
+        self.connect((self, 0), (self.pfb_channelizer_ccf_0, 0))
+        for chan in xrange(0,self.channels_num):
+            self.connect((self.pfb_channelizer_ccf_0, chan), (self.receivers_with_decoders[chan], 0))
+            self.msg_connect(self.receivers_with_decoders[chan], 'bursts', self, 'bursts')
+            self.msg_connect(self.receivers_with_decoders[chan], 'msgs', self, 'msgs')
+
+    def create_receivers(self):
+        self.receivers_with_decoders = {}
+        for chan in xrange(0,self.channels_num):
+            self.receivers_with_decoders[chan] = receiver_with_decoder(fc=self.fc, OSR=self.OSR, chan_num=chan, samp_rate=self.OSR_PFB*0.2e6)
+
+    def get_OSR(self):
+        return self.OSR
+
+    def set_OSR(self, OSR):
+        self.OSR = OSR
+        self.create_receivers()
+
+    def get_fc(self):
+        return self.fc
+
+    def set_fc(self, fc):
+        self.fc = fc
+        self.create_receivers()
+
+    def get_samp_rate(self):
+        return self.samp_rate
+
+
+class wideband_scanner(gr.top_block):
+    
+    def __init__(self, rec_len=3, sample_rate=2e6, carrier_frequency=939e6, ppm=0, args=""):
+        
+        gr.top_block.__init__(self, "Wideband Scanner")
+        
+        self.rec_len = rec_len
+        self.sample_rate = sample_rate
+        self.carrier_frequency = carrier_frequency
+        self.ppm = ppm
+        
+        # if no file name is given process data from rtl_sdr source
+        print "Args=",args
+        self.rtlsdr_source = osmosdr.source( args="numchan=" + str(1) + " " + args )
+        
+        self.rtlsdr_source.set_sample_rate(sample_rate)
+        
+        # capture half of GSM channel lower than channel center (-0.1MHz)
+        # this is needed when even number of channels is captured in order to process full captured bandwidth
+        
+        self.rtlsdr_source.set_center_freq(carrier_frequency - 0.1e6, 0)
+        
+        # correction of central frequency
+        # if the receiver has large frequency offset 
+        # the value of this variable should be set close to that offset in ppm
+        self.rtlsdr_source.set_freq_corr(options.ppm, 0)
+        
+        self.rtlsdr_source.set_dc_offset_mode(2, 0)
+        self.rtlsdr_source.set_iq_balance_mode(0, 0)
+        self.rtlsdr_source.set_gain_mode(True, 0)
+        self.rtlsdr_source.set_bandwidth(sample_rate, 0)
+    
+        self.head = blocks.head(gr.sizeof_gr_complex * 1, int(rec_len * sample_rate))
+        
+        # shift again by -0.1MHz in order to align channel center in 0Hz
+        self.blocks_rotator_cc = blocks.rotator_cc(-2 * pi * 0.1e6 / options.samp_rate) 
+               
+        self.wideband_receiver = wideband_receiver(OSR=4, fc=carrier_frequency, samp_rate=sample_rate)
+        self.gsm_extract_system_info = grgsm.extract_system_info()
+        
+        
+        self.connect((self.rtlsdr_source, 0), (self.head, 0))
+        self.connect((self.head, 0), (self.blocks_rotator_cc, 0))
+        self.connect((self.blocks_rotator_cc, 0), (self.wideband_receiver,0))
+        self.msg_connect(self.wideband_receiver, 'msgs', self.gsm_extract_system_info, 'msgs')
+        
+    def set_carrier_frequency(self, carrier_frequency):
+        self.carrier_frequency = carrier_frequency
+        self.rtlsdr_source.set_center_freq(carrier_frequency - 0.1e6, 0)
+
+       
+        
+class channel_info(object):
+    
+    def __init__(self, arfcn, freq, cid, lac, mcc, mnc, ccch_conf, power, neighbours, cell_arfcns):
+        self.arfcn = arfcn
+        self.freq = freq
+        self.cid = cid
+        self.lac = lac
+        self.mcc = mcc
+        self.mnc = mnc
+        self.ccch_conf = ccch_conf
+        self.power = power
+        self.neighbours = neighbours
+        self.cell_arfcns = cell_arfcns
+                
+    def get_verbose_info(self):
+        i = "  |---- Configuration: %s\n" % self.get_ccch_conf()
+        i += "  |---- Cell ARFCNs: " + ", ".join(map(str, self.cell_arfcns)) + "\n"
+        i += "  |---- Neighbour Cells: " + ", ".join(map(str, self.neighbours)) + "\n"
+        return i
+        
+    def get_ccch_conf(self):
+        if self.ccch_conf == 0:
+            return "1 CCCH, not combined"
+        elif self.ccch_conf == 1:
+            return "1 CCCH, combined"
+        elif self.ccch_conf == 2:
+            return "2 CCCH, not combined"
+        elif self.ccch_conf == 4:
+            return "3 CCCH, not combined"
+        elif self.ccch_conf == 6:
+            return "4 CCCH, not combined"
+        else:
+            return "Unknown"
+        
+    def getKey(self):
+        return self.arfcn
+    
+    def __cmp__(self, other):
+        if hasattr(other, 'getKey'):
+            return self.getKey().__cmp__(other.getKey())
+        
+    def __repr__(self):
+        return "ARFCN: %4u, Freq: %6.1fM, CID: %5u, LAC: %5u, MCC: %3u, MNC: %3u, Pwr: %3i" % (self.arfcn, self.freq/1e6, self.cid, self.lac, self.mcc, self.mnc, self.power)
+            
+
+if __name__ == '__main__':
+    parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
+    bands_list = ", ".join(grgsm.arfcn.get_bands())
+    parser.add_option("-b", "--band", dest="band", default="P-GSM",
+                      help="Specify the GSM band for the frequency.\nAvailable bands are: " + bands_list)
+    parser.add_option("-s", "--samp-rate", dest="samp_rate", type="float", default=2e6,
+        help="Set sample rate [default=%default] - allowed values even_number*0.2e6")
+    parser.add_option("-p", "--ppm", dest="ppm", type="intx", default=0,
+        help="Set frequency correction in ppm [default=%default]")
+    parser.add_option("-g", "--gain", dest="gain", type="eng_float", default=24.0,
+        help="Set gain [default=%default]")
+    parser.add_option("", "--args", dest="args", type="string", default="",
+        help="Set device arguments [default=%default]")
+    parser.add_option("--speed", dest="speed", type="intx", default=4,
+        help="Scan speed [default=%default]. Value range 0-5.")
+    parser.add_option("-v", "--verbose", action="store_true", 
+                      help="If set, verbose information output is printed: ccch configuration, cell ARFCN's, neighbour ARFCN's")
+    
+    """
+        Dont forget: sudo sysctl kernel.shmmni=32000
+    """
+        
+    (options, args) = parser.parse_args()
+    
+    if options.band not in grgsm.arfcn.get_bands():
+        parser.error("Invalid GSM band\n")
+        
+    if options.speed < 0 or options.speed > 5:
+        parser.error("Invalid scan speed.\n")
+        
+    if (options.samp_rate / 0.2e6) % 2 != 0:
+        parser.error("Invalid sample rate. Sample rate must be an even numer * 0.2e6")
+        
+    channels_num = int(options.samp_rate/0.2e6)
+    
+    first_arfcn = grgsm.arfcn.get_first_arfcn(options.band)
+    last_arfcn = grgsm.arfcn.get_last_arfcn(options.band)
+    last_center_arfcn = last_arfcn - int((channels_num / 2) - 1)
+        
+    current_freq = grgsm.arfcn.arfcn2downlink(first_arfcn + int(channels_num / 2) - 1, options.band)
+    last_freq = grgsm.arfcn.arfcn2downlink(last_center_arfcn, options.band)
+    stop_freq = last_freq + 0.2e6 * channels_num
+    
+    while current_freq < stop_freq:
+        
+        # silence rtl_sdr output:
+        # open 2 fds
+        null_fds = [os.open(os.devnull, os.O_RDWR) for x in xrange(2)]
+        # save the current file descriptors to a tuple
+        save = os.dup(1), os.dup(2)
+        # put /dev/null fds on 1 and 2
+        os.dup2(null_fds[0], 1)
+        os.dup2(null_fds[1], 2)
+        
+        # instantiate scanner and processor
+        scanner = wideband_scanner(rec_len=6-options.speed, 
+                            sample_rate=options.samp_rate, 
+                            carrier_frequency=current_freq, 
+                            ppm=options.ppm, args=options.args)
+
+        # start recording
+        scanner.start()
+        scanner.wait()
+        scanner.stop()
+        
+        # restore file descriptors so we can print the results
+        os.dup2(save[0], 1)
+        os.dup2(save[1], 2)
+        # close the temporary fds
+        os.close(null_fds[0])
+        os.close(null_fds[1])
+        
+        freq_offsets = numpy.fft.ifftshift(numpy.array(range(int(-numpy.floor(channels_num/2)),int(numpy.floor((channels_num+1)/2))))*2e5)
+        detected_c0_channels = scanner.gsm_extract_system_info.get_chans()
+                
+        if detected_c0_channels:
+            chans = numpy.array(scanner.gsm_extract_system_info.get_chans())
+            found_freqs = current_freq + freq_offsets[(chans)]
+            
+            cell_ids = numpy.array(scanner.gsm_extract_system_info.get_cell_id())
+            lacs = numpy.array(scanner.gsm_extract_system_info.get_lac())
+            mccs = numpy.array(scanner.gsm_extract_system_info.get_mcc())
+            mncs = numpy.array(scanner.gsm_extract_system_info.get_mnc())
+            ccch_confs = numpy.array(scanner.gsm_extract_system_info.get_ccch_conf())
+            powers = numpy.array(scanner.gsm_extract_system_info.get_pwrs())
+                        
+            found_list = []
+            for i in range(0, len(chans)):
+                cell_arfcn_list = scanner.gsm_extract_system_info.get_cell_arfcns(chans[i])
+                neighbour_list = scanner.gsm_extract_system_info.get_neighbours(chans[i])
+
+                info = channel_info(grgsm.arfcn.downlink2arfcn(found_freqs[i], options.band), found_freqs[i], cell_ids[i], lacs[i], mccs[i], mncs[i], ccch_confs[i], powers[i], neighbour_list, cell_arfcn_list)
+                found_list.append(info)
+                            
+            for info in sorted(found_list):
+                print info
+                if options.verbose:
+                    print info.get_verbose_info()
+            
+        scanner = None
+        current_freq += channels_num * 0.2e6
diff --git a/apps/helpers/CMakeLists.txt b/apps/helpers/CMakeLists.txt
new file mode 100644
index 0000000..4418ed7
--- /dev/null
+++ b/apps/helpers/CMakeLists.txt
@@ -0,0 +1,39 @@
+# Copyright 2011 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio 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.
+#
+# GNU Radio 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 GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+
+include(GrPython)
+include(CreateSymlink)
+
+GR_PYTHON_INSTALL(
+    PROGRAMS
+    grgsm_capture.py
+    grgsm_channelize.py
+    DESTINATION bin
+)
+
+CREATE_SYMLINK(grgsm_capture.py airprobe_rtlsdr_capture.py)
+
+add_custom_target(helpers_symlinks ALL DEPENDS ${symlinks})
+
+install(
+    PROGRAMS
+    ${symlinks}
+    DESTINATION bin
+)
+
diff --git a/apps/helpers/README b/apps/helpers/README
new file mode 100644
index 0000000..752aaa8
--- /dev/null
+++ b/apps/helpers/README
@@ -0,0 +1,5 @@
+Helper programs for grgsm_decode:
+
+-grgsm_capture    (old name: airprobe_rtlsdr_capture.py) - program for capturing GSM signal to a file that can be later processed by grgsm_decode,
+
+-grgsm_channelize (old name: gsm_channelize.py) - splits wideband capture file into multiple files - each contain single GSM channel,
diff --git a/apps/helpers/grgsm_capture.py b/apps/helpers/grgsm_capture.py
new file mode 100755
index 0000000..51c13ac
--- /dev/null
+++ b/apps/helpers/grgsm_capture.py
@@ -0,0 +1,274 @@
+#!/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 gnuradio.filter import firdes
+from math import pi
+from optparse import OptionParser
+
+import grgsm
+import osmosdr
+import pmt
+import signal
+import sys
+
+
+class grgsm_capture(gr.top_block):
+
+    def __init__(self, fc, gain, samp_rate, ppm, arfcn, cfile=None, burst_file=None, band=None, verbose=False, rec_length=None, args=""):
+
+        gr.top_block.__init__(self, "Gr-gsm Capture")
+                
+        ##################################################
+        # Parameters
+        ##################################################
+        self.fc = fc
+        self.gain = gain
+        self.samp_rate = samp_rate
+        self.ppm = ppm
+        self.arfcn = arfcn
+        self.cfile = cfile
+        self.burst_file = burst_file
+        self.band = band
+        self.verbose = verbose
+        self.shiftoff = shiftoff = 400e3
+        self.rec_length = rec_length
+        
+        ##################################################
+        # Processing Blocks
+        ##################################################
+
+        self.rtlsdr_source = osmosdr.source( args="numchan=" + str(1) + " " + args )
+        self.rtlsdr_source.set_sample_rate(samp_rate)
+        self.rtlsdr_source.set_center_freq(fc - shiftoff, 0)
+        self.rtlsdr_source.set_freq_corr(ppm, 0)
+        self.rtlsdr_source.set_dc_offset_mode(2, 0)
+        self.rtlsdr_source.set_iq_balance_mode(2, 0)
+        self.rtlsdr_source.set_gain_mode(True, 0)
+        self.rtlsdr_source.set_gain(gain, 0)
+        self.rtlsdr_source.set_if_gain(20, 0)
+        self.rtlsdr_source.set_bb_gain(20, 0)
+        self.rtlsdr_source.set_antenna("", 0)
+        self.rtlsdr_source.set_bandwidth(250e3+abs(shiftoff), 0)
+        self.blocks_rotator = blocks.rotator_cc(-2*pi*shiftoff/samp_rate)
+        
+        if self.rec_length is not None:
+            self.blocks_head_0 = blocks.head(gr.sizeof_gr_complex, int(samp_rate*rec_length))
+        
+        if self.verbose or self.burst_file:
+            self.gsm_receiver = grgsm.receiver(4, ([self.arfcn]), ([]))
+            self.gsm_input = grgsm.gsm_input(
+                ppm=0,
+                osr=4,
+                fc=fc,
+                samp_rate_in=samp_rate,
+            )
+            self.gsm_clock_offset_control = grgsm.clock_offset_control(fc-shiftoff)
+
+        if self.burst_file:
+            self.gsm_burst_file_sink = grgsm.burst_file_sink(self.burst_file)
+
+        if self.cfile:
+            self.blocks_file_sink = blocks.file_sink(gr.sizeof_gr_complex*1, self.cfile, False)
+            self.blocks_file_sink.set_unbuffered(False)
+
+        if self.verbose:
+            self.gsm_bursts_printer_0 = grgsm.bursts_printer(pmt.intern(""),
+                                                             False, False, False, False)
+
+        ##################################################
+        # Connections
+        ##################################################
+
+        if self.rec_length is not None: #if recording length is defined connect head block after the source
+            self.connect((self.rtlsdr_source, 0), (self.blocks_head_0, 0))
+            self.connect((self.blocks_head_0, 0), (self.blocks_rotator, 0))
+        else:
+            self.connect((self.rtlsdr_source, 0), (self.blocks_rotator, 0))
+
+        if self.cfile:
+            self.connect((self.blocks_rotator, 0), (self.blocks_file_sink, 0))
+
+        if self.verbose or self.burst_file:
+            self.connect((self.gsm_input, 0), (self.gsm_receiver, 0))
+            self.connect((self.blocks_rotator, 0), (self.gsm_input, 0))
+            self.msg_connect(self.gsm_clock_offset_control, "ppm", self.gsm_input, "ppm_in")
+            self.msg_connect(self.gsm_receiver, "measurements", self.gsm_clock_offset_control, "measurements")
+
+            if self.burst_file:
+                self.msg_connect(self.gsm_receiver, "C0", self.gsm_burst_file_sink, "in")
+            if self.verbose:
+                self.msg_connect(self.gsm_receiver, "C0", self.gsm_bursts_printer_0, "bursts")
+
+    def get_fc(self):
+        return self.fc
+
+    def set_fc(self, fc):
+        self.fc = fc
+        if self.verbose or self.burst_file:
+            self.gsm_input.set_fc(self.fc)
+            
+    def get_arfcn(self):
+        return self.arfcn
+
+    def set_arfcn(self, arfcn):
+        self.arfcn = arfcn
+        if self.verbose or self.burst_file:
+            self.gsm_receiver.set_cell_allocation([self.arfcn])
+            if options.band:
+                new_freq = grgsm.arfcn.arfcn2downlink(self.arfcn, self.band)
+            else:
+                for band in grgsm.arfcn.get_bands():
+                    if grgsm.arfcn.is_valid_arfcn(arfcn, band):
+                        new_freq = grgsm.arfcn.arfcn2downlink(arfcn, band)
+                        break
+            self.set_fc(new_freq)
+
+    def get_gain(self):
+        return self.gain
+
+    def set_gain(self, gain):
+        self.gain = gain
+
+    def get_samp_rate(self):
+        return self.samp_rate
+
+    def set_samp_rate(self, samp_rate):
+        self.samp_rate = samp_rate
+        self.rtlsdr_source.set_sample_rate(self.samp_rate)
+        if self.verbose or self.burst_file:
+            self.gsm_input.set_samp_rate_in(self.samp_rate)
+
+    def get_ppm(self):
+        return self.ppm
+
+    def set_ppm(self, ppm):
+        self.ppm = ppm
+        self.set_ppm_slider(self.ppm)
+
+    def get_rec_length(self):
+        return self.rec_length
+
+    def set_rec_length(self, rec_length):
+        self.rec_length = rec_length
+        self.blocks_head_0.set_length(int(self.samp_rate*self.rec_length))
+
+
+if __name__ == '__main__':
+
+    parser = OptionParser(option_class=eng_option, usage="%prog [options]",
+                          description="RTL-SDR capturing app of gr-gsm.")
+
+    parser.add_option("-f", "--fc", dest="fc", type="eng_float", 
+                      help="Set frequency [default=%default]")
+    
+    parser.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")
+    
+    parser.add_option("-g", "--gain", dest="gain", type="eng_float", 
+                      default=eng_notation.num_to_str(30),
+                      help="Set gain [default=%default]")
+    
+    parser.add_option("-s", "--samp-rate", dest="samp_rate", type="eng_float", 
+                      default=eng_notation.num_to_str(2000000),
+                      help="Set samp_rate [default=%default]")
+    
+    parser.add_option("-p", "--ppm", dest="ppm", type="intx", default=0,
+                      help="Set ppm [default=%default]")
+    
+    parser.add_option("-b", "--burst-file", dest="burst_file", 
+                      help="File where the captured bursts are saved")
+    
+    parser.add_option("-c", "--cfile", dest="cfile", 
+                      help="File where the captured data are saved")
+    
+    bands_list = ", ".join(grgsm.arfcn.get_bands())
+    parser.add_option("--band", dest="band", 
+                      help="Specify the GSM band for the frequency.\nAvailable bands are: " + bands_list + ".\nIf no band is specified, it will be determined automatically, defaulting to 0." )
+    
+    parser.add_option("", "--args", dest="args", type="string", default="",
+        help="Set device arguments [default=%default]")
+
+    parser.add_option("-v", "--verbose", action="store_true", 
+                      help="If set, the captured bursts are printed to stdout")
+
+    parser.add_option("-T", "--rec-length", dest="rec_length", type="eng_float",
+        help="Set length of recording in seconds [default=%default]")
+
+    (options, args) = parser.parse_args()
+    
+    if options.cfile is None and options.burst_file is None:
+        parser.error("Please provide a cfile or a burst file (or both) to save the captured data\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")
+        
+    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
+     
+    tb = grgsm_capture(fc=fc, gain=options.gain, samp_rate=options.samp_rate,
+                         ppm=options.ppm, arfcn=arfcn, cfile=options.cfile, 
+                         burst_file=options.burst_file, band=options.band, verbose=options.verbose,
+                         rec_length=options.rec_length, args=options.args)
+    
+    def signal_handler(signal, frame):
+        tb.stop()
+        tb.wait()        
+        sys.exit(0)
+        
+    signal.signal(signal.SIGINT, signal_handler)
+
+    tb.start()
+    tb.wait()
diff --git a/apps/helpers/grgsm_channelize.py b/apps/helpers/grgsm_channelize.py
new file mode 100755
index 0000000..146bb8f
--- /dev/null
+++ b/apps/helpers/grgsm_channelize.py
@@ -0,0 +1,168 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+# @file
+# @author Pieter Robyns <pieter.robyns@uhasselt.be>
+# @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.
+#
+#
+
+##################################################
+# gr-gsm channelizer
+#
+# Standalone application to channelize a wideband
+# GSM capture file into multiple seperate capture
+# files for the specified ARFCNs.
+##################################################
+
+from gnuradio import blocks
+from gnuradio import eng_notation
+from gnuradio import filter
+from gnuradio import gr
+from gnuradio.eng_option import eng_option
+from gnuradio.filter import firdes
+from argparse import ArgumentParser, ArgumentTypeError, RawDescriptionHelpFormatter
+import grgsm.arfcn as arfcn
+from gnuradio.filter import pfb
+import math
+import os
+
+EXTRA_HELP = """
+Example usage:
+grgsm_channelize.py -c my_wideband_capture.cfile -f 925.2e6 990 991 992 993 994 995 1019 1020 1021 1022 1023
+
+The above example will channelize my_wideband_capture.cfile, in this case a cfile captured at
+925.2 MHz centered (ARFCN 975) and 2 Msps. As a result, 12 files will be generated for
+ARFCNs 975 - 1023 at 1 Msps each.
+"""
+
+def eng_float(value):
+    try:
+        return eng_notation.str_to_num(value)
+    except:
+        raise ArgumentTypeError("invalid engineering notation value: {0}".format(value))
+
+def gsm_band(value):
+    choices = arfcn.get_bands()
+    if value in choices:
+        return value
+    else:
+        raise ArgumentTypeError("invalid GSM band: {0}. Possible choices are: {1}".format(value, choices))
+
+class grgsm_channelize(gr.top_block):
+    def __init__(self, channels, resamp_rate, fc, band, samp_rate, input_file, dest_dir, data_type="complex"):
+        gr.top_block.__init__(self, "grgsm_channelize")
+
+        ##################################################
+        # Parameters
+        ##################################################
+        self.channels = channels
+        self.resamp_rate = resamp_rate
+        self.fc = fc
+        self.band = band
+        self.samp_rate = samp_rate
+        self.blocks_resamplers = {}
+        self.blocks_rotators = {}
+        self.blocks_file_sinks = {}
+        
+        ##################################################
+        # Blocks and connections
+        ##################################################
+        self.source = None
+        if data_type == "ishort":
+            self.blocks_file_source = blocks.file_source(gr.sizeof_short, input_file, False)
+            self.source = blocks.interleaved_short_to_complex(False, False)
+            self.connect((self.blocks_file_source, 0), (self.source, 0))
+        elif data_type == "complex":
+            self.source = blocks.file_source(gr.sizeof_gr_complex, input_file, False)
+
+        fc_str = eng_notation.num_to_str(fc)
+        print("Extracting channels %s, given that the center frequency is at %s" % (str(channels), eng_notation.num_to_str(fc)))
+
+        for channel in channels:
+            channel_freq = arfcn.arfcn2downlink(channel, band)
+            if channel_freq is None:
+                print("Warning: invalid ARFCN %d for band %s" % (channel, band))
+                continue
+            freq_diff = channel_freq - fc
+            freq_diff_str = "+" if 0 <= freq_diff else ""
+            freq_diff_str += eng_notation.num_to_str(freq_diff)
+            print("ARFCN %d is at %sHz %sHz" % (channel, fc_str, freq_diff_str))
+
+            self.blocks_resamplers[channel] = pfb.arb_resampler_ccf( resamp_rate, taps=None, flt_size=32)
+            self.blocks_rotators[channel] = blocks.rotator_cc(-2*math.pi*(freq_diff)/samp_rate)
+            self.connect( (self.source, 0), (self.blocks_rotators[channel], 0) )
+            self.connect( (self.blocks_rotators[channel], 0), (self.blocks_resamplers[channel], 0) )
+
+            self.blocks_file_sinks[channel] = blocks.file_sink(gr.sizeof_gr_complex, dest_dir+"/out_" + str(channel) + ".cfile", False)
+            self.blocks_file_sinks[channel].set_unbuffered(False)
+            self.connect((self.blocks_resamplers[channel], 0), (self.blocks_file_sinks[channel], 0))
+
+
+if __name__ == '__main__':
+    parser = ArgumentParser(formatter_class=RawDescriptionHelpFormatter, description='Split wideband a GSM capture into seperate files per ARFCN.', add_help=True, epilog=EXTRA_HELP)
+    parser.add_argument(dest="channel", type=int, nargs='+',
+        help="List of ARFCNs")
+    parser.add_argument("-s", "--samp-rate", dest="samp_rate", type=eng_float, default=eng_notation.num_to_str(2e6),
+        help="Sample rate of the wideband capture file [default=%(default)s]")
+    parser.add_argument("-f", "--fc", dest="fc", type=eng_float, default=eng_notation.num_to_str(935e6), required=True,
+        help="Carrier frequency in Hz [default=%(default)s]")
+    parser.add_argument("-b", "--band", dest="band", type=gsm_band, default='E-GSM',
+        help="GSM band [default=%(default)s]") #TODO: add automatic discovery based on fc
+    parser.add_argument("-o", "--out-samp-rate", dest="out_samp_rate", type=eng_float, default=eng_notation.num_to_str(1e6),
+        help="Sample rate of the output capture files [default=%(default)s]")
+    parser.add_argument("-i", "--input_file", dest="input_file", type=str, required=True,
+        help="Path to wideband GSM capture file")
+    parser.add_argument("-t", "--data_type", dest="data_type", type=str, choices=["complex","ishort"], default="complex",
+        help="Type of the input file [default=%(default)s]")
+    parser.add_argument("-d", "--dest_dir", dest="dest_dir", type=str, 
+        help="Destination directory - if not given defaults to input file name without extension")
+        
+    args = parser.parse_args()
+    
+    if not os.path.exists(args.input_file):
+        raise IOError(args.input_file + " does not exist")
+
+    input_filename, _ = os.path.splitext(os.path.basename(args.input_file))
+
+    if args.dest_dir is None:
+        args.dest_dir = input_filename
+    
+    if not os.path.exists("./"+args.dest_dir):
+        os.makedirs("./"+args.dest_dir)
+
+
+    if args.samp_rate % args.out_samp_rate != 0:
+        raise Exception("Input sample rate should be multiple of output sample rate in order to get integer decimation.")
+
+    resamp_rate = args.out_samp_rate / args.samp_rate
+    print("Input sample rate: " + eng_notation.num_to_str(args.samp_rate))
+    print("Output sample rate: " + eng_notation.num_to_str(args.out_samp_rate))
+    print("==> using resample rate of " + str(resamp_rate))
+
+    tb = grgsm_channelize(channels=args.channel,
+         resamp_rate=resamp_rate,
+         fc=args.fc,
+         band=args.band,
+         samp_rate=args.samp_rate,
+         input_file=args.input_file,
+         dest_dir=args.dest_dir,         
+         data_type=args.data_type
+         )
+    tb.start()
+    tb.wait()
+    print("Done!")
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..8383aaf
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+# First, get into the right directory
+THISPATH=$(dirname "$BASH_SOURCE")
+cd $THISPATH
+
+# Now, we check to see that the version env var is set
+${CPACK_PACKAGE_VERSION:?"Need to set CPACK_PACKAGE_VERSION env var!"}
+export $CPACK_DEBIAN_PACKAGE_ARCHITECTURE=`dpkg --print-architecture`
+
+# OK, now we get down to the business of building...
+rm -rf ./build
+mkdir build
+cd build
+cmake ..
+make package
+cpack -G DEB
+mv ./*.deb ../installer-packages
+echo "If you've gotten to this point, the package has been built"
+echo "and exists at "$THISPATH"/installer-packages"
+echo "Don't forget to add and commit the new package, and tag the commit!"
diff --git a/cmake/Modules/CreateSymlink.cmake b/cmake/Modules/CreateSymlink.cmake
new file mode 100644
index 0000000..574c443
--- /dev/null
+++ b/cmake/Modules/CreateSymlink.cmake
@@ -0,0 +1,10 @@
+#create logical links in order to keep legacy names of apps
+macro(CREATE_SYMLINK _source _dest)
+    set(source ${CMAKE_CURRENT_SOURCE_DIR}/${_source})
+    set(dest ${CMAKE_CURRENT_BINARY_DIR}/${_dest})
+    list(APPEND symlinks ${dest})
+    add_custom_command(
+        DEPENDS ${source} OUTPUT ${dest}
+        COMMAND ln -sf ${_source} ${_dest}
+    )
+endmacro(CREATE_SYMLINK)
diff --git a/cmake/Modules/FindSWIG.cmake b/cmake/Modules/FindSWIG.cmake
new file mode 100644
index 0000000..156bd5e
--- /dev/null
+++ b/cmake/Modules/FindSWIG.cmake
@@ -0,0 +1,141 @@
+#######################################################################
+# Find the library for SWIG
+#
+# The goal here is to intercept calls to "FIND_PACKAGE(SWIG)" in order
+# to do a global version check locally after passing on the "find" to
+# SWIG-provided scripts.
+########################################################################
+
+# make this file non-reentrant within the current context
+
+if(__INCLUDED_FIND_SWIG_CMAKE)
+    return()
+endif()
+set(__INCLUDED_FIND_SWIG_CMAKE TRUE)
+
+# some status messages
+
+message(STATUS "")
+message(STATUS "Checking for module SWIG")
+
+#
+# First check to see if SWIG installed its own CMake file, or if the
+# one provided by CMake finds SWIG.
+#
+
+# save the current MODULE path
+
+set(SAVED_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH})
+
+# clear the current MODULE path; uses system paths only
+
+unset(CMAKE_MODULE_PATH)
+
+# try to find SWIG via the provided parameters,
+# handle REQUIRED internally later
+
+unset(SWIG_FOUND)
+
+# was the version specified?
+
+unset(LOCAL_SWIG_FIND_VERSION)
+if(SWIG_FIND_VERSION)
+  set(LOCAL_SWIG_FIND_VERSION ${SWIG_FIND_VERSION})
+endif(SWIG_FIND_VERSION)
+
+# was EXACT specified?
+
+unset(LOCAL_SWIG_FIND_VERSION_EXACT)
+if(SWIG_FIND_VERSION_EXACT)
+  set(LOCAL_SWIG_FIND_VERSION_EXACT "EXACT")
+endif(SWIG_FIND_VERSION_EXACT)
+
+# was REQUIRED specified?
+
+unset(LOCAL_SWIG_FIND_REQUIRED)
+if(SWIG_FIND_REQUIRED)
+  set(LOCAL_SWIG_FIND_REQUIRED "REQUIRED")
+endif(SWIG_FIND_REQUIRED)
+
+# try to find SWIG using the provided parameters, quietly;
+#
+# this call will error out internally (and not quietly) if:
+# 1: EXACT is specified and the version found does not match the requested version;
+# 2: REQUIRED is set and SWIG was not found;
+#
+# this call will return SWIG_FOUND == FALSE if REQUIRED is not set, and:
+# 1: SWIG was not found;
+# 2: The version found is less than the requested version.
+
+find_package(
+  SWIG
+  ${LOCAL_SWIG_FIND_VERSION}
+  ${LOCAL_SWIG_FIND_VERSION_EXACT}
+  ${LOCAL_SWIG_FIND_REQUIRED}
+  QUIET
+)
+
+# restore CMAKE_MODULE_PATH
+
+set(CMAKE_MODULE_PATH ${SAVED_CMAKE_MODULE_PATH})
+
+# specific version checks
+
+set(SWIG_VERSION_CHECK FALSE)
+if(SWIG_FOUND)
+
+  # SWIG was found; make sure the version meets GR's needs
+  message(STATUS "Found SWIG version ${SWIG_VERSION}.")
+  if("${SWIG_VERSION}" VERSION_GREATER "1.3.30")
+    if(NOT "${SWIG_VERSION}" VERSION_EQUAL "3.0.3" AND
+       NOT "${SWIG_VERSION}" VERSION_EQUAL "3.0.4")
+      set(SWIG_VERSION_CHECK TRUE)
+    else()
+      message(STATUS "SWIG versions 3.0.3 and 3.0.4 fail to work with GNU Radio.")
+    endif()
+  else()
+    message(STATUS "Minimum SWIG version required is 1.3.31 for GNU Radio.")
+  endif()
+
+else()
+
+  # SWIG was either not found, or is less than the requested version
+  if(SWIG_VERSION)
+    # SWIG_VERSION is set, but SWIG_FOUND is false; probably a version mismatch
+    message(STATUS "Found SWIG version ${SWIG_VERSION}.")
+    message(STATUS "Requested SWIG version is at least ${SWIG_FIND_VERSION}.")
+  endif()
+endif()
+
+# did the version check fail?
+
+if(NOT SWIG_VERSION_CHECK)
+
+  # yes: clear various variables and set FOUND to FALSE
+  message(STATUS "Disabling SWIG because version check failed.")
+  unset(SWIG_VERSION CACHE)
+  unset(SWIG_DIR CACHE)
+  unset(SWIG_EXECUTABLE CACHE)
+  set(SWIG_FOUND FALSE CACHE BOOL "Set to TRUE if a compatible version of SWIG is found" FORCE)
+
+endif()
+
+# check to see if SWIG variables were set
+
+if(SWIG_FOUND AND SWIG_DIR AND SWIG_EXECUTABLE)
+
+  # yes: even if set SWIG_FOUND==TRUE, then these have already been
+  # done, but done quietly.  It does not hurt to redo them here.
+
+  include(FindPackageHandleStandardArgs)
+  find_package_handle_standard_args(SWIG DEFAULT_MSG SWIG_EXECUTABLE SWIG_DIR)
+  mark_as_advanced(SWIG_EXECUTABLE SWIG_DIR)
+
+elseif(SWIG_FIND_REQUIRED)
+
+  if(SWIG_FIND_VERSION)
+    message(FATAL_ERROR "The found SWIG version (${SWIG_VERSION}) is not compatible with the version required (${SWIG_FIND_VERSION}).")
+  else()
+    message(FATAL_ERROR "SWIG is required, but was not found.")
+  endif()
+endif()
diff --git a/cmake/Modules/GrMiscUtils.cmake b/cmake/Modules/GrMiscUtils.cmake
index 2be710c..04efa9e 100644
--- a/cmake/Modules/GrMiscUtils.cmake
+++ b/cmake/Modules/GrMiscUtils.cmake
@@ -259,37 +259,6 @@
 endfunction(GR_LOGGING)
 
 ########################################################################
-# Run GRCC to compile .grc files into .py files.
-#
-# Usage: GRCC(filename, directory)
-#    - filenames: List of file name of .grc file
-#    - directory: directory of built .py file - usually in
-#                 ${CMAKE_CURRENT_BINARY_DIR}
-#    - Sets PYFILES: output converted GRC file names to Python files.
-########################################################################
-function(GRCC)
-  # Extract directory from list of args, remove it for the list of filenames.
-  list(GET ARGV -1 directory)
-  list(REMOVE_AT ARGV -1)
-  set(filenames ${ARGV})
-  file(MAKE_DIRECTORY ${directory})
-
-  SET(GRCC_COMMAND ${PC_GNURADIO_RUNTIME_PREFIX}/${GR_RUNTIME_DIR}/grcc)
-
-  foreach(f ${filenames})
-    execute_process(
-      COMMAND ${GRCC_COMMAND} -d ${directory} "${CMAKE_CURRENT_SOURCE_DIR}/${f}"
-    )
-    string(REPLACE ".grc" ".py" pyfile ${f})
-    string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" pyfile "${pyfile}")
-    set(pyfile "${CMAKE_CURRENT_BINARY_DIR}/${pyfile}")
-    list(APPEND pyfiles ${pyfile})
-  endforeach(f)
-
-  set(PYFILES ${pyfiles} PARENT_SCOPE)
-endfunction(GRCC)
-
-########################################################################
 # Check if HAVE_PTHREAD_SETSCHEDPARAM and HAVE_SCHED_SETSCHEDULER
 #  should be defined
 ########################################################################
diff --git a/cmake/Modules/gr-gsmConfig.cmake b/cmake/Modules/gr-gsmConfig.cmake
index 7d5ea8e..f8a2fec 100644
--- a/cmake/Modules/gr-gsmConfig.cmake
+++ b/cmake/Modules/gr-gsmConfig.cmake
@@ -13,7 +13,7 @@
 
 FIND_LIBRARY(
     GR_GSM_LIBRARIES
-    NAMES gnuradio-gsm
+    NAMES grgsm
     HINTS $ENV{GR_GSM_DIR}/lib
         ${PC_GR_GSM_LIBDIR}
     PATHS ${CMAKE_INSTALL_PREFIX}/lib
diff --git a/debian/build-package b/debian/build-package
new file mode 100755
index 0000000..d0d822a
--- /dev/null
+++ b/debian/build-package
@@ -0,0 +1,8 @@
+#!/bin/bash
+cd ../..
+
+tar -acf gr-gsm_0.3.orig.tar.gz gr-gsm
+cd gr-gsm
+debuild -S -sa
+cd ..
+dput ppa:ptrkrysik/gr-gsm gr-gsm_0.3-0ppa0_source.changes
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..2f7a22b
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,5 @@
+gr-gsm (0.3-0ppa0) xenial; urgency=low
+
+  * Initial upload!
+
+ -- Piotr Krysik <ptrkrysik@gmail.com>  Sun, 24 Apr 2016 16:00:00 +0100
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..d4e5661
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,13 @@
+Source: gr-gsm
+Section: devel
+Priority: optional
+Maintainer: Your Name <your.email@some.where>
+Build-Depends: cmake, build-essential, python-scipy, gnuradio-dev, gr-osmosdr, libosmocore-dev
+
+Homepage: http://www.yourhomepage.org
+Package: gr-gsm
+Architecture: any
+Depends:  ${shlibs:Depends}, ${misc:Depends}, gnuradio, gr-osmosdr, python-scipy
+Description: First test-package
+ Long description of greet-the-world.
+ It can span multiple lines!
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..51af985
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,18 @@
+####################################################################
+#                    gr-gsm                                        #
+####################################################################
+
+Copyright (C) 2011 Your Name
+
+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 3 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, see <http://www.gnu.org/licenses/>.
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..6b44c5b
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,27 @@
+#!/usr/bin/make -f
+
+BUILDDIR = build
+
+# secondly called by launchpad
+build:
+	mkdir $(BUILDDIR);
+	cd $(BUILDDIR); cmake -DCMAKE_INSTALL_PREFIX=../debian/tmp/usr ..
+	make -C $(BUILDDIR)
+
+# thirdly called by launchpad
+binary: binary-indep binary-arch
+
+binary-indep:
+	# nothing to be done
+
+binary-arch:
+	cd $(BUILDDIR); cmake -P cmake_install.cmake
+	mkdir debian/tmp/DEBIAN
+	dpkg-gencontrol -pgr-gsm
+	dpkg --build debian/tmp ..
+
+# firstly called by launchpad
+clean:
+	rm -rf $(BUILDDIR)
+
+.PHONY: binary binary-arch binary-indep clean
diff --git a/examples b/examples
new file mode 160000
index 0000000..edcfbe2
--- /dev/null
+++ b/examples
@@ -0,0 +1 @@
+Subproject commit edcfbe2733a538b373d58a2b26ca245bb5e7a6fa
diff --git a/examples/.gitignore b/examples/.gitignore
deleted file mode 100644
index f104652..0000000
--- a/examples/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.py
diff --git a/examples/README b/examples/README
deleted file mode 100644
index 63b0185..0000000
--- a/examples/README
+++ /dev/null
@@ -1 +0,0 @@
-experimental_receiver_components_test.grc - a test of blocks being components for a new modular gsm receiver (fcch_detector, fcch_burst_tagger, sch_detector)
\ No newline at end of file
diff --git a/examples/airprobe_tchf.grc b/examples/airprobe_tchf.grc
deleted file mode 100644
index 3b0036d..0000000
--- a/examples/airprobe_tchf.grc
+++ /dev/null
@@ -1,1096 +0,0 @@
-<?xml version='1.0' encoding='ASCII'?>
-<?grc format='1' created='3.7.8'?>
-<flow_graph>
-  <timestamp>Sat Dec 13 10:46:37 2014</timestamp>
-  <block>
-    <key>options</key>
-    <param>
-      <key>author</key>
-      <value></value>
-    </param>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>category</key>
-      <value>Custom</value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>description</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(16, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>generate_options</key>
-      <value>no_gui</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>airprobe_tchf</value>
-    </param>
-    <param>
-      <key>max_nouts</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>realtime_scheduling</key>
-      <value></value>
-    </param>
-    <param>
-      <key>run_options</key>
-      <value>run</value>
-    </param>
-    <param>
-      <key>run</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>thread_safe_setters</key>
-      <value></value>
-    </param>
-    <param>
-      <key>title</key>
-      <value></value>
-    </param>
-    <param>
-      <key>window_size</key>
-      <value>1480, 1224</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(968, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>AGCH</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>4</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(752, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>BCCH</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>1</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(824, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>CCCH</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>2</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(608, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>CHANNEL_UNKNOWN</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1040, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>PCH</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>5</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(896, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>RACH</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>3</value>
-    </param>
-  </block>
-  <block>
-    <key>variable</key>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1112, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>SDCCH</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>6</value>
-    </param>
-  </block>
-  <block>
-    <key>blocks_file_source</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>file</key>
-      <value>input_file_name</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(16, 195)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>blocks_file_source_0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>complex</value>
-    </param>
-    <param>
-      <key>repeat</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>vlen</key>
-      <value>1</value>
-    </param>
-  </block>
-  <block>
-    <key>parameter</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(360, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>fc</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>fc</value>
-    </param>
-    <param>
-      <key>short_id</key>
-      <value>f</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>eng_float</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>937e6</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_clock_offset_control</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(272, 315)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>180</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>gsm_clock_offset_control_0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>fc</key>
-      <value>fc</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_control_channels_decoder</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1032, 248)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>gsm_control_channels_decoder_0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_control_channels_decoder</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1008, 320)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>gsm_control_channels_decoder_0_0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_decryption</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(832, 171)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>gsm_decryption_0_0_0</value>
-    </param>
-    <param>
-      <key>k_c</key>
-      <value>[0x1e, 0xf0, 0x0b, 0xab, 0x3b, 0xac, 0x70, 0x02]</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_decryption</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(824, 243)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>gsm_decryption_0_0_0_0</value>
-    </param>
-    <param>
-      <key>k_c</key>
-      <value>[0x1e, 0xf0, 0x0b, 0xab, 0x3b, 0xac, 0x70, 0x02]</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_input</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(216, 208)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>gsm_input_0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>osr</key>
-      <value>4</value>
-    </param>
-    <param>
-      <key>fc</key>
-      <value>fc</value>
-    </param>
-    <param>
-      <key>ppm</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>samp_rate_in</key>
-      <value>samp_rate</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_message_printer</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1248, 248)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>gsm_message_printer_0</value>
-    </param>
-    <param>
-      <key>prepend_string</key>
-      <value>""</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_message_printer</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1248, 320)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>gsm_message_printer_0_0</value>
-    </param>
-    <param>
-      <key>prepend_string</key>
-      <value>""</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_message_printer</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1248, 176)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>gsm_message_printer_0_1</value>
-    </param>
-    <param>
-      <key>prepend_string</key>
-      <value>""</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_receiver</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>cell_allocation</key>
-      <value>[0]</value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(384, 192)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>gsm_receiver_0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>num_streams</key>
-      <value>1</value>
-    </param>
-    <param>
-      <key>osr</key>
-      <value>4</value>
-    </param>
-    <param>
-      <key>tseq_nums</key>
-      <value>[]</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_tch_f_chans_demapper</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(600, 176)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>gsm_tch_f_chans_demapper_0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>timeslot_nr</key>
-      <value>5</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_tch_f_decoder</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(1048, 163)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>gsm_tch_f_decoder_0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>mode</key>
-      <value>grgsm.MODE_SPEECH_FR</value>
-    </param>
-    <param>
-      <key>file</key>
-      <value>speech.au.gsm</value>
-    </param>
-  </block>
-  <block>
-    <key>gsm_universal_ctrl_chans_demapper</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>affinity</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>False</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(632, 320)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>gsm_universal_ctrl_chans_demapper_0_0</value>
-    </param>
-    <param>
-      <key>maxoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>minoutbuf</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>channel_types</key>
-      <value>[BCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH,CCCH]</value>
-    </param>
-    <param>
-      <key>starts_fn_mod51</key>
-      <value>[2,6,12,16,22,26,32,36,42,46]</value>
-    </param>
-    <param>
-      <key>timeslot_nr</key>
-      <value>0</value>
-    </param>
-  </block>
-  <block>
-    <key>parameter</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(200, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>input_file_name</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>input_file_name</value>
-    </param>
-    <param>
-      <key>short_id</key>
-      <value>i</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>string</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>vf_call6_a725_d174_g5_Kc1EF00BAB3BAC7002.cfile</value>
-    </param>
-  </block>
-  <block>
-    <key>parameter</key>
-    <param>
-      <key>alias</key>
-      <value></value>
-    </param>
-    <param>
-      <key>comment</key>
-      <value></value>
-    </param>
-    <param>
-      <key>_enabled</key>
-      <value>True</value>
-    </param>
-    <param>
-      <key>_coordinate</key>
-      <value>(448, 11)</value>
-    </param>
-    <param>
-      <key>_rotation</key>
-      <value>0</value>
-    </param>
-    <param>
-      <key>id</key>
-      <value>samp_rate</value>
-    </param>
-    <param>
-      <key>label</key>
-      <value>samp_rate</value>
-    </param>
-    <param>
-      <key>short_id</key>
-      <value>s</value>
-    </param>
-    <param>
-      <key>type</key>
-      <value>eng_float</value>
-    </param>
-    <param>
-      <key>value</key>
-      <value>100e6/174</value>
-    </param>
-  </block>
-  <connection>
-    <source_block_id>blocks_file_source_0</source_block_id>
-    <sink_block_id>gsm_input_0</sink_block_id>
-    <source_key>0</source_key>
-    <sink_key>0</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_clock_offset_control_0</source_block_id>
-    <sink_block_id>gsm_input_0</sink_block_id>
-    <source_key>ppm</source_key>
-    <sink_key>ppm_in</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_control_channels_decoder_0</source_block_id>
-    <sink_block_id>gsm_message_printer_0</sink_block_id>
-    <source_key>msgs</source_key>
-    <sink_key>msgs</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_control_channels_decoder_0_0</source_block_id>
-    <sink_block_id>gsm_message_printer_0_0</sink_block_id>
-    <source_key>msgs</source_key>
-    <sink_key>msgs</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_decryption_0_0_0</source_block_id>
-    <sink_block_id>gsm_tch_f_decoder_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_decryption_0_0_0_0</source_block_id>
-    <sink_block_id>gsm_control_channels_decoder_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_input_0</source_block_id>
-    <sink_block_id>gsm_receiver_0</sink_block_id>
-    <source_key>0</source_key>
-    <sink_key>0</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_receiver_0</source_block_id>
-    <sink_block_id>gsm_tch_f_chans_demapper_0</sink_block_id>
-    <source_key>C0</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_receiver_0</source_block_id>
-    <sink_block_id>gsm_universal_ctrl_chans_demapper_0_0</sink_block_id>
-    <source_key>C0</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_receiver_0</source_block_id>
-    <sink_block_id>gsm_clock_offset_control_0</sink_block_id>
-    <source_key>measurements</source_key>
-    <sink_key>measurements</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_tch_f_chans_demapper_0</source_block_id>
-    <sink_block_id>gsm_decryption_0_0_0_0</sink_block_id>
-    <source_key>acch_bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_tch_f_chans_demapper_0</source_block_id>
-    <sink_block_id>gsm_decryption_0_0_0</sink_block_id>
-    <source_key>tch_bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_tch_f_decoder_0</source_block_id>
-    <sink_block_id>gsm_message_printer_0_1</sink_block_id>
-    <source_key>msgs</source_key>
-    <sink_key>msgs</sink_key>
-  </connection>
-  <connection>
-    <source_block_id>gsm_universal_ctrl_chans_demapper_0_0</source_block_id>
-    <sink_block_id>gsm_control_channels_decoder_0_0</sink_block_id>
-    <source_key>bursts</source_key>
-    <sink_key>bursts</sink_key>
-  </connection>
-</flow_graph>
diff --git a/grc/decoding/gsm_tch_f_decoder.xml b/grc/decoding/gsm_tch_f_decoder.xml
index 59ac97d..632162f 100644
--- a/grc/decoding/gsm_tch_f_decoder.xml
+++ b/grc/decoding/gsm_tch_f_decoder.xml
@@ -3,7 +3,7 @@
   <name>TCH/F decoder</name>
   <key>gsm_tch_f_decoder</key>
   <import>import grgsm</import>
-  <make>grgsm.tch_f_decoder($mode, $file)</make>
+  <make>grgsm.tch_f_decoder($mode, $file, $boundary_check)</make>
 
   <param>
     <name>TCH coding mode</name>
@@ -56,7 +56,21 @@
     <value>/tmp/speech.gsm</value>
     <type>file_open</type>
   </param>
-
+  <param>
+    <name>Voice boundary detection</name>
+    <key>boundary_check</key>
+    <value>True</value>
+    <type>bool</type>
+    <option>
+      <name>False</name>
+      <key>False</key>
+    </option>
+    <option>
+      <name>True</name>
+      <key>True</key>
+    </option>
+  </param>
+  
   <sink>
     <name>bursts</name>
     <type>message</type>
@@ -66,4 +80,12 @@
     <type>message</type>
     <optional>1</optional>
   </source>
+  
+  <doc>
+If "Voice boundary detection" is enabled, then only bursts are decoded as voice where
+
+- the framenumber is greater then the framenumber of a received "Connect" or "Connect Acknowlegde" message, and 
+- the framenumber is less then the framenumber of a "Release" message 
+  </doc>
+  
 </block>
diff --git a/grc/flow_control/CMakeLists.txt b/grc/flow_control/CMakeLists.txt
index 107fac7..30ddcad 100644
--- a/grc/flow_control/CMakeLists.txt
+++ b/grc/flow_control/CMakeLists.txt
@@ -19,7 +19,9 @@
 
 install(FILES
     gsm_burst_timeslot_splitter.xml
-    gsm_burst_fnr_filter.xml 
+    gsm_burst_fnr_filter.xml
+    gsm_burst_timeslot_filter.xml
     gsm_dummy_burst_filter.xml
-    gsm_burst_sdcch_subslot_splitter.xml DESTINATION share/gnuradio/grc/blocks
+    gsm_burst_sdcch_subslot_splitter.xml
+    gsm_burst_sdcch_subslot_filter.xml DESTINATION share/gnuradio/grc/blocks
 )
diff --git a/grc/flow_control/gsm_burst_sdcch_subslot_filter.xml b/grc/flow_control/gsm_burst_sdcch_subslot_filter.xml
new file mode 100644
index 0000000..81ae287
--- /dev/null
+++ b/grc/flow_control/gsm_burst_sdcch_subslot_filter.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<block>
+  <name>Burst SDCCH subslot filter</name>
+  <key>gsm_burst_sdcch_subslot_filter</key>
+  <import>import grgsm</import>
+  <make>grgsm.burst_sdcch_subslot_filter($mode, $subslot)</make>
+   
+  <param>
+    <name>Mode</name>
+    <key>mode</key>
+    <type>enum</type>
+    <option>
+      <name>SDCCH/8</name>
+      <key>grgsm.SS_FILTER_SDCCH8</key>
+    </option>
+    <option>
+      <name>SDCCH/4</name>
+      <key>grgsm.SS_FILTER_SDCCH4</key>
+    </option>
+  </param>
+
+  <param>
+    <name>Subslot</name>
+    <key>subslot</key>
+    <value>0</value>
+    <type>int</type>
+    <hide>none</hide>
+  </param>
+
+  <sink>
+    <name>in</name>
+    <type>message</type>
+  </sink>
+
+  <source>
+    <name>out</name>
+    <type>message</type>
+    <optional>1</optional>
+  </source>
+
+  <doc>
+This block forwards only bursts in the subslot given by the parameter
+  </doc>
+</block>
\ No newline at end of file
diff --git a/grc/flow_control/gsm_burst_timeslot_filter.xml b/grc/flow_control/gsm_burst_timeslot_filter.xml
new file mode 100644
index 0000000..8af2b7b
--- /dev/null
+++ b/grc/flow_control/gsm_burst_timeslot_filter.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<block>
+  <name>Burst timeslot filter</name>
+  <key>gsm_burst_timeslot_filter</key>
+  <import>import grgsm</import>
+  <make>grgsm.burst_timeslot_filter($timeslot)</make>
+
+  <param>
+    <name>Timeslot</name>
+    <key>timeslot</key>
+    <value>0</value>
+    <type>int</type>
+    <hide>none</hide>
+  </param>
+
+  <sink>
+    <name>in</name>
+    <type>message</type>
+  </sink>
+
+  <source>
+    <name>out</name>
+    <type>message</type>
+    <optional>1</optional>
+  </source>
+
+  <doc>
+This block forwards only bursts in the timeslot given by the parameter
+  </doc>
+</block>
diff --git a/grc/gsm_block_tree.xml b/grc/gsm_block_tree.xml
index 86c5ef9..0b15562 100644
--- a/grc/gsm_block_tree.xml
+++ b/grc/gsm_block_tree.xml
@@ -20,6 +20,7 @@
       <block>gsm_fcch_detector</block>
       <block>gsm_clock_offset_control</block>
       <block>gsm_input</block>
+      <block>gsm_wideband_input</block>
     </cat>
     <cat>
       <name>Logical channels demapping</name>
@@ -42,6 +43,8 @@
       <name>Flow control</name>
       <block>gsm_burst_timeslot_splitter</block>
       <block>gsm_burst_sdcch_subslot_splitter</block>
+      <block>gsm_burst_timeslot_filter</block>
+      <block>gsm_burst_sdcch_subslot_filter</block>
       <block>gsm_burst_fnr_filter</block>
       <block>gsm_dummy_burst_filter</block>
     </cat>
diff --git a/grc/misc_utils/gsm_message_printer.xml b/grc/misc_utils/gsm_message_printer.xml
index 7e390ed..0e93f1b 100644
--- a/grc/misc_utils/gsm_message_printer.xml
+++ b/grc/misc_utils/gsm_message_printer.xml
@@ -4,7 +4,8 @@
   <key>gsm_message_printer</key>
   <import>import grgsm</import>
   <import>import pmt</import>
-  <make>grgsm.message_printer(pmt.intern($prepend_string), $print_gsmtap_header)</make>
+  <make>grgsm.message_printer(pmt.intern($prepend_string), $prepend_fnr,
+    $prepend_frame_count, $print_gsmtap_header)</make>
 
   <param>
     <name>Prepend String</name>
@@ -14,6 +15,34 @@
     <hide>part</hide>
   </param>
   <param>
+    <name>Prepend Frame Number</name>
+    <key>prepend_fnr</key>
+    <value>False</value>
+    <type>bool</type>
+    <option>
+      <name>False</name>
+      <key>False</key>
+    </option>
+    <option>
+      <name>True</name>
+      <key>True</key>
+    </option>
+  </param>
+  <param>
+    <name>Prepend Frame Count</name>
+    <key>prepend_frame_count</key>
+    <value>False</value>
+    <type>bool</type>
+    <option>
+      <name>False</name>
+      <key>False</key>
+    </option>
+    <option>
+      <name>True</name>
+      <key>True</key>
+    </option>
+  </param>
+  <param>
     <name>Print GSMTap header</name>
     <key>print_gsmtap_header</key>
     <value>False</value>
diff --git a/grc/receiver/CMakeLists.txt b/grc/receiver/CMakeLists.txt
index 7b51226..bbc086f 100644
--- a/grc/receiver/CMakeLists.txt
+++ b/grc/receiver/CMakeLists.txt
@@ -19,6 +19,7 @@
 
 install(FILES
     gsm_input.xml
+    gsm_wideband_input.xml
     gsm_receiver.xml
     gsm_receiver_with_uplink.xml
     gsm_fcch_burst_tagger.xml
diff --git a/grc/receiver/gsm_wideband_input.xml b/grc/receiver/gsm_wideband_input.xml
new file mode 100644
index 0000000..f05c4b6
--- /dev/null
+++ b/grc/receiver/gsm_wideband_input.xml
@@ -0,0 +1,119 @@
+<block>
+  <name>GSM wideband input adaptor</name>
+  <key>gsm_wideband_input</key>
+  <category></category>
+  <import>import grgsm</import>
+  <make>grgsm.gsm_wideband_input(
+    ppm=$ppm,
+    osr=$osr,
+    fc=$fc,
+    samp_rate_in=$samp_rate_in,
+    ca=$cell_allocation,
+    band=$band,
+)</make>
+  <callback>set_ppm($ppm)</callback>
+  <callback>set_osr($osr)</callback>
+  <callback>set_fc($fc)</callback>
+  <callback>set_samp_rate_in($samp_rate_in)</callback>
+  <param>
+    <name>ppm</name>
+    <key>ppm</key>
+    <value>ppm</value>
+    <type>float</type>
+    <hide>part</hide>
+  </param>
+  <param>
+    <name>OSR</name>
+    <key>osr</key>
+    <value>osr</value>
+    <type>int</type>
+    <hide>part</hide>
+  </param>
+  <param>
+    <name>fc</name>
+    <key>fc</key>
+    <value>fc</value>
+    <type>float</type>
+    <hide>part</hide>
+  </param>
+  <param>
+    <name>Band</name>
+    <key>band</key>
+    <value>E-GSM</value>
+    <type>string</type>
+    <hide>part</hide>
+    <option>
+      <name>P-GSM (1-124)</name>
+      <key>P-GSM</key>
+    </option>
+    <option>
+      <name>DCS1800 (512-885)</name>
+      <key>DCS1900</key>
+    </option>
+    <option>
+      <name>PCS1900 (512-810)</name>
+      <key>PCS1900</key>
+    </option>
+    <option>
+      <name>E-GSM (975-1023)</name>
+      <key>E-GSM</key>
+    </option>
+    <option>
+      <name>R-GSM (955-1023)</name>
+      <key>R-GSM</key>
+    </option>
+    <option>
+      <name>GSM450 (259-293)</name>
+      <key>GSM450</key>
+    </option>
+    <option>
+      <name>GSM480 (306-340)</name>
+      <key>GSM480</key>
+    </option> 
+    <option>
+      <name>GSM850 (128-251)</name>
+      <key>GSM850</key>
+    </option>
+  </param>
+  <param>
+    <name>Cell allocation</name>
+    <key>cell_allocation</key>
+    <value>[]</value>
+    <type>float_vector</type>
+    <hide>part</hide>
+  </param>
+  <param>
+    <name>samp_rate_in</name>
+    <key>samp_rate_in</key>
+    <value>samp_rate_in</value>
+    <type>float</type>
+    <hide>part</hide>
+  </param>
+  <param>
+    <name>Num Streams</name>
+    <key>num_streams</key>
+    <value>1</value>
+    <type>int</type>
+    <hide>part</hide>
+  </param>
+  <check>$num_streams &gt;= 0</check>
+  <check>$cell_allocation and all(grgsm.arfcn.is_valid_arfcn(c, $band) for c in $cell_allocation)</check>
+  <sink>
+    <name>in</name>
+    <type>complex</type>
+    <vlen>1</vlen>
+  </sink>
+  <sink>
+    <name>ppm_in</name>
+    <type>message</type>
+    <optional>True</optional>
+  </sink>
+  <source>
+    <name>out</name>
+    <type>complex</type>
+    <vlen>1</vlen>
+    <nports>$num_streams</nports>
+  </source>
+  <doc>Piotr Krysik
+Adaptor of input stream for the GSM receiver. Contains frequency offset corrector and resampler to correct carrier frequency and sampling frequency offsets. At the end it has LP filter for filtering of a GSM channel.</doc>
+</block>
diff --git a/include/grgsm/decoding/tch_f_decoder.h b/include/grgsm/decoding/tch_f_decoder.h
index efe082c..8dbf68b 100644
--- a/include/grgsm/decoding/tch_f_decoder.h
+++ b/include/grgsm/decoding/tch_f_decoder.h
@@ -62,7 +62,7 @@
        * class. gsm::tch_f_decoder::make is the public interface for
        * creating new instances.
        */
-      static sptr make(tch_mode mode, const std::string &file);
+      static sptr make(tch_mode mode, const std::string &file, bool boundary_check=true);
 
     };
 
diff --git a/include/grgsm/endian.h b/include/grgsm/endian.h
index 231503d..e89694a 100644
--- a/include/grgsm/endian.h
+++ b/include/grgsm/endian.h
@@ -1,16 +1,118 @@
-#ifndef GSM_ENDIAN_H
-#define GSM_ENDIAN_H
+// "License": Public Domain
+// I, Mathias Panzenböck, place this file hereby into the public domain. Use it at your own risk for whatever you like.
+// In case there are jurisdictions that don't support putting things in the public domain you can also consider it to
+// be "dual licensed" under the BSD, MIT and Apache licenses, if you want to. This code is trivial anyway. Consider it
+// an example on how to get the endian conversion functions on different platforms.
 
-#if defined(__linux__)
-#  include <endian.h>
-#elif defined(__APPLE__)
-#  include <libkern/OSByteOrder.h>
+#ifndef PORTABLE_ENDIAN_H__
+#define PORTABLE_ENDIAN_H__
 
-#  define htobe16(x) OSSwapHostToBigInt16(x)
-#  define htobe32(x) OSSwapHostToBigInt32(x)
+#if (defined(_WIN16) || defined(_WIN32) || defined(_WIN64)) && !defined(__WINDOWS__)
 
-#  define be16toh(x) OSSwapBigToHostInt16(x)
-#  define be32toh(x) OSSwapBigToHostInt32(x)
+#	define __WINDOWS__
+
 #endif
 
-#endif /* GSM_ENDIAN_H */
+#if defined(__linux__) || defined(__CYGWIN__)
+
+#	include <endian.h>
+
+#elif defined(__APPLE__)
+
+#	include <libkern/OSByteOrder.h>
+
+#	define htobe16(x) OSSwapHostToBigInt16(x)
+#	define htole16(x) OSSwapHostToLittleInt16(x)
+#	define be16toh(x) OSSwapBigToHostInt16(x)
+#	define le16toh(x) OSSwapLittleToHostInt16(x)
+ 
+#	define htobe32(x) OSSwapHostToBigInt32(x)
+#	define htole32(x) OSSwapHostToLittleInt32(x)
+#	define be32toh(x) OSSwapBigToHostInt32(x)
+#	define le32toh(x) OSSwapLittleToHostInt32(x)
+ 
+#	define htobe64(x) OSSwapHostToBigInt64(x)
+#	define htole64(x) OSSwapHostToLittleInt64(x)
+#	define be64toh(x) OSSwapBigToHostInt64(x)
+#	define le64toh(x) OSSwapLittleToHostInt64(x)
+
+#	define __BYTE_ORDER    BYTE_ORDER
+#	define __BIG_ENDIAN    BIG_ENDIAN
+#	define __LITTLE_ENDIAN LITTLE_ENDIAN
+#	define __PDP_ENDIAN    PDP_ENDIAN
+
+#elif defined(__OpenBSD__)
+
+#	include <sys/endian.h>
+
+#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
+
+#	include <sys/endian.h>
+
+#	define be16toh(x) betoh16(x)
+#	define le16toh(x) letoh16(x)
+
+#	define be32toh(x) betoh32(x)
+#	define le32toh(x) letoh32(x)
+
+#	define be64toh(x) betoh64(x)
+#	define le64toh(x) letoh64(x)
+
+#elif defined(__WINDOWS__)
+
+#	include <winsock2.h>
+#	include <sys/param.h>
+
+#	if BYTE_ORDER == LITTLE_ENDIAN
+
+#		define htobe16(x) htons(x)
+#		define htole16(x) (x)
+#		define be16toh(x) ntohs(x)
+#		define le16toh(x) (x)
+ 
+#		define htobe32(x) htonl(x)
+#		define htole32(x) (x)
+#		define be32toh(x) ntohl(x)
+#		define le32toh(x) (x)
+ 
+#		define htobe64(x) htonll(x)
+#		define htole64(x) (x)
+#		define be64toh(x) ntohll(x)
+#		define le64toh(x) (x)
+
+#	elif BYTE_ORDER == BIG_ENDIAN
+
+		/* that would be xbox 360 */
+#		define htobe16(x) (x)
+#		define htole16(x) __builtin_bswap16(x)
+#		define be16toh(x) (x)
+#		define le16toh(x) __builtin_bswap16(x)
+ 
+#		define htobe32(x) (x)
+#		define htole32(x) __builtin_bswap32(x)
+#		define be32toh(x) (x)
+#		define le32toh(x) __builtin_bswap32(x)
+ 
+#		define htobe64(x) (x)
+#		define htole64(x) __builtin_bswap64(x)
+#		define be64toh(x) (x)
+#		define le64toh(x) __builtin_bswap64(x)
+
+#	else
+
+#		error byte order not supported
+
+#	endif
+
+#	define __BYTE_ORDER    BYTE_ORDER
+#	define __BIG_ENDIAN    BIG_ENDIAN
+#	define __LITTLE_ENDIAN LITTLE_ENDIAN
+#	define __PDP_ENDIAN    PDP_ENDIAN
+
+#else
+
+#	error platform not supported
+
+#endif
+
+#endif
diff --git a/include/grgsm/flow_control/CMakeLists.txt b/include/grgsm/flow_control/CMakeLists.txt
index 0a1a95a..a4156a4 100644
--- a/include/grgsm/flow_control/CMakeLists.txt
+++ b/include/grgsm/flow_control/CMakeLists.txt
@@ -23,6 +23,8 @@
 install(FILES
     burst_timeslot_splitter.h
     burst_sdcch_subslot_splitter.h
+    burst_timeslot_filter.h
+    burst_sdcch_subslot_filter.h
     burst_fnr_filter.h
     dummy_burst_filter.h DESTINATION include/grgsm/flow_control
 )
diff --git a/include/grgsm/flow_control/burst_sdcch_subslot_filter.h b/include/grgsm/flow_control/burst_sdcch_subslot_filter.h
new file mode 100644
index 0000000..9c89df3
--- /dev/null
+++ b/include/grgsm/flow_control/burst_sdcch_subslot_filter.h
@@ -0,0 +1,61 @@
+/* -*- c++ -*- */
+/* @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.
+ *
+ */
+
+#ifndef INCLUDED_GSM_BURST_SDCCH_SUBSLOT_FILTER_H
+#define INCLUDED_GSM_BURST_SDCCH_SUBSLOT_FILTER_H
+
+#include <grgsm/api.h>
+#include <gnuradio/block.h>
+
+namespace gr {
+  namespace gsm {
+    
+    enum subslot_filter_mode
+    {
+        SS_FILTER_SDCCH8,
+        SS_FILTER_SDCCH4
+    };
+
+    /*!
+     * \brief <+description of block+>
+     * \ingroup gsm
+     *
+     */
+    class GSM_API burst_sdcch_subslot_filter : virtual public gr::block
+    {
+     public:
+      typedef boost::shared_ptr<burst_sdcch_subslot_filter> sptr;
+
+      /*!
+       * \brief Return a shared_ptr to a new instance of grgsm::burst_sdcch_subslot_filter.
+       *
+       * To avoid accidental use of raw pointers, grgsm::burst_sdcch_subslot_filter's
+       * constructor is in a private implementation
+       * class. grgsm::burst_sdcch_subslot_filter::make is the public interface for
+       * creating new instances.
+       */
+      static sptr make(subslot_filter_mode mode, unsigned int subslot);
+    };
+  } // namespace gsm
+} // namespace gr
+
+#endif /* INCLUDED_GSM_BURST_SDCCH_SUBSLOT_FILTER_H */
diff --git a/include/grgsm/flow_control/burst_timeslot_filter.h b/include/grgsm/flow_control/burst_timeslot_filter.h
new file mode 100644
index 0000000..00ee2c3
--- /dev/null
+++ b/include/grgsm/flow_control/burst_timeslot_filter.h
@@ -0,0 +1,55 @@
+/* -*- c++ -*- */
+/* @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.
+ *
+ */
+
+#ifndef INCLUDED_GSM_BURST_TIMESLOT_FILTER_H
+#define INCLUDED_GSM_BURST_TIMESLOT_FILTER_H
+
+#include <grgsm/api.h>
+#include <gnuradio/block.h>
+
+namespace gr {
+  namespace gsm {
+
+    /*!
+     * \brief <+description of block+>
+     * \ingroup gsm
+     *
+     */
+    class GSM_API burst_timeslot_filter : virtual public gr::block
+    {
+     public:
+      typedef boost::shared_ptr<burst_timeslot_filter> sptr;
+
+      /*!
+       * \brief Return a shared_ptr to a new instance of grgsm::burst_timeslot_filter.
+       *
+       * To avoid accidental use of raw pointers, grgsm::burst_timeslot_filter's
+       * constructor is in a private implementation
+       * class. grgsm::burst_timeslot_filter::make is the public interface for
+       * creating new instances.
+       */
+      static sptr make(unsigned int timeslot);
+    };
+  } // namespace gsm
+} // namespace gr
+
+#endif /* INCLUDED_GSM_BURST_TIMESLOT_FILTER_H */
diff --git a/include/grgsm/misc_utils/extract_system_info.h b/include/grgsm/misc_utils/extract_system_info.h
index 8be10a1..a05be18 100644
--- a/include/grgsm/misc_utils/extract_system_info.h
+++ b/include/grgsm/misc_utils/extract_system_info.h
@@ -54,7 +54,10 @@
       virtual std::vector<int> get_pwrs() = 0;
       virtual std::vector<int> get_lac() = 0;
       virtual std::vector<int> get_cell_id() = 0;
+      virtual std::vector<int> get_mcc() = 0;
       virtual std::vector<int> get_mnc() = 0;
+      virtual std::vector<int> get_ccch_conf() = 0;
+      virtual std::vector<int> get_cell_arfcns(int chan_id) = 0;
       virtual std::vector<int> get_neighbours(int chan_id) = 0;
       virtual void reset() = 0;
     };
diff --git a/include/grgsm/misc_utils/message_printer.h b/include/grgsm/misc_utils/message_printer.h
index d40352f..04aae94 100644
--- a/include/grgsm/misc_utils/message_printer.h
+++ b/include/grgsm/misc_utils/message_printer.h
@@ -48,7 +48,8 @@
        * class. gsm::message_printer::make is the public interface for
        * creating new instances.
        */
-      static sptr make(pmt::pmt_t prepend_string, bool print_gsmtap_header=false);
+      static sptr make(pmt::pmt_t prepend_string, bool prepend_fnr=false,
+        bool prepend_frame_count=false, bool print_gsmtap_header=false);
     };
 
   } // namespace gsm
diff --git a/installer-packages/.placeholder b/installer-packages/.placeholder
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/installer-packages/.placeholder
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index 2278809..723ecce 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -48,6 +48,8 @@
     decoding/ViterbiR204.cpp
     flow_control/burst_timeslot_splitter_impl.cc
     flow_control/burst_sdcch_subslot_splitter_impl.cc
+    flow_control/burst_timeslot_filter_impl.cc
+    flow_control/burst_sdcch_subslot_filter_impl.cc
     flow_control/burst_fnr_filter_impl.cc
     flow_control/dummy_burst_filter_impl.cc
     misc_utils/controlled_rotator_cc_impl.cc
@@ -66,19 +68,19 @@
 )
 
 
-add_library(gnuradio-grgsm SHARED ${grgsm_sources})
-target_link_libraries(gnuradio-grgsm ${Boost_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} ${VOLK_LIBRARIES} ${LIBOSMOCORE_LIBRARIES}
+add_library(grgsm SHARED ${grgsm_sources})
+target_link_libraries(grgsm ${Boost_LIBRARIES} ${GNURADIO_RUNTIME_LIBRARIES} ${VOLK_LIBRARIES} ${LIBOSMOCORE_LIBRARIES}
 # libraries required by plotting.h - have troubles to be installed by pybombs
 #    boost_iostreams
 #    boost_system
 #    boost_filesystem
 )
-set_target_properties(gnuradio-grgsm PROPERTIES DEFINE_SYMBOL "gnuradio_grgsm_EXPORTS")
+set_target_properties(grgsm PROPERTIES DEFINE_SYMBOL "grgsm_EXPORTS")
 
 ########################################################################
 # Install built library files
 ########################################################################
-install(TARGETS gnuradio-grgsm
+install(TARGETS grgsm
     LIBRARY DESTINATION lib${LIB_SUFFIX} # .so/.dylib file
     ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file
     RUNTIME DESTINATION bin              # .dll file
@@ -104,7 +106,7 @@
 #  ${GNURADIO_RUNTIME_LIBRARIES}
 #  ${Boost_LIBRARIES}
 #  ${CPPUNIT_LIBRARIES}
-#  gnuradio-grgsm
+#  grgsm
 #)
 
 #GR_ADD_TEST(test_gsm test-gsm)
diff --git a/lib/decoding/control_channels_decoder_impl.cc b/lib/decoding/control_channels_decoder_impl.cc
index 3ea3fd9..532e255 100644
--- a/lib/decoding/control_channels_decoder_impl.cc
+++ b/lib/decoding/control_channels_decoder_impl.cc
@@ -124,7 +124,7 @@
                 //std::cout << "Everything correct" << std::endl;
             }
            //compress bits
-           unsigned char outmsg[27];
+           unsigned char outmsg[28];
            unsigned char sbuf_len=224;
            int i, j, c, pos=0;
            for(i = 0; i < sbuf_len; i += 8) {
@@ -137,13 +137,10 @@
            //send message with header of the first burst
             pmt::pmt_t first_header_plus_burst = pmt::cdr(d_bursts[0]);
             gsmtap_hdr * header = (gsmtap_hdr *)pmt::blob_data(first_header_plus_burst);
-            header->type = GSMTAP_TYPE_UM;
-            
-            int8_t * header_content = (int8_t *)header;
-            
             int8_t header_plus_data[sizeof(gsmtap_hdr)+DATA_BYTES];
-            memcpy(header_plus_data, header_content, sizeof(gsmtap_hdr));
+            memcpy(header_plus_data, header, sizeof(gsmtap_hdr));
             memcpy(header_plus_data+sizeof(gsmtap_hdr), outmsg, DATA_BYTES);
+            ((gsmtap_hdr*)header_plus_data)->type = GSMTAP_TYPE_UM;
             
             pmt::pmt_t msg_binary_blob = pmt::make_blob(header_plus_data,DATA_BYTES+sizeof(gsmtap_hdr));
             pmt::pmt_t msg_out = pmt::cons(pmt::PMT_NIL, msg_binary_blob);
diff --git a/lib/decoding/tch_f_decoder_impl.cc b/lib/decoding/tch_f_decoder_impl.cc
index a3b09fb..f409d37 100644
--- a/lib/decoding/tch_f_decoder_impl.cc
+++ b/lib/decoding/tch_f_decoder_impl.cc
@@ -35,21 +35,23 @@
   namespace gsm {
 
     tch_f_decoder::sptr
-    tch_f_decoder::make(tch_mode mode, const std::string &file)
+    tch_f_decoder::make(tch_mode mode, const std::string &file, bool boundary_check)
     {
       return gnuradio::get_initial_sptr
-        (new tch_f_decoder_impl(mode, file));
+        (new tch_f_decoder_impl(mode, file, boundary_check));
     }
 
     /*
      * Constructor
      */
-    tch_f_decoder_impl::tch_f_decoder_impl(tch_mode mode, const std::string &file)
+    tch_f_decoder_impl::tch_f_decoder_impl(tch_mode mode, const std::string &file, bool boundary_check)
       : gr::block("tch_f_decoder",
               gr::io_signature::make(0, 0, 0),
               gr::io_signature::make(0, 0, 0)),
       d_tch_mode(mode),
       d_collected_bursts_num(0),
+      d_boundary_check(boundary_check),
+      d_boundary_decode(!boundary_check),
       mBlockCoder(0x10004820009ULL, 40, 224),
       mU(228),
       mP(mU.segment(184,40)),
@@ -141,7 +143,7 @@
 
                 if (syndrome == 0)
                 {
-                    unsigned char outmsg[27];
+                    unsigned char outmsg[28];
                     unsigned char sbuf_len=224;
                     int i, j, c, pos=0;
                     for(i = 0; i < sbuf_len; i += 8) {
@@ -153,16 +155,41 @@
 
                     pmt::pmt_t first_header_plus_burst = pmt::cdr(d_bursts[0]);
                     gsmtap_hdr * header = (gsmtap_hdr *)pmt::blob_data(first_header_plus_burst);
-                    header->type = GSMTAP_TYPE_UM;
-                    int8_t * header_content = (int8_t *)header;
                     int8_t header_plus_data[sizeof(gsmtap_hdr)+DATA_BYTES];
-                    memcpy(header_plus_data, header_content, sizeof(gsmtap_hdr));
+                    memcpy(header_plus_data, header, sizeof(gsmtap_hdr));
                     memcpy(header_plus_data+sizeof(gsmtap_hdr), outmsg, DATA_BYTES);
+                    ((gsmtap_hdr*)header_plus_data)->type = GSMTAP_TYPE_UM;
 
                     pmt::pmt_t msg_binary_blob = pmt::make_blob(header_plus_data,DATA_BYTES+sizeof(gsmtap_hdr));
                     pmt::pmt_t msg_out = pmt::cons(pmt::PMT_NIL, msg_binary_blob);
 
                     message_port_pub(pmt::mp("msgs"), msg_out);
+                    
+                    // if d_boundary_check is enabled, we set d_boundary_decode to true, when a 
+                    // "Connect" or "Connect Acknowledge" message is received, and
+                    // we set d_boundary_decode back to false, when "Release" message is received
+                    if (d_boundary_check)
+                    {
+                        // check if this is a call control message
+                        if ((outmsg[3] & 0x0f) == 0x03)
+                        {
+                            // Connect specified in GSM 04.08, 9.3.5
+                            if ((outmsg[4] & 0x3f) == 0x07)
+                            {
+                                d_boundary_decode = true;
+                            }
+                            // Connect Acknowledge specified in GSM 04.08, 9.3.6
+                            else if ((outmsg[4] & 0x3f) == 0x0f)
+                            {
+                                d_boundary_decode = true;
+                            }
+                            // Release specified in GSM 04.08, 9.3.18
+                            else if ((outmsg[4] & 0x3f) == 0x2d)
+                            {
+                                d_boundary_decode = false;
+                            }
+                        }
+                    }
 
                     // if we are in an AMR-mode and we receive a channel mode modify message,
                     // we set the mode according to the multirate configuration from the message
@@ -215,6 +242,12 @@
                     }
                 }
             }
+            
+            // if voice boundary_check is enabled and d_boundary_decode is false, we are done
+            if (d_boundary_check && !d_boundary_decode)
+            {
+                return;
+            }
 
             // Decode voice frames and write to file
             if (d_tch_mode == TCH_FS || d_tch_mode == TCH_EFR)
@@ -249,6 +282,7 @@
                         // Undo Um's importance-sorted bit ordering.
                         // See GSM 05.03 3.1 and Table 2.
                         BitVector frFrame(260 + 4); // FR has a frameheader of 4 bits only
+                        frFrame.fillField(0, mFrameHeader, 4);
                         BitVector payload = frFrame.tail(4);
 
                         mTCHD.unmap(GSM::g610BitOrder, 260, payload);
diff --git a/lib/decoding/tch_f_decoder_impl.h b/lib/decoding/tch_f_decoder_impl.h
index f6d054b..3e8c79a 100644
--- a/lib/decoding/tch_f_decoder_impl.h
+++ b/lib/decoding/tch_f_decoder_impl.h
@@ -54,6 +54,8 @@
                 pmt::pmt_t d_bursts[8];
                 FILE * d_speech_file;
                 enum tch_mode d_tch_mode;
+                bool d_boundary_check;
+                bool d_boundary_decode;
 
                 BitVector mU;
                 BitVector mP;
@@ -87,7 +89,7 @@
                 void decode(pmt::pmt_t msg);
                 void setCodingMode(tch_mode mode);
             public:
-                tch_f_decoder_impl(tch_mode mode, const std::string &file);
+                tch_f_decoder_impl(tch_mode mode, const std::string &file, bool boundary_check=true);
                 ~tch_f_decoder_impl();
         };
 
diff --git a/lib/demapping/tch_f_chans_demapper_impl.cc b/lib/demapping/tch_f_chans_demapper_impl.cc
index cc24b9e..a54ed3f 100644
--- a/lib/demapping/tch_f_chans_demapper_impl.cc
+++ b/lib/demapping/tch_f_chans_demapper_impl.cc
@@ -29,6 +29,8 @@
 #include <grgsm/endian.h>
 #include <grgsm/gsmtap.h>
 
+#define BURST_SIZE 148
+
 namespace gr {
   namespace gsm {
 
@@ -80,12 +82,20 @@
         int8_t * burst_bits = (int8_t *)(pmt::blob_data(header_plus_burst))+sizeof(gsmtap_hdr);
 
         if(header->timeslot == d_timeslot){
-            header->sub_type = GSMTAP_CHANNEL_TCH_F;
+            int8_t new_msg[sizeof(gsmtap_hdr)+BURST_SIZE];
+            gsmtap_hdr * new_hdr = (gsmtap_hdr*)new_msg;
+            memcpy(new_msg, header, sizeof(gsmtap_hdr)+BURST_SIZE);
+
+            new_hdr->sub_type = GSMTAP_CHANNEL_TCH_F;
+            if (fn_mod13 == 12)
+                header->sub_type = GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_TCH_F;
+
+            pmt::pmt_t msg_binary_blob = pmt::make_blob(new_msg,sizeof(gsmtap_hdr)+BURST_SIZE);
+            pmt::pmt_t msg_out = pmt::cons(pmt::PMT_NIL, msg_binary_blob);
+
 
             if (fn_mod13 == 12)
             {
-                header->sub_type = GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_TCH_F;
-
                 // position of SACCH burst based on timeslot
                 // see specification gsm 05.02
                 uint32_t index;
@@ -104,7 +114,7 @@
 
                 if (is_sacch)
                 {
-                    d_bursts_sacch[index] = msg;
+                    d_bursts_sacch[index] = msg_out;
                     d_frame_numbers_sacch[index] = frame_nr;
 
                     if (index == 3)
@@ -135,8 +145,8 @@
                 if (fn_mod13 <= 3)
                 {
                     // add to b1 and b3
-                    d_bursts[0][fn_mod13] = msg;
-                    d_bursts[2][fn_mod13 + 4] = msg;
+                    d_bursts[0][fn_mod13] = msg_out;
+                    d_bursts[2][fn_mod13 + 4] = msg_out;
 
                     // set framenumber
                     d_frame_numbers[0][fn_mod13] = frame_nr;
@@ -145,8 +155,8 @@
                 else if (fn_mod13 >= 4 && fn_mod13 <= 7)
                 {
                     // add to b1 and b2
-                    d_bursts[0][fn_mod13] = msg;
-                    d_bursts[1][fn_mod13 - 4] = msg;
+                    d_bursts[0][fn_mod13] = msg_out;
+                    d_bursts[1][fn_mod13 - 4] = msg_out;
 
                     // set framenumber
                     d_frame_numbers[0][fn_mod13] = frame_nr;
@@ -155,8 +165,8 @@
                 else if (fn_mod13 >= 8 && fn_mod13 <= 11)
                 {
                     // add to b2 and b3
-                    d_bursts[1][fn_mod13 - 4] = msg;
-                    d_bursts[2][fn_mod13 - 8] = msg;
+                    d_bursts[1][fn_mod13 - 4] = msg_out;
+                    d_bursts[2][fn_mod13 - 8] = msg_out;
 
                     // set framenumber
                     d_frame_numbers[1][fn_mod13 - 4] = frame_nr;
diff --git a/lib/demapping/universal_ctrl_chans_demapper_impl.cc b/lib/demapping/universal_ctrl_chans_demapper_impl.cc
index 85cb0c6..cbbbc32 100644
--- a/lib/demapping/universal_ctrl_chans_demapper_impl.cc
+++ b/lib/demapping/universal_ctrl_chans_demapper_impl.cc
@@ -30,6 +30,8 @@
 #include <grgsm/gsmtap.h>
 #include <set>
 
+#define BURST_SIZE 148
+
 namespace gr {
   namespace gsm {
 
@@ -209,6 +211,12 @@
         bool uplink_burst = (be16toh(header->arfcn) & 0x4000) ? true : false;
 
         if(header->timeslot==d_timeslot){
+            int8_t new_msg[sizeof(gsmtap_hdr)+BURST_SIZE];
+            gsmtap_hdr * new_hdr = (gsmtap_hdr*)new_msg;
+            memcpy(new_msg, header, sizeof(gsmtap_hdr)+BURST_SIZE);
+            pmt::pmt_t msg_binary_blob = pmt::make_blob(new_msg,sizeof(gsmtap_hdr)+BURST_SIZE);
+            pmt::pmt_t msg_out = pmt::cons(pmt::PMT_NIL, msg_binary_blob);
+	    
             if(uplink_burst)
             {
                 uint32_t fn51_start = d_uplink_starts_fn_mod51[fn_mod51];
@@ -217,15 +225,15 @@
 
                 if(ch_type != 0)
                 {
-                    header->sub_type = ch_type;
+                    new_hdr->sub_type = ch_type;
                 }
-                header->sub_slot = d_uplink_subslots[fn_mod51 + (51 * (frame_nr % 2))];
+                new_hdr->sub_slot = d_uplink_subslots[fn_mod51 + (51 * (frame_nr % 2))];
                 
                 if(fn_mod51>=fn51_start && fn_mod51<=fn51_stop)
                 {
                     uint32_t ii = fn_mod51 - fn51_start;
                     d_uplink_frame_numbers[ii] = frame_nr;
-                    d_uplink_bursts[ii] = msg;
+                    d_uplink_bursts[ii] = msg_out;
                 }
                 
                 if(fn_mod51==fn51_stop)
@@ -258,15 +266,15 @@
 
                 if(ch_type != 0)
                 {
-                    header->sub_type = ch_type;
+                    new_hdr->sub_type = ch_type;
                 }
-                header->sub_slot = d_downlink_subslots[fn_mod51 + (51 * (frame_nr % 2))];
+                new_hdr->sub_slot = d_downlink_subslots[fn_mod51 + (51 * (frame_nr % 2))];
                 
                 if(fn_mod51>=fn51_start && fn_mod51<=fn51_stop)
                 {
                     uint32_t ii = fn_mod51 - fn51_start;
                     d_downlink_frame_numbers[ii] = frame_nr;
-                    d_downlink_bursts[ii] = msg;
+                    d_downlink_bursts[ii] = msg_out;
                 }
                 
                 if(fn_mod51==fn51_stop)
@@ -295,4 +303,3 @@
     }
   } /* namespace gsm */
 } /* namespace gr */
-
diff --git a/lib/flow_control/burst_fnr_filter_impl.cc b/lib/flow_control/burst_fnr_filter_impl.cc
index 1aa6f5b..e665acf 100644
--- a/lib/flow_control/burst_fnr_filter_impl.cc
+++ b/lib/flow_control/burst_fnr_filter_impl.cc
@@ -70,7 +70,7 @@
         unsigned int frame_nr = be32toh(header->frame_number);
         
         if ((d_mode == FILTER_LESS_OR_EQUAL && frame_nr <= d_framenr)
-            || d_mode == FILTER_GREATER_OR_EQUAL && frame_nr >= d_framenr)
+            || (d_mode == FILTER_GREATER_OR_EQUAL && frame_nr >= d_framenr))
         {
             message_port_pub(pmt::mp("out"), msg);
         }
diff --git a/lib/flow_control/burst_sdcch_subslot_filter_impl.cc b/lib/flow_control/burst_sdcch_subslot_filter_impl.cc
new file mode 100644
index 0000000..31e2989
--- /dev/null
+++ b/lib/flow_control/burst_sdcch_subslot_filter_impl.cc
@@ -0,0 +1,105 @@
+/* -*- c++ -*- */
+/* @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.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gnuradio/io_signature.h>
+#include "burst_sdcch_subslot_filter_impl.h"
+#include <stdio.h>
+#include <grgsm/endian.h>
+#include <grgsm/gsmtap.h>
+
+namespace gr {
+  namespace gsm {
+
+    burst_sdcch_subslot_filter::sptr
+    burst_sdcch_subslot_filter::make(subslot_filter_mode mode, unsigned int subslot)
+    {
+      return gnuradio::get_initial_sptr
+        (new burst_sdcch_subslot_filter_impl(mode, subslot));
+    }
+
+    /*
+     * The private constructor
+     */
+    burst_sdcch_subslot_filter_impl::burst_sdcch_subslot_filter_impl(subslot_filter_mode mode, unsigned int subslot)
+      : gr::block("burst_sdcch_subslot_filter",
+              gr::io_signature::make(0, 0, 0),
+              gr::io_signature::make(0, 0, 0)),
+      d_mode(mode),
+      d_subslot(subslot)
+    {     
+        message_port_register_in(pmt::mp("in"));
+        message_port_register_out(pmt::mp("out"));
+        
+        set_msg_handler(pmt::mp("in"), boost::bind(&burst_sdcch_subslot_filter_impl::process_burst, this, _1));
+    }
+
+    /*
+     * Our virtual destructor.
+     */
+    burst_sdcch_subslot_filter_impl::~burst_sdcch_subslot_filter_impl() {}
+
+    void burst_sdcch_subslot_filter_impl::process_burst(pmt::pmt_t msg)
+    {    
+        // hardcoded subslots of the channels, both SDCCH and the associated SACCH
+        // -1 means that the particular position in the frame is not SDCCH
+        static const int8_t subslots_sdcch4[102] = {
+          -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 1, 1, 1, 1,-1,-1, 2, 2, 2, 2, 3, 3, 3, 3,-1,-1, 0, 0, 0, 0, 1, 1, 1, 1,-1,
+          -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 1, 1, 1, 1,-1,-1, 2, 2, 2, 2, 3, 3, 3, 3,-1,-1, 2, 2, 2, 2, 3, 3, 3, 3,-1
+        };
+        static const int8_t subslots_sdcch8[102] = {
+          0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,-1,-1,-1,
+          0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,-1,-1,-1
+        };
+    
+        pmt::pmt_t header_plus_burst = pmt::cdr(msg);
+        gsmtap_hdr * header = (gsmtap_hdr *)pmt::blob_data(header_plus_burst);
+        
+        uint32_t frame_nr = be32toh(header->frame_number);
+        uint32_t fn_mod102 = frame_nr % 102;
+        
+        int8_t subslot;
+        
+        if (d_mode == SS_FILTER_SDCCH8)
+        {
+            subslot = subslots_sdcch8[fn_mod102];
+        }
+        else if (d_mode == SS_FILTER_SDCCH4)
+        {
+            subslot = subslots_sdcch4[fn_mod102];
+        }
+        
+        if ((subslot == -1) || (d_mode == SS_FILTER_SDCCH4 && subslot > 3))
+        {
+            return;
+        }
+        
+        if (subslot == d_subslot)
+        {
+            message_port_pub(pmt::mp("out"), msg);
+        }
+    }
+  } /* namespace gsm */
+} /* namespace gr */
diff --git a/lib/flow_control/burst_sdcch_subslot_filter_impl.h b/lib/flow_control/burst_sdcch_subslot_filter_impl.h
new file mode 100644
index 0000000..40a603e
--- /dev/null
+++ b/lib/flow_control/burst_sdcch_subslot_filter_impl.h
@@ -0,0 +1,45 @@
+/* -*- c++ -*- */
+/* @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.
+ *
+ */
+
+#ifndef INCLUDED_GSM_BURST_SDCCH_SUBSLOT_FILTER_IMPL_H
+#define INCLUDED_GSM_BURST_SDCCH_SUBSLOT_FILTER_IMPL_H
+
+#include <grgsm/flow_control/burst_sdcch_subslot_filter.h>
+
+namespace gr {
+  namespace gsm {
+
+    class burst_sdcch_subslot_filter_impl : public burst_sdcch_subslot_filter
+    {
+     private:
+      subslot_filter_mode d_mode;
+      unsigned int d_subslot;
+     public:
+      burst_sdcch_subslot_filter_impl(subslot_filter_mode mode, unsigned int subslot);
+      ~burst_sdcch_subslot_filter_impl();
+      void process_burst(pmt::pmt_t msg);
+    };
+
+  } // namespace gsm
+} // namespace gr
+
+#endif /* INCLUDED_GSM_BURST_SDCCH_SUBSLOT_FILTER_IMPL_H */
diff --git a/lib/flow_control/burst_sdcch_subslot_splitter_impl.cc b/lib/flow_control/burst_sdcch_subslot_splitter_impl.cc
index 260fe11..90237d9 100644
--- a/lib/flow_control/burst_sdcch_subslot_splitter_impl.cc
+++ b/lib/flow_control/burst_sdcch_subslot_splitter_impl.cc
@@ -30,7 +30,6 @@
 #include <grgsm/endian.h>
 #include <grgsm/gsmtap.h>
 
-
 namespace gr {
   namespace gsm {
 
@@ -74,6 +73,17 @@
 
     void burst_sdcch_subslot_splitter_impl::process_burst(pmt::pmt_t msg)
     {
+        // hardcoded subslots of the channels, both SDCCH and the associated SACCH
+        // -1 means that the particular position in the frame is not SDCCH
+        static const int8_t subslots_sdcch4[102] = {
+          -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 1, 1, 1, 1,-1,-1, 2, 2, 2, 2, 3, 3, 3, 3,-1,-1, 0, 0, 0, 0, 1, 1, 1, 1,-1,
+          -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 1, 1, 1, 1,-1,-1, 2, 2, 2, 2, 3, 3, 3, 3,-1,-1, 2, 2, 2, 2, 3, 3, 3, 3,-1
+        };
+        static const int8_t subslots_sdcch8[102] = {
+          0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,-1,-1,-1,
+          0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,-1,-1,-1
+        };
+    
         pmt::pmt_t header_plus_burst = pmt::cdr(msg);
         gsmtap_hdr * header = (gsmtap_hdr *)pmt::blob_data(header_plus_burst);
         
@@ -84,11 +94,11 @@
         
         if (d_mode == SPLITTER_SDCCH8)
         {
-            subslot = d_subslots_sdcch8[fn_mod102];
+            subslot = subslots_sdcch8[fn_mod102];
         }
         else if (d_mode == SPLITTER_SDCCH4)
         {
-            subslot = d_subslots_sdcch4[fn_mod102];
+            subslot = subslots_sdcch4[fn_mod102];
         }
         
         if ((subslot == -1) || (d_mode == SPLITTER_SDCCH4 && subslot > 3))
diff --git a/lib/flow_control/burst_sdcch_subslot_splitter_impl.h b/lib/flow_control/burst_sdcch_subslot_splitter_impl.h
index 58aff96..b8eaaea 100644
--- a/lib/flow_control/burst_sdcch_subslot_splitter_impl.h
+++ b/lib/flow_control/burst_sdcch_subslot_splitter_impl.h
@@ -31,16 +31,6 @@
     class burst_sdcch_subslot_splitter_impl : public burst_sdcch_subslot_splitter
     {
      private:
-      // hardcoded subslots of the channels, both SDCCH and the associated SACCH
-      // -1 means that the particular position in the frame is not SDCCH
-      const int8_t d_subslots_sdcch4[102] = {
-          -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 1, 1, 1, 1,-1,-1, 2, 2, 2, 2, 3, 3, 3, 3,-1,-1, 0, 0, 0, 0, 1, 1, 1, 1,-1,
-          -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 1, 1, 1, 1,-1,-1, 2, 2, 2, 2, 3, 3, 3, 3,-1,-1, 2, 2, 2, 2, 3, 3, 3, 3,-1
-      };
-      const int8_t d_subslots_sdcch8[102] = {
-          0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,-1,-1,-1,
-          0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,-1,-1,-1
-      };
       splitter_mode d_mode;
      public:
       burst_sdcch_subslot_splitter_impl(splitter_mode mode);
diff --git a/lib/flow_control/burst_timeslot_filter_impl.cc b/lib/flow_control/burst_timeslot_filter_impl.cc
new file mode 100644
index 0000000..ccf4d4c
--- /dev/null
+++ b/lib/flow_control/burst_timeslot_filter_impl.cc
@@ -0,0 +1,77 @@
+/* -*- c++ -*- */
+/* @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.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gnuradio/io_signature.h>
+#include "burst_timeslot_filter_impl.h"
+#include <stdio.h>
+#include <grgsm/endian.h>
+#include <grgsm/gsmtap.h>
+
+
+namespace gr {
+  namespace gsm {
+
+    burst_timeslot_filter::sptr
+    burst_timeslot_filter::make(unsigned int timeslot)
+    {
+      return gnuradio::get_initial_sptr
+        (new burst_timeslot_filter_impl(timeslot));
+    }
+
+    /*
+     * The private constructor
+     */
+    burst_timeslot_filter_impl::burst_timeslot_filter_impl(unsigned int timeslot)
+      : gr::block("burst_timeslot_filter",
+              gr::io_signature::make(0, 0, 0),
+              gr::io_signature::make(0, 0, 0)),
+       d_timeslot(timeslot)
+    {
+        message_port_register_in(pmt::mp("in"));        
+        message_port_register_out(pmt::mp("out"));
+        
+        set_msg_handler(pmt::mp("in"), boost::bind(&burst_timeslot_filter_impl::process_burst, this, _1));
+    }
+
+    /*
+     * Our virtual destructor.
+     */
+    burst_timeslot_filter_impl::~burst_timeslot_filter_impl() {}
+
+    void burst_timeslot_filter_impl::process_burst(pmt::pmt_t msg)
+    {
+        pmt::pmt_t header_plus_burst = pmt::cdr(msg);
+        gsmtap_hdr * header = (gsmtap_hdr *)pmt::blob_data(header_plus_burst);
+        
+        unsigned int timeslot = header->timeslot;
+        
+        if (header->timeslot == d_timeslot)
+        {
+            message_port_pub(pmt::mp("out"), msg);
+        }
+    }
+  } /* namespace gsm */
+} /* namespace gr */
diff --git a/lib/flow_control/burst_timeslot_filter_impl.h b/lib/flow_control/burst_timeslot_filter_impl.h
new file mode 100644
index 0000000..f7b0b2d
--- /dev/null
+++ b/lib/flow_control/burst_timeslot_filter_impl.h
@@ -0,0 +1,45 @@
+/* -*- c++ -*- */
+/* @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.
+ *
+ */
+
+#ifndef INCLUDED_GSM_BURST_TIMESLOT_FILTER_IMPL_H
+#define INCLUDED_GSM_BURST_TIMESLOT_FILTER_IMPL_H
+
+#include <grgsm/flow_control/burst_timeslot_filter.h>
+
+namespace gr {
+  namespace gsm {
+
+    class burst_timeslot_filter_impl : public burst_timeslot_filter
+    {
+     private:
+      unsigned int d_timeslot;
+     public:
+      burst_timeslot_filter_impl(unsigned int timeslot);
+      ~burst_timeslot_filter_impl();
+      void process_burst(pmt::pmt_t msg);
+    };
+
+  } // namespace gsm
+} // namespace gr
+
+#endif /* INCLUDED_GSM_BURST_TIMESLOT_FILTER_IMPL_H */
+
diff --git a/lib/misc_utils/bursts_printer_impl.cc b/lib/misc_utils/bursts_printer_impl.cc
index fd93d79..ab134aa 100644
--- a/lib/misc_utils/bursts_printer_impl.cc
+++ b/lib/misc_utils/bursts_printer_impl.cc
@@ -31,8 +31,10 @@
 #include <algorithm>
 #include "bursts_printer_impl.h"
 #include <unistd.h>
-
 #include <iostream>
+extern "C" {
+    #include <osmocom/gsm/a5.h>
+}
 
 namespace gr {
   namespace gsm {
@@ -77,12 +79,8 @@
 
         if (d_prepend_frame_count)
         {
-            // calculate frame count for A5
-            uint16_t t1 = frame_nr/1326;
-            uint8_t t2 = frame_nr % 26;
-            uint8_t t3 = frame_nr % 51;
-            uint32_t frame_count = (t1<<11)|(t3<<5)|t2;
-            std::cout << frame_count;
+            // calculate fn count using libosmogsm
+            std::cout << osmo_a5_fn_count(frame_nr);
         }
 
         if (d_prepend_fnr || d_prepend_frame_count)
diff --git a/lib/misc_utils/extract_immediate_assignment_impl.cc b/lib/misc_utils/extract_immediate_assignment_impl.cc
index 0ce5fd1..75a1edf 100644
--- a/lib/misc_utils/extract_immediate_assignment_impl.cc
+++ b/lib/misc_utils/extract_immediate_assignment_impl.cc
@@ -28,7 +28,7 @@
 #include <grgsm/gsmtap.h>
 #include <unistd.h>
 #include <map>
-#include <endian.h>
+#include <grgsm/endian.h>
 #include <boost/foreach.hpp>
 
 #include "extract_immediate_assignment_impl.h"
diff --git a/lib/misc_utils/extract_system_info_impl.cc b/lib/misc_utils/extract_system_info_impl.cc
index c9ffc06..6338368 100644
--- a/lib/misc_utils/extract_system_info_impl.cc
+++ b/lib/misc_utils/extract_system_info_impl.cc
@@ -31,7 +31,7 @@
 #include <iterator>
 #include <algorithm>
 #include <iostream>
-#include <endian.h>
+#include <grgsm/endian.h>
 #include <boost/foreach.hpp>
 extern "C" {
     #include <osmocom/gsm/gsm48_ie.h>
@@ -74,7 +74,10 @@
             info.pwr_db = header->signal_dbm;
             info.cell_id = (msg_elements[3]<<8)+msg_elements[4];         //take cell id
             info.lac = (msg_elements[8]<<8)+msg_elements[9];             //take lac
-            info.mnc = (msg_elements[7]>>4);                             //take mnc
+            info.mcc =  ((msg_elements[5] & 0xF)  * 100) + (((msg_elements[5] & 0xF0) >> 4) * 10) + ((msg_elements[6] & 0xF)); // take mcc
+            info.mnc = (msg_elements[7] & 0xF) * 10 + (msg_elements[7]>>4); //take mnc
+            info.ccch_conf = (msg_elements[10] & 0x7); // ccch_conf
+            
             boost::mutex::scoped_lock lock(extract_mutex);
             if(d_c0_channels.find(info.id) != d_c0_channels.end()){
                 d_c0_channels[info.id].copy_nonzero_elements(info);
@@ -87,8 +90,9 @@
             info.id = be16toh(header->arfcn);                            //take arfcn
             info.pwr_db = header->signal_dbm;
             info.lac = (msg_elements[6]<<8)+msg_elements[7];            //take lac
-            info.mnc = (msg_elements[5]>>4);                            //take mnc
-
+            info.mcc =  ((msg_elements[3] & 0xF) * 100) + (((msg_elements[3] & 0xF0) >> 4) * 10) + ((msg_elements[4] & 0xF)); // take mcc
+            info.mnc = (msg_elements[5] & 0xF) * 10 + (msg_elements[5]>>4); //take mnc
+            
             boost::mutex::scoped_lock lock(extract_mutex);
             if(d_c0_channels.find(info.id) != d_c0_channels.end()){
                 d_c0_channels[info.id].copy_nonzero_elements(info);
@@ -157,6 +161,27 @@
                 }
             }
         }
+        else if(msg_elements[2]==0x19)
+        { //System Information Type 1
+            memset(freq, 0, sizeof(freq));
+            chan_info info;
+            info.id = be16toh(header->arfcn);                            //take arfcn
+            info.pwr_db = header->signal_dbm;
+            boost::mutex::scoped_lock lock(extract_mutex);
+            //read cell arfcn's
+            gsm48_decode_freq_list(freq, &msg_elements[3], 16, 0x8c, 0x01);
+            if(d_c0_channels.find(info.id) != d_c0_channels.end()){
+                d_c0_channels[info.id].copy_nonzero_elements(info);
+            } else {
+                d_c0_channels[info.id] = info;
+            }
+            
+            for(int arfcn=0; arfcn<sizeof(freq); arfcn++){
+                if(freq[arfcn].mask==0x01){
+                    d_c0_channels[info.id].cell_arfcns.insert(arfcn);
+                }
+            }
+        }
     }
     
     std::vector<int> extract_system_info_impl::get_chans()
@@ -177,6 +202,15 @@
         return lacs;
     }
     
+    std::vector<int> extract_system_info_impl::get_mcc()
+    {
+        std::vector<int> mccs;
+        BOOST_FOREACH(chan_info_map::value_type &i, d_c0_channels){
+            mccs.push_back(i.second.mcc);
+        }
+        return mccs;
+    }
+    
     std::vector<int> extract_system_info_impl::get_mnc()
     {
         std::vector<int> mncs;
@@ -203,6 +237,16 @@
         }
         return pwrs;
     }
+    
+    std::vector<int> extract_system_info_impl::get_ccch_conf()
+    {
+        std::vector<int> ccch_confs;
+        BOOST_FOREACH(chan_info_map::value_type &i, d_c0_channels){
+            ccch_confs.push_back(i.second.ccch_conf);
+        }
+        return ccch_confs;
+    }
+    
     std::vector<int> extract_system_info_impl::get_neighbours(int chan_id)
     {
         std::vector<int> neighbour_cells;
@@ -211,6 +255,15 @@
         }
         return neighbour_cells;
     }
+        
+    std::vector<int> extract_system_info_impl::get_cell_arfcns(int chan_id)
+    {
+        std::vector<int> cell_arfcns;
+        BOOST_FOREACH(int n, d_c0_channels[chan_id].cell_arfcns){
+            cell_arfcns.push_back(n);
+        }
+        return cell_arfcns;
+    }
     
     void extract_system_info_impl::reset()
     {
diff --git a/lib/misc_utils/extract_system_info_impl.h b/lib/misc_utils/extract_system_info_impl.h
index b88a586..20f5adc 100644
--- a/lib/misc_utils/extract_system_info_impl.h
+++ b/lib/misc_utils/extract_system_info_impl.h
@@ -37,11 +37,14 @@
         unsigned int arfcn;
         unsigned int lac;
         unsigned int cell_id;
+        unsigned int mcc;
         unsigned int mnc;
+        unsigned int ccch_conf;
         std::set<int> neighbour_cells;
+        std::set<int> cell_arfcns;
         
-        chan_info() :  id(-1), pwr_db(0), arfcn(0), lac(0), cell_id(0), mnc(0){}
-        chan_info(const chan_info & info) : id(info.id), pwr_db(info.pwr_db), arfcn(info.arfcn), lac(info.lac), cell_id(info.cell_id), mnc(info.mnc){}
+        chan_info() :  id(-1), pwr_db(0), arfcn(0), lac(0), cell_id(0), mcc(0), mnc(0), ccch_conf(-1){}
+        chan_info(const chan_info & info) : id(info.id), pwr_db(info.pwr_db), arfcn(info.arfcn), lac(info.lac), cell_id(info.cell_id), mcc(info.mcc), mnc(info.mnc), ccch_conf(info.ccch_conf){}
         ~chan_info(){}
         void copy_nonzero_elements(const chan_info & info){
             id = info.id;
@@ -49,7 +52,9 @@
             arfcn = info.arfcn;
             lac = (info.lac!=0) ? info.lac : lac;
             cell_id = (info.cell_id!=0) ? info.cell_id : cell_id;
+            mcc = (info.mcc!=0) ? info.mcc : mcc;
             mnc = (info.mnc!=0) ? info.mnc : mnc;
+            ccch_conf = (info.ccch_conf!=-1) ? info.ccch_conf : ccch_conf;
         }
     };
 
@@ -82,7 +87,10 @@
       virtual std::vector<int> get_pwrs();
       virtual std::vector<int> get_lac();
       virtual std::vector<int> get_cell_id();
+      virtual std::vector<int> get_mcc();
       virtual std::vector<int> get_mnc();
+      virtual std::vector<int> get_ccch_conf();
+      virtual std::vector<int> get_cell_arfcns(int chan_id);
       virtual std::vector<int> get_neighbours(int chan_id);
       virtual void reset();
       extract_system_info_impl();
diff --git a/lib/misc_utils/message_printer_impl.cc b/lib/misc_utils/message_printer_impl.cc
index 2599f65..7d19830 100644
--- a/lib/misc_utils/message_printer_impl.cc
+++ b/lib/misc_utils/message_printer_impl.cc
@@ -28,6 +28,12 @@
 #include <stdio.h>
 #include "message_printer_impl.h"
 #include "grgsm/gsmtap.h"
+#include <grgsm/endian.h>
+
+
+extern "C" {
+    #include <osmocom/gsm/a5.h>
+}
 
 namespace gr {
   namespace gsm {
@@ -37,10 +43,30 @@
         pmt::pmt_t message_plus_header_blob = pmt::cdr(msg);
         uint8_t * message_plus_header = (uint8_t *)pmt::blob_data(message_plus_header_blob);
         size_t message_plus_header_len=pmt::blob_length(message_plus_header_blob);
-        
         gsmtap_hdr * header = (gsmtap_hdr *)message_plus_header;
+        uint32_t frame_nr = be32toh(header->frame_number);
         
         std::cout << d_prepend_string;
+        if (d_prepend_fnr)
+        {
+            std::cout << frame_nr;
+        }
+
+        if (d_prepend_fnr && d_prepend_frame_count)
+        {
+            std::cout << " ";
+        }
+
+        if (d_prepend_frame_count)
+        {
+            // calculate fn count using libosmogsm
+            std::cout << osmo_a5_fn_count(frame_nr);
+        }
+
+        if (d_prepend_fnr || d_prepend_frame_count)
+        {
+            std::cout << ": ";
+        }
         
         int start_index = sizeof(gsmtap_hdr);
         
@@ -57,21 +83,26 @@
     }
 
     message_printer::sptr
-    message_printer::make(pmt::pmt_t prepend_string, bool print_gsmtap_header)
+    message_printer::make(pmt::pmt_t prepend_string, bool prepend_fnr,
+        bool prepend_frame_count, bool print_gsmtap_header)
     {
       return gnuradio::get_initial_sptr
-        (new message_printer_impl(prepend_string, print_gsmtap_header));
+        (new message_printer_impl(prepend_string, prepend_fnr,
+            prepend_frame_count, print_gsmtap_header));
     }
 
     /*
      * The private constructor
      */
-    message_printer_impl::message_printer_impl(pmt::pmt_t prepend_string, bool print_gsmtap_header)
+    message_printer_impl::message_printer_impl(pmt::pmt_t prepend_string, bool prepend_fnr,
+        bool prepend_frame_count, bool print_gsmtap_header)
       : gr::block("message_printer",
               gr::io_signature::make(0, 0, 0),
               gr::io_signature::make(0, 0, 0))
     {
         d_prepend_string = prepend_string;
+        d_prepend_fnr = prepend_fnr;
+        d_prepend_frame_count = prepend_frame_count;
         d_print_gsmtap_header = print_gsmtap_header;
         message_port_register_in(pmt::mp("msgs"));
         set_msg_handler(pmt::mp("msgs"), boost::bind(&message_printer_impl::message_print, this, _1));
diff --git a/lib/misc_utils/message_printer_impl.h b/lib/misc_utils/message_printer_impl.h
index e44288b..86d27d7 100644
--- a/lib/misc_utils/message_printer_impl.h
+++ b/lib/misc_utils/message_printer_impl.h
@@ -33,9 +33,12 @@
      private:
       void message_print(pmt::pmt_t msg);
       pmt::pmt_t d_prepend_string;
+      bool d_prepend_fnr;
+      bool d_prepend_frame_count;
       bool d_print_gsmtap_header;
      public:
-      message_printer_impl(pmt::pmt_t prepend_string, bool print_gsmtap_header=false);
+      message_printer_impl(pmt::pmt_t prepend_string, bool prepend_fnr=false,
+        bool prepend_frame_count=false, bool print_gsmtap_header=false);
       ~message_printer_impl();
     };
 
diff --git a/lib/qa_utils/burst_sink_impl.cc b/lib/qa_utils/burst_sink_impl.cc
index de26d39..5f1ae64 100644
--- a/lib/qa_utils/burst_sink_impl.cc
+++ b/lib/qa_utils/burst_sink_impl.cc
@@ -28,6 +28,7 @@
 #include "burst_sink_impl.h"
 #include <stdio.h>
 #include <sstream>
+#include <grgsm/endian.h>
 #include <grgsm/gsmtap.h>
 
 namespace gr {
diff --git a/lib/receiver/clock_offset_control_impl.cc b/lib/receiver/clock_offset_control_impl.cc
index a590a6d..43a9b8e 100644
--- a/lib/receiver/clock_offset_control_impl.cc
+++ b/lib/receiver/clock_offset_control_impl.cc
@@ -103,7 +103,7 @@
             float ppm = -freq_offset/d_fc*1.0e6;
             std::string state = pmt::symbol_to_string(pmt::tuple_ref(msg,2));
             d_last_state = state;
-            if(abs(ppm) > 100) //safeguard against flawed measurements
+            if(std::abs(ppm) > 100.0) //safeguard against flawed measurements
             {
                 ppm=0;
                 reset();
@@ -132,7 +132,7 @@
                 if(d_counter == 5)
                 {
                     d_counter = 0;
-                    if(abs(d_last_ppm_estimate-d_ppm_estimate) > 0.1)
+                    if(std::abs(d_last_ppm_estimate-d_ppm_estimate) > 0.1)
                     {
                         pmt::pmt_t msg_ppm = pmt::from_double(ppm);
                         message_port_pub(pmt::intern("ppm"), msg_ppm);
diff --git a/lib/receiver/receiver_impl.cc b/lib/receiver/receiver_impl.cc
index 186e437..09a3703 100644
--- a/lib/receiver/receiver_impl.cc
+++ b/lib/receiver/receiver_impl.cc
@@ -89,7 +89,6 @@
                                                                                                      //if first bit of the seqeunce ==1  first symbol ==-1
         gmsk_mapper(train_seq[i], N_TRAIN_BITS, d_norm_training_seq[i], startpoint);
     }
-    
     message_port_register_out(pmt::mp("C0"));
     message_port_register_out(pmt::mp("CX"));
     message_port_register_out(pmt::mp("measurements"));
@@ -314,7 +313,7 @@
                 float normal_corr_max=-1e6;
                 int max_tn;
                 std::vector<gr_complex> v(input, input + noutput_items);
-                if(d_signal_dbm>=d_c0_signal_dbm-13)
+                //if(d_signal_dbm>=d_c0_signal_dbm-13)
                 {
                     if(d_tseq_nums.size()==0)              //there is no information about training sequence
                     {                                      //however the receiver can detect it
@@ -333,14 +332,17 @@
                         d_tseq_nums.push_back(ts_max_num);
                     }
                     int tseq_num;
-                    if(input_nr<=d_tseq_nums.size()){
+                    if(input_nr<=d_tseq_nums.size())
+                    {
                         tseq_num = d_tseq_nums[input_nr-1];
-                    } else {
+                    } else 
+                    {
                         tseq_num = d_tseq_nums.back();
                     }
                     burst_start = get_norm_chan_imp_resp(input, &channel_imp_resp[0], &normal_corr_max, tseq_num);
 //                  if(abs(d_c0_burst_start-burst_start)<=2){ //unused check/filter based on timing
-                    if((normal_corr_max/sqrt(signal_pwr))>=0.8){
+                   // if((normal_corr_max/sqrt(signal_pwr))>=0.9)
+                    {
                         detect_burst(input, &channel_imp_resp[0], burst_start, output_binary);
                         send_burst(d_burst_nr, output_binary, GSMTAP_BURST_NORMAL, input_nr);
                     }
@@ -777,7 +779,7 @@
         std::vector<float>::iterator iter_ii = iter;
         energy = 0;
 
-        for (int ii = 0; ii < (d_chan_imp_length - 2)*d_OSR; ii++, iter_ii++)
+        for (int ii = 0; ii < (d_chan_imp_length)*d_OSR; ii++, iter_ii++)
         {
             if (iter_ii == power_buffer.end())
             {
diff --git a/lib/receiver/sch.c b/lib/receiver/sch.c
index 2e7de44..3273237 100644
--- a/lib/receiver/sch.c
+++ b/lib/receiver/sch.c
@@ -261,7 +261,7 @@
   memcpy(data + SCH_DATA_LEN, buf + SCH_DATA_LEN + N_SYNC_BITS, SCH_DATA_LEN);
 
   // Viterbi decode
-  if (errors = conv_decode(data, decoded_data)) {
+  if ((errors = conv_decode(data, decoded_data))) {
     // fprintf(stderr, "error: sch: conv_decode (%d)\n", errors);
     //DEBUGF("ERR: conv_decode %d\n", errors);
     //return errors;
diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
index 811a3ec..04a97c2 100644
--- a/python/CMakeLists.txt
+++ b/python/CMakeLists.txt
@@ -32,11 +32,14 @@
     FILES
     __init__.py
     receiver/gsm_input.py
+    receiver/gsm_wideband_input.py
     receiver/fcch_burst_tagger.py
     receiver/sch_detector.py
-    receiver/fcch_detector.py 
+    receiver/fcch_detector.py
     receiver/chirpz.py
-    misc_utils/clock_offset_corrector.py DESTINATION ${GR_PYTHON_DIR}/grgsm
+    misc_utils/arfcn.py
+    misc_utils/clock_offset_corrector.py 
+    misc_utils/hier_block.py DESTINATION ${GR_PYTHON_DIR}/grgsm
 )
 
 ########################################################################
@@ -51,5 +54,8 @@
 GR_ADD_TEST(qa_message_printer ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_message_printer.py)
 GR_ADD_TEST(qa_burst_timeslot_splitter ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_burst_timeslot_splitter.py)
 GR_ADD_TEST(qa_burst_sdcch_subslot_splitter ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_burst_sdcch_subslot_splitter.py)
+GR_ADD_TEST(qa_burst_timeslot_filter ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_burst_timeslot_filter.py)
+GR_ADD_TEST(qa_burst_sdcch_subslot_filter ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_burst_sdcch_subslot_filter.py)
 GR_ADD_TEST(qa_burst_fnr_filter ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_burst_fnr_filter.py)
 GR_ADD_TEST(qa_dummy_burst_filter ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_dummy_burst_filter.py)
+GR_ADD_TEST(qa_arfcn ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_arfcn.py)
diff --git a/python/__init__.py b/python/__init__.py
index 41adfe8..247c040 100644
--- a/python/__init__.py
+++ b/python/__init__.py
@@ -46,11 +46,15 @@
 
 # import any pure python here
 
+from hier_block import hier_block
 from fcch_burst_tagger import fcch_burst_tagger
 from sch_detector import sch_detector
 from fcch_detector import fcch_detector
 from clock_offset_corrector import clock_offset_corrector
 from gsm_input import gsm_input
+from gsm_wideband_input import gsm_wideband_input
+
+import arfcn
 
 
 #
diff --git a/python/misc_utils/arfcn.py b/python/misc_utils/arfcn.py
new file mode 100644
index 0000000..e7edfb5
--- /dev/null
+++ b/python/misc_utils/arfcn.py
@@ -0,0 +1,144 @@
+#!/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.
+#
+#
+
+import collections
+
+
+# first uplink freq, first arfcn, last arfcn, downlink frequence distance
+# entries are ordered by relevance
+__band_conf = collections.OrderedDict([
+    ('P-GSM', {'first_freq': 890.2e6, 'first_arfcn': 1, 'last_arfcn': 124, 'downlink_dist': 45e6}),
+    ('DCS1800', {'first_freq': 1710.2e6, 'first_arfcn': 512, 'last_arfcn': 885, 'downlink_dist': 95e6}),
+    ('PCS1900', {'first_freq': 1850.2e6, 'first_arfcn': 512, 'last_arfcn': 810, 'downlink_dist': 80e6}),
+    ('E-GSM', {'first_freq': 880.2e6, 'first_arfcn': 975, 'last_arfcn': 1023, 'downlink_dist': 45e6}),           
+    ('R-GSM', {'first_freq': 876.2e6, 'first_arfcn': 955, 'last_arfcn': 1023, 'downlink_dist': 45e6}),
+    ('GSM450',{'first_freq': 450.6e6, 'first_arfcn': 259, 'last_arfcn': 293, 'downlink_dist': 10e6}),
+    ('GSM480', {'first_freq': 479e6, 'first_arfcn': 306, 'last_arfcn': 340, 'downlink_dist': 10e6}),
+    ('GSM850', {'first_freq': 824.2e6, 'first_arfcn': 128, 'last_arfcn': 251, 'downlink_dist': 45e6})
+    ])
+
+__chan_spacing = 2e5
+
+
+def get_bands():
+    return __band_conf.keys()
+
+
+def get_first_arfcn(band):
+    """
+    Returns the first arfcn (i.e. the one with the lowest number) in the given band.
+    """
+    if band in __band_conf:
+        conf = __band_conf.get(band)
+        return conf['first_arfcn']
+
+
+def get_last_arfcn(band):
+    """
+    Returns the last arfcn (i.e. the one with the highest number) in the given band
+    """
+    if band in __band_conf:
+        conf = __band_conf.get(band)
+        return conf['last_arfcn']
+    
+    
+def is_valid_arfcn(arfcn, band):
+    """
+    Returns True if arfcn is valid in the given band, else False
+    """
+    if band in __band_conf:
+        conf = __band_conf.get(band)
+        first_arfcn = conf['first_arfcn']
+        last_arfcn = conf['last_arfcn']
+        if first_arfcn <= arfcn <= last_arfcn:
+            return True
+    return False
+
+
+def is_valid_uplink(freq, band):
+    """
+    Returns True if the given frequency is a valid uplink frequency in the given band
+    """
+    if band in __band_conf:
+        conf = __band_conf.get(band)
+        first_freq = arfcn2uplink(conf['first_arfcn'], band)
+        last_freq = arfcn2uplink(conf['last_arfcn'], band)
+    if first_freq is None or last_freq is None:
+        return False
+    if first_freq <= freq <= last_freq:
+        return True
+    return False
+
+
+def is_valid_downlink(freq, band):
+    """
+    Returns True if the given frequency is a valid downlink frequency in the given band
+    """
+    if band in __band_conf:
+        conf = __band_conf.get(band)
+        first_freq = arfcn2downlink(conf['first_arfcn'], band)
+        last_freq = arfcn2downlink(conf['last_arfcn'], band)
+    if first_freq is None or last_freq is None:
+        return False
+    if first_freq <= freq <= last_freq:
+        return True
+    return False 
+
+
+def arfcn2uplink(arfcn, band):
+    if band in __band_conf and is_valid_arfcn(arfcn, band):
+
+        conf = __band_conf.get(band)
+        freq_start = conf['first_freq']
+        offset = conf['first_arfcn']
+        # if (band == 'E-GSM' or band == 'R-GSM') and arfcn > 124:
+        #     offset = 1024
+        f = freq_start + (__chan_spacing * (arfcn - offset))
+        return round(f, 1)
+    return None
+
+
+def arfcn2downlink(arfcn, band):
+    if band in __band_conf and is_valid_arfcn(arfcn, band):
+        conf = __band_conf.get(band)
+        distance = conf['downlink_dist']
+        return round(arfcn2uplink(arfcn, band) + distance, 1)
+    return None
+
+
+def uplink2arfcn(freq, band):
+    if band in __band_conf and is_valid_uplink(freq, band):
+        conf = __band_conf.get(band)
+        freq_start = conf['first_freq']
+        offset = conf['first_arfcn']
+        return int(round(offset + ((freq - freq_start) / __chan_spacing), 0))
+    return None
+
+
+def downlink2arfcn(freq, band):
+    if band in __band_conf and is_valid_downlink(freq, band):
+        conf = __band_conf.get(band)
+        distance = conf['downlink_dist']
+        freq_uplink = freq - distance
+        return int(round(uplink2arfcn(freq_uplink, band), 0))
+    return None
diff --git a/python/misc_utils/clock_offset_corrector.py b/python/misc_utils/clock_offset_corrector.py
index e87e243..b75d682 100644
--- a/python/misc_utils/clock_offset_corrector.py
+++ b/python/misc_utils/clock_offset_corrector.py
@@ -10,18 +10,20 @@
 from gnuradio import filter
 from gnuradio import gr
 from gnuradio.filter import firdes
+from distutils.version import LooseVersion as version
 import grgsm
 import math
 
-class clock_offset_corrector(gr.hier_block2):
+class clock_offset_corrector(grgsm.hier_block):
 
     def __init__(self, fc=936.6e6, ppm=0, samp_rate_in=1625000.0/6.0*4.0):
-        gr.hier_block2.__init__(
+        grgsm.hier_block.__init__(
             self, "Clock offset corrector",
             gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
             gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
         )
-
+        self.message_port_register_hier_in("ppm_in")
+        
         ##################################################
         # Parameters
         ##################################################
@@ -37,7 +39,6 @@
         ##################################################
         # Blocks
         ##################################################
-        self.ppm_in = None;self.message_port_register_hier_out("ppm_in")
         self.gsm_controlled_rotator_cc_0 = grgsm.controlled_rotator_cc(0,samp_rate_out)
         self.gsm_controlled_const_source_f_0 = grgsm.controlled_const_source_f(ppm)
         self.fractional_resampler_xx_0 = filter.fractional_resampler_cc(0, samp_rate_in/samp_rate_out)
diff --git a/python/misc_utils/hier_block.py b/python/misc_utils/hier_block.py
new file mode 100644
index 0000000..a3ca1e6
--- /dev/null
+++ b/python/misc_utils/hier_block.py
@@ -0,0 +1,19 @@
+from gnuradio import gr
+from distutils.version import LooseVersion as version
+
+#class created to solve incompatibility of reginstration of message inputs
+#that was introduced in gnuradio 3.7.9
+
+class hier_block(gr.hier_block2):
+    def message_port_register_hier_in(self, port_id):
+        if version(gr.version()) >= version('3.7.9'):
+            super(hier_block, self).message_port_register_hier_in(port_id)
+        else:
+            super(hier_block, self).message_port_register_hier_out(port_id)
+
+    def message_port_register_hier_out(self, port_id):
+        if version(gr.version()) >= version('3.7.9'):
+            super(hier_block, self).message_port_register_hier_out(port_id)
+        else:
+            super(hier_block, self).message_port_register_hier_in(port_id)
+
diff --git a/python/qa_arfcn.py b/python/qa_arfcn.py
new file mode 100755
index 0000000..85be110
--- /dev/null
+++ b/python/qa_arfcn.py
@@ -0,0 +1,287 @@
+#!/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 gr, gr_unittest, blocks
+import grgsm
+import os
+import sys
+
+
+class qa_arfcn (gr_unittest.TestCase):
+   
+    def test_001_is_valid_arfcn(self):
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(259, 'GSM450'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(277, 'GSM450'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(293, 'GSM450'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(258, 'GSM450'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(294, 'GSM450'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(306, 'GSM480'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(323, 'GSM480'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(340, 'GSM480'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(305, 'GSM480'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(341, 'GSM480'))
+                
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(128, 'GSM850'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(199, 'GSM850'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(251, 'GSM850'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(127, 'GSM480'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(251, 'GSM480'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(1, 'P-GSM'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(63, 'P-GSM'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(124, 'P-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(0, 'P-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(125, 'P-GSM'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(975, 'E-GSM'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(999, 'E-GSM'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(1023, 'E-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(974, 'E-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(1024, 'E-GSM'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(955, 'R-GSM'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(989, 'R-GSM'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(1023, 'R-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(954, 'R-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(1024, 'R-GSM'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(512, 'DCS1800'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(732, 'DCS1800'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(885, 'DCS1800'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(511, 'DCS1800'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(886, 'DCS1800'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(512, 'PCS1900'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(691, 'PCS1900'))
+        self.assertTrue(grgsm.arfcn.is_valid_arfcn(810, 'PCS1900'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(511, 'PCS1900'))
+        self.assertFalse(grgsm.arfcn.is_valid_arfcn(811, 'PCS1900'))
+
+
+    def test_002_is_valid_uplink(self):
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(450.6e6, 'GSM450'))
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(457.4e6, 'GSM450'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(450.4e6, 'GSM450'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(457.6e6, 'GSM450'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(479e6, 'GSM480'))
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(485.8e6, 'GSM480'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(478.8e6, 'GSM480'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(486e6, 'GSM480'))
+                
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(824.2e6, 'GSM850'))
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(848.8e6, 'GSM850'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(824e6, 'GSM850'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(849e6, 'GSM850'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(890.2e6, 'P-GSM'))
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(914.8e6, 'P-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(890e6, 'P-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(915e6, 'P-GSM'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(880.2e6, 'E-GSM'))
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(889.8e6, 'E-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(880e6, 'E-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(890e6, 'E-GSM'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(876.2e6, 'R-GSM'))
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(889.8e6, 'R-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(876e6, 'R-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(890e6, 'R-GSM'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(1710.2e6, 'DCS1800'))
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(1784.8e6, 'DCS1800'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(1710e6, 'DCS1800'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(1785e6, 'DCS1800'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(1850.2e6, 'PCS1900'))
+        self.assertTrue(grgsm.arfcn.is_valid_uplink(1909.8e6, 'PCS1900'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(1850e6, 'PCS1900'))
+        self.assertFalse(grgsm.arfcn.is_valid_uplink(1910e6, 'PCS1900'))
+
+
+    def test_003_is_valid_downlink(self):
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(460.6e6, 'GSM450'))
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(467.4e6, 'GSM450'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(460.4e6, 'GSM450'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(467.6e6, 'GSM450'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(489e6, 'GSM480'))
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(495.8e6, 'GSM480'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(488.8e6, 'GSM480'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(496e6, 'GSM480'))
+                
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(869.2e6, 'GSM850'))
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(893.8e6, 'GSM850'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(869e6, 'GSM850'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(894e6, 'GSM850'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(935.2e6, 'P-GSM'))
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(959.8e6, 'P-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(935e6, 'P-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(960e6, 'P-GSM'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(925.2e6, 'E-GSM'))
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(934.8e6, 'E-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(925e6, 'E-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(935e6, 'E-GSM'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(921.2e6, 'R-GSM'))
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(934.8e6, 'R-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(921e6, 'R-GSM'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(935e6, 'R-GSM'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(1805.2e6, 'DCS1800'))
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(1879.8e6, 'DCS1800'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(1805e6, 'DCS1800'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(1880e6, 'DCS1800'))
+        
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(1930.2e6, 'PCS1900'))
+        self.assertTrue(grgsm.arfcn.is_valid_downlink(1989.8e6, 'PCS1900'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(1930e6, 'PCS1900'))
+        self.assertFalse(grgsm.arfcn.is_valid_downlink(1990e6, 'PCS1900'))
+        
+    def test_004_arfcn2uplink(self):
+        self.assertEqual(450.6e6, grgsm.arfcn.arfcn2uplink(259, 'GSM450'))
+        self.assertEqual(457.4e6, grgsm.arfcn.arfcn2uplink(293, 'GSM450'))
+        
+        self.assertEqual(479e6, grgsm.arfcn.arfcn2uplink(306, 'GSM480'))
+        self.assertEqual(485.8e6, grgsm.arfcn.arfcn2uplink(340, 'GSM480'))
+        
+        self.assertEqual(824.2e6, grgsm.arfcn.arfcn2uplink(128, 'GSM850'))
+        self.assertEqual(848.8e6, grgsm.arfcn.arfcn2uplink(251, 'GSM850'))
+        
+        self.assertEqual(890.2e6, grgsm.arfcn.arfcn2uplink(1, 'P-GSM'))
+        self.assertEqual(914.8e6, grgsm.arfcn.arfcn2uplink(124, 'P-GSM'))
+        
+        self.assertEqual(880.2e6, grgsm.arfcn.arfcn2uplink(975, 'E-GSM'))
+        self.assertEqual(889.8e6, grgsm.arfcn.arfcn2uplink(1023, 'E-GSM'))
+        
+        self.assertEqual(876.2e6, grgsm.arfcn.arfcn2uplink(955, 'R-GSM'))
+        self.assertEqual(889.8e6, grgsm.arfcn.arfcn2uplink(1023, 'R-GSM'))
+        
+        self.assertEqual(1710.2e6, grgsm.arfcn.arfcn2uplink(512, 'DCS1800'))
+        self.assertEqual(1784.8e6, grgsm.arfcn.arfcn2uplink(885, 'DCS1800'))
+        
+        self.assertEqual(1850.2e6, grgsm.arfcn.arfcn2uplink(512, 'PCS1900'))
+        self.assertEqual(1909.8e6, grgsm.arfcn.arfcn2uplink(810, 'PCS1900'))
+        
+    def test_005_arfcn2downlink(self):
+        self.assertEqual(460.6e6, grgsm.arfcn.arfcn2downlink(259, 'GSM450'))
+        self.assertEqual(467.4e6, grgsm.arfcn.arfcn2downlink(293, 'GSM450'))
+        
+        self.assertEqual(489e6, grgsm.arfcn.arfcn2downlink(306, 'GSM480'))
+        self.assertEqual(495.8e6, grgsm.arfcn.arfcn2downlink(340, 'GSM480'))
+        
+        self.assertEqual(869.2e6, grgsm.arfcn.arfcn2downlink(128, 'GSM850'))
+        self.assertEqual(893.8e6, grgsm.arfcn.arfcn2downlink(251, 'GSM850'))
+        
+        self.assertEqual(935.2e6, grgsm.arfcn.arfcn2downlink(1, 'P-GSM'))
+        self.assertEqual(959.8e6, grgsm.arfcn.arfcn2downlink(124, 'P-GSM'))
+        
+        self.assertEqual(925.2e6, grgsm.arfcn.arfcn2downlink(975, 'E-GSM'))
+        self.assertEqual(934.8e6, grgsm.arfcn.arfcn2downlink(1023, 'E-GSM'))
+        
+        self.assertEqual(921.2e6, grgsm.arfcn.arfcn2downlink(955, 'R-GSM'))
+        self.assertEqual(934.8e6, grgsm.arfcn.arfcn2downlink(1023, 'R-GSM'))
+        
+        self.assertEqual(1805.2e6, grgsm.arfcn.arfcn2downlink(512, 'DCS1800'))
+        self.assertEqual(1879.8e6, grgsm.arfcn.arfcn2downlink(885, 'DCS1800'))
+        
+        self.assertEqual(1930.2e6, grgsm.arfcn.arfcn2downlink(512, 'PCS1900'))
+        self.assertEqual(1989.8e6, grgsm.arfcn.arfcn2downlink(810, 'PCS1900'))
+        
+    def test_006_uplink2arfcn(self):
+        self.assertEqual(259, grgsm.arfcn.uplink2arfcn(450.6e6, 'GSM450'))
+        self.assertEqual(293, grgsm.arfcn.uplink2arfcn(457.4e6, 'GSM450'))
+        
+        self.assertEqual(306, grgsm.arfcn.uplink2arfcn(479e6, 'GSM480'))
+        self.assertEqual(340, grgsm.arfcn.uplink2arfcn(485.8e6, 'GSM480'))
+        
+        self.assertEqual(128, grgsm.arfcn.uplink2arfcn(824.2e6, 'GSM850'))
+        self.assertEqual(251, grgsm.arfcn.uplink2arfcn(848.8e6, 'GSM850'))
+        
+        self.assertEqual(1, grgsm.arfcn.uplink2arfcn(890.2e6, 'P-GSM'))
+        self.assertEqual(124, grgsm.arfcn.uplink2arfcn(914.8e6, 'P-GSM'))
+        
+        self.assertEqual(975, grgsm.arfcn.uplink2arfcn(880.2e6, 'E-GSM'))
+        self.assertEqual(1023, grgsm.arfcn.uplink2arfcn(889.8e6, 'E-GSM'))
+        
+        self.assertEqual(955, grgsm.arfcn.uplink2arfcn(876.2e6, 'R-GSM'))
+        self.assertEqual(1023, grgsm.arfcn.uplink2arfcn(889.8e6, 'R-GSM'))
+        
+        self.assertEqual(512, grgsm.arfcn.uplink2arfcn(1710.2e6, 'DCS1800'))
+        self.assertEqual(885, grgsm.arfcn.uplink2arfcn(1784.8e6, 'DCS1800'))
+        
+        self.assertEqual(512, grgsm.arfcn.uplink2arfcn(1850.2e6, 'PCS1900'))
+        self.assertEqual(810, grgsm.arfcn.uplink2arfcn(1909.8e6, 'PCS1900'))
+        
+    def test_007_downlink2arfcn(self):
+        self.assertEqual(259, grgsm.arfcn.downlink2arfcn(460.6e6, 'GSM450'))
+        self.assertEqual(293, grgsm.arfcn.downlink2arfcn(467.4e6, 'GSM450'))
+        
+        self.assertEqual(306, grgsm.arfcn.downlink2arfcn(489e6, 'GSM480'))
+        self.assertEqual(340, grgsm.arfcn.downlink2arfcn(495.8e6, 'GSM480'))
+        
+        self.assertEqual(128, grgsm.arfcn.downlink2arfcn(869.2e6, 'GSM850'))
+        self.assertEqual(251, grgsm.arfcn.downlink2arfcn(893.8e6, 'GSM850'))
+        
+        self.assertEqual(1, grgsm.arfcn.downlink2arfcn(935.2e6, 'P-GSM'))
+        self.assertEqual(124, grgsm.arfcn.downlink2arfcn(959.8e6, 'P-GSM'))
+        
+        self.assertEqual(975, grgsm.arfcn.downlink2arfcn(925.2e6, 'E-GSM'))
+        self.assertEqual(1023, grgsm.arfcn.downlink2arfcn(934.8e6, 'E-GSM'))
+        
+        self.assertEqual(955, grgsm.arfcn.downlink2arfcn(921.2e6, 'R-GSM'))
+        self.assertEqual(1023, grgsm.arfcn.downlink2arfcn(934.8e6, 'R-GSM'))
+        
+        self.assertEqual(512, grgsm.arfcn.downlink2arfcn(1805.2e6, 'DCS1800'))
+        self.assertEqual(885, grgsm.arfcn.downlink2arfcn(1879.8e6, 'DCS1800'))
+        
+        self.assertEqual(512, grgsm.arfcn.downlink2arfcn(1930.2e6, 'PCS1900'))
+        self.assertEqual(810, grgsm.arfcn.downlink2arfcn(1989.8e6, 'PCS1900'))
+        
+    def test_008_firstarfcn(self):
+        self.assertEqual(259, grgsm.arfcn.get_first_arfcn('GSM450'))
+        self.assertEqual(306, grgsm.arfcn.get_first_arfcn('GSM480'))
+        self.assertEqual(128, grgsm.arfcn.get_first_arfcn('GSM850'))
+        self.assertEqual(1, grgsm.arfcn.get_first_arfcn('P-GSM'))
+        self.assertEqual(975, grgsm.arfcn.get_first_arfcn('E-GSM'))
+        self.assertEqual(955, grgsm.arfcn.get_first_arfcn('R-GSM'))
+        self.assertEqual(512, grgsm.arfcn.get_first_arfcn('DCS1800'))
+        self.assertEqual(512, grgsm.arfcn.get_first_arfcn('PCS1900'))
+
+    def test_009_firstarfcn(self):
+        self.assertEqual(293, grgsm.arfcn.get_last_arfcn('GSM450'))
+        self.assertEqual(340, grgsm.arfcn.get_last_arfcn('GSM480'))
+        self.assertEqual(251, grgsm.arfcn.get_last_arfcn('GSM850'))
+        self.assertEqual(124, grgsm.arfcn.get_last_arfcn('P-GSM'))
+        self.assertEqual(1023, grgsm.arfcn.get_last_arfcn('E-GSM'))
+        self.assertEqual(1023, grgsm.arfcn.get_last_arfcn('R-GSM'))
+        self.assertEqual(885, grgsm.arfcn.get_last_arfcn('DCS1800'))
+        self.assertEqual(810, grgsm.arfcn.get_last_arfcn('PCS1900'))        
+        
+if __name__ == '__main__':
+    gr_unittest.run(qa_arfcn, "qa_arfcn.xml")
+ 
diff --git a/python/qa_burst_sdcch_subslot_filter.py b/python/qa_burst_sdcch_subslot_filter.py
new file mode 100755
index 0000000..82136bf
--- /dev/null
+++ b/python/qa_burst_sdcch_subslot_filter.py
@@ -0,0 +1,211 @@
+#!/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 gr, gr_unittest, blocks
+import grgsm
+
+class qa_burst_sdcch_subslot_filter (gr_unittest.TestCase):
+    # 102 random bursts as test input
+    bursts_input = [
+        '0000111100101011111011010010011001000100001001110110000110110001011011101111000100101111111000110000001111111111000111100100011111010100010011111000',
+        '0001111110000000110110101010001000101000001101111100101100110010001111011010001000111100001010011101000111010111000100000111001111110011000011011000',
+        '0001101110111011011011011010000001011011001011000100100110010101001111101100010100111110110011001100100011111010110111011001000111101011100001111000',
+        '0000001011100110100011110111010101111000011111001011010011110000110101110010000011010110010011111001000110001111111010111011011001101010001100110000',
+        '0001011001110011011101111111100110110111011101001110111110000101001111101100010100111110001111100000000110001000010000010111111011110101100000111000',
+        '0001110110011011010011100010101010000100011000001111110101111101001111101100010100111110100001001101000100000001011001010110011111100010001111001000',
+        '0001101100101101011110011001110110011100001100100100100110000010001111011010001000111101101101001100100001110001011001000001100000011111101000011000',
+        '0000101100001011101001010001111001000000010100000111100110101000110101110010000011010110110000110010100011001111101101101001110111101001000011111000',
+        '0000011011010111011111101100010100110110000001100011100001010001011011101111000100101110001110000011001100100101111000001010000101010000110101110000',
+        '0000111100110111001011010100010010110100101010000000010001110010011101011000001001110100001010011111111111001010111010111010001111111101111110101000',
+        '0000111101101110011111010100010100110001101110001001111100100101001111101100010100111111100010010001001100000000111010001000100011010000110111110000',
+        '0000011100010011111011011001110010011000001111111110101000100000110101110010000011010111101011000100101011000011011011110000010001100110011010001000',
+        '0000011011100100011101000010111010101101001111110000110001111010000111011101001000011101111110101010000011100100111101000111101110011011001001100000',
+        '0000110100110111001010100011100010101001001010011001001111001001001011100001000100101111001001100100001111100111000101110111100011101100110100010000',
+        '0000011101101000110111010010111001011110101000001011111000101010000111011101001000011100100100010110101110101010001000011001001110100001000101001000',
+        '0000101000110000011100111010101000001101000111111101100100110010011101011000001001110101001101110101011110010100101010001110100001100010101000001000',
+        '0000100010110110000111101001011000001010011110000100111101111010011101011000001001110101100010000111010100001000110001110001111101010100100101010000',
+        '0000010110111011011100011101010001001011001110100011100001000101001111101100010100111110100100110001110011001011110001100000000100100111000011111000',
+        '0001101110100101110101100101011101111100111010101011110001101010000111011101001000011100100010100111110110111001001000100111110111100100010010111000',
+        '0000111000101011011101110110001110101111100010100000110111110010000111011101001000011101111011000101010100011111001000010000110101101110000010101000',
+        '0001001010011001111011001110100001000110010111110011111001000010011101011000001001110100001101000101010010001101001010111100100101010101011100110000',
+        '0000100010001111101111100100010010100000010111001011101101001000110101110010000011010110110011100111001001100101011010100101110011100001110010001000',
+        '0000100100010010111100111000011000001100100001110101110011011001011011101111000100101111001011000000010111001011110011000000001101100001001000100000',
+        '0001010000110010100010110111101111100100000011111000000010111010011101011000001001110101111100000011101010001010100001101000011010110000001001111000',
+        '0001101101111011000010001000000010001110101111001111111111110001011011101111000100101110110001011010110110100111000000010010101110111001111011000000',
+        '0001101000100010100001101100100101011100111000001101001010100010011101011000001001110100011100101100000010110101011011100111111011111101100000011000',
+        '0001010110101101110000011111101100001000001001110101100000011010001111011010001000111100000100110001111110110111010101011011011100111000101111010000',
+        '0000010000111000010001010010111110000100011000000101110110001000110101110010000011010111001100010011100001111101000101011110100001100010010110001000',
+        '0000011110101100001001101000001010010100100111101101101000110101001111101100010100111111011001110000011000100001010011100000001100010110101001001000',
+        '0001110111101011100000001011111101100110110001001100101111110010000111011101001000011101110010001111000010011110001101101111101011100001001100100000',
+        '0001111110100011001100101111001001101000101110011100011000100001001011100001000100101110000110110010111111110101000110001011010110011010100011001000',
+        '0001011100010110000001011011001100000101010000011010001000111111011110001001011101111001101111000011111110011001000010000011000101100011111001010000',
+        '0001110111001111101101110111110000001110111011011100110110001001001011100001000100101110100101001001000110101110111110100110100100111111011001011000',
+        '0001011111010100110010101100011000100011000011111000111100010101001111101100010100111111100110001110010110001110000101110000100101010111100100111000',
+        '0001000100110100001010000101011001010000001111001110011010001001001011100001000100101111100011000100111100100010111001010010110100010000110000110000',
+        '0001001100101001010111000101000101000000111101011111000001011010001111011010001000111100110110011000000011010000100110111101110011110011000011010000',
+        '0001011010100110110011000101111111010011110001101000011100101000110101110010000011010110110100000111011101000001101010100001110111001011010101111000',
+        '0000101010001100010011010101011110010101101110011110100110001010001111011010001000111100000010011011100001010001001111111100011111000011001010011000',
+        '0000111001011100101100111001010101000101010111011110111101010001001011100001000100101111100010100101111011000101100000101111000101011110011111100000',
+        '0000010101101111011001100001011100100101001000110111010110001111011110001001011101111000011010010010101111010000110000011001101011100000111110000000',
+        '0001000001011000010001000100100111110011001101111100010011110010011101011000001001110100110100101101100011010111101110110010101101001110001101010000',
+        '0000101000011101110011111001010011111001001010010000101110010001011011101111000100101111011111110000000100000110011001000100110000111001100000011000',
+        '0000100101010011010110101001100100110001011010111110110100011101001111101100010100111110111000110110100011001010110011000111011111110011001011100000',
+        '0001000110100001111010110101011111001000011100001111010110001001011011101111000100101111100001011001100110011001110101100001000001011011111110100000',
+        '0001011010100110001000100000001110010000011000111001001110000001001011100001000100101110011011011001000111101010001010111001101100000100001101001000',
+        '0000001010000101101010000000110000010101111011100110101000110111011110001001011101111001100011100100100100100000010010001111101111110011000001011000',
+        '0000000111000111010110000000001001101110001001001101100110010001011011101111000100101111101011111100101001110100101000011100111001001101101011101000',
+        '0000100100010111010011100110101011011010001011011011011101110010001111011010001000111100000110010111001010011100000011111100111000100100101010110000',
+        '0000101111000000100110100001011000000011111111010101010011011010000111011101001000011101110010101101000100100000001100001000100111001010010000111000',
+        '0000001001001101110111111011010011000011100001100011110011010001001011100001000100101110011100000010010111101100101011011111101011000000001100101000',
+        '0001100111010111011000100111110000111010111001011100011111000000110101110010000011010111001000000010000010011010111001111001011011011111110101011000',
+        '0000100010110111011001100110110010101011011110101001010001000001011011101111000100101111010101100010101110101111111011101000010111001111000101001000',
+        '0001110000101111100101001101001111101011000000011011000101111000110101110010000011010111111100111011111000000001010111001100110100100011010000011000',
+        '0000011000101001110100000000110101011101011010001101110110111001011011101111000100101111110110101011110110100111000000000011110011101000011000001000',
+        '0000101001000100101010001110110111010000011011001011101010010111011110001001011101111001111010110101100100101001111000100000010001000110000000110000',
+        '0000000111100101111111000110011101000110010110001110100101110001011011101111000100101110100010010011100010010001110100010101101101100111100110101000',
+        '0001000011111010000000011010011001010010011111000011110111010010001111011010001000111101101110111000011010001010100111011000001000110000101000000000',
+        '0001101000110010011001001110101101111110000111001101100110011001001011100001000100101110000101000111011001110001100011011101101000101001001001101000',
+        '0001100111010000101101001110010001001001011000011000001011001010011101011000001001110101101110110101111101110010010010000001000100011111010100011000',
+        '0001001101011001110000101110011110100001001000001111000100001001001011100001000100101110100010110100111010110010011000100111000100111111011000101000',
+        '0001001101010000111101110111111011000100101011011001110001001010011101011000001001110101000000011110001101001010110001100011000110100010011010000000',
+        '0000100100011000011010111010110001000101111010001001010110100001011011101111000100101111100001000101011111111110000011111111100110100100110000111000',
+        '0001011101111100011001100110010001000101100001001001000010110001011011101111000100101110101100111111101111111001110110100101000011100110000001011000',
+        '0001101000100100101011000001001101111011100110101010001110100010000111011101001000011101101101011111110001110001010000001111100110111101101000100000',
+        '0000010101011110000000010011100010101011101111011001100111001010001111011010001000111100010001101011101000101100010110100100001101010110010111000000',
+        '0001100011011000111011100010111111000000011111101010000010110001011011101111000100101111010100100110010000001010100011100001111011110010001011001000',
+        '0001001011000011010010000001001110110110010101010011000101001000110101110010000011010111010010011000110011000110000101111000010100001000011111111000',
+        '0000010100100110100110001010001011011000110000101011000001110001001011100001000100101111101010000111110111011010101010001100101100010100001000010000',
+        '0001101100111011110100000010111000000110111101001110111110111010011101011000001001110101011110110010010011001011001110101001101010101001011000010000',
+        '0001100011110111001100101110010110000110101101101111101101111001011011101111000100101111110001100010010000011100010000011011100010100111101001110000',
+        '0001010011010010101001001000100111111010011101011001110110010001011011101111000100101111111010111010010001100100101100011000100110011001101101000000',
+        '0000111011001001001100100100100101011111011100110101011100010010011101011000001001110101010100111100111001000001100010100111100001010011111111111000',
+        '0001100101110101101110111111000100110000001111010000100001011101001111101100010100111110111111110111000010011100101001111011010100001010001010001000',
+        '0000001000011111101111110000000000001100011111011010111010000111011110001001011101111001001100000001010100111111011000000110010111101001110010011000',
+        '0000100000011100011111001001001000001000100010010111101011101010011101011000001001110100000000010010011001110100101111001110111111010000010001000000',
+        '0001000101001011001111111101010111110010010110111111110000010001011011101111000100101111000100010000111110011101000001111100001001100100011100011000',
+        '0001101101101010110000001001110111001001000001110110110000110001001011100001000100101111100001110001000000110101100001111111001001111001101101100000',
+        '0000110011100000100000000010100100011001001000110010110101111001001011100001000100101110000111001100111111110011011001000001001000001111001101001000',
+        '0001001111100001110110001010100011100011110011100001010100001001001011100001000100101111001000101100111101001010111000010111101000000001101100101000',
+        '0000101001000010000001100001000011001010100011110111101110111001001011100001000100101110001010100101111010111000000010111011000010011001101000001000',
+        '0001101000000100110100110001010111010111111001101110110101100111011110001001011101111001000110010011100100000100011101110110111010001001000111101000',
+        '0000100000100110011100101001110010011011100010101101111001110010001111011010001000111101100000111011110010010111001100100010000101111111011101110000',
+        '0000100111111010101000001110100011010010010010100001011010110000110101110010000011010110011000111000111111000100001010010000011011001000011100110000',
+        '0001110110111100101101010011111100101100100100110001110110111001001011100001000100101110010111011011100001001010010100010101110100011111010101001000',
+        '0000111001001000110010011110000010011101000001010111011011111010011101011000001001110101011101101100101110010111010001100100000011100100111101010000',
+        '0001000001010011101010101011111100010010101110100001000111110010011101011000001001110101100000100101011101111101101101111000001101101010001000101000',
+        '0001101000001011010011001010011010100110010100011010101101011010000111011101001000011101100010011011111111101011100110000011110110001111000101101000',
+        '0000001010101101011001000000001000001001110100000111000000101001001011100001000100101110111111011101110101010011001110111111101001011010110000101000',
+        '0001011110101111110100110010010110011100111010011001001110011111011110001001011101111000101010001111000111000101111000100011100010100010010100010000',
+        '0001000001011110010010100001100010111111000111001111010101011111011110001001011101111001010010100101110110111111001111110010111100111010110011110000',
+        '0001111100100010101100010111000000011011001111001101101001000010001111011010001000111101111000000101111001110101101001101010001110100111101011001000',
+        '0000000011001001101001100111101011001011000100101100101001100010001111011010001000111101100100101001010100111000010001011000100110010101010111000000',
+        '0001111000011111011100011010110000000010000000100000111000100010011101011000001001110100011101011101001001000111011101100001011010101000011011011000',
+        '0001011000010101011100101011111010110101011110011011001011010010001111011010001000111100110111000110100100001100110100000001100100100111101010011000',
+        '0001010101101101101001011100101001110000100101011110100011100010011101011000001001110100111100001000000111000001111100011011101000101100111100111000',
+        '0000010101001010001110001001101101011011000110011011110111111000110101110010000011010110000000110010100100111001010110110011011101011001110100100000',
+        '0001111111000101100000111010111010011010011110110010111000010101001111101100010100111110000110010011101101011111001000010001111111000111001111011000',
+        '0000100101100011001010101100011110000111001110010010010000100001011011101111000100101110001111010000001000001101011010110101010111011011001101101000',
+        '0000110000111101100001011100100011101011011000111100001000000111011110001001011101111000111000000111100100101000000101100011011001111100110011110000',
+        '0000011001111001100111110110110000001111110101011110100011010010011101011000001001110101001101110111111100001001000101101101100110001111101011010000',
+        '0000100001011010001010000101110000111100011110110010000010101000110101110010000011010111010001010101111111111101101100110101111010110100001110101000',
+        '0000000111101000111001101101110011001100100000101111001011001111011110001001011101111001010011110001010010000011001100100001011001111010101011011000'
+    ]
+
+    # 102 sequential framenumbers
+    framenumbers_input = [879852, 879853, 879854, 879855, 879856, 879857, 879858, 879859, 879860, 879861, 879862, 879863, 879864, 879865, 879866, 879867, 879868, 879869, 879870, 879871, 879872, 879873, 879874, 879875, 879876, 879877, 879878, 879879, 879880, 879881, 879882, 879883, 879884, 879885, 879886, 879887, 879888, 879889, 879890, 879891, 879892, 879893, 879894, 879895, 879896, 879897, 879898, 879899, 879900, 879901, 879902, 879903, 879904, 879905, 879906, 879907, 879908, 879909, 879910, 879911, 879912, 879913, 879914, 879915, 879916, 879917, 879918, 879919, 879920, 879921, 879922, 879923, 879924, 879925, 879926, 879927, 879928, 879929, 879930, 879931, 879932, 879933, 879934, 879935, 879936, 879937, 879938, 879939, 879940, 879941, 879942, 879943, 879944, 879945, 879946, 879947, 879948, 879949, 879950, 879951, 879952, 879953]
+    
+    timeslots_input = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+    
+    def setUp (self):
+        self.tb = gr.top_block ()
+
+    def tearDown (self):
+        self.tb = None
+
+
+    def test_001_sdcch8 (self):
+        
+        bursts_expected = [
+            '0000011011010111011111101100010100110110000001100011100001010001011011101111000100101110001110000011001100100101111000001010000101010000110101110000',
+            '0000111100110111001011010100010010110100101010000000010001110010011101011000001001110100001010011111111111001010111010111010001111111101111110101000',
+            '0000111101101110011111010100010100110001101110001001111100100101001111101100010100111111100010010001001100000000111010001000100011010000110111110000',
+            '0000011100010011111011011001110010011000001111111110101000100000110101110010000011010111101011000100101011000011011011110000010001100110011010001000',
+            '0001000001011000010001000100100111110011001101111100010011110010011101011000001001110100110100101101100011010111101110110010101101001110001101010000',
+            '0000101000011101110011111001010011111001001010010000101110010001011011101111000100101111011111110000000100000110011001000100110000111001100000011000',
+            '0000100101010011010110101001100100110001011010111110110100011101001111101100010100111110111000110110100011001010110011000111011111110011001011100000',
+            '0001000110100001111010110101011111001000011100001111010110001001011011101111000100101111100001011001100110011001110101100001000001011011111110100000',
+            '0001001101011001110000101110011110100001001000001111000100001001001011100001000100101110100010110100111010110010011000100111000100111111011000101000',
+            '0001001101010000111101110111111011000100101011011001110001001010011101011000001001110101000000011110001101001010110001100011000110100010011010000000',
+            '0000100100011000011010111010110001000101111010001001010110100001011011101111000100101111100001000101011111111110000011111111100110100100110000111000',
+            '0001011101111100011001100110010001000101100001001001000010110001011011101111000100101110101100111111101111111001110110100101000011100110000001011000',
+        ]
+
+        subslot = 2
+        src = grgsm.burst_source(self.framenumbers_input, self.timeslots_input, self.bursts_input)
+        ss_filter = grgsm.burst_sdcch_subslot_filter(grgsm.SS_FILTER_SDCCH8, subslot)
+        sink = grgsm.burst_sink()
+
+        self.tb.msg_connect(src, "out", ss_filter, "in")
+        self.tb.msg_connect(ss_filter, "out", sink, "in")
+
+        self.tb.run ()
+
+        bursts_result = list(sink.get_burst_data())
+                
+        self.assertEqual(bursts_expected, bursts_result)
+
+
+    def test_002_sdcch4 (self):
+        
+        bursts_expected = [
+            '0001110111001111101101110111110000001110111011011100110110001001001011100001000100101110100101001001000110101110111110100110100100111111011001011000',
+            '0001011111010100110010101100011000100011000011111000111100010101001111101100010100111111100110001110010110001110000101110000100101010111100100111000',
+            '0001000100110100001010000101011001010000001111001110011010001001001011100001000100101111100011000100111100100010111001010010110100010000110000110000',
+            '0001001100101001010111000101000101000000111101011111000001011010001111011010001000111100110110011000000011010000100110111101110011110011000011010000',
+            '0001110110111100101101010011111100101100100100110001110110111001001011100001000100101110010111011011100001001010010100010101110100011111010101001000',
+            '0000111001001000110010011110000010011101000001010111011011111010011101011000001001110101011101101100101110010111010001100100000011100100111101010000',
+            '0001000001010011101010101011111100010010101110100001000111110010011101011000001001110101100000100101011101111101101101111000001101101010001000101000',
+            '0001101000001011010011001010011010100110010100011010101101011010000111011101001000011101100010011011111111101011100110000011110110001111000101101000',
+            '0001011000010101011100101011111010110101011110011011001011010010001111011010001000111100110111000110100100001100110100000001100100100111101010011000',
+            '0001010101101101101001011100101001110000100101011110100011100010011101011000001001110100111100001000000111000001111100011011101000101100111100111000',
+            '0000010101001010001110001001101101011011000110011011110111111000110101110010000011010110000000110010100100111001010110110011011101011001110100100000',
+            '0001111111000101100000111010111010011010011110110010111000010101001111101100010100111110000110010011101101011111001000010001111111000111001111011000',
+        ]
+        
+        subslot = 2
+        src = grgsm.burst_source(self.framenumbers_input, self.timeslots_input, self.bursts_input)
+        splitter = grgsm.burst_sdcch_subslot_filter(grgsm.SS_FILTER_SDCCH4, subslot)
+        sink = grgsm.burst_sink()
+
+        self.tb.msg_connect(src, "out", splitter, "in")
+        self.tb.msg_connect(splitter, "out", sink, "in")
+
+        self.tb.run ()
+
+        bursts_result = list(sink.get_burst_data())
+        
+        self.assertEqual(bursts_result, bursts_expected)
+
+
+if __name__ == '__main__':
+    gr_unittest.run(qa_burst_sdcch_subslot_filter, "qa_burst_sdcch_subslot_filter.xml")
diff --git a/python/qa_burst_timeslot_filter.py b/python/qa_burst_timeslot_filter.py
new file mode 100755
index 0000000..6c8fb2a
--- /dev/null
+++ b/python/qa_burst_timeslot_filter.py
@@ -0,0 +1,92 @@
+#!/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 gr, gr_unittest, blocks
+import grgsm
+import pmt
+
+class qa_burst_timeslot_filter (gr_unittest.TestCase):
+
+    def setUp (self):
+        self.tb = gr.top_block ()
+
+    def tearDown (self):
+        self.tb = None
+
+    def test_001 (self):
+        """
+            24 random framenumbers, timeslots and bursts as input
+        """
+        framenumbers_input = [1259192, 1076346, 1076242, 235879, 1259218, 2194302, 2714322, 1588, 1259244, 1563637, 1435624, 1928543, 503726, 1571144, 2658397, 1807445, 869789, 624070, 2005511, 1306953, 2284894, 1600339, 551375, 1259270]
+        timeslots_input = [6, 1, 4, 3, 5, 3, 2, 7, 1, 6, 0, 7, 2, 1, 2, 0, 7, 1, 0, 6, 0, 6, 5, 7]
+        bursts_input = [
+            "0001100001000111100111101111100101000100101011000010011110011101001111101100010100111111100000110100011111101011101100100111110011000100010001010000",
+            "0001000101000000001001111110000110010110110111110111101000001101001111101100010100111111001110001001110101110001010001000111011010010001011011000000",
+            "0001001101101101000111001000101011001101001110110001001100111101001111101100010100111111111001001010011010011111010010010101011001001011011100110000",
+            "0000010010100000001001101010100001011100010001101100111111101101001111101100010100111111101101001110100010101110010110101111100010010000110010110000",
+            "0000010101010110010011110101010101101100000000001000100100101010000111011101001000011101011101110000101011001111000100001000000000001110010001111000",
+            "0001000000000010111010100000010101000010001010111010000000011010000111011101001000011101000000100010111110101000000001000000000010111010100000000000",
+            "0001010101111111111010000001010101011111111111101000000001001010000111011101001000011101010111111111111010101000000001010101011011101010000001000000",
+            "0000000000111110101010100001000000100010101110101010000101001010000111011101001000011101001010001111101010001000010000000000101110101010100000010000",
+            "0000010000000010000001001000011001010010000011000101000000001010000111011101001000011101010100100000000001001000001000000100100011000101001000111000",
+            "0001010100110111100000110111100110010100011100011000110110001010000111011101001000011101011111111001111001101010010100000000011111001101000111110000",
+            "0001100110000001011110001000001100101001010100111111000100111010000111011101001000011101000011010010001010111101000100110011111010100010010101000000",
+            "0000010101100101010110000011010000000000000010111001110110101010000111011101001000011101000001000100100001111001100011000101010001110001010100111000",
+            "0001000100000011001010111001111100011010000000000000001001001010000111011101001000011101010110000101111010011001110110001001011010101000011110110000",
+            "0001100001000111111111100001011000000011010110111010110000111010000111011101001000011101100010111100100101110001101000110100110000001010101110011000",
+            "0000000100111011000000000010100100001100101010000000010010101010000111011101001000011101000110110001110110000100110100110110011001100100000101100000",
+            "0000100101111010011110111010100111010100011011011101100111001010000111011101001000011101010000111010000110100000001000010011101011001001110100011000",
+            "0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000",
+            "0000110101000011011010110000110011010000000001001010110010001010000111011101001000011101010000011000111001101110000000110010100001101110101000100000",
+            "0000001000010001011111111111101010100000010101011101101010101010000111011101001000011101100010010101010101011110101010101000010001011101111010101000",
+            "0000101110101111011001011001000011110010100010011100110010001010000111011101001000011101100000001110000100010100110111001001100010101101100010101000",
+            "0001100010000001000111011100101101101010100001111101001000101010000111011101001000011101111010000011010110010111011111010010001000001101100011111000",
+            "0001011101101101011100001111001100010001000011011001101110011010000111011101001000011101010010111011100111000001011100100001111010100101111000100000",
+            "0000001000100011000000000000110100000000010000001010100100001010000111011101001000011101000010010000000000001001000001011000000001010000000100010000",
+            "0000100000110001000000000100000110001011100001001000000000001010000111011101001000011101001010010001010000000111010000000011000001000000000101010000"
+        ]
+
+        bursts_expected = [
+            "0001000101000000001001111110000110010110110111110111101000001101001111101100010100111111001110001001110101110001010001000111011010010001011011000000",
+            "0000010000000010000001001000011001010010000011000101000000001010000111011101001000011101010100100000000001001000001000000100100011000101001000111000",
+            "0001100001000111111111100001011000000011010110111010110000111010000111011101001000011101100010111100100101110001101000110100110000001010101110011000",
+            "0000110101000011011010110000110011010000000001001010110010001010000111011101001000011101010000011000111001101110000000110010100001101110101000100000"
+        ]
+
+        timeslot = 1
+        src = grgsm.burst_source(framenumbers_input, timeslots_input, bursts_input)
+        ts_filter = grgsm.burst_timeslot_filter(timeslot)
+        sink = grgsm.burst_sink()
+
+        self.tb.msg_connect(src, "out", ts_filter, "in")
+        self.tb.msg_connect(ts_filter, "out", sink, "in")
+
+        self.tb.run ()
+
+        bursts_result = list(sink.get_burst_data())
+        
+        self.assertEqual(bursts_expected, bursts_result)
+
+
+if __name__ == '__main__':
+    gr_unittest.run(qa_burst_timeslot_filter, "qa_burst_timeslot_filter.xml")
diff --git a/python/qa_message_printer.py b/python/qa_message_printer.py
index 4efaaef..53a286f 100755
--- a/python/qa_message_printer.py
+++ b/python/qa_message_printer.py
@@ -127,7 +127,7 @@
         ]
         
         src = grgsm.message_source(msgs_input)
-        printer = grgsm.message_printer(pmt.intern(""), True)
+        printer = grgsm.message_printer(pmt.intern(""), False, False, True)
         self.tb.msg_connect(src, "msgs", printer, "msgs")
         self.tb.run()
 
@@ -154,10 +154,10 @@
         ]
         
         src = grgsm.message_source(msgs_input)
-        printer = grgsm.message_printer(pmt.intern("test_004:"), True)
+        printer = grgsm.message_printer(pmt.intern("test_004:"), False, False, True)
         self.tb.msg_connect(src, "msgs", printer, "msgs")
         self.tb.run()
-
+        
         self.assertEqual(self.getOutput(), self.getOutputExpected(msgs_expected))
         
         
diff --git a/python/receiver/fcch_detector.py b/python/receiver/fcch_detector.py
index 70a3459..2f2a4ab 100644
--- a/python/receiver/fcch_detector.py
+++ b/python/receiver/fcch_detector.py
@@ -15,10 +15,10 @@
 from gnuradio.filter import firdes
 import grgsm
 
-class fcch_detector(gr.hier_block2):
+class fcch_detector(grgsm.hier_block):
 
     def __init__(self, OSR=4):
-        gr.hier_block2.__init__(
+        grgsm.hier_block.__init__(
             self, "FCCH bursts detector",
             gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
             gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
diff --git a/python/receiver/gsm_input.py b/python/receiver/gsm_input.py
index 47edcc5..97ab633 100644
--- a/python/receiver/gsm_input.py
+++ b/python/receiver/gsm_input.py
@@ -10,12 +10,13 @@
 from gnuradio import filter
 from gnuradio import gr
 from gnuradio.filter import firdes
+from distutils.version import LooseVersion as version
 import grgsm
 
-class gsm_input(gr.hier_block2):
+class gsm_input(grgsm.hier_block):
 
     def __init__(self, ppm=0, osr=4, fc=940e6, samp_rate_in=1e6):
-        gr.hier_block2.__init__(
+        grgsm.hier_block.__init__(
             self, "GSM input adaptor",
             gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
             gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
@@ -37,7 +38,8 @@
         ##################################################
         # Blocks
         ##################################################
-        self.ppm_in = None;self.message_port_register_hier_out("ppm_in")
+        self.message_port_register_hier_in("ppm_in")
+
         self.low_pass_filter_0_0 = filter.fir_filter_ccf(1, firdes.low_pass(
         	1, samp_rate_out, 125e3, 5e3, firdes.WIN_HAMMING, 6.76))
         self.gsm_clock_offset_corrector_0 = grgsm.clock_offset_corrector(
diff --git a/python/receiver/gsm_wideband_input.py b/python/receiver/gsm_wideband_input.py
new file mode 100644
index 0000000..962d7b0
--- /dev/null
+++ b/python/receiver/gsm_wideband_input.py
@@ -0,0 +1,122 @@
+#!/usr/bin/env python
+##################################################
+# Gnuradio Python Flow Graph
+# Title: GSM wideband input adaptor
+# Author: Piotr Krysik
+# Co-author: Pieter Robyns
+# Description: Adaptor of input stream for the GSM receiver. Contains frequency ofset corrector doing also resampling to integer multiplies of GSM sample rate and LP filter filtering GSM channel.
+##################################################
+
+from gnuradio import filter
+from gnuradio import gr
+from gnuradio import eng_notation
+from gnuradio.filter import firdes
+import grgsm.arfcn as arfcn
+import grgsm
+
+class gsm_wideband_input(grgsm.hier_block):
+    def __init__(self, ppm=0, osr=4, fc=925.2e6, samp_rate_in=20e6, ca=[], band='P-GSM'):
+        self.num_streams = len(ca)
+        grgsm.hier_block.__init__(
+            self, "GSM wideband input adaptor",
+            gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
+            gr.io_signature(self.num_streams, self.num_streams, gr.sizeof_gr_complex*1),
+        )
+
+        ##################################################
+        # Parameters
+        ##################################################
+        self.ppm = ppm
+        self.osr = osr
+        self.fc = fc
+        self.samp_rate_in = samp_rate_in
+        self.ca = ca
+        self.blocks_fir_filters = {}
+        self.blocks_resamplers = {}
+        self.blocks_ocs = {}
+        self.band = band
+
+        ##################################################
+        # Variables
+        ##################################################
+        self.samp_rate_out = samp_rate_out = 1625000.0/6.0*osr
+
+        ##################################################
+        # Blocks
+        ##################################################
+        self.ppm_in = None
+        self.message_port_register_hier_in("ppm_in")
+        #self.lpf = firdes.low_pass(1, samp_rate_out, 125e3, 5e3, firdes.WIN_HAMMING, 6.76)
+        self.lpf = firdes.low_pass(1, samp_rate_in, 125e3, 75e3, firdes.WIN_HAMMING, 6.76)
+        self.gsm_clock_offset_corrector_0 = grgsm.clock_offset_corrector(
+            fc=fc,
+            ppm=ppm,
+            samp_rate_in=samp_rate_in,
+        )
+
+        center_arfcn = arfcn.downlink2arfcn(fc, band)
+        fc_str = eng_notation.num_to_str(fc)
+        print("Extracting channels %s, given center frequency at %sHz (ARFCN %d)" % (str(ca), fc_str, center_arfcn))
+
+        self.connect((self, 0), (self.gsm_clock_offset_corrector_0, 0))
+
+        output_port = 0
+        for channel in ca:
+            channel_freq = arfcn.arfcn2downlink(channel, band)
+            if channel_freq is None:
+                print("Warning: invalid ARFCN %d for band %s" % (channel, band))
+                continue
+            freq_diff = channel_freq - fc
+            freq_diff_str = "+" if 0 <= freq_diff else ""
+            freq_diff_str += eng_notation.num_to_str(freq_diff)
+            print("ARFCN %d is at %sHz %sHz" % (channel, fc_str, freq_diff_str))
+
+            self.blocks_resamplers[channel] = filter.fractional_resampler_cc(0, samp_rate_in/samp_rate_out)
+            self.blocks_fir_filters[channel] = filter.freq_xlating_fir_filter_ccc(1, self.lpf, freq_diff, samp_rate_in)
+            self.connect((self.gsm_clock_offset_corrector_0, 0), (self.blocks_fir_filters[channel], 0))
+            self.connect((self.blocks_fir_filters[channel], 0), (self.blocks_resamplers[channel], 0))
+            self.connect((self.blocks_resamplers[channel], 0), (self, output_port))
+            output_port += 1
+
+        ##################################################
+        # Asynch Message Connections
+        ##################################################
+        self.msg_connect(self, "ppm_in", self.gsm_clock_offset_corrector_0, "ppm_in")
+
+    def get_ppm(self):
+        return self.ppm
+
+    def set_ppm(self, ppm):
+        self.ppm = ppm
+        self.gsm_clock_offset_corrector_0.set_ppm(self.ppm)
+
+    def get_fc(self):
+        return self.fc
+
+    def set_fc(self, fc):
+        self.fc = fc
+        self.gsm_clock_offset_corrector_0.set_fc(self.fc)
+
+    def get_osr(self):
+        return self.osr
+
+    def set_osr(self, osr):
+        self.osr = osr
+        self.set_samp_rate_out(1625000.0/6.0*self.osr)
+
+    def get_samp_rate_in(self):
+        return self.samp_rate_in
+
+    def set_samp_rate_in(self, samp_rate_in):
+        self.samp_rate_in = samp_rate_in
+        for channel in self.blocks_resamplers:
+            self.blocks_resamplers[channel].set_resamp_ratio(self.samp_rate_in / self.samp_rate_out)
+        self.gsm_clock_offset_corrector_0.set_samp_rate_in(self.samp_rate_in)
+
+    def get_samp_rate_out(self):
+        return self.samp_rate_out
+
+    def set_samp_rate_out(self, samp_rate_out):
+        self.samp_rate_out = samp_rate_out
+        for channel in self.blocks_resamplers:
+            self.blocks_resamplers[channel].set_resamp_ratio(self.samp_rate_in / self.samp_rate_out)
diff --git a/swig/CMakeLists.txt b/swig/CMakeLists.txt
index 7e9e888..1c237c8 100644
--- a/swig/CMakeLists.txt
+++ b/swig/CMakeLists.txt
@@ -28,14 +28,21 @@
 include(GrSwig)
 include(GrPython)
 
+IF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+  # Mac OS X specific code
+  # Without this flag it does not find some of the libraries
+  SET(CMAKE_MODULE_LINKER_FLAGS "-undefined dynamic_lookup")
+ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+
 ########################################################################
 # Setup swig generation
 ########################################################################
 foreach(incdir ${GNURADIO_RUNTIME_INCLUDE_DIRS})
     list(APPEND GR_SWIG_INCLUDE_DIRS ${incdir}/gnuradio/swig)
 endforeach(incdir)
+list(APPEND GR_SWIG_INCLUDE_DIRS ${FFTW3F_INCLUDE_DIRS})
 
-set(GR_SWIG_LIBRARIES gnuradio-grgsm)
+set(GR_SWIG_LIBRARIES grgsm)
 set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/grgsm_swig_doc.i)
 set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include)
 
diff --git a/swig/grgsm_swig.i b/swig/grgsm_swig.i
index b6ae71c..51556ed 100644
--- a/swig/grgsm_swig.i
+++ b/swig/grgsm_swig.i
@@ -18,6 +18,8 @@
 #include "grgsm/demapping/tch_f_chans_demapper.h"
 #include "grgsm/flow_control/burst_timeslot_splitter.h"
 #include "grgsm/flow_control/burst_sdcch_subslot_splitter.h"
+#include "grgsm/flow_control/burst_timeslot_filter.h"
+#include "grgsm/flow_control/burst_sdcch_subslot_filter.h"
 #include "grgsm/flow_control/burst_fnr_filter.h"
 #include "grgsm/flow_control/dummy_burst_filter.h"
 #include "grgsm/misc_utils/bursts_printer.h"
@@ -61,6 +63,10 @@
 GR_SWIG_BLOCK_MAGIC2(gsm, burst_timeslot_splitter);
 %include "grgsm/flow_control/burst_sdcch_subslot_splitter.h"
 GR_SWIG_BLOCK_MAGIC2(gsm, burst_sdcch_subslot_splitter);
+%include "grgsm/flow_control/burst_timeslot_filter.h"
+GR_SWIG_BLOCK_MAGIC2(gsm, burst_timeslot_filter);
+%include "grgsm/flow_control/burst_sdcch_subslot_filter.h"
+GR_SWIG_BLOCK_MAGIC2(gsm, burst_sdcch_subslot_filter);
 %include "grgsm/flow_control/burst_fnr_filter.h"
 GR_SWIG_BLOCK_MAGIC2(gsm, burst_fnr_filter);
 %include "grgsm/flow_control/dummy_burst_filter.h"
diff --git a/test_data b/test_data
new file mode 160000
index 0000000..86df03f
--- /dev/null
+++ b/test_data
@@ -0,0 +1 @@
+Subproject commit 86df03f54d86093e2fe22daae8bb8c170cf31e58
diff --git a/tests/dockerfiles/Debian_Jessie.docker b/tests/dockerfiles/Debian_Jessie.docker
new file mode 100644
index 0000000..a359648
--- /dev/null
+++ b/tests/dockerfiles/Debian_Jessie.docker
@@ -0,0 +1,33 @@
+FROM debian:testing
+
+# We know it's going to foul up, so we run this install separately and then ...fix... dpkg status
+RUN apt-get update && apt-get install -y uhd-host || \
+     sed -i "s/Status: install ok half-configured/Status: install ok installed/g" /var/lib/dpkg/status
+
+RUN apt-get install -y \
+    git \
+    vim \
+    cmake \
+    autoconf \
+    libtool \
+    build-essential \
+    libboost-all-dev \
+    libcppunit-dev swig \
+    doxygen \
+    liblog4cpp5-dev \
+    python-scipy \
+    gnuradio \
+    gnuradio-dev \
+    gr-osmosdr \
+    libosmogsm5
+
+COPY ./ /src/
+RUN ls /src
+
+RUN mkdir /src/build && \
+    cd /src/build && \
+    cmake .. && \
+    make && \
+    make test && \
+    make install && \
+    ldconfig
diff --git a/tests/dockerfiles/Debian_testing.docker b/tests/dockerfiles/Debian_testing.docker
new file mode 100644
index 0000000..4b3bced
--- /dev/null
+++ b/tests/dockerfiles/Debian_testing.docker
@@ -0,0 +1,26 @@
+FROM debian:testing
+MAINTAINER Ash Wilson
+
+RUN apt-get update && apt-get install -y \
+    cmake \
+    autoconf \
+    libtool \
+    build-essential \
+    libcppunit-dev \
+    swig \
+    doxygen \
+    liblog4cpp5-dev \
+    python-scipy \
+    gnuradio-dev \
+    gr-osmosdr \
+    libosmocore-dev
+
+COPY ./ /src/
+RUN ls /src
+
+RUN mkdir /src/build
+WORKDIR /src/build
+RUN cmake .. && \
+    make && \
+    make install && \
+    ldconfig
diff --git a/tests/dockerfiles/Ubuntu_15_04.docker b/tests/dockerfiles/Ubuntu_15_04.docker
new file mode 100644
index 0000000..58ef22c
--- /dev/null
+++ b/tests/dockerfiles/Ubuntu_15_04.docker
@@ -0,0 +1,79 @@
+FROM ubuntu:15.04
+MAINTAINER Ash Wilson
+
+ENV OSMOSDR_GIT="git://git.osmocom.org/libosmocore.git"
+ENV OSMOCORE_TAG=0.6.3
+
+# We know it's going to foul up, so we run this install separately and then ...fix... dpkg status
+RUN apt-get update && apt-get install -y uhd-host || \
+     sed -i "s/Status: install ok half-configured/Status: install ok installed/g" /var/lib/dpkg/status
+
+
+RUN apt-get update && apt-get install -y \
+    git \
+    python \
+    python-scipy \
+    cmake \
+    make \
+    autoconf \
+    automake \
+    cpp-4.9 \
+    gcc \
+    g++ \
+    libstdc++-4.9-dev \
+    libcppunit-dev \
+    swig \
+    swig2.0 \
+    doxygen \
+    liblog4cpp5 \
+    liblog4cpp5-dev \
+    build-essential \
+    libtool \
+    shtool \
+    pkg-config \
+    libpcsclite-dev \
+    gnuradio \
+    gnuradio-dev \
+    gr-osmosdr \
+    libfftw3-dev \
+    libusb-1.0-0-dev \
+    libvolk-dev \
+    libvolk0.0.0 \
+    libboost-all-dev \
+    libgnuradio-osmosdr0.1.3 \
+    libmirisdr0 \
+    libosmosdr-dev \
+    libosmosdr0 \
+    librtlsdr-dev \
+    librtlsdr0 \
+    osmo-sdr \
+    rtl-sdr \
+    wget \
+    python-talloc-dev \
+    libtalloc2 \
+    libtalloc-dev \
+    unzip
+
+# Build libosmosdr
+RUN git clone $OSMOSDR_GIT
+WORKDIR libosmocore
+RUN git checkout tags/$OSMOCORE_TAG && \
+    autoreconf -i && \
+    ./configure && \
+    make && \
+    make install && \
+    ldconfig -i
+
+COPY ./ /src/
+
+RUN mkdir /root/.gnuradio/
+RUN echo "[grc]\nlocal_blocks_path=/usr/local/share/gnuradio/grc/blocks" > \
+    /root/.gnuradio/config.conf
+
+RUN mkdir /src/build
+WORKDIR /src/build
+RUN cmake .. && \
+    make && \
+    make test && \
+    make install && \
+    ldconfig
diff --git a/tests/dockerfiles/Ubuntu_16_04.docker b/tests/dockerfiles/Ubuntu_16_04.docker
new file mode 100644
index 0000000..ac3e549
--- /dev/null
+++ b/tests/dockerfiles/Ubuntu_16_04.docker
@@ -0,0 +1,26 @@
+FROM ubuntu:16.04
+MAINTAINER Ash Wilson
+
+RUN apt-get update && apt-get install -y \
+    cmake \
+    autoconf \
+    libtool \
+    build-essential \
+    libcppunit-dev \
+    swig \
+    doxygen \
+    liblog4cpp5-dev \
+    python-scipy \
+    gnuradio-dev \
+    gr-osmosdr \
+    libosmocore-dev
+
+COPY ./ /src/
+RUN ls /src
+
+RUN mkdir /src/build
+WORKDIR /src/build
+RUN cmake .. && \
+    make && \
+    make install && \
+    ldconfig
diff --git a/tests/dockerfiles/Ubuntu_16_04_debbuild.docker b/tests/dockerfiles/Ubuntu_16_04_debbuild.docker
new file mode 100644
index 0000000..030ece8
--- /dev/null
+++ b/tests/dockerfiles/Ubuntu_16_04_debbuild.docker
@@ -0,0 +1,27 @@
+FROM ubuntu:16.04
+MAINTAINER Ash Wilson
+
+RUN apt-get update && apt-get install -y \
+    cmake \
+    autoconf \
+    libtool \
+    build-essential \
+    libcppunit-dev \
+    swig \
+    doxygen \
+    liblog4cpp5-dev \
+    python-scipy \
+    gnuradio-dev \
+    gr-osmosdr \
+    libosmocore-dev
+
+COPY ./ /src/
+RUN ls /src
+
+RUN mkdir /src/build
+WORKDIR /src/build
+RUN cmake .. && \
+    make package && \
+    cpack -G DEB && \
+    ls
+
diff --git a/tests/fixtures/grgsm_decode_test1_expected b/tests/fixtures/grgsm_decode_test1_expected
new file mode 100644
index 0000000..eb78bb9
--- /dev/null
+++ b/tests/fixtures/grgsm_decode_test1_expected
@@ -0,0 +1,51 @@
+860912 1330176:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860916 1330308:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860922 1330506:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860926 1330638:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860933 1329237:  59 06 1a 8f 6d 18 10 80 00 00 00 00 00 00 00 00 00 00 00 78 b9 00 00
+860937 1329369:  05 06 20 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860943 1329541:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860947 1329673:  25 06 21 20 05 f4 01 4f af 9a 81 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860953 1329871:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860957 1330003:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860963 1330201:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860967 1330307:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860973 1330505:  25 06 21 20 05 f4 01 5c ff 9b 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860977 1330637:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860984 1329236:  49 06 1b 2b d9 62 f2 20 01 3e c8 07 0a 15 60 09 b9 00 00 e8 1f 46 1b
+860988 1329368:  05 06 20 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860994 1329540:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+860998 1329672:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861004 1329870:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861008 1330002:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861014 1330200:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861018 1330306:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861024 1330504:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861028 1330636:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861035 1329235:  31 06 1c 62 f2 20 01 3e 60 09 b9 00 00 e8 1f 73 2b 2b 2b 2b 2b 2b 2b
+861039 1329367:  05 06 20 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861045 1329539:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861049 1329671:  25 06 21 20 05 f4 01 5c e5 e7 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861055 1329869:  25 06 21 20 05 f4 01 5c 54 02 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861059 1330001:  25 06 21 20 05 f4 01 5b 98 57 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861065 1330199:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861069 1330305:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861075 1330503:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861079 1330635:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861086 1329234:  01 06 00 c0 00 58 47 eb 4a 92 43 40 62 84 eb 2b 2b 2b 2b 2b 2b 2b 2b
+861090 1329366:  05 06 20 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861096 1329538:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861100 1329670:  25 06 21 20 05 f4 01 5c ff d1 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861106 1329868:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861110 1330000:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861116 1330198:  25 06 21 20 05 f4 01 59 e8 c2 81 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861120 1330304:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861126 1330502:  25 06 21 20 05 f4 01 59 42 cb 81 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861130 1330634:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861137 1329233:  01 06 03 60 00 00 00 00 00 04 15 50 10 00 00 00 00 0a a8 2b 2b 2b 2b
+861141 1329365:  05 06 07 20 00 46 24 40 00 03 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861147 1329537:  25 06 21 20 05 f4 01 52 80 26 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861151 1329669:  25 06 21 20 05 f4 ec 03 a9 72 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861157 1329867:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861161 1329999:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+861167 1330197:  15 06 21 00 01 f0 8b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
diff --git a/tests/scripts/decode.sh b/tests/scripts/decode.sh
new file mode 100755
index 0000000..014a5d3
--- /dev/null
+++ b/tests/scripts/decode.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+TEST_DIR=`dirname "$0"`
+
+export AP_DECODE="grgsm_decode"
+export CAPFILE="../../test_data/vf_call6_a725_d174_g5_Kc1EF00BAB3BAC7002.cfile"
+export SHORTENED_CAPFILE="tmp.cfile"
+export RESULT_EXPECTED="../fixtures/grgsm_decode_test1_expected"
+export RESULT_OBTAINED="grgsm_decode_test1_result"
+export RUNLINE="$AP_DECODE -c $SHORTENED_CAPFILE -s $((100000000/174)) -m BCCH -t 0 -v "
+echo "Testing with:"
+echo "  $RUNLINE"
+gnuradio-companion --version
+
+cd $TEST_DIR
+cat $CAPFILE | head -c 6000000 > $SHORTENED_CAPFILE
+
+$RUNLINE | tail -n +4 | tee $RESULT_OBTAINED
+diff $RESULT_EXPECTED $RESULT_OBTAINED
+TEST_RESULT=$?
+
+rm $RESULT_OBTAINED
+rm $SHORTENED_CAPFILE
+
+if [ $TEST_RESULT == 0 ]
+then
+  echo "   Result: PASSED"
+  exit 0
+else
+  echo "   Result: FAILED"
+  exit 1
+fi
diff --git a/tests/scripts/scanner.sh b/tests/scripts/scanner.sh
new file mode 100755
index 0000000..4b1bfdd
--- /dev/null
+++ b/tests/scripts/scanner.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+# This script runs integration tests for grgsm_scanner.
+# Run it fron the enclosing directory.
+export TEST_IMAGE_NAMES=()
+export TEST_SCAN_BANDS=(P-GSM DCS1800 PCS1900 E-GSM R-GSM GSM450 GSM480 GSM850)
+export TEMP_DIR=`mktemp -d`
+cd ../../
+export GR_SRC_DIR=`echo $PWD`
+
+echo "Using source dir: $GR_SRC_DIR"
+echo "Using destination dir: $TEMP_DIR"
+cp -R $GR_SRC_DIR $TEMP_DIR
+
+cd $TEMP_DIR/gr-gsm
+
+export DOCKERFILE_LIST=($TEMP_DIR/gr-gsm/tests/dockerfiles/*.docker)
+
+for DOCKERFILE in ${DOCKERFILE_LIST[*]}
+do
+  cat $DOCKERFILE > Dockerfile
+  export IMAGE_BASE=`echo $DOCKERFILE | \
+  sed -e "s|$TEMP_DIR/gr-gsm/dockerfiles/||g" | \
+  sed -e 's/\.docker//g'`
+  export IMAGE_NAME=`echo $IMAGE_BASE | tr '[:upper:]' '[:lower:]'`
+  echo "Attempt to build $IMAGE_NAME"
+  docker build -t $IMAGE_NAME ./ && TEST_IMAGE_NAMES+=($IMAGE_NAME)
+done
+
+
+for BAND in ${TEST_SCAN_BANDS[*]}
+do
+  export SCAN_COMMAND="/usr/bin/python /usr/local/bin/grgsm_scanner -b `echo $BAND` -v"
+  for IMG in ${TEST_IMAGE_NAMES[*]}
+  do
+    echo "Now we test: $SCAN_COMMAND on $IMG"
+    docker run -it --rm --privileged $IMG `echo $SCAN_COMMAND`
+  done
+done
+
+cd $GR_SRC_DIR/build_test/scripts && rm -rf $TEMP_DIR