Big change of the universal control channels demapper:
-simplification of the universal demapper,
-addition of hierarhical blocks for each of the demappers - so they also look well and readable in python,
-addition of helper script for compilation of the demappers.
diff --git a/apps/grgsm_decode b/apps/grgsm_decode
index 4be199d..8f412bf 100755
--- a/apps/grgsm_decode
+++ b/apps/grgsm_decode
@@ -88,17 +88,11 @@
             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]))
+            self.bcch_demapper = grgsm.gsm_bcch_ccch_demapper(self.timeslot)
         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]))
+            self.bcch_sdcch4_demapper = grgsm.gsm_bcch_ccch_sdcch4_demapper(self.timeslot)
         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]))
+            self.sdcch8_demapper = grgsm.gsm_sdcch8_demapper(self.timeslot)
         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)
diff --git a/apps/grgsm_livemon b/apps/grgsm_livemon
index 6c58e08..1d37970 100755
--- a/apps/grgsm_livemon
+++ b/apps/grgsm_livemon
@@ -140,7 +140,7 @@
         
         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_sdcch8_demapper_0 = grgsm.gsm_sdcch8_demapper(1)
         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(
@@ -153,7 +153,7 @@
         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.gsm_bcch_ccch_demapper_0 = grgsm.gsm_bcch_ccch_demapper(0)
         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)
diff --git a/apps/grgsm_scanner b/apps/grgsm_scanner
index 94bba43..ebfdb7a 100755
--- a/apps/grgsm_scanner
+++ b/apps/grgsm_scanner
@@ -77,7 +77,7 @@
         )
         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]))
+        self.gsm_bcch_ccch_demapper_0 = grgsm.gsm_bcch_ccch_demapper(0)
 
         ##################################################
         # Connections
diff --git a/grc/demapping/gsm_bcch_ccch_demapper.xml b/grc/demapping/gsm_bcch_ccch_demapper.xml
index b295ce1..ff392f1 100644
--- a/grc/demapping/gsm_bcch_ccch_demapper.xml
+++ b/grc/demapping/gsm_bcch_ccch_demapper.xml
@@ -1,61 +1,30 @@
-<?xml version="1.0"?>
 <block>
   <name>BCCH + CCCH demapper</name>
   <key>gsm_bcch_ccch_demapper</key>
+  <category></category>
   <import>import grgsm</import>
-  <make>grgsm.universal_ctrl_chans_demapper($timeslot_nr, $downlink_starts_fn_mod51, $downlink_channel_types, $uplink_starts_fn_mod51, $uplink_channel_types)</make>
-
+  <make>grgsm.gsm_bcch_ccch_demapper(
+    timeslot_nr=$timeslot_nr,
+)</make>
+  <callback>set_timeslot_nr($timeslot_nr)</callback>
   <param>
-    <name>Timeslot</name>
+    <name>timeslot_nr</name>
     <key>timeslot_nr</key>
     <value>0</value>
-    <type>int</type>
-    <hide>none</hide>
+    <type>raw</type>
   </param>
-
-  <param>
-    <name>downlink_starts_fn_mod51</name>
-    <key>downlink_starts_fn_mod51</key>
-    <value>[2,6,12,16,22,26,32,36,42,46]</value>
-    <type>int_vector</type>
-    <hide>all</hide>
-  </param>
-
-  <param>
-    <name>downlink_channel_types</name>
-    <key>downlink_channel_types</key>
-    <value>[1,2,2,2,2,2,2,2,2,2]</value>
-    <type>int_vector</type>
-    <hide>all</hide>
-  </param>
-
-  <param>
-    <name>uplink_starts_fn_mod51</name>
-    <key>uplink_starts_fn_mod51</key>
-    <value>[]</value>
-    <type>int_vector</type>
-    <hide>all</hide>
-  </param>
-
-  <param>
-    <name>uplink_channel_types</name>
-    <key>uplink_channel_types</key>
-    <value>[]</value>
-    <type>int_vector</type>
-    <hide>all</hide>
-  </param>
-
   <sink>
     <name>bursts</name>
     <type>message</type>
+    <optional>1</optional>
   </sink>
   <source>
     <name>bursts</name>
     <type>message</type>
+    <optional>1</optional>
   </source>
-  
-  <doc>
-      Demapper for BCCH + CCCH control channels.
-      This corresponds to channel combination iv specified in GSM 05.02, section 6.4
-  </doc>
-</block> 
+  <doc>Piotr Krysik
+Demapper for BCCH + CCCH control channels. This corresponds to channel combination iv specified in GSM 05.02, section 6.4
+</doc>
+  <grc_source>gr-gsm/hier_blocks/demapping/gsm_bcch_ccch_demapper.grc</grc_source>
+</block>
diff --git a/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml b/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml
index 90b33ce..94a433e 100644
--- a/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml
+++ b/grc/demapping/gsm_bcch_ccch_sdcch4_demapper.xml
@@ -1,62 +1,30 @@
-<?xml version="1.0"?>
 <block>
   <name>BCCH + CCCH + SDCCH/4 demapper</name>
   <key>gsm_bcch_ccch_sdcch4_demapper</key>
+  <category></category>
   <import>import grgsm</import>
-  <make>grgsm.universal_ctrl_chans_demapper($timeslot_nr, $downlink_starts_fn_mod51, $downlink_channel_types, $uplink_starts_fn_mod51, $uplink_channel_types)</make>
-
+  <make>grgsm.gsm_bcch_ccch_sdcch4_demapper(
+    timeslot_nr=$timeslot_nr,
+)</make>
+  <callback>set_timeslot_nr($timeslot_nr)</callback>
   <param>
-    <name>Timeslot</name>
+    <name>timeslot_nr</name>
     <key>timeslot_nr</key>
     <value>0</value>
-    <type>int</type>
-    <hide>none</hide>
+    <type>raw</type>
   </param>
-
-  <param>
-    <name>downlink_starts_fn_mod51</name>
-    <key>downlink_starts_fn_mod51</key>
-    <value>[2,6,12,16,22,26,32,36,42,46]</value>
-    <type>int_vector</type>
-    <hide>all</hide>
-  </param>
-
-  <param>
-    <name>downlink_channel_types</name>
-    <key>downlink_channel_types</key>
-    <value>[1,2,2,2,7,7,7,7,135,135]</value>
-    <type>int_vector</type>
-    <hide>all</hide>
-  </param>
-
-  <param>
-    <name>uplink_starts_fn_mod51</name>
-    <key>uplink_starts_fn_mod51</key>
-    <value>[0,6,10,37,41,47]</value>
-    <type>int_vector</type>
-    <hide>all</hide>
-  </param>
-
-  <param>
-    <name>uplink_channel_types</name>
-    <key>uplink_channel_types</key>
-    <value>[7,135,135,7,7,7]</value>
-    <type>int_vector</type>
-    <hide>all</hide>
-  </param>
-
   <sink>
     <name>bursts</name>
     <type>message</type>
