diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc
index 13962f559..a9df67b7d 100644
--- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc
+++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc
@@ -126,9 +126,12 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels,
 {
     // Send feedback message to observables block with the receiver clock offset
     this->message_port_register_out(pmt::mp("pvt_to_observables"));
+    // Send PVT status to gnss_flowgraph
+    this->message_port_register_out(pmt::mp("status"));
 
     d_output_rate_ms = conf_.output_rate_ms;
     d_display_rate_ms = conf_.display_rate_ms;
+    d_report_rate_ms = 1000;  //report every second PVT to gnss_synchro
     d_dump = conf_.dump;
     d_dump_mat = conf_.dump_mat and d_dump;
     d_dump_filename = conf_.dump_filename;
@@ -3729,10 +3732,19 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item
                         }
 
                     // PVT MONITOR
-                    if (d_pvt_solver->is_valid_position() and flag_monitor_pvt_enabled)
+                    if (d_pvt_solver->is_valid_position())
                         {
-                            Monitor_Pvt monitor_pvt = d_pvt_solver->get_monitor_pvt();
-                            udp_sink_ptr->write_monitor_pvt(monitor_pvt);
+                            std::shared_ptr<Monitor_Pvt> monitor_pvt = std::make_shared<Monitor_Pvt>(d_pvt_solver->get_monitor_pvt());
+
+                            //publish new position to the gnss_flowgraph channel status monitor
+                            if (current_RX_time_ms % d_report_rate_ms == 0)
+                                {
+                                    this->message_port_pub(pmt::mp("status"), pmt::make_any(monitor_pvt));
+                                }
+                            if (flag_monitor_pvt_enabled)
+                                {
+                                    udp_sink_ptr->write_monitor_pvt(monitor_pvt);
+                                }
                         }
                 }
         }
diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h
index 595cd2624..b046735d8 100644
--- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h
+++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h
@@ -169,6 +169,7 @@ private:
 
     int32_t d_output_rate_ms;
     int32_t d_display_rate_ms;
+    int32_t d_report_rate_ms;
 
     std::shared_ptr<Rinex_Printer> rp;
     std::shared_ptr<Kml_Printer> d_kml_dump;
diff --git a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc
index 2796f13da..ed23fbb5d 100644
--- a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc
+++ b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc
@@ -51,14 +51,14 @@ Monitor_Pvt_Udp_Sink::Monitor_Pvt_Udp_Sink(const std::vector<std::string>& addre
 }
 
 
