Merge branch 'grgsm_on_win' of https://github.com/ptrkrysik/gr-gsm into grgsm_on_win
diff --git a/.travis.yml b/.travis.yml
index 6c1b51b..034ede2 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,10 +3,11 @@
 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/Debian_testing.docker IMGNAME=debtest-grgsm
+  - DOCKERFILE=tests/dockerfiles/Debian_testing_package.docker IMGNAME=debtest-grgsm-package
   - DOCKERFILE=tests/dockerfiles/Ubuntu_16_04.docker IMGNAME=ubu16.04-grgsm
+  - DOCKERFILE=tests/dockerfiles/Kali.docker IMGNAME=kali-grgsm
+
 
 services:
   - docker
@@ -15,5 +16,5 @@
   - 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 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 7e56092..811cd93 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -61,7 +61,7 @@
 # Set the version information here
 set(VERSION_INFO_MAJOR_VERSION 0)
 set(VERSION_INFO_API_COMPAT    41)
-set(VERSION_INFO_MINOR_VERSION 2)
+set(VERSION_INFO_MINOR_VERSION 3)
 set(VERSION_INFO_MAINT_VERSION 0)
 include(GrVersion) #setup version info
 
diff --git a/apps/grgsm_livemon b/apps/grgsm_livemon
index 1ec5ecb..3e818c5 100755
--- a/apps/grgsm_livemon
+++ b/apps/grgsm_livemon
@@ -25,7 +25,7 @@
 # Title: Gr-gsm Livemon
 # Author: Piotr Krysik
 # Description: 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)
-# Generated: Sun Aug 27 08:34:42 2017
+# Generated: Tue Jan 23 14:59:18 2018
 ##################################################
 
 if __name__ == '__main__':
@@ -54,14 +54,16 @@
 import sip
 import sys
 import time
+from gnuradio import qtgui
 
 
 class grgsm_livemon(gr.top_block, Qt.QWidget):
 
-    def __init__(self, args="", collector="localhost", collectorport="4729", fc=941.8e6, gain=30, osr=4, ppm=0, samp_rate=2000000.052982, serverport="4729", shiftoff=400e3):
+    def __init__(self, args="", collector='localhost', collectorport='4729', fc=941.8e6, gain=30, osr=4, ppm=0, samp_rate=2000000.052982, serverport='4729', shiftoff=400e3):
         gr.top_block.__init__(self, "Gr-gsm Livemon")
         Qt.QWidget.__init__(self)
         self.setWindowTitle("Gr-gsm Livemon")
+        qtgui.util.check_set_qss()
         try:
             self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
         except:
@@ -81,6 +83,7 @@
         self.settings = Qt.QSettings("GNU Radio", "grgsm_livemon")
         self.restoreGeometry(self.settings.value("geometry").toByteArray())
 
+
         ##################################################
         # Parameters
         ##################################################
@@ -99,20 +102,20 @@
         # Variables
         ##################################################
         self.ppm_slider = ppm_slider = ppm
-        self.g_slider = g_slider = gain
+        self.gain_slider = gain_slider = gain
         self.fc_slider = fc_slider = fc
 
         ##################################################
         # Blocks
         ##################################################
         self._ppm_slider_range = Range(-150, 150, 0.1, ppm, 100)
-        self._ppm_slider_win = RangeWidget(self._ppm_slider_range, self.set_ppm_slider, "PPM Offset", "counter", float)
+        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._gain_slider_range = Range(0, 100, 0.5, gain, 100)
+        self._gain_slider_win = RangeWidget(self._gain_slider_range, self.set_gain_slider, 'Gain', "counter", float)
+        self.top_layout.addWidget(self._gain_slider_win)
         self._fc_slider_range = Range(800e6, 1990e6, 2e5, fc, 100)