+    <optional>1</optional>
   </sink>
   <source>
     <name>bursts</name>
     <type>message</type>
+    <optional>1</optional>
   </source>
-  
-  <doc>
-      Demapper for BCCH + CCCH + SDCCH/4 + SACCH/C4 control channels.
-      This corresponds to channel combination v specified in GSM 05.02, section 6.4
-  </doc>
-</block> 
- 
+  <doc>Piotr Krysik
+Demapper for BCCH + CCCH + SDCCH/4 + SACCH/C4 control channels. This corresponds to channel combination v specified in GSM 05.02, section 6.4
+</doc>
+  <grc_source>gr-gsm/hier_blocks/demapping/gsm_bcch_ccch_sdcch4_demapper.grc</grc_source>
+</block>
diff --git a/grc/demapping/gsm_sdcch8_demapper.xml b/grc/demapping/gsm_sdcch8_demapper.xml
index c81032a..7507065 100644
--- a/grc/demapping/gsm_sdcch8_demapper.xml
+++ b/grc/demapping/gsm_sdcch8_demapper.xml
@@ -1,61 +1,30 @@
-<?xml version="1.0"?>
 <block>
   <name>SDCCH/8 demapper</name>
   <key>gsm_sdcch8_demapper</key>
+  <category></category>
   <import>import grgsm</import>
-  <make>grgsm.universal_ctrl_chans_demapper($timeslot_nr, $downlink_starts_fn_mod51, $downlink_channel_types, $uplink_starts_fn_mod51, $uplink_channel_types)</make>
-
+  <make>grgsm.gsm_sdcch8_demapper(
+    timeslot_nr=$timeslot_nr,
+)</make>
+  <callback>set_timeslot_nr($timeslot_nr)</callback>
   <param>
-    <name>Timeslot</name>
+    <name>timeslot_nr</name>
     <key>timeslot_nr</key>
     <value>1</value>
-    <type>int</type>
-    <hide>none</hide>
+    <type>raw</type>
   </param>
-
-  <param>
-    <name>downlink_starts_fn_mod51</name>
-    <key>downlink_starts_fn_mod51</key>
-    <value>[0,4,8,12,16,20,24,28,32,36,40,44]</value>
-    <type>int_vector</type>
-    <hide>all</hide>
-  </param>
-
-  <param>
-    <name>downlink_channel_types</name>
-    <key>downlink_channel_types</key>
-    <value>[8,8,8,8,8,8,8,8,136,136,136,136]</value>
-    <type>int_vector</type>
-    <hide>all</hide>
-  </param>
-
-  <param>
-    <name>uplink_starts_fn_mod51</name>
-    <key>uplink_starts_fn_mod51</key>
-    <value>[15,19,23,27,31,35,39,43,47,0,4,8]</value>
-    <type>int_vector</type>
-    <hide>all</hide>
-  </param>
-
-  <param>
-    <name>uplink_channel_types</name>
-    <key>uplink_channel_types</key>
-    <value>[8,8,8,8,8,8,8,8,136,136,136,136]</value>
-    <type>int_vector</type>
-    <hide>all</hide>
-  </param>
-
   <sink>
     <name>bursts</name>
     <type>message</type>
+    <optional>1</optional>
   </sink>
   <source>
     <name>bursts</name>
     <type>message</type>
+    <optional>1</optional>
   </source>
-  
-  <doc>
-      Demapper for SDCCH/8 + SACCH/C8 control channels.
-      This corresponds to channel combination vii specified in GSM 05.02, section 6.4
-  </doc>
+  <doc>Piotr Krysik
+Demapper for SDCCH/8 + SACCH/C8 control channels. This corresponds to channel combination vii specified in GSM 05.02, section 6.4
+</doc>
+  <grc_source>gr-gsm/hier_blocks/demapping/gsm_sdcch8_demapper.grc</grc_source>
 </block>
diff --git a/grc/demapping/gsm_universal_ctrl_chans_demapper.xml b/grc/demapping/gsm_universal_ctrl_chans_demapper.xml
index 3b522be..f173752 100644
--- a/grc/demapping/gsm_universal_ctrl_chans_demapper.xml
+++ b/grc/demapping/gsm_universal_ctrl_chans_demapper.xml
@@ -3,7 +3,7 @@
   <name>Universal ctrl chans demapper</name>
   <key>gsm_universal_ctrl_chans_demapper</key>
   <import>import grgsm</import>
-  <make>grgsm.universal_ctrl_chans_demapper($timeslot_nr, $downlink_starts_fn_mod51, $downlink_channel_types, $uplink_starts_fn_mod51, $uplink_channel_types)</make>
+  <make>grgsm.universal_ctrl_chans_demapper($timeslot_nr, $downlink_starts_fn_mod51, $downlink_channel_types, $downlink_subslots, $uplink_starts_fn_mod51, $uplink_channel_types, $uplink_subslots)</make>
 
   <param>
     <name>timeslot_nr</name>
@@ -16,7 +16,7 @@
   <param>
     <name>downlink_starts_fn_mod51</name>
     <key>downlink_starts_fn_mod51</key>
-    <value>[2,6,12,16,22,26,32,36,42,46]</value>
+    <value>[0,0,2,2,2,2,6,6,6,6,0,0,12,12,12,12,16,16,16,16,0,0,22,22,22,22,26,26,26,26,0,0,32,32,32,32,36,36,36,36,0,0,42,42,42,42,46,46,46,46,0,]</value>
     <type>int_vector</type>
     <hide>part</hide>
   </param>
@@ -24,7 +24,15 @@
   <param>
     <name>downlink_channel_types</name>
     <key>downlink_channel_types</key>
-    <value>[1,2,2,2,2,2,2,2,2,2]</value>
+    <value>[0,0,1,1,1,1,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,]</value>
+    <type>int_vector</type>
+    <hide>part</hide>
+  </param>
+
+  <param>
+    <name>downlink_subslots</name>
+    <key>downlink_subslots</key>
+    <value>[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,]</value>
     <type>int_vector</type>
     <hide>part</hide>
   </param>
@@ -32,7 +40,7 @@
   <param>
     <name>uplink_starts_fn_mod51</name>
     <key>uplink_starts_fn_mod51</key>
-    <value>[0,6,10,37,41,47]</value>
+    <value>[0,0,0,0,0,0,6,6,6,6,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,41,41,41,41,0,0,47,47,47,47]</value>
     <type>int_vector</type>
     <hide>part</hide>
   </param>
@@ -40,10 +48,18 @@
   <param>
     <name>uplink_channel_types</name>
     <key>uplink_channel_types</key>
-    <value>[2,2,2,2,2,2]</value>
+    <value>[2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,]</value>
     <type>int_vector</type>
     <hide>part</hide>
   </param>
+  
+  <param>
+    <name>uplink_subslots</name>
+    <key>uplink_subslots</key>
+    <value>[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,]</value>
+    <type>int_vector</type>
+    <hide>part</hide>
+  </param>  
 
   <sink>
     <name>bursts</name>
