diff --git a/lib/demapping/tch_f_chans_demapper_impl.cc b/lib/demapping/tch_f_chans_demapper_impl.cc
index a54ed3f..a672b24 100644
--- a/lib/demapping/tch_f_chans_demapper_impl.cc
+++ b/lib/demapping/tch_f_chans_demapper_impl.cc
@@ -52,10 +52,10 @@
        d_timeslot(timeslot_nr)
 
     {
-        for (int ii=0; ii<3; ii++)
-        {
-            d_bursts_stolen[ii] = false;
-        }
+//        for (int ii=0; ii<3; ii++)
+//        {
+        //            d_bursts_stolen[ii] = false;
+        //        }
 
         message_port_register_in(pmt::mp("bursts"));
         set_msg_handler(pmt::mp("bursts"), boost::bind(&tch_f_chans_demapper_impl::filter_tch_chans, this, _1));
@@ -78,7 +78,6 @@
         uint32_t frame_nr = be32toh(header->frame_number);
         uint32_t fn_mod26 = frame_nr % 26;
         uint32_t fn_mod13 = frame_nr % 13;
-        bool frames_are_consecutive = true;
         int8_t * burst_bits = (int8_t *)(pmt::blob_data(header_plus_burst))+sizeof(gsmtap_hdr);
 
         if(header->timeslot == d_timeslot){
@@ -93,127 +92,149 @@
             pmt::pmt_t msg_binary_blob = pmt::make_blob(new_msg,sizeof(gsmtap_hdr)+BURST_SIZE);
             pmt::pmt_t msg_out = pmt::cons(pmt::PMT_NIL, msg_binary_blob);
 
+            //distinguishing uplink and downlink bursts
+            bool uplink_burst = (be16toh(header->arfcn) & 0x4000) ? true : false;
 
-            if (fn_mod13 == 12)
+            if(uplink_burst)
             {
-                // position of SACCH burst based on timeslot
-                // see specification gsm 05.02
-                uint32_t index;
-                bool is_sacch = false;
+                sacch_tch_demapper(fn_mod13, fn_mod26, frame_nr,d_bursts_sacch_ul,
+                                   d_frame_numbers_sacch_ul, d_bursts_ul, d_frame_numbers_ul, msg_out);
+            }
+            else
+            {
+                sacch_tch_demapper(fn_mod13, fn_mod26, frame_nr,d_bursts_sacch_dl,
+                                   d_frame_numbers_sacch_dl, d_bursts_dl, d_frame_numbers_dl, msg_out);
+            }
 
-                if (d_timeslot % 2 == 0 && fn_mod26 == 12)
-                {
-                    index = (((frame_nr - 12) / 26) - (d_timeslot / 2)) % 4;
-                    is_sacch = true;
-                }
-                else if (d_timeslot % 2 == 1 && fn_mod26 == 25)
-                {
-                    index = (((frame_nr - 25) / 26) - ((d_timeslot - 1) / 2)) % 4;
-                    is_sacch = true;
-                }
+        }
+    }
 