-bool Monitor_Pvt_Udp_Sink::write_monitor_pvt(const Monitor_Pvt& monitor_pvt)
+bool Monitor_Pvt_Udp_Sink::write_monitor_pvt(std::shared_ptr<Monitor_Pvt> monitor_pvt)
 {
     std::string outbound_data;
     if (use_protobuf == false)
         {
             std::ostringstream archive_stream;
             boost::archive::binary_oarchive oa{archive_stream};
-            oa << monitor_pvt;
+            oa << *monitor_pvt.get();
             outbound_data = archive_stream.str();
         }
     else
diff --git a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h
index f1f9146f4..588e70257 100644
--- a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h
+++ b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h
@@ -45,8 +45,8 @@ using b_io_context = boost::asio::io_service;
 class Monitor_Pvt_Udp_Sink
 {
 public:
-    Monitor_Pvt_Udp_Sink(const std::vector<std::string>& addresses, const uint16_t &port, bool protobuf_enabled);
-    bool write_monitor_pvt(const Monitor_Pvt &monitor_pvt);
+    Monitor_Pvt_Udp_Sink(const std::vector<std::string>& addresses, const uint16_t& port, bool protobuf_enabled);
+    bool write_monitor_pvt(std::shared_ptr<Monitor_Pvt> monitor_pvt);
 
 private:
     b_io_context io_context;
diff --git a/src/algorithms/PVT/libs/rtcm.h b/src/algorithms/PVT/libs/rtcm.h
index 792eafb9a..75dcd4c50 100644
--- a/src/algorithms/PVT/libs/rtcm.h
+++ b/src/algorithms/PVT/libs/rtcm.h
@@ -43,6 +43,7 @@
 #include <boost/asio.hpp>
 #include <boost/date_time/posix_time/posix_time.hpp>
 #include <glog/logging.h>
+#include <pmt/pmt.h>
 #include <bitset>
 #include <cstddef>  // for size_t
 #include <cstdint>
diff --git a/src/algorithms/PVT/libs/serdes_monitor_pvt.h b/src/algorithms/PVT/libs/serdes_monitor_pvt.h
index 1b5ca11ca..1477442df 100644
--- a/src/algorithms/PVT/libs/serdes_monitor_pvt.h
+++ b/src/algorithms/PVT/libs/serdes_monitor_pvt.h
@@ -34,7 +34,7 @@
 
 #include "monitor_pvt.h"
 #include "monitor_pvt.pb.h"  // file created by Protocol Buffers at compile time
-
+#include <memory>
 
 /*!
  * \brief This class implements serialization and deserialization of
@@ -80,40 +80,40 @@ public:
         return *this;
     }
 
-    inline std::string createProtobuffer(const Monitor_Pvt& monitor)  //!< Serialization into a string
+    inline std::string createProtobuffer(std::shared_ptr<Monitor_Pvt> monitor)  //!< Serialization into a string
     {
         monitor_.Clear();
 
         std::string data;
 
-        monitor_.set_tow_at_current_symbol_ms(monitor.TOW_at_current_symbol_ms);
-        monitor_.set_week(monitor.week);
-        monitor_.set_rx_time(monitor.RX_time);
-        monitor_.set_user_clk_offset(monitor.user_clk_offset);
-        monitor_.set_pos_x(monitor.pos_x);
-        monitor_.set_pos_y(monitor.pos_y);
-        monitor_.set_pos_z(monitor.pos_z);
-        monitor_.set_vel_x(monitor.vel_x);
-        monitor_.set_vel_y(monitor.vel_y);
-        monitor_.set_vel_z(monitor.vel_z);
-        monitor_.set_cov_xx(monitor.cov_xx);
-        monitor_.set_cov_yy(monitor.cov_yy);
-        monitor_.set_cov_zz(monitor.cov_zz);
-        monitor_.set_cov_xy(monitor.cov_xy);
-        monitor_.set_cov_yz(monitor.cov_yz);
-        monitor_.set_cov_zx(monitor.cov_zx);
-        monitor_.set_latitude(monitor.latitude);
-        monitor_.set_longitude(monitor.longitude);
-        monitor_.set_height(monitor.height);
-        monitor_.set_valid_sats(monitor.valid_sats);
-        monitor_.set_solution_status(monitor.solution_status);
-        monitor_.set_solution_type(monitor.solution_type);
-        monitor_.set_ar_ratio_factor(monitor.AR_ratio_factor);
-        monitor_.set_ar_ratio_threshold(monitor.AR_ratio_threshold);
-        monitor_.set_gdop(monitor.gdop);
-        monitor_.set_pdop(monitor.pdop);
-        monitor_.set_hdop(monitor.hdop);
-        monitor_.set_vdop(monitor.vdop);
+        monitor_.set_tow_at_current_symbol_ms(monitor->TOW_at_current_symbol_ms);
+        monitor_.set_week(monitor->week);
+        monitor_.set_rx_time(monitor->RX_time);
+        monitor_.set_user_clk_offset(monitor->user_clk_offset);
+        monitor_.set_pos_x(monitor->pos_x);
+        monitor_.set_pos_y(monitor->pos_y);
+        monitor_.set_pos_z(monitor->pos_z);
+        monitor_.set_vel_x(monitor->vel_x);
+        monitor_.set_vel_y(monitor->vel_y);
+        monitor_.set_vel_z(monitor->vel_z);
+        monitor_.set_cov_xx(monitor->cov_xx);
+        monitor_.set_cov_yy(monitor->cov_yy);
+        monitor_.set_cov_zz(monitor->cov_zz);
+        monitor_.set_cov_xy(monitor->cov_xy);
+        monitor_.set_cov_yz(monitor->cov_yz);
+        monitor_.set_cov_zx(monitor->cov_zx);
+        monitor_.set_latitude(monitor->latitude);
+        monitor_.set_longitude(monitor->longitude);
+        monitor_.set_height(monitor->height);
+        monitor_.set_valid_sats(monitor->valid_sats);
+        monitor_.set_solution_status(monitor->solution_status);
+        monitor_.set_solution_type(monitor->solution_type);
+        monitor_.set_ar_ratio_factor(monitor->AR_ratio_factor);
+        monitor_.set_ar_ratio_threshold(monitor->AR_ratio_threshold);
+        monitor_.set_gdop(monitor->gdop);
+        monitor_.set_pdop(monitor->pdop);
+        monitor_.set_hdop(monitor->hdop);
+        monitor_.set_vdop(monitor->vdop);
 
         monitor_.SerializeToString(&data);
         return data;
diff --git a/src/algorithms/channel/adapters/CMakeLists.txt b/src/algorithms/channel/adapters/CMakeLists.txt
index 7f439ce56..48f293df5 100644
--- a/src/algorithms/channel/adapters/CMakeLists.txt
+++ b/src/algorithms/channel/adapters/CMakeLists.txt
@@ -31,6 +31,7 @@ target_link_libraries(channel_adapters
         Gnuradio::runtime
         channel_libs
         core_system_parameters
+        core_receiver
     PRIVATE
         Gflags::gflags
         Glog::glog
diff --git a/src/algorithms/channel/adapters/channel.cc b/src/algorithms/channel/adapters/channel.cc
index 98574b3eb..2cea8e915 100644
--- a/src/algorithms/channel/adapters/channel.cc
+++ b/src/algorithms/channel/adapters/channel.cc
@@ -42,7 +42,7 @@
 
 Channel::Channel(ConfigurationInterface* configuration, uint32_t channel, std::shared_ptr<AcquisitionInterface> acq,
     std::shared_ptr<TrackingInterface> trk, std::shared_ptr<TelemetryDecoderInterface> nav,
-    std::string role, std::string implementation, gr::msg_queue::sptr queue)
+    std::string role, std::string implementation, std::shared_ptr<Concurrent_Queue<pmt::pmt_t> > queue)
 {
     acq_ = std::move(acq);
     trk_ = std::move(trk);
diff --git a/src/algorithms/channel/adapters/channel.h b/src/algorithms/channel/adapters/channel.h
index a238f490c..083608331 100644
--- a/src/algorithms/channel/adapters/channel.h
+++ b/src/algorithms/channel/adapters/channel.h
@@ -38,10 +38,11 @@
 #include "channel_fsm.h"
 #include "channel_interface.h"
 #include "channel_msg_receiver_cc.h"
+#include "concurrent_queue.h"
 #include "gnss_signal.h"
 #include "gnss_synchro.h"
 #include <gnuradio/block.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <cstddef>
 #include <cstdint>
 #include <memory>
@@ -66,7 +67,7 @@ public:
     //! Constructor
     Channel(ConfigurationInterface* configuration, uint32_t channel, std::shared_ptr<AcquisitionInterface> acq,
         std::shared_ptr<TrackingInterface> trk, std::shared_ptr<TelemetryDecoderInterface> nav,
-        std::string role, std::string implementation, gr::msg_queue::sptr queue);
+        std::string role, std::string implementation, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~Channel();  //!< Virtual destructor
 
@@ -105,7 +106,7 @@ private:
     bool connected_;
     bool repeat_;
     std::shared_ptr<ChannelFsm> channel_fsm_;
-    gr::msg_queue::sptr queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
     std::mutex mx;
 };
 
diff --git a/src/algorithms/channel/libs/CMakeLists.txt b/src/algorithms/channel/libs/CMakeLists.txt
index ba6e2a274..1ab513f43 100644
--- a/src/algorithms/channel/libs/CMakeLists.txt
+++ b/src/algorithms/channel/libs/CMakeLists.txt
@@ -24,7 +24,7 @@ set(CHANNEL_FSM_SOURCES
 set(CHANNEL_FSM_HEADERS
     channel_fsm.h
     channel_msg_receiver_cc.h
-) 
+)
 
 list(SORT CHANNEL_FSM_HEADERS)
 list(SORT CHANNEL_FSM_SOURCES)
@@ -35,14 +35,14 @@ add_library(channel_libs ${CHANNEL_FSM_SOURCES} ${CHANNEL_FSM_HEADERS})
 
 target_link_libraries(channel_libs
     PUBLIC
+        core_libs
+        core_system_parameters
         Gnuradio::runtime
         Gnuradio::pmt
-        core_system_parameters
     PRIVATE
         Boost::boost
         Gflags::gflags
         Glog::glog
-        core_receiver
 )
 
 if(ENABLE_CLANG_TIDY)
diff --git a/src/algorithms/channel/libs/channel_fsm.cc b/src/algorithms/channel/libs/channel_fsm.cc
index ac533d310..ffc491634 100644
--- a/src/algorithms/channel/libs/channel_fsm.cc
+++ b/src/algorithms/channel/libs/channel_fsm.cc
@@ -31,7 +31,7 @@
  */
 
 #include "channel_fsm.h"
-#include "control_message_factory.h"
+#include "channel_event.h"
 #include <glog/logging.h>
 #include <utility>
 
@@ -179,7 +179,7 @@ void ChannelFsm::set_telemetry(std::shared_ptr<TelemetryDecoderInterface> teleme
 }
 
 
-void ChannelFsm::set_queue(gr::msg_queue::sptr queue)
+void ChannelFsm::set_queue(std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)
 {
     std::lock_guard<std::mutex> lk(mx);
     queue_ = std::move(queue);
@@ -215,29 +215,17 @@ void ChannelFsm::start_acquisition()
 void ChannelFsm::start_tracking()
 {
     trk_->start_tracking();
-    std::unique_ptr<ControlMessageFactory> cmf(new ControlMessageFactory());
-    if (queue_ != gr::msg_queue::make())
-        {
-            queue_->handle(cmf->GetQueueMessage(channel_, 1));
-        }
+    queue_->push(pmt::make_any(channel_event_make(channel_, 1)));
 }
 
 
 void ChannelFsm::request_satellite()
 {
-    std::unique_ptr<ControlMessageFactory> cmf(new ControlMessageFactory());
-    if (queue_ != gr::msg_queue::make())
-        {
-            queue_->handle(cmf->GetQueueMessage(channel_, 0));
-        }
+    queue_->push(pmt::make_any(channel_event_make(channel_, 0)));
 }
 
 
 void ChannelFsm::notify_stop_tracking()
 {
-    std::unique_ptr<ControlMessageFactory> cmf(new ControlMessageFactory());
-    if (queue_ != gr::msg_queue::make())
-        {
-            queue_->handle(cmf->GetQueueMessage(channel_, 2));
-        }
+    queue_->push(pmt::make_any(channel_event_make(channel_, 2)));
 }
diff --git a/src/algorithms/channel/libs/channel_fsm.h b/src/algorithms/channel/libs/channel_fsm.h
index 8a3342511..a083a1507 100644
--- a/src/algorithms/channel/libs/channel_fsm.h
+++ b/src/algorithms/channel/libs/channel_fsm.h
@@ -34,9 +34,10 @@
 #define GNSS_SDR_CHANNEL_FSM_H
 
 #include "acquisition_interface.h"
+#include "concurrent_queue.h"
 #include "telemetry_decoder_interface.h"
 #include "tracking_interface.h"
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <cstdint>
 #include <memory>
 #include <mutex>
@@ -54,7 +55,7 @@ public:
     void set_acquisition(std::shared_ptr<AcquisitionInterface> acquisition);
     void set_tracking(std::shared_ptr<TrackingInterface> tracking);
     void set_telemetry(std::shared_ptr<TelemetryDecoderInterface> telemetry);
-    void set_queue(gr::msg_queue::sptr queue);
+    void set_queue(std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
     void set_channel(uint32_t channel);
     void start_acquisition();
     // FSM EVENTS
@@ -76,7 +77,7 @@ private:
     std::shared_ptr<AcquisitionInterface> acq_;
     std::shared_ptr<TrackingInterface> trk_;
     std::shared_ptr<TelemetryDecoderInterface> nav_;
-    gr::msg_queue::sptr queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
     uint32_t channel_;
     uint32_t d_state;
     std::mutex mx;
diff --git a/src/algorithms/libs/pass_through.cc b/src/algorithms/libs/pass_through.cc
index 1a517a96b..7b4144dd1 100644
--- a/src/algorithms/libs/pass_through.cc
+++ b/src/algorithms/libs/pass_through.cc
@@ -109,6 +109,12 @@ Pass_Through::Pass_Through(ConfigurationInterface* configuration, const std::str
         }
 
     kludge_copy_ = gr::blocks::copy::make(item_size_);
+    unsigned long int max_source_buffer_samples = configuration->property("GNSS-SDR.max_source_buffer_samples", 0);
+    if (max_source_buffer_samples > 0)
+        {
+            kludge_copy_->set_max_output_buffer(max_source_buffer_samples);
+            LOG(INFO) << "Set signal conditioner max output buffer to " << max_source_buffer_samples;
+        }
     DLOG(INFO) << "kludge_copy(" << kludge_copy_->unique_id() << ")";
     if (in_streams_ > 1)
         {
diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc
index 3131d198b..b6abea28f 100644
--- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc
+++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc
@@ -84,6 +84,9 @@ hybrid_observables_gs::hybrid_observables_gs(uint32_t nchannels_in,
     this->message_port_register_in(pmt::mp("pvt_to_observables"));
     this->set_msg_handler(pmt::mp("pvt_to_observables"), boost::bind(&hybrid_observables_gs::msg_handler_pvt_to_observables, this, _1));
 
+    // Send Channel status to gnss_flowgraph
+    this->message_port_register_out(pmt::mp("status"));
+
     d_dump = dump;
     d_dump_mat = dump_mat and d_dump;
     d_dump_filename = std::move(dump_filename);
@@ -140,7 +143,7 @@ hybrid_observables_gs::hybrid_observables_gs(uint32_t nchannels_in,
     T_rx_remnant_to_20ms = 0;
     T_rx_step_ms = 20;  //read from config at the adapter GNSS-SDR.observable_interval_ms!!
     T_rx_TOW_set = false;
-
+    T_status_report_timer_ms = 0;
     // rework
     d_Rx_clock_buffer.set_capacity(10);  // 10*20 ms = 200 ms of data in buffer
     d_Rx_clock_buffer.clear();           // Clear all the elements in the buffer
@@ -618,6 +621,20 @@ int hybrid_observables_gs::general_work(int noutput_items __attribute__((unused)
                 {
                     out[n][0] = epoch_data.at(n);
                 }
+
+            //report channel status every second
+            T_status_report_timer_ms += T_rx_step_ms;
+            if (T_status_report_timer_ms >= 1000)
+                {
+                    for (uint32_t n = 0; n < d_nchannels_out; n++)
+                        {
+                            std::shared_ptr<Gnss_Synchro> gnss_synchro_sptr = std::make_shared<Gnss_Synchro>(epoch_data.at(n));
+                            //publish valid gnss_synchro to the gnss_flowgraph channel status monitor
+                            this->message_port_pub(pmt::mp("status"), pmt::make_any(gnss_synchro_sptr));
+                        }
+                    T_status_report_timer_ms = 0;
+                }
+
             if (d_dump)
                 {
                     // MULTIPLEXED FILE RECORDING - Record results to file
diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.h b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.h
index 39112b160..e2bbfa299 100644
--- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.h
+++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.h
@@ -90,6 +90,7 @@ private:
     uint32_t T_rx_TOW_ms;
     uint32_t T_rx_remnant_to_20ms;
     uint32_t T_rx_step_ms;
+    uint32_t T_status_report_timer_ms;
     uint32_t d_nchannels_in;
     uint32_t d_nchannels_out;
     double T_rx_offset_ms;
diff --git a/src/algorithms/signal_generator/adapters/CMakeLists.txt b/src/algorithms/signal_generator/adapters/CMakeLists.txt
index fb651871e..a519eaa3f 100644
--- a/src/algorithms/signal_generator/adapters/CMakeLists.txt
+++ b/src/algorithms/signal_generator/adapters/CMakeLists.txt
@@ -34,6 +34,7 @@ target_link_libraries(signal_generator_adapters
         Gflags::gflags
         Glog::glog
         algorithms_libs
+        core_receiver
 )
 
 target_include_directories(signal_generator_adapters
diff --git a/src/algorithms/signal_generator/adapters/signal_generator.cc b/src/algorithms/signal_generator/adapters/signal_generator.cc
index c4dc9dc3d..31636f246 100644
--- a/src/algorithms/signal_generator/adapters/signal_generator.cc
+++ b/src/algorithms/signal_generator/adapters/signal_generator.cc
@@ -44,7 +44,7 @@
 
 SignalGenerator::SignalGenerator(ConfigurationInterface* configuration,
     const std::string& role, unsigned int in_stream,
-    unsigned int out_stream, boost::shared_ptr<gr::msg_queue> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
+    unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t> > queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
 {
     std::string default_item_type = "gr_complex";
     std::string default_dump_file = "./data/gen_source.dat";
diff --git a/src/algorithms/signal_generator/adapters/signal_generator.h b/src/algorithms/signal_generator/adapters/signal_generator.h
index e32c431b8..d2adfc27e 100644
--- a/src/algorithms/signal_generator/adapters/signal_generator.h
+++ b/src/algorithms/signal_generator/adapters/signal_generator.h
@@ -33,12 +33,13 @@
 #ifndef GNSS_SDR_SIGNAL_GENERATOR_H_
 #define GNSS_SDR_SIGNAL_GENERATOR_H_
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include "signal_generator_c.h"
 #include <gnuradio/blocks/file_sink.h>
 #include <gnuradio/blocks/vector_to_stream.h>
 #include <gnuradio/hier_block2.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <string>
 #include <vector>
 
@@ -53,7 +54,7 @@ class SignalGenerator : public GNSSBlockInterface
 public:
     SignalGenerator(ConfigurationInterface* configuration,
         const std::string& role, unsigned int in_stream,
-        unsigned int out_stream, boost::shared_ptr<gr::msg_queue> queue);
+        unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t> > queue);
 
     virtual ~SignalGenerator();
 
@@ -91,6 +92,6 @@ private:
     boost::shared_ptr<gr::block> gen_source_;
     gr::blocks::vector_to_stream::sptr vector_to_stream_;
     gr::blocks::file_sink::sptr file_sink_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t> > queue_;
 };
 #endif /*GNSS_SDR_SIGNAL_GENERATOR_H_*/
diff --git a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc
index f83c64f25..dac665cc4 100644
--- a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc
@@ -48,7 +48,7 @@
 
 Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(ConfigurationInterface* configuration,
     const std::string& role, unsigned int in_stream, unsigned int out_stream,
-    boost::shared_ptr<gr::msg_queue> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
 {
     std::string default_item_type = "gr_complex";
     std::string default_dump_file = "./data/signal_source.dat";
diff --git a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h
index 9277c4c2b..e5a917199 100644
--- a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h
+++ b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h
@@ -32,10 +32,11 @@
 #ifndef GNSS_SDR_AD9361_FPGA_SIGNAL_SOURCE_H_
 #define GNSS_SDR_AD9361_FPGA_SIGNAL_SOURCE_H_
 
+#include "concurrent_queue.h"
 #include "fpga_switch.h"
 #include "gnss_block_interface.h"
 #include <boost/shared_ptr.hpp>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <cstdint>
 #include <string>
 
@@ -46,7 +47,7 @@ class Ad9361FpgaSignalSource : public GNSSBlockInterface
 public:
     Ad9361FpgaSignalSource(ConfigurationInterface* configuration,
         const std::string& role, unsigned int in_stream,
-        unsigned int out_stream, boost::shared_ptr<gr::msg_queue> queue);
+        unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     ~Ad9361FpgaSignalSource();
 
@@ -112,7 +113,7 @@ private:
     bool dump_;
     std::string dump_filename_;
 
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
 
     std::shared_ptr<Fpga_Switch> switch_fpga;
 };
diff --git a/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc b/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc
index 024966d0e..a130b32f8 100644
--- a/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc
@@ -40,7 +40,7 @@
 
 CustomUDPSignalSource::CustomUDPSignalSource(ConfigurationInterface* configuration,
     const std::string& role, unsigned int in_stream, unsigned int out_stream,
-    boost::shared_ptr<gr::msg_queue> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
 {
     // DUMP PARAMETERS
     std::string empty = "";
diff --git a/src/algorithms/signal_source/adapters/custom_udp_signal_source.h b/src/algorithms/signal_source/adapters/custom_udp_signal_source.h
index 37e80caf7..3d8d400de 100644
--- a/src/algorithms/signal_source/adapters/custom_udp_signal_source.h
+++ b/src/algorithms/signal_source/adapters/custom_udp_signal_source.h
@@ -32,12 +32,13 @@
 #ifndef GNSS_SDR_CUSTOM_UDP_SIGNAL_SOURCE_H
 #define GNSS_SDR_CUSTOM_UDP_SIGNAL_SOURCE_H
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include "gr_complex_ip_packet_source.h"
 #include <boost/shared_ptr.hpp>
 #include <gnuradio/blocks/file_sink.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <stdexcept>
 #include <string>
 #include <vector>
@@ -54,7 +55,7 @@ class CustomUDPSignalSource : public GNSSBlockInterface
 public:
     CustomUDPSignalSource(ConfigurationInterface* configuration,
         const std::string& role, unsigned int in_stream,
-        unsigned int out_stream, boost::shared_ptr<gr::msg_queue> queue);
+        unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~CustomUDPSignalSource();
 
@@ -98,7 +99,7 @@ private:
     std::vector<boost::shared_ptr<gr::block>> null_sinks_;
     Gr_Complex_Ip_Packet_Source::sptr udp_gnss_rx_source_;
     std::vector<boost::shared_ptr<gr::block>> file_sink_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
 };
 
 #endif /*GNSS_SDR_CUSTOM_UDP_SIGNAL_SOURCE_H */
diff --git a/src/algorithms/signal_source/adapters/file_signal_source.cc b/src/algorithms/signal_source/adapters/file_signal_source.cc
index 59ad90f50..b478b6363 100644
--- a/src/algorithms/signal_source/adapters/file_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/file_signal_source.cc
@@ -44,7 +44,7 @@
 
 FileSignalSource::FileSignalSource(ConfigurationInterface* configuration,
     const std::string& role, unsigned int in_streams, unsigned int out_streams,
-    boost::shared_ptr<gr::msg_queue> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue))
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue))
 {
     std::string default_filename = "./example_capture.dat";
     std::string default_item_type = "short";
diff --git a/src/algorithms/signal_source/adapters/file_signal_source.h b/src/algorithms/signal_source/adapters/file_signal_source.h
index bfded2ce8..86d87798a 100644
--- a/src/algorithms/signal_source/adapters/file_signal_source.h
+++ b/src/algorithms/signal_source/adapters/file_signal_source.h
@@ -35,13 +35,15 @@
 #ifndef GNSS_SDR_FILE_SIGNAL_SOURCE_H_
 #define GNSS_SDR_FILE_SIGNAL_SOURCE_H_
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include <gnuradio/blocks/file_sink.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/throttle.h>
 #include <gnuradio/hier_block2.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <cstdint>
+#include <memory>
 #include <string>
 
 class ConfigurationInterface;
@@ -55,7 +57,7 @@ class FileSignalSource : public GNSSBlockInterface
 public:
     FileSignalSource(ConfigurationInterface* configuration, const std::string& role,
         unsigned int in_streams, unsigned int out_streams,
-        boost::shared_ptr<gr::msg_queue> queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~FileSignalSource();
 
@@ -122,7 +124,7 @@ private:
     boost::shared_ptr<gr::block> valve_;
     gr::blocks::file_sink::sptr sink_;
     gr::blocks::throttle::sptr throttle_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
     size_t item_size_;
     // Throttle control
     bool enable_throttle_control_;
diff --git a/src/algorithms/signal_source/adapters/flexiband_signal_source.cc b/src/algorithms/signal_source/adapters/flexiband_signal_source.cc
index ff3f3f9a0..478a6973d 100644
--- a/src/algorithms/signal_source/adapters/flexiband_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/flexiband_signal_source.cc
@@ -34,7 +34,6 @@
 #include "configuration_interface.h"
 #include <glog/logging.h>
 #include <gnuradio/blocks/file_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <teleorbit/frontend.h>
 #include <utility>
 
@@ -43,10 +42,10 @@ FlexibandSignalSource::FlexibandSignalSource(ConfigurationInterface* configurati
     const std::string& role,
     unsigned int in_stream,
     unsigned int out_stream,
-    gr::msg_queue::sptr queue) : role_(role),
-                                 in_stream_(in_stream),
-                                 out_stream_(out_stream),
-                                 queue_(std::move(queue))
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role),
+                                                           in_stream_(in_stream),
+                                                           out_stream_(out_stream),
+                                                           queue_(std::move(queue))
 {
     std::string default_item_type = "byte";
     item_type_ = configuration->property(role + ".item_type", default_item_type);
diff --git a/src/algorithms/signal_source/adapters/flexiband_signal_source.h b/src/algorithms/signal_source/adapters/flexiband_signal_source.h
index 7da5839a8..56c2aff09 100644
--- a/src/algorithms/signal_source/adapters/flexiband_signal_source.h
+++ b/src/algorithms/signal_source/adapters/flexiband_signal_source.h
@@ -34,13 +34,14 @@
 #ifndef GNSS_SDR_FLEXIBAND_SIGNAL_SOURCE_H_
 #define GNSS_SDR_FLEXIBAND_SIGNAL_SOURCE_H_
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include <gnuradio/blocks/char_to_float.h>
 #include <gnuradio/blocks/file_sink.h>
 #include <gnuradio/blocks/float_to_complex.h>
 #include <gnuradio/blocks/null_sink.h>
 #include <gnuradio/hier_block2.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <string>
 #include <vector>
 
@@ -56,7 +57,7 @@ class FlexibandSignalSource : public GNSSBlockInterface
 public:
     FlexibandSignalSource(ConfigurationInterface* configuration,
         const std::string& role, unsigned int in_stream,
-        unsigned int out_stream, gr::msg_queue::sptr queue);
+        unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~FlexibandSignalSource();
 
@@ -109,7 +110,7 @@ private:
     std::vector<boost::shared_ptr<gr::block>> float_to_complex_;
     std::vector<gr::blocks::null_sink::sptr> null_sinks_;
 
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
 };
 
 #endif  // GNSS_SDR_FLEXIBAND_SIGNAL_SOURCE_H_
diff --git a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc
index 704c5b01e..bfc470dbc 100644
--- a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc
@@ -43,7 +43,7 @@
 
 Fmcomms2SignalSource::Fmcomms2SignalSource(ConfigurationInterface* configuration,
     const std::string& role, unsigned int in_stream, unsigned int out_stream,
-    boost::shared_ptr<gr::msg_queue> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
 {
     std::string default_item_type = "gr_complex";
     std::string default_dump_file = "./data/signal_source.dat";
diff --git a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h
index 1388a514d..44870c182 100644
--- a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h
+++ b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h
@@ -41,7 +41,8 @@
 #else
 #include <iio/fmcomms2_source.h>
 #endif
-#include <gnuradio/msg_queue.h>
+#include "concurrent_queue.h"
+#include <pmt/pmt.h>
 #include <string>
 
 class ConfigurationInterface;
@@ -51,7 +52,7 @@ class Fmcomms2SignalSource : public GNSSBlockInterface
 public:
     Fmcomms2SignalSource(ConfigurationInterface* configuration,
         const std::string& role, unsigned int in_stream,
-        unsigned int out_stream, boost::shared_ptr<gr::msg_queue> queue);
+        unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~Fmcomms2SignalSource();
 
@@ -122,7 +123,7 @@ private:
 
     boost::shared_ptr<gr::block> valve_;
     gr::blocks::file_sink::sptr file_sink_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
 };
 
 #endif /*GNSS_SDR_FMCOMMS2_SIGNAL_SOURCE_H_*/
diff --git a/src/algorithms/signal_source/adapters/gen_signal_source.cc b/src/algorithms/signal_source/adapters/gen_signal_source.cc
index ef8441853..057650ac0 100644
--- a/src/algorithms/signal_source/adapters/gen_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/gen_signal_source.cc
@@ -42,7 +42,7 @@
 
 // Constructor
 GenSignalSource::GenSignalSource(GNSSBlockInterface *signal_generator, GNSSBlockInterface *filter,
-    std::string role, boost::shared_ptr<gr::msg_queue> queue) : signal_generator_(signal_generator),
+    std::string role, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : signal_generator_(signal_generator),
                                                                 filter_(filter),
                                                                 role_(std::move(role)),
                                                                 queue_(std::move(queue))
diff --git a/src/algorithms/signal_source/adapters/gen_signal_source.h b/src/algorithms/signal_source/adapters/gen_signal_source.h
index 49fb25293..d30f8935b 100644
--- a/src/algorithms/signal_source/adapters/gen_signal_source.h
+++ b/src/algorithms/signal_source/adapters/gen_signal_source.h
@@ -34,8 +34,9 @@
 #define GNSS_SDR_GEN_SIGNAL_SOURCE_H_
 
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <string>
 
 /*!
@@ -47,7 +48,7 @@ class GenSignalSource : public GNSSBlockInterface
 public:
     //! Constructor
     GenSignalSource(GNSSBlockInterface *signal_generator, GNSSBlockInterface *filter,
-        std::string role, boost::shared_ptr<gr::msg_queue> queue);
+        std::string role, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     //! Virtual destructor
     virtual ~GenSignalSource();
@@ -58,20 +59,17 @@ public:
     gr::basic_block_sptr get_right_block() override;
 
     inline std::string role() override { return role_; }
-
     //! Returns "Signal Source"
     inline std::string implementation() override { return "Signal Source"; }
     inline size_t item_size() override { return 0; }
-
     inline GNSSBlockInterface *signal_generator() const { return signal_generator_; }
-
 private:
     GNSSBlockInterface *signal_generator_;
     GNSSBlockInterface *filter_;
     std::string role_;
     std::string implementation_;
     bool connected_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
 };
 
 #endif /*GNSS_SDR_GEN_SIGNAL_SOURCE_H*/
diff --git a/src/algorithms/signal_source/adapters/gn3s_signal_source.cc b/src/algorithms/signal_source/adapters/gn3s_signal_source.cc
index 3f66591e9..4a699d09d 100644
--- a/src/algorithms/signal_source/adapters/gn3s_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/gn3s_signal_source.cc
@@ -32,12 +32,11 @@
 #include "configuration_interface.h"
 #include <glog/logging.h>
 #include <gnuradio/blocks/file_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gn3s/gn3s_source_cc.h>
 
 
 Gn3sSignalSource::Gn3sSignalSource(ConfigurationInterface* configuration,
-    std::string role, unsigned int in_stream, unsigned int out_stream, gr::msg_queue::sptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue)
+    std::string role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue)
 {
     std::string default_item_type = "short";
     std::string default_dump_file = "./data/gn3s_source.dat";
diff --git a/src/algorithms/signal_source/adapters/gn3s_signal_source.h b/src/algorithms/signal_source/adapters/gn3s_signal_source.h
index df799f019..e34b91afe 100644
--- a/src/algorithms/signal_source/adapters/gn3s_signal_source.h
+++ b/src/algorithms/signal_source/adapters/gn3s_signal_source.h
@@ -32,10 +32,11 @@
 #ifndef GNSS_SDR_GN3S_SIGNAL_SOURCE_H_
 #define GNSS_SDR_GN3S_SIGNAL_SOURCE_H_
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include <gnuradio/blocks/file_sink.h>
 #include <gnuradio/hier_block2.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <string>
 
 
@@ -49,7 +50,7 @@ class Gn3sSignalSource : public GNSSBlockInterface
 public:
     Gn3sSignalSource(ConfigurationInterface* configuration,
         std::string role, unsigned int in_stream,
-        unsigned int out_stream, gr::msg_queue::sptr queue);
+        unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~Gn3sSignalSource();
 
@@ -87,7 +88,7 @@ private:
     std::string dump_filename_;
     gr::block_sptr gn3s_source_;
     gr::blocks::file_sink::sptr file_sink_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
 };
 
 #endif /*GNSS_SDR_GN3S_SIGNAL_SOURCE_H_*/
diff --git a/src/algorithms/signal_source/adapters/labsat_signal_source.cc b/src/algorithms/signal_source/adapters/labsat_signal_source.cc
index 2fb8ba3b7..e6366261a 100644
--- a/src/algorithms/signal_source/adapters/labsat_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/labsat_signal_source.cc
@@ -37,7 +37,7 @@
 
 
 LabsatSignalSource::LabsatSignalSource(ConfigurationInterface* configuration,
-    const std::string& role, unsigned int in_stream, unsigned int out_stream, gr::msg_queue::sptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
+    const std::string& role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
 {
     std::string default_item_type = "gr_complex";
     std::string default_dump_file = "./labsat_output.dat";
diff --git a/src/algorithms/signal_source/adapters/labsat_signal_source.h b/src/algorithms/signal_source/adapters/labsat_signal_source.h
index 1d9e333bf..9bf5d2057 100644
--- a/src/algorithms/signal_source/adapters/labsat_signal_source.h
+++ b/src/algorithms/signal_source/adapters/labsat_signal_source.h
@@ -32,10 +32,11 @@
 #ifndef GNSS_SDR_LABSAT_SIGNAL_SOURCE_H_
 #define GNSS_SDR_LABSAT_SIGNAL_SOURCE_H_
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include <gnuradio/blocks/file_sink.h>
 #include <gnuradio/hier_block2.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <string>
 
 class ConfigurationInterface;
@@ -48,7 +49,7 @@ class LabsatSignalSource : public GNSSBlockInterface
 public:
     LabsatSignalSource(ConfigurationInterface* configuration,
         const std::string& role, unsigned int in_stream,
-        unsigned int out_stream, gr::msg_queue::sptr queue);
+        unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~LabsatSignalSource();
 
@@ -86,7 +87,7 @@ private:
     std::string dump_filename_;
     gr::block_sptr labsat23_source_;
     gr::blocks::file_sink::sptr file_sink_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
 };
 
 #endif /*GNSS_SDR_LABSAT_SIGNAL_SOURCE_H_*/
diff --git a/src/algorithms/signal_source/adapters/multichannel_file_signal_source.cc b/src/algorithms/signal_source/adapters/multichannel_file_signal_source.cc
index 11efe4fd9..330b3e43c 100644
--- a/src/algorithms/signal_source/adapters/multichannel_file_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/multichannel_file_signal_source.cc
@@ -43,7 +43,7 @@
 
 MultichannelFileSignalSource::MultichannelFileSignalSource(ConfigurationInterface* configuration,
     const std::string& role, unsigned int in_streams, unsigned int out_streams,
-    boost::shared_ptr<gr::msg_queue> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue))
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue))
 {
     std::string default_filename = "./example_capture.dat";
     std::string default_item_type = "short";
diff --git a/src/algorithms/signal_source/adapters/multichannel_file_signal_source.h b/src/algorithms/signal_source/adapters/multichannel_file_signal_source.h
index b248073dd..db3a9c57c 100644
--- a/src/algorithms/signal_source/adapters/multichannel_file_signal_source.h
+++ b/src/algorithms/signal_source/adapters/multichannel_file_signal_source.h
@@ -35,12 +35,13 @@
 #ifndef GNSS_SDR_MULTICHANNEL_FILE_SIGNAL_SOURCE_H_
 #define GNSS_SDR_MULTICHANNEL_FILE_SIGNAL_SOURCE_H_
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include <gnuradio/blocks/file_sink.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/throttle.h>
 #include <gnuradio/hier_block2.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <cstdint>
 #include <string>
 #include <vector>
@@ -56,7 +57,7 @@ class MultichannelFileSignalSource : public GNSSBlockInterface
 public:
     MultichannelFileSignalSource(ConfigurationInterface* configuration, const std::string& role,
         unsigned int in_streams, unsigned int out_streams,
-        boost::shared_ptr<gr::msg_queue> queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~MultichannelFileSignalSource();
 
@@ -122,7 +123,7 @@ private:
     boost::shared_ptr<gr::block> valve_;
     gr::blocks::file_sink::sptr sink_;
     std::vector<gr::blocks::throttle::sptr> throttle_vec_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
     size_t item_size_;
     // Throttle control
     bool enable_throttle_control_;
diff --git a/src/algorithms/signal_source/adapters/nsr_file_signal_source.cc b/src/algorithms/signal_source/adapters/nsr_file_signal_source.cc
index aa31e75a6..dc00bcecb 100644
--- a/src/algorithms/signal_source/adapters/nsr_file_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/nsr_file_signal_source.cc
@@ -44,7 +44,7 @@
 
 NsrFileSignalSource::NsrFileSignalSource(ConfigurationInterface* configuration,
     const std::string& role, unsigned int in_streams, unsigned int out_streams,
-    boost::shared_ptr<gr::msg_queue> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue))
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue))
 {
     std::string default_filename = "../data/my_capture.dat";
     std::string default_item_type = "byte";
diff --git a/src/algorithms/signal_source/adapters/nsr_file_signal_source.h b/src/algorithms/signal_source/adapters/nsr_file_signal_source.h
index a2b3ee547..2efaa09b3 100644
--- a/src/algorithms/signal_source/adapters/nsr_file_signal_source.h
+++ b/src/algorithms/signal_source/adapters/nsr_file_signal_source.h
@@ -35,13 +35,14 @@
 #ifndef GNSS_SDR_NSR_FILE_SIGNAL_SOURCE_H_
 #define GNSS_SDR_NSR_FILE_SIGNAL_SOURCE_H_
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include "unpack_byte_2bit_samples.h"
 #include <gnuradio/blocks/file_sink.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/throttle.h>
 #include <gnuradio/hier_block2.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <string>
 
 class ConfigurationInterface;
@@ -55,7 +56,7 @@ class NsrFileSignalSource : public GNSSBlockInterface
 public:
     NsrFileSignalSource(ConfigurationInterface* configuration, const std::string& role,
         unsigned int in_streams, unsigned int out_streams,
-        boost::shared_ptr<gr::msg_queue> queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~NsrFileSignalSource();
     inline std::string role() override
@@ -122,7 +123,7 @@ private:
     boost::shared_ptr<gr::block> valve_;
     gr::blocks::file_sink::sptr sink_;
     gr::blocks::throttle::sptr throttle_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
     size_t item_size_;
     // Throttle control
     bool enable_throttle_control_;
diff --git a/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc b/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc
index 32ea28cf0..38f823248 100644
--- a/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc
@@ -42,7 +42,7 @@
 
 OsmosdrSignalSource::OsmosdrSignalSource(ConfigurationInterface* configuration,
     const std::string& role, unsigned int in_stream, unsigned int out_stream,
-    boost::shared_ptr<gr::msg_queue> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
 {
     // DUMP PARAMETERS
     std::string empty = "";
diff --git a/src/algorithms/signal_source/adapters/osmosdr_signal_source.h b/src/algorithms/signal_source/adapters/osmosdr_signal_source.h
index 15f38b2a3..8a96f32d6 100644
--- a/src/algorithms/signal_source/adapters/osmosdr_signal_source.h
+++ b/src/algorithms/signal_source/adapters/osmosdr_signal_source.h
@@ -33,10 +33,11 @@
 #ifndef GNSS_SDR_OSMOSDR_SIGNAL_SOURCE_H_
 #define GNSS_SDR_OSMOSDR_SIGNAL_SOURCE_H_
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include <boost/shared_ptr.hpp>
 #include <gnuradio/blocks/file_sink.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <cstdint>
 #include <osmosdr/source.h>
 #include <stdexcept>
@@ -54,7 +55,7 @@ class OsmosdrSignalSource : public GNSSBlockInterface
 public:
     OsmosdrSignalSource(ConfigurationInterface* configuration,
         const std::string& role, unsigned int in_stream,
-        unsigned int out_stream, boost::shared_ptr<gr::msg_queue> queue);
+        unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~OsmosdrSignalSource();
 
@@ -110,7 +111,7 @@ private:
 
     boost::shared_ptr<gr::block> valve_;
     gr::blocks::file_sink::sptr file_sink_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
 };
 
 #endif /*GNSS_SDR_OSMOSDR_SIGNAL_SOURCE_H_*/
diff --git a/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc b/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc
index fc41bd3a9..ba6af1fd6 100644
--- a/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc
@@ -39,7 +39,7 @@
 
 PlutosdrSignalSource::PlutosdrSignalSource(ConfigurationInterface* configuration,
     const std::string& role, unsigned int in_stream, unsigned int out_stream,
-    boost::shared_ptr<gr::msg_queue> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
 {
     std::string default_item_type = "gr_complex";
     std::string default_dump_file = "./data/signal_source.dat";
diff --git a/src/algorithms/signal_source/adapters/plutosdr_signal_source.h b/src/algorithms/signal_source/adapters/plutosdr_signal_source.h
index e765ff7c4..bc105d171 100644
--- a/src/algorithms/signal_source/adapters/plutosdr_signal_source.h
+++ b/src/algorithms/signal_source/adapters/plutosdr_signal_source.h
@@ -40,7 +40,8 @@
 #else
 #include <iio/pluto_source.h>
 #endif
-#include <gnuradio/msg_queue.h>
+#include "concurrent_queue.h"
+#include <pmt/pmt.h>
 #include <string>
 
 
@@ -53,7 +54,7 @@ class PlutosdrSignalSource : public GNSSBlockInterface
 public:
     PlutosdrSignalSource(ConfigurationInterface* configuration,
         const std::string& role, unsigned int in_stream,
-        unsigned int out_stream, boost::shared_ptr<gr::msg_queue> queue);
+        unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~PlutosdrSignalSource();
 
@@ -109,7 +110,7 @@ private:
 
     boost::shared_ptr<gr::block> valve_;
     gr::blocks::file_sink::sptr file_sink_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
 };
 
 #endif /*GNSS_SDR_PLUTOSDR_SIGNAL_SOURCE_H_*/
diff --git a/src/algorithms/signal_source/adapters/raw_array_signal_source.cc b/src/algorithms/signal_source/adapters/raw_array_signal_source.cc
index f9aab0987..d54a7cb19 100644
--- a/src/algorithms/signal_source/adapters/raw_array_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/raw_array_signal_source.cc
@@ -29,15 +29,16 @@
  */
 
 #include "raw_array_signal_source.h"
+#include "concurrent_queue.h"
 #include "configuration_interface.h"
 #include <glog/logging.h>
 #include <gnuradio/blocks/file_sink.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <dbfcttc/raw_array.h>
 
 
 RawArraySignalSource::RawArraySignalSource(ConfigurationInterface* configuration,
-    std::string role, unsigned int in_stream, unsigned int out_stream, gr::msg_queue::sptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue)
+    std::string role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue)
 {
     std::string default_item_type = "gr_complex";
     std::string default_dump_file = "./data/raw_array_source.dat";
diff --git a/src/algorithms/signal_source/adapters/raw_array_signal_source.h b/src/algorithms/signal_source/adapters/raw_array_signal_source.h
index 321895cef..750efb3fe 100644
--- a/src/algorithms/signal_source/adapters/raw_array_signal_source.h
+++ b/src/algorithms/signal_source/adapters/raw_array_signal_source.h
@@ -32,10 +32,11 @@
 #ifndef GNSS_SDR_RAW_ARRAY_SIGNAL_SOURCE_H_
 #define GNSS_SDR_RAW_ARRAY_SIGNAL_SOURCE_H_
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include <gnuradio/blocks/file_sink.h>
 #include <gnuradio/hier_block2.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <string>
 
 class ConfigurationInterface;
@@ -48,7 +49,7 @@ class RawArraySignalSource : public GNSSBlockInterface
 public:
     RawArraySignalSource(ConfigurationInterface* configuration,
         std::string role, unsigned int in_stream,
-        unsigned int out_stream, gr::msg_queue::sptr queue);
+        unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~RawArraySignalSource();
 
@@ -87,7 +88,7 @@ private:
     std::string eth_device_;
     gr::block_sptr raw_array_source_;
     gr::blocks::file_sink::sptr file_sink_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
 };
 
 #endif /*GNSS_SDR_RAW_ARRAY_SIGNAL_SOURCE_H_*/
diff --git a/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.cc b/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.cc
index 2b9574708..478e6b1c7 100644
--- a/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.cc
@@ -45,7 +45,7 @@ RtlTcpSignalSource::RtlTcpSignalSource(ConfigurationInterface* configuration,
     const std::string& role,
     unsigned int in_stream,
     unsigned int out_stream,
-    boost::shared_ptr<gr::msg_queue> queue) : role_(role),
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role),
                                               in_stream_(in_stream),
                                               out_stream_(out_stream),
                                               queue_(std::move(queue))
diff --git a/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.h b/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.h
index 74f2b02d5..2fcb9d871 100644
--- a/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.h
+++ b/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.h
@@ -32,13 +32,14 @@
 #ifndef GNSS_SDR_RTL_TCP_SIGNAL_SOURCE_H
 #define GNSS_SDR_RTL_TCP_SIGNAL_SOURCE_H
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include "rtl_tcp_signal_source_c.h"
 #include <boost/shared_ptr.hpp>
 #include <gnuradio/blocks/deinterleave.h>
 #include <gnuradio/blocks/file_sink.h>
 #include <gnuradio/blocks/float_to_complex.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <stdexcept>
 #include <string>
 
@@ -57,7 +58,7 @@ public:
         const std::string& role,
         unsigned int in_stream,
         unsigned int out_stream,
-        boost::shared_ptr<gr::msg_queue> queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~RtlTcpSignalSource();
 
@@ -113,7 +114,7 @@ private:
 
     boost::shared_ptr<gr::block> valve_;
     gr::blocks::file_sink::sptr file_sink_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
 };
 
 #endif /*GNSS_SDR_RTL_TCP_SIGNAL_SOURCE_H */
diff --git a/src/algorithms/signal_source/adapters/spir_file_signal_source.cc b/src/algorithms/signal_source/adapters/spir_file_signal_source.cc
index 52964abba..91287020c 100644
--- a/src/algorithms/signal_source/adapters/spir_file_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/spir_file_signal_source.cc
@@ -43,7 +43,7 @@
 
 SpirFileSignalSource::SpirFileSignalSource(ConfigurationInterface* configuration,
     const std::string& role, unsigned int in_streams, unsigned int out_streams,
-    boost::shared_ptr<gr::msg_queue> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue))
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue))
 {
     std::string default_filename = "../data/my_capture.dat";
     std::string default_item_type = "int";
diff --git a/src/algorithms/signal_source/adapters/spir_file_signal_source.h b/src/algorithms/signal_source/adapters/spir_file_signal_source.h
index ad76ce23b..09aff8c09 100644
--- a/src/algorithms/signal_source/adapters/spir_file_signal_source.h
+++ b/src/algorithms/signal_source/adapters/spir_file_signal_source.h
@@ -32,13 +32,14 @@
 #ifndef GNSS_SDR_SPIR_FILE_SIGNAL_SOURCE_H_
 #define GNSS_SDR_SPIR_FILE_SIGNAL_SOURCE_H_
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include "unpack_intspir_1bit_samples.h"
 #include <gnuradio/blocks/file_sink.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/throttle.h>
 #include <gnuradio/hier_block2.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <cstdint>
 #include <string>
 
@@ -53,7 +54,7 @@ class SpirFileSignalSource : public GNSSBlockInterface
 public:
     SpirFileSignalSource(ConfigurationInterface* configuration, const std::string& role,
         unsigned int in_streams, unsigned int out_streams,
-        boost::shared_ptr<gr::msg_queue> queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~SpirFileSignalSource();
     inline std::string role() override
@@ -120,7 +121,7 @@ private:
     boost::shared_ptr<gr::block> valve_;
     gr::blocks::file_sink::sptr sink_;
     gr::blocks::throttle::sptr throttle_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
     size_t item_size_;
     // Throttle control
     bool enable_throttle_control_;
diff --git a/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc b/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc
index 7e1c3f1ce..1ba2d5bf0 100644
--- a/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc
@@ -40,7 +40,7 @@
 
 
 SpirGSS6450FileSignalSource::SpirGSS6450FileSignalSource(ConfigurationInterface* configuration,
-    const std::string& role, uint32_t in_streams, uint32_t out_streams, gr::msg_queue::sptr queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue))
+    const std::string& role, uint32_t in_streams, uint32_t out_streams, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue))
 {
     std::string default_filename = "../data/my_capture.dat";
     std::string default_dump_filename = "../data/my_capture_dump.dat";
diff --git a/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.h b/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.h
index 0757c24af..61edd479c 100644
--- a/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.h
+++ b/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.h
@@ -32,6 +32,7 @@
 #ifndef GNSS_SDR_SPIR_GSS6450_FILE_SIGNAL_SOURCE_H_
 #define GNSS_SDR_SPIR_GSS6450_FILE_SIGNAL_SOURCE_H_
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
 #include "unpack_spir_gss6450_samples.h"
@@ -42,7 +43,7 @@
 #include <gnuradio/blocks/null_sink.h>
 #include <gnuradio/blocks/throttle.h>
 #include <gnuradio/hier_block2.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <cstdint>
 #include <string>
 #include <vector>
@@ -58,7 +59,7 @@ class SpirGSS6450FileSignalSource : public GNSSBlockInterface
 {
 public:
     SpirGSS6450FileSignalSource(ConfigurationInterface* configuration, const std::string& role,
-        uint32_t in_streams, uint32_t out_streams, gr::msg_queue::sptr queue);
+        uint32_t in_streams, uint32_t out_streams, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~SpirGSS6450FileSignalSource();
     inline std::string role() override
@@ -131,7 +132,7 @@ private:
     std::vector<boost::shared_ptr<gr::block>> valve_vec_;
     std::vector<gr::blocks::file_sink::sptr> sink_vec_;
     std::vector<gr::blocks::throttle::sptr> throttle_vec_;
-    gr::msg_queue::sptr queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
     size_t item_size_;
 };
 
diff --git a/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.cc b/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.cc
index 604f9c536..9e0b802d4 100644
--- a/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.cc
@@ -45,7 +45,7 @@ TwoBitCpxFileSignalSource::TwoBitCpxFileSignalSource(ConfigurationInterface* con
     const std::string& role,
     unsigned int in_streams,
     unsigned int out_streams,
-    boost::shared_ptr<gr::msg_queue> queue) : role_(role),
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role),
                                               in_streams_(in_streams),
                                               out_streams_(out_streams),
                                               queue_(std::move(queue))
diff --git a/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.h b/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.h
index a66a87965..dea315cec 100644
--- a/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.h
+++ b/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.h
@@ -34,6 +34,7 @@
 #ifndef GNSS_SDR_TWO_BIT_CPX_FILE_SIGNAL_SOURCE_H_
 #define GNSS_SDR_TWO_BIT_CPX_FILE_SIGNAL_SOURCE_H_
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include "unpack_byte_2bit_cpx_samples.h"
 #include <gnuradio/blocks/file_sink.h>
@@ -41,7 +42,7 @@
 #include <gnuradio/blocks/interleaved_short_to_complex.h>
 #include <gnuradio/blocks/throttle.h>
 #include <gnuradio/hier_block2.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <cstdint>
 #include <string>
 
@@ -59,7 +60,7 @@ public:
         const std::string& role,
         unsigned int in_streams,
         unsigned int out_streams,
-        boost::shared_ptr<gr::msg_queue> queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~TwoBitCpxFileSignalSource();
     inline std::string role() override
@@ -127,7 +128,7 @@ private:
     boost::shared_ptr<gr::block> valve_;
     gr::blocks::file_sink::sptr sink_;
     gr::blocks::throttle::sptr throttle_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
     size_t item_size_;
     // Throttle control
     bool enable_throttle_control_;
diff --git a/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.cc b/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.cc
index 684cb5b86..4b0c00345 100644
--- a/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.cc
@@ -47,7 +47,7 @@ TwoBitPackedFileSignalSource::TwoBitPackedFileSignalSource(ConfigurationInterfac
     const std::string& role,
     unsigned int in_streams,
     unsigned int out_streams,
-    boost::shared_ptr<gr::msg_queue> queue) : role_(role),
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role),
                                               in_streams_(in_streams),
                                               out_streams_(out_streams),
                                               queue_(std::move(queue))
diff --git a/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.h b/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.h
index 1e98d737b..ea2bb2d5a 100644
--- a/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.h
+++ b/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.h
@@ -35,6 +35,7 @@
 #ifndef GNSS_SDR_TWO_BIT_PACKED_FILE_SIGNAL_SOURCE_H_
 #define GNSS_SDR_TWO_BIT_PACKED_FILE_SIGNAL_SOURCE_H_
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include "unpack_2bit_samples.h"
 #include <gnuradio/blocks/file_sink.h>
@@ -42,7 +43,7 @@
 #include <gnuradio/blocks/interleaved_char_to_complex.h>
 #include <gnuradio/blocks/throttle.h>
 #include <gnuradio/hier_block2.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <cstdint>
 #include <string>
 
@@ -58,7 +59,7 @@ class TwoBitPackedFileSignalSource : public GNSSBlockInterface
 public:
     TwoBitPackedFileSignalSource(ConfigurationInterface* configuration, const std::string& role,
         unsigned int in_streams, unsigned int out_streams,
-        boost::shared_ptr<gr::msg_queue> queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~TwoBitPackedFileSignalSource();
     inline std::string role() override
@@ -146,7 +147,7 @@ private:
     boost::shared_ptr<gr::block> valve_;
     gr::blocks::file_sink::sptr sink_;
     gr::blocks::throttle::sptr throttle_;
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
     size_t item_size_;
     bool big_endian_items_;
     bool big_endian_bytes_;
diff --git a/src/algorithms/signal_source/adapters/uhd_signal_source.cc b/src/algorithms/signal_source/adapters/uhd_signal_source.cc
index ee58eb551..646d2ad00 100644
--- a/src/algorithms/signal_source/adapters/uhd_signal_source.cc
+++ b/src/algorithms/signal_source/adapters/uhd_signal_source.cc
@@ -42,7 +42,7 @@
 
 UhdSignalSource::UhdSignalSource(ConfigurationInterface* configuration,
     const std::string& role, unsigned int in_stream, unsigned int out_stream,
-    boost::shared_ptr<gr::msg_queue> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue))
 {
     // DUMP PARAMETERS
     std::string empty = "";
diff --git a/src/algorithms/signal_source/adapters/uhd_signal_source.h b/src/algorithms/signal_source/adapters/uhd_signal_source.h
index 50d233c2e..232f6934f 100644
--- a/src/algorithms/signal_source/adapters/uhd_signal_source.h
+++ b/src/algorithms/signal_source/adapters/uhd_signal_source.h
@@ -31,12 +31,13 @@
 #ifndef GNSS_SDR_UHD_SIGNAL_SOURCE_H_
 #define GNSS_SDR_UHD_SIGNAL_SOURCE_H_
 
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include <boost/shared_ptr.hpp>
 #include <gnuradio/blocks/file_sink.h>
 #include <gnuradio/hier_block2.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/uhd/usrp_source.h>
+#include <pmt/pmt.h>
 #include <cstdint>
 #include <string>
 #include <vector>
@@ -52,7 +53,7 @@ class UhdSignalSource : public GNSSBlockInterface
 public:
     UhdSignalSource(ConfigurationInterface* configuration,
         const std::string& role, unsigned int in_stream,
-        unsigned int out_stream, boost::shared_ptr<gr::msg_queue> queue);
+        unsigned int out_stream, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     virtual ~UhdSignalSource();
 
@@ -107,7 +108,7 @@ private:
     std::vector<boost::shared_ptr<gr::block>> valve_;
     std::vector<gr::blocks::file_sink::sptr> file_sink_;
 
-    boost::shared_ptr<gr::msg_queue> queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
 };
 
 #endif /*GNSS_SDR_UHD_SIGNAL_SOURCE_H_*/
diff --git a/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.cc b/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.cc
index 06972a25a..366eb558f 100644
--- a/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.cc
+++ b/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.cc
@@ -30,7 +30,8 @@
 
 
 #include "labsat23_source.h"
-#include "control_message_factory.h"
+#include "command_event.h"
+#include <boost/any.hpp>
 #include <gnuradio/io_signature.h>
 #include <array>
 #include <exception>
@@ -39,7 +40,7 @@
 #include <utility>
 
 
-labsat23_source_sptr labsat23_make_source_sptr(const char *signal_file_basename, int channel_selector, gr::msg_queue::sptr queue)
+labsat23_source_sptr labsat23_make_source_sptr(const char *signal_file_basename, int channel_selector, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)
 {
     return labsat23_source_sptr(new labsat23_source(signal_file_basename, channel_selector, std::move(queue)));
 }
@@ -47,10 +48,10 @@ labsat23_source_sptr labsat23_make_source_sptr(const char *signal_file_basename,
 
 labsat23_source::labsat23_source(const char *signal_file_basename,
     int channel_selector,
-    gr::msg_queue::sptr queue) : gr::block("labsat23_source",
-                                     gr::io_signature::make(0, 0, 0),
-                                     gr::io_signature::make(1, 1, sizeof(gr_complex))),
-                                 d_queue(std::move(queue))
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue) : gr::block("labsat23_source",
+                                                               gr::io_signature::make(0, 0, 0),
+                                                               gr::io_signature::make(1, 1, sizeof(gr_complex))),
+                                                           d_queue(std::move(queue))
 {
     if (channel_selector < 1 or channel_selector > 2)
         {
@@ -467,9 +468,8 @@ int labsat23_source::general_work(int noutput_items,
                                         {
                                             std::cout << "End of file reached, LabSat source stop" << std::endl;
                                         }
-                                    auto *cmf = new ControlMessageFactory();
-                                    d_queue->handle(cmf->GetQueueMessage(200, 0));
-                                    delete cmf;
+
+                                    d_queue->push(pmt::make_any(command_event_make(200, 0)));
                                     return -1;
                                 }
                         }
@@ -528,9 +528,7 @@ int labsat23_source::general_work(int noutput_items,
                                         {
                                             std::cout << "End of file reached, LabSat source stop" << std::endl;
                                         }
-                                    auto *cmf = new ControlMessageFactory();
-                                    d_queue->handle(cmf->GetQueueMessage(200, 0));
-                                    delete cmf;
+                                    d_queue->push(pmt::make_any(command_event_make(200, 0)));
                                     return -1;
                                 }
                         }
diff --git a/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.h b/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.h
index a09c0f3a8..49c74bc61 100644
--- a/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.h
+++ b/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.h
@@ -31,8 +31,9 @@
 #ifndef GNSS_SDR_LABSAT23_SOURCE_H
 #define GNSS_SDR_LABSAT23_SOURCE_H
 
+#include "concurrent_queue.h"
 #include <gnuradio/block.h>
-#include <gnuradio/msg_queue.h>  // for msg_queue, msg_queue::sptr
+#include <pmt/pmt.h>
 #include <cstdint>
 #include <fstream>
 #include <string>
@@ -45,7 +46,7 @@ using labsat23_source_sptr = boost::shared_ptr<labsat23_source>;
 labsat23_source_sptr labsat23_make_source_sptr(
     const char *signal_file_basename,
     int channel_selector,
-    gr::msg_queue::sptr queue);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
 /*!
  * \brief This class implements conversion between Labsat2 and 3 format byte packet samples to gr_complex
@@ -64,11 +65,11 @@ private:
     friend labsat23_source_sptr labsat23_make_source_sptr(
         const char *signal_file_basename,
         int channel_selector,
-        gr::msg_queue::sptr queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     labsat23_source(const char *signal_file_basename,
         int channel_selector,
-        gr::msg_queue::sptr queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     std::string generate_filename();
     void decode_samples_one_channel(int16_t input_short, gr_complex *out, int type);
@@ -82,7 +83,7 @@ private:
     std::ifstream *binary_input_file;
     uint8_t d_ref_clock;
     uint8_t d_bits_per_sample;
-    gr::msg_queue::sptr d_queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> d_queue;
 };
 
 #endif
diff --git a/src/algorithms/signal_source/libs/CMakeLists.txt b/src/algorithms/signal_source/libs/CMakeLists.txt
index f6015ec59..1045967b4 100644
--- a/src/algorithms/signal_source/libs/CMakeLists.txt
+++ b/src/algorithms/signal_source/libs/CMakeLists.txt
@@ -71,10 +71,10 @@ target_link_libraries(signal_source_libs
     PUBLIC
         Boost::boost
         Gnuradio::runtime
+        core_receiver
     PRIVATE
         Gflags::gflags
         Glog::glog
-        core_receiver
 )
 
 if(ENABLE_PLUTOSDR OR ENABLE_FMCOMMS2)
diff --git a/src/algorithms/signal_source/libs/gnss_sdr_valve.cc b/src/algorithms/signal_source/libs/gnss_sdr_valve.cc
index 615cb65b7..7a5fc18a9 100644
--- a/src/algorithms/signal_source/libs/gnss_sdr_valve.cc
+++ b/src/algorithms/signal_source/libs/gnss_sdr_valve.cc
@@ -32,17 +32,17 @@
  */
 
 #include "gnss_sdr_valve.h"
-#include "control_message_factory.h"  // for ControlMessageFactory
-#include <glog/logging.h>             // for LOG
-#include <gnuradio/io_signature.h>    // for io_signature
-#include <algorithm>                  // for min
-#include <cstring>                    // for memcpy
-#include <unistd.h>                   // for usleep
+#include "command_event.h"
+#include <glog/logging.h>           // for LOG
+#include <gnuradio/io_signature.h>  // for io_signature
+#include <algorithm>                // for min
+#include <cstring>                  // for memcpy
+#include <unistd.h>                 // for usleep
 #include <utility>
 
 Gnss_Sdr_Valve::Gnss_Sdr_Valve(size_t sizeof_stream_item,
     uint64_t nitems,
-    gr::msg_queue::sptr queue,
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue,
     bool stop_flowgraph) : gr::sync_block("valve",
                                gr::io_signature::make(1, 20, sizeof_stream_item),
                                gr::io_signature::make(1, 20, sizeof_stream_item)),
@@ -55,14 +55,14 @@ Gnss_Sdr_Valve::Gnss_Sdr_Valve(size_t sizeof_stream_item,
 }
 
 
-boost::shared_ptr<Gnss_Sdr_Valve> gnss_sdr_make_valve(size_t sizeof_stream_item, uint64_t nitems, gr::msg_queue::sptr queue, bool stop_flowgraph)
+boost::shared_ptr<Gnss_Sdr_Valve> gnss_sdr_make_valve(size_t sizeof_stream_item, uint64_t nitems, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue, bool stop_flowgraph)
 {
     boost::shared_ptr<Gnss_Sdr_Valve> valve_(new Gnss_Sdr_Valve(sizeof_stream_item, nitems, std::move(queue), stop_flowgraph));
     return valve_;
 }
 
 
-boost::shared_ptr<Gnss_Sdr_Valve> gnss_sdr_make_valve(size_t sizeof_stream_item, uint64_t nitems, gr::msg_queue::sptr queue)
+boost::shared_ptr<Gnss_Sdr_Valve> gnss_sdr_make_valve(size_t sizeof_stream_item, uint64_t nitems, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)
 {
     boost::shared_ptr<Gnss_Sdr_Valve> valve_(new Gnss_Sdr_Valve(sizeof_stream_item, nitems, std::move(queue), true));
     return valve_;
@@ -83,10 +83,8 @@ int Gnss_Sdr_Valve::work(int noutput_items,
         {
             if (d_ncopied_items >= d_nitems)
                 {
-                    auto *cmf = new ControlMessageFactory();
-                    d_queue->handle(cmf->GetQueueMessage(200, 0));
                     LOG(INFO) << "Stopping receiver, " << d_ncopied_items << " samples processed";
-                    delete cmf;
+                    d_queue->push(pmt::make_any(command_event_make(200, 0)));
                     if (d_stop_flowgraph)
                         {
                             return -1;  // Done!
diff --git a/src/algorithms/signal_source/libs/gnss_sdr_valve.h b/src/algorithms/signal_source/libs/gnss_sdr_valve.h
index b56807c2b..6c28f28f5 100644
--- a/src/algorithms/signal_source/libs/gnss_sdr_valve.h
+++ b/src/algorithms/signal_source/libs/gnss_sdr_valve.h
@@ -34,11 +34,12 @@
 #ifndef GNSS_SDR_GNSS_SDR_VALVE_H_
 #define GNSS_SDR_GNSS_SDR_VALVE_H_
 
+#include "concurrent_queue.h"
 #include <boost/shared_ptr.hpp>
-#include <gnuradio/msg_queue.h>   // for msg_queue, msg_queue::sptr
 #include <gnuradio/sync_block.h>  // for sync_block
 #include <gnuradio/types.h>       // for gr_vector_const_void_star
-#include <cstddef>                // for size_t
+#include <pmt/pmt.h>
+#include <cstddef>  // for size_t
 #include <cstdint>
 
 class Gnss_Sdr_Valve;
@@ -46,12 +47,12 @@ class Gnss_Sdr_Valve;
 boost::shared_ptr<Gnss_Sdr_Valve> gnss_sdr_make_valve(
     size_t sizeof_stream_item,
     uint64_t nitems,
-    gr::msg_queue::sptr queue);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
 boost::shared_ptr<Gnss_Sdr_Valve> gnss_sdr_make_valve(
     size_t sizeof_stream_item,
     uint64_t nitems,
-    gr::msg_queue::sptr queue,
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue,
     bool stop_flowgraph);
 
 /*!
@@ -71,21 +72,21 @@ private:
     friend boost::shared_ptr<Gnss_Sdr_Valve> gnss_sdr_make_valve(
         size_t sizeof_stream_item,
         uint64_t nitems,
-        gr::msg_queue::sptr queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     friend boost::shared_ptr<Gnss_Sdr_Valve> gnss_sdr_make_valve(
         size_t sizeof_stream_item,
         uint64_t nitems,
-        gr::msg_queue::sptr queue,
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue,
         bool stop_flowgraph);
 
     Gnss_Sdr_Valve(size_t sizeof_stream_item,
         uint64_t nitems,
-        gr::msg_queue::sptr queue, bool stop_flowgraph);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue, bool stop_flowgraph);
 
     uint64_t d_nitems;
     uint64_t d_ncopied_items;
-    gr::msg_queue::sptr d_queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> d_queue;
     bool d_stop_flowgraph;
     bool d_open_valve;
 };
diff --git a/src/core/libs/CMakeLists.txt b/src/core/libs/CMakeLists.txt
index a61dd6e2b..6a074d5a7 100644
--- a/src/core/libs/CMakeLists.txt
+++ b/src/core/libs/CMakeLists.txt
@@ -24,6 +24,8 @@ set(CORE_LIBS_SOURCES
     string_converter.cc
     gnss_sdr_supl_client.cc
     gnss_sdr_sample_counter.cc
+    channel_status_msg_receiver.cc
+    channel_event.cc
 )
 
 set(CORE_LIBS_HEADERS
@@ -32,6 +34,8 @@ set(CORE_LIBS_HEADERS
     string_converter.h
     gnss_sdr_supl_client.h
     gnss_sdr_sample_counter.h
+    channel_status_msg_receiver.h
+    channel_event.h
 )
 
 if(ENABLE_FPGA)
@@ -60,6 +64,7 @@ target_link_libraries(core_libs
         Gnuradio::runtime
         core_libs_supl
         core_system_parameters
+        pvt_libs
     PRIVATE
         Boost::serialization
         Gflags::gflags
diff --git a/src/core/libs/channel_event.cc b/src/core/libs/channel_event.cc
new file mode 100644
index 000000000..7c6862d76
--- /dev/null
+++ b/src/core/libs/channel_event.cc
@@ -0,0 +1,42 @@
+/*!
+ * \file channel_event.cc
+ * \brief Class that defines a channel event
+ * \author Javier Arribas, 2019. jarribas(at)cttc.es
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2019  (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ *          Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR 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 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR 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 GNSS-SDR. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#include "channel_event.h"
+
+channel_event_sptr channel_event_make(int channel_id, int event_type)
+{
+    return channel_event_sptr(new channel_event(channel_id, event_type));
+}
+
+channel_event::channel_event(int channel_id_, int event_type_)
+{
+    channel_id = channel_id_;
+    event_type = event_type_;
+}
diff --git a/src/core/libs/channel_event.h b/src/core/libs/channel_event.h
new file mode 100644
index 000000000..51c1a3a8f
--- /dev/null
+++ b/src/core/libs/channel_event.h
@@ -0,0 +1,53 @@
+/*!
+ * \file channel_event.h
+ * \brief Class that defines a channel event
+ * \author Javier Arribas, 2019. jarribas(at)cttc.es
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2019  (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ *          Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR 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 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR 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 GNSS-SDR. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#ifndef GNSS_SDR_CHANNEL_EVENT_H
+#define GNSS_SDR_CHANNEL_EVENT_H
+
+#include <memory>
+
+class channel_event;
+
+using channel_event_sptr = std::shared_ptr<channel_event>;
+
+channel_event_sptr channel_event_make(int channel_id, int event_type);
+
+class channel_event
+{
+public:
+    int channel_id;
+    int event_type;
+private:
+    friend channel_event_sptr channel_event_make(int channel_id, int event_type);
+    channel_event(int channel_id_, int event_type_);
+
+};
+
+#endif
diff --git a/src/core/libs/channel_status_msg_receiver.cc b/src/core/libs/channel_status_msg_receiver.cc
new file mode 100644
index 000000000..965a99a46
--- /dev/null
+++ b/src/core/libs/channel_status_msg_receiver.cc
@@ -0,0 +1,116 @@
+/*!
+ * \file channel_status_msg_receiver.cc
+ * \brief GNU Radio block that receives asynchronous channel messages from acquisition and tracking blocks
+ * \author Javier Arribas, 2016. jarribas(at)cttc.es
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2018  (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ *          Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR 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 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR 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 GNSS-SDR. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+
+#include "channel_status_msg_receiver.h"
+#include <boost/any.hpp>
+#include <boost/bind.hpp>
+#include <glog/logging.h>
+#include <gnuradio/gr_complex.h>
+#include <gnuradio/io_signature.h>
+#include <cstdint>
+#include <utility>
+
+
+channel_status_msg_receiver_sptr channel_status_msg_receiver_make()
+{
+    return channel_status_msg_receiver_sptr(new channel_status_msg_receiver());
+}
+
+
+channel_status_msg_receiver::channel_status_msg_receiver() : gr::block("channel_status_msg_receiver", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0))
+{
+    this->message_port_register_in(pmt::mp("status"));
+    this->set_msg_handler(pmt::mp("status"), boost::bind(&channel_status_msg_receiver::msg_handler_events, this, _1));
+    d_pvt_status.RX_time = -1;  // to indicate that the PVT is not available
+}
+
+
+channel_status_msg_receiver::~channel_status_msg_receiver() = default;
+
+
+void channel_status_msg_receiver::msg_handler_events(pmt::pmt_t msg)
+{
+    gr::thread::scoped_lock lock(d_setlock);  // require mutex with msg_handler_events function called by the scheduler
+    try
+        {
+            // ************* Gnss_Synchro received *****************
+            if (pmt::any_ref(msg).type() == typeid(std::shared_ptr<Gnss_Synchro>))
+                {
+                    std::shared_ptr<Gnss_Synchro> gnss_synchro_obj;
+                    gnss_synchro_obj = boost::any_cast<std::shared_ptr<Gnss_Synchro>>(pmt::any_ref(msg));
+                    if (gnss_synchro_obj->Flag_valid_pseudorange == true)
+                        {
+                            d_channel_status_map[gnss_synchro_obj->Channel_ID] = gnss_synchro_obj;
+                        }
+                    else
+                        {
+                            d_channel_status_map.erase(gnss_synchro_obj->Channel_ID);
+                        }
+
+                    //                    std::cout << "-------- \n\n";
+                    //                    for (std::map<int, std::shared_ptr<Gnss_Synchro>>::iterator it = d_channel_status_map.begin(); it != d_channel_status_map.end(); ++it)
+                    //                        {
+                    //                            std::cout << " Channel: " << it->first << " => Doppler: " << it->second->Carrier_Doppler_hz << "[Hz] \n";
+                    //                        }
+                    //                    std::cout << "-------- \n\n";
+                }
+            else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr<Monitor_Pvt>))
+                {
+                    // ************* Monitor_Pvt received *****************
+                    std::shared_ptr<Monitor_Pvt> monitor_pvt_obj;
+                    monitor_pvt_obj = boost::any_cast<std::shared_ptr<Monitor_Pvt>>(pmt::any_ref(msg));
+                    d_pvt_status = *monitor_pvt_obj.get();
+                    //
+                    //                    std::cout << "-------- \n\n";
+                    //                    std::cout << "PVT TOW: " << d_pvt_status->TOW_at_current_symbol_ms << std::endl;
+                    //                    std::cout << "-------- \n\n";
+                }
+            else
+                {
+                    LOG(WARNING) << "channel_status_msg_receiver unknown object type!";
+                }
+        }
+    catch (boost::bad_any_cast& e)
+        {
+            LOG(WARNING) << "channel_status_msg_receiver Bad any cast!";
+        }
+}
+
+std::map<int, std::shared_ptr<Gnss_Synchro>> channel_status_msg_receiver::get_current_status_map()
+{
+    gr::thread::scoped_lock lock(d_setlock);  // require mutex with msg_handler_events function called by the scheduler
+    return d_channel_status_map;
+}
+Monitor_Pvt channel_status_msg_receiver::get_current_status_pvt()
+{
+    gr::thread::scoped_lock lock(d_setlock);  // require mutex with msg_handler_events function called by the scheduler
+    return d_pvt_status;
+}
diff --git a/src/core/libs/channel_status_msg_receiver.h b/src/core/libs/channel_status_msg_receiver.h
new file mode 100644
index 000000000..283fc6f0e
--- /dev/null
+++ b/src/core/libs/channel_status_msg_receiver.h
@@ -0,0 +1,71 @@
+/*!
+ * \file channel_msg_receiver_cc.h
+ * \brief GNU Radio block that receives asynchronous channel messages from acquisition and tracking blocks
+ * \author Javier Arribas, 2016. jarribas(at)cttc.es
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2018  (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ *          Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR 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 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR 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 GNSS-SDR. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#ifndef GNSS_SDR_CHANNEL_STATUS_MSG_RECEIVER_CC_H
+#define GNSS_SDR_CHANNEL_STATUS_MSG_RECEIVER_CC_H
+
+#include "gnss_synchro.h"
+#include "monitor_pvt.h"
+#include <gnuradio/block.h>
+#include <pmt/pmt.h>
+#include <memory>
+
+class channel_status_msg_receiver;
+
+using channel_status_msg_receiver_sptr = boost::shared_ptr<channel_status_msg_receiver>;
+
+channel_status_msg_receiver_sptr channel_status_msg_receiver_make();
+
+/*!
+ * \brief GNU Radio block that receives asynchronous channel messages from tlm blocks
+ */
+class channel_status_msg_receiver : public gr::block
+{
+public:
+    ~channel_status_msg_receiver();  //!< Default destructor
+    /*!
+     * \brief return the current status map of all channels with valid telemetry
+     */
+    std::map<int, std::shared_ptr<Gnss_Synchro>> get_current_status_map();
+    /*!
+     * \brief return the current receiver PVT
+     */
+    Monitor_Pvt get_current_status_pvt();
+
+private:
+    friend channel_status_msg_receiver_sptr channel_status_msg_receiver_make();
+    channel_status_msg_receiver();
+    std::map<int, std::shared_ptr<Gnss_Synchro>> d_channel_status_map;
+
+    Monitor_Pvt d_pvt_status;
+    void msg_handler_events(pmt::pmt_t msg);
+};
+
+#endif
diff --git a/src/core/receiver/CMakeLists.txt b/src/core/receiver/CMakeLists.txt
index 83d684906..20c8b7ea0 100644
--- a/src/core/receiver/CMakeLists.txt
+++ b/src/core/receiver/CMakeLists.txt
@@ -19,17 +19,16 @@
 
 set(GNSS_RECEIVER_SOURCES
     control_thread.cc
-    control_message_factory.cc
     file_configuration.cc
     gnss_block_factory.cc
     gnss_flowgraph.cc
     in_memory_configuration.cc
     tcp_cmd_interface.cc
+    command_event.cc
 )
 
 set(GNSS_RECEIVER_HEADERS
     control_thread.h
-    control_message_factory.h
     file_configuration.h
     gnss_block_factory.h
     gnss_flowgraph.h
@@ -38,6 +37,7 @@ set(GNSS_RECEIVER_HEADERS
     concurrent_map.h
     concurrent_queue.h
     control_message.h
+    command_event.h
 )
 
 list(SORT GNSS_RECEIVER_HEADERS)
diff --git a/src/core/receiver/command_event.cc b/src/core/receiver/command_event.cc
new file mode 100644
index 000000000..771061255
--- /dev/null
+++ b/src/core/receiver/command_event.cc
@@ -0,0 +1,42 @@
+/*!
+ * \file command_event.cc
+ * \brief Class that defines a receiver command event
+ * \author Javier Arribas, 2019. jarribas(at)cttc.es
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2019  (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ *          Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR 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 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR 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 GNSS-SDR. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#include "command_event.h"
+
+command_event_sptr command_event_make(int command_id, int event_type)
+{
+    return command_event_sptr(new command_event(command_id, event_type));
+}
+
+command_event::command_event(int command_id_, int event_type_)
+{
+    command_id = command_id_;
+    event_type = event_type_;
+}
diff --git a/src/core/receiver/command_event.h b/src/core/receiver/command_event.h
new file mode 100644
index 000000000..094281578
--- /dev/null
+++ b/src/core/receiver/command_event.h
@@ -0,0 +1,53 @@
+/*!
+ * \file command_event.h
+ * \brief Class that defines a receiver command event
+ * \author Javier Arribas, 2019. jarribas(at)cttc.es
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2019  (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ *          Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR 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 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR 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 GNSS-SDR. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#ifndef GNSS_SDR_command_EVENT_H
+#define GNSS_SDR_command_EVENT_H
+
+#include <memory>
+
+class command_event;
+
+using command_event_sptr = std::shared_ptr<command_event>;
+
+command_event_sptr command_event_make(int command_id, int event_type);
+
+class command_event
+{
+public:
+    int command_id;
+    int event_type;
+
+private:
+    friend command_event_sptr command_event_make(int command_id, int event_type);
+    command_event(int command_id_, int event_type_);
+};
+
+#endif
diff --git a/src/core/receiver/control_message_factory.cc b/src/core/receiver/control_message_factory.cc
deleted file mode 100644
index 566f884a4..000000000
--- a/src/core/receiver/control_message_factory.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/*!
- * \file control_message_factory.cc
- * \brief Implementation of a Control Message Factory
- * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com
- *
- * -------------------------------------------------------------------------
- *
- * Copyright (C) 2010-2018  (see AUTHORS file for a list of contributors)
- *
- * GNSS-SDR is a software defined Global Navigation
- *          Satellite Systems receiver
- *
- * This file is part of GNSS-SDR.
- *
- * GNSS-SDR 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 of the License, or
- * (at your option) any later version.
- *
- * GNSS-SDR 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 GNSS-SDR. If not, see <https://www.gnu.org/licenses/>.
- *
- * -------------------------------------------------------------------------
- */
-
-#include "control_message_factory.h"
-#include <glog/logging.h>
-#include <cstring>  // for memcpy
-#include <ostream>  // for operator<<, basic_ostream
-
-// Constructor
-ControlMessageFactory::ControlMessageFactory() = default;
-
-
-// Destructor
-ControlMessageFactory::~ControlMessageFactory() = default;
-
-
-gr::message::sptr ControlMessageFactory::GetQueueMessage(unsigned int who, unsigned int what)
-{
-    std::shared_ptr<ControlMessage> control_message = std::make_shared<ControlMessage>();
-    control_message->who = who;
-    control_message->what = what;
-    gr::message::sptr queue_message = gr::message::make(0, 0, 0, sizeof(ControlMessage));
-    memcpy(queue_message->msg(), control_message.get(), sizeof(ControlMessage));
-    return queue_message;
-}
-
-
-std::shared_ptr<std::vector<std::shared_ptr<ControlMessage>>> ControlMessageFactory::GetControlMessages(const gr::message::sptr queue_message)  // NOLINT(performance-unnecessary-value-param)
-{
-    std::shared_ptr<std::vector<std::shared_ptr<ControlMessage>>> control_messages = std::make_shared<std::vector<std::shared_ptr<ControlMessage>>>();
-    unsigned int control_messages_count = queue_message->length() / sizeof(ControlMessage);
-    if (queue_message->length() % sizeof(ControlMessage) != 0)
-        {
-            LOG(WARNING) << "Queue message has size " << queue_message->length() << ", which is not"
-                         << " multiple of control message size " << sizeof(ControlMessage);
-            LOG(WARNING) << "Ignoring this queue message to prevent unexpected results.";
-            return control_messages;
-        }
-    for (unsigned int i = 0; i < control_messages_count; i++)
-        {
-            control_messages->push_back(std::make_shared<ControlMessage>());
-            memcpy(control_messages->at(i).get(), queue_message->msg() + (i * sizeof(ControlMessage)), sizeof(ControlMessage));
-        }
-    return control_messages;
-}
diff --git a/src/core/receiver/control_message_factory.h b/src/core/receiver/control_message_factory.h
deleted file mode 100644
index f8a4666f6..000000000
--- a/src/core/receiver/control_message_factory.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*!
- * \file control_message_factory.h
- * \brief Interface of a factory for control messages.
- * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com
- *
- * -------------------------------------------------------------------------
- *
- * Copyright (C) 2010-2018  (see AUTHORS file for a list of contributors)
- *
- * GNSS-SDR is a software defined Global Navigation
- *          Satellite Systems receiver
- *
- * This file is part of GNSS-SDR.
- *
- * GNSS-SDR 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 of the License, or
- * (at your option) any later version.
- *
- * GNSS-SDR 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 GNSS-SDR. If not, see <https://www.gnu.org/licenses/>.
- *
- * -------------------------------------------------------------------------
- */
-
-#ifndef GNSS_SDR_CONTROL_MESSAGE_FACTORY_H_
-#define GNSS_SDR_CONTROL_MESSAGE_FACTORY_H_
-
-#include <gnuradio/message.h>
-#include <memory>
-#include <vector>
-
-//! Message described by who sent it and what it says
-typedef struct control_message
-{
-    unsigned int who;
-    unsigned int what;
-} ControlMessage;
-
-
-/*!
- * \brief This class implements a factory for Control Messages.
- *
- * It encapsulates the complexity behind getting Queue Messages and associated Control Messages
- */
-class ControlMessageFactory
-{
-public:
-    //! Constructor
-    ControlMessageFactory();
-
-    //! Virtual destructor
-    virtual ~ControlMessageFactory();
-
-    gr::message::sptr GetQueueMessage(unsigned int who, unsigned int what);
-    std::shared_ptr<std::vector<std::shared_ptr<ControlMessage>>> GetControlMessages(const gr::message::sptr queue_message);  // NOLINT(performance-unnecessary-value-param)
-};
-
-#endif /*GNSS_SDR_CONTROL_MESSAGE_FACTORY_H_*/
diff --git a/src/core/receiver/control_thread.cc b/src/core/receiver/control_thread.cc
index 384d6f041..8b4a7ffc9 100644
--- a/src/core/receiver/control_thread.cc
+++ b/src/core/receiver/control_thread.cc
@@ -33,10 +33,10 @@
  */
 
 #include "control_thread.h"
+#include "channel_event.h"
+#include "command_event.h"
 #include "concurrent_map.h"
-#include "concurrent_queue.h"
 #include "configuration_interface.h"
-#include "control_message_factory.h"
 #include "file_configuration.h"
 #include "galileo_almanac.h"
 #include "galileo_ephemeris.h"
@@ -62,7 +62,6 @@
 #include "rtklib_rtkcmn.h"         // for utc2gpst
 #include <boost/lexical_cast.hpp>  // for bad_lexical_cast
 #include <glog/logging.h>          // for LOG
-#include <gnuradio/message.h>      // for message::sptr
 #include <pmt/pmt.h>               // for make_any
 #include <algorithm>               // for find, min
 #include <chrono>                  // for milliseconds
@@ -110,7 +109,7 @@ ControlThread::ControlThread(std::shared_ptr<ConfigurationInterface> configurati
 void ControlThread::init()
 {
     // Instantiates a control queue, a GNSS flowgraph, and a control message factory
-    control_queue_ = gr::msg_queue::make(0);
+    control_queue_ = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     cmd_interface_.set_msg_queue(control_queue_);  //set also the queue pointer for the telecommand thread
     try
         {
@@ -120,7 +119,6 @@ void ControlThread::init()
         {
             std::cout << "Caught bad lexical cast with error " << e.what() << std::endl;
         }
-    control_message_factory_ = std::make_shared<ControlMessageFactory>();
     stop_ = false;
     processed_control_messages_ = 0;
     applied_actions_ = 0;
@@ -226,6 +224,49 @@ void ControlThread::telecommand_listener()
         }
 }
 
+void ControlThread::event_dispatcher(bool &valid_event, pmt::pmt_t &msg)
+{
+    if (valid_event)
+        {
+            if (pmt::any_ref(msg).type() == typeid(channel_event_sptr))
+                {
+                    channel_event_sptr new_event;
+                    new_event = boost::any_cast<channel_event_sptr>(pmt::any_ref(msg));
+                    DLOG(INFO) << "New channel event rx from ch id: " << new_event->channel_id
+                               << " what: " << new_event->event_type;
+                    flowgraph_->apply_action(new_event->channel_id, new_event->event_type);
+                }
+            else if (pmt::any_ref(msg).type() == typeid(command_event_sptr))
+                {
+                    command_event_sptr new_event;
+                    new_event = boost::any_cast<command_event_sptr>(pmt::any_ref(msg));
+                    DLOG(INFO) << "New command event rx from ch id: " << new_event->command_id
+                               << " what: " << new_event->event_type;
+
+                    if (new_event->command_id == 200)
+                        {
+                            apply_action(new_event->event_type);
+                        }
+                    else
+                        {
+                            if (new_event->command_id == 300)  // some TC commands require also actions from control_thread
+                                {
+                                    apply_action(new_event->event_type);
+                                }
+                            flowgraph_->apply_action(new_event->command_id, new_event->event_type);
+                        }
+                }
+            else
+                {
+                    DLOG(INFO) << "Control Queue: unknown object type!\n";
+                }
+        }
+    else
+        {
+            //perform non-priority tasks
+            flowgraph_->acquisition_manager(0);  //start acquisition of untracked satellites
+        }
+}
 
 /*
  * Runs the control thread that manages the receiver control plane
@@ -285,14 +326,13 @@ int ControlThread::run()
         flowgraph_);
 #endif
     // Main loop to read and process the control messages
+    pmt::pmt_t msg;
     while (flowgraph_->running() && !stop_)
         {
-            //TODO re-enable the blocking read messages functions and fork the process
-            read_control_messages();
-            if (control_messages_ != nullptr)
-                {
-                    process_control_messages();
-                }
+            //read event messages, triggered by event signaling with a 100 ms timeout to perform low priority receiver management tasks
+            bool valid_event = control_queue_->timed_wait_and_pop(msg, 100);
+            //call the new sat dispatcher and receiver controller
+            event_dispatcher(valid_event, msg);
         }
     std::cout << "Stopping GNSS-SDR, please wait!" << std::endl;
     flowgraph_->stop();
@@ -325,7 +365,7 @@ int ControlThread::run()
 }
 
 
-void ControlThread::set_control_queue(const gr::msg_queue::sptr control_queue)  // NOLINT(performance-unnecessary-value-param)
+void ControlThread::set_control_queue(const std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> control_queue)  // NOLINT(performance-unnecessary-value-param)
 {
     if (flowgraph_->running())
         {
@@ -790,50 +830,6 @@ void ControlThread::assist_GNSS()
         }
 }
 
-
-void ControlThread::read_control_messages()
-{
-    DLOG(INFO) << "Reading control messages from queue";
-    gr::message::sptr queue_message = control_queue_->delete_head();
-    if (queue_message != nullptr)
-        {
-            control_messages_ = control_message_factory_->GetControlMessages(queue_message);
-        }
-    else
-        {
-            control_messages_->clear();
-        }
-}
-
-
-// Apply the corresponding control actions
-void ControlThread::process_control_messages()
-{
-    for (auto &i : *control_messages_)
-        {
-            if (stop_)
-                {
-                    break;
-                }
-            if (i->who == 200)
-                {
-                    apply_action(i->what);
-                }
-            else
-                {
-                    if (i->who == 300)  // some TC commands require also actions from control_thread
-                        {
-                            apply_action(i->what);
-                        }
-                    flowgraph_->apply_action(i->who, i->what);
-                }
-            processed_control_messages_++;
-        }
-    control_messages_->clear();
-    DLOG(INFO) << "Processed all control messages";
-}
-
-
 void ControlThread::apply_action(unsigned int what)
 {
     std::shared_ptr<PvtInterface> pvt_ptr;
@@ -1092,11 +1088,7 @@ void ControlThread::sysv_queue_listener()
                     if ((std::abs(received_message - (-200.0)) < 10 * std::numeric_limits<double>::epsilon()))
                         {
                             std::cout << "Quit order received, stopping GNSS-SDR !!" << std::endl;
-                            std::unique_ptr<ControlMessageFactory> cmf(new ControlMessageFactory());
-                            if (control_queue_ != gr::msg_queue::sptr())
-                                {
-                                    control_queue_->handle(cmf->GetQueueMessage(200, 0));
-                                }
+                            control_queue_->push(pmt::make_any(command_event_make(200, 0)));
                             read_queue = false;
                         }
                 }
@@ -1114,11 +1106,7 @@ void ControlThread::keyboard_listener()
             if (c == 'q')
                 {
                     std::cout << "Quit keystroke order received, stopping GNSS-SDR !!" << std::endl;
-                    std::unique_ptr<ControlMessageFactory> cmf(new ControlMessageFactory());
-                    if (control_queue_ != gr::msg_queue::sptr())
-                        {
-                            control_queue_->handle(cmf->GetQueueMessage(200, 0));
-                        }
+                    control_queue_->push(pmt::make_any(command_event_make(200, 0)));
                     read_keys = false;
                 }
             std::this_thread::sleep_for(std::chrono::milliseconds(100));
diff --git a/src/core/receiver/control_thread.h b/src/core/receiver/control_thread.h
index 7d58226e9..5fa84f791 100644
--- a/src/core/receiver/control_thread.h
+++ b/src/core/receiver/control_thread.h
@@ -35,20 +35,20 @@
 #ifndef GNSS_SDR_CONTROL_THREAD_H_
 #define GNSS_SDR_CONTROL_THREAD_H_
 
-#include "agnss_ref_location.h"       // for Agnss_Ref_Location
-#include "agnss_ref_time.h"           // for Agnss_Ref_Time
-#include "control_message_factory.h"  // for ControlMessage
-#include "gnss_sdr_supl_client.h"     // for Gnss_Sdr_Supl_Client
-#include "tcp_cmd_interface.h"        // for TcpCmdInterface
-#include <armadillo>                  // for arma::vec
-#include <boost/thread.hpp>           // for boost::thread
-#include <gnuradio/msg_queue.h>       // for msg_queue, msg_queue::sptr
-#include <ctime>                      // for time_t
-#include <memory>                     // for shared_ptr
-#include <string>                     // for string
-#include <thread>                     // for std::thread
-#include <utility>                    // for pair
-#include <vector>                     // for vector
+#include "agnss_ref_location.h"  // for Agnss_Ref_Location
+#include "agnss_ref_time.h"      // for Agnss_Ref_Time
+#include "concurrent_queue.h"
+#include "gnss_sdr_supl_client.h"  // for Gnss_Sdr_Supl_Client
+#include "tcp_cmd_interface.h"     // for TcpCmdInterface
+#include <armadillo>               // for arma::vec
+#include <boost/thread.hpp>        // for boost::thread
+#include <pmt/pmt.h>
+#include <ctime>    // for time_t
+#include <memory>   // for shared_ptr
+#include <string>   // for string
+#include <thread>   // for std::thread
+#include <utility>  // for pair
+#include <vector>   // for vector
 
 class ConfigurationInterface;
 class GNSSFlowgraph;
@@ -95,9 +95,9 @@ public:
     /*!
      * \brief Sets the control_queue
      *
-     * \param[in] boost::shared_ptr<gr::msg_queue> control_queue
+     * \param[in] std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> control_queue
      */
-    void set_control_queue(const gr::msg_queue::sptr control_queue);  // NOLINT(performance-unnecessary-value-param)
+    void set_control_queue(const std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> control_queue);  // NOLINT(performance-unnecessary-value-param)
 
     unsigned int processed_control_messages()
     {
@@ -123,6 +123,10 @@ private:
     //Telecommand TCP interface
     TcpCmdInterface cmd_interface_;
     void telecommand_listener();
+    /*
+     * New receiver event dispatcher
+     */
+    void event_dispatcher(bool &valid_event, pmt::pmt_t &msg);
     std::thread cmd_interface_thread_;
     //SUPL assistance classes
     Gnss_Sdr_Supl_Client supl_client_acquisition_;
@@ -140,10 +144,6 @@ private:
     // Save {ephemeris, iono, utc, ref loc, ref time} assistance to a local XML file
     //bool save_assistance_to_XML();
 
-    void read_control_messages();
-
-    void process_control_messages();
-
     /*
      * Blocking function that reads the GPS assistance queue
      */
@@ -153,7 +153,7 @@ private:
      * Compute elevations for the specified time and position for all the available satellites in ephemeris and almanac queues
      * returns a vector filled with the available satellites ordered from high elevation to low elevation angle.
      */
-    std::vector<std::pair<int, Gnss_Satellite>> get_visible_sats(time_t rx_utc_time, const arma::vec& LLH);
+    std::vector<std::pair<int, Gnss_Satellite>> get_visible_sats(time_t rx_utc_time, const arma::vec &LLH);
 
     /*
      * Read initial GNSS assistance from SUPL server or local XML files
@@ -163,9 +163,7 @@ private:
     void apply_action(unsigned int what);
     std::shared_ptr<GNSSFlowgraph> flowgraph_;
     std::shared_ptr<ConfigurationInterface> configuration_;
-    gr::msg_queue::sptr control_queue_;
-    std::shared_ptr<ControlMessageFactory> control_message_factory_;
-    std::shared_ptr<std::vector<std::shared_ptr<ControlMessage>>> control_messages_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> control_queue_;
     bool stop_;
     bool restart_;
     bool delete_configuration_;
diff --git a/src/core/receiver/gnss_block_factory.cc b/src/core/receiver/gnss_block_factory.cc
index 7976d99da..f7574a986 100644
--- a/src/core/receiver/gnss_block_factory.cc
+++ b/src/core/receiver/gnss_block_factory.cc
@@ -182,7 +182,7 @@ GNSSBlockFactory::~GNSSBlockFactory() = default;
 
 
 std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetSignalSource(
-    const std::shared_ptr<ConfigurationInterface>& configuration, const gr::msg_queue::sptr queue, int ID)  // NOLINT(performance-unnecessary-value-param)
+    const std::shared_ptr<ConfigurationInterface>& configuration, const std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue, int ID)  // NOLINT(performance-unnecessary-value-param)
 {
     std::string default_implementation = "File_Signal_Source";
     std::string role = "SignalSource";  //backwards compatibility for old conf files
@@ -321,7 +321,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetPVT(const std::shared_p
 std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_1C(
     const std::shared_ptr<ConfigurationInterface>& configuration,
     const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-    gr::msg_queue::sptr queue)
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)
 {
     //"appendix" is added to the "role" with the aim of Acquisition, Tracking and Telemetry Decoder adapters
     //can find their specific configurations when they read the config
@@ -389,7 +389,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_1C(
 std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_2S(
     const std::shared_ptr<ConfigurationInterface>& configuration,
     const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-    gr::msg_queue::sptr queue)
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)
 {
     LOG(INFO) << "Instantiating Channel " << channel << " with Acquisition Implementation: "
               << acq << ", Tracking Implementation: " << trk << ", Telemetry Decoder implementation: " << tlm;
@@ -453,7 +453,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_2S(
 std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_1B(
     const std::shared_ptr<ConfigurationInterface>& configuration,
     const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-    gr::msg_queue::sptr queue)
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)
 {
     std::stringstream stream;
     stream << channel;
@@ -520,7 +520,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_1B(
 std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_5X(
     const std::shared_ptr<ConfigurationInterface>& configuration,
     const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-    gr::msg_queue::sptr queue)
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)
 {
     std::stringstream stream;
     stream << channel;
@@ -587,7 +587,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_5X(
 std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_1G(
     const std::shared_ptr<ConfigurationInterface>& configuration,
     const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-    gr::msg_queue::sptr queue)
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)
 {
     std::stringstream stream;
     stream << channel;
@@ -655,7 +655,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_1G(
 std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_2G(
     const std::shared_ptr<ConfigurationInterface>& configuration,
     const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-    gr::msg_queue::sptr queue)
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)
 {
     std::stringstream stream;
     stream << channel;
@@ -723,7 +723,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_2G(
 std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_L5(
     const std::shared_ptr<ConfigurationInterface>& configuration,
     const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-    gr::msg_queue::sptr queue)
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)
 {
     std::stringstream stream;
     stream << channel;
@@ -790,7 +790,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_L5(
 std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_B1(
     const std::shared_ptr<ConfigurationInterface>& configuration,
     const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-    gr::msg_queue::sptr queue)
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)
 {
     std::stringstream stream;
     stream << channel;
@@ -857,7 +857,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_B1(
 std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_B3(
     const std::shared_ptr<ConfigurationInterface>& configuration,
     const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-    gr::msg_queue::sptr queue)
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)
 {
     std::stringstream stream;
     stream << channel;
@@ -921,7 +921,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_B3(
 
 
 std::unique_ptr<std::vector<std::unique_ptr<GNSSBlockInterface>>> GNSSBlockFactory::GetChannels(
-    const std::shared_ptr<ConfigurationInterface>& configuration, const gr::msg_queue::sptr queue)  // NOLINT(performance-unnecessary-value-param)
+    const std::shared_ptr<ConfigurationInterface>& configuration, const std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)  // NOLINT(performance-unnecessary-value-param)
 {
     std::string default_implementation = "Pass_Through";
     std::string tracking_implementation;
@@ -1241,7 +1241,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetBlock(
     const std::shared_ptr<ConfigurationInterface>& configuration,
     const std::string& role,
     const std::string& implementation, unsigned int in_streams,
-    unsigned int out_streams, const gr::msg_queue::sptr queue)  // NOLINT(performance-unnecessary-value-param)
+    unsigned int out_streams, const std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)  // NOLINT(performance-unnecessary-value-param)
 {
     std::unique_ptr<GNSSBlockInterface> block;
 
diff --git a/src/core/receiver/gnss_block_factory.h b/src/core/receiver/gnss_block_factory.h
index 3076c879d..af9889c89 100644
--- a/src/core/receiver/gnss_block_factory.h
+++ b/src/core/receiver/gnss_block_factory.h
@@ -37,10 +37,11 @@
 #ifndef GNSS_SDR_BLOCK_FACTORY_H_
 #define GNSS_SDR_BLOCK_FACTORY_H_
 
-#include <gnuradio/msg_queue.h>  // for msg_queue::sptr
-#include <memory>                // for unique_ptr, shared_ptr
-#include <string>                // for string
-#include <vector>                // for vector
+#include "concurrent_queue.h"
+#include <pmt/pmt.h>
+#include <memory>  // for unique_ptr, shared_ptr
+#include <string>  // for string
+#include <vector>  // for vector
 
 
 class ConfigurationInterface;
@@ -59,12 +60,12 @@ public:
     virtual ~GNSSBlockFactory();
 
     std::unique_ptr<GNSSBlockInterface> GetSignalSource(const std::shared_ptr<ConfigurationInterface>& configuration,
-        const gr::msg_queue::sptr queue, int ID = -1);  // NOLINT(performance-unnecessary-value-param)
+        const std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue, int ID = -1);  // NOLINT(performance-unnecessary-value-param)
 
     std::unique_ptr<GNSSBlockInterface> GetSignalConditioner(const std::shared_ptr<ConfigurationInterface>& configuration, int ID = -1);
 
     std::unique_ptr<std::vector<std::unique_ptr<GNSSBlockInterface>>> GetChannels(const std::shared_ptr<ConfigurationInterface>& configuration,
-        const gr::msg_queue::sptr queue);  // NOLINT(performance-unnecessary-value-param)
+        const std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);  // NOLINT(performance-unnecessary-value-param)
 
     std::unique_ptr<GNSSBlockInterface> GetObservables(const std::shared_ptr<ConfigurationInterface>& configuration);
 
@@ -76,44 +77,44 @@ public:
     std::unique_ptr<GNSSBlockInterface> GetBlock(const std::shared_ptr<ConfigurationInterface>& configuration,
         const std::string& role, const std::string& implementation,
         unsigned int in_streams, unsigned int out_streams,
-        const gr::msg_queue::sptr queue = nullptr);  // NOLINT(performance-unnecessary-value-param)
+        const std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = nullptr);  // NOLINT(performance-unnecessary-value-param)
 
 private:
     std::unique_ptr<GNSSBlockInterface> GetChannel_1C(const std::shared_ptr<ConfigurationInterface>& configuration,
         const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-        gr::msg_queue::sptr queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     std::unique_ptr<GNSSBlockInterface> GetChannel_2S(const std::shared_ptr<ConfigurationInterface>& configuration,
         const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-        gr::msg_queue::sptr queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     std::unique_ptr<GNSSBlockInterface> GetChannel_1B(const std::shared_ptr<ConfigurationInterface>& configuration,
         const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-        gr::msg_queue::sptr queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     std::unique_ptr<GNSSBlockInterface> GetChannel_5X(const std::shared_ptr<ConfigurationInterface>& configuration,
         const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-        gr::msg_queue::sptr queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     std::unique_ptr<GNSSBlockInterface> GetChannel_L5(const std::shared_ptr<ConfigurationInterface>& configuration,
         const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-        gr::msg_queue::sptr queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     std::unique_ptr<GNSSBlockInterface> GetChannel_1G(const std::shared_ptr<ConfigurationInterface>& configuration,
         const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-        gr::msg_queue::sptr queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     std::unique_ptr<GNSSBlockInterface> GetChannel_2G(const std::shared_ptr<ConfigurationInterface>& configuration,
         const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-        gr::msg_queue::sptr queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     std::unique_ptr<GNSSBlockInterface> GetChannel_B1(const std::shared_ptr<ConfigurationInterface>& configuration,
         const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-        gr::msg_queue::sptr queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     std::unique_ptr<GNSSBlockInterface> GetChannel_B3(const std::shared_ptr<ConfigurationInterface>& configuration,
         const std::string& acq, const std::string& trk, const std::string& tlm, int channel,
-        boost::shared_ptr<gr::msg_queue> queue);
+        std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
 
     std::unique_ptr<AcquisitionInterface> GetAcqBlock(
         const std::shared_ptr<ConfigurationInterface>& configuration,
diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc
index 4d11c4193..fd142761a 100644
--- a/src/core/receiver/gnss_flowgraph.cc
+++ b/src/core/receiver/gnss_flowgraph.cc
@@ -75,7 +75,7 @@
 #define GNSS_SDR_ARRAY_SIGNAL_CONDITIONER_CHANNELS 8
 
 
-GNSSFlowgraph::GNSSFlowgraph(std::shared_ptr<ConfigurationInterface> configuration, const gr::msg_queue::sptr queue)  // NOLINT(performance-unnecessary-value-param)
+GNSSFlowgraph::GNSSFlowgraph(std::shared_ptr<ConfigurationInterface> configuration, const std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue)  // NOLINT(performance-unnecessary-value-param)
 {
     connected_ = false;
     running_ = false;
@@ -598,7 +598,11 @@ void GNSSFlowgraph::connect()
                 }
             if (sat == 0)
                 {
-                    channels_.at(i)->set_signal(search_next_signal(gnss_signal, false));
+                    bool assistance_available;
+                    float estimated_doppler;
+                    double RX_time;
+                    bool is_primary_freq;
+                    channels_.at(i)->set_signal(search_next_signal(gnss_signal, false, is_primary_freq, assistance_available, estimated_doppler, RX_time));
                 }
             else
                 {
@@ -680,7 +684,11 @@ void GNSSFlowgraph::connect()
                     top_block_->connect(observables_->get_right_block(), i, pvt_->get_left_block(), i);
                     top_block_->msg_connect(channels_.at(i)->get_right_block(), pmt::mp("telemetry"), pvt_->get_left_block(), pmt::mp("telemetry"));
                 }
+
+            top_block_->msg_connect(observables_->get_right_block(), pmt::mp("status"), channels_status_, pmt::mp("status"));
+
             top_block_->msg_connect(pvt_->get_left_block(), pmt::mp("pvt_to_observables"), observables_->get_right_block(), pmt::mp("pvt_to_observables"));
+            top_block_->msg_connect(pvt_->get_left_block(), pmt::mp("status"), channels_status_, pmt::mp("status"));
         }
     catch (const std::exception& e)
         {
@@ -1053,7 +1061,184 @@ bool GNSSFlowgraph::send_telemetry_msg(const pmt::pmt_t& msg)
     return true;
 }
 
+void GNSSFlowgraph::push_back_signal(Gnss_Signal gs)
+{
+    switch (mapStringValues_[gs.get_signal_str()])
+        {
+        case evGPS_1C:
+            available_GPS_1C_signals_.remove(gs);
+            available_GPS_1C_signals_.push_back(gs);
+            break;
 
+        case evGPS_2S:
+            available_GPS_2S_signals_.remove(gs);
+            available_GPS_2S_signals_.push_back(gs);
+            break;
+
+        case evGPS_L5:
+            available_GPS_L5_signals_.remove(gs);
+            available_GPS_L5_signals_.push_back(gs);
+            break;
+
+        case evGAL_1B:
+            available_GAL_1B_signals_.remove(gs);
+            available_GAL_1B_signals_.push_back(gs);
+            break;
+
+        case evGAL_5X:
+            available_GAL_5X_signals_.remove(gs);
+            available_GAL_5X_signals_.push_back(gs);
+            break;
+
+        case evGLO_1G:
+            available_GLO_1G_signals_.remove(gs);
+            available_GLO_1G_signals_.push_back(gs);
+            break;
+
+        case evGLO_2G:
+            available_GLO_2G_signals_.remove(gs);
+            available_GLO_2G_signals_.push_back(gs);
+            break;
+
+        case evBDS_B1:
+            available_BDS_B1_signals_.remove(gs);
+            available_BDS_B1_signals_.push_back(gs);
+            break;
+
+        case evBDS_B3:
+            available_BDS_B3_signals_.remove(gs);
+            available_BDS_B3_signals_.push_back(gs);
+            break;
+
+        default:
+            LOG(ERROR) << "This should not happen :-(";
+            break;
+        }
+}
+
+void GNSSFlowgraph::remove_signal(Gnss_Signal gs)
+{
+    switch (mapStringValues_[gs.get_signal_str()])
+        {
+        case evGPS_1C:
+            available_GPS_1C_signals_.remove(gs);
+            break;
+
+        case evGPS_2S:
+            available_GPS_2S_signals_.remove(gs);
+            break;
+
+        case evGPS_L5:
+            available_GPS_L5_signals_.remove(gs);
+            break;
+
+        case evGAL_1B:
+            available_GAL_1B_signals_.remove(gs);
+            break;
+
+        case evGAL_5X:
+            available_GAL_5X_signals_.remove(gs);
+            break;
+
+        case evGLO_1G:
+            available_GLO_1G_signals_.remove(gs);
+            break;
+
+        case evGLO_2G:
+            available_GLO_2G_signals_.remove(gs);
+            break;
+
+        case evBDS_B1:
+            available_BDS_B1_signals_.remove(gs);
+            break;
+
+        case evBDS_B3:
+            available_BDS_B3_signals_.remove(gs);
+            break;
+
+        default:
+            LOG(ERROR) << "This should not happen :-(";
+            break;
+        }
+}
+
+void GNSSFlowgraph::acquisition_manager(unsigned int who)
+{
+    unsigned int current_channel;
+    for (unsigned int i = 0; i < channels_count_; i++)
+        {
+            current_channel = (i + who + 1) % channels_count_;
+            unsigned int sat_ = 0;
+            try
+                {
+                    sat_ = configuration_->property("Channel" + std::to_string(current_channel) + ".satellite", 0);
+                }
+            catch (const std::exception& e)
+                {
+                    LOG(WARNING) << e.what();
+                }
+            if ((acq_channels_count_ < max_acq_channels_) && (channels_state_[current_channel] == 0))
+                {
+                    bool is_primary_freq = true;
+                    bool assistance_available = false;
+                    bool start_acquisition = false;
+                    Gnss_Signal gnss_signal;
+                    if (sat_ == 0)
+                        {
+                            float estimated_doppler;
+                            double RX_time;
+                            gnss_signal = search_next_signal(channels_[current_channel]->get_signal().get_signal_str(),
+                                true,
+                                is_primary_freq,
+                                assistance_available,
+                                estimated_doppler,
+                                RX_time);
+                            channels_[current_channel]->set_signal(gnss_signal);
+                            start_acquisition = is_primary_freq or assistance_available or !configuration_->property("GNSS-SDR.assist_dual_frequency_acq", false);
+                            //                            if (assistance_available)
+                            //                                {
+                            //                                    std::cout << "Channel " << current_channel
+                            //                                              << " assistance available for " << channels_[current_channel]->get_signal().get_satellite()
+                            //                                              << ", Signal " << channels_[current_channel]->get_signal().get_signal_str() << "\n";
+                            //                                }
+                        }
+                    else
+                        {
+                            start_acquisition = true;
+                        }
+
+                    if (start_acquisition == true)
+                        {
+                            channels_state_[current_channel] = 1;
+                            acq_channels_count_++;
+                            DLOG(INFO) << "Channel " << current_channel
+                                       << " Starting acquisition " << channels_[current_channel]->get_signal().get_satellite()
+                                       << ", Signal " << channels_[current_channel]->get_signal().get_signal_str();
+#ifndef ENABLE_FPGA
+                            channels_[current_channel]->start_acquisition();
+#else
+                            // create a task for the FPGA such that it doesn't stop the flow
+                            std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[current_channel]);
+                            tmp_thread.detach();
+#endif
+                        }
+                    else
+                        {
+                            push_back_signal(gnss_signal);
+                            DLOG(INFO) << "Channel " << current_channel
+                                       << " secondary frequency acquisition assistance not available in "
+                                       << channels_[current_channel]->get_signal().get_satellite()
+                                       << ", Signal " << channels_[current_channel]->get_signal().get_signal_str();
+
+                            //                            std::cout << "Channel " << current_channel
+                            //                                      << " secondary frequency acquisition assistance not available in "
+                            //                                      << channels_[current_channel]->get_signal().get_satellite()
+                            //                                      << ", Signal " << channels_[current_channel]->get_signal().get_signal_str() << "\n";
+                        }
+                }
+            DLOG(INFO) << "Channel " << current_channel << " in state " << channels_state_[current_channel];
+        }
+}
 /*
  * Applies an action to the flow graph
  *
@@ -1065,7 +1250,7 @@ bool GNSSFlowgraph::send_telemetry_msg(const pmt::pmt_t& msg)
  * \param[in] what  What is the action:
  * --- actions from channels ---
  * -> 0 acquisition failed
- * -> 1 acquisition successful
+ * -> 1 acquisition succesfull
  * -> 2 tracking lost
  * --- actions from TC receiver control ---
  * -> 10 TC request standby mode
@@ -1078,8 +1263,10 @@ bool GNSSFlowgraph::send_telemetry_msg(const pmt::pmt_t& msg)
  */
 void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what)
 {
+    //todo: the acquisition events are initiated from the acquisition success or failure queued msg. If the acquisition is disabled for non-assisted secondary freq channels, the engine stops..
+
     std::lock_guard<std::mutex> lock(signal_list_mutex);
-    DLOG(INFO) << "Received " << what << " from " << who << ". Number of applied actions = " << applied_actions_;
+    DLOG(INFO) << "Received " << what << " from " << who;
     unsigned int sat = 0;
     if (who < 200)
         {
@@ -1099,183 +1286,32 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what)
             if (sat == 0)
                 {
                     Gnss_Signal gs = channels_[who]->get_signal();
-                    switch (mapStringValues_[gs.get_signal_str()])
-                        {
-                        case evGPS_1C:
-                            available_GPS_1C_signals_.remove(gs);
-                            available_GPS_1C_signals_.push_back(gs);
-                            break;
-
-                        case evGPS_2S:
-                            available_GPS_2S_signals_.remove(gs);
-                            available_GPS_2S_signals_.push_back(gs);
-                            break;
-
-                        case evGPS_L5:
-                            available_GPS_L5_signals_.remove(gs);
-                            available_GPS_L5_signals_.push_back(gs);
-                            break;
-
-                        case evGAL_1B:
-                            available_GAL_1B_signals_.remove(gs);
-                            available_GAL_1B_signals_.push_back(gs);
-                            break;
-
-                        case evGAL_5X:
-                            available_GAL_5X_signals_.remove(gs);
-                            available_GAL_5X_signals_.push_back(gs);
-                            break;
-
-                        case evGLO_1G:
-                            available_GLO_1G_signals_.remove(gs);
-                            available_GLO_1G_signals_.push_back(gs);
-                            break;
-
-                        case evGLO_2G:
-                            available_GLO_2G_signals_.remove(gs);
-                            available_GLO_2G_signals_.push_back(gs);
-                            break;
-
-                        case evBDS_B1:
-                            available_BDS_B1_signals_.remove(gs);
-                            available_BDS_B1_signals_.push_back(gs);
-                            break;
-
-                        case evBDS_B3:
-                            available_BDS_B3_signals_.remove(gs);
-                            available_BDS_B3_signals_.push_back(gs);
-                            break;
-
-                        default:
-                            LOG(ERROR) << "This should not happen :-(";
-                            break;
-                        }
+                    push_back_signal(gs);
                 }
             channels_state_[who] = 0;
-            acq_channels_count_--;
-            for (unsigned int i = 0; i < channels_count_; i++)
-                {
-                    unsigned int ch_index = (who + i + 1) % channels_count_;
-                    unsigned int sat_ = 0;
-                    try
-                        {
-                            sat_ = configuration_->property("Channel" + std::to_string(ch_index) + ".satellite", 0);
-                        }
-                    catch (const std::exception& e)
-                        {
-                            LOG(WARNING) << e.what();
-                        }
-                    if ((acq_channels_count_ < max_acq_channels_) && (channels_state_[ch_index] == 0))
-                        {
-                            channels_state_[ch_index] = 1;
-                            if (sat_ == 0)
-                                {
-                                    channels_[ch_index]->set_signal(search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), true));
-                                }
-                            acq_channels_count_++;
-                            DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str();
-#ifndef ENABLE_FPGA
-                            channels_[ch_index]->start_acquisition();
-#else
-                            // create a task for the FPGA such that it doesn't stop the flow
-                            std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[ch_index]);
-                            tmp_thread.detach();
-#endif
-                        }
-                    DLOG(INFO) << "Channel " << ch_index << " in state " << channels_state_[ch_index];
-                }
+            if (acq_channels_count_ > 0) acq_channels_count_--;
+            //call the acquisition manager to assign new satellite and start next acquisition (if required)
+            acquisition_manager(who);
             break;
-
         case 1:
-            LOG(INFO) << "Channel " << who << " ACQ SUCCESS satellite " << channels_[who]->get_signal().get_satellite();
-
+            DLOG(INFO) << "Channel " << who << " ACQ SUCCESS satellite " << channels_[who]->get_signal().get_satellite();
             // If the satellite is in the list of available ones, remove it.
-            switch (mapStringValues_[channels_[who]->get_signal().get_signal_str()])
-                {
-                case evGPS_1C:
-                    available_GPS_1C_signals_.remove(channels_[who]->get_signal());
-                    break;
-
-                case evGPS_2S:
-                    available_GPS_2S_signals_.remove(channels_[who]->get_signal());
-                    break;
-
-                case evGPS_L5:
-                    available_GPS_L5_signals_.remove(channels_[who]->get_signal());
-                    break;
-
-                case evGAL_1B:
-                    available_GAL_1B_signals_.remove(channels_[who]->get_signal());
-                    break;
-
-                case evGAL_5X:
-                    available_GAL_5X_signals_.remove(channels_[who]->get_signal());
-                    break;
-
-                case evGLO_1G:
-                    available_GLO_1G_signals_.remove(channels_[who]->get_signal());
-                    break;
-
-                case evGLO_2G:
-                    available_GLO_2G_signals_.remove(channels_[who]->get_signal());
-                    break;
-
-                case evBDS_B1:
-                    available_BDS_B1_signals_.remove(channels_[who]->get_signal());
-                    break;
-
-                case evBDS_B3:
-                    available_BDS_B3_signals_.remove(channels_[who]->get_signal());
-                    break;
-
-                default:
-                    LOG(ERROR) << "This should not happen :-(";
-                    break;
-                }
+            remove_signal(channels_[who]->get_signal());
 
             channels_state_[who] = 2;
-            acq_channels_count_--;
-            for (unsigned int i = 0; i < channels_count_; i++)
-                {
-                    unsigned int sat_ = 0;
-                    try
-                        {
-                            sat_ = configuration_->property("Channel" + std::to_string(i) + ".satellite", 0);
-                        }
-                    catch (const std::exception& e)
-                        {
-                            LOG(WARNING) << e.what();
-                        }
-                    if ((acq_channels_count_ < max_acq_channels_) && (channels_state_[i] == 0))
-                        {
-                            channels_state_[i] = 1;
-                            if (sat_ == 0)
-                                {
-                                    channels_[i]->set_signal(search_next_signal(channels_[i]->get_signal().get_signal_str(), true, true));
-                                }
-                            acq_channels_count_++;
-                            DLOG(INFO) << "Channel " << i << " Starting acquisition " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str();
-#ifndef ENABLE_FPGA
-                            channels_[i]->start_acquisition();
-#else
-                            // create a task for the FPGA such that it doesn't stop the flow
-                            std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[i]);
-                            tmp_thread.detach();
-#endif
-                        }
-                    DLOG(INFO) << "Channel " << i << " in state " << channels_state_[i];
-                }
+            if (acq_channels_count_ > 0) acq_channels_count_--;
+            //call the acquisition manager to assign new satellite and start next acquisition (if required)
+            acquisition_manager(who);
             break;
 
         case 2:
-            LOG(INFO) << "Channel " << who << " TRK FAILED satellite " << channels_[who]->get_signal().get_satellite();
-            DLOG(INFO) << "Number of channels in acquisition = " << acq_channels_count_;
-
+            DLOG(INFO) << "Channel " << who << " TRK FAILED satellite " << channels_[who]->get_signal().get_satellite();
             if (acq_channels_count_ < max_acq_channels_)
                 {
+                    //try to acquire the same satellite
                     channels_state_[who] = 1;
                     acq_channels_count_++;
-                    LOG(INFO) << "Channel " << who << " Starting acquisition " << channels_[who]->get_signal().get_satellite() << ", Signal " << channels_[who]->get_signal().get_signal_str();
+                    DLOG(INFO) << "Channel " << who << " Starting acquisition " << channels_[who]->get_signal().get_satellite() << ", Signal " << channels_[who]->get_signal().get_signal_str();
 #ifndef ENABLE_FPGA
                     channels_[who]->start_acquisition();
 #else
@@ -1290,48 +1326,7 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what)
                     LOG(INFO) << "Channel " << who << " Idle state";
                     if (sat == 0)
                         {
-                            switch (mapStringValues_[channels_[who]->get_signal().get_signal_str()])
-                                {
-                                case evGPS_1C:
-                                    available_GPS_1C_signals_.push_back(channels_[who]->get_signal());
-                                    break;
-
-                                case evGPS_2S:
-                                    available_GPS_2S_signals_.push_back(channels_[who]->get_signal());
-                                    break;
-
-                                case evGPS_L5:
-                                    available_GPS_L5_signals_.push_back(channels_[who]->get_signal());
-                                    break;
-
-                                case evGAL_1B:
-                                    available_GAL_1B_signals_.push_back(channels_[who]->get_signal());
-                                    break;
-
-                                case evGAL_5X:
-                                    available_GAL_5X_signals_.push_back(channels_[who]->get_signal());
-                                    break;
-
-                                case evGLO_1G:
-                                    available_GLO_1G_signals_.push_back(channels_[who]->get_signal());
-                                    break;
-
-                                case evGLO_2G:
-                                    available_GLO_2G_signals_.push_back(channels_[who]->get_signal());
-                                    break;
-
-                                case evBDS_B1:
-                                    available_BDS_B1_signals_.push_back(channels_[who]->get_signal());
-                                    break;
-
-                                case evBDS_B3:
-                                    available_BDS_B3_signals_.push_back(channels_[who]->get_signal());
-                                    break;
-
-                                default:
-                                    LOG(ERROR) << "This should not happen :-(";
-                                    break;
-                                }
+                            push_back_signal(channels_[who]->get_signal());
                         }
                 }
             break;
@@ -1343,57 +1338,8 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what)
                         {
                             //recover the satellite assigned
                             Gnss_Signal gs = channels_[n]->get_signal();
-                            switch (mapStringValues_[gs.get_signal_str()])
-                                {
-                                case evGPS_1C:
-                                    available_GPS_1C_signals_.remove(gs);
-                                    available_GPS_1C_signals_.push_back(gs);
-                                    break;
+                            push_back_signal(gs);
 
-                                case evGPS_2S:
-                                    available_GPS_2S_signals_.remove(gs);
-                                    available_GPS_2S_signals_.push_back(gs);
-                                    break;
-
-                                case evGPS_L5:
-                                    available_GPS_L5_signals_.remove(gs);
-                                    available_GPS_L5_signals_.push_back(gs);
-                                    break;
-
-                                case evGAL_1B:
-                                    available_GAL_1B_signals_.remove(gs);
-                                    available_GAL_1B_signals_.push_back(gs);
-                                    break;
-
-                                case evGAL_5X:
-                                    available_GAL_5X_signals_.remove(gs);
-                                    available_GAL_5X_signals_.push_back(gs);
-                                    break;
-
-                                case evGLO_1G:
-                                    available_GLO_1G_signals_.remove(gs);
-                                    available_GLO_1G_signals_.push_back(gs);
-                                    break;
-
-                                case evGLO_2G:
-                                    available_GLO_2G_signals_.remove(gs);
-                                    available_GLO_2G_signals_.push_back(gs);
-                                    break;
-
-                                case evBDS_B1:
-                                    available_BDS_B1_signals_.remove(gs);
-                                    available_BDS_B1_signals_.push_back(gs);
-                                    break;
-
-                                case evBDS_B3:
-                                    available_BDS_B3_signals_.remove(gs);
-                                    available_BDS_B3_signals_.push_back(gs);
-                                    break;
-
-                                default:
-                                    LOG(ERROR) << "This should not happen :-(";
-                                    break;
-                                }
                             channels_[n]->stop_channel();  // stop the acquisition or tracking operation
                             channels_state_[n] = 0;
                         }
@@ -1402,112 +1348,22 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what)
             break;
         case 11:  // request coldstart mode
             LOG(INFO) << "TC request flowgraph coldstart";
-            // start again the satellite acquisitions
-            for (unsigned int i = 0; i < channels_count_; i++)
-                {
-                    unsigned int ch_index = (who + i + 1) % channels_count_;
-                    unsigned int sat_ = 0;
-                    try
-                        {
-                            sat_ = configuration_->property("Channel" + std::to_string(ch_index) + ".satellite", 0);
-                        }
-                    catch (const std::exception& e)
-                        {
-                            LOG(WARNING) << e.what();
-                        }
-                    if ((acq_channels_count_ < max_acq_channels_) && (channels_state_[ch_index] == 0))
-                        {
-                            channels_state_[ch_index] = 1;
-                            if (sat_ == 0)
-                                {
-                                    channels_[ch_index]->set_signal(search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), true));
-                                }
-                            acq_channels_count_++;
-                            DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str();
-#ifndef ENABLE_FPGA
-                            channels_[ch_index]->start_acquisition();
-#else
-                            // create a task for the FPGA such that it doesn't stop the flow
-                            std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[ch_index]);
-                            tmp_thread.detach();
-#endif
-                        }
-                    DLOG(INFO) << "Channel " << ch_index << " in state " << channels_state_[ch_index];
-                }
+            //call the acquisition manager to assign new satellite and start next acquisition (if required)
+            acquisition_manager(who);
             break;
         case 12:  // request hotstart mode
             LOG(INFO) << "TC request flowgraph hotstart";
-            for (unsigned int i = 0; i < channels_count_; i++)
-                {
-                    unsigned int ch_index = (who + i + 1) % channels_count_;
-                    unsigned int sat_ = 0;
-                    try
-                        {
-                            sat_ = configuration_->property("Channel" + std::to_string(ch_index) + ".satellite", 0);
-                        }
-                    catch (const std::exception& e)
-                        {
-                            LOG(WARNING) << e.what();
-                        }
-                    if ((acq_channels_count_ < max_acq_channels_) && (channels_state_[ch_index] == 0))
-                        {
-                            channels_state_[ch_index] = 1;
-                            if (sat_ == 0)
-                                {
-                                    channels_[ch_index]->set_signal(search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), true));
-                                }
-                            acq_channels_count_++;
-                            DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str();
-#ifndef ENABLE_FPGA
-                            channels_[ch_index]->start_acquisition();
-#else
-                            // create a task for the FPGA such that it doesn't stop the flow
-                            std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[ch_index]);
-                            tmp_thread.detach();
-#endif
-                        }
-                    DLOG(INFO) << "Channel " << ch_index << " in state " << channels_state_[ch_index];
-                }
+            //call the acquisition manager to assign new satellite and start next acquisition (if required)
+            acquisition_manager(who);
             break;
         case 13:  // request warmstart mode
             LOG(INFO) << "TC request flowgraph warmstart";
