diff --git a/lib/decoding/tch_f_decoder_impl.cc b/lib/decoding/tch_f_decoder_impl.cc
index 41e5f53..a84c47c 100644
--- a/lib/decoding/tch_f_decoder_impl.cc
+++ b/lib/decoding/tch_f_decoder_impl.cc
@@ -29,11 +29,34 @@
 #include "stdio.h"
 #include "tch_f_decoder_impl.h"
 
+extern "C" {
+    #include <osmocom/coding/gsm0503_coding.h>
+}
+
 #define DATA_BYTES 23
 
 namespace gr {
   namespace gsm {
 
+    static int ubits2sbits(ubit_t *ubits, sbit_t *sbits, int count)
+    {
+	    int i;
+
+	    for (i = 0; i < count; i++) {
+		    if (*ubits == 0x23) {
+			    ubits++;
+			    sbits++;
+			    continue;
+		    }
+		    if ((*ubits++) & 1)
+			    *sbits++ = -127;
+		    else
+			    *sbits++ = 127;
+	    }
+
+	    return count;
+    }
+
     tch_f_decoder::sptr
     tch_f_decoder::make(tch_mode mode, bool boundary_check)
     {
@@ -107,6 +130,7 @@
 
         if (d_collected_bursts_num == 8)
         {
+        	ubit_t bursts_u[116 * 8];
             d_collected_bursts_num = 0;
 
             // reorganize data
@@ -115,6 +139,9 @@
                 pmt::pmt_t header_plus_burst = pmt::cdr(d_bursts[ii]);
                 int8_t * burst_bits = (int8_t *)(pmt::blob_data(header_plus_burst))+sizeof(gsmtap_hdr);
 
+                memcpy(&bursts_u[ii*116], &burst_bits[3],58);
+                memcpy(&bursts_u[ii*116+58], &burst_bits[3+57+1+26],58);
+
                 for (int jj = 0; jj < 57; jj++)
                 {
                     iBLOCK[ii*114+jj] = burst_bits[jj + 3];
@@ -269,65 +296,26 @@
                 unsigned tail = mTCHU.peekField(185, 4);
                 bool good = (sentParity == calcParity) && (tail == 0);
 
+                
                 if (good)
                 {
-                    unsigned char frameBuffer[33];
+                    uint8_t frameBuffer[33];
+                	sbit_t bursts_s[116 * 8];
+	                int n_errors, n_bits_total;
                     unsigned int  mTCHFrameLength;
 
+                	ubits2sbits(bursts_u, bursts_s, 116 * 8);                    
+
                     if (d_tch_mode == TCH_FS) // GSM-FR
                     {
-                        unsigned char mFrameHeader = 0x0d;
                         mTCHFrameLength = 33;
-
-                        // Undo Um's importance-sorted bit ordering.
-                        // See GSM 05.03 3.1 and Table 2.
-                        BitVector frFrame(260 + 4); // FR has a frameheader of 4 bits only
-                        frFrame.fillField(0, mFrameHeader, 4);
-                        BitVector payload = frFrame.tail(4);
-
-                        mTCHD.unmap(GSM::g610BitOrder, 260, payload);
-                        frFrame.pack(frameBuffer);
-
+                        gsm0503_tch_fr_decode(frameBuffer, bursts_s, 1, 0, &n_errors, &n_bits_total);
+                        std::cout << "Errors: " << n_errors << std::endl;
                     }
                     else if (d_tch_mode == TCH_EFR) // GSM-EFR
                     {
-                        unsigned char mFrameHeader = 0x3c;
-
-                        // AMR Frame, consisting of a 8 bit frame header, plus the payload from decoding
-                        BitVector amrFrame(244 + 8); // Same output length as AMR 12.2
-                        BitVector payload = amrFrame.tail(8);
-
-                        BitVector TCHW(260), EFRBits(244);
-
-                        // write frame header
-                        amrFrame.fillField(0, mFrameHeader, 8);
-
-                        // Undo Um's EFR bit ordering.
-                        mTCHD.unmap(GSM::g660BitOrder, 260, TCHW);
-
-                        // Remove repeating bits and CRC to get raw EFR frame (244 bits)
-                        for (unsigned k=0; k<71; k++)
-                          EFRBits[k] = TCHW[k] & 1;
-
-                        for (unsigned k=73; k<123; k++)
-                          EFRBits[k-2] = TCHW[k] & 1;
-
-                        for (unsigned k=125; k<178; k++)
-                          EFRBits[k-4] = TCHW[k] & 1;
-
-                        for (unsigned k=180; k<230; k++)
-                          EFRBits[k-6] = TCHW[k] & 1;
-
-                        for (unsigned k=232; k<252; k++)
-                          EFRBits[k-8] = TCHW[k] & 1;
-
-                        // Map bits as AMR 12.2k
-                        EFRBits.map(GSM::gAMRBitOrderTCH_AFS12_2, 244, payload);
-
-                        // Put the whole frame (hdr + payload)
                         mTCHFrameLength = 32;
-                        amrFrame.pack(frameBuffer);
-
+                        gsm0503_tch_fr_decode(frameBuffer, bursts_s, 1, 1, &n_errors, &n_bits_total);
                     }
                     message_port_pub(pmt::mp("voice"), pmt::cons(pmt::PMT_NIL, pmt::make_blob(frameBuffer,mTCHFrameLength)));
                 }
