diff --git a/lib/misc_utils/bursts_printer_impl.cc b/lib/misc_utils/bursts_printer_impl.cc
index a22e85f..2c1f197 100644
--- a/lib/misc_utils/bursts_printer_impl.cc
+++ b/lib/misc_utils/bursts_printer_impl.cc
@@ -44,39 +44,77 @@
         gsmtap_hdr * header = (gsmtap_hdr *)pmt::blob_data(header_plus_burst);
         int8_t * burst = (int8_t *)(pmt::blob_data(header_plus_burst))+sizeof(gsmtap_hdr);
         size_t burst_len=pmt::blob_length(header_plus_burst)-sizeof(gsmtap_hdr);
-        uint32_t frame_nr;
+        uint32_t frame_nr = be32toh(header->frame_number);
 
         std::cout << d_prepend_string;
         if (d_prepend_fnr)
         {
-            frame_nr = be32toh(header->frame_number);
-            std::cout << frame_nr << ":";
+            std::cout << frame_nr;
         }
 
-        for(int ii=0; ii<burst_len; ii++)
+        if (d_prepend_fnr && d_prepend_frame_count)
         {
-          std::cout << std::setprecision(1) << static_cast<int>(burst[ii]) << "";
+            std::cout << " ";
         }
+
+        if (d_prepend_frame_count)
+        {
+            // calculate frame count for A5
+            uint16_t t1 = frame_nr/1326;
+            uint8_t t2 = frame_nr % 26;
+            uint8_t t3 = frame_nr % 51;
+            uint32_t frame_count = (t1<<11)|(t3<<5)|t2;
+            std::cout << frame_count;
+        }
+
+        if (d_prepend_fnr || d_prepend_frame_count)
+        {
+            std::cout << ":";
+        }
+
+        if (d_print_payload_only)
+        {
+            for (int ii=0; ii<57; ii++)
+            {
+                std::cout << std::setprecision(1) << static_cast<int>(burst[ii + 3]);
+            }
+            for (int ii=0; ii<57; ii++)
+            {
+                std::cout << std::setprecision(1) << static_cast<int>(burst[ii + 88]);
+            }
+        }
+        else
+        {
+            for(int ii=0; ii<burst_len; ii++)
+            {
+              std::cout << std::setprecision(1) << static_cast<int>(burst[ii]);
+            }
+        }
+
         std::cout << std::endl;
     }
 
     bursts_printer::sptr
-    bursts_printer::make(pmt::pmt_t prepend_string, bool prepend_fnr)
+    bursts_printer::make(pmt::pmt_t prepend_string, bool prepend_fnr,
+        bool prepend_frame_count, bool print_payload_only)
     {
       return gnuradio::get_initial_sptr
-        (new bursts_printer_impl(prepend_string, prepend_fnr));
+        (new bursts_printer_impl(prepend_string, prepend_fnr, prepend_frame_count, print_payload_only));
     }
 
     /*
      * The private constructor
      */
-    bursts_printer_impl::bursts_printer_impl(pmt::pmt_t prepend_string, bool prepend_fnr)
+    bursts_printer_impl::bursts_printer_impl(pmt::pmt_t prepend_string, bool prepend_fnr,
+        bool prepend_frame_count, bool print_payload_only)
       : gr::block("bursts_printer",
               gr::io_signature::make(0, 0, 0),
               gr::io_signature::make(0, 0, 0))
     {
         d_prepend_string = prepend_string;
         d_prepend_fnr = prepend_fnr;
+        d_prepend_frame_count = prepend_frame_count;
+        d_print_payload_only = print_payload_only;
         message_port_register_in(pmt::mp("bursts"));
         set_msg_handler(pmt::mp("bursts"), boost::bind(&bursts_printer_impl::bursts_print, this, _1));
     }