-            // start again the satellite acquisitions
-            for (unsigned int i = 0; i < channels_count_; i++)
-                {
-                    unsigned int ch_index = (who + i + 1) % channels_count_;
-                    unsigned int sat_ = 0;
-                    try
-                        {
-                            sat_ = configuration_->property("Channel" + std::to_string(ch_index) + ".satellite", 0);
-                        }
-                    catch (const std::exception& e)
-                        {
-                            LOG(WARNING) << e.what();
-                        }
-                    if ((acq_channels_count_ < max_acq_channels_) && (channels_state_[ch_index] == 0))
-                        {
-                            channels_state_[ch_index] = 1;
-                            if (sat_ == 0)
-                                {
-                                    channels_[ch_index]->set_signal(search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), true));
-                                }
-                            acq_channels_count_++;
-                            DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str();
-#ifndef ENABLE_FPGA
-                            channels_[ch_index]->start_acquisition();
-#else
-                            // create a task for the FPGA such that it doesn't stop the flow
-                            std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[ch_index]);
-                            tmp_thread.detach();
-#endif
-                        }
-                    DLOG(INFO) << "Channel " << ch_index << " in state " << channels_state_[ch_index];
-                }
+            //call the acquisition manager to assign new satellite and start next acquisition (if required)
+            acquisition_manager(who);
             break;
         default:
             break;
         }