-        self._fc_slider_win = RangeWidget(self._fc_slider_range, self.set_fc_slider, "Frequency", "counter_slider", float)
+        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)
@@ -121,12 +124,12 @@
         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_gain(gain_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_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
@@ -137,20 +140,22 @@
         )
         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_y_label('Relative Gain', 'dB')
         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_axis_labels(True)
         self.qtgui_freq_sink_x_0.enable_control_panel(False)
-        
+
         if not True:
           self.qtgui_freq_sink_x_0.disable_legend()
-        
+
         if "complex" == "float" or "complex" == "msg_float":
           self.qtgui_freq_sink_x_0.set_plot_pos_half(not True)
-        
-        labels = ["", "", "", "", "",
-                  "", "", "", "", ""]
+
+        labels = ['', '', '', '', '',
+                  '', '', '', '', '']
         widths = [1, 1, 1, 1, 1,
                   1, 1, 1, 1, 1]
         colors = ["blue", "red", "green", "black", "cyan",
@@ -165,7 +170,7 @@
             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.gsm_sdcch8_demapper(
@@ -177,44 +182,45 @@
         self.gsm_input_0 = grgsm.gsm_input(
             ppm=ppm-int(ppm),
             osr=4,
-            fc=fc,
+            fc=fc_slider-shiftoff,
             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, samp_rate, osr)
+        self.gsm_clock_offset_control_0 = grgsm.clock_offset_control(fc_slider-shiftoff, samp_rate, osr)
         self.gsm_bcch_ccch_demapper_0 = grgsm.gsm_bcch_ccch_demapper(
             timeslot_nr=0,
         )
         self.blocks_socket_pdu_0_1 = blocks.socket_pdu("UDP_CLIENT", collector, collectorport, 1500, False)
-        self.blocks_socket_pdu_0_0 = blocks.socket_pdu("UDP_SERVER", "127.0.0.1", serverport, 10000, False)
+        self.blocks_socket_pdu_0_0 = blocks.socket_pdu("UDP_SERVER", '127.0.0.1', serverport, 10000, False)
         self.blocks_rotator_cc_0 = blocks.rotator_cc(-2*pi*shiftoff/samp_rate)
 
+
+
         ##################################################
         # Connections
         ##################################################
-        self.msg_connect((self.blocks_socket_pdu_0_0, 'pdus'), (self.gsm_message_printer_1, 'msgs'))    
-        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, 'ctrl'), (self.gsm_input_0, 'ctrl_in'))    
-        self.msg_connect((self.gsm_control_channels_decoder_0, 'msgs'), (self.blocks_socket_pdu_0_1, 'pdus'))    
-        self.msg_connect((self.gsm_control_channels_decoder_0_0, 'msgs'), (self.blocks_socket_pdu_0_1, 'pdus'))    
-        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))    
+        self.msg_connect((self.blocks_socket_pdu_0_0, 'pdus'), (self.gsm_message_printer_1, 'msgs'))
+        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, 'ctrl'), (self.gsm_input_0, 'ctrl_in'))
+        self.msg_connect((self.gsm_control_channels_decoder_0, 'msgs'), (self.blocks_socket_pdu_0_1, 'pdus'))
+        self.msg_connect((self.gsm_control_channels_decoder_0_0, 'msgs'), (self.blocks_socket_pdu_0_1, 'pdus'))
+        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_args(self):
         return self.args
 
@@ -239,14 +245,13 @@
     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)
+        self.set_gain_slider(self.gain)
 
     def get_osr(self):
         return self.osr
@@ -267,10 +272,10 @@
 
     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)
+        self.qtgui_freq_sink_x_0.set_frequency_range(self.fc_slider, self.samp_rate)
+        self.gsm_input_0.set_samp_rate_in(self.samp_rate)
+        self.blocks_rotator_cc_0.set_phase_inc(-2*pi*self.shiftoff/self.samp_rate)
 
     def get_serverport(self):
         return self.serverport
@@ -283,9 +288,11 @@
 
     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)
