diff --git a/examples/gsm_receiver_usrp_channelizer_python.py b/examples/gsm_receiver_usrp_channelizer_python.py
new file mode 100755
index 0000000..e769472
--- /dev/null
+++ b/examples/gsm_receiver_usrp_channelizer_python.py
@@ -0,0 +1,208 @@
+#!/usr/bin/env python
+##################################################
+# Gnuradio Python Flow Graph
+# Title: Gsm Receiver Usrp Channelizer Python
+# Generated: Sun Feb  9 12:46:36 2014
+##################################################
+
+from gnuradio import blocks
+from gnuradio import eng_notation
+from gnuradio import gr
+from gnuradio import uhd
+from gnuradio.eng_option import eng_option
+from gnuradio.filter import firdes
+from gnuradio.filter import pfb
+from optparse import OptionParser
+import gsm
+import time
+from numpy import fft
+
+
+class gsm_receiver_usrp_channelizer_python(gr.top_block):
+
+    def __init__(self, length=0.2, gain=25, channelizer_osr=1, fc=937e6, usrp_decim=4, fs=100e6):
+        gr.top_block.__init__(self, "Gsm Receiver Usrp Channelizer Python")
+
+        ##################################################
+        # Parameters
+        ##################################################
+        self.length = length
+        self.gain = gain
+        self.channelizer_osr = channelizer_osr
+        self.fc = fc
+        self.usrp_decim = usrp_decim
+        self.channels_num = int(round(fs/usrp_decim/200e3))
+        self.fs = fs
+
+        ##################################################
+        # Variables
+        ##################################################
+        self.samp_rate = 100e6/self.usrp_decim
+        self.samp_rate_channelizer_out = self.samp_rate/self.channels_num*channelizer_osr
+        self.freqs = fft.fftfreq(self.channels_num,1/self.samp_rate)+self.fc
+        self.arfcns = get_arfcns_from_freqs(self.freqs,"e")
+        print self.freqs
+        print self.arfcns
+
+        ##################################################
+        # Blocks
+        ##################################################
+        self.uhd_usrp_source_0 = uhd.usrp_source(
+        	device_addr="addr=192.168.11.2",
+        	stream_args=uhd.stream_args(
+        		cpu_format="fc32",
+        		otw_format="sc16",
+        		channels=range(1),
+        	),
+        )
+        self.uhd_usrp_source_0.set_samp_rate(self.samp_rate)
+        self.uhd_usrp_source_0.set_center_freq(fc, 0)
+        self.uhd_usrp_source_0.set_gain(gain, 0)
+        self.pfb_channelizer_ccf_0 = pfb.channelizer_ccf(
+        	  self.channels_num,
+        	  (),
+        	  channelizer_osr,
+        	  100)
+        self.pfb_channelizer_ccf_0.set_channel_map(([]))
+
+        self.blocks_head_0 = blocks.head(gr.sizeof_gr_complex*1, int(self.samp_rate*length))
+        self.gsm_bursts_printer_0 = gsm.bursts_printer()
+        
+        self.connect((self.uhd_usrp_source_0, 0), (self.blocks_head_0, 0))
+        self.connect((self.blocks_head_0, 0), (self.pfb_channelizer_ccf_0, 0))
+
+        self.gsm_receiver_hier = {}        
+
+        for ii in xrange(0,self.channels_num):
+            self.gsm_receiver_hier[ii] = gsm.receiver_hier(self.samp_rate_channelizer_out, 4, int(self.freqs[ii]/1e5))
+            self.connect((self.pfb_channelizer_ccf_0, ii), (self.gsm_receiver_hier[ii], 0))
+            self.msg_connect(self.gsm_receiver_hier[ii], "bursts", self.gsm_bursts_printer_0, "bursts")
+        
+
+# QT sink close method reimplementation
+
+    def get_length(self):
+        return self.length
+
+    def set_length(self, length):
+        self.length = length
+
+    def get_gain(self):
+        return self.gain
+
+    def set_gain(self, gain):
+        self.gain = gain
+        self.uhd_usrp_source_0.set_gain(self.gain, 0)
+
+    def get_channelizer_osr(self):
+        return self.channelizer_osr
+
+    def set_channelizer_osr(self, channelizer_osr):
+        self.channelizer_osr = channelizer_osr
+        self.set_samp_rate_channelizer_out(self.samp_rate/self.channels_num*self.channelizer_osr)
+
+    def get_fc(self):
+        return self.fc
+
+    def set_fc(self, fc):
+        self.fc = fc
+        self.uhd_usrp_source_0.set_center_freq(self.fc, 0)
+
+    def get_usrp_decim(self):
+        return self.usrp_decim
+
+    def set_usrp_decim(self, usrp_decim):
+        self.usrp_decim = usrp_decim
+        self.set_samp_rate(100e6/self.usrp_decim)
+
+    def get_channels_num(self):
+        return self.channels_num
+
+    def set_channels_num(self, channels_num):
+        self.channels_num = channels_num
+        self.set_samp_rate_channelizer_out(self.samp_rate/self.channels_num*self.channelizer_osr)
+
+    def get_fs(self):
+        return self.fs
+
+    def set_fs(self, fs):
+        self.fs = fs
+
+    def get_samp_rate(self):
+        return self.samp_rate
+
+    def set_samp_rate(self, samp_rate):
+        self.samp_rate = samp_rate
+        self.set_samp_rate_channelizer_out(self.samp_rate/self.channels_num*self.channelizer_osr)
+        self.uhd_usrp_source_0.set_samp_rate(self.samp_rate)
+
+    def get_samp_rate_channelizer_out(self):
+        return self.samp_rate_channelizer_out
+
+    def set_samp_rate_channelizer_out(self, samp_rate_channelizer_out):
+        self.samp_rate_channelizer_out = samp_rate_channelizer_out
+
+def get_arfcns_from_freqs(freqs,region):
+    arfcns = {}
+    for ii in xrange(0,len(freqs)):
+        arfcns[ii] = get_arfcn_from_freq(freqs[ii],region)
+    
+    return arfcns
+
+def get_arfcn_from_freq(freq,region):
+	freq = freq / 1e6
+	# GSM 450
+	if freq <= 450.6 + 0.2*(293 - 259) + 10:
+		arfcn = ((freq - (450.6 + 10)) / 0.2) + 259
+	# GSM 480
+	elif freq <= 479 + 0.2*(340 - 306) + 10:
+		arfcn = ((freq - (479 + 10)) / 0.2) + 306
+	# GSM 850
+	elif freq <= 824.2 + 0.2*(251 - 128) + 45:
+		arfcn = ((freq - (824.2 + 45)) / 0.2) + 128
+	#E/R-GSM 900
+	elif freq <= 890 + 0.2*(1023 - 1024) + 45:
+		arfcn = ((freq - (890 + 45)) / -0.2) + 955
+	# GSM 900
+	elif freq <= 890 + 0.2*124 + 45:
+		arfcn = (freq - (890 + 45)) / 0.2
+	else:
+		if region is "u":
+			if freq > 1850.2 + 0.2*(810 - 512) + 80:
+				arfcn = 0;
+			else:
+				arfcn = (freq - (1850.2 + 80) / 0.2) + 512
+		elif region is "e":
+			if freq > 1710.2 + 0.2*(885 - 512) + 95:
+				arfcn = 0;
+			else:
+				arfcn = (freq - (1710.2 + 95) / 0.2) + 512
+		else:
+			arfcn = 0
+
+	if arfcn<0:
+		return 255
+	else:
+		return round(arfcn)
+	
+
+if __name__ == '__main__':
+    parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
+    parser.add_option("", "--length", dest="length", type="eng_float", default=eng_notation.num_to_str(0.2),
+        help="Set length [default=%default]")
+    parser.add_option("", "--gain", dest="gain", type="intx", default=30,
+        help="Set gain [default=%default]")
+    parser.add_option("", "--channelizer-osr", dest="channelizer_osr", type="intx", default=2,
+        help="Set channelizer_osr [default=%default]")
+    parser.add_option("", "--fc", dest="fc", type="eng_float", default=eng_notation.num_to_str(937e6),
+        help="Set fc [default=%default]")
+    parser.add_option("", "--usrp-decim", dest="usrp_decim", type="intx", default=5,
+        help="Set usrp_decim [default=%default]")
+    parser.add_option("", "--fs", dest="fs", type="eng_float", default=eng_notation.num_to_str(100e6),
+        help="Set fs [default=%default]")
+    (options, args) = parser.parse_args()
+    tb = gsm_receiver_usrp_channelizer_python(length=options.length, gain=options.gain, channelizer_osr=options.channelizer_osr, fc=options.fc, usrp_decim=options.usrp_decim, fs=options.fs)
+    tb.start()
+    tb.wait()
+
+