-    applied_actions_++;
 }
 
 
@@ -1610,6 +1466,8 @@ void GNSSFlowgraph::init()
      */
     std::unique_ptr<GNSSBlockFactory> block_factory_(new GNSSBlockFactory());
 
+    channels_status_ = channel_status_msg_receiver_make();
+
     // 1. read the number of RF front-ends available (one file_source per RF front-end)
     sources_count_ = configuration_->property("Receiver.sources_count", 1);
 
@@ -1701,7 +1559,6 @@ void GNSSFlowgraph::init()
     // fill the signals queue with the satellites ID's to be searched by the acquisition
     set_signals_list();
     set_channels_state();
-    applied_actions_ = 0;
     DLOG(INFO) << "Blocks instantiated. " << channels_count_ << " channels.";
 
     /*
@@ -2010,110 +1867,124 @@ void GNSSFlowgraph::set_channels_state()
 }
 
 
-Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal, bool pop, bool tracked)
+Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal,
+    const bool pop,
+    bool& is_primary_frequency,
+    bool& assistance_available,
+    float& estimated_doppler,
+    double& RX_time)
 {
+    is_primary_frequency = false;
+    assistance_available = false;
     Gnss_Signal result;
-    bool untracked_satellite = true;
+    bool found_signal = false;
     switch (mapStringValues_[searched_signal])
         {
         case evGPS_1C:
+            //todo: assist the satellite selection with almanac and current PVT here (rehuse priorize_satellite function used in control_thread)
             result = available_GPS_1C_signals_.front();
             available_GPS_1C_signals_.pop_front();
             if (!pop)
                 {
                     available_GPS_1C_signals_.push_back(result);
                 }
-            if (tracked)
-                {
-                    if ((configuration_->property("Channels_2S.count", 0) > 0) or (configuration_->property("Channels_L5.count", 0) > 0))
-                        {
-                            for (unsigned int ch = 0; ch < channels_count_; ch++)
-                                {
-                                    if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "1C"))
-                                        {
-                                            untracked_satellite = false;
-                                        }
-                                }
-                            if (untracked_satellite and configuration_->property("Channels_2S.count", 0) > 0)
-                                {
-                                    Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "2S");
-                                    available_GPS_2S_signals_.remove(gs);
-                                    available_GPS_2S_signals_.push_front(gs);
-                                }
-                            if (untracked_satellite and configuration_->property("Channels_L5.count", 0) > 0)
-                                {
-                                    Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "L5");
-                                    available_GPS_L5_signals_.remove(gs);
-                                    available_GPS_L5_signals_.push_front(gs);
-                                }
-                        }
-                }
+            is_primary_frequency = true;  //indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..)
             break;
 
         case evGPS_2S:
-            result = available_GPS_2S_signals_.front();
-            available_GPS_2S_signals_.pop_front();
-            if (!pop)
+            if (configuration_->property("Channels_1C.count", 0) > 0)
                 {
-                    available_GPS_2S_signals_.push_back(result);
-                }
-            if (tracked)
-                {
-                    if ((configuration_->property("Channels_1C.count", 0) > 0) or (configuration_->property("Channels_L5.count", 0) > 0))
+                    //1. Get the current channel status map
+                    std::map<int, std::shared_ptr<Gnss_Synchro>> current_channels_status = channels_status_->get_current_status_map();
+                    //2. search the currently tracked GPS L1 satellites and assist the GPS L2 acquisition if the satellite is not tracked on L2
+                    bool found_signal = false;
+                    for (std::map<int, std::shared_ptr<Gnss_Synchro>>::iterator it = current_channels_status.begin(); it != current_channels_status.end(); ++it)
                         {
-                            for (unsigned int ch = 0; ch < channels_count_; ch++)
+                            if (std::string(it->second->Signal) == "1C")
                                 {
-                                    if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2S"))
+                                    std::list<Gnss_Signal>::iterator it2;
+                                    it2 = std::find_if(std::begin(available_GPS_2S_signals_), std::end(available_GPS_2S_signals_),
+                                        [&](Gnss_Signal const& sig) { return sig.get_satellite().get_PRN() == it->second->PRN; });
+
+                                    if (it2 != available_GPS_2S_signals_.end())
                                         {
-                                            untracked_satellite = false;
+                                            estimated_doppler = it->second->Carrier_Doppler_hz;
+                                            RX_time = it->second->RX_time;
+                                            //std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n";
+                                            //3. return the GPS L2 satellite and remove it from list
+                                            result = *it2;
+                                            if (pop)
+                                                {
+                                                    available_GPS_2S_signals_.erase(it2);
+                                                }
+                                            found_signal = true;
+                                            assistance_available = true;
+                                            break;
                                         }
                                 }
-                            if (untracked_satellite and configuration_->property("Channels_1C.count", 0) > 0)
+                        }
+                    //fallback: pick the front satellite because there is no tracked satellites in L1 to assist L2
+                    if (found_signal == false)
+                        {
+                            result = available_GPS_2S_signals_.front();
+                            available_GPS_2S_signals_.pop_front();
+                            if (!pop)
                                 {
-                                    Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1C");
-                                    available_GPS_1C_signals_.remove(gs);
-                                    available_GPS_1C_signals_.push_front(gs);
-                                }
-                            if (untracked_satellite and configuration_->property("Channels_L5.count", 0) > 0)
-                                {
-                                    Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "L5");
-                                    available_GPS_L5_signals_.remove(gs);
-                                    available_GPS_L5_signals_.push_front(gs);
+                                    available_GPS_2S_signals_.push_back(result);
                                 }
                         }
                 }
+            else
+                {
+                    result = available_GPS_2S_signals_.front();
+                    available_GPS_2S_signals_.pop_front();
+                    if (!pop)
+                        {
+                            available_GPS_2S_signals_.push_back(result);
+                        }
+                }
             break;
 
         case evGPS_L5:
-            result = available_GPS_L5_signals_.front();
-            available_GPS_L5_signals_.pop_front();
-            if (!pop)
+            if (configuration_->property("Channels_1C.count", 0) > 0)
                 {
-                    available_GPS_L5_signals_.push_back(result);
-                }
-            if (tracked)
-                {
-                    if ((configuration_->property("Channels_1C.count", 0) > 0) or (configuration_->property("Channels_2S.count", 0) > 0))
+                    //1. Get the current channel status map
+                    std::map<int, std::shared_ptr<Gnss_Synchro>> current_channels_status = channels_status_->get_current_status_map();
+                    //2. search the currently tracked GPS L1 satellites and assist the GPS L5 acquisition if the satellite is not tracked on L5
+                    for (std::map<int, std::shared_ptr<Gnss_Synchro>>::iterator it = current_channels_status.begin(); it != current_channels_status.end(); ++it)
                         {
-                            for (unsigned int ch = 0; ch < channels_count_; ch++)
+                            if (std::string(it->second->Signal) == "1C")
                                 {
-                                    if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "L5"))
+                                    std::list<Gnss_Signal>::iterator it2;
+                                    it2 = std::find_if(std::begin(available_GPS_L5_signals_), std::end(available_GPS_L5_signals_),
+                                        [&](Gnss_Signal const& sig) { return sig.get_satellite().get_PRN() == it->second->PRN; });
+
+                                    if (it2 != available_GPS_L5_signals_.end())
                                         {
-                                            untracked_satellite = false;
+                                            estimated_doppler = it->second->Carrier_Doppler_hz;
+                                            RX_time = it->second->RX_time;
+                                            //std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n";
+                                            //3. return the GPS L5 satellite and remove it from list
+                                            result = *it2;
+                                            if (pop)
+                                                {
+                                                    available_GPS_L5_signals_.erase(it2);
+                                                }
+                                            found_signal = true;
+                                            assistance_available = true;
+                                            break;
                                         }
                                 }
-                            if (untracked_satellite and configuration_->property("Channels_1C.count", 0) > 0)
-                                {
-                                    Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1C");
-                                    available_GPS_1C_signals_.remove(gs);
-                                    available_GPS_1C_signals_.push_front(gs);
-                                }
-                            if (untracked_satellite and configuration_->property("Channels_2S.count", 0) > 0)
-                                {
-                                    Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "2S");
-                                    available_GPS_2S_signals_.remove(gs);
-                                    available_GPS_2S_signals_.push_front(gs);
-                                }
+                        }
+                }
+            //fallback: pick the front satellite because there is no tracked satellites in L1 to assist L5
+            if (found_signal == false)
+                {
+                    result = available_GPS_L5_signals_.front();
+                    available_GPS_L5_signals_.pop_front();
+                    if (!pop)
+                        {
+                            available_GPS_L5_signals_.push_back(result);
                         }
                 }
             break;
@@ -2125,51 +1996,50 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal
                 {
                     available_GAL_1B_signals_.push_back(result);
                 }
-            if (tracked)
-                {
-                    if (configuration_->property("Channels_5X.count", 0) > 0)
-                        {
-                            for (unsigned int ch = 0; ch < channels_count_; ch++)
-                                {
-                                    if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "1B"))
-                                        {
-                                            untracked_satellite = false;
-                                        }
-                                }
-                            if (untracked_satellite)
-                                {
-                                    Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "5X");
-                                    available_GAL_5X_signals_.remove(gs);
-                                    available_GAL_5X_signals_.push_front(gs);
-                                }
-                        }
-                }
+            is_primary_frequency = true;  //indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..)
             break;
 
         case evGAL_5X:
-            result = available_GAL_5X_signals_.front();
-            available_GAL_5X_signals_.pop_front();
-            if (!pop)
+
+            if (configuration_->property("Channels_1B.count", 0) > 0)
                 {
-                    available_GAL_5X_signals_.push_back(result);
-                }
-            if (tracked)
-                {
-                    if (configuration_->property("Channels_1B.count", 0) > 0)
+                    //1. Get the current channel status map
+                    std::map<int, std::shared_ptr<Gnss_Synchro>> current_channels_status = channels_status_->get_current_status_map();
+                    //2. search the currently tracked Galileo E1 satellites and assist the Galileo E5 acquisition if the satellite is not tracked on E5
+                    for (std::map<int, std::shared_ptr<Gnss_Synchro>>::iterator it = current_channels_status.begin(); it != current_channels_status.end(); ++it)
                         {
-                            for (unsigned int ch = 0; ch < channels_count_; ch++)
+                            if (std::string(it->second->Signal) == "1B")
                                 {
-                                    if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "5X"))
+                                    std::list<Gnss_Signal>::iterator it2;
+                                    it2 = std::find_if(std::begin(available_GAL_5X_signals_), std::end(available_GAL_5X_signals_),
+                                        [&](Gnss_Signal const& sig) { return sig.get_satellite().get_PRN() == it->second->PRN; });
+
+                                    if (it2 != available_GAL_5X_signals_.end())
                                         {
-                                            untracked_satellite = false;
+                                            estimated_doppler = it->second->Carrier_Doppler_hz;
+                                            RX_time = it->second->RX_time;
+                                            //std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n";
+                                            //3. return the Gal 5X satellite and remove it from list
+                                            result = *it2;
+                                            if (pop)
+                                                {
+                                                    available_GAL_5X_signals_.erase(it2);
+                                                }
+                                            found_signal = true;
+                                            assistance_available = true;
+                                            break;
                                         }
                                 }
-                            if (untracked_satellite)
-                                {
-                                    Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1B");
-                                    available_GAL_1B_signals_.remove(gs);
-                                    available_GAL_1B_signals_.push_front(gs);
-                                }
+                        }
+                }
+            //fallback: pick the front satellite because there is no tracked satellites in E1 to assist E5
+            if (found_signal == false)
+                {
+                    result = available_GAL_5X_signals_.front();
+                    available_GAL_5X_signals_.pop_front();
+                    if (!pop)
+                        {
+                            available_GAL_5X_signals_.push_back(result);
                         }
                 }
             break;
@@ -2181,25 +2051,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal
                 {
                     available_GLO_1G_signals_.push_back(result);
                 }
-            if (tracked)
-                {
-                    if (configuration_->property("Channels_2G.count", 0) > 0)
-                        {
-                            for (unsigned int ch = 0; ch < channels_count_; ch++)
-                                {
-                                    if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "1G"))
-                                        {
-                                            untracked_satellite = false;
-                                        }
-                                }
-                            if (untracked_satellite)
-                                {
-                                    Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "2G");
-                                    available_GLO_2G_signals_.remove(gs);
-                                    available_GLO_2G_signals_.push_front(gs);
-                                }
-                        }
-                }
+            is_primary_frequency = true;  //indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..)
             break;
 
         case evGLO_2G:
@@ -2209,25 +2061,6 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal
                 {
                     available_GLO_2G_signals_.push_back(result);
                 }
-            if (tracked)
-                {
-                    if (configuration_->property("Channels_1G.count", 0) > 0)
-                        {
-                            for (unsigned int ch = 0; ch < channels_count_; ch++)
-                                {
-                                    if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G"))
-                                        {
-                                            untracked_satellite = false;
-                                        }
-                                }
-                            if (untracked_satellite)
-                                {
-                                    Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1G");
-                                    available_GLO_1G_signals_.remove(gs);
-                                    available_GLO_1G_signals_.push_front(gs);
-                                }
-                        }
-                }
             break;
 
         case evBDS_B1:
@@ -2237,25 +2070,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal
                 {
                     available_BDS_B1_signals_.push_back(result);
                 }
-            if (tracked)
-                {
-                    if (configuration_->property("Channels_B3.count", 0) > 0)
-                        {
-                            for (unsigned int ch = 0; ch < channels_count_; ch++)
-                                {
-                                    if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G"))
-                                        {
-                                            untracked_satellite = false;
-                                        }
-                                }
-                            if (untracked_satellite)
-                                {
-                                    Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "B3");
-                                    available_BDS_B3_signals_.remove(gs);
-                                    available_BDS_B3_signals_.push_front(gs);
-                                }
-                        }
-                }
+            is_primary_frequency = true;  //indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..)
             break;
 
         case evBDS_B3:
@@ -2265,25 +2080,6 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal
                 {
                     available_BDS_B3_signals_.push_back(result);
                 }
-            if (tracked)
-                {
-                    if (configuration_->property("Channels_B1.count", 0) > 0)
-                        {
-                            for (unsigned int ch = 0; ch < channels_count_; ch++)
-                                {
-                                    if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G"))
-                                        {
-                                            untracked_satellite = false;
-                                        }
-                                }
-                            if (untracked_satellite)
-                                {
-                                    Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "B1");
-                                    available_BDS_B1_signals_.remove(gs);
-                                    available_BDS_B1_signals_.push_front(gs);
-                                }
-                        }
-                }
             break;
 
         default:
diff --git a/src/core/receiver/gnss_flowgraph.h b/src/core/receiver/gnss_flowgraph.h
index 7552c46a7..8d3c3fa58 100644
--- a/src/core/receiver/gnss_flowgraph.h
+++ b/src/core/receiver/gnss_flowgraph.h
@@ -37,11 +37,12 @@
 #ifndef GNSS_SDR_GNSS_FLOWGRAPH_H_
 #define GNSS_SDR_GNSS_FLOWGRAPH_H_
 
+#include "channel_status_msg_receiver.h"
+#include "concurrent_queue.h"
 #include "gnss_sdr_sample_counter.h"
 #include "gnss_signal.h"
 #include "pvt_interface.h"
 #include <gnuradio/blocks/null_sink.h>  //for null_sink
-#include <gnuradio/msg_queue.h>         // for msg_queue, msg_queue::sptr
 #include <gnuradio/runtime_types.h>     // for basic_block_sptr, top_block_sptr
 #include <pmt/pmt.h>                    // for pmt_t
 #include <list>                         // for list
@@ -71,7 +72,7 @@ public:
     /*!
      * \brief Constructor that initializes the receiver flow graph
      */