+        self.gsm_input_0.set_fc(self.fc_slider-self.shiftoff)
+        self.gsm_clock_offset_control_0.set_fc(self.fc_slider-self.shiftoff)
+        self.blocks_rotator_cc_0.set_phase_inc(-2*pi*self.shiftoff/self.samp_rate)
 
     def get_ppm_slider(self):
         return self.ppm_slider
@@ -294,32 +301,35 @@
         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 get_gain_slider(self):
+        return self.gain_slider
 
-    def set_g_slider(self, g_slider):
-        self.g_slider = g_slider
-        self.rtlsdr_source_0.set_gain(self.g_slider, 0)
+    def set_gain_slider(self, gain_slider):
+        self.gain_slider = gain_slider
+        self.rtlsdr_source_0.set_gain(self.gain_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)
+        self.qtgui_freq_sink_x_0.set_frequency_range(self.fc_slider, self.samp_rate)
+        self.gsm_input_0.set_fc(self.fc_slider-self.shiftoff)
+        self.gsm_clock_offset_control_0.set_fc(self.fc_slider-self.shiftoff)
 
 
 def argument_parser():
-    parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
+    description = '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)'
+    parser = OptionParser(usage="%prog: [options]", option_class=eng_option, description=description)
     parser.add_option(
         "", "--args", dest="args", type="string", default="",
         help="Set Device Arguments [default=%default]")
     parser.add_option(
-        "", "--collector", dest="collector", type="string", default="localhost",
+        "", "--collector", dest="collector", type="string", default='localhost',
         help="Set IP or DNS name of collector point [default=%default]")
     parser.add_option(
-        "", "--collectorport", dest="collectorport", type="string", default="4729",
+        "", "--collectorport", dest="collectorport", type="string", default='4729',
         help="Set UDP port number of collector [default=%default]")
     parser.add_option(
         "-f", "--fc", dest="fc", type="eng_float", default=eng_notation.num_to_str(941.8e6),
@@ -337,7 +347,7 @@
         "-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(
-        "", "--serverport", dest="serverport", type="string", default="4729",
+        "", "--serverport", dest="serverport", type="string", default='4729',
         help="Set UDP server listening port [default=%default]")
     parser.add_option(
         "-o", "--shiftoff", dest="shiftoff", type="eng_float", default=eng_notation.num_to_str(400e3),
diff --git a/apps/grgsm_livemon.grc b/apps/grgsm_livemon.grc
index 1b80a19..3d2236d 100644
--- a/apps/grgsm_livemon.grc
+++ b/apps/grgsm_livemon.grc
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='utf-8'?>
-<?grc format='1' created='3.7.9'?>
+<?grc format='1' created='3.7.12'?>
 <flow_graph>
   <timestamp>Sat Dec 13 10:49:59 2014</timestamp>
   <block>
@@ -73,6 +73,10 @@
       <value>True</value>
     </param>
     <param>
+      <key>sizing_mode</key>
+      <value>fixed</value>
+    </param>
+    <param>
       <key>thread_safe_setters</key>
       <value></value>
     </param>
@@ -80,6 +84,10 @@
       <key>title</key>
       <value>Gr-gsm Livemon</value>
     </param>
+    <param>
+      <key>placement</key>
+      <value>(0,0)</value>
+    </param>
   </block>
   <block>
     <key>variable_qtgui_range</key>
@@ -196,7 +204,7 @@
     </param>
     <param>
       <key>stop</key>
-      <value>50</value>
+      <value>100</value>
     </param>
     <param>
       <key>rangeType</key>
@@ -305,6 +313,10 @@
       <value></value>
     </param>
     <param>
+      <key>hide</key>
+      <value>none</value>
+    </param>
+    <param>
       <key>type</key>
       <value>string</value>
     </param>
@@ -509,6 +521,10 @@
       <value></value>
     </param>
     <param>
+      <key>hide</key>
+      <value>none</value>
+    </param>
+    <param>
       <key>type</key>
       <value>string</value>
     </param>
@@ -552,6 +568,10 @@
       <value></value>
     </param>
     <param>
+      <key>hide</key>
+      <value>none</value>
+    </param>
+    <param>
       <key>type</key>
       <value>string</value>
     </param>
@@ -595,6 +615,10 @@
       <value>f</value>
     </param>
     <param>
+      <key>hide</key>
+      <value>none</value>
+    </param>
+    <param>
       <key>type</key>
       <value>eng_float</value>
     </param>
@@ -638,6 +662,10 @@
       <value>g</value>
     </param>
     <param>
+      <key>hide</key>
+      <value>none</value>
+    </param>
+    <param>
       <key>type</key>
       <value>eng_float</value>
     </param>
@@ -733,7 +761,7 @@
     </param>
     <param>
       <key>fc</key>
-      <value>fc-shiftoff</value>
+      <value>fc_slider-shiftoff</value>
     </param>
     <param>
       <key>samp_rate</key>
@@ -909,7 +937,7 @@
     </param>
     <param>
       <key>fc</key>
-      <value>fc</value>
+      <value>fc_slider-shiftoff</value>
     </param>
     <param>
       <key>ppm</key>
@@ -975,7 +1003,7 @@
     </param>
     <param>
       <key>cell_allocation</key>
-      <value>[0]</value>
+      <value>[arfcn.downlink2arfcn(fc)]</value>
     </param>
     <param>
       <key>comment</key>
@@ -1097,6 +1125,37 @@
     </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, 60)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>import_1</value>
