diff --git a/lib/qa_utils/burst_source_impl.cc b/lib/qa_utils/burst_source_impl.cc
new file mode 100644
index 0000000..7391872
--- /dev/null
+++ b/lib/qa_utils/burst_source_impl.cc
@@ -0,0 +1,162 @@
+/* -*- c++ -*- */
+/* @file
+ * @author Roman Khassraf <rkhassraf@gmail.com>
+ * @section LICENSE
+ *
+ * Gr-gsm is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * Gr-gsm is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gr-gsm; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gnuradio/io_signature.h>
+#include "burst_source_impl.h"
+#include "stdio.h"
+#include <boost/scoped_ptr.hpp>
+#include <grgsm/gsmtap.h>
+#include <grgsm/endian.h>
+
+#define PMT_SIZE 174
+
+namespace gr {
+  namespace gsm {
+
+    burst_source::sptr
+    burst_source::make(const std::vector<int> &framenumbers,
+            const std::vector<int> &timeslots,
+            const std::vector<std::string> &burst_data)
+    {
+      return gnuradio::get_initial_sptr
+        (new burst_source_impl(framenumbers, timeslots, burst_data));
+    }
+
+    /*
+     * The private constructor
+     */
+    burst_source_impl::burst_source_impl(const std::vector<int> &framenumbers,
+            const std::vector<int> &timeslots,
+            const std::vector<std::string> &burst_data)
+      : gr::block("burst_source",
+              gr::io_signature::make(0, 0, 0),
+              gr::io_signature::make(0, 0, 0)),
+              d_finished(false)
+    {
+        message_port_register_out(pmt::mp("out"));
+        set_framenumbers(framenumbers);
+        set_timeslots(timeslots);
+        set_burst_data(burst_data);
+    }
+
+    /*
+     * Our virtual destructor.
+     */
+    burst_source_impl::~burst_source_impl()
+    {
+        if (d_finished == false){
+            d_finished = true;
+        }
+    }
+
+    void burst_source_impl::set_framenumbers(const std::vector<int> &framenumbers)
+    {
+        d_framenumbers = framenumbers;
+    }
+
+    void  burst_source_impl::set_timeslots(const std::vector<int> &timeslots)
+    {
+        d_timeslots = timeslots;
+    }
+
+    void burst_source_impl::set_burst_data(const std::vector<std::string> &burst_data)
+    {
+        d_burst_data = burst_data;
+    }
+
+    bool burst_source_impl::start()
+    {
+        d_finished = false;
+        d_thread = boost::shared_ptr<gr::thread::thread>
+            (new gr::thread::thread(boost::bind(&burst_source_impl::run, this)));
+        return block::start();
+    }
+
+    bool burst_source_impl::stop()
+    {
+        d_finished = true;
+        d_thread->interrupt();
+        d_thread->join();
+        return block::stop();
+    }
+
+    bool burst_source_impl::finished()
+    {
+        return d_finished;
+    }
+
+    void burst_source_impl::run()
+    {
+        char *unserialized = (char*)malloc(sizeof(char) * PMT_SIZE);
+
+        for (int i=0; i<d_burst_data.size(); i++)
+        {
+            if (d_burst_data[i].length() == BURST_SIZE &&
+                d_timeslots[i] >= 0 && d_timeslots[i] <= 7 &&
+                d_framenumbers[i] >= 0 && d_framenumbers[i] <= (26 * 51 * 2048 - 1))
+            {
+                boost::scoped_ptr<gsmtap_hdr> tap_header(new gsmtap_hdr());
+
+                tap_header->version = GSMTAP_VERSION;
+                tap_header->hdr_len = sizeof(gsmtap_hdr)/4;
+                tap_header->type = GSMTAP_TYPE_UM_BURST;
+                tap_header->timeslot = d_timeslots[i];
+                tap_header->frame_number = htobe32(d_framenumbers[i]);
+                tap_header->sub_type = GSMTAP_BURST_NORMAL;
+                tap_header->arfcn = 0;
+                tap_header->signal_dbm = 0;
+                tap_header->snr_db = 0;
+
+                uint8_t burst[BURST_SIZE];
+
+                for (int j=0; j<BURST_SIZE; j++)
+                {
+                    if (d_burst_data[i][j] == '0')
+                    {
+                        burst[j] = 0;
+                    }
+                    else
+                    {
+                        burst[j] = 1;
+                    }
+                }
+
+                int8_t header_plus_burst[sizeof(gsmtap_hdr) + BURST_SIZE];
+                memcpy(header_plus_burst, tap_header.get(), sizeof(gsmtap_hdr));
+                memcpy(header_plus_burst + sizeof(gsmtap_hdr), burst, BURST_SIZE);
+
+                pmt::pmt_t blob_header_plus_burst = pmt::make_blob(header_plus_burst, sizeof(gsmtap_hdr) + BURST_SIZE);
+                pmt::pmt_t msg = pmt::cons(pmt::PMT_NIL, blob_header_plus_burst);
+
+                message_port_pub(pmt::mp("out"), msg);
+            }
+        }
+        post(pmt::mp("system"), pmt::cons(pmt::mp("done"), pmt::from_long(1)));
+    }
+  } /* namespace gsm */
+} /* namespace gr */
+
+