-    GNSSFlowgraph(std::shared_ptr<ConfigurationInterface> configuration, const gr::msg_queue::sptr queue);  // NOLINT(performance-unnecessary-value-param)
+    GNSSFlowgraph(std::shared_ptr<ConfigurationInterface> configuration, const std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);  // NOLINT(performance-unnecessary-value-param)
 
     /*!
      * \brief Destructor
@@ -99,6 +100,8 @@ public:
 
     void perform_hw_reset();
 #endif
+
+    void acquisition_manager(unsigned int who);
     /*!
      * \brief Applies an action to the flow graph
      *
@@ -107,12 +110,11 @@ public:
      */
     void apply_action(unsigned int who, unsigned int what);
 
-    void set_configuration(std::shared_ptr<ConfigurationInterface> configuration);
 
-    unsigned int applied_actions() const
-    {
-        return applied_actions_;
-    }
+    void push_back_signal(Gnss_Signal gs);
+    void remove_signal(Gnss_Signal gs);
+
+    void set_configuration(std::shared_ptr<ConfigurationInterface> configuration);
 
     bool connected() const
     {
@@ -149,7 +151,12 @@ private:
     void set_signals_list();
     void set_channels_state();  // Initializes the channels state (start acquisition or keep standby)
                                 // using the configuration parameters (number of channels and max channels in acquisition)
-    Gnss_Signal search_next_signal(const std::string& searched_signal, bool pop, bool tracked = false);
+    Gnss_Signal search_next_signal(const std::string& searched_signal,
+        const bool pop,
+        bool& is_primary_frequency,
+        bool& assistance_available,
+        float& estimated_doppler,
+        double& RX_time);
     bool connected_;
     bool running_;
     int sources_count_;
@@ -157,7 +164,6 @@ private:
     unsigned int channels_count_;
     unsigned int acq_channels_count_;
     unsigned int max_acq_channels_;
-    unsigned int applied_actions_;
     std::string config_file_;
     std::shared_ptr<ConfigurationInterface> configuration_;
 
@@ -175,7 +181,7 @@ private:
     gnss_sdr_fpga_sample_counter_sptr ch_out_fpga_sample_counter;
 #endif
     gr::top_block_sptr top_block_;
-    gr::msg_queue::sptr queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
 
     std::list<Gnss_Signal> available_GPS_1C_signals_;
     std::list<Gnss_Signal> available_GPS_2S_signals_;
@@ -203,6 +209,7 @@ private:
     std::map<std::string, StringValue> mapStringValues_;
 
     std::vector<unsigned int> channels_state_;
+    channel_status_msg_receiver_sptr channels_status_;  //class that receives and stores the current status of the receiver channels
     std::mutex signal_list_mutex;
 
     bool enable_monitor_;
diff --git a/src/core/receiver/tcp_cmd_interface.cc b/src/core/receiver/tcp_cmd_interface.cc
index 5cac461ad..f274c82dc 100644
--- a/src/core/receiver/tcp_cmd_interface.cc
+++ b/src/core/receiver/tcp_cmd_interface.cc
@@ -30,7 +30,7 @@
  */
 
 #include "tcp_cmd_interface.h"
-#include "control_message_factory.h"
+#include "command_event.h"
 #include "pvt_interface.h"
 #include <boost/asio.hpp>
 #include <array>
@@ -94,17 +94,16 @@ arma::vec TcpCmdInterface::get_LLH()
 std::string TcpCmdInterface::reset(const std::vector<std::string> &commandLine __attribute__((unused)))
 {
     std::string response;
-    std::unique_ptr<ControlMessageFactory> cmf(new ControlMessageFactory());
     if (control_queue_ != nullptr)
         {
-            control_queue_->handle(cmf->GetQueueMessage(200, 1));  //send the restart message (who=200,what=1)
+            command_event_sptr new_evnt = command_event_make(200, 1);  //send the restart message (who=200,what=1)
+            control_queue_->push(pmt::make_any(new_evnt));
             response = "OK\n";
         }
     else
         {
             response = "ERROR\n";
         }
-
     return response;
 }
 
@@ -112,10 +111,10 @@ std::string TcpCmdInterface::reset(const std::vector<std::string> &commandLine _
 std::string TcpCmdInterface::standby(const std::vector<std::string> &commandLine __attribute__((unused)))
 {
     std::string response;
-    std::unique_ptr<ControlMessageFactory> cmf(new ControlMessageFactory());
     if (control_queue_ != nullptr)
         {
-            control_queue_->handle(cmf->GetQueueMessage(300, 10));  //send the standby message (who=300,what=10)
+            command_event_sptr new_evnt = command_event_make(300, 10);  //send the standby message (who=300,what=10)
+            control_queue_->push(pmt::make_any(new_evnt));
             response = "OK\n";
         }
     else
@@ -203,10 +202,10 @@ std::string TcpCmdInterface::hotstart(const std::vector<std::string> &commandLin
                 }
             else
                 {
-                    std::unique_ptr<ControlMessageFactory> cmf(new ControlMessageFactory());
                     if (control_queue_ != nullptr)
                         {
-                            control_queue_->handle(cmf->GetQueueMessage(300, 12));  //send the standby message (who=300,what=12)
+                            command_event_sptr new_evnt = command_event_make(300, 12);  //send the standby message (who=300,what=12)
+                            control_queue_->push(pmt::make_any(new_evnt));
                             response = "OK\n";
                         }
                     else
@@ -250,10 +249,10 @@ std::string TcpCmdInterface::warmstart(const std::vector<std::string> &commandLi
                 }
             else
                 {
-                    std::unique_ptr<ControlMessageFactory> cmf(new ControlMessageFactory());
                     if (control_queue_ != nullptr)
                         {
-                            control_queue_->handle(cmf->GetQueueMessage(300, 13));  // send the warmstart message (who=300,what=13)
+                            command_event_sptr new_evnt = command_event_make(300, 13);  // send the warmstart message (who=300,what=13)
+                            control_queue_->push(pmt::make_any(new_evnt));
                             response = "OK\n";
                         }
                     else
@@ -273,16 +272,17 @@ std::string TcpCmdInterface::warmstart(const std::vector<std::string> &commandLi
 std::string TcpCmdInterface::coldstart(const std::vector<std::string> &commandLine __attribute__((unused)))
 {
     std::string response;
-    std::unique_ptr<ControlMessageFactory> cmf(new ControlMessageFactory());
     if (control_queue_ != nullptr)
         {
-            control_queue_->handle(cmf->GetQueueMessage(300, 11));  // send the coldstart message (who=300,what=11)
+            command_event_sptr new_evnt = command_event_make(300, 11);  // send the coldstart message (who=300,what=11)
+            control_queue_->push(pmt::make_any(new_evnt));
             response = "OK\n";
         }
     else
         {
             response = "ERROR\n";
         }
+
     return response;
 }
 
@@ -296,7 +296,7 @@ std::string TcpCmdInterface::set_ch_satellite(const std::vector<std::string> &co
 }
 
 
-void TcpCmdInterface::set_msg_queue(gr::msg_queue::sptr control_queue)
+void TcpCmdInterface::set_msg_queue(std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> control_queue)
 {
     control_queue_ = std::move(control_queue);
 }
diff --git a/src/core/receiver/tcp_cmd_interface.h b/src/core/receiver/tcp_cmd_interface.h
index e5658a6d9..0b6276e92 100644
--- a/src/core/receiver/tcp_cmd_interface.h
+++ b/src/core/receiver/tcp_cmd_interface.h
@@ -32,8 +32,9 @@
 #define GNSS_SDR_TCP_CMD_INTERFACE_H_
 
 
+#include "concurrent_queue.h"
 #include <armadillo>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 #include <cstdint>
 #include <ctime>
 #include <functional>
@@ -50,7 +51,7 @@ public:
     TcpCmdInterface();
     virtual ~TcpCmdInterface();
     void run_cmd_server(int tcp_port);
-    void set_msg_queue(gr::msg_queue::sptr control_queue);
+    void set_msg_queue(std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> control_queue);
 
     /*!
      * \brief gets the UTC time parsed from the last TC command issued
@@ -77,7 +78,7 @@ private:
 
     void register_functions();
 
-    gr::msg_queue::sptr control_queue_;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> control_queue_;
     bool keep_running_;
 
     time_t receiver_utc_time_;
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index 8a4fb8943..021966a1a 100644
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -869,7 +869,6 @@ endif()
 if(NOT ENABLE_PACKAGING AND NOT ENABLE_FPGA)
     add_executable(control_thread_test
         ${CMAKE_CURRENT_SOURCE_DIR}/single_test_main.cc
-        ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/control-plane/control_message_factory_test.cc
         ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/control-plane/control_thread_test.cc
     )
     if(${FILESYSTEM_FOUND})
diff --git a/src/tests/data/high_dynamics_signal.bin b/src/tests/data/high_dynamics_signal.bin
new file mode 100644
index 000000000..ba463e31c
Binary files /dev/null and b/src/tests/data/high_dynamics_signal.bin differ
diff --git a/src/tests/data/high_dynamics_signal.mat b/src/tests/data/high_dynamics_signal.mat
new file mode 100644
index 000000000..39c1312d5
Binary files /dev/null and b/src/tests/data/high_dynamics_signal.mat differ
diff --git a/src/tests/test_main.cc b/src/tests/test_main.cc
index e20338cfa..748df14a1 100644
--- a/src/tests/test_main.cc
+++ b/src/tests/test_main.cc
@@ -60,7 +60,6 @@ DECLARE_string(log_dir);
 #include "unit-tests/arithmetic/fft_speed_test.cc"
 #include "unit-tests/arithmetic/magnitude_squared_test.cc"
 #include "unit-tests/arithmetic/multiply_test.cc"
-#include "unit-tests/control-plane/control_message_factory_test.cc"
 #include "unit-tests/control-plane/control_thread_test.cc"
 #include "unit-tests/control-plane/file_configuration_test.cc"
 #include "unit-tests/control-plane/gnss_block_factory_test.cc"
diff --git a/src/tests/unit-tests/control-plane/control_message_factory_test.cc b/src/tests/unit-tests/control-plane/control_message_factory_test.cc
deleted file mode 100644
index 7440d37f4..000000000
--- a/src/tests/unit-tests/control-plane/control_message_factory_test.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-/*!
- * \file control message_factory_test.cc
- * \brief  This file implements tests for the ControlMessageFactory.
- * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com
- *         Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es
- *
- *
- * -------------------------------------------------------------------------
- *
- * Copyright (C) 2010-2018  (see AUTHORS file for a list of contributors)
- *
- * GNSS-SDR is a software defined Global Navigation
- *          Satellite Systems receiver
- *
- * This file is part of GNSS-SDR.
- *
- * GNSS-SDR 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 of the License, or
- * (at your option) any later version.
- *
- * GNSS-SDR 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 GNSS-SDR. If not, see <https://www.gnu.org/licenses/>.
- *
- * -------------------------------------------------------------------------
- */
-
-
-#include "control_message_factory.h"
-#include <gtest/gtest.h>
-#include <string>
-
-
-TEST(ControlMessageFactoryTest, GetQueueMessage)
-{
-    std::shared_ptr<ControlMessageFactory> factory = std::make_shared<ControlMessageFactory>();
-    gr::message::sptr queue_message = factory->GetQueueMessage(0, 2);
-    auto control_messages = factory->GetControlMessages(queue_message);
-    unsigned int expected0 = 0;
-    unsigned int expected2 = 2;
-    EXPECT_EQ(expected0, control_messages->at(0)->who);
-    EXPECT_EQ(expected2, control_messages->at(0)->what);
-    EXPECT_EQ(sizeof(ControlMessage), queue_message->length());
-}
-
-
-TEST(ControlMessageFactoryTest, GetControlMessages)
-{
-    std::shared_ptr<ControlMessageFactory> factory = std::make_shared<ControlMessageFactory>();
-    gr::message::sptr queue_message = gr::message::make(0, 0, 0, sizeof(ControlMessage));
-    std::shared_ptr<ControlMessage> control_message = std::make_shared<ControlMessage>();
-
-    control_message->who = 1;
-    control_message->what = 4;
-
-    memcpy(queue_message->msg(), control_message.get(), sizeof(ControlMessage));
-    std::shared_ptr<std::vector<std::shared_ptr<ControlMessage>>> control_messages = factory->GetControlMessages(queue_message);
-
-    unsigned int expected1 = 1;
-    unsigned int expected4 = 4;
-    EXPECT_EQ(expected1, control_messages->size());
-    EXPECT_EQ(expected1, control_messages->at(0)->who);
-    EXPECT_EQ(expected4, control_messages->at(0)->what);
-}
-
-/*
-
-TEST(ControlMessageFactoryTest, GetControlMessagesWrongSize)
-{
-
-    std::shared_ptr<ControlMessageFactory> factory = std::make_shared<ControlMessageFactory>();
-    std::shared_ptr<ControlMessage> control_message = std::make_shared<ControlMessage>();
-
-    control_message->who = 1;
-    control_message->what = 4;
-    int another_int = 10;
-
-    gr::message::sptr queue_message = gr::message::make(0, 0, 0, sizeof(ControlMessage) + sizeof(int));
-    memcpy(queue_message->msg(), control_message.get(), sizeof(ControlMessage));
-    memcpy(queue_message->msg() + sizeof(ControlMessage), &another_int, sizeof(int));
-    std::shared_ptr<std::vector<std::shared_ptr<ControlMessage>>> control_messages = factory->GetControlMessages(queue_message);
-
-    unsigned int expected0 = 0;
-    EXPECT_EQ(expected0, control_messages->size());
-} */
diff --git a/src/tests/unit-tests/control-plane/control_thread_test.cc b/src/tests/unit-tests/control-plane/control_thread_test.cc
index 781a5af76..4a0ffa18e 100644
--- a/src/tests/unit-tests/control-plane/control_thread_test.cc
+++ b/src/tests/unit-tests/control-plane/control_thread_test.cc
@@ -32,16 +32,17 @@
 
 
 #include "control_thread.h"
-#include "control_message_factory.h"
+#include "channel_event.h"
+#include "command_event.h"
+#include "concurrent_queue.h"
 #include "in_memory_configuration.h"
 #include <boost/exception/diagnostic_information.hpp>
 #include <boost/exception_ptr.hpp>
 #include <boost/lexical_cast.hpp>
 #include <gflags/gflags.h>
 #include <glog/logging.h>
-#include <gnuradio/message.h>
-#include <gnuradio/msg_queue.h>
 #include <gtest/gtest.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <exception>
 #include <memory>
@@ -121,13 +122,10 @@ TEST_F(ControlThreadTest /*unused*/, InstantiateRunControlMessages /*unused*/)
 
     std::shared_ptr<ControlThread> control_thread = std::make_shared<ControlThread>(config);
 
-    gr::msg_queue::sptr control_queue = gr::msg_queue::make(0);
-
-    std::unique_ptr<ControlMessageFactory> control_msg_factory(new ControlMessageFactory());
-
-    control_queue->handle(control_msg_factory->GetQueueMessage(0, 0));
-    control_queue->handle(control_msg_factory->GetQueueMessage(1, 0));
-    control_queue->handle(control_msg_factory->GetQueueMessage(200, 0));
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> control_queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
+    control_queue->push(pmt::make_any(channel_event_make(0, 0)));
+    control_queue->push(pmt::make_any(channel_event_make(1, 0)));
+    control_queue->push(pmt::make_any(command_event_make(200, 0)));
 
     control_thread->set_control_queue(control_queue);
     try
@@ -181,16 +179,14 @@ TEST_F(ControlThreadTest /*unused*/, InstantiateRunControlMessages2 /*unused*/)
     config->set_property("GNSS-SDR.internal_fs_sps", "4000000");
 
     std::unique_ptr<ControlThread> control_thread2(new ControlThread(config));
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> control_queue2 = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
-    gr::msg_queue::sptr control_queue2 = gr::msg_queue::make(0);
+    control_queue2->push(pmt::make_any(channel_event_make(0, 0)));
+    control_queue2->push(pmt::make_any(channel_event_make(2, 0)));
+    control_queue2->push(pmt::make_any(channel_event_make(1, 0)));
+    control_queue2->push(pmt::make_any(channel_event_make(3, 0)));
+    control_queue2->push(pmt::make_any(command_event_make(200, 0)));
 
-    std::unique_ptr<ControlMessageFactory> control_msg_factory2(new ControlMessageFactory());
-
-    control_queue2->handle(control_msg_factory2->GetQueueMessage(0, 0));
-    control_queue2->handle(control_msg_factory2->GetQueueMessage(2, 0));
-    control_queue2->handle(control_msg_factory2->GetQueueMessage(1, 0));
-    control_queue2->handle(control_msg_factory2->GetQueueMessage(3, 0));
-    control_queue2->handle(control_msg_factory2->GetQueueMessage(200, 0));
 
     control_thread2->set_control_queue(control_queue2);
 
@@ -245,7 +241,7 @@ TEST_F(ControlThreadTest /*unused*/, StopReceiverProgrammatically /*unused*/)
     config->set_property("GNSS-SDR.internal_fs_sps", "4000000");
 
     std::shared_ptr<ControlThread> control_thread = std::make_shared<ControlThread>(config);
-    gr::msg_queue::sptr control_queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> control_queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     control_thread->set_control_queue(control_queue);
 
     std::thread stop_receiver_thread(stop_receiver);
diff --git a/src/tests/unit-tests/control-plane/gnss_block_factory_test.cc b/src/tests/unit-tests/control-plane/gnss_block_factory_test.cc
index 0af18c4e1..7fd850f73 100644
--- a/src/tests/unit-tests/control-plane/gnss_block_factory_test.cc
+++ b/src/tests/unit-tests/control-plane/gnss_block_factory_test.cc
@@ -36,14 +36,15 @@
 #include "gnss_block_factory.h"
 #include "acquisition_interface.h"
 #include "channel.h"
+#include "concurrent_queue.h"
 #include "gnss_block_interface.h"
 #include "in_memory_configuration.h"
 #include "observables_interface.h"
 #include "pvt_interface.h"
 #include "telemetry_decoder_interface.h"
 #include "tracking_interface.h"
-#include <gnuradio/msg_queue.h>
 #include <gtest/gtest.h>
+#include <pmt/pmt.h>
 #include <vector>
 
 TEST(GNSSBlockFactoryTest, InstantiateFileSignalSource)
@@ -53,7 +54,7 @@ TEST(GNSSBlockFactoryTest, InstantiateFileSignalSource)
     std::string path = std::string(TEST_PATH);
     std::string filename = path + "signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_2ms.dat";
     configuration->set_property("SignalSource.filename", filename);
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     // Example of a factory as a shared_ptr
     std::shared_ptr<GNSSBlockFactory> factory = std::make_shared<GNSSBlockFactory>();
     // Example of a block as a shared_ptr
@@ -67,7 +68,7 @@ TEST(GNSSBlockFactoryTest, InstantiateWrongSignalSource)
 {
     std::shared_ptr<InMemoryConfiguration> configuration = std::make_shared<InMemoryConfiguration>();
     configuration->set_property("SignalSource.implementation", "Pepito");
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     // Example of a factory as a unique_ptr
     std::unique_ptr<GNSSBlockFactory> factory;
     // Example of a block as a unique_ptr
@@ -90,7 +91,7 @@ TEST(GNSSBlockFactoryTest, InstantiateSignalConditioner)
 TEST(GNSSBlockFactoryTest, InstantiateFIRFilter)
 {
     std::shared_ptr<InMemoryConfiguration> configuration = std::make_shared<InMemoryConfiguration>();
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     configuration->set_property("InputFilter.implementation", "Fir_Filter");
 
@@ -123,7 +124,7 @@ TEST(GNSSBlockFactoryTest, InstantiateFIRFilter)
 TEST(GNSSBlockFactoryTest, InstantiateFreqXlatingFIRFilter)
 {
     std::shared_ptr<InMemoryConfiguration> configuration = std::make_shared<InMemoryConfiguration>();
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     configuration->set_property("InputFilter.implementation", "Freq_Xlating_Fir_Filter");
 
@@ -158,7 +159,7 @@ TEST(GNSSBlockFactoryTest, InstantiateFreqXlatingFIRFilter)
 TEST(GNSSBlockFactoryTest, InstantiatePulseBlankingFilter)
 {
     std::shared_ptr<InMemoryConfiguration> configuration = std::make_shared<InMemoryConfiguration>();
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     configuration->set_property("InputFilter.implementation", "Pulse_Blanking_Filter");
 
     std::unique_ptr<GNSSBlockFactory> factory;
@@ -171,7 +172,7 @@ TEST(GNSSBlockFactoryTest, InstantiatePulseBlankingFilter)
 TEST(GNSSBlockFactoryTest, InstantiateNotchFilter)
 {
     std::shared_ptr<InMemoryConfiguration> configuration = std::make_shared<InMemoryConfiguration>();
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     configuration->set_property("InputFilter.implementation", "Notch_Filter");
 
     std::unique_ptr<GNSSBlockFactory> factory;
@@ -184,7 +185,7 @@ TEST(GNSSBlockFactoryTest, InstantiateNotchFilter)
 TEST(GNSSBlockFactoryTest, InstantiateNotchFilterLite)
 {
     std::shared_ptr<InMemoryConfiguration> configuration = std::make_shared<InMemoryConfiguration>();
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     configuration->set_property("InputFilter.implementation", "Notch_Filter_Lite");
 
     std::unique_ptr<GNSSBlockFactory> factory;
@@ -309,7 +310,7 @@ TEST(GNSSBlockFactoryTest, InstantiateChannels)
     configuration->set_property("Channel0.item_type", "gr_complex");
     configuration->set_property("Acquisition_1C.implementation", "GPS_L1_CA_PCPS_Acquisition");
     configuration->set_property("Channel1.item_type", "gr_complex");
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     std::unique_ptr<GNSSBlockFactory> factory;
     std::unique_ptr<std::vector<std::unique_ptr<GNSSBlockInterface>>> channels = factory->GetChannels(configuration, queue);
     EXPECT_EQ(static_cast<unsigned int>(2), channels->size());
diff --git a/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc b/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc
index 711b49d5f..56a7671d1 100644
--- a/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc
+++ b/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc
@@ -30,17 +30,17 @@
  * -------------------------------------------------------------------------
  */
 
+#include "gnss_flowgraph.h"
 #include "acquisition_interface.h"
 #include "channel.h"
 #include "channel_interface.h"
+#include "concurrent_queue.h"
 #include "file_configuration.h"
 #include "file_signal_source.h"
 #include "gnss_block_interface.h"
-#include "gnss_flowgraph.h"
 #include "in_memory_configuration.h"
 #include "pass_through.h"
 #include "tracking_interface.h"
-#include <gnuradio/msg_queue.h>
 #include <gtest/gtest.h>
 
 
@@ -68,7 +68,7 @@ TEST(GNSSFlowgraph /*unused*/, InstantiateConnectStartStopOldNotation /*unused*/
     config->set_property("Observables.implementation", "Hybrid_Observables");
     config->set_property("PVT.implementation", "RTKLIB_PVT");
 
-    std::shared_ptr<GNSSFlowgraph> flowgraph = std::make_shared<GNSSFlowgraph>(config, gr::msg_queue::make(0));
+    std::shared_ptr<GNSSFlowgraph> flowgraph = std::make_shared<GNSSFlowgraph>(config, std::make_shared<Concurrent_Queue<pmt::pmt_t>>());
 
     EXPECT_NO_THROW(flowgraph->connect());
     EXPECT_TRUE(flowgraph->connected());
@@ -103,7 +103,7 @@ TEST(GNSSFlowgraph /*unused*/, InstantiateConnectStartStop /*unused*/)
     config->set_property("Observables.implementation", "Hybrid_Observables");
     config->set_property("PVT.implementation", "RTKLIB_PVT");
 
-    std::shared_ptr<GNSSFlowgraph> flowgraph = std::make_shared<GNSSFlowgraph>(config, gr::msg_queue::make(0));
+    std::shared_ptr<GNSSFlowgraph> flowgraph = std::make_shared<GNSSFlowgraph>(config, std::make_shared<Concurrent_Queue<pmt::pmt_t>>());
 
     EXPECT_NO_THROW(flowgraph->connect());
     EXPECT_TRUE(flowgraph->connected());
@@ -137,7 +137,7 @@ TEST(GNSSFlowgraph /*unused*/, InstantiateConnectStartStopGalileoE1B /*unused*/)
     config->set_property("Observables.implementation", "Hybrid_Observables");
     config->set_property("PVT.implementation", "RTKLIB_PVT");
 
-    std::shared_ptr<GNSSFlowgraph> flowgraph = std::make_shared<GNSSFlowgraph>(config, gr::msg_queue::make(0));
+    std::shared_ptr<GNSSFlowgraph> flowgraph = std::make_shared<GNSSFlowgraph>(config, std::make_shared<Concurrent_Queue<pmt::pmt_t>>());
 
     EXPECT_NO_THROW(flowgraph->connect());
     EXPECT_TRUE(flowgraph->connected());
@@ -253,7 +253,7 @@ TEST(GNSSFlowgraph /*unused*/, InstantiateConnectStartStopHybrid /*unused*/)
     config->set_property("Observables.implementation", "Hybrid_Observables");
     config->set_property("PVT.implementation", "RTKLIB_PVT");
 
-    std::shared_ptr<GNSSFlowgraph> flowgraph = std::make_shared<GNSSFlowgraph>(config, gr::msg_queue::make(0));
+    std::shared_ptr<GNSSFlowgraph> flowgraph = std::make_shared<GNSSFlowgraph>(config, std::make_shared<Concurrent_Queue<pmt::pmt_t>>());
 
     EXPECT_NO_THROW(flowgraph->connect());
     EXPECT_TRUE(flowgraph->connected());
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc
index 8c9c87779..94f96e4a6 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc
@@ -51,6 +51,7 @@
 #include <gnuradio/blocks/interleaved_char_to_complex.h>
 #include <gnuradio/blocks/skiphead.h>
 #include <gnuradio/top_block.h>
+#include <pmt/pmt.h>
 #include <thread>
 #include <utility>
 
@@ -342,7 +343,7 @@ protected:
 
     Concurrent_Queue<int> channel_internal_queue;
 
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<AcquisitionInterface> acquisition;
     std::shared_ptr<InMemoryConfiguration> config;
@@ -598,7 +599,7 @@ int AcquisitionPerformanceTest::run_receiver()
     boost::shared_ptr<AcqPerfTest_msg_rx> msg_rx = AcqPerfTest_msg_rx_make(channel_internal_queue);
     gr::blocks::skiphead::sptr skiphead = gr::blocks::skiphead::make(sizeof(gr_complex), FLAGS_acq_test_skiphead);
 
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     gnss_synchro = Gnss_Synchro();
     init();
 
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc
index c2658889a..8278d3e42 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc
@@ -31,9 +31,10 @@
  */
 
 
+#include "beidou_b1i_pcps_acquisition.h"
 #include "Beidou_B1I.h"
 #include "acquisition_dump_reader.h"
-#include "beidou_b1i_pcps_acquisition.h"
+#include "concurrent_queue.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
@@ -46,9 +47,9 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <utility>
 
@@ -198,7 +199,7 @@ void BeidouB1iPcpsAcquisitionTest::plot_grid()
 
     std::vector<int> *doppler = &acq_dump.doppler;
     std::vector<unsigned int> *samples = &acq_dump.samples;
-    std::vector<std::vector<float> > *mag = &acq_dump.mag;
+    std::vector<std::vector<float>> *mag = &acq_dump.mag;
 
     const std::string gnuplot_executable(FLAGS_gnuplot_executable);
     if (gnuplot_executable.empty())
@@ -261,7 +262,7 @@ TEST_F(BeidouB1iPcpsAcquisitionTest, ConnectAndRun)
     int nsamples = 25000;
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     top_block = gr::make_top_block("Acquisition test");
     init();
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc
index 725135d5b..6415b44cc 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc
@@ -31,9 +31,10 @@
  */
 
 
+#include "beidou_b3i_pcps_acquisition.h"
 #include "Beidou_B3I.h"
 #include "acquisition_dump_reader.h"
-#include "beidou_b3i_pcps_acquisition.h"
+#include "concurrent_queue.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
@@ -46,9 +47,9 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <utility>
 
@@ -197,7 +198,7 @@ void BeidouB3iPcpsAcquisitionTest::plot_grid()
 
     std::vector<int> *doppler = &acq_dump.doppler;
     std::vector<unsigned int> *samples = &acq_dump.samples;
-    std::vector<std::vector<float> > *mag = &acq_dump.mag;
+    std::vector<std::vector<float>> *mag = &acq_dump.mag;
 
     const std::string gnuplot_executable(FLAGS_gnuplot_executable);
     if (gnuplot_executable.empty())
@@ -260,7 +261,7 @@ TEST_F(BeidouB3iPcpsAcquisitionTest, ConnectAndRun)
     int nsamples = 50000;
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     top_block = gr::make_top_block("Acquisition test");
     init();
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc
index a1517dd8f..37c8396e0 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc
@@ -30,8 +30,9 @@
  */
 
 
-#include "fir_filter.h"
 #include "galileo_e1_pcps_8ms_ambiguous_acquisition.h"
+#include "concurrent_queue.h"
+#include "fir_filter.h"
 #include "gen_signal_source.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
@@ -43,8 +44,8 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <thread>
 #include <utility>
@@ -134,7 +135,7 @@ protected:
     void stop_queue();
 
     Concurrent_Queue<int> channel_internal_queue;
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GalileoE1Pcps8msAmbiguousAcquisition> acquisition;
     std::shared_ptr<GNSSBlockFactory> factory;
@@ -433,7 +434,7 @@ TEST_F(GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test, ConnectAndRun)
     std::chrono::duration<double> elapsed_seconds(0.0);
 
     config_1();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
 
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_8ms_Ambiguous_Acquisition", 1, 0);
@@ -483,7 +484,7 @@ TEST_F(GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test, ConnectAndRun)
 TEST_F(GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test, ValidationOfResults)
 {
     config_1();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
 
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_8ms_Ambiguous_Acquisition", 1, 0, queue);
@@ -572,7 +573,7 @@ TEST_F(GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test, ValidationOfResults)
 TEST_F(GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test, ValidationOfResultsProbabilities)
 {
     config_2();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_8ms_Ambiguous_Acquisition", 1, 0);
     acquisition = std::dynamic_pointer_cast<GalileoE1Pcps8msAmbiguousAcquisition>(acq_);
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc
index b9c692c4b..fc90be2ed 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc
@@ -31,8 +31,9 @@
  */
 
 
-#include "fir_filter.h"
 #include "galileo_e1_pcps_ambiguous_acquisition.h"
+#include "concurrent_queue.h"
+#include "fir_filter.h"
 #include "gen_signal_source.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
@@ -43,7 +44,6 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <chrono>
 #include <utility>
@@ -134,7 +134,7 @@ protected:
     void stop_queue();
 
     Concurrent_Queue<int> channel_internal_queue;
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GalileoE1PcpsAmbiguousAcquisition> acquisition;
     std::shared_ptr<GNSSBlockFactory> factory;
@@ -435,7 +435,7 @@ TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test, ConnectAndRun)
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     config_1();
 
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 0);
@@ -466,7 +466,7 @@ TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test, ValidationOfResults)
 {
     config_1();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 0);
     acquisition = std::dynamic_pointer_cast<GalileoE1PcpsAmbiguousAcquisition>(acq_);
     boost::shared_ptr<GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx> msg_rx = GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue);
@@ -551,7 +551,7 @@ TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test, ValidationOfResultsProbabi
 {
     config_2();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 0);
     acquisition = std::dynamic_pointer_cast<GalileoE1PcpsAmbiguousAcquisition>(acq_);
     boost::shared_ptr<GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx> msg_rx = GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue);
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc
index 591f7bf25..850367401 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc
@@ -42,6 +42,7 @@
 
 
 #include "galileo_e1_pcps_ambiguous_acquisition.h"
+#include "concurrent_queue.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
@@ -52,8 +53,8 @@
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
 #include <gnuradio/blocks/skiphead.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <utility>
 #ifdef GR_GREATER_38
@@ -140,7 +141,7 @@ protected:
     void stop_queue();
 
     Concurrent_Queue<int> channel_internal_queue;
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GNSSBlockFactory> factory;
     std::shared_ptr<InMemoryConfiguration> config;
@@ -217,7 +218,7 @@ TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoCTest, ConnectAndRun)
     int nsamples = 4 * fs_in;
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
 
     init();
@@ -248,7 +249,7 @@ TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoCTest, ValidationOfResults)
 {
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
 
     init();
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc
index 58fa9b8e6..7b4815f34 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc
@@ -31,9 +31,10 @@
  */
 
 
+#include "galileo_e1_pcps_ambiguous_acquisition.h"
 #include "Galileo_E1.h"
 #include "acquisition_dump_reader.h"
-#include "galileo_e1_pcps_ambiguous_acquisition.h"
+#include "concurrent_queue.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
@@ -47,9 +48,9 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <utility>
 
@@ -200,7 +201,7 @@ void GalileoE1PcpsAmbiguousAcquisitionTest::plot_grid()
 
     std::vector<int>* doppler = &acq_dump.doppler;
     std::vector<unsigned int>* samples = &acq_dump.samples;
-    std::vector<std::vector<float> >* mag = &acq_dump.mag;
+    std::vector<std::vector<float>>* mag = &acq_dump.mag;
 
     const std::string gnuplot_executable(FLAGS_gnuplot_executable);
     if (gnuplot_executable.empty())
@@ -265,7 +266,7 @@ TEST_F(GalileoE1PcpsAmbiguousAcquisitionTest, ConnectAndRun)
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
     top_block = gr::make_top_block("Acquisition test");
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     init();
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 0);
     std::shared_ptr<AcquisitionInterface> acquisition = std::dynamic_pointer_cast<AcquisitionInterface>(acq_);
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc
index 60d23b6ba..d69972648 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc
@@ -31,8 +31,9 @@
  */
 
 
-#include "fir_filter.h"
 #include "galileo_e1_pcps_cccwsr_ambiguous_acquisition.h"
+#include "concurrent_queue.h"
+#include "fir_filter.h"
 #include "gen_signal_source.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
@@ -44,8 +45,8 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <thread>
 #include <utility>
@@ -135,7 +136,7 @@ protected:
     void stop_queue();
 
     Concurrent_Queue<int> channel_internal_queue;
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GalileoE1PcpsCccwsrAmbiguousAcquisition> acquisition;
     std::shared_ptr<GNSSBlockFactory> factory;
@@ -438,7 +439,7 @@ TEST_F(GalileoE1PcpsCccwsrAmbiguousAcquisitionTest, ConnectAndRun)
 
     config_1();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition", 1, 0);
     acquisition = std::dynamic_pointer_cast<GalileoE1PcpsCccwsrAmbiguousAcquisition>(acq_);
@@ -468,7 +469,7 @@ TEST_F(GalileoE1PcpsCccwsrAmbiguousAcquisitionTest, ValidationOfResults)
 {
     config_1();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition", 1, 0);
     acquisition = std::dynamic_pointer_cast<GalileoE1PcpsCccwsrAmbiguousAcquisition>(acq_);
     boost::shared_ptr<GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx> msg_rx = GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_make(channel_internal_queue);
@@ -561,7 +562,7 @@ TEST_F(GalileoE1PcpsCccwsrAmbiguousAcquisitionTest, ValidationOfResultsProbabili
 {
     config_2();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition", 1, 0);
     acquisition = std::dynamic_pointer_cast<GalileoE1PcpsCccwsrAmbiguousAcquisition>(acq_);
     boost::shared_ptr<GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx> msg_rx = GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_make(channel_internal_queue);
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc
index 8c06a3419..45287515c 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc
@@ -31,8 +31,8 @@
  */
 
 
-#include "fir_filter.h"
 #include "galileo_e1_pcps_quicksync_ambiguous_acquisition.h"
+#include "fir_filter.h"
 #include "gen_signal_source.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
@@ -46,6 +46,7 @@
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
 #include <gnuradio/top_block.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <fstream>
 #include <stdexcept>
@@ -142,7 +143,7 @@ protected:
     void stop_queue();
 
     Concurrent_Queue<int> channel_internal_queue;
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GalileoE1PcpsQuickSyncAmbiguousAcquisition> acquisition;
     std::shared_ptr<GNSSBlockFactory> factory;
@@ -560,7 +561,7 @@ TEST_F(GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test, ConnectAndRun)
     std::chrono::time_point<std::chrono::system_clock> begin, end;
     std::chrono::duration<double> elapsed_seconds(0);
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     config_1();
 
@@ -597,7 +598,7 @@ TEST_F(GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test, ValidationOfResul
     LOG(INFO) << "Start validation of results test";
     config_1();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition", 1, 0);
     acquisition = std::dynamic_pointer_cast<GalileoE1PcpsQuickSyncAmbiguousAcquisition>(acq_);
@@ -688,7 +689,7 @@ TEST_F(GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test, ValidationOfResul
     LOG(INFO) << "Start validation of results with noise+interference test";
     config_3();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition", 1, 0);
     acquisition = std::dynamic_pointer_cast<GalileoE1PcpsQuickSyncAmbiguousAcquisition>(acq_);
@@ -776,7 +777,7 @@ TEST_F(GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test, ValidationOfResul
 {
     config_2();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition", 1, 0);
     acquisition = std::dynamic_pointer_cast<GalileoE1PcpsQuickSyncAmbiguousAcquisition>(acq_);
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc
index a021e5196..d7c414fcf 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc
@@ -30,9 +30,10 @@
  * -------------------------------------------------------------------------
  */
 
+#include "galileo_e1_pcps_tong_ambiguous_acquisition.h"
+#include "concurrent_queue.h"
 #include "configuration_interface.h"
 #include "fir_filter.h"
-#include "galileo_e1_pcps_tong_ambiguous_acquisition.h"
 #include "gen_signal_source.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
@@ -44,9 +45,9 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <thread>
 #include <utility>
@@ -135,7 +136,7 @@ protected:
     void stop_queue();
 
     Concurrent_Queue<int> channel_internal_queue;
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GalileoE1PcpsTongAmbiguousAcquisition> acquisition;
     std::shared_ptr<GNSSBlockFactory> factory;
@@ -438,7 +439,7 @@ TEST_F(GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test, ConnectAndRun)
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0.0);
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     config_1();
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Tong_Ambiguous_Acquisition", 1, 0);
     acquisition = std::dynamic_pointer_cast<GalileoE1PcpsTongAmbiguousAcquisition>(acq_);
@@ -466,7 +467,7 @@ TEST_F(GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test, ValidationOfResults)
 {
     config_1();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Tong_Ambiguous_Acquisition", 1, 0);
     acquisition = std::dynamic_pointer_cast<GalileoE1PcpsTongAmbiguousAcquisition>(acq_);
     boost::shared_ptr<GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx> msg_rx = GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue);
@@ -555,7 +556,7 @@ TEST_F(GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test, ValidationOfResultsPro
 {
     config_2();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     std::shared_ptr<GNSSBlockInterface> acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Tong_Ambiguous_Acquisition", 1, 0);
     acquisition = std::dynamic_pointer_cast<GalileoE1PcpsTongAmbiguousAcquisition>(acq_);
     boost::shared_ptr<GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx> msg_rx = GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue);
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc
index 652384472..cdf5ca0c0 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc
@@ -29,6 +29,7 @@
  * -------------------------------------------------------------------------
  */
 
+#include "concurrent_queue.h"
 #include "fir_filter.h"
 #include "galileo_e5a_noncoherent_iq_acquisition_caf.h"
 #include "gen_signal_source.h"
@@ -42,8 +43,8 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <utility>
 #ifdef GR_GREATER_38
@@ -131,7 +132,7 @@ protected:
     void stop_queue();
 
     Concurrent_Queue<int> channel_internal_queue;
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GalileoE5aNoncoherentIQAcquisitionCaf> acquisition;
 
@@ -540,7 +541,7 @@ TEST_F(GalileoE5aPcpsAcquisitionGSoC2014GensourceTest, ConnectAndRun)
     std::chrono::duration<double> elapsed_seconds(0);
     acquisition = std::make_shared<GalileoE5aNoncoherentIQAcquisitionCaf>(config.get(), "Acquisition_5X", 1, 0);
     boost::shared_ptr<GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx> msg_rx = GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx_make(channel_internal_queue);
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
 
     ASSERT_NO_THROW({
@@ -566,7 +567,7 @@ TEST_F(GalileoE5aPcpsAcquisitionGSoC2014GensourceTest, ConnectAndRun)
 TEST_F(GalileoE5aPcpsAcquisitionGSoC2014GensourceTest, ValidationOfSIM)
 {
     config_1();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
     acquisition = std::make_shared<GalileoE5aNoncoherentIQAcquisitionCaf>(config.get(), "Acquisition_5X", 1, 0);
     boost::shared_ptr<GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx> msg_rx = GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx_make(channel_internal_queue);
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_gsoc2017_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_gsoc2017_test.cc
index dbee4f413..6972e356b 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_gsoc2017_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_gsoc2017_test.cc
@@ -31,10 +31,11 @@
  */
 
 
+#include "glonass_l1_ca_pcps_acquisition.h"
+#include "concurrent_queue.h"
 #include "configuration_interface.h"
 #include "freq_xlating_fir_filter.h"
 #include "gen_signal_source.h"
-#include "glonass_l1_ca_pcps_acquisition.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
 #include "gnss_synchro.h"
@@ -46,9 +47,9 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <thread>
 #include <utility>
@@ -140,7 +141,7 @@ protected:
 
     Concurrent_Queue<int> channel_internal_queue;
 
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     GlonassL1CaPcpsAcquisition* acquisition;
     std::shared_ptr<InMemoryConfiguration> config;
@@ -442,7 +443,7 @@ TEST_F(GlonassL1CaPcpsAcquisitionGSoC2017Test, ConnectAndRun)
     int nsamples = floor(fs_in * integration_time_ms * 1e-3);
     std::chrono::time_point<std::chrono::system_clock> begin, end;
     std::chrono::duration<double> elapsed_seconds(0);
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
 
     config_1();
@@ -474,7 +475,7 @@ TEST_F(GlonassL1CaPcpsAcquisitionGSoC2017Test, ConnectAndRun)
 TEST_F(GlonassL1CaPcpsAcquisitionGSoC2017Test, ValidationOfResults)
 {
     config_1();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
 
     acquisition = new GlonassL1CaPcpsAcquisition(config.get(), "Acquisition", 1, 0);
@@ -563,7 +564,7 @@ TEST_F(GlonassL1CaPcpsAcquisitionGSoC2017Test, ValidationOfResults)
 TEST_F(GlonassL1CaPcpsAcquisitionGSoC2017Test, ValidationOfResultsProbabilities)
 {
     config_2();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
     acquisition = new GlonassL1CaPcpsAcquisition(config.get(), "Acquisition", 1, 0);
     boost::shared_ptr<GlonassL1CaPcpsAcquisitionGSoC2017Test_msg_rx> msg_rx = GlonassL1CaPcpsAcquisitionGSoC2017Test_msg_rx_make(channel_internal_queue);
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc
index 86602ec9c..e339018a4 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc
@@ -30,8 +30,9 @@
  * -------------------------------------------------------------------------
  */
 
-#include "freq_xlating_fir_filter.h"
 #include "glonass_l1_ca_pcps_acquisition.h"
+#include "concurrent_queue.h"
+#include "freq_xlating_fir_filter.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
@@ -41,9 +42,9 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <cstdlib>
 #include <utility>
@@ -184,7 +185,7 @@ TEST_F(GlonassL1CaPcpsAcquisitionTest, ConnectAndRun)
     int nsamples = 62314;
     std::chrono::time_point<std::chrono::system_clock> begin, end;
     std::chrono::duration<double> elapsed_seconds(0);
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     top_block = gr::make_top_block("Acquisition test");
     init();
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc
index ba0611f90..1086d3119 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc
@@ -30,10 +30,11 @@
  */
 
 
+#include "glonass_l2_ca_pcps_acquisition.h"
+#include "concurrent_queue.h"
 #include "configuration_interface.h"
 #include "fir_filter.h"
 #include "gen_signal_source.h"
-#include "glonass_l2_ca_pcps_acquisition.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
 #include "gnss_synchro.h"
@@ -45,9 +46,9 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <thread>
 #ifdef GR_GREATER_38
@@ -140,9 +141,9 @@ protected:
     void process_message();
     void stop_queue();
 
-    concurrent_queue<int> channel_internal_queue;
+    Concurrent_Queue<int> channel_internal_queue;
 
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     GlonassL2CaPcpsAcquisition* acquisition;
     std::shared_ptr<InMemoryConfiguration> config;
@@ -440,7 +441,7 @@ TEST_F(GlonassL2CaPcpsAcquisitionTest, ConnectAndRun)
     int nsamples = floor(fs_in * integration_time_ms * 1e-3);
     std::chrono::time_point<std::chrono::system_clock> begin, end;
     std::chrono::duration<double> elapsed_seconds(0);
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
 
     config_1();
@@ -472,7 +473,7 @@ TEST_F(GlonassL2CaPcpsAcquisitionTest, ConnectAndRun)
 TEST_F(GlonassL2CaPcpsAcquisitionTest, ValidationOfResults)
 {
     config_1();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
 
     acquisition = new GlonassL2CaPcpsAcquisition(config.get(), "Acquisition_2G", 1, 0);
@@ -562,7 +563,7 @@ TEST_F(GlonassL2CaPcpsAcquisitionTest, ValidationOfResults)
 TEST_F(GlonassL2CaPcpsAcquisitionTest, ValidationOfResultsProbabilities)
 {
     config_2();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
     acquisition = new GlonassL2CaPcpsAcquisition(config.get(), "Acquisition_2G", 1, 0);
     boost::shared_ptr<GlonassL2CaPcpsAcquisitionTest_msg_rx> msg_rx = GlonassL2CaPcpsAcquisitionTest_msg_rx_make(channel_internal_queue);
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_gsoc2013_test.cc
index e4ef9974b..b6223065b 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_gsoc2013_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_gsoc2013_test.cc
@@ -31,13 +31,14 @@
  */
 
 
+#include "gps_l1_ca_pcps_acquisition.h"
+#include "concurrent_queue.h"
 #include "configuration_interface.h"
 #include "fir_filter.h"
 #include "gen_signal_source.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
 #include "gnss_synchro.h"
-#include "gps_l1_ca_pcps_acquisition.h"
 #include "in_memory_configuration.h"
 #include "pass_through.h"
 #include "signal_generator.h"
@@ -46,9 +47,9 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <thread>
 #include <utility>
@@ -140,7 +141,7 @@ protected:
 
     Concurrent_Queue<int> channel_internal_queue;
 
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     GpsL1CaPcpsAcquisition* acquisition;
     std::shared_ptr<InMemoryConfiguration> config;
@@ -435,7 +436,7 @@ TEST_F(GpsL1CaPcpsAcquisitionGSoC2013Test, ConnectAndRun)
     int nsamples = floor(fs_in * integration_time_ms * 1e-3);
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
 
     config_1();
@@ -467,7 +468,7 @@ TEST_F(GpsL1CaPcpsAcquisitionGSoC2013Test, ConnectAndRun)
 TEST_F(GpsL1CaPcpsAcquisitionGSoC2013Test, ValidationOfResults)
 {
     config_1();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
 
     acquisition = new GpsL1CaPcpsAcquisition(config.get(), "Acquisition_1C", 1, 0);
@@ -557,7 +558,7 @@ TEST_F(GpsL1CaPcpsAcquisitionGSoC2013Test, ValidationOfResults)
 TEST_F(GpsL1CaPcpsAcquisitionGSoC2013Test, ValidationOfResultsProbabilities)
 {
     config_2();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
     acquisition = new GpsL1CaPcpsAcquisition(config.get(), "Acquisition_1C", 1, 0);
     boost::shared_ptr<GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx> msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue);
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc
index 0ec417ee0..541a2a3b8 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc
@@ -31,14 +31,15 @@
  */
 
 
+#include "gps_l1_ca_pcps_acquisition.h"
 #include "GPS_L1_CA.h"
 #include "acquisition_dump_reader.h"
+#include "concurrent_queue.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
 #include "gnss_synchro.h"
 #include "gnuplot_i.h"
-#include "gps_l1_ca_pcps_acquisition.h"
 #include "in_memory_configuration.h"
 #include "test_flags.h"
 #include <boost/make_shared.hpp>
@@ -46,7 +47,6 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
 #include <chrono>
@@ -199,7 +199,7 @@ void GpsL1CaPcpsAcquisitionTest::plot_grid()
 
     std::vector<int> *doppler = &acq_dump.doppler;
     std::vector<unsigned int> *samples = &acq_dump.samples;
-    std::vector<std::vector<float> > *mag = &acq_dump.mag;
+    std::vector<std::vector<float>> *mag = &acq_dump.mag;
 
     const std::string gnuplot_executable(FLAGS_gnuplot_executable);
     if (gnuplot_executable.empty())
@@ -262,7 +262,7 @@ TEST_F(GpsL1CaPcpsAcquisitionTest, ConnectAndRun)
     int nsamples = 4000;
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     top_block = gr::make_top_block("Acquisition test");
     init();
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test_fpga.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test_fpga.cc
index 58dd36719..dcc07a9e5 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test_fpga.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test_fpga.cc
@@ -41,7 +41,7 @@
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
 #include <gnuradio/blocks/throttle.h>
-#include <gnuradio/msg_queue.h>
+#include "concurrent_queue.h"
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
 #include <chrono>
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc
index 702b89f31..5a6bb87aa 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc
@@ -31,13 +31,14 @@
  */
 
 
+#include "gps_l1_ca_pcps_opencl_acquisition.h"
+#include "concurrent_queue.h"
 #include "configuration_interface.h"
 #include "fir_filter.h"
 #include "gen_signal_source.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
 #include "gnss_synchro.h"
-#include "gps_l1_ca_pcps_opencl_acquisition.h"
 #include "in_memory_configuration.h"
 #include "signal_generator.h"
 #include "signal_generator_c.h"
@@ -45,7 +46,6 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <chrono>
 #include <thread>
@@ -118,7 +118,7 @@ class GpsL1CaPcpsOpenClAcquisitionGSoC2013Test : public ::testing::Test
 protected:
     GpsL1CaPcpsOpenClAcquisitionGSoC2013Test()
     {
-        queue = gr::msg_queue::make(0);
+        queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
         top_block = gr::make_top_block("Acquisition test");
         item_size = sizeof(gr_complex);
         stop = false;
@@ -140,7 +140,7 @@ protected:
     void stop_queue();
 
     Concurrent_Queue<int> channel_internal_queue;
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GpsL1CaPcpsOpenClAcquisition> acquisition;
     std::shared_ptr<InMemoryConfiguration> config;
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc
index 7dfcc5ea1..3f471fa44 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc
@@ -31,11 +31,12 @@
  */
 
 
+#include "gps_l1_ca_pcps_quicksync_acquisition.h"
+#include "concurrent_queue.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
 #include "gnss_synchro.h"
-#include "gps_l1_ca_pcps_quicksync_acquisition.h"
 #include "in_memory_configuration.h"
 #include "signal_generator.h"
 #include "signal_generator_c.h"
@@ -43,7 +44,6 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
 #include <chrono>
@@ -141,7 +141,7 @@ protected:
     void stop_queue();
 
     Concurrent_Queue<int> channel_internal_queue;
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GNSSBlockFactory> factory;
     std::shared_ptr<GpsL1CaPcpsQuickSyncAcquisition> acquisition;
@@ -545,7 +545,7 @@ TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ConnectAndRun)
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0.0);
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     boost::shared_ptr<GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx> msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue);
 
     config_1();
@@ -575,7 +575,7 @@ TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ValidationOfResults)
 {
     config_1();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     acquisition = std::make_shared<GpsL1CaPcpsQuickSyncAcquisition>(config.get(), "Acquisition_1C", 1, 0);
     boost::shared_ptr<GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx> msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue);
 
@@ -669,7 +669,7 @@ TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ValidationOfResultsWithNoise
     //config_3();
     config_1();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     acquisition = std::make_shared<GpsL1CaPcpsQuickSyncAcquisition>(config.get(), "Acquisition_1C", 1, 0);
     boost::shared_ptr<GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx> msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue);
 
@@ -760,7 +760,7 @@ TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ValidationOfResultsProbabili
 {
     config_2();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     acquisition = std::make_shared<GpsL1CaPcpsQuickSyncAcquisition>(config.get(), "Acquisition_1C", 1, 0);
     boost::shared_ptr<GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx> msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue);
 
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc
index b5977ff39..fd1a57464 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc
@@ -31,13 +31,14 @@
  */
 
 
+#include "gps_l1_ca_pcps_tong_acquisition.h"
+#include "concurrent_queue.h"
 #include "configuration_interface.h"
 #include "fir_filter.h"
 #include "gen_signal_source.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
 #include "gnss_synchro.h"
-#include "gps_l1_ca_pcps_tong_acquisition.h"
 #include "in_memory_configuration.h"
 #include "signal_generator.h"
 #include "signal_generator_c.h"
@@ -45,7 +46,6 @@
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
 #include <chrono>
@@ -135,7 +135,7 @@ protected:
     void stop_queue();
 
     Concurrent_Queue<int> channel_internal_queue;
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GpsL1CaPcpsTongAcquisition> acquisition;
     std::shared_ptr<InMemoryConfiguration> config;
@@ -431,7 +431,7 @@ TEST_F(GpsL1CaPcpsTongAcquisitionGSoC2013Test, ConnectAndRun)
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     config_1();
     acquisition = std::make_shared<GpsL1CaPcpsTongAcquisition>(config.get(), "Acquisition_1C", 1, 0);
@@ -461,7 +461,7 @@ TEST_F(GpsL1CaPcpsTongAcquisitionGSoC2013Test, ValidationOfResults)
 {
     config_1();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     acquisition = std::make_shared<GpsL1CaPcpsTongAcquisition>(config.get(), "Acquisition_1C", 1, 0);
     boost::shared_ptr<GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx> msg_rx = GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue);
@@ -550,7 +550,7 @@ TEST_F(GpsL1CaPcpsTongAcquisitionGSoC2013Test, ValidationOfResultsProbabilities)
 {
     config_2();
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     acquisition = std::make_shared<GpsL1CaPcpsTongAcquisition>(config.get(), "Acquisition_1C", 1, 0);
     boost::shared_ptr<GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx> msg_rx = GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue);
 
diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc
index de7bc4e27..d810a3a12 100644
--- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc
@@ -31,14 +31,15 @@
  */
 
 
+#include "gps_l2_m_pcps_acquisition.h"
 #include "GPS_L2C.h"
 #include "acquisition_dump_reader.h"
+#include "concurrent_queue.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
 #include "gnss_synchro.h"
 #include "gnuplot_i.h"
-#include "gps_l2_m_pcps_acquisition.h"
 #include "in_memory_configuration.h"
 #include "test_flags.h"
 #include <boost/make_shared.hpp>
@@ -47,7 +48,6 @@
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/interleaved_short_to_complex.h>
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
 #include <chrono>
@@ -143,7 +143,7 @@ protected:
     void init();
     void plot_grid();
 
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GNSSBlockFactory> factory;
     std::shared_ptr<InMemoryConfiguration> config;
@@ -202,7 +202,7 @@ void GpsL2MPcpsAcquisitionTest::plot_grid()
 
     std::vector<int> *doppler = &acq_dump.doppler;
     std::vector<unsigned int> *samples = &acq_dump.samples;
-    std::vector<std::vector<float> > *mag = &acq_dump.mag;
+    std::vector<std::vector<float>> *mag = &acq_dump.mag;
 
     const std::string gnuplot_executable(FLAGS_gnuplot_executable);
     if (gnuplot_executable.empty())
@@ -255,7 +255,7 @@ void GpsL2MPcpsAcquisitionTest::plot_grid()
 TEST_F(GpsL2MPcpsAcquisitionTest, Instantiate)
 {
     init();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     std::shared_ptr<GpsL2MPcpsAcquisition> acquisition = std::make_shared<GpsL2MPcpsAcquisition>(config.get(), "Acquisition_2S", 1, 0);
 }
 
@@ -265,7 +265,7 @@ TEST_F(GpsL2MPcpsAcquisitionTest, ConnectAndRun)
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     init();
     std::shared_ptr<GpsL2MPcpsAcquisition> acquisition = std::make_shared<GpsL2MPcpsAcquisition>(config.get(), "Acquisition_2S", 1, 0);
@@ -295,7 +295,7 @@ TEST_F(GpsL2MPcpsAcquisitionTest, ValidationOfResults)
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
     top_block = gr::make_top_block("Acquisition test");
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     double expected_delay_samples = 1;  //2004;
     double expected_doppler_hz = 1200;  //3000;
 
diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc
index 03d055fac..32173ef44 100644
--- a/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc
@@ -39,6 +39,7 @@
 #else
 #include <gnuradio/analog/sig_source_c.h>
 #endif
+#include "concurrent_queue.h"
 #include "file_signal_source.h"
 #include "fir_filter.h"
 #include "gnss_block_factory.h"
@@ -48,7 +49,6 @@
 #include "interleaved_byte_to_complex_byte.h"
 #include "interleaved_short_to_complex_short.h"
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gtest/gtest.h>
 
 
@@ -59,7 +59,7 @@ class FirFilterTest : public ::testing::Test
 protected:
     FirFilterTest()
     {
-        queue = gr::msg_queue::make(0);
+        queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
         item_size = sizeof(gr_complex);
         config = std::make_shared<InMemoryConfiguration>();
     }
@@ -70,7 +70,7 @@ protected:
     void configure_cbyte_gr_complex();
     void configure_gr_complex_gr_complex();
     void configure_cshort_cshort();
-    boost::shared_ptr<gr::msg_queue> queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<InMemoryConfiguration> config;
     size_t item_size;
diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc
index 69c1dddf9..6aa42dafd 100644
--- a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc
@@ -39,6 +39,7 @@
 #else
 #include <gnuradio/analog/sig_source_c.h>
 #endif
+#include "concurrent_queue.h"
 #include "file_signal_source.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
@@ -46,7 +47,6 @@
 #include "in_memory_configuration.h"
 #include "notch_filter_lite.h"
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gtest/gtest.h>
 
 
@@ -57,7 +57,7 @@ class NotchFilterLiteTest : public ::testing::Test
 protected:
     NotchFilterLiteTest()
     {
-        queue = gr::msg_queue::make(0);
+        queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
         item_size = sizeof(gr_complex);
         config = std::make_shared<InMemoryConfiguration>();
         nsamples = FLAGS_notch_filter_lite_test_nsamples;
@@ -66,7 +66,7 @@ protected:
 
     void init();
     void configure_gr_complex_gr_complex();
-    boost::shared_ptr<gr::msg_queue> queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<InMemoryConfiguration> config;
     size_t item_size;
diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc
index 8fb783b5f..c20c894c6 100644
--- a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc
@@ -39,6 +39,7 @@
 #else
 #include <gnuradio/analog/sig_source_c.h>
 #endif
+#include "concurrent_queue.h"
 #include "file_signal_source.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
@@ -46,7 +47,6 @@
 #include "in_memory_configuration.h"
 #include "notch_filter.h"
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gtest/gtest.h>
 
 
@@ -57,7 +57,7 @@ class NotchFilterTest : public ::testing::Test
 protected:
     NotchFilterTest()
     {
-        queue = gr::msg_queue::make(0);
+        queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
         item_size = sizeof(gr_complex);
         config = std::make_shared<InMemoryConfiguration>();
         nsamples = FLAGS_notch_filter_test_nsamples;
@@ -66,7 +66,7 @@ protected:
 
     void init();
     void configure_gr_complex_gr_complex();
-    boost::shared_ptr<gr::msg_queue> queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<InMemoryConfiguration> config;
     size_t item_size;
diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc
index d31b971fb..dab090737 100644
--- a/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc
@@ -39,6 +39,7 @@
 #else
 #include <gnuradio/analog/sig_source_c.h>
 #endif
+#include "concurrent_queue.h"
 #include "file_signal_source.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
@@ -46,7 +47,6 @@
 #include "in_memory_configuration.h"
 #include "pulse_blanking_filter.h"
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 #include <gtest/gtest.h>
 
 
@@ -57,7 +57,7 @@ class PulseBlankingFilterTest : public ::testing::Test
 protected:
     PulseBlankingFilterTest()
     {
-        queue = gr::msg_queue::make(0);
+        queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
         item_size = sizeof(gr_complex);
         config = std::make_shared<InMemoryConfiguration>();
         nsamples = FLAGS_pb_filter_test_nsamples;
@@ -66,7 +66,7 @@ protected:
 
     void init();
     void configure_gr_complex_gr_complex();
-    boost::shared_ptr<gr::msg_queue> queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<InMemoryConfiguration> config;
     size_t item_size;
diff --git a/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc b/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc
index 497805de7..0e7774842 100644
--- a/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc
@@ -30,6 +30,7 @@
  * -------------------------------------------------------------------------
  */
 
+#include "hybrid_observables.h"
 #include "GPS_L1_CA.h"
 #include "GPS_L2C.h"
 #include "GPS_L5.h"
@@ -51,7 +52,6 @@
 #include "gps_l1_ca_pcps_acquisition.h"
 #include "gps_l2_m_pcps_acquisition.h"
 #include "gps_l5i_pcps_acquisition.h"
-#include "hybrid_observables.h"
 #include "in_memory_configuration.h"
 #include "observable_tests_flags.h"
 #include "observables_dump_reader.h"
@@ -707,9 +707,9 @@ void HybridObservablesTest::configure_receiver(
             std::memcpy(static_cast<void*>(gnss_synchro_master.Signal), str, 3);  // copy string into synchro char array: 2 char + null
 
             config->set_property("Tracking.early_late_space_chips", "0.15");
-            config->set_property("Tracking.very_early_late_space_chips", "0.6");
+            config->set_property("Tracking.very_early_late_space_chips", "0.5");
             config->set_property("Tracking.early_late_space_narrow_chips", "0.15");
-            config->set_property("Tracking.very_early_late_space_narrow_chips", "0.6");
+            config->set_property("Tracking.very_early_late_space_narrow_chips", "0.5");
             config->set_property("Tracking.track_pilot", "true");
 
             config->set_property("TelemetryDecoder.implementation", "Galileo_E1B_Telemetry_Decoder");
@@ -741,7 +741,8 @@ void HybridObservablesTest::configure_receiver(
                 }
             config->set_property("Tracking.early_late_space_chips", "0.5");
             config->set_property("Tracking.track_pilot", "true");
-            config->set_property("Tracking.order", "2");
+            config->set_property("Tracking.pll_filter_order", "2");
+            config->set_property("Tracking.dll_filter_order", "2");
 
             config->set_property("TelemetryDecoder.implementation", "Galileo_E5a_Telemetry_Decoder");
         }
@@ -755,7 +756,8 @@ void HybridObservablesTest::configure_receiver(
 
             config->set_property("Tracking.early_late_space_chips", "0.5");
             config->set_property("Tracking.track_pilot", "true");
-            config->set_property("Tracking.order", "2");
+            config->set_property("Tracking.pll_filter_order", "2");
+            config->set_property("Tracking.dll_filter_order", "2");
 
             config->set_property("TelemetryDecoder.implementation", "GPS_L5_Telemetry_Decoder");
         }
@@ -875,78 +877,81 @@ void HybridObservablesTest::check_results_carrier_phase_double_diff(
     int size2 = measured_ch1.col(0).n_rows;
     double t1 = std::min(measured_ch0(size1 - 1, 0), measured_ch1(size2 - 1, 0));
 
-    arma::vec t = arma::linspace<arma::vec>(t0, t1, floor((t1 - t0) * 1e3));
-    //conversion between arma::vec and std:vector
-    arma::vec t_from_start = arma::linspace<arma::vec>(0, t1 - t0, floor((t1 - t0) * 1e3));
-    std::vector<double> time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows);
-
-
-    arma::vec true_ch0_carrier_phase_interp;
-    arma::vec true_ch1_carrier_phase_interp;
-    arma::interp1(true_tow_ch0_s, true_ch0.col(3), t, true_ch0_carrier_phase_interp);
-    arma::interp1(true_tow_ch1_s, true_ch1.col(3), t, true_ch1_carrier_phase_interp);
-
-    arma::vec meas_ch0_carrier_phase_interp;
-    arma::vec meas_ch1_carrier_phase_interp;
-    arma::interp1(measured_ch0.col(0), measured_ch0.col(3), t, meas_ch0_carrier_phase_interp);
-    arma::interp1(measured_ch1.col(0), measured_ch1.col(3), t, meas_ch1_carrier_phase_interp);
-
-    // generate double difference accumulated carrier phases
-    //compute error without the accumulated carrier phase offsets (which depends on the receiver starting time)
-    arma::vec delta_true_carrier_phase_cycles = (true_ch0_carrier_phase_interp - true_ch0_carrier_phase_interp(0)) - (true_ch1_carrier_phase_interp - true_ch1_carrier_phase_interp(0));
-    arma::vec delta_measured_carrier_phase_cycles = (meas_ch0_carrier_phase_interp - meas_ch0_carrier_phase_interp(0)) - (meas_ch1_carrier_phase_interp - meas_ch1_carrier_phase_interp(0));
-
-    //2. RMSE
-    arma::vec err;
-
-    err = delta_measured_carrier_phase_cycles - delta_true_carrier_phase_cycles;
-    arma::vec err2 = arma::square(err);
-    double rmse = sqrt(arma::mean(err2));
-
-    //3. Mean err and variance
-    double error_mean = arma::mean(err);
-    double error_var = arma::var(err);
-
-    // 4. Peaks
-    double max_error = arma::max(err);
-    double min_error = arma::min(err);
-
-    //5. report
-    std::streamsize ss = std::cout.precision();
-    std::cout << std::setprecision(10) << data_title << "Double diff Carrier Phase RMSE = "
-              << rmse << ", mean = " << error_mean
-              << ", stdev = " << sqrt(error_var)
-              << " (max,min) = " << max_error
-              << "," << min_error
-              << " [Cycles]" << std::endl;
-    std::cout.precision(ss);
-
-    //plots
-    if (FLAGS_show_plots)
+    if ((t1 - t0) > 0)
         {
-            Gnuplot g3("linespoints");
-            g3.set_title(data_title + "Double diff Carrier Phase error [Cycles]");
-            g3.set_grid();
-            g3.set_xlabel("Time [s]");
-            g3.set_ylabel("Double diff Carrier Phase error [Cycles]");
+            arma::vec t = arma::linspace<arma::vec>(t0, t1, floor((t1 - t0) * 1e3));
             //conversion between arma::vec and std:vector
-            std::vector<double> range_error_m(err.colptr(0), err.colptr(0) + err.n_rows);
-            g3.cmd("set key box opaque");
-            g3.plot_xy(time_vector, range_error_m,
-                "Double diff Carrier Phase error");
-            g3.set_legend();
-            g3.savetops(data_title + "double_diff_carrier_phase_error");
+            arma::vec t_from_start = arma::linspace<arma::vec>(0, t1 - t0, floor((t1 - t0) * 1e3));
+            std::vector<double> time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows);
 
-            g3.showonscreen();  // window output
+
+            arma::vec true_ch0_carrier_phase_interp;
+            arma::vec true_ch1_carrier_phase_interp;
+            arma::interp1(true_tow_ch0_s, true_ch0.col(3), t, true_ch0_carrier_phase_interp);
+            arma::interp1(true_tow_ch1_s, true_ch1.col(3), t, true_ch1_carrier_phase_interp);
+
+            arma::vec meas_ch0_carrier_phase_interp;
+            arma::vec meas_ch1_carrier_phase_interp;
+            arma::interp1(measured_ch0.col(0), measured_ch0.col(3), t, meas_ch0_carrier_phase_interp);
+            arma::interp1(measured_ch1.col(0), measured_ch1.col(3), t, meas_ch1_carrier_phase_interp);
+
+            // generate double difference accumulated carrier phases
+            //compute error without the accumulated carrier phase offsets (which depends on the receiver starting time)
+            arma::vec delta_true_carrier_phase_cycles = (true_ch0_carrier_phase_interp - true_ch0_carrier_phase_interp(0)) - (true_ch1_carrier_phase_interp - true_ch1_carrier_phase_interp(0));
+            arma::vec delta_measured_carrier_phase_cycles = (meas_ch0_carrier_phase_interp - meas_ch0_carrier_phase_interp(0)) - (meas_ch1_carrier_phase_interp - meas_ch1_carrier_phase_interp(0));
+
+            //2. RMSE
+            arma::vec err;
+
+            err = delta_measured_carrier_phase_cycles - delta_true_carrier_phase_cycles;
+            arma::vec err2 = arma::square(err);
+            double rmse = sqrt(arma::mean(err2));
+
+            //3. Mean err and variance
+            double error_mean = arma::mean(err);
+            double error_var = arma::var(err);
+
+            // 4. Peaks
+            double max_error = arma::max(err);
+            double min_error = arma::min(err);
+
+            //5. report
+            std::streamsize ss = std::cout.precision();
+            std::cout << std::setprecision(10) << data_title << "Double diff Carrier Phase RMSE = "
+                      << rmse << ", mean = " << error_mean
+                      << ", stdev = " << sqrt(error_var)
+                      << " (max,min) = " << max_error
+                      << "," << min_error
+                      << " [Cycles]" << std::endl;
+            std::cout.precision(ss);
+
+            //plots
+            if (FLAGS_show_plots)
+                {
+                    Gnuplot g3("linespoints");
+                    g3.set_title(data_title + "Double diff Carrier Phase error [Cycles]");
+                    g3.set_grid();
+                    g3.set_xlabel("Time [s]");
+                    g3.set_ylabel("Double diff Carrier Phase error [Cycles]");
+                    //conversion between arma::vec and std:vector
+                    std::vector<double> range_error_m(err.colptr(0), err.colptr(0) + err.n_rows);
+                    g3.cmd("set key box opaque");
+                    g3.plot_xy(time_vector, range_error_m,
+                        "Double diff Carrier Phase error");
+                    g3.set_legend();
+                    g3.savetops(data_title + "double_diff_carrier_phase_error");
+
+                    g3.showonscreen();  // window output
+                }
+
+            //check results against the test tolerance
+            ASSERT_LT(rmse, 0.25);
+            ASSERT_LT(error_mean, 0.2);
+            ASSERT_GT(error_mean, -0.2);
+            ASSERT_LT(error_var, 0.5);
+            ASSERT_LT(max_error, 0.5);
+            ASSERT_GT(min_error, -0.5);
         }
-
-    //check results against the test tolerance
-    ASSERT_LT(rmse, 0.25);
-    ASSERT_LT(error_mean, 0.2);
-    ASSERT_GT(error_mean, -0.2);
-    ASSERT_LT(error_var, 0.5);
-    ASSERT_LT(max_error, 0.5);
-    ASSERT_GT(min_error, -0.5);
 }
 
 
@@ -966,78 +971,81 @@ void HybridObservablesTest::check_results_carrier_doppler_double_diff(
     int size2 = measured_ch1.col(0).n_rows;
     double t1 = std::min(measured_ch0(size1 - 1, 0), measured_ch1(size2 - 1, 0));
 
-    arma::vec t = arma::linspace<arma::vec>(t0, t1, floor((t1 - t0) * 1e3));
-    //conversion between arma::vec and std:vector
-    arma::vec t_from_start = arma::linspace<arma::vec>(0, t1 - t0, floor((t1 - t0) * 1e3));
-    std::vector<double> time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows);
-
-
-    arma::vec true_ch0_carrier_doppler_interp;
-    arma::vec true_ch1_carrier_doppler_interp;
-    arma::interp1(true_tow_ch0_s, true_ch0.col(2), t, true_ch0_carrier_doppler_interp);
-    arma::interp1(true_tow_ch1_s, true_ch1.col(2), t, true_ch1_carrier_doppler_interp);
-
-    arma::vec meas_ch0_carrier_doppler_interp;
-    arma::vec meas_ch1_carrier_doppler_interp;
-    arma::interp1(measured_ch0.col(0), measured_ch0.col(2), t, meas_ch0_carrier_doppler_interp);
-    arma::interp1(measured_ch1.col(0), measured_ch1.col(2), t, meas_ch1_carrier_doppler_interp);
-
-    // generate double difference carrier Doppler
-    arma::vec delta_true_carrier_doppler_cycles = true_ch0_carrier_doppler_interp - true_ch1_carrier_doppler_interp;
-    arma::vec delta_measured_carrier_doppler_cycles = meas_ch0_carrier_doppler_interp - meas_ch1_carrier_doppler_interp;
-
-    //2. RMSE
-    arma::vec err;
-
-    err = delta_measured_carrier_doppler_cycles - delta_true_carrier_doppler_cycles;
-    arma::vec err2 = arma::square(err);
-    double rmse = sqrt(arma::mean(err2));
-
-    //3. Mean err and variance
-    double error_mean = arma::mean(err);
-    double error_var = arma::var(err);
-
-    // 4. Peaks
-    double max_error = arma::max(err);
-    double min_error = arma::min(err);
-
-    //5. report
-    std::streamsize ss = std::cout.precision();
-    std::cout << std::setprecision(10) << data_title << "Double diff Carrier Doppler RMSE = "
-              << rmse << ", mean = " << error_mean
-              << ", stdev = " << sqrt(error_var)
-              << " (max,min) = " << max_error
-              << "," << min_error
-              << " [Hz]" << std::endl;
-    std::cout.precision(ss);
-
-    //plots
-    if (FLAGS_show_plots)
+    if ((t1 - t0) > 0)
         {
-            Gnuplot g3("linespoints");
-            g3.set_title(data_title + "Double diff Carrier Doppler error [Hz]");
-            g3.set_grid();
-            g3.set_xlabel("Time [s]");
-            g3.set_ylabel("Double diff Carrier Doppler error [Hz]");
+            arma::vec t = arma::linspace<arma::vec>(t0, t1, floor((t1 - t0) * 1e3));
             //conversion between arma::vec and std:vector
-            std::vector<double> range_error_m(err.colptr(0), err.colptr(0) + err.n_rows);
-            g3.cmd("set key box opaque");
-            g3.plot_xy(time_vector, range_error_m,
-                "Double diff Carrier Doppler error");
-            g3.set_legend();
-            g3.savetops(data_title + "double_diff_carrier_doppler_error");
+            arma::vec t_from_start = arma::linspace<arma::vec>(0, t1 - t0, floor((t1 - t0) * 1e3));
+            std::vector<double> time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows);
 
-            g3.showonscreen();  // window output
+
+            arma::vec true_ch0_carrier_doppler_interp;
+            arma::vec true_ch1_carrier_doppler_interp;
+            arma::interp1(true_tow_ch0_s, true_ch0.col(2), t, true_ch0_carrier_doppler_interp);
+            arma::interp1(true_tow_ch1_s, true_ch1.col(2), t, true_ch1_carrier_doppler_interp);
+
+            arma::vec meas_ch0_carrier_doppler_interp;
+            arma::vec meas_ch1_carrier_doppler_interp;
+            arma::interp1(measured_ch0.col(0), measured_ch0.col(2), t, meas_ch0_carrier_doppler_interp);
+            arma::interp1(measured_ch1.col(0), measured_ch1.col(2), t, meas_ch1_carrier_doppler_interp);
+
+            // generate double difference carrier Doppler
+            arma::vec delta_true_carrier_doppler_cycles = true_ch0_carrier_doppler_interp - true_ch1_carrier_doppler_interp;
+            arma::vec delta_measured_carrier_doppler_cycles = meas_ch0_carrier_doppler_interp - meas_ch1_carrier_doppler_interp;
+
+            //2. RMSE
+            arma::vec err;
+
+            err = delta_measured_carrier_doppler_cycles - delta_true_carrier_doppler_cycles;
+            arma::vec err2 = arma::square(err);
+            double rmse = sqrt(arma::mean(err2));
+
+            //3. Mean err and variance
+            double error_mean = arma::mean(err);
+            double error_var = arma::var(err);
+
+            // 4. Peaks
+            double max_error = arma::max(err);
+            double min_error = arma::min(err);
+
+            //5. report
+            std::streamsize ss = std::cout.precision();
+            std::cout << std::setprecision(10) << data_title << "Double diff Carrier Doppler RMSE = "
+                      << rmse << ", mean = " << error_mean
+                      << ", stdev = " << sqrt(error_var)
+                      << " (max,min) = " << max_error
+                      << "," << min_error
+                      << " [Hz]" << std::endl;
+            std::cout.precision(ss);
+
+            //plots
+            if (FLAGS_show_plots)
+                {
+                    Gnuplot g3("linespoints");
+                    g3.set_title(data_title + "Double diff Carrier Doppler error [Hz]");
+                    g3.set_grid();
+                    g3.set_xlabel("Time [s]");
+                    g3.set_ylabel("Double diff Carrier Doppler error [Hz]");
+                    //conversion between arma::vec and std:vector
+                    std::vector<double> range_error_m(err.colptr(0), err.colptr(0) + err.n_rows);
+                    g3.cmd("set key box opaque");
+                    g3.plot_xy(time_vector, range_error_m,
+                        "Double diff Carrier Doppler error");
+                    g3.set_legend();
+                    g3.savetops(data_title + "double_diff_carrier_doppler_error");
+
+                    g3.showonscreen();  // window output
+                }
+
+            //check results against the test tolerance
+            ASSERT_LT(error_mean, 5);
+            ASSERT_GT(error_mean, -5);
+            //assuming PLL BW=35
+            ASSERT_LT(error_var, 250);
+            ASSERT_LT(max_error, 100);
+            ASSERT_GT(min_error, -100);
+            ASSERT_LT(rmse, 30);
         }
-
-    //check results against the test tolerance
-    ASSERT_LT(error_mean, 5);
-    ASSERT_GT(error_mean, -5);
-    //assuming PLL BW=35
-    ASSERT_LT(error_var, 250);
-    ASSERT_LT(max_error, 100);
-    ASSERT_GT(min_error, -100);
-    ASSERT_LT(rmse, 30);
 }
 
 
@@ -1052,71 +1060,75 @@ void HybridObservablesTest::check_results_carrier_doppler(
     double t0 = measured_ch0(0, 0);
     int size1 = measured_ch0.col(0).n_rows;
     double t1 = measured_ch0(size1 - 1, 0);
-    arma::vec t = arma::linspace<arma::vec>(t0, t1, floor((t1 - t0) * 1e3));
-    //conversion between arma::vec and std:vector
-    arma::vec t_from_start = arma::linspace<arma::vec>(0, t1 - t0, floor((t1 - t0) * 1e3));
-    std::vector<double> time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows);
 
-    arma::vec true_ch0_doppler_interp;
-    arma::interp1(true_tow_s, true_ch0.col(2), t, true_ch0_doppler_interp);
-
-    arma::vec meas_ch0_doppler_interp;
-    arma::interp1(measured_ch0.col(0), measured_ch0.col(2), t, meas_ch0_doppler_interp);
-
-    //2. RMSE
-    arma::vec err_ch0_hz;
-
-    //compute error
-    err_ch0_hz = meas_ch0_doppler_interp - true_ch0_doppler_interp;
-
-    arma::vec err2_ch0 = arma::square(err_ch0_hz);
-    double rmse_ch0 = sqrt(arma::mean(err2_ch0));
-
-    //3. Mean err and variance
-    double error_mean_ch0 = arma::mean(err_ch0_hz);
-    double error_var_ch0 = arma::var(err_ch0_hz);
-
-    // 4. Peaks
-    double max_error_ch0 = arma::max(err_ch0_hz);
-    double min_error_ch0 = arma::min(err_ch0_hz);
-
-    //5. report
-    std::streamsize ss = std::cout.precision();
-    std::cout << std::setprecision(10) << data_title << "Carrier Doppler RMSE = "
-              << rmse_ch0 << ", mean = " << error_mean_ch0
-              << ", stdev = " << sqrt(error_var_ch0)
-              << " (max,min) = " << max_error_ch0
-              << "," << min_error_ch0
-              << " [Hz]" << std::endl;
-    std::cout.precision(ss);
-
-    //plots
-    if (FLAGS_show_plots)
+    if ((t1 - t0) > 0)
         {
-            Gnuplot g3("linespoints");
-            g3.set_title(data_title + "Carrier Doppler error [Hz]");
-            g3.set_grid();
-            g3.set_xlabel("Time [s]");
-            g3.set_ylabel("Carrier Doppler error [Hz]");
+            arma::vec t = arma::linspace<arma::vec>(t0, t1, floor((t1 - t0) * 1e3));
             //conversion between arma::vec and std:vector
-            std::vector<double> error_vec(err_ch0_hz.colptr(0), err_ch0_hz.colptr(0) + err_ch0_hz.n_rows);
-            g3.cmd("set key box opaque");
-            g3.plot_xy(time_vector, error_vec,
-                "Carrier Doppler error");
-            g3.set_legend();
-            g3.savetops(data_title + "Carrier_doppler_error");
+            arma::vec t_from_start = arma::linspace<arma::vec>(0, t1 - t0, floor((t1 - t0) * 1e3));
+            std::vector<double> time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows);
 
-            g3.showonscreen();  // window output
+            arma::vec true_ch0_doppler_interp;
+            arma::interp1(true_tow_s, true_ch0.col(2), t, true_ch0_doppler_interp);
+
+            arma::vec meas_ch0_doppler_interp;
+            arma::interp1(measured_ch0.col(0), measured_ch0.col(2), t, meas_ch0_doppler_interp);
+
+            //2. RMSE
+            arma::vec err_ch0_hz;
+
+            //compute error
+            err_ch0_hz = meas_ch0_doppler_interp - true_ch0_doppler_interp;
+
+            arma::vec err2_ch0 = arma::square(err_ch0_hz);
+            double rmse_ch0 = sqrt(arma::mean(err2_ch0));
+
+            //3. Mean err and variance
+            double error_mean_ch0 = arma::mean(err_ch0_hz);
+            double error_var_ch0 = arma::var(err_ch0_hz);
+
+            // 4. Peaks
+            double max_error_ch0 = arma::max(err_ch0_hz);
+            double min_error_ch0 = arma::min(err_ch0_hz);
+
+            //5. report
+            std::streamsize ss = std::cout.precision();
+            std::cout << std::setprecision(10) << data_title << "Carrier Doppler RMSE = "
+                      << rmse_ch0 << ", mean = " << error_mean_ch0
+                      << ", stdev = " << sqrt(error_var_ch0)
+                      << " (max,min) = " << max_error_ch0
+                      << "," << min_error_ch0
+                      << " [Hz]" << std::endl;
+            std::cout.precision(ss);
+
+            //plots
+            if (FLAGS_show_plots)
+                {
+                    Gnuplot g3("linespoints");
+                    g3.set_title(data_title + "Carrier Doppler error [Hz]");
+                    g3.set_grid();
+                    g3.set_xlabel("Time [s]");
+                    g3.set_ylabel("Carrier Doppler error [Hz]");
+                    //conversion between arma::vec and std:vector
+                    std::vector<double> error_vec(err_ch0_hz.colptr(0), err_ch0_hz.colptr(0) + err_ch0_hz.n_rows);
+                    g3.cmd("set key box opaque");
+                    g3.plot_xy(time_vector, error_vec,
+                        "Carrier Doppler error");
+                    g3.set_legend();
+                    g3.savetops(data_title + "Carrier_doppler_error");
+
+                    g3.showonscreen();  // window output
+                }
+
+            //check results against the test tolerance
+            ASSERT_LT(error_mean_ch0, 5);
+            ASSERT_GT(error_mean_ch0, -5);
+            //assuming PLL BW=35
+            ASSERT_LT(error_var_ch0, 250);
+            ASSERT_LT(max_error_ch0, 100);
+            ASSERT_GT(min_error_ch0, -100);
+            ASSERT_LT(rmse_ch0, 30);
         }
-
-    //check results against the test tolerance
-    ASSERT_LT(error_mean_ch0, 5);
-    ASSERT_GT(error_mean_ch0, -5);
-    //assuming PLL BW=35
-    ASSERT_LT(error_var_ch0, 250);
-    ASSERT_LT(max_error_ch0, 100);
-    ASSERT_GT(min_error_ch0, -100);
-    ASSERT_LT(rmse_ch0, 30);
 }
 
 void HybridObservablesTest::check_results_duplicated_satellite(
@@ -1156,217 +1168,220 @@ void HybridObservablesTest::check_results_duplicated_satellite(
             t1 = t1_sat1;
         }
 
-    arma::vec t = arma::linspace<arma::vec>(t0, t1, floor((t1 - t0) * 1e3));
-    //conversion between arma::vec and std:vector
-    arma::vec t_from_start = arma::linspace<arma::vec>(0, t1 - t0, floor((t1 - t0) * 1e3));
-    std::vector<double> time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows);
-    //Doppler
-    arma::vec meas_sat1_doppler_interp;
-    arma::interp1(measured_sat1.col(0), measured_sat1.col(2), t, meas_sat1_doppler_interp);
-    arma::vec meas_sat2_doppler_interp;
-    arma::interp1(measured_sat2.col(0), measured_sat2.col(2), t, meas_sat2_doppler_interp);
-
-    //Carrier Phase
-    arma::vec meas_sat1_carrier_phase_interp;
-    arma::vec meas_sat2_carrier_phase_interp;
-    arma::interp1(measured_sat1.col(0), measured_sat1.col(3), t, meas_sat1_carrier_phase_interp);
-    arma::interp1(measured_sat2.col(0), measured_sat2.col(3), t, meas_sat2_carrier_phase_interp);
-
-    // generate double difference accumulated carrier phases
-    //compute error without the accumulated carrier phase offsets (which depends on the receiver starting time)
-    arma::vec delta_measured_carrier_phase_cycles = (meas_sat1_carrier_phase_interp - meas_sat1_carrier_phase_interp(0)) - (meas_sat2_carrier_phase_interp - meas_sat2_carrier_phase_interp(0));
-
-    //Pseudoranges
-    arma::vec meas_sat1_dist_interp;
-    arma::vec meas_sat2_dist_interp;
-    arma::interp1(measured_sat1.col(0), measured_sat1.col(4), t, meas_sat1_dist_interp);
-    arma::interp1(measured_sat2.col(0), measured_sat2.col(4), t, meas_sat2_dist_interp);
-    // generate delta pseudoranges
-    arma::vec delta_measured_dist_m = meas_sat1_dist_interp - meas_sat2_dist_interp;
-
-    //Carrier Doppler error
-    //2. RMSE
-    arma::vec err_ch0_hz;
-
-    //compute error
-    err_ch0_hz = meas_sat1_doppler_interp - meas_sat2_doppler_interp;
-
-    //save matlab file for further analysis
-    std::vector<double> tmp_vector_common_time_s(t.colptr(0),
-        t.colptr(0) + t.n_rows);
-
-    std::vector<double> tmp_vector_err_ch0_hz(err_ch0_hz.colptr(0),
-        err_ch0_hz.colptr(0) + err_ch0_hz.n_rows);
-    save_mat_xy(tmp_vector_common_time_s, tmp_vector_err_ch0_hz, std::string("measured_doppler_error_ch_" + std::to_string(ch_id)));
-
-    //compute statistics
-    arma::vec err2_ch0 = arma::square(err_ch0_hz);
-    double rmse_ch0 = sqrt(arma::mean(err2_ch0));
-
-    //3. Mean err and variance
-    double error_mean_ch0 = arma::mean(err_ch0_hz);
-    double error_var_ch0 = arma::var(err_ch0_hz);
-
-    // 4. Peaks
-    double max_error_ch0 = arma::max(err_ch0_hz);
-    double min_error_ch0 = arma::min(err_ch0_hz);
-
-    //5. report
-    std::streamsize ss = std::cout.precision();
-    std::cout << std::setprecision(10) << data_title << "Carrier Doppler RMSE = "
-              << rmse_ch0 << ", mean = " << error_mean_ch0
-              << ", stdev = " << sqrt(error_var_ch0)
-              << " (max,min) = " << max_error_ch0
-              << "," << min_error_ch0
-              << " [Hz]" << std::endl;
-    std::cout.precision(ss);
-
-    //plots
-    if (FLAGS_show_plots)
+    if ((t1 - t0) > 0)
         {
-            Gnuplot g3("linespoints");
-            g3.set_title(data_title + "Carrier Doppler error [Hz]");
-            g3.set_grid();
-            g3.set_xlabel("Time [s]");
-            g3.set_ylabel("Carrier Doppler error [Hz]");
+            arma::vec t = arma::linspace<arma::vec>(t0, t1, floor((t1 - t0) * 1e3));
             //conversion between arma::vec and std:vector
-            std::vector<double> error_vec(err_ch0_hz.colptr(0), err_ch0_hz.colptr(0) + err_ch0_hz.n_rows);
-            g3.cmd("set key box opaque");
-            g3.plot_xy(time_vector, error_vec,
-                "Carrier Doppler error");
-            g3.set_legend();
-            g3.savetops(data_title + "Carrier_doppler_error");
+            arma::vec t_from_start = arma::linspace<arma::vec>(0, t1 - t0, floor((t1 - t0) * 1e3));
+            std::vector<double> time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows);
+            //Doppler
+            arma::vec meas_sat1_doppler_interp;
+            arma::interp1(measured_sat1.col(0), measured_sat1.col(2), t, meas_sat1_doppler_interp);
+            arma::vec meas_sat2_doppler_interp;
+            arma::interp1(measured_sat2.col(0), measured_sat2.col(2), t, meas_sat2_doppler_interp);
 
-            g3.showonscreen();  // window output
+            //Carrier Phase
+            arma::vec meas_sat1_carrier_phase_interp;
+            arma::vec meas_sat2_carrier_phase_interp;
+            arma::interp1(measured_sat1.col(0), measured_sat1.col(3), t, meas_sat1_carrier_phase_interp);
+            arma::interp1(measured_sat2.col(0), measured_sat2.col(3), t, meas_sat2_carrier_phase_interp);
+
+            // generate double difference accumulated carrier phases
+            //compute error without the accumulated carrier phase offsets (which depends on the receiver starting time)
+            arma::vec delta_measured_carrier_phase_cycles = (meas_sat1_carrier_phase_interp - meas_sat1_carrier_phase_interp(0)) - (meas_sat2_carrier_phase_interp - meas_sat2_carrier_phase_interp(0));
+
+            //Pseudoranges
+            arma::vec meas_sat1_dist_interp;
+            arma::vec meas_sat2_dist_interp;
+            arma::interp1(measured_sat1.col(0), measured_sat1.col(4), t, meas_sat1_dist_interp);
+            arma::interp1(measured_sat2.col(0), measured_sat2.col(4), t, meas_sat2_dist_interp);
+            // generate delta pseudoranges
+            arma::vec delta_measured_dist_m = meas_sat1_dist_interp - meas_sat2_dist_interp;
+
+            //Carrier Doppler error
+            //2. RMSE
+            arma::vec err_ch0_hz;
+
+            //compute error
+            err_ch0_hz = meas_sat1_doppler_interp - meas_sat2_doppler_interp;
+
+            //save matlab file for further analysis
+            std::vector<double> tmp_vector_common_time_s(t.colptr(0),
+                t.colptr(0) + t.n_rows);
+
+            std::vector<double> tmp_vector_err_ch0_hz(err_ch0_hz.colptr(0),
+                err_ch0_hz.colptr(0) + err_ch0_hz.n_rows);
+            save_mat_xy(tmp_vector_common_time_s, tmp_vector_err_ch0_hz, std::string("measured_doppler_error_ch_" + std::to_string(ch_id)));
+
+            //compute statistics
+            arma::vec err2_ch0 = arma::square(err_ch0_hz);
+            double rmse_ch0 = sqrt(arma::mean(err2_ch0));
+
+            //3. Mean err and variance
+            double error_mean_ch0 = arma::mean(err_ch0_hz);
+            double error_var_ch0 = arma::var(err_ch0_hz);
+
+            // 4. Peaks
+            double max_error_ch0 = arma::max(err_ch0_hz);
+            double min_error_ch0 = arma::min(err_ch0_hz);
+
+            //5. report
+            std::streamsize ss = std::cout.precision();
+            std::cout << std::setprecision(10) << data_title << "Carrier Doppler RMSE = "
+                      << rmse_ch0 << ", mean = " << error_mean_ch0
+                      << ", stdev = " << sqrt(error_var_ch0)
+                      << " (max,min) = " << max_error_ch0
+                      << "," << min_error_ch0
+                      << " [Hz]" << std::endl;
+            std::cout.precision(ss);
+
+            //plots
+            if (FLAGS_show_plots)
+                {
+                    Gnuplot g3("linespoints");
+                    g3.set_title(data_title + "Carrier Doppler error [Hz]");
+                    g3.set_grid();
+                    g3.set_xlabel("Time [s]");
+                    g3.set_ylabel("Carrier Doppler error [Hz]");
+                    //conversion between arma::vec and std:vector
+                    std::vector<double> error_vec(err_ch0_hz.colptr(0), err_ch0_hz.colptr(0) + err_ch0_hz.n_rows);
+                    g3.cmd("set key box opaque");
+                    g3.plot_xy(time_vector, error_vec,
+                        "Carrier Doppler error");
+                    g3.set_legend();
+                    g3.savetops(data_title + "Carrier_doppler_error");
+
+                    g3.showonscreen();  // window output
+                }
+
+            //check results against the test tolerance
+            EXPECT_LT(error_mean_ch0, 5);
+            EXPECT_GT(error_mean_ch0, -5);
+            //assuming PLL BW=35
+            EXPECT_LT(error_var_ch0, 250);
+            EXPECT_LT(max_error_ch0, 100);
+            EXPECT_GT(min_error_ch0, -100);
+            EXPECT_LT(rmse_ch0, 30);
+
+            //Carrier Phase error
+            //2. RMSE
+            arma::vec err_carrier_phase;
+
+            err_carrier_phase = delta_measured_carrier_phase_cycles;
+
+            //save matlab file for further analysis
+            std::vector<double> tmp_vector_err_carrier_phase(err_carrier_phase.colptr(0),
+                err_carrier_phase.colptr(0) + err_carrier_phase.n_rows);
+            save_mat_xy(tmp_vector_common_time_s, tmp_vector_err_carrier_phase, std::string("measured_carrier_phase_error_ch_" + std::to_string(ch_id)));
+
+
+            arma::vec err2_carrier_phase = arma::square(err_carrier_phase);
+            double rmse_carrier_phase = sqrt(arma::mean(err2_carrier_phase));
+
+            //3. Mean err and variance
+            double error_mean_carrier_phase = arma::mean(err_carrier_phase);
+            double error_var_carrier_phase = arma::var(err_carrier_phase);
+
+            // 4. Peaks
+            double max_error_carrier_phase = arma::max(err_carrier_phase);
+            double min_error_carrier_phase = arma::min(err_carrier_phase);
+
+            //5. report
+            ss = std::cout.precision();
+            std::cout << std::setprecision(10) << data_title << "Carrier Phase RMSE = "
+                      << rmse_carrier_phase << ", mean = " << error_mean_carrier_phase
+                      << ", stdev = " << sqrt(error_var_carrier_phase)
+                      << " (max,min) = " << max_error_carrier_phase
+                      << "," << min_error_carrier_phase
+                      << " [Cycles]" << std::endl;
+            std::cout.precision(ss);
+
+            //plots
+            if (FLAGS_show_plots)
+                {
+                    Gnuplot g3("linespoints");
+                    g3.set_title(data_title + "Carrier Phase error [Cycles]");
+                    g3.set_grid();
+                    g3.set_xlabel("Time [s]");
+                    g3.set_ylabel("Carrier Phase error [Cycles]");
+                    //conversion between arma::vec and std:vector
+                    std::vector<double> range_error_m(err_carrier_phase.colptr(0), err_carrier_phase.colptr(0) + err_carrier_phase.n_rows);
+                    g3.cmd("set key box opaque");
+                    g3.plot_xy(time_vector, range_error_m,
+                        "Carrier Phase error");
+                    g3.set_legend();
+                    g3.savetops(data_title + "duplicated_satellite_carrier_phase_error");
+
+                    g3.showonscreen();  // window output
+                }
+
+            //check results against the test tolerance
+            EXPECT_LT(rmse_carrier_phase, 0.25);
+            EXPECT_LT(error_mean_carrier_phase, 0.2);
+            EXPECT_GT(error_mean_carrier_phase, -0.2);
+            EXPECT_LT(error_var_carrier_phase, 0.5);
+            EXPECT_LT(max_error_carrier_phase, 0.5);
+            EXPECT_GT(min_error_carrier_phase, -0.5);
+
+            //Pseudorange error
+            //2. RMSE
+            arma::vec err_pseudorange;
+
+            err_pseudorange = delta_measured_dist_m;
+
+            //save matlab file for further analysis
+            std::vector<double> tmp_vector_err_pseudorange(err_pseudorange.colptr(0),
+                err_pseudorange.colptr(0) + err_pseudorange.n_rows);
+            save_mat_xy(tmp_vector_common_time_s, tmp_vector_err_pseudorange, std::string("measured_pr_error_ch_" + std::to_string(ch_id)));
+
+            arma::vec err2_pseudorange = arma::square(err_pseudorange);
+            double rmse_pseudorange = sqrt(arma::mean(err2_pseudorange));
+
+            //3. Mean err and variance
+            double error_mean_pseudorange = arma::mean(err_pseudorange);
+            double error_var_pseudorange = arma::var(err_pseudorange);
+
+            // 4. Peaks
+            double max_error_pseudorange = arma::max(err_pseudorange);
+            double min_error_pseudorange = arma::min(err_pseudorange);
+
+            //5. report
+            ss = std::cout.precision();
+            std::cout << std::setprecision(10) << data_title << "Pseudorange RMSE = "
+                      << rmse_pseudorange << ", mean = " << error_mean_pseudorange
+                      << ", stdev = " << sqrt(error_var_pseudorange)
+                      << " (max,min) = " << max_error_pseudorange
+                      << "," << min_error_pseudorange
+                      << " [meters]" << std::endl;
+            std::cout.precision(ss);
+
+            //plots
+            if (FLAGS_show_plots)
+                {
+                    Gnuplot g3("linespoints");
+                    g3.set_title(data_title + "Pseudorange error [m]");
+                    g3.set_grid();
+                    g3.set_xlabel("Time [s]");
+                    g3.set_ylabel("Pseudorange error [m]");
+                    //conversion between arma::vec and std:vector
+                    std::vector<double> range_error_m(err_pseudorange.colptr(0), err_pseudorange.colptr(0) + err_pseudorange.n_rows);
+                    g3.cmd("set key box opaque");
+                    g3.plot_xy(time_vector, range_error_m,
+                        "Pseudorrange error");
+                    g3.set_legend();
+                    g3.savetops(data_title + "duplicated_satellite_pseudorrange_error");
+
+                    g3.showonscreen();  // window output
+                }
+
+            //check results against the test tolerance
+            EXPECT_LT(rmse_pseudorange, 3.0);
+            EXPECT_LT(error_mean_pseudorange, 1.0);
+            EXPECT_GT(error_mean_pseudorange, -1.0);
+            EXPECT_LT(error_var_pseudorange, 10.0);
+            EXPECT_LT(max_error_pseudorange, 10.0);
+            EXPECT_GT(min_error_pseudorange, -10.0);
         }
-
-    //check results against the test tolerance
-    EXPECT_LT(error_mean_ch0, 5);
-    EXPECT_GT(error_mean_ch0, -5);
-    //assuming PLL BW=35
-    EXPECT_LT(error_var_ch0, 250);
-    EXPECT_LT(max_error_ch0, 100);
-    EXPECT_GT(min_error_ch0, -100);
-    EXPECT_LT(rmse_ch0, 30);
-
-    //Carrier Phase error
-    //2. RMSE
-    arma::vec err_carrier_phase;
-
-    err_carrier_phase = delta_measured_carrier_phase_cycles;
-
-    //save matlab file for further analysis
-    std::vector<double> tmp_vector_err_carrier_phase(err_carrier_phase.colptr(0),
-        err_carrier_phase.colptr(0) + err_carrier_phase.n_rows);
-    save_mat_xy(tmp_vector_common_time_s, tmp_vector_err_carrier_phase, std::string("measured_carrier_phase_error_ch_" + std::to_string(ch_id)));
-
-
-    arma::vec err2_carrier_phase = arma::square(err_carrier_phase);
-    double rmse_carrier_phase = sqrt(arma::mean(err2_carrier_phase));
-
-    //3. Mean err and variance
-    double error_mean_carrier_phase = arma::mean(err_carrier_phase);
-    double error_var_carrier_phase = arma::var(err_carrier_phase);
-
-    // 4. Peaks
-    double max_error_carrier_phase = arma::max(err_carrier_phase);
-    double min_error_carrier_phase = arma::min(err_carrier_phase);
-
-    //5. report
-    ss = std::cout.precision();
-    std::cout << std::setprecision(10) << data_title << "Carrier Phase RMSE = "
-              << rmse_carrier_phase << ", mean = " << error_mean_carrier_phase
-              << ", stdev = " << sqrt(error_var_carrier_phase)
-              << " (max,min) = " << max_error_carrier_phase
-              << "," << min_error_carrier_phase
-              << " [Cycles]" << std::endl;
-    std::cout.precision(ss);
-
-    //plots
-    if (FLAGS_show_plots)
-        {
-            Gnuplot g3("linespoints");
-            g3.set_title(data_title + "Carrier Phase error [Cycles]");
-            g3.set_grid();
-            g3.set_xlabel("Time [s]");
-            g3.set_ylabel("Carrier Phase error [Cycles]");
-            //conversion between arma::vec and std:vector
-            std::vector<double> range_error_m(err_carrier_phase.colptr(0), err_carrier_phase.colptr(0) + err_carrier_phase.n_rows);
-            g3.cmd("set key box opaque");
-            g3.plot_xy(time_vector, range_error_m,
-                "Carrier Phase error");
-            g3.set_legend();
-            g3.savetops(data_title + "duplicated_satellite_carrier_phase_error");
-
-            g3.showonscreen();  // window output
-        }
-
-    //check results against the test tolerance
-    EXPECT_LT(rmse_carrier_phase, 0.25);
-    EXPECT_LT(error_mean_carrier_phase, 0.2);
-    EXPECT_GT(error_mean_carrier_phase, -0.2);
-    EXPECT_LT(error_var_carrier_phase, 0.5);
-    EXPECT_LT(max_error_carrier_phase, 0.5);
-    EXPECT_GT(min_error_carrier_phase, -0.5);
-
-    //Pseudorange error
-    //2. RMSE
-    arma::vec err_pseudorange;
-
-    err_pseudorange = delta_measured_dist_m;
-
-    //save matlab file for further analysis
-    std::vector<double> tmp_vector_err_pseudorange(err_pseudorange.colptr(0),
-        err_pseudorange.colptr(0) + err_pseudorange.n_rows);
-    save_mat_xy(tmp_vector_common_time_s, tmp_vector_err_pseudorange, std::string("measured_pr_error_ch_" + std::to_string(ch_id)));
-
-    arma::vec err2_pseudorange = arma::square(err_pseudorange);
-    double rmse_pseudorange = sqrt(arma::mean(err2_pseudorange));
-
-    //3. Mean err and variance
-    double error_mean_pseudorange = arma::mean(err_pseudorange);
-    double error_var_pseudorange = arma::var(err_pseudorange);
-
-    // 4. Peaks
-    double max_error_pseudorange = arma::max(err_pseudorange);
-    double min_error_pseudorange = arma::min(err_pseudorange);
-
-    //5. report
-    ss = std::cout.precision();
-    std::cout << std::setprecision(10) << data_title << "Pseudorange RMSE = "
-              << rmse_pseudorange << ", mean = " << error_mean_pseudorange
-              << ", stdev = " << sqrt(error_var_pseudorange)
-              << " (max,min) = " << max_error_pseudorange
-              << "," << min_error_pseudorange
-              << " [meters]" << std::endl;
-    std::cout.precision(ss);
-
-    //plots
-    if (FLAGS_show_plots)
-        {
-            Gnuplot g3("linespoints");
-            g3.set_title(data_title + "Pseudorange error [m]");
-            g3.set_grid();
-            g3.set_xlabel("Time [s]");
-            g3.set_ylabel("Pseudorange error [m]");
-            //conversion between arma::vec and std:vector
-            std::vector<double> range_error_m(err_pseudorange.colptr(0), err_pseudorange.colptr(0) + err_pseudorange.n_rows);
-            g3.cmd("set key box opaque");
-            g3.plot_xy(time_vector, range_error_m,
-                "Pseudorrange error");
-            g3.set_legend();
-            g3.savetops(data_title + "duplicated_satellite_pseudorrange_error");
-
-            g3.showonscreen();  // window output
-        }
-
-    //check results against the test tolerance
-    EXPECT_LT(rmse_pseudorange, 3.0);
-    EXPECT_LT(error_mean_pseudorange, 1.0);
-    EXPECT_GT(error_mean_pseudorange, -1.0);
-    EXPECT_LT(error_var_pseudorange, 10.0);
-    EXPECT_LT(max_error_pseudorange, 10.0);
-    EXPECT_GT(min_error_pseudorange, -10.0);
 }
 
 bool HybridObservablesTest::save_mat_xy(std::vector<double>& x, std::vector<double>& y, std::string filename)
@@ -1420,77 +1435,82 @@ void HybridObservablesTest::check_results_code_pseudorange(
     int size2 = measured_ch1.col(0).n_rows;
     double t1 = std::min(measured_ch0(size1 - 1, 0), measured_ch1(size2 - 1, 0));
 
-    arma::vec t = arma::linspace<arma::vec>(t0, t1, floor((t1 - t0) * 1e3));
-    //conversion between arma::vec and std:vector
-    arma::vec t_from_start = arma::linspace<arma::vec>(0, t1 - t0, floor((t1 - t0) * 1e3));
-    std::vector<double> time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows);
-
-
-    arma::vec true_ch0_dist_interp;
-    arma::vec true_ch1_dist_interp;
-    arma::interp1(true_tow_ch0_s, true_ch0.col(1), t, true_ch0_dist_interp);
-    arma::interp1(true_tow_ch1_s, true_ch1.col(1), t, true_ch1_dist_interp);
-
-    arma::vec meas_ch0_dist_interp;
-    arma::vec meas_ch1_dist_interp;
-    arma::interp1(measured_ch0.col(0), measured_ch0.col(4), t, meas_ch0_dist_interp);
-    arma::interp1(measured_ch1.col(0), measured_ch1.col(4), t, meas_ch1_dist_interp);
-
-    // generate delta pseudoranges
-    arma::vec delta_true_dist_m = true_ch0_dist_interp - true_ch1_dist_interp;
-    arma::vec delta_measured_dist_m = meas_ch0_dist_interp - meas_ch1_dist_interp;
-
-    //2. RMSE
-    arma::vec err;
-
-    err = delta_measured_dist_m - delta_true_dist_m;
-    arma::vec err2 = arma::square(err);
-    double rmse = sqrt(arma::mean(err2));
-
-    //3. Mean err and variance
-    double error_mean = arma::mean(err);
-    double error_var = arma::var(err);
-
-    // 4. Peaks
-    double max_error = arma::max(err);
-    double min_error = arma::min(err);
-
-    //5. report
-    std::streamsize ss = std::cout.precision();
-    std::cout << std::setprecision(10) << data_title << "Double diff Pseudorange RMSE = "
-              << rmse << ", mean = " << error_mean
-              << ", stdev = " << sqrt(error_var)
-              << " (max,min) = " << max_error
-              << "," << min_error
-              << " [meters]" << std::endl;
-    std::cout.precision(ss);
-
-    //plots
-    if (FLAGS_show_plots)
+    if ((t1 - t0) > 0)
         {
-            Gnuplot g3("linespoints");
-            g3.set_title(data_title + "Double diff Pseudorange error [m]");
-            g3.set_grid();
-            g3.set_xlabel("Time [s]");
-            g3.set_ylabel("Double diff Pseudorange error [m]");
+            arma::vec t = arma::linspace<arma::vec>(t0, t1, floor((t1 - t0) * 1e3));
             //conversion between arma::vec and std:vector
-            std::vector<double> range_error_m(err.colptr(0), err.colptr(0) + err.n_rows);
-            g3.cmd("set key box opaque");
-            g3.plot_xy(time_vector, range_error_m,
-                "Double diff Pseudorrange error");
-            g3.set_legend();
-            g3.savetops(data_title + "double_diff_pseudorrange_error");
+            arma::vec t_from_start = arma::linspace<arma::vec>(0, t1 - t0, floor((t1 - t0) * 1e3));
+            std::vector<double> time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows);
+            arma::vec true_ch0_dist_interp;
+            arma::vec true_ch1_dist_interp;
+            arma::interp1(true_tow_ch0_s, true_ch0.col(1), t, true_ch0_dist_interp);
+            arma::interp1(true_tow_ch1_s, true_ch1.col(1), t, true_ch1_dist_interp);
 
-            g3.showonscreen();  // window output
+            arma::vec meas_ch0_dist_interp;
+            arma::vec meas_ch1_dist_interp;
+            arma::interp1(measured_ch0.col(0), measured_ch0.col(4), t, meas_ch0_dist_interp);
+            arma::interp1(measured_ch1.col(0), measured_ch1.col(4), t, meas_ch1_dist_interp);
+
+            // generate delta pseudoranges
+            arma::vec delta_true_dist_m = true_ch0_dist_interp - true_ch1_dist_interp;
+            arma::vec delta_measured_dist_m = meas_ch0_dist_interp - meas_ch1_dist_interp;
+
+            //2. RMSE
+            arma::vec err;
+
+            err = delta_measured_dist_m - delta_true_dist_m;
+            arma::vec err2 = arma::square(err);
+            double rmse = sqrt(arma::mean(err2));
+
+            //3. Mean err and variance
+            double error_mean = arma::mean(err);
+            double error_var = arma::var(err);
+
+            // 4. Peaks
+            double max_error = arma::max(err);
+            double min_error = arma::min(err);
+
+            //5. report
+            std::streamsize ss = std::cout.precision();
+            std::cout << std::setprecision(10) << data_title << "Double diff Pseudorange RMSE = "
+                      << rmse << ", mean = " << error_mean
+                      << ", stdev = " << sqrt(error_var)
+                      << " (max,min) = " << max_error
+                      << "," << min_error
+                      << " [meters]" << std::endl;
+            std::cout.precision(ss);
+
+            //plots
+            if (FLAGS_show_plots)
+                {
+                    Gnuplot g3("linespoints");
+                    g3.set_title(data_title + "Double diff Pseudorange error [m]");
+                    g3.set_grid();
+                    g3.set_xlabel("Time [s]");
+                    g3.set_ylabel("Double diff Pseudorange error [m]");
+                    //conversion between arma::vec and std:vector
+                    std::vector<double> range_error_m(err.colptr(0), err.colptr(0) + err.n_rows);
+                    g3.cmd("set key box opaque");
+                    g3.plot_xy(time_vector, range_error_m,
+                        "Double diff Pseudorrange error");
+                    g3.set_legend();
+                    g3.savetops(data_title + "double_diff_pseudorrange_error");
+
+                    g3.showonscreen();  // window output
+                }
+
+            //check results against the test tolerance
+            ASSERT_LT(rmse, 3.0);
+            ASSERT_LT(error_mean, 1.0);
+            ASSERT_GT(error_mean, -1.0);
+            ASSERT_LT(error_var, 10.0);
+            ASSERT_LT(max_error, 10.0);
+            ASSERT_GT(min_error, -10.0);
+        }
+    else
+        {
+            std::cout << "Problem with observables in " << data_title << std::endl;
         }
-
-    //check results against the test tolerance
-    ASSERT_LT(rmse, 3.0);
-    ASSERT_LT(error_mean, 1.0);
-    ASSERT_GT(error_mean, -1.0);
-    ASSERT_LT(error_var, 10.0);
-    ASSERT_LT(max_error, 10.0);
-    ASSERT_GT(min_error, -10.0);
 }
 
 bool HybridObservablesTest::ReadRinexObs(std::vector<arma::mat>* obs_vec, Gnss_Synchro gnss)
@@ -1981,7 +2001,7 @@ TEST_F(HybridObservablesTest, ValidationOfResults)
                             int sat2_ch_id = -1;
                             for (unsigned int ch = 0; ch < measured_obs_vec.size(); ch++)
                                 {
-                                    if (epoch_counters_vec.at(ch) > 10)  //discard non-valid channels
+                                    if (epoch_counters_vec.at(ch) > 100)  //discard non-valid channels
                                         {
                                             if (gnss_synchro_vec.at(ch).PRN == prn_pairs.at(n))
                                                 {
@@ -2023,7 +2043,7 @@ TEST_F(HybridObservablesTest, ValidationOfResults)
             unsigned int min_pr_ch_id = 0;
             for (unsigned int n = 0; n < measured_obs_vec.size(); n++)
                 {
-                    if (epoch_counters_vec.at(n) > 10)  //discard non-valid channels
+                    if (epoch_counters_vec.at(n) > 100)  //discard non-valid channels
                         {
                             {
                                 if (measured_obs_vec.at(n)(0, 4) < min_pr)
@@ -2040,8 +2060,20 @@ TEST_F(HybridObservablesTest, ValidationOfResults)
                 }
 
             arma::vec receiver_time_offset_ref_channel_s;
-            receiver_time_offset_ref_channel_s = (true_obs_vec.at(min_pr_ch_id).col(1)(0) - measured_obs_vec.at(min_pr_ch_id).col(4)(0)) / GPS_C_M_S;
-            std::cout << "Ref. channel initial Receiver time offset " << receiver_time_offset_ref_channel_s(0) * 1e3 << " [ms]" << std::endl;
+            arma::uvec index2;
+            index2 = arma::find(true_obs_vec.at(min_pr_ch_id).col(0) >= measured_obs_vec.at(min_pr_ch_id).col(0)(0), 1, "first");
+            if ((!index2.empty()) and (index2(0) > 0))
+                {
+                    receiver_time_offset_ref_channel_s = (true_obs_vec.at(min_pr_ch_id).col(1)(index2(0)) - measured_obs_vec.at(min_pr_ch_id).col(4)(0)) / GPS_C_M_S;
+                    std::cout << "Ref. channel initial Receiver time offset " << receiver_time_offset_ref_channel_s(0) * 1e3 << " [ms]" << std::endl;
+                }
+            else
+                {
+                    ASSERT_NO_THROW(
+                        throw std::exception();)
+                        << "Error finding observation time epoch in the reference data";
+                }
+
 
             for (unsigned int n = 0; n < measured_obs_vec.size(); n++)
                 {
@@ -2083,7 +2115,7 @@ TEST_F(HybridObservablesTest, ValidationOfResults)
                     save_mat_xy(tmp_vector_x6, tmp_vector_y6, std::string("measured_cp_ch_" + std::to_string(n)));
 
 
-                    if (epoch_counters_vec.at(n) > 10)  //discard non-valid channels
+                    if (epoch_counters_vec.at(n) > 100)  //discard non-valid channels
                         {
                             arma::vec true_TOW_ref_ch_s = true_obs_vec.at(min_pr_ch_id).col(0) - receiver_time_offset_ref_channel_s(0);
                             arma::vec true_TOW_ch_s = true_obs_vec.at(n).col(0) - receiver_time_offset_ref_channel_s(0);
@@ -2097,7 +2129,6 @@ TEST_F(HybridObservablesTest, ValidationOfResults)
                                         measured_obs_vec.at(n),
                                         measured_obs_vec.at(min_pr_ch_id),
                                         "[CH " + std::to_string(n) + "] PRN " + std::to_string(gnss_synchro_vec.at(n).PRN) + " ");
-
                                     //Do not compare E5a with E5 RINEX due to the Doppler frequency discrepancy caused by the different center frequencies
                                     //E5a_fc=1176.45e6, E5b_fc=1207.14e6, E5_fc=1191.795e6;
                                     if (strcmp("5X\0", gnss_synchro_vec.at(n).Signal) != 0 or FLAGS_compare_with_5X)
diff --git a/src/tests/unit-tests/signal-processing-blocks/pvt/serdes_monitor_pvt_test.cc b/src/tests/unit-tests/signal-processing-blocks/pvt/serdes_monitor_pvt_test.cc
index eb586f147..647e7f245 100644
--- a/src/tests/unit-tests/signal-processing-blocks/pvt/serdes_monitor_pvt_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/pvt/serdes_monitor_pvt_test.cc
@@ -29,12 +29,13 @@
  */
 
 #include "serdes_monitor_pvt.h"
+#include <memory>
 
 TEST(Serdes_Monitor_Pvt_Test, Simpletest)
 {
-    Monitor_Pvt monitor = Monitor_Pvt();
+    std::shared_ptr<Monitor_Pvt> monitor = std::make_shared<Monitor_Pvt>(Monitor_Pvt());
     double true_latitude = 23.4;
-    monitor.latitude = true_latitude;
+    monitor->latitude = true_latitude;
 
     Serdes_Monitor_Pvt serdes = Serdes_Monitor_Pvt();
     std::string serialized_data = serdes.createProtobuffer(monitor);
diff --git a/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc b/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc
index d8ce67450..0f4c3ad47 100644
--- a/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc
@@ -39,10 +39,10 @@
 #else
 #include <gnuradio/analog/sig_source_c.h>
 #endif
+#include "concurrent_queue.h"
 #include "direct_resampler_conditioner_cc.h"
 #include "gnss_sdr_valve.h"
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 
 
 TEST(DirectResamplerConditionerCcTest, InstantiationAndRunTest)
@@ -52,7 +52,7 @@ TEST(DirectResamplerConditionerCcTest, InstantiationAndRunTest)
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
     int nsamples = 1000000;  //Number of samples to be computed
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     gr::top_block_sptr top_block = gr::make_top_block("direct_resampler_conditioner_cc_test");
     boost::shared_ptr<gr::analog::sig_source_c> source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000.0, 1.0, gr_complex(0.0));
     boost::shared_ptr<gr::block> valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue);
diff --git a/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc b/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc
index 2bc26b8b4..acf888a0b 100644
--- a/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc
@@ -37,10 +37,10 @@
 #else
 #include <gnuradio/analog/sig_source_c.h>
 #endif
+#include "concurrent_queue.h"
 #include "gnss_sdr_valve.h"
 #include "mmse_resampler_conditioner.h"
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
 
 TEST(MmseResamplerTest, InstantiationAndRunTestWarning)
 {
@@ -49,7 +49,7 @@ TEST(MmseResamplerTest, InstantiationAndRunTestWarning)
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
     int nsamples = 1000000;  //Number of samples to be computed
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     gr::top_block_sptr top_block = gr::make_top_block("mmse_resampler_conditioner_cc_test");
     boost::shared_ptr<gr::analog::sig_source_c> source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000.0, 1.0, gr_complex(0.0));
     boost::shared_ptr<gr::block> valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue);
@@ -90,7 +90,7 @@ TEST(MmseResamplerTest, InstantiationAndRunTest2)
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
     int nsamples = 1000000;  //Number of samples to be computed
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     gr::top_block_sptr top_block = gr::make_top_block("mmse_resampler_conditioner_cc_test");
     boost::shared_ptr<gr::analog::sig_source_c> source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000.0, 1.0, gr_complex(0.0));
     boost::shared_ptr<gr::block> valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue);
diff --git a/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc b/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc
index dd1020249..49ea2c244 100644
--- a/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc
@@ -30,15 +30,15 @@
  */
 
 #include "file_signal_source.h"
+#include "concurrent_queue.h"
 #include "in_memory_configuration.h"
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
 #include <stdexcept>
 
 TEST(FileSignalSource, Instantiate)
 {
-    boost::shared_ptr<gr::msg_queue> queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     std::shared_ptr<InMemoryConfiguration> config = std::make_shared<InMemoryConfiguration>();
 
     config->set_property("Test.samples", "0");
@@ -57,7 +57,7 @@ TEST(FileSignalSource, Instantiate)
 
 TEST(FileSignalSource, InstantiateFileNotExists)
 {
-    boost::shared_ptr<gr::msg_queue> queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     std::shared_ptr<InMemoryConfiguration> config = std::make_shared<InMemoryConfiguration>();
 
     config->set_property("Test.samples", "0");
diff --git a/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc b/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc
index 02e1b09df..52e987bf3 100644
--- a/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc
@@ -38,13 +38,14 @@
 #else
 #include <gnuradio/analog/sig_source_f.h>
 #endif
+#include "concurrent_queue.h"
 #include "gnss_sdr_valve.h"
 #include <gnuradio/blocks/null_sink.h>
-#include <gnuradio/msg_queue.h>
+#include <pmt/pmt.h>
 
 TEST(ValveTest, CheckEventSentAfter100Samples)
 {
-    gr::msg_queue::sptr queue = gr::msg_queue::make(0);
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
 
     gr::top_block_sptr top_block = gr::make_top_block("gnss_sdr_valve_test");
 
@@ -52,8 +53,9 @@ TEST(ValveTest, CheckEventSentAfter100Samples)
     boost::shared_ptr<gr::block> valve = gnss_sdr_make_valve(sizeof(float), 100, queue);
     gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(float));
 
-    unsigned int expected0 = 0;
-    EXPECT_EQ(expected0, queue->count());
+    bool expected0 = false;
+    pmt::pmt_t msg;
+    EXPECT_EQ(expected0, queue->timed_wait_and_pop(msg, 100));
 
     top_block->connect(source, 0, valve, 0);
     top_block->connect(valve, 0, sink, 0);
@@ -61,6 +63,6 @@ TEST(ValveTest, CheckEventSentAfter100Samples)
     top_block->run();
     top_block->stop();
 
-    unsigned int expected1 = 1;
-    EXPECT_EQ(expected1, queue->count());
+    bool expected1 = true;
+    EXPECT_EQ(expected1, queue->timed_wait_and_pop(msg, 100));
 }
diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc
index 469ec2c27..0b2bdd9aa 100644
--- a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc
@@ -32,6 +32,7 @@
 
 
 #include "galileo_e1_dll_pll_veml_tracking.h"
+#include "concurrent_queue.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
@@ -41,7 +42,6 @@
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
 #include <gnuradio/blocks/skiphead.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
 #include <chrono>
@@ -68,7 +68,7 @@ protected:
 
     void init();
 
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GNSSBlockFactory> factory;
     std::shared_ptr<InMemoryConfiguration> config;
@@ -114,7 +114,7 @@ TEST_F(GalileoE1DllPllVemlTrackingInternalTest, ConnectAndRun)
     std::chrono::time_point<std::chrono::system_clock> start, end;
     std::chrono::duration<double> elapsed_seconds(0);
     init();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Tracking test");
 
     // Example using smart pointers and the block factory
@@ -161,7 +161,7 @@ TEST_F(GalileoE1DllPllVemlTrackingInternalTest, ValidationOfResults)
     int num_samples = 80000000;           // 8 Msps
     unsigned int skiphead_sps = 8000000;  // 8 Msps
     init();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Tracking test");
 
     // Example using smart pointers and the block factory
diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc
index 122184eb7..92dae1d47 100644
--- a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc
@@ -31,6 +31,7 @@
  */
 
 
+#include "concurrent_queue.h"
 #include "galileo_e5a_dll_pll_tracking.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
@@ -41,7 +42,6 @@
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
 #include <gnuradio/blocks/skiphead.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
 #include <chrono>
@@ -69,7 +69,7 @@ protected:
 
     void init();
 
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GNSSBlockFactory> factory;
     std::shared_ptr<InMemoryConfiguration> config;
@@ -110,7 +110,7 @@ TEST_F(GalileoE5aTrackingTest, ValidationOfResults)
     int fs_in = 32000000;
     int nsamples = 32000000 * 5;
     init();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Tracking test");
 
     // Example using smart pointers and the block factory
diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc
index 003c63a9d..2a2e8d860 100644
--- a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc
@@ -32,6 +32,7 @@
 
 
 #include "glonass_l1_ca_dll_pll_c_aid_tracking.h"
+#include "concurrent_queue.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
@@ -42,7 +43,6 @@
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
 #include <gnuradio/blocks/skiphead.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
 #include <chrono>
@@ -119,7 +119,7 @@ protected:
 
     void init();
 
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GNSSBlockFactory> factory;
     std::shared_ptr<InMemoryConfiguration> config;
@@ -156,7 +156,7 @@ TEST_F(GlonassL1CaDllPllCAidTrackingTest, ValidationOfResults)
     int nsamples = fs_in * 4e-3 * 2;
 
     init();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Tracking test");
     std::shared_ptr<TrackingInterface> tracking = std::make_shared<GlonassL1CaDllPllCAidTracking>(config.get(), "Tracking_1G", 1, 1);
     boost::shared_ptr<GlonassL1CaDllPllCAidTrackingTest_msg_rx> msg_rx = GlonassL1CaDllPllCAidTrackingTest_msg_rx_make();
diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc
index 20a910ce4..be9128699 100644
--- a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc
@@ -32,6 +32,7 @@
 
 
 #include "glonass_l1_ca_dll_pll_tracking.h"
+#include "concurrent_queue.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
@@ -42,7 +43,6 @@
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
 #include <gnuradio/blocks/skiphead.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
 #include <chrono>
@@ -120,7 +120,7 @@ protected:
 
     void init();
 
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GNSSBlockFactory> factory;
     std::shared_ptr<InMemoryConfiguration> config;
@@ -156,7 +156,7 @@ TEST_F(GlonassL1CaDllPllTrackingTest, ValidationOfResults)
     int nsamples = fs_in * 4e-3 * 2;
 
     init();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Tracking test");
     std::shared_ptr<TrackingInterface> tracking = std::make_shared<GlonassL1CaDllPllTracking>(config.get(), "Tracking_1G", 1, 1);
     boost::shared_ptr<GlonassL1CaDllPllTrackingTest_msg_rx> msg_rx = GlonassL1CaDllPllTrackingTest_msg_rx_make();
diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc
index a640db425..2ace452e5 100644
--- a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc
@@ -31,18 +31,18 @@
  */
 
 
+#include "gps_l2_m_dll_pll_tracking.h"
+#include "concurrent_queue.h"
 #include "gnss_block_factory.h"
 #include "gnss_block_interface.h"
 #include "gnss_sdr_valve.h"
 #include "gnss_synchro.h"
-#include "gps_l2_m_dll_pll_tracking.h"
 #include "in_memory_configuration.h"
 #include "tracking_interface.h"
 #include <gnuradio/analog/sig_source_waveform.h>
 #include <gnuradio/blocks/file_source.h>
 #include <gnuradio/blocks/null_sink.h>
 #include <gnuradio/blocks/skiphead.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
 #include <chrono>
@@ -123,7 +123,7 @@ protected:
 
     void init();
 
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
     gr::top_block_sptr top_block;
     std::shared_ptr<GNSSBlockFactory> factory;
     std::shared_ptr<InMemoryConfiguration> config;
@@ -160,7 +160,7 @@ TEST_F(GpsL2MDllPllTrackingTest, ValidationOfResults)
     int nsamples = fs_in * 9;
 
     init();
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Tracking test");
     std::shared_ptr<TrackingInterface> tracking = std::make_shared<GpsL2MDllPllTracking>(config.get(), "Tracking_2S", 1, 1);
     boost::shared_ptr<GpsL2MDllPllTrackingTest_msg_rx> msg_rx = GpsL2MDllPllTrackingTest_msg_rx_make();
diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc
index fb38b8efa..169513401 100644
--- a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc
+++ b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc
@@ -36,7 +36,7 @@
 #include "Galileo_E1.h"
 #include "Galileo_E5a.h"
 #include "acquisition_msg_rx.h"
-#include "control_message_factory.h"
+#include "concurrent_queue.h"
 #include "galileo_e1_pcps_ambiguous_acquisition.h"
 #include "galileo_e5a_noncoherent_iq_acquisition_caf.h"
 #include "galileo_e5a_pcps_acquisition.h"
@@ -61,9 +61,9 @@
 #include <gnuradio/blocks/null_sink.h>
 #include <gnuradio/blocks/skiphead.h>
 #include <gnuradio/filter/firdes.h>
-#include <gnuradio/msg_queue.h>
 #include <gnuradio/top_block.h>
 #include <gtest/gtest.h>
+#include <pmt/pmt.h>
 #include <chrono>
 #include <cstdint>
 #include <utility>
@@ -229,7 +229,7 @@ public:
     Gnss_Synchro gnss_synchro;
     size_t item_size;
 
-    gr::msg_queue::sptr queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
 };
 
 
@@ -795,14 +795,10 @@ TEST_F(TrackingPullInTest, ValidationOfResults)
 
     // create the msg queue for valve
 
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     long long int acq_to_trk_delay_samples = ceil(static_cast<double>(FLAGS_fs_gen_sps) * FLAGS_acq_to_trk_delay_s);
     auto resetable_valve_ = gnss_sdr_make_valve(sizeof(gr_complex), acq_to_trk_delay_samples, queue, false);
 
-    std::shared_ptr<ControlMessageFactory> control_message_factory_;
-    std::shared_ptr<std::vector<std::shared_ptr<ControlMessage>>> control_messages_;
-
-
     //CN0 LOOP
     std::vector<std::vector<double>> pull_in_results_v_v;
 
@@ -883,15 +879,8 @@ TEST_F(TrackingPullInTest, ValidationOfResults)
                                         top_block->start();
                                         std::cout << " Waiting for valve...\n";
                                         //wait the valve message indicating the circulation of the amount of samples of the delay
-                                        gr::message::sptr queue_message = queue->delete_head();
-                                        if (queue_message != nullptr)
-                                            {
-                                                control_messages_ = control_message_factory_->GetControlMessages(queue_message);
-                                            }
-                                        else
-                                            {
-                                                control_messages_->clear();
-                                            }
+                                        pmt::pmt_t msg;
+                                        queue->wait_and_pop(msg);
                                         std::cout << " Starting tracking...\n";
                                         tracking->start_tracking();
                                         resetable_valve_->open_valve();
diff --git a/src/utils/front-end-cal/main.cc b/src/utils/front-end-cal/main.cc
index 54723dfc5..696abfa6c 100644
--- a/src/utils/front-end-cal/main.cc
+++ b/src/utils/front-end-cal/main.cc
@@ -60,9 +60,8 @@
 #include <gnuradio/blocks/head.h>
 #include <gnuradio/blocks/null_sink.h>
 #include <gnuradio/blocks/skiphead.h>
-#include <gnuradio/gr_complex.h>    // for gr_complex
-#include <gnuradio/io_signature.h>  // for io_signature
-#include <gnuradio/msg_queue.h>
+#include <gnuradio/gr_complex.h>     // for gr_complex
+#include <gnuradio/io_signature.h>   // for io_signature
 #include <gnuradio/runtime_types.h>  // for block_sptr
 #include <gnuradio/top_block.h>
 #include <pmt/pmt.h>        // for pmt_t, to_long
@@ -189,9 +188,9 @@ bool front_end_capture(const std::shared_ptr<ConfigurationInterface>& configurat
 {
     gr::top_block_sptr top_block;
     GNSSBlockFactory block_factory;
-    boost::shared_ptr<gr::msg_queue> queue;
+    std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue;
 
-    queue = gr::msg_queue::make(0);
+    queue = std::make_shared<Concurrent_Queue<pmt::pmt_t>>();
     top_block = gr::make_top_block("Acquisition test");
 
     std::shared_ptr<GNSSBlockInterface> source;