+    </param>
+    <param>
+      <key>import</key>
+      <value>from grgsm import arfcn</value>
+    </param>
+  </block>
+  <block>
     <key>parameter</key>
     <param>
       <key>alias</key>
@@ -1131,6 +1190,10 @@
       <value></value>
     </param>
     <param>
+      <key>hide</key>
+      <value>none</value>
+    </param>
+    <param>
       <key>type</key>
       <value>intx</value>
     </param>
@@ -1174,6 +1237,10 @@
       <value>p</value>
     </param>
     <param>
+      <key>hide</key>
+      <value>none</value>
+    </param>
+    <param>
       <key>type</key>
       <value>eng_float</value>
     </param>
@@ -1193,6 +1260,10 @@
       <value>1.0</value>
     </param>
     <param>
+      <key>axislabels</key>
+      <value>True</value>
+    </param>
+    <param>
       <key>bw</key>
       <value>samp_rate</value>
     </param>
@@ -1461,6 +1532,10 @@
       <value>firdes.WIN_BLACKMAN_hARRIS</value>
     </param>
     <param>
+      <key>label</key>
+      <value>Relative Gain</value>
+    </param>
+    <param>
       <key>ymax</key>
       <value>10</value>
     </param>
@@ -1468,6 +1543,10 @@
       <key>ymin</key>
       <value>-140</value>
     </param>
+    <param>
+      <key>units</key>
+      <value>dB</value>
+    </param>
   </block>
   <block>
     <key>rtlsdr_source</key>
@@ -2911,6 +2990,10 @@
       <value>s</value>
     </param>
     <param>
+      <key>hide</key>
+      <value>none</value>
+    </param>
+    <param>
       <key>type</key>
       <value>eng_float</value>
     </param>
@@ -2954,6 +3037,10 @@
       <value></value>
     </param>
     <param>
+      <key>hide</key>
+      <value>none</value>
+    </param>
+    <param>
       <key>type</key>
       <value>string</value>
     </param>
@@ -2997,6 +3084,10 @@
       <value>o</value>
     </param>
     <param>
+      <key>hide</key>
+      <value>none</value>
+    </param>
+    <param>
       <key>type</key>
       <value>eng_float</value>
     </param>
