diff --git a/lib/transmitter/CMakeLists.txt b/lib/transmitter/CMakeLists.txt
new file mode 100644
index 0000000..31658fd
--- /dev/null
+++ b/lib/transmitter/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Copyright 2011,2012 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+
+add_sources(
+   txtime_setter_impl.cc
+)
diff --git a/lib/transmitter/txtime_setter_impl.cc b/lib/transmitter/txtime_setter_impl.cc
new file mode 100644
index 0000000..9ff1d8a
--- /dev/null
+++ b/lib/transmitter/txtime_setter_impl.cc
@@ -0,0 +1,139 @@
+/* -*- c++ -*- */
+/* @file
+ * @author Piotr Krysik <ptrkrysik@gmail.com>
+ * @section LICENSE
+ * 
+ * Gr-gsm is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * Gr-gsm is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with gr-gsm; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ * 
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gnuradio/io_signature.h>
+#include <grgsm/gsmtap.h>
+#include "txtime_setter_impl.h"
+
+namespace gr {
+  namespace gsm {
+
+    txtime_setter::sptr
+    txtime_setter::make(uint32_t init_fn, uint64_t init_time_secs, double init_time_fracs, uint64_t time_hint_secs, double time_hint_fracs, double timing_advance, double delay_correction)
+    {
+      return gnuradio::get_initial_sptr
+        (new txtime_setter_impl(init_fn, init_time_secs, init_time_fracs, time_hint_secs, time_hint_fracs, timing_advance, delay_correction));
+    }
+
+    /*
+     * The private constructor
+     */
+    txtime_setter_impl::txtime_setter_impl(uint32_t init_fn, uint64_t init_time_secs, double init_time_fracs, uint64_t time_hint_secs, double time_hint_fracs, double timing_advance, double delay_correction)
+      : gr::block("txtime_setter",
+              gr::io_signature::make(0, 0, 0),
+              gr::io_signature::make(0, 0, 0)),
+        d_fn_ref(init_fn),
+        d_ts_ref(0),
+        d_time_ref(init_time_secs,init_time_fracs),
+        d_time_hint(time_hint_secs,time_hint_fracs),
+        d_timing_advance(timing_advance),
+        d_delay_correction(delay_correction)
+    {
+        message_port_register_in(pmt::intern("fn_time"));
+        message_port_register_in(pmt::intern("bursts_in"));
+        message_port_register_out(pmt::intern("bursts_out"));
+
+        set_msg_handler(pmt::intern("fn_time"), boost::bind(&txtime_setter_impl::process_fn_time_reference, this, _1));
+        set_msg_handler(pmt::intern("bursts_in"),  boost::bind(&txtime_setter_impl::process_txtime_of_burst,   this, _1));
+    }
+
+    /*
+     * Our virtual destructor.
+     */
+    txtime_setter_impl::~txtime_setter_impl()
+    {
+    }
+    
+    void txtime_setter_impl::process_fn_time_reference(pmt::pmt_t msg)
+    {
+//      d_time_hint = pmt::to_python(pmt::dict_ref(msg, pmt::intern("time_hint"), pmt::PMT_NIL))
+        pmt::pmt_t not_found = pmt::intern("not_found");
+        pmt::pmt_t fn_time = pmt::dict_ref(msg, pmt::intern("fn_time"), not_found);
+        pmt::pmt_t time_hint = pmt::dict_ref(msg, pmt::intern("fn_time"), not_found);
+
+        if(fn_time != not_found)
+        {
+          uint32_t fn_ref = static_cast<uint32_t>(pmt::to_uint64(pmt::car(pmt::car(fn_time))));
+          uint32_t ts =  static_cast<uint32_t>(pmt::to_uint64(pmt::cdr(pmt::car(fn_time))));
+          uint64_t time_secs = pmt::to_uint64(pmt::car(pmt::cdr(fn_time)));
+          double time_fracs = pmt::to_double(pmt::cdr(pmt::cdr(fn_time)));
+          set_fn_time_reference(fn_ref, ts,  time_secs, time_fracs);
+        } else if(time_hint != not_found) {
+          set_time_hint(pmt::to_uint64(pmt::car(fn_time)), pmt::to_double(pmt::cdr(fn_time)));
+        }
+
+    }
+    
+    void txtime_setter_impl::process_txtime_of_burst(pmt::pmt_t burst)
+    {
+        pmt::pmt_t header_plus_burst = pmt::cdr(burst);
+        int8_t * burst_int8 = (int8_t *)pmt::blob_data(header_plus_burst);        
+        gsmtap_hdr * header = (gsmtap_hdr *)(burst_int8);
+        
+        uint32_t frame_nr = be32toh(header->frame_number); 
+        uint32_t ts_num = header->timeslot;
+        
+        if(d_fn_ref != 0xffffffff)
+        {
+          time_format txtime = fn_time_delta_cpp(d_fn_ref, d_time_ref, frame_nr, d_time_hint, ts_num, d_ts_ref);
+          time_spec_t txtime_spec = time_spec_t(txtime.first, txtime.second);
+          txtime_spec = txtime_spec - d_delay_correction;
+          txtime_spec = txtime_spec - d_timing_advance;
+          
+          pmt::pmt_t tags_dict = pmt::dict_add(pmt::make_dict(), pmt::intern("tx_time"), pmt::make_tuple(pmt::from_uint64(txtime_spec.get_full_secs()),pmt::from_double(txtime_spec.get_frac_secs())));
+          tags_dict = pmt::dict_add(tags_dict, pmt::intern("fn"), pmt::from_uint64(frame_nr));
+          tags_dict = pmt::dict_add(tags_dict, pmt::intern("ts"), pmt::from_uint64(ts_num));
+          pmt::pmt_t new_msg = pmt::cons(tags_dict, pmt::cdr(burst));
+          message_port_pub(pmt::intern("bursts_out"), new_msg);
+        }
+    }
+
+    void txtime_setter_impl::set_fn_time_reference(uint32_t fn, uint32_t ts, uint64_t time_secs, double time_fracs)
+    {
+      d_fn_ref = fn;
+      d_ts_ref = ts;
+      d_time_ref = std::make_pair(time_secs, time_fracs);
+      set_time_hint(time_secs, time_fracs);
+    }
+
+    void txtime_setter_impl::set_time_hint(uint64_t time_hint_secs, double time_hint_fracs)
+    {
+      d_time_hint = std::make_pair(time_hint_secs, time_hint_fracs);
+    }
+
+    void txtime_setter_impl::set_delay_correction(double delay_correction)
+    {
+      d_delay_correction = delay_correction;
+    }
+
+    void txtime_setter_impl::set_timing_advance(double timing_advance)
+    {
+      d_timing_advance = timing_advance;
+    }
+
+  } /* namespace gsm */
+} /* namespace gr */
+
diff --git a/lib/transmitter/txtime_setter_impl.h b/lib/transmitter/txtime_setter_impl.h
new file mode 100644
index 0000000..e3f195a
--- /dev/null
+++ b/lib/transmitter/txtime_setter_impl.h
@@ -0,0 +1,60 @@
+/* -*- c++ -*- */
+/* @file
+ * @author Piotr Krysik <ptrkrysik@gmail.com>
+ * @section LICENSE
+ * 
+ * Gr-gsm is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * Gr-gsm is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with gr-gsm; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ * 
+ */
+
+#ifndef INCLUDED_GSM_TXTIME_SETTER_IMPL_H
+#define INCLUDED_GSM_TXTIME_SETTER_IMPL_H
+
+#include <grgsm/transmitter/txtime_setter.h>
+#include <grgsm/misc_utils/time_spec.h>
+#include <grgsm/misc_utils/fn_time.h>
+
+namespace gr {
+  namespace gsm {
+
+    class txtime_setter_impl : public txtime_setter
+    {
+     private:
+      uint32_t d_fn_ref;
+      uint32_t d_ts_ref;
+      time_format d_time_ref;
+      time_format d_time_hint;
+      double d_timing_advance;
+      double d_delay_correction;
+      
+     public:
+      txtime_setter_impl(uint32_t init_fn, uint64_t init_time_secs, double init_time_fracs, uint64_t time_hint_secs, double time_hint_fracs, double timing_advance, double delay_correction);
+      ~txtime_setter_impl();
+
+      // Where all the action really happens
+      void process_fn_time_reference(pmt::pmt_t msg);
+      void process_txtime_of_burst(pmt::pmt_t msg);
+      void set_fn_time_reference(uint32_t fn, uint32_t ts, uint64_t time_secs, double time_fracs);
+      void set_time_hint(uint64_t time_hint_secs, double time_hint_fracs);
+      void set_delay_correction(double delay_correction);
+      void set_timing_advance(double timing_advance);
+    };
+
+  } // namespace gsm
+} // namespace gr
+
+#endif /* INCLUDED_GSM_TXTIME_SETTER_IMPL_H */
+