@@ -55,5 +71,6 @@
   </source>
   <doc>
       Universal demapper for control channels.
+      Author: Piotr Krysik      
   </doc>
 </block>
diff --git a/hier_blocks/compile_demappers b/hier_blocks/compile_demappers
new file mode 100755
index 0000000..96d652b
--- /dev/null
+++ b/hier_blocks/compile_demappers
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+#This is just helper script for manual compilation of hierarhical blocks
+#by gr-gsm developers
+#Author: Piotr Krysik
+
+cd demapping
+for p in *.grc
+do
+    echo $p
+    grcc $p -d `pwd`
+done
+cd ..
+
+mv ~/.grc_gnuradio/gsm_* .
+
+for file in *.py.xml
+do
+    cat $file | sed 's/.*\<import\>.*/  <import>import grgsm<\/import>/' \
+              | sed 's/<make>/<make>grgsm./' \
+              | sed "s/.*.py//" \
+              | sed 's/<grc_source>.*hier_blocks/<grc_source>gr-gsm\/hier_blocks/' \
+              > ${file}2
+
+    mv ${file}2 $file
+
+    mv "$file" "`basename $file .py.xml`.xml"
+done
+
+for py in *.py
+do
+    cat $py |sed 's/gr.hier_block2/grgsm.hier_block/' > ${py}2
+    mv ${py}2 $py
+done
+
+mv *.py ../python/demapping
+mv *.xml ../grc/demapping
\ No newline at end of file
diff --git a/hier_blocks/demapping/gsm_bcch_ccch_demapper.grc b/hier_blocks/demapping/gsm_bcch_ccch_demapper.grc
new file mode 100644
index 0000000..faef3dd
--- /dev/null
+++ b/hier_blocks/demapping/gsm_bcch_ccch_demapper.grc
@@ -0,0 +1,292 @@
+<?xml version='1.0' encoding='utf-8'?>
+<?grc format='1' created='3.7.9'?>
+<flow_graph>
+  <timestamp>Tue May 17 17:08:42 2016</timestamp>
+  <block>
+    <key>options</key>
+    <param>
+      <key>author</key>
+      <value>Piotr Krysik</value>
+    </param>
+    <param>
+      <key>window_size</key>
+      <value></value>
+    </param>
+    <param>
+      <key>category</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>description</key>
+      <value>Demapper for BCCH + CCCH control channels. This corresponds to channel combination iv specified in GSM 05.02, section 6.4</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(8, 8)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>generate_options</key>
+      <value>hb</value>
+    </param>
+    <param>
+      <key>hier_block_src_path</key>
+      <value>.:</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>gsm_bcch_ccch_demapper</value>
+    </param>
+    <param>
+      <key>max_nouts</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>qt_qss_theme</key>
+      <value></value>
+    </param>
+    <param>
+      <key>realtime_scheduling</key>
+      <value></value>
+    </param>
+    <param>
+      <key>run_command</key>
+      <value>{python} -u {filename}</value>
+    </param>
+    <param>
+      <key>run_options</key>
+      <value>prompt</value>
+    </param>
+    <param>
+      <key>run</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>thread_safe_setters</key>
+      <value></value>
+    </param>
+    <param>
+      <key>title</key>
+      <value>BCCH + CCCH demapper</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>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(168, 193)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>gsm_universal_ctrl_chans_demapper_0</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>downlink_channel_types</key>
+      <value>[0,0,1,1,1,1,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,]</value>
+    </param>
+    <param>
+      <key>downlink_starts_fn_mod51</key>
+      <value>[0,0,2,2,2,2,6,6,6,6,0,0,12,12,12,12,16,16,16,16,0,0,22,22,22,22,26,26,26,26,0,0,32,32,32,32,36,36,36,36,0,0,42,42,42,42,46,46,46,46,0,]</value>
+    </param>
+    <param>
+      <key>downlink_subslots</key>
+      <value>[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,]</value>
+    </param>
+    <param>
+      <key>timeslot_nr</key>
+      <value>timeslot_nr</value>
+    </param>
+    <param>
+      <key>uplink_channel_types</key>
+      <value>[2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,]</value>
+    </param>
+    <param>
+      <key>uplink_starts_fn_mod51</key>
+      <value>[0,0,0,0,0,0,6,6,6,6,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,41,41,41,41,0,0,47,47,47,47]</value>
+    </param>
+    <param>
+      <key>uplink_subslots</key>
+      <value>[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,]</value>
+    </param>
+  </block>
+  <block>
+    <key>pad_sink</key>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(424, 188)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>pad_sink_0</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>message</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>bursts</value>
+    </param>
+    <param>
+      <key>num_streams</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>optional</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>vlen</key>
+      <value>1</value>
+    </param>
+  </block>
+  <block>
+    <key>pad_source</key>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(32, 188)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>pad_source_0</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>bursts</value>
+    </param>
+    <param>
+      <key>num_streams</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>optional</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>message</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>(192, 7)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>timeslot_nr</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>timeslot_nr</value>
+    </param>
+    <param>
+      <key>short_id</key>
+      <value></value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>intx</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>0</value>
+    </param>
+  </block>
+  <connection>
+    <source_block_id>gsm_universal_ctrl_chans_demapper_0</source_block_id>
+    <sink_block_id>pad_sink_0</sink_block_id>
+    <source_key>bursts</source_key>
+    <sink_key>in</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>pad_source_0</source_block_id>
+    <sink_block_id>gsm_universal_ctrl_chans_demapper_0</sink_block_id>
+    <source_key>out</source_key>
+    <sink_key>bursts</sink_key>
+  </connection>
+</flow_graph>
diff --git a/hier_blocks/demapping/gsm_bcch_ccch_sdcch4_demapper.grc b/hier_blocks/demapping/gsm_bcch_ccch_sdcch4_demapper.grc
new file mode 100644
index 0000000..ad5c751
--- /dev/null
+++ b/hier_blocks/demapping/gsm_bcch_ccch_sdcch4_demapper.grc
@@ -0,0 +1,292 @@
+<?xml version='1.0' encoding='utf-8'?>
+<?grc format='1' created='3.7.9'?>
+<flow_graph>
+  <timestamp>Tue May 17 17:08:42 2016</timestamp>
+  <block>
+    <key>options</key>
+    <param>
+      <key>author</key>
+      <value>Piotr Krysik</value>
+    </param>
+    <param>
+      <key>window_size</key>
+      <value></value>
+    </param>
+    <param>
+      <key>category</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>description</key>
+      <value>Demapper for BCCH + CCCH + SDCCH/4 + SACCH/C4 control channels. This corresponds to channel combination v specified in GSM 05.02, section 6.4</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(8, 8)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>generate_options</key>
+      <value>hb</value>
+    </param>
+    <param>
+      <key>hier_block_src_path</key>
+      <value>.:</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>gsm_bcch_ccch_sdcch4_demapper</value>
+    </param>
+    <param>
+      <key>max_nouts</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>qt_qss_theme</key>
+      <value></value>
+    </param>
+    <param>
+      <key>realtime_scheduling</key>
+      <value></value>
+    </param>
+    <param>
+      <key>run_command</key>
+      <value>{python} -u {filename}</value>
+    </param>
+    <param>
+      <key>run_options</key>
+      <value>prompt</value>
+    </param>
+    <param>
+      <key>run</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>thread_safe_setters</key>
+      <value></value>
+    </param>
+    <param>
+      <key>title</key>
+      <value>BCCH + CCCH + SDCCH/4 demapper</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>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(168, 193)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>gsm_universal_ctrl_chans_demapper_0</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>downlink_channel_types</key>
+      <value>[0,0,1,1,1,1,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,7,7,7,7,7,7,7,7,0,0,7,7,7,7,7,7,7,7,0,0,135,135,135,135,135,135,135,135,0]</value>
+    </param>
+    <param>
+      <key>downlink_starts_fn_mod51</key>
+      <value>[0,0,2,2,2,2,6,6,6,6,0,0,12,12,12,12,16,16,16,16,0,0,22,22,22,22,26,26,26,26,0,0,32,32,32,32,36,36,36,36,0,0,42,42,42,42,46,46,46,46,0,]</value>
+    </param>
+    <param>
+      <key>downlink_subslots</key>
+      <value>[0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,0,0,0,0,1,1,1,1,0,0,2,2,2,2,3,3,3,3,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,0,0,0,0,1,1,1,1,0,0,2,2,2,2,3,3,3,3,0,0,2,2,2,2,3,3,3,3,0,]</value>
+    </param>
+    <param>
+      <key>timeslot_nr</key>
+      <value>timeslot_nr</value>
+    </param>
+    <param>
+      <key>uplink_channel_types</key>
+      <value>[7,7,7,7,0,0,135,135,135,135,135,135,135,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,0,0,7,7,7,7,]</value>
+    </param>
+    <param>
+      <key>uplink_starts_fn_mod51</key>
+      <value>[0,0,0,0,0,0,6,6,6,6,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,41,41,41,41,0,0,47,47,47,47,]</value>
+    </param>
+    <param>
+      <key>uplink_subslots</key>
+      <value>[0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,3,3,3,3,0,0,0,0,0,0,2,2,2,2,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,3,3,3,3,]</value>
+    </param>
+  </block>
+  <block>
+    <key>pad_sink</key>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(416, 188)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>pad_sink_0</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>message</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>bursts</value>
+    </param>
+    <param>
+      <key>num_streams</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>optional</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>vlen</key>
+      <value>1</value>
+    </param>
+  </block>
+  <block>
+    <key>pad_source</key>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(32, 188)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>pad_source_0</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>bursts</value>
+    </param>
+    <param>
+      <key>num_streams</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>optional</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>message</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>(192, 7)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>timeslot_nr</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>timeslot_nr</value>
+    </param>
+    <param>
+      <key>short_id</key>
+      <value></value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>intx</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>0</value>
+    </param>
+  </block>
+  <connection>
+    <source_block_id>gsm_universal_ctrl_chans_demapper_0</source_block_id>
+    <sink_block_id>pad_sink_0</sink_block_id>
+    <source_key>bursts</source_key>
+    <sink_key>in</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>pad_source_0</source_block_id>
+    <sink_block_id>gsm_universal_ctrl_chans_demapper_0</sink_block_id>
+    <source_key>out</source_key>
+    <sink_key>bursts</sink_key>
+  </connection>
+</flow_graph>
diff --git a/hier_blocks/demapping/gsm_sdcch8_demapper.grc b/hier_blocks/demapping/gsm_sdcch8_demapper.grc
new file mode 100644
index 0000000..3cc5f7e
--- /dev/null
+++ b/hier_blocks/demapping/gsm_sdcch8_demapper.grc
@@ -0,0 +1,292 @@
+<?xml version='1.0' encoding='utf-8'?>
+<?grc format='1' created='3.7.9'?>
+<flow_graph>
+  <timestamp>Tue May 17 17:08:42 2016</timestamp>
+  <block>
+    <key>options</key>
+    <param>
+      <key>author</key>
+      <value>Piotr Krysik</value>
+    </param>
+    <param>
+      <key>window_size</key>
+      <value></value>
+    </param>
+    <param>
+      <key>category</key>
+      <value></value>
+    </param>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>description</key>
+      <value>Demapper for SDCCH/8 + SACCH/C8 control channels. This corresponds to channel combination vii specified in GSM 05.02, section 6.4</value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(8, 8)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>generate_options</key>
+      <value>hb</value>
+    </param>
+    <param>
+      <key>hier_block_src_path</key>
+      <value>.:</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>gsm_sdcch8_demapper</value>
+    </param>
+    <param>
+      <key>max_nouts</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>qt_qss_theme</key>
+      <value></value>
+    </param>
+    <param>
+      <key>realtime_scheduling</key>
+      <value></value>
+    </param>
+    <param>
+      <key>run_command</key>
+      <value>{python} -u {filename}</value>
+    </param>
+    <param>
+      <key>run_options</key>
+      <value>prompt</value>
+    </param>
+    <param>
+      <key>run</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>thread_safe_setters</key>
+      <value></value>
+    </param>
+    <param>
+      <key>title</key>
+      <value>SDCCH/8 demapper</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>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(168, 193)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>gsm_universal_ctrl_chans_demapper_0</value>
+    </param>
+    <param>
+      <key>maxoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>minoutbuf</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>downlink_channel_types</key>
+      <value>[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,0,0,0,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,0,0,0]</value>
+    </param>
+    <param>
+      <key>downlink_starts_fn_mod51</key>
+      <value>[0,0,0,0,4,4,4,4,8,8,8,8,12,12,12,12,16,16,16,16,20,20,20,20,24,24,24,24,28,28,28,28,32,32,32,32,36,36,36,36,40,40,40,40,44,44,44,44,0,0,0]</value>
+    </param>
+    <param>
+      <key>downlink_subslots</key>
+      <value>[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,0,0,0,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,0,0,0,]</value>
+    </param>
+    <param>
+      <key>timeslot_nr</key>
+      <value>timeslot_nr</value>
+    </param>
+    <param>
+      <key>uplink_channel_types</key>
+      <value>[1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,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,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,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]</value>
+    </param>
+    <param>
+      <key>uplink_starts_fn_mod51</key>
+      <value>[136,136,136,136,136,136,136,136,136,136,136,136,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,136,136,136,136]</value>
+    </param>
+    <param>
+      <key>uplink_subslots</key>
+      <value>[1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,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,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,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,]</value>
+    </param>
+  </block>
+  <block>
+    <key>pad_sink</key>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(416, 188)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>pad_sink_0</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>message</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>bursts</value>
+    </param>
+    <param>
+      <key>num_streams</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>optional</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>vlen</key>
+      <value>1</value>
+    </param>
+  </block>
+  <block>
+    <key>pad_source</key>
+    <param>
+      <key>comment</key>
+      <value></value>
+    </param>
+    <param>
+      <key>_enabled</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>_coordinate</key>
+      <value>(32, 188)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>pad_source_0</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>bursts</value>
+    </param>
+    <param>
+      <key>num_streams</key>
+      <value>1</value>
+    </param>
+    <param>
+      <key>optional</key>
+      <value>True</value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>message</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>(192, 7)</value>
+    </param>
+    <param>
+      <key>_rotation</key>
+      <value>0</value>
+    </param>
+    <param>
+      <key>id</key>
+      <value>timeslot_nr</value>
+    </param>
+    <param>
+      <key>label</key>
+      <value>timeslot_nr</value>
+    </param>
+    <param>
+      <key>short_id</key>
+      <value></value>
+    </param>
+    <param>
+      <key>type</key>
+      <value>intx</value>
+    </param>
+    <param>
+      <key>value</key>
+      <value>1</value>
+    </param>
+  </block>
+  <connection>
+    <source_block_id>gsm_universal_ctrl_chans_demapper_0</source_block_id>
+    <sink_block_id>pad_sink_0</sink_block_id>
+    <source_key>bursts</source_key>
+    <sink_key>in</sink_key>
+  </connection>
+  <connection>
+    <source_block_id>pad_source_0</source_block_id>
+    <sink_block_id>gsm_universal_ctrl_chans_demapper_0</sink_block_id>
+    <source_key>out</source_key>
+    <sink_key>bursts</sink_key>
+  </connection>
+</flow_graph>
diff --git a/include/grgsm/demapping/universal_ctrl_chans_demapper.h b/include/grgsm/demapping/universal_ctrl_chans_demapper.h
index c1778af..eea2bde 100644
--- a/include/grgsm/demapping/universal_ctrl_chans_demapper.h
+++ b/include/grgsm/demapping/universal_ctrl_chans_demapper.h
@@ -49,7 +49,7 @@
        * class. gsm::universal_ctrl_chans_demapper::make is the public interface for
        * creating new instances.
        */