diff --git a/apps/grgsm_livemon_headless b/apps/grgsm_livemon_headless
old mode 100644
new mode 100755
diff --git a/grc/receiver/gsm_clock_offset_control.xml b/grc/receiver/gsm_clock_offset_control.xml
index 17378ea..c5a932a 100644
--- a/grc/receiver/gsm_clock_offset_control.xml
+++ b/grc/receiver/gsm_clock_offset_control.xml
@@ -4,7 +4,7 @@
   <key>gsm_clock_offset_control</key>
   <import>import grgsm</import>
   <make>grgsm.clock_offset_control($fc, $samp_rate, $osr)</make>
-  <callback></callback>
+  <callback>set_fc($fc)</callback>
   <param>
     <name>fc</name>
     <key>fc</key>
diff --git a/include/grgsm/misc_utils/extract_cmc.h b/include/grgsm/misc_utils/extract_cmc.h
index 2b07bbe..82bd729 100644
--- a/include/grgsm/misc_utils/extract_cmc.h
+++ b/include/grgsm/misc_utils/extract_cmc.h
@@ -53,6 +53,7 @@
       virtual std::vector<int> get_framenumbers() = 0;
       virtual std::vector<int> get_a5_versions() = 0;
       virtual std::vector<int> get_start_ciphering() = 0;
+      virtual std::vector<int> get_assignment_commands() = 0;
     };
 
   } // namespace gsm
diff --git a/lib/misc_utils/extract_cmc_impl.cc b/lib/misc_utils/extract_cmc_impl.cc
index 16f2f6b..c28e49f 100644
--- a/lib/misc_utils/extract_cmc_impl.cc
+++ b/lib/misc_utils/extract_cmc_impl.cc
@@ -40,7 +40,7 @@
         gsmtap_hdr * header = (gsmtap_hdr *)message_plus_header;
         uint8_t * msg_elements = (uint8_t *)(message_plus_header+sizeof(gsmtap_hdr));
 
-        if((msg_elements[3] & 0xF) == 0x6 && msg_elements[4] == 0x35)
+        if((msg_elements[3] & 0xFF) == 0x06 && msg_elements[4] == 0x35)
         {
 
             int frame_nr = be32toh(header->frame_number);
@@ -50,6 +50,11 @@
             d_framenumbers.push_back(frame_nr);
             d_a5_versions.push_back(a5_version);
         }
+        if((msg_elements[3] & 0xFF) == 0x06 && msg_elements[4] == 0x2e)
+        {
+            int frame_nr = be32toh(header->frame_number);
+            d_assignment_commands.push_back(frame_nr);
+        }
     }
     
     std::vector<int> extract_cmc_impl::get_framenumbers()
@@ -67,6 +72,11 @@
         return d_start_ciphering;
     }
     
+    std::vector<int> extract_cmc_impl::get_assignment_commands()
+    {
+        return d_assignment_commands;
+    }
+    
     extract_cmc::sptr
     extract_cmc::make()
     {
diff --git a/lib/misc_utils/extract_cmc_impl.h b/lib/misc_utils/extract_cmc_impl.h
index b62cadc..1dd02cb 100644
--- a/lib/misc_utils/extract_cmc_impl.h
+++ b/lib/misc_utils/extract_cmc_impl.h
@@ -35,10 +35,12 @@
       std::vector<int> d_framenumbers;
       std::vector<int> d_a5_versions;
       std::vector<int> d_start_ciphering;
+      std::vector<int> d_assignment_commands;
      public:
       virtual std::vector<int> get_framenumbers();
       virtual std::vector<int> get_a5_versions();
       virtual std::vector<int> get_start_ciphering();
+      virtual std::vector<int> get_assignment_commands();
       extract_cmc_impl();
       ~extract_cmc_impl();
     };
diff --git a/tests/dockerfiles/Debian_Jessie.docker b/tests/dockerfiles/Debian_Jessie.docker
deleted file mode 100644
index 1252314..0000000
--- a/tests/dockerfiles/Debian_Jessie.docker
+++ /dev/null
@@ -1,34 +0,0 @@
-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 \
-    python-docutils \
-    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
index 26d67d6..9cdd389 100644
--- a/tests/dockerfiles/Debian_testing.docker
+++ b/tests/dockerfiles/Debian_testing.docker
@@ -1,5 +1,5 @@
 FROM debian:testing
