diff --git a/lib/demapping/CMakeLists.txt b/lib/demapping/CMakeLists.txt
index 57d2d1a..09cd525 100644
--- a/lib/demapping/CMakeLists.txt
+++ b/lib/demapping/CMakeLists.txt
@@ -19,6 +19,7 @@
 
 add_sources(
     tch_f_chans_demapper_impl.cc
+    tch_h_chans_demapper_impl.cc
     universal_ctrl_chans_demapper_impl.cc
 )
 
diff --git a/lib/demapping/tch_f_chans_demapper_impl.cc b/lib/demapping/tch_f_chans_demapper_impl.cc
index 0841fd2..bf1ff8f 100644
--- a/lib/demapping/tch_f_chans_demapper_impl.cc
+++ b/lib/demapping/tch_f_chans_demapper_impl.cc
@@ -109,11 +109,11 @@
         }
     }
 
-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)
-{
+    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)
         {
diff --git a/lib/demapping/tch_f_chans_demapper_impl.h b/lib/demapping/tch_f_chans_demapper_impl.h
index 7a546e7..bef018d 100644
--- a/lib/demapping/tch_f_chans_demapper_impl.h
+++ b/lib/demapping/tch_f_chans_demapper_impl.h
@@ -32,8 +32,6 @@
     {
      private:
       unsigned int d_timeslot;
-      int d_tch_type;
-      int d_tch_h_channel;
       // 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
@@ -51,7 +49,7 @@
                               uint32_t d_frame_numbers[3][8], pmt::pmt_t msg_out);
 
      public:
-      tch_f_chans_demapper_impl(unsigned int timeslot_nr, int tch_type, int tch_h_channel);
+      tch_f_chans_demapper_impl(unsigned int timeslot_nr);
       ~tch_f_chans_demapper_impl();
 
       void filter_tch_chans(pmt::pmt_t msg);
diff --git a/lib/demapping/tch_h_chans_demapper_impl.cc b/lib/demapping/tch_h_chans_demapper_impl.cc
new file mode 100644
index 0000000..2c3dc79
--- /dev/null
+++ b/lib/demapping/tch_h_chans_demapper_impl.cc
@@ -0,0 +1,278 @@
+/* -*- c++ -*- */
+/*
+ * @file
+ * @author (C) 2018 by Andrew Artyushok <loony.developer@gmail.com>
+ * @author (C) 2018 by Vasil Velichkov <vvvelichkov@gmail.com>
+ * @section LICENSE
+ *
+ * Gr-gsm is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * Gr-gsm is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gr-gsm; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gnuradio/io_signature.h>
+#include "tch_h_chans_demapper_impl.h"
+#include <grgsm/endian.h>
+#include <grgsm/gsmtap.h>
+
+#define BURST_SIZE 148
+
+namespace gr {
+namespace gsm {
+
+tch_h_chans_demapper::sptr
+tch_h_chans_demapper::make(unsigned int timeslot_nr, unsigned int tch_h_channel)
+{
+        return gnuradio::get_initial_sptr
+                       (new tch_h_chans_demapper_impl(timeslot_nr, tch_h_channel));
+}
+
+/*
+ * The private constructor
+ *
+ */
+tch_h_chans_demapper_impl::tch_h_chans_demapper_impl(unsigned int timeslot_nr, unsigned int tch_h_channel)
+        : gr::block("tch_h_chans_demapper",
+                    gr::io_signature::make(0, 0, 0),
+                    gr::io_signature::make(0, 0, 0)),
+        d_timeslot(timeslot_nr),
+        d_tch_h_channel(tch_h_channel)
+
+{
+    //std::cout << "d_tch_type is " << d_tch_type << ", tch_h_channel is " << tch_h_channel << std::endl;
+
+    message_port_register_in(pmt::mp("bursts"));
+    set_msg_handler(pmt::mp("bursts"), boost::bind(&tch_h_chans_demapper_impl::filter_tch_chans, this, _1));
+    message_port_register_out(pmt::mp("tch_bursts"));
+    message_port_register_out(pmt::mp("acch_bursts"));
+}
+
+/*
+ * Our virtual destructor.
+ */
+tch_h_chans_demapper_impl::~tch_h_chans_demapper_impl()
+{
+}
+
+void tch_h_chans_demapper_impl::filter_tch_chans(pmt::pmt_t msg)
+{
+    pmt::pmt_t header_plus_burst = pmt::cdr(msg);
+    gsmtap_hdr * header = (gsmtap_hdr *)pmt::blob_data(header_plus_burst);
+    if(header->timeslot != d_timeslot) {
+        return;
+    }
+
+    uint32_t frame_nr = be32toh(header->frame_number);
+    uint32_t fn_mod26 = frame_nr % 26;
+    uint32_t fn_mod13 = frame_nr % 13;
+    int8_t* burst_bits = (int8_t *)(pmt::blob_data(header_plus_burst)) + sizeof(gsmtap_hdr);
+
+    int8_t new_msg[sizeof(gsmtap_hdr)+BURST_SIZE];
+    gsmtap_hdr * new_hdr = (gsmtap_hdr*)new_msg;
+    memcpy(new_msg, header, sizeof(gsmtap_hdr)+BURST_SIZE);
+
+    new_hdr->sub_type = (fn_mod13 == 12 ? GSMTAP_CHANNEL_ACCH : 0) | GSMTAP_CHANNEL_TCH_H;
+
+    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(uplink_burst)
+    {
+        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);
+    }
+}
+
+void tch_h_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 (d_tch_h_channel == 0 && fn_mod26 == 12)
+        {
+            index = (((frame_nr - 12) / 26) - (d_timeslot / 2)) % 4;
+            is_sacch = true;
+        }
+        else if (d_tch_h_channel == 1 && fn_mod26 == 25)
+        {
+            index = (((frame_nr - 25) / 26) - (d_timeslot / 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++)
+                {
+                    if((d_frame_numbers_sacch[jj]-d_frame_numbers_sacch[jj-1]) != 26)
+                    {
+                        frames_are_consecutive = false;
+                    }
+                }
+                if(frames_are_consecutive)
+                {
+                    //send bursts to the output
+                    for(int jj=0; jj<4; jj++)
+                    {
+                        message_port_pub(pmt::mp("acch_bursts"), d_bursts_sacch[jj]);
+                    }
+                }
+            }
+        }
+    }
+    else
+    {
+        bool our_sub=false;
+        // So, here I change the fn_mod13, with this changes I can
+        // process both subslot (d_tch_h_channel) with the same code.
+        //
+        // Theory about this on github
+        //
+        // Example:
+        //
+        // For subslot=0 our burst is 0,2,4,6 etc
+        // For subslot=1 it 1,3,5 etc
+        // But if we change it with this code,
+        // both will be 0,1,2,3,4 etc
+        // And we can proced two subslot like one.
+        if(fn_mod13%2==d_tch_h_channel) {
+            if(d_tch_h_channel==0) {
+                fn_mod13=fn_mod13/2;
+            }else{
+                fn_mod13-=1;
+                fn_mod13=fn_mod13/2;
+            }
+            // We work only with our subslot
+            our_sub=true;
+        }
+        if(our_sub) {
+
+            if (fn_mod13 <= 1)
+            {
+                // add to b1 and b3
+                d_bursts[0][fn_mod13] = msg_out;
+                d_bursts[2][fn_mod13+2] = msg_out;
+
+
+
+                d_frame_numbers[0][fn_mod13] = frame_nr;
+                d_frame_numbers[2][fn_mod13+2] = frame_nr;
+            }
+            else if (fn_mod13 >=2 && fn_mod13 <=3)
+            {
+                // add to b1 and b2
+                d_bursts[0][fn_mod13] = msg_out;
+                d_bursts[1][fn_mod13-2] = msg_out;
+
+
+                d_frame_numbers[0][fn_mod13] = frame_nr;
+                d_frame_numbers[1][fn_mod13-2] = frame_nr;
+                //d_frame_numbers[1][fn_mod13 - 4] = frame_nr;
+            }
+            else if (fn_mod13 >=4 && fn_mod13 <=5)
+            {
+                // add to b1 and b2
+                d_bursts[1][fn_mod13-2] = msg_out;
+                d_bursts[2][fn_mod13-4] = msg_out;
+
+
+
+                d_frame_numbers[1][fn_mod13-2] = frame_nr;
+                d_frame_numbers[2][fn_mod13-4] = frame_nr;
+                //d_frame_numbers[1][fn_mod13 - 4] = frame_nr;
+            }
+            // send burst 1 or burst 2 to output
+            //if ( fn_mod26 == 2 || fn_mod26 == 5 || fn_mod26 == 9)
+            if(fn_mod13 == 1 || fn_mod13 == 3|| fn_mod13 == 5)
+            {
+                int tch_burst_nr = 0;
+
+                if(fn_mod13==5) {
+                    tch_burst_nr = 1;
+                }
+                if(fn_mod13==1) {
+                    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;
+                // std::cout<<"br="<<tch_burst_nr<<" Array: ";
+                // std::cout<<d_frame_numbers[tch_burst_nr][0]<<" ";
+                bool one_tree=true;
+                for(int jj=1; jj<4; jj++)
+                {
+
+                    if (((d_frame_numbers[tch_burst_nr][jj] - d_frame_numbers[tch_burst_nr][jj-1]) != 2) && frames_are_consecutive)
+                    {
+                        frames_are_consecutive = false;
+
+                        if (tch_burst_nr == 2 && jj == 2
+                                && d_frame_numbers[tch_burst_nr][jj] - d_frame_numbers[tch_burst_nr][jj - 1] == 3)
+                        {
+                            //  std::cout<<" YEAH ";
+                            frames_are_consecutive = true;
+                        }
+
+                    }
+                    //}
+            }
+            // std::cout<<std::endl;
+
+            if(frames_are_consecutive)
+            {
+
+                for(int jj=0; jj<4; jj++)
+                {
+
+                    message_port_pub(pmt::mp("tch_bursts"), d_bursts[tch_burst_nr][jj]);
+                }
+
+                // useless
+                //                        d_bursts_stolen[tch_burst_nr] = false;
+            }
+        }
+    }
+
+}
+}
+}   /* namespace gsm */
+} /* namespace gr */
diff --git a/lib/demapping/tch_h_chans_demapper_impl.h b/lib/demapping/tch_h_chans_demapper_impl.h
new file mode 100644
index 0000000..ab0efd1
--- /dev/null
+++ b/lib/demapping/tch_h_chans_demapper_impl.h
@@ -0,0 +1,65 @@
+/* -*- c++ -*- */
+/*
+ * @file
+ * @author (C) 2018 by Andrew Artyushok <loony.developer@gmail.com>
+ * @author (C) 2018 by Vasil Velichkov <vvvelichkov@gmail.com>
+ * @section LICENSE
+ *
+ * Gr-gsm is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * Gr-gsm is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gr-gsm; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_GSM_TCH_H_CHANS_DEMAPPER_IMPL_H
+#define INCLUDED_GSM_TCH_H_CHANS_DEMAPPER_IMPL_H
+
+#include <grgsm/demapping/tch_h_chans_demapper.h>
+
+namespace gr {
+    namespace gsm {
+
+        class tch_h_chans_demapper_impl : public tch_h_chans_demapper
+        {
+            private:
+                unsigned int d_timeslot;
+                unsigned int d_tch_h_channel;
+
+                // 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
+
+                // 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);
+
+                void filter_tch_chans(pmt::pmt_t msg);
+
+            public:
+                tch_h_chans_demapper_impl(unsigned int timeslot_nr, unsigned int tch_h_channel);
+                ~tch_h_chans_demapper_impl();
+        };
+
+    } // namespace gsm
+} // namespace gr
+
+#endif /* INCLUDED_GSM_TCH_H_CHANS_DEMAPPER_IMPL_H */
+