-      static sptr make(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &uplink_starts_fn_mod51=std::vector<int>(), const std::vector<int> &uplink_channel_types=std::vector<int>());
+      static sptr make(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &downlink_subslots, const std::vector<int> &uplink_starts_fn_mod51=std::vector<int>(), const std::vector<int> &uplink_channel_types=std::vector<int>(), const std::vector<int> &uplink_subslots=std::vector<int>());
     };
 
   } // namespace gsm
diff --git a/lib/demapping/universal_ctrl_chans_demapper_impl.cc b/lib/demapping/universal_ctrl_chans_demapper_impl.cc
index cbbbc32..32987ca 100644
--- a/lib/demapping/universal_ctrl_chans_demapper_impl.cc
+++ b/lib/demapping/universal_ctrl_chans_demapper_impl.cc
@@ -36,158 +36,34 @@
   namespace gsm {
 
     universal_ctrl_chans_demapper::sptr
-    universal_ctrl_chans_demapper::make(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &uplink_starts_fn_mod51, const std::vector<int> &uplink_channel_types)
-    {
+    universal_ctrl_chans_demapper::make(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &downlink_subslots, const std::vector<int> &uplink_starts_fn_mod51, const std::vector<int> &uplink_channel_types, const std::vector<int> &uplink_subslots)
+    {     
       return gnuradio::get_initial_sptr
-        (new universal_ctrl_chans_demapper_impl(timeslot_nr, downlink_starts_fn_mod51, downlink_channel_types, uplink_starts_fn_mod51, uplink_channel_types));
+        (new universal_ctrl_chans_demapper_impl(timeslot_nr, downlink_starts_fn_mod51, downlink_channel_types, downlink_subslots, uplink_starts_fn_mod51, uplink_channel_types, uplink_subslots));
     }
 
     /*
      * The private constructor
      */
-    universal_ctrl_chans_demapper_impl::universal_ctrl_chans_demapper_impl(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &uplink_starts_fn_mod51, const std::vector<int> &uplink_channel_types)
+    universal_ctrl_chans_demapper_impl::universal_ctrl_chans_demapper_impl(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &downlink_subslots, const std::vector<int> &uplink_starts_fn_mod51, const std::vector<int> &uplink_channel_types, const std::vector<int> &uplink_subslots)
       : gr::block("universal_ctrl_chans_demapper",
               gr::io_signature::make(0, 0, 0),
               gr::io_signature::make(0, 0, 0)),
-       d_timeslot(timeslot_nr)
-              
+        d_timeslot_nr(timeslot_nr),
+        d_downlink_starts_fn_mod51(51, 0),
+        d_downlink_channel_types(51, 0),
+        d_downlink_subslots(102, 0),
+        d_uplink_starts_fn_mod51(51, 0),
+        d_uplink_channel_types(51, 0),
+        d_uplink_subslots(102, 0)
     {
-    
-        
-        for(int ii=0; ii<51; ii++)
-        {
-            d_downlink_starts_fn_mod51[ii]=0;
-            d_downlink_channel_types[ii]=0;
-            d_downlink_subslots[ii] = 0;
-            d_downlink_subslots[ii+51] = 0;
-
-            d_uplink_starts_fn_mod51[ii]=0;
-            d_uplink_channel_types[ii]=0;
-            d_uplink_subslots[ii] = 0;
-            d_uplink_subslots[ii+51] = 0;
-        }
-        
-        std::vector<int>::const_iterator s;
-        std::vector<int>::const_iterator ch_type;
-        
-        for(s=downlink_starts_fn_mod51.begin(), ch_type=downlink_channel_types.begin();s != downlink_starts_fn_mod51.end(); s++)
-        {
-            if((*s >= 0) and (*s <= (51-4)))
-            {
-                for(int ii=0; ii<4; ii++){
-                    d_downlink_starts_fn_mod51[*s+ii] = *s;
-                    if(ch_type!=downlink_channel_types.end())
-                    {
-                        d_downlink_channel_types[*s+ii] = *ch_type;
-                    }
-                }
-                if(ch_type!=downlink_channel_types.end())
-                {
-                    ch_type++;
-                }
-            }
-        }
-        
-        for(s=uplink_starts_fn_mod51.begin(), ch_type=uplink_channel_types.begin();s != uplink_starts_fn_mod51.end(); s++)
-        {
-            if((*s >= 0) and (*s <= (51-4)))
-            {
-                for(int ii=0; ii<4; ii++){
-                    d_uplink_starts_fn_mod51[*s+ii] = *s;
-                    if(ch_type!=uplink_channel_types.end())
-                    {
-                        d_uplink_channel_types[*s+ii] = *ch_type;
-                    }
-                }
-                if(ch_type!=uplink_channel_types.end())
-                {
-                    ch_type++;
-                }
-            }
-        }
-        
-        std::set<int> distinct_downlink_channels(downlink_channel_types.begin(), downlink_channel_types.end());
-        std::set<int>::iterator it;
-        unsigned int subslot;
-        
-        for (it=distinct_downlink_channels.begin(); it != distinct_downlink_channels.end(); it++)
-        {
-            subslot = 0;
-            for(s=downlink_starts_fn_mod51.begin();s != downlink_starts_fn_mod51.end(); s++)
-            {
-                if ((d_downlink_channel_types[*s] == *it) and (*s >= 0) and (*s <= (51-4)))
-                {
-                    for(int ii=0; ii<4; ii++)
-                    {
-                        d_downlink_subslots[*s+ii] = subslot;
-                        d_downlink_subslots[*s+ii+51] = subslot;
-                    }
-                    subslot++;
-                }
-            }
-            
-            if (*it == GSMTAP_CHANNEL_ACCH or 
-                *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH) or
-                *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH4) or
-                *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH8) or
-                *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_TCH_F) or
-                *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_TCH_H)
-            )
-            {
-                for(s=downlink_starts_fn_mod51.begin();s != downlink_starts_fn_mod51.end(); s++)
-                {
-                    if ((d_downlink_channel_types[*s] == *it) and (*s >= 0) and (*s <= (51-4)))
-                    {
-                        for(int ii=0; ii<4; ii++)
-                        {
-                            d_downlink_subslots[*s+ii+51] = subslot;
-                        }
-                        subslot++;
-                    }
-                }
-            }
-        }
-        
-        std::set<int> distinct_uplink_channels(uplink_channel_types.begin(), uplink_channel_types.end());
-        for (it=distinct_uplink_channels.begin(); it != distinct_uplink_channels.end(); it++)
-        {
-            subslot = 0;
-            for(s=uplink_starts_fn_mod51.begin();s != uplink_starts_fn_mod51.end(); s++)
-            {
-                if ((d_uplink_channel_types[*s] == *it) and (*s >= 0) and (*s <= (51-4)))
-                {
-                    for(int ii=0; ii<4; ii++)
-                    {
-                        d_uplink_subslots[*s+ii] = subslot;
-                        d_uplink_subslots[*s+ii+51] = subslot;
-                    }
-                    subslot++;
-                }
-            }
-            
-            if (*it == GSMTAP_CHANNEL_ACCH or 
-                *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH) or
-                *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH4) or
-                *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_SDCCH8) or
-                *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_TCH_F) or
-                *it == (GSMTAP_CHANNEL_ACCH|GSMTAP_CHANNEL_TCH_H)
-            )
-            {
-                for(s=uplink_starts_fn_mod51.begin();s != uplink_starts_fn_mod51.end(); s++)
-                {
-                    if ((d_uplink_channel_types[*s] == *it) and (*s >= 0) and (*s <= (51-4)))
-                    {
-                        for(int ii=0; ii<4; ii++)
-                        {
-                            d_uplink_subslots[*s+ii+51] = subslot;
-                        }
-                        subslot++;
-                    }
-                }
-            }
-        }
-
-        
+        std::copy(downlink_starts_fn_mod51.begin(), downlink_starts_fn_mod51.end(), d_downlink_starts_fn_mod51.begin());
+        std::copy(downlink_channel_types.begin(), downlink_channel_types.end(), d_downlink_channel_types.begin());
+        std::copy(downlink_subslots.begin(), downlink_subslots.end(), d_downlink_subslots.begin());
+        std::copy(uplink_starts_fn_mod51.begin(), uplink_starts_fn_mod51.end(), d_uplink_starts_fn_mod51.begin());
+        std::copy(uplink_channel_types.begin(), uplink_channel_types.end(), d_uplink_channel_types.begin());
+        std::copy(uplink_subslots.begin(), uplink_subslots.end(), d_uplink_subslots.begin());
+       
         message_port_register_in(pmt::mp("bursts"));
         set_msg_handler(pmt::mp("bursts"), boost::bind(&universal_ctrl_chans_demapper_impl::filter_ctrl_chans, this, _1));
         message_port_register_out(pmt::mp("bursts"));