-                if (is_sacch)
-                {
-                    d_bursts_sacch[index] = msg_out;
-                    d_frame_numbers_sacch[index] = frame_nr;
+    void tch_f_chans_demapper_impl::sacch_tch_demapper(uint32_t fn_mod13, u_int32_t fn_mod26, uint32_t frame_nr,
+                                                       pmt::pmt_t *d_bursts_sacch,
+                                                       uint32_t *d_frame_numbers_sacch, pmt::pmt_t d_bursts[3][8],
+                                                       uint32_t d_frame_numbers[3][8], pmt::pmt_t msg_out)
+    {
+        bool frames_are_consecutive = true;
+        if (fn_mod13 == 12)
+        {
+            // position of SACCH burst based on timeslot
+            // see specification gsm 05.02
+            uint32_t index;
+            bool is_sacch = false;
 
-                    if (index == 3)
+            if (d_timeslot % 2 == 0 && fn_mod26 == 12)
+            {
+                index = (((frame_nr - 12) / 26) - (d_timeslot / 2)) % 4;
+                is_sacch = true;
+            }
+            else if (d_timeslot % 2 == 1 && fn_mod26 == 25)
+            {
+                index = (((frame_nr - 25) / 26) - ((d_timeslot - 1) / 2)) % 4;
+                is_sacch = true;
+            }
+
+            if (is_sacch)
+            {
+                d_bursts_sacch[index] = msg_out;
+                d_frame_numbers_sacch[index] = frame_nr;
+
+                if (index == 3)
+                {
+                    //check for a situation where some bursts were lost
+                    //in this situation frame numbers won't be consecutive
+                    frames_are_consecutive = true;
+                    for(int jj=1; jj<4; jj++)
                     {
-                        //check for a situation where some bursts were lost
-                        //in this situation frame numbers won't be consecutive
-                        frames_are_consecutive = true;
-                        for(int jj=1; jj<4; jj++)
+                        if((d_frame_numbers_sacch[jj]-d_frame_numbers_sacch[jj-1]) != 26)
                         {
-                            if((d_frame_numbers_sacch[jj]-d_frame_numbers_sacch[jj-1]) != 26)
-                            {
-                                frames_are_consecutive = false;
-                            }
+                            frames_are_consecutive = false;
                         }
-                        if(frames_are_consecutive)
+                    }
+                    if(frames_are_consecutive)
+                    {
+                        //send bursts to the output
+                        for(int jj=0; jj<4; jj++)
                         {
-                            //send bursts to the output
-                            for(int jj=0; jj<4; jj++)
-                            {
-                                message_port_pub(pmt::mp("acch_bursts"), d_bursts_sacch[jj]);
-                            }
+                            message_port_pub(pmt::mp("acch_bursts"), d_bursts_sacch[jj]);
                         }
                     }
                 }
             }
-            else
+        }
+        else
+        {
+            if (fn_mod13 <= 3)
             {
-                if (fn_mod13 <= 3)
-                {
-                    // add to b1 and b3
-                    d_bursts[0][fn_mod13] = msg_out;
-                    d_bursts[2][fn_mod13 + 4] = msg_out;
+                // add to b1 and b3
+                d_bursts[0][fn_mod13] = msg_out;
+                d_bursts[2][fn_mod13 + 4] = msg_out;
 
-                    // set framenumber
-                    d_frame_numbers[0][fn_mod13] = frame_nr;
-                    d_frame_numbers[2][fn_mod13 + 4] = frame_nr;
+                // set framenumber for later checking of continuity
+                d_frame_numbers[0][fn_mod13] = frame_nr;
+                d_frame_numbers[2][fn_mod13 + 4] = frame_nr;
+            }
+            else if (fn_mod13 >= 4 && fn_mod13 <= 7)
+            {
+                // add to b1 and b2
+                d_bursts[0][fn_mod13] = msg_out;
+                d_bursts[1][fn_mod13 - 4] = msg_out;
+
+                // set framenumber for later checking of continuity
+                d_frame_numbers[0][fn_mod13] = frame_nr;
+                d_frame_numbers[1][fn_mod13 - 4] = frame_nr;
+            }
+            else if (fn_mod13 >= 8 && fn_mod13 <= 11)
+            {
+                // add to b2 and b3
+                d_bursts[1][fn_mod13 - 4] = msg_out;
+                d_bursts[2][fn_mod13 - 8] = msg_out;
+
+                // set framenumber for later checking of continuity
+                d_frame_numbers[1][fn_mod13 - 4] = frame_nr;
+                d_frame_numbers[2][fn_mod13 - 8] = frame_nr;
+            }
+
+            // send burst 1 or burst 2 to output
+            if (fn_mod13 == 3 || fn_mod13 == 7 || fn_mod13 == 11)
+            {
+                int tch_burst_nr = 0;
+
+                if (fn_mod13 == 11)
+                {
+                    tch_burst_nr = 1;
                 }
-                else if (fn_mod13 >= 4 && fn_mod13 <= 7)
+                else if (fn_mod13 == 3)
                 {
-                    // add to b1 and b2
-                    d_bursts[0][fn_mod13] = msg_out;
-                    d_bursts[1][fn_mod13 - 4] = msg_out;
-
-                    // set framenumber
-                    d_frame_numbers[0][fn_mod13] = frame_nr;
-                    d_frame_numbers[1][fn_mod13 - 4] = frame_nr;
-                }
-                else if (fn_mod13 >= 8 && fn_mod13 <= 11)
-                {
-                    // add to b2 and b3
-                    d_bursts[1][fn_mod13 - 4] = msg_out;
-                    d_bursts[2][fn_mod13 - 8] = msg_out;
-
-                    // set framenumber
-                    d_frame_numbers[1][fn_mod13 - 4] = frame_nr;
-                    d_frame_numbers[2][fn_mod13 - 8] = frame_nr;
+                    tch_burst_nr = 2;
                 }
 
-                // send burst 1 or burst 2 to output
-                if (fn_mod13 == 3 || fn_mod13 == 7 || fn_mod13 == 11)
+                //check for a situation where some bursts were lost
+                //in this situation frame numbers won't be consecutive
+                frames_are_consecutive = true;
+
+                for(int jj=1; jj<8; jj++)
                 {
-                    int tch_burst_nr = 0;
-
-                    if (fn_mod13 == 11)
+                    if (((d_frame_numbers[tch_burst_nr][jj] - d_frame_numbers[tch_burst_nr][jj-1]) != 1) && frames_are_consecutive)
                     {
-                        tch_burst_nr = 1;
-                    }
-                    else if (fn_mod13 == 3)
-                    {
-                        tch_burst_nr = 2;
-                    }
-
-                    //check for a situation where some bursts were lost
-                    //in this situation frame numbers won't be consecutive
-                    frames_are_consecutive = true;
-
-                    for(int jj=1; jj<8; jj++)
-                    {
-                        if (((d_frame_numbers[tch_burst_nr][jj] - d_frame_numbers[tch_burst_nr][jj-1]) != 1) && frames_are_consecutive)
+                        frames_are_consecutive = false;
+                        // burst 3 has 1 sacch burst in between
+                        if (tch_burst_nr == 2 && jj == 4
+                            && d_frame_numbers[tch_burst_nr][jj] - d_frame_numbers[tch_burst_nr][jj - 1] == 2)
                         {
-                            frames_are_consecutive = false;
-                            // burst 3 has 1 sacch burst in between
-                            if (tch_burst_nr == 2 && jj == 4
-                                && d_frame_numbers[tch_burst_nr][jj] - d_frame_numbers[tch_burst_nr][jj - 1] == 2)
-                            {
-                                frames_are_consecutive = true;
-                            }
+                            frames_are_consecutive = true;
                         }
                     }
+                }
 
-                    if(frames_are_consecutive)
+                if(frames_are_consecutive)
+                {
+                    //send bursts to the output
+                    for(int jj=0; jj<8; jj++)
                     {
-                        //send bursts to the output
-                        for(int jj=0; jj<8; jj++)
-                        {
-                            message_port_pub(pmt::mp("tch_bursts"), d_bursts[tch_burst_nr][jj]);
-                        }
-                        d_bursts_stolen[tch_burst_nr] = false;
+                        message_port_pub(pmt::mp("tch_bursts"), d_bursts[tch_burst_nr][jj]);
                     }
+                    // useless
+//                        d_bursts_stolen[tch_burst_nr] = false;
                 }
             }
         }
diff --git a/lib/demapping/tch_f_chans_demapper_impl.h b/lib/demapping/tch_f_chans_demapper_impl.h
index 2afad8b..01c97fa 100644
--- a/lib/demapping/tch_f_chans_demapper_impl.h
+++ b/lib/demapping/tch_f_chans_demapper_impl.h
@@ -32,11 +32,21 @@
     {
      private:
       unsigned int d_timeslot;
-      uint32_t d_frame_numbers[3][8];
-      uint32_t d_frame_numbers_sacch[4];
-      pmt::pmt_t d_bursts[3][8];
-      pmt::pmt_t d_bursts_sacch[4];
-      bool d_bursts_stolen[3];
+      // Downlink
+      uint32_t d_frame_numbers_dl[3][8];       // for checking consecutive frame numbers of tch
+      uint32_t d_frame_numbers_sacch_dl[4];    // for checking consecutive frame numbers of sacch
+      pmt::pmt_t d_bursts_dl[3][8];            // for tch output headers+bursts
+      pmt::pmt_t d_bursts_sacch_dl[4];         // for sacch output bursts
+//      bool d_bursts_stolen[3];                 // useless!
+      // Uplink
+      uint32_t d_frame_numbers_ul[3][8];       // for checking consecutive frame numbers of tch
+      uint32_t d_frame_numbers_sacch_ul[4];    // for checking consecutive frame numbers of sacch
+      pmt::pmt_t d_bursts_ul[3][8];            // for tch output headers+bursts
+      pmt::pmt_t d_bursts_sacch_ul[4];         // for sacch output bursts
+
+      void sacch_tch_demapper(uint32_t fn_mod13, u_int32_t fn_mod26, uint32_t frame_nr, pmt::pmt_t *d_bursts_sacch,
+                              uint32_t *d_frame_numbers_sacch, pmt::pmt_t d_bursts[3][8],
+                              uint32_t d_frame_numbers[3][8], pmt::pmt_t msg_out);
 
      public:
       tch_f_chans_demapper_impl(unsigned int timeslot_nr);