-MAINTAINER Ash Wilson
+MAINTAINER Piotr Krysik
 
 RUN apt-get update && apt-get install -y \
     cmake \
@@ -24,4 +24,5 @@
 RUN cmake .. && \
     make && \
     make install && \
-    ldconfig
+    ldconfig && \
+    make test
diff --git a/tests/dockerfiles/Debian_testing_package.docker b/tests/dockerfiles/Debian_testing_package.docker
new file mode 100644
index 0000000..35d31cd
--- /dev/null
+++ b/tests/dockerfiles/Debian_testing_package.docker
@@ -0,0 +1,10 @@
+FROM debian:testing
+MAINTAINER Piotr Krysik
+
+RUN apt-get update && apt-get install -y \
+    gr-gsm
+
+COPY ./ /src/
+RUN ls /src
+
+
diff --git a/tests/dockerfiles/Ubuntu_16_04_debbuild.docker b/tests/dockerfiles/Kali.docker
similarity index 69%
rename from tests/dockerfiles/Ubuntu_16_04_debbuild.docker
rename to tests/dockerfiles/Kali.docker
index 030ece8..5442f33 100644
--- a/tests/dockerfiles/Ubuntu_16_04_debbuild.docker
+++ b/tests/dockerfiles/Kali.docker
@@ -1,11 +1,12 @@
-FROM ubuntu:16.04
-MAINTAINER Ash Wilson
+FROM kalilinux/kali-linux-docker
+MAINTAINER Piotr Krysik
 
 RUN apt-get update && apt-get install -y \
     cmake \
     autoconf \
     libtool \
     build-essential \
+    python-docutils \
     libcppunit-dev \
     swig \
     doxygen \
@@ -21,7 +22,7 @@
 RUN mkdir /src/build
 WORKDIR /src/build
 RUN cmake .. && \
-    make package && \
-    cpack -G DEB && \
-    ls
-
+    make && \
+    make install && \
+    ldconfig && \
+    make test
diff --git a/tests/dockerfiles/Ubuntu_15_04.docker b/tests/dockerfiles/Ubuntu_15_04.docker
deleted file mode 100644
index 973b624..0000000
--- a/tests/dockerfiles/Ubuntu_15_04.docker
+++ /dev/null
@@ -1,80 +0,0 @@
-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 \
-    python-docutils \
-    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
index e0ccbea..e56b87f 100644
--- a/tests/dockerfiles/Ubuntu_16_04.docker
+++ b/tests/dockerfiles/Ubuntu_16_04.docker
@@ -1,5 +1,5 @@
 FROM ubuntu:16.04
-MAINTAINER Ash Wilson
+MAINTAINER Piotr Krysik
 
 RUN apt-get update && apt-get install -y \
     cmake \
@@ -24,4 +24,5 @@
 RUN cmake .. && \
     make && \
     make install && \
-    ldconfig
+    ldconfig && \
+    make test
diff --git a/tests/dockerfiles/Ubuntu_16_04_debinstall.docker b/tests/dockerfiles/Ubuntu_16_04_debinstall.docker
deleted file mode 100644
index 0a476ce..0000000
--- a/tests/dockerfiles/Ubuntu_16_04_debinstall.docker
+++ /dev/null
@@ -1,13 +0,0 @@
-FROM ubuntu:16.04
-MAINTAINER Ash Wilson
-
-RUN apt-get update && apt-get install -y \
-    software-properties-common
-
-RUN add-apt-repository -y ppa:ptrkrysik/gr-gsm
-
-RUN apt-get update && apt-get install -y \
-    gr-gsm
-
-COPY ./ /src/
-RUN ls /src