@@ -205,99 +81,79 @@
         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_mod51 = frame_nr % 51;
-        
-        bool uplink_burst = (be16toh(header->arfcn) & 0x4000) ? true : false;
-
-        if(header->timeslot==d_timeslot){
+        if(header->timeslot==d_timeslot_nr)
+        {
+            int * starts_fn_mod51;
+            int * channel_types;
+            int * subslots;
+            uint32_t * frame_numbers;
+            pmt::pmt_t * bursts;                  
+            
+            uint32_t frame_nr = be32toh(header->frame_number); //get frame number
+            uint32_t fn_mod51 = frame_nr % 51; //frame number modulo 51
+            
+            //crate new message
             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];
-                uint32_t fn51_stop = fn51_start + 3;
-                uint32_t ch_type = d_uplink_channel_types[fn_mod51];
 
-                if(ch_type != 0)
-                {
-                    new_hdr->sub_type = ch_type;
-                }
-                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_out;
-                }
-                
-                if(fn_mod51==fn51_stop)
-                {
-                    //check for a situation where some bursts were lost
-                    //in this situation frame numbers won't be consecutive
-                    bool frames_are_consecutive = true;
-                    for(int jj=1; jj<4; jj++)
-                    {
-                        if((d_uplink_frame_numbers[jj]-d_uplink_frame_numbers[jj-1])!=1)
-                        {
-                            frames_are_consecutive = false;
-                        }
-                    }
-                    if(frames_are_consecutive)
-                    {
-                        //send bursts to the output
-                        for(int jj=0; jj<4; jj++)
-                        {
-                            message_port_pub(pmt::mp("bursts"), d_uplink_bursts[jj]);
-                        }
-                    } 
-                }
+            //get information if burst is from uplink or downlink            
+            bool uplink_burst = (be16toh(header->arfcn) & 0x4000) ? true : false;
+
+            //select right set of configuration and history for uplink or downlink
+            if(uplink_burst) {
+                starts_fn_mod51 = &d_uplink_starts_fn_mod51[0];
+                channel_types = &d_uplink_channel_types[0];
+                subslots = &d_uplink_subslots[0];
+                frame_numbers = d_uplink_frame_numbers;
+                bursts = d_uplink_bursts;
+            } else {
+                starts_fn_mod51 = &d_downlink_starts_fn_mod51[0];
+                channel_types = &d_downlink_channel_types[0];
+                subslots = &d_downlink_subslots[0];
+                frame_numbers = d_downlink_frame_numbers;
+                bursts = d_downlink_bursts;
             }
-            else 
-            {
-                uint32_t fn51_start = d_downlink_starts_fn_mod51[fn_mod51];
-                uint32_t fn51_stop = fn51_start + 3;
-                uint32_t ch_type = d_downlink_channel_types[fn_mod51];
+                      
+            uint32_t fn51_start = starts_fn_mod51[fn_mod51];
+            uint32_t fn51_stop = fn51_start + 3;
+            uint32_t ch_type = channel_types[fn_mod51];
 
-                if(ch_type != 0)
+            if(ch_type != 0)
+            {
+                new_hdr->sub_type = ch_type;
+            }
+            new_hdr->sub_slot = subslots[fn_mod51 + (51 * (frame_nr % 2))];
+            
+            if(fn_mod51>=fn51_start && fn_mod51<=fn51_stop)
+            {
+                uint32_t ii = fn_mod51 - fn51_start;
+                frame_numbers[ii] = frame_nr;
+                bursts[ii] = msg_out;
+            }
+            
+            if(fn_mod51==fn51_stop)
+            {
+                //check for a situation where some bursts were lost
+                //in this situation frame numbers won't be consecutive
+                bool frames_are_consecutive = true;
+                for(int jj=1; jj<4; jj++)
                 {
-                    new_hdr->sub_type = ch_type;
-                }
-                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_out;
-                }
-                
-                if(fn_mod51==fn51_stop)
-                {
-                    //check for a situation where some bursts were lost
-                    //in this situation frame numbers won't be consecutive
-                    bool frames_are_consecutive = true;
-                    for(int jj=1; jj<4; jj++)
+                    if((frame_numbers[jj] - frame_numbers[jj-1])!=1)
                     {
-                        if((d_downlink_frame_numbers[jj]-d_downlink_frame_numbers[jj-1])!=1)
-                        {
-                            frames_are_consecutive = false;
-                        }
+                        frames_are_consecutive = false;
                     }
-                    if(frames_are_consecutive)
-                    {
-                        //send bursts to the output
-                        for(int jj=0; jj<4; jj++)
-                        {
-                            message_port_pub(pmt::mp("bursts"), d_downlink_bursts[jj]);
-                        }
-                    } 
                 }
+                if(frames_are_consecutive)
+                {
+                    //send bursts to the output
+                    for(int jj=0; jj<4; jj++)
+                    {
+                        message_port_pub(pmt::mp("bursts"), bursts[jj]);
+                    }
+                } 
             }
         }
     }
diff --git a/lib/demapping/universal_ctrl_chans_demapper_impl.h b/lib/demapping/universal_ctrl_chans_demapper_impl.h
index 0316bf4..9545ab6 100644
--- a/lib/demapping/universal_ctrl_chans_demapper_impl.h
+++ b/lib/demapping/universal_ctrl_chans_demapper_impl.h
@@ -29,23 +29,28 @@
 namespace gr {
   namespace gsm {
 
+    typedef enum {downlink=0,uplink=1} um_radio_link_direction;
     class universal_ctrl_chans_demapper_impl : public universal_ctrl_chans_demapper
     {
      private:
-      unsigned int d_downlink_starts_fn_mod51[51];
-      unsigned int d_uplink_starts_fn_mod51[51];
-      unsigned int d_downlink_channel_types[51];
-      unsigned int d_uplink_channel_types[51];
-      unsigned int d_downlink_subslots[102];
-      unsigned int d_uplink_subslots[102];
-      unsigned int d_timeslot;
-      uint32_t d_downlink_frame_numbers[4];
-      uint32_t d_uplink_frame_numbers[4];
-      pmt::pmt_t d_downlink_bursts[4];
-      pmt::pmt_t d_uplink_bursts[4];
+        //configuration of the block
+        unsigned int d_timeslot_nr;
+        std::vector<int> d_downlink_starts_fn_mod51;
+        std::vector<int> d_downlink_channel_types;
+        std::vector<int> d_downlink_subslots;
+
+        std::vector<int> d_uplink_starts_fn_mod51;
+        std::vector<int> d_uplink_channel_types;
+        std::vector<int> d_uplink_subslots;
+
+        //history of the downlink and uplink bursts
+        uint32_t d_downlink_frame_numbers[4];
+        pmt::pmt_t d_downlink_bursts[4];
+        uint32_t d_uplink_frame_numbers[4];
+        pmt::pmt_t d_uplink_bursts[4];
      public:
-      universal_ctrl_chans_demapper_impl(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &uplink_starts_fn_mod51, const std::vector<int> &uplink_channel_types);
-      ~universal_ctrl_chans_demapper_impl();
+        universal_ctrl_chans_demapper_impl(unsigned int timeslot_nr, const std::vector<int> &downlink_starts_fn_mod51, const std::vector<int> &downlink_channel_types, const std::vector<int> &downlink_subslots, const std::vector<int> &uplink_starts_fn_mod51, const std::vector<int> &uplink_channel_types, const std::vector<int> &uplink_subslots);
+        ~universal_ctrl_chans_demapper_impl();
 
       void filter_ctrl_chans(pmt::pmt_t msg);
     };
diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
index 04a97c2..8fc48de 100644
--- a/python/CMakeLists.txt
+++ b/python/CMakeLists.txt
@@ -31,6 +31,9 @@
 GR_PYTHON_INSTALL(
     FILES
     __init__.py
+    demapping/gsm_bcch_ccch_demapper.py
+    demapping/gsm_bcch_ccch_sdcch4_demapper.py
+    demapping/gsm_sdcch8_demapper.py
     receiver/gsm_input.py
     receiver/gsm_wideband_input.py
     receiver/fcch_burst_tagger.py
diff --git a/python/__init__.py b/python/__init__.py
index 247c040..dfa7a0e 100644
--- a/python/__init__.py
+++ b/python/__init__.py
@@ -53,6 +53,9 @@
 from clock_offset_corrector import clock_offset_corrector
 from gsm_input import gsm_input
 from gsm_wideband_input import gsm_wideband_input
+from gsm_bcch_ccch_demapper import gsm_bcch_ccch_demapper
+from gsm_bcch_ccch_sdcch4_demapper import gsm_bcch_ccch_sdcch4_demapper
+from gsm_sdcch8_demapper import gsm_sdcch8_demapper
 
 import arfcn
 
diff --git a/python/demapping/gsm_bcch_ccch_demapper.py b/python/demapping/gsm_bcch_ccch_demapper.py
new file mode 100644
index 0000000..adb4c12
--- /dev/null
+++ b/python/demapping/gsm_bcch_ccch_demapper.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+##################################################
+# GNU Radio Python Flow Graph
+# Title: BCCH + CCCH demapper
+# Author: Piotr Krysik
+# Description: Demapper for BCCH + CCCH control channels. This corresponds to channel combination iv specified in GSM 05.02, section 6.4
+# Generated: Fri May 20 12:11:59 2016
+##################################################
+
+from gnuradio import gr
+from gnuradio.filter import firdes
+import grgsm
+
+
+class gsm_bcch_ccch_demapper(grgsm.hier_block):
+
+    def __init__(self, timeslot_nr=0):
+        grgsm.hier_block.__init__(
+            self, "BCCH + CCCH demapper",
+            gr.io_signature(0, 0, 0),
+            gr.io_signature(0, 0, 0),
+        )
+        self.message_port_register_hier_in("bursts")
+        self.message_port_register_hier_out("bursts")
+
+        ##################################################
+        # Parameters
+        ##################################################
+        self.timeslot_nr = timeslot_nr
+
+        ##################################################
+        # Blocks
+        ##################################################
+        self.gsm_universal_ctrl_chans_demapper_0 = grgsm.universal_ctrl_chans_demapper(timeslot_nr, ([0,0,2,2,2,2,6,6,6,6,0,0,12,12,12,12,16,16,16,16,0,0,22,22,22,22,26,26,26,26,0,0,32,32,32,32,36,36,36,36,0,0,42,42,42,42,46,46,46,46,0,]), ([0,0,1,1,1,1,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,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,6,6,6,6,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,41,41,41,41,0,0,47,47,47,47]), ([2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,2,2,2,2,]), ([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,]))
+
+        ##################################################
+        # Connections
+        ##################################################
+        self.msg_connect((self.gsm_universal_ctrl_chans_demapper_0, 'bursts'), (self, 'bursts'))    
+        self.msg_connect((self, 'bursts'), (self.gsm_universal_ctrl_chans_demapper_0, 'bursts'))    
+
+    def get_timeslot_nr(self):
+        return self.timeslot_nr
+
+    def set_timeslot_nr(self, timeslot_nr):
+        self.timeslot_nr = timeslot_nr
diff --git a/python/demapping/gsm_bcch_ccch_sdcch4_demapper.py b/python/demapping/gsm_bcch_ccch_sdcch4_demapper.py
new file mode 100644
index 0000000..92fb5f0
--- /dev/null
+++ b/python/demapping/gsm_bcch_ccch_sdcch4_demapper.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+##################################################
+# GNU Radio Python Flow Graph
+# Title: BCCH + CCCH + SDCCH/4 demapper
+# Author: Piotr Krysik
+# Description: Demapper for BCCH + CCCH + SDCCH/4 + SACCH/C4 control channels. This corresponds to channel combination v specified in GSM 05.02, section 6.4
+# Generated: Fri May 20 12:12:01 2016
+##################################################
+
+from gnuradio import gr
+from gnuradio.filter import firdes
+import grgsm
+
+
+class gsm_bcch_ccch_sdcch4_demapper(grgsm.hier_block):
+
+    def __init__(self, timeslot_nr=0):
+        grgsm.hier_block.__init__(
+            self, "BCCH + CCCH + SDCCH/4 demapper",
+            gr.io_signature(0, 0, 0),
+            gr.io_signature(0, 0, 0),
+        )
+        self.message_port_register_hier_in("bursts")
+        self.message_port_register_hier_out("bursts")
+
+        ##################################################
+        # Parameters
+        ##################################################
+        self.timeslot_nr = timeslot_nr
+
+        ##################################################
+        # Blocks
+        ##################################################
+        self.gsm_universal_ctrl_chans_demapper_0 = grgsm.universal_ctrl_chans_demapper(timeslot_nr, ([0,0,2,2,2,2,6,6,6,6,0,0,12,12,12,12,16,16,16,16,0,0,22,22,22,22,26,26,26,26,0,0,32,32,32,32,36,36,36,36,0,0,42,42,42,42,46,46,46,46,0,]), ([0,0,1,1,1,1,2,2,2,2,0,0,2,2,2,2,2,2,2,2,0,0,7,7,7,7,7,7,7,7,0,0,7,7,7,7,7,7,7,7,0,0,135,135,135,135,135,135,135,135,0]), ([0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,0,0,0,0,1,1,1,1,0,0,2,2,2,2,3,3,3,3,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,0,0,0,0,1,1,1,1,0,0,2,2,2,2,3,3,3,3,0,0,2,2,2,2,3,3,3,3,0,]), ([0,0,0,0,0,0,6,6,6,6,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,41,41,41,41,0,0,47,47,47,47,]), ([7,7,7,7,0,0,135,135,135,135,135,135,135,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,7,7,7,0,0,7,7,7,7,]), ([0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,3,3,3,3,0,0,0,0,0,0,2,2,2,2,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,0,0,3,3,3,3,]))
+
+        ##################################################
+        # Connections
+        ##################################################
+        self.msg_connect((self.gsm_universal_ctrl_chans_demapper_0, 'bursts'), (self, 'bursts'))    
+        self.msg_connect((self, 'bursts'), (self.gsm_universal_ctrl_chans_demapper_0, 'bursts'))    
+
+    def get_timeslot_nr(self):
+        return self.timeslot_nr
+
+    def set_timeslot_nr(self, timeslot_nr):
+        self.timeslot_nr = timeslot_nr
diff --git a/python/demapping/gsm_sdcch8_demapper.py b/python/demapping/gsm_sdcch8_demapper.py
new file mode 100644
index 0000000..e69d277
--- /dev/null
+++ b/python/demapping/gsm_sdcch8_demapper.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+##################################################
+# GNU Radio Python Flow Graph
+# Title: SDCCH/8 demapper
+# Author: Piotr Krysik
+# Description: Demapper for SDCCH/8 + SACCH/C8 control channels. This corresponds to channel combination vii specified in GSM 05.02, section 6.4
+# Generated: Fri May 20 12:12:04 2016
+##################################################
+
+from gnuradio import gr
+from gnuradio.filter import firdes
+import grgsm
+
+
+class gsm_sdcch8_demapper(grgsm.hier_block):
+
+    def __init__(self, timeslot_nr=1):
+        grgsm.hier_block.__init__(
+            self, "SDCCH/8 demapper",
+            gr.io_signature(0, 0, 0),
+            gr.io_signature(0, 0, 0),
+        )
+        self.message_port_register_hier_in("bursts")
+        self.message_port_register_hier_out("bursts")
+
+        ##################################################
+        # Parameters
+        ##################################################
+        self.timeslot_nr = timeslot_nr
+
+        ##################################################
+        # Blocks
+        ##################################################
+        self.gsm_universal_ctrl_chans_demapper_0 = grgsm.universal_ctrl_chans_demapper(timeslot_nr, ([0,0,0,0,4,4,4,4,8,8,8,8,12,12,12,12,16,16,16,16,20,20,20,20,24,24,24,24,28,28,28,28,32,32,32,32,36,36,36,36,40,40,40,40,44,44,44,44,0,0,0]), ([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,0,0,0,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,0,0,0]), ([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,0,0,0,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,0,0,0,]), ([136,136,136,136,136,136,136,136,136,136,136,136,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,136,136,136,136]), ([1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,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,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,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]), ([1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,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,5,5,5,5,6,6,6,6,7,7,7,7,0,0,0,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,]))
+
+        ##################################################
+        # Connections
+        ##################################################
+        self.msg_connect((self.gsm_universal_ctrl_chans_demapper_0, 'bursts'), (self, 'bursts'))    
+        self.msg_connect((self, 'bursts'), (self.gsm_universal_ctrl_chans_demapper_0, 'bursts'))    
+
+    def get_timeslot_nr(self):
+        return self.timeslot_nr
+
+    def set_timeslot_nr(self, timeslot_nr):
+        self.timeslot_nr = timeslot_